rjd}      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{| }}}.A data structure representing an XML element. 'Character data just contains a string. 6Tags have a name, a list of attributes, and a list of  child elements.  Follow a "path"- of named subtags in an XML tree. For every ? element in the given list, find the subtag with that name and  proceed recursively. 0Get the value of an attribute in the given tag. 4Get the character data subelement of the given tag. >Convert the tag back to XML. If the first parameter is true,  close the tag. ~,Replace special characters to XML entities.  "Get all childs of the XML element    /A class for various kinds of XMPP connections. *Get incoming stanzas from the connection. !Send a stanza on the connection. Close the connection.     An XMPP connection over TCP. @Open a TCP connection to the named server, port 5222 (or others * found in SRV), and send a stream header. >Get the stream header that the server sent. This needs to be 4 called before doing anything else with the stream. 3Get username part of JID, i.e. the part before the @ sign.  Return "" if the JID contains no @ sign. .Get resource part of JID, i.e. the part after /.  Return "" if the JID has no resource. 7Get the bare JID, i.e. everything except the resource. >A function in the XMPP monad behaves a bit like a thread in a @ cooperative threading system: when it decides to wait for more  input, it "sleeps", letting other "threads" run, until input ' matching a certain predicate arrives. !A handler function for a stanza. A stanza predicate. BRun a function in the XMPP monad using the given XMPP connection. D After that, keep looping as long as there are handlers waiting for  incoming stanzas. Send an XMPP stanza. =When a stanza matching the predicate arrives, call the given C handler. This is analogous to spawning a new thread, except that  the "thread"4 is only run if and when a matching stanza arrives. BStanza handlers can be one-shot or permanent, as indicated by the  third argument. Stanza predicate. Stanza handler. Catch more than one stanza? ASuspend execution of current function while waiting for a stanza  matching the predicate. @Terminate the loop as soon as the current function exits. This 4 works by removing all stanza handlers, which makes  exit.  9Send an IQ request, returning the randomly generated ID. JID of recipient Type of IQ, either "get" or "set" Payload elements ID of sent stanza ?Send an IQ request and wait for the response, without blocking  other activity. JID of recipient Type of IQ, either "get" or "set" Payload elements Response stanza )Send a response to a received IQ stanza. #Original stanza, from which id and  recipient are taken Type of response, either  "result" or "error" Payload elements Just () if original stanza had  a "from" attribute 1Return true if the message stanza has body text. 1Get the body text of the message stanza, if any. Send an ordinary "chat" type message. JID of recipient Text of message !Send ordinary online presence. " Conjunction ("and") of two predicates. #+Return true if the tag has the given name. $,Return true if the tag is a message stanza. %-Return true if the tag is a presence stanza. &(Return true if the tag is an IQ stanza. '*Return true if the tag is a chat message. (AApply the predicate to the named attribute. Return false if the  tag has no such attribute. Attribute name Attribute value predicate )1Return true if the stanza is from the given JID. *BReturn true if the stanza is an IQ stanza in the given namespace. B FIXME: query node not nessesary the first node in the iq stanza. +Return true if the stanza is a "get"! request in the given namespace. ,Return true if the stanza is a "set"! request in the given namespace. -Return true if the stanza is a "error"! request in the given namespace. .Return true if the stanza is a "result"! request in the given namespace. /?Establish a handler for answering to version requests with the 5 given information. See XEP-0092: Software Version.  Client name Client version Operating system 0 Return stanza's error code or -1 (if can't parse error node).  Zero if no error. 1&Get the stamp of message, if has any. 2(Get the jid and the resource of stanza. 3Get cdata from xmlelem. 4$Get maybe cdata from maybe xmlelem.  !"#$%&'()*+,-./01234 !"#$%&'()*+,-./01234 5-Non-SASL authentication, following XEP-0078. Username (part before @ in JID) Server (part after @ in JID)  Password 1Resource (unique identifier for this connection) 0Error number. Zero if authentication succeeded. 55 !6789:;<=&TODO: xml:lang for multiple statuses. >?@ABCDEFGHIJKLMNOPQRSTURead presence stanza. VRead stanza status. !6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV!6<;:987789:;<=>>?GFEDCBA@@ABCDEFGHMLKJIIJKLMNOPQRSOPQRSTUVV  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVW  !"($%&')*+,-./0#12345 NOPQRSHMLKJIT?GFEDCBA@=>6<;:987UV&WXY?Groupchat presence. Leave, Kick and Ban are role change too of / course, but it separated for simplicity sake. ZRole change (also show/status  change) with reason. [ New nick \ Ban reason ] Kick reason ^_`abcdefghijGroupchat occupant. klmnopq.Return true if the stanza is from a JID whose "username@server"  part matches the given string. rJoin groupchat. Nickname to use  JID of room Room password sLeave groupchat. t/Return true if the stanza is a message of type " groupchat". uBReturn true if the stanza is a private message in the named room. vSend a groupchat message. JID of chat room Text of message w'Send a private message in a chat room. Nick of recipient JID of chat room Text of message xyJID of chat room Subject z'Create groupchat presence from stanza. {"Handler for groupchat events (joinleavekicksbansetc). |Do admin actions in groupchat. Nickname or JID JID of chat room Role or affiliation argument Reason &WXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|&qrstuvwxyjklmnopeihgf_dcba`Y^]\[Zz{XW|&WXY^]\[ZZ[\]^_dcba``abcdeihgffghijklmnopklmnopqrstuvwxyz{|  !"#$%&'( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J J K L M N O P Q R S T U V W X Y Z Z [ \ ] ^ _ ` abcdefghijklmnopqrstuuvwxyz{|}~@" XMPP-0.1.2 Network.XMPPNetwork.XMPP.MUCNetwork.XMPP.MyDebugNetwork.XMPP.XMLParseNetwork.XMPP.XMPPConnectionNetwork.XMPP.TCPConnectionNetwork.XMPP.JIDNetwork.XMPP.XMPPMonadNetwork.XMPP.StanzasNetwork.XMPP.AuthNetwork.XMPP.Rostertransformers-0.2.2.0Control.Monad.IO.ClassliftIOXMLElemCDataXMLxmlPathgetAttrgetCdata xmlToStringxmlPath' allChildsXMPPConnection getStanzas sendStanzacloseConnection TCPConnection openStreamgetStreamStart getUsername getResource getBareJidXMPP StanzaHandlerStanzaPredicaterunXMPP addHandler waitForStanzaquitsendIq sendIqWaithasBodygetMessageBody sendMessage sendPresenceconj hasNodeName isMessage isPresenceisIqisChatattributeMatchesisFromiqXmlnsiqGetiqSetiqErroriqResult handleVersion getErrorCodegetMessageStamp getJidRescdatacdata' startAuth StatusType StatusOfflineStatusXA StatusDND StatusChat StatusAway StatusOnlineStatusPresenceErrorProbe Unsubscribed Unsubscribe Subscribed Subscribe Unavailable Available SubscriptionSUnknownSNoneSToSFromSBoth RosterItemitemNameitemJiditemSubscription itemGroups getRoster doPresencedoStatusJIDNickGroupchatPresence RoleChange NickChangeBanKickLeave AffiliationAOutcastANoneAMemberAAdminAOwnerRoleRVisitorRNone RParticipant RModeratorOccupantoccRoleoccAffiliationoccNickoccJid occStatus matchesBare joinGroupchatleaveGroupchatisGroupchatMessageisGroupchatPrivmsgsendGroupchatMessagesendGroupchatPrivateMessagegetMessageSubjectsetGroupchatSubjectdoGroupchatPresenceisGroupchatPresenceadminGroupchatmyDebugreplaceToEntities attrsToStringgetRestxmppStreamStart shallowTagdeepTagsdeepTagtagStart attribute tokenCharprocessingInstructionparsec-2.1.0.1"Text.ParserCombinators.Parsec.PrimparseParser getSvcServer connectStreamconnectStream' parseBuffered getStringXMPPRes WaitingForXMPPJust XMPPStatexmppFnStanzaHandlerPartgetStateputState modifyState initialState actOnStanza findHandlersendIqResponse