5      !"#$%&'()*+,-./01234 5 6789:;<=> ? @ A B C D E F G H I J K LM N O P Q R STUVWXYZ[\ ]^_`a bcd ef g h i j k l m n o p q r s t u v w xyz{|}~ &Regular expression wrapper for marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR[ A match to a @. Index 0 is the full match, all other indices are match groups.@Abstract Wrapper for a reglar expression implementation. Has an < implementation, so literal strings can be used to create a . Alternatively use # to create one with custom options.Compile a regex with optionsNormally it is sufficient to just write the regex as a plain string and have it be converted automatically, but if you want certain match options you can use this function.IMatch a regex against a string and return the first match found (if any).  ! !$Random numbers and utility functions(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR["2Generate a random value. For more information see #2Generate a random value frbounded by a range. See  for how the range works.$=Get a random value out of an integer indexed sequence, like (Vector , '[a]', Seq or Set) This uses the sequences 9 and therefore does not terminate for infinite sequences.(Uses the global random number generator.)Usable in all IO capable monads, such as  BotReacting and ScriptDefinition."#$"#$"#$"#$Mutable references for marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR[ %:A value that can be shared on multiple concurrent Threads.QThis value works like a channel. It can either be empty or full. If it is empty /6 fills it, otherwise the write blocks. If it is full -3 empties, otherwise it blocks until it is filled. +* does not empty it and also blocks if the % is empty.cShould you just use it as a thread safe mutable variable, mutations typically follow the pattern:  val <- takeSynchronized -- obtain the value and leave it empty to block concurrent reads let mod = modify val -- modify the value writeSynchronized mod -- write back the result Another use for this type is as a message channel, where we have a producer and a consumer, the producer tries to write values into the % (/") and the consumer waits for the %" to be filled and takes the value - for procesing.It works generally best if any %A is only used for one of these two applications at the same time.This type is the same as e, only renamed for readability. If you want a more in depth documentation, see the documentation for .&'A mutable reference to a value of type vThis is like a pointer in c, the value behind which can be mutated by several functions. So long as they retain this reference they are able to retrieve the updated value.''Create a new mutable reference of type v from an initial value.(1Retrieve the value behind by a mutable reference.))Set the value inside a mutable reference.*,Change the value behind a mutable reference.+#Read the vaue, but don't empty the %. Blocks if it is empty.,Non blocking version of + . Returns  if it was empty.-Read the value and empty the %, blocks if already empty..Non blocking version of - , returns  if it was empty./Fills the empty %$ with a value, blocks if it is full.0Non blocking version of / . Returns  if it was full.1 Query if the % is empty or full. %&'()*+,-./01 %&'()*+,-./01 &'()*%+,-./01 %&'()*+,-./01Working with json in marvin(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR[2(Read a file containing JSON encoded data32Write some data to a file using JSON serialization23      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL232323+Performing http/https requests from scripts(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR[None%&59;<=?DILR[#MFRead only data available to a handler when the bot reacts to an event.,An abstract type describing a marvin script.1This is basically a collection of event handlers.@Internal structure is exposed for people wanting to extend this.4aA type, basically a String, which identifies an adapter to the config and the logging facilities.For conversion please use d and 5%. They will perform necessary checks.6_A type, basically a String, which identifies a script to the config and the logging facilities.For conversion please use c and 7%. They will perform necessary checks.80Wrapping type for channels. Only used to enable _ typeclass instances.;-Wrapping type for users. Only used to enable _ typeclass instances.>+Basic functionality required of any adapter?hConcrete, adapter specific representation of a user. Could be an id string or a full object for instance@kConcrete, adapter specific representation of a channel. Could be an id string or a full object for instanceA#Used for scoping config and loggingBAPost a message to a channel given the internal channel identifierCInitialize the adapter stateD Run the botE5Resolve a username given the internal user identifierFTResolve the human readable name for a channel given the internal channel identifierGEResolve to the internal channel structure given a human readable nameHBResolve to the internal user structure given a human readable nameK%Monad in which adapter actions run inL.Basic monad which most internal actions run inM6Representation for the types of events which can occurS%A timestamp type. Supplied with most M typesV"The contents of a recieved messageWThe topic in a channelX<Monad for reacting in the bot. Allows use of functions like ,  and  as well as any arbitrary N action using .The type parameter dY is the accessible data provided by the trigger for this action and can be obtained with  or other custom functions like  and 8 which typically depend on a particular type of data in d.For completeness: a is the adapter type and r/ is the return type of the monadic computation.This is also a O instance, there you can inspect the entire state of this reaction. This is typically only used in internal or utility functions and not necessary for the user. To inspect particular pieces of this state refer to the *Lenses* section.Y;Denotes a place from which we may access the configuration.RDuring script definition or when handling a request we can obtain the config with  getConfigVal or requireConfigVal.PINTERNAL USE WITH CARE"Obtain the entire config structureZ Similar to ]+, this class says that there is an adapter [, available from this type (usually a monad) m.RThe type of adapter depends on the monad itself. This class can be thought of as O specified to [.[-The concrete type of adapter accessible from m.] Similar to Z, this class says there is a 6+ reachable from the type (usually a monad) m.^Retrieve the script id out of m, ususally a monad._/Class which says that there is a way to get to b from this type a.uThis typeclass is used to allow handlers with different types of payload to share common accessor functions such as  and .]The instances specify for each type of payload which pieces of data can be extracted and how.aSInitializer for a script. This gets run by the server during startup and creates a b!A monad for gradually defining a  using  and  as well as any N action.c#Attempt to create a script id from Textd%Attempt to create an adapter id from Text}MQRSTU4V56W789:;<=>?@ABCDEFGHIJKXYLMNOPQRSTUVWZ[\]^_`XabcdefghijklmnopqrstuvwYPxZ[\]^_`aybz{|}~cd_MQRSTU4V56W789:;<=>?@EFHGBACDIJKXYLMNOPQRSTUVWZ[\]^_XabcdefghijklmnopqrstYPxZ[\]^_`aybz{|}~cdGMQRSTU4V56W789:;<=> ?@ABCDEFGHIJKXYLMNOPQRSTUVWZ[\]^_`XabcdefghijklmnopqrstuvwYPxZ[\]^_`aybz{|}~cdNone%&<=DLR[e Script id sed for the bot itselfeeeCommon types in marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR[ 6789:;<=?@LMNOPQRSTUVYZ[]^_`ce V67c7e]^^YSTUZ[;<=89:_`MNOPQRLNone%&<=DLR[ The adapter interface(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&9:;<=DLRT[fghijklm 45>?@EFHGBACDIJKMNOPQR\dfghijklm!IJ>?@ABCDEFGH45d5KMNOPQRlmhijkg\ffghijklm .Adapter for communicating with a shell prompt.(c) Justus Adam, 2017BSD3dev@justus.science experimentalPOSIXNone#%&<=DLR[nAdapter for a shell promptnonnnoNone%&9;<=?DILR[pEIdentifier for a channel (internal and not equal to the channel name)q>Identifier for a user (internal and not equal to the username)r\Adapter for interacting with Slack API's. Polymorphic over the method for retrieving events.=pqr6pqrpqr None#%&9;<=DLR[s!Class to enable polymorphism for r/ over the method used for retrieving updates. (RTM or  EventsAPI)sss EAdapter for communicating with Slack via the webhook based Events API(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone#%&<=DLR[tARecieve events as a server via HTTP webhook (not implemented yet)tupqrstrtqpstu DAdapter for communicating with Slack via its real time messaging API(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone#%&<=DLR[vDRecieve events by opening a websocket to the Real Time Messaging APIvwpqrsvrvqpsvwNone%&9:;<=?DLRT[9A user object as contained in the telegram update objects7A telegram chat object as contained in telegram updatesx(Chat type as defined by the telegram api}?The telegram adapter type for a particular update type. Either Push or Poll~7Class to enable polymorphism over update mechanics for }4xyz{|}    ~  -xyz{|}   ~ xyz{|}    ~  >Adapter for communicating with Telegram via its http poll API.(c) Justus Adam, 2017BSD3dev@justus.science experimentalPOSIXNone%&<=DLR[1Use the telegram API by fetching updates via HTTP!"#$% xyz{|}~ }xyz{|~!"#$%GAdapter for communicating with Telegram via its webhook based push API.(c) Justus Adam, 2017BSD3dev@justus.science experimentalPOSIXNone#%&<=DLR[AUse the telegram API by recieving updates as a server via webhook]Note: The initialization for this adapter _includes_ registering or clearing its own webhook.& xyz{|}~ }xyz{|~&None%&9:;<=?DILORT[!'*Get the config part for the currect scriptFWhenever any message matches the provided regex this handler gets run.#Equivalent to "robot.hear" in hubot8Runs the handler only if the bot was directly addressed.&Equivalent to "robot.respond" in hubot)This handler runs whenever a user enters  any channel! (which the bot is subscribed to)IThe payload contains the entering user and the channel which was entered.(This handler runs whenever a user exits  any channel! (which the bot is subscribed to)GThe payload contains the exiting user and the channel which was exited.)This handler runs whenever a user enters the specified channel.8The argument is the human readable name for the channel.'The payload contains the entering user.(This handler runs whenever a user exits the specified channel<, provided the bot is subscribed to the channel in question.8The argument is the human readable name for the channel.%The payload contains the exting user.$This handler runs when the topic in  any channel" the bot is subscribed to changes.GThe payload contains the new topic and the channel in which it was set.$This handler runs when the topic in the specified channelG is changed, provided the bot is subscribed to the channel in question.0The argument is the human readable channel name.Extension point for the user8Allows you to handle the raw event yourself. Returning e from the trigger function means you dont want to react to the event. The value returned inside the () is available in the handler later using .?Send a message to the channel the triggering message came from.#Equivalent to "robot.send" in hubotpGet the username of a registered user. The type signature is so large to allow this function to be used both in X and b.Try to get the channel with a particular human readable name. The type signature is so large to allow this function to be used both in X and b.sGet the human readable name of a channel. The type signature is so large to allow this function to be used both in X and b.yTry to get the user with a particular username. The type signature is so large to allow this function to be used both in X and b.qSend a message to the channel the original message came from and address the user that sent the original message.$Equivalent to "robot.reply" in hubot%Send a message to a Channel (by name)ASend a message to a channel (by adapter dependent channel object)Define a new script for marvinVYou need to provide a ScriptId (which can be written as a non-empty string, needs the OverloadedStrings language extension). This id is used as the key for the section in the bot config belonging to this script and in logging output.0Roughly equivalent to "module.exports" in hubot.Obtain the event reaction data.KThe type of this data depends on the reaction function used. For instance  and  will contain MessageReactionDataW. The actual contents comes from the event itself and was put together by the trigger.5Get the results from matching the regular expression.#Equivalent to "msg.match" in hubot.Get the message that triggered this action Includes sender, target channel, as well as the full, untruncated text of the original messageGet the the new topic.3Get the stored channel in which something happened.4Get the user which was part of the triggered action.'Get a value out of the config, returns  if the value didn't exist.This config is the config for this script. Ergo all config vars registered under the config section for the ScriptId of this script.The Yd Constraint means this function can be used both during script definition and when a handler is run.WGet a value out of the config and fail with an error if the specified key is not found.This config is the config for this script. Ergo all config vars registered under the config section for the ScriptId of this script.The Yd Constraint means this function can be used both during script definition and when a handler is run.)INTERNAL, USE WITH CARE=Get the configuration for the bot (should be "bot" subconfig)*INTERNAL, USE WITH CARE;Get a value from the bot config (should be "bot" subconfig)+INTERNAL, USE WITH CARE;Get a value from the bot config (should be "bot" subconfig)#Get the configured name of the bot.Take a reaction and produce an IO action with the same effect. Useful for creating actions which can be scheduled to execute a certain time or asynchronous. The idea is that one can conveniently send messages from inside a schedulable action.Take an action and produce an IO action with the same effect. Useful for creating actions which can be scheduled to execute a certain time or asynchronous. The idea is that one can conveniently send messages from inside a schedulable action.','-./01)*+NMQRS6W7WXabcdefghijklmnopqrstPZ[\_`aybz{|}'1*+','-./01)*+ Running marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone#%&9:;<=?DLORT[ Default name for the config filepRetrieve a value from the application config, given the whole config structure. Fails if value not parseable as a or not present.XRetrieve a value from the application config, given the whole config structure. Returns  if value not parseable as a or not present.;Runs the marvin bot using whatever method the adapter uses.23456789:;<>aa> 23456789:;<Marvin the modular bot(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR['6>@?VWXab'a6b>?@XVW4A collection of all modules useful for using marvin.(c) Justus Adam, 2016BSD3dev@justus.science experimentalPOSIXNone%&<=DLR[4      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKL =>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}"#$%&'()*+,-./01236>?@VWXab   ~  !!""#$%#$&#'(#)*#+,#-.#/012314516789:89;89<89=89>89?89@89A89B89C89DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abbcddefghijklmnopqrstuvwxyzz{|}~     lnmo #F#+##/      ! " # $%&%'%(%)%*%+%,%-%.%/%0%1%2%3%4%5%6%7%8%9%:%;%<%=%>%?%@%A%B%C%D%E%F%G%H%I%JKLKMNONPQRQSQTQUQVQWQXQYQZQ[QXQYQ\Q]Q^Q_Q_Q`QaQaQbQcQdQeQfQgQhQiQjQkQlQmQnopqrstouuvw^`rxyz{|}~~   V      WV     !""#$%&'#/()*+,-./0 1 1 2 3 4 5 6 7 8 9 :;<=;<>;<?@AB@AC@AD@AE@AF@AG@AH@AI@AJ@AK@AL@AM@AN@AO@AP@AQ@AR@AS@AT@AU@AV@AW@AX@AY@AZ@A[@A\@A]@A^@A_@A`@Aa@Ab@Ac@Ad@Ae@Af@Ag@Ah@Ai@Aj@Ak@Al@Am@An@Ao@Ap@Aq@Ar@As@As@At@Au@Au@Avwxywxywxzwx{wx|wx}wx~#marvin-0.1.4-3ie63AKI3tOCkKuksSFuREMarvin Marvin.TypesMarvin.Adapter.Telegram.PollMarvin.PreludeMarvin.Util.RegexMarvin.Util.RandomMarvin.Util.MutableMarvin.Util.JSONMarvin.Adapter Marvin.RunMarvin.Adapter.ShellMarvin.Adapter.Slack.EventsAPIMarvin.Adapter.Slack.RTMMarvin.Adapter.Telegram.PushMarvin.Util.HTTPMarvin.Internal.TypessendreplymessageChannelgetData getMessagegetMatchgetUserrespondhearMarvin.Internal.ValuesUtilMarvin.Adapter.Slack.TypesMarvin.Adapter.Slack.CommonMarvin.Adapter.Telegram.CommonMarvin.InternalScript TelegramUser TelegramChatbaseControl.Monad.IO.ClassliftIOMonadIO Control.MonadunlessData.Traversablefor Data.Foldablefor_ Data.Maybe fromMaybeGHC.Basewhen-marvin-interpolate-1.1-2Cg5cjdn4byAUqPOjvRq12Marvin.Interpolate.Text.LazyisLMarvin.Interpolate.TextisTMarvin.Interpolate.StringisS'text-icu-0.7.0.1-IFmYf5LSfEX1gxaRkgfWq9Data.Text.ICU.Regex.Internal StackLimit WorkLimitErrorOnUnknownEscapes UnicodeWord HaskellLines MultilineLiteralDotAllCommentsCaseInsensitive MatchOptionMatchRegexrmatch$fIsStringRegex $fShowRegex $fNFDataRegex randomValrandomValFromRange randomFrom SynchronizedMutable newMutable readMutable writeMutable modifyMutablereadSynchronizedtryReadSynchronizedtakeSynchronizedtryTakeSynchronizedwriteSynchronizedtryWriteSynchronizedisEmptySynchronizedreadJSON writeJSON AdapterIdunwrapAdapterIdScriptIdunwrapScriptIdChannel'unwrapChannel'User' unwrapUser' IsAdapterUserChannel adapterId initAdapterrunWithAdapter getUsernamegetChannelNameresolveChannel resolveUserRunWithAdapter EventHandlerAdapterMRunnerMEvent MessageEvent CommandEventChannelJoinEventChannelLeaveEventTopicChangeEvent TimeStampunwrapTimeStampMessageTopic BotReactingHasConfigAccess AccessAdapterAdapterT getAdapterIsScript getScriptIdGetgetLens ScriptInitScriptDefinition mkScriptId mkAdapterIdapplicationScriptIdliftAdapterAction getAppConfiglookupFromAppConfigrequireFromAppConfig getBotnamegetAdapterConfiglookupFromAdapterConfigrequireFromAdapterConfig ShellAdapter$fIsAdapterShellAdapterSlackChannelId SlackUserId SlackAdapterMkSlack EventsAPI$fMkSlackEventsAPIRTM $fMkSlackRTMChatType PrivateChat GroupChatSupergroupChat ChannelChatTelegramAdapter MkTelegramPoll$fMkTelegramPoll$fFromJSONUpdateWithIdPush$fMkTelegramPushenterexitenterInexitFromtopictopicIn customTriggermessageChannel' defineScriptgetTopic getChannel getConfigValrequireConfigVal getBotNameextractReaction extractActiondefaultConfigName runMarvin Data.StringIsString unwrapRegex!random-1.1-54KmMHXjttlERYcr1mvsAe System.RandomrandomrandomRlength getStdRandom newStdGen getStdGen setStdGenmkStdGen RandomGensplitnextgenRangeStdGenRandomrandomRsrandoms randomRIOrandomIOGHC.MVarMVarNothingghc-prim GHC.TypesFalse$aeson-1.1.0.0-9sl0MGzYiTN2UYkrsHEkpb Data.Aeson.THmkLiftParseJSON2mkLiftParseJSON mkParseJSONderiveFromJSON2deriveFromJSON1deriveFromJSONmkLiftToEncoding2mkLiftToEncoding mkToEncoding mkLiftToJSON2 mkLiftToJSONmkToJSON deriveToJSON2 deriveToJSON1 deriveToJSON deriveJSON2 deriveJSON1 deriveJSON Data.AesoneitherDecodeStrict' eitherDecode'eitherDecodeStrict eitherDecode decodeStrict'decode' decodeStrictdecodeencodeData.Aeson.TypesfoldableData.Aeson.Types.ToJSON toEncoding2toJSON2 toEncoding1toJSON1genericLiftToEncodinggenericToEncodinggenericLiftToJSON genericToJSONGToJSONgToJSON GToEncoding gToEncodingToArgsNoToArgsTo1ArgsToJSONtoJSON toEncoding toJSONListtoEncodingListKeyValue.= ToJSONKey toJSONKey toJSONKeyListToJSONKeyFunction ToJSONKeyTextToJSONKeyValueToJSON1 liftToJSONliftToJSONListliftToEncodingliftToEncodingListToJSON2 liftToJSON2liftToJSONList2liftToEncoding2liftToEncodingList2Data.Aeson.Encoding.Internalpairs fromEncodingEncodingSeriesData.Aeson.Types.FromJSON.!=.:!.:?.:fromJSONwithBoolwithScientific withNumber withArraywithText withObject parseJSON2 parseJSON1genericLiftParseJSONgenericParseJSON GFromJSON gParseJSONFromArgs NoFromArgs From1ArgsFromJSON parseJSON parseJSONList FromJSONKey fromJSONKeyfromJSONKeyListFromJSONKeyFunctionFromJSONKeyCoerceFromJSONKeyTextFromJSONKeyTextParserFromJSONKeyValue FromJSON1 liftParseJSONliftParseJSONList FromJSON2liftParseJSON2liftParseJSONList2Data.Aeson.Parser.Internaljson'jsonData.Aeson.Types.GenericZeroOneData.Aeson.Types.InternaldefaultTaggedObjectdefaultOptionsobjectResultErrorSuccessObjectArrayValueBoolStringNumberNull DotNetTimefromDotNetTimeOptionsfieldLabelModifierconstructorTagModifierallNullaryToStringTagomitNothingFields sumEncodingunwrapUnaryRecords SumEncoding TaggedObject UntaggedValueObjectWithSingleField TwoElemArray tagFieldNamecontentsFieldNameBotActionStateIO mtl-2.2.1-6qsR1PHUy5lL47Hpoa4jCMControl.Monad.Reader.Class MonadReadergetConfigInternalHandlers HasScriptIdscriptIdrunAdapterAction HasPayloadpayload HasConfigconfig HasAdapteradapter#$fHasScriptIdBotActionStateScriptId runReactionHasTopicChangeIn topicChangeInHasTopicChange topicChange HasRespondsresponds HasLeavesFrom leavesFrom HasLeavesleaves HasJoinsInjoinsInHasJoinsjoinsHasHearshears HasCustomscustoms$fMonoidHandlers$fNFDataHandlers Rep_Handlers LoggingFn runScript HasActionsactionsverifyIdString$fConfiguredLogLevel$fIsStringAdapterId$fIsStringScriptId$fShowTAdapterId$fShowTScriptId$fAccessAdapterAdapterM$fAccessAdapterBotReacting$fAccessAdapterScriptDefinition$fIsScriptBotReacting$fIsScriptScriptDefinition$fHasConfigAccessBotReacting!$fHasConfigAccessScriptDefinition$fGet(,,,)Text$fGet(,,,,)Text $fGet(,,,,)[]$fGet(,,,,)TimeStamp$fGet(,,,)TimeStamp$fGet(,,)TimeStamp$fGet(,,,,)Channel'$fGet(,,,)Channel'$fGet(,,)Channel'$fGet(,,,,)User'$fGet(,,,)User'$fGet(,,)User'$fMonadBaseControlIOAdapterM$fHasScriptIdScriptScriptIddefaultBotNamescriptConfigKeyadapterConfigKeynotImplemented addPrefixadaptLoggingSourceloggingAddSourcePrefixtimestampFromNumberoutputhelpLimitedChannelInfoUserInfo ChannelCache UserCache APIResponseRTMDataokurl jsonParseURI$fFromJSONSlackUserId$fFromJSONSlackChannelIdHasTopicHasNamename HasIdValueidValue $fHasTopicLimitedChannelInfoText HasUsernameusername$fHasUsernameUserInfoTextHasNameResolver nameResolver HasInfoCache infoCache$$fHasNameResolverChannelCacheHashMap channelCache userInfoCache outChannel InternalType SlackEvent UnhandeledIgnoredChannelArchiveStatusChangeChannelCreatedChannelDeleted ChannelRename UserChangecodemsgrawBS helloParseruserInfoParseruserInfoListParserapiResponseParser lciParser lciListParser$fFromJSONRTMData!$fHasNameResolverUserCacheHashMapinitIOConnections messageParser eventParserstripWhiteSpaceMayrunHandlerLoop runnerImpl execAPIMethodmessageChannelImplgetUserInfoImplrefreshSingleUserInforefreshChannelsrefreshSingleChannelInforesolveChannelImplrefreshUserInforesolveUserImplgetChannelNameImpl putChannel deleteChannel renameChannel$fIsAdapterSlackAdaptereventAPIeventParserrunEventReceiversendMessageLooprunConnectionLoop senderLoopTelegramUpdateEv descriptionresult errorCodeerrDescription HasLastNamelastNameHasId_id_ HasFirstName firstName$fHasUsernameTelegramUserMaybe mkEventGetterHasType_type_telegramSupportedUpdates msgParserexecAPIMethodWithgetUsernameImpl$fIsAdapterTelegramAdapter$fFromJSONTelegramUpdate$fFromJSONTelegramChat$fFromJSONTelegramUser$fFromJSONChatType$fHasUsernameTelegramChatMaybe UpdateWithIdupdateId updateContentpollEventGetterpushEventGetter getConfigJustgetAppConfigValrequireAppConfigVal getSubConfFor runBotAction prepareActiononScriptExcept alterHelperrunDefinitions CmdOptions configPathverbosedebug vcatMaybesdefaultLoggingLevelrunWAdamkApp applicationsetLoggingLevelIn)fast-logger-2.4.10-Kc1eCZpvL6wG1m77snocRjSystem.Log.FastLogger.LogStrLogStrToLogStrtoLogStr+monad-logger-0.3.20.2-Y5wRs4yDfx7MJ9YjJ3ndKControl.Monad.Logger logOtherCS logErrorCS logWarnCS logInfoCS logDebugCS logOtherNS logErrorNS logWarnNS logInfoNS logDebugNS logOtherN logErrorNlogWarnNlogInfoN logDebugN filterLoggerwithChannelLoggerunChanLoggingTrunChanLoggingTrunStdoutLoggingTrunStderrLoggingT defaultLogStr logOtherS logErrorSlogWarnSlogInfoS logDebugSliftLoc logOtherSH logErrorSH logWarnSH logInfoSH logDebugSHlogOtherlogErrorlogWarnlogInfologDebugLogLevel LevelDebug LevelInfo LevelWarn LevelError LevelOther LogSource MonadLoggermonadLoggerLog MonadLoggerIO askLoggerIO NoLoggingT runNoLoggingTLoggingT runLoggingTtemplate-haskellLanguage.Haskell.TH.SyntaxLocloc_end loc_start loc_module loc_package loc_filename