úÎDå;^u      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„„( currently requires that the bitSize of a divide the bitSize  of w …†Due to the limitations of „, † currently requires that the  bitSize of a divide the bitSize of w ‡sha384( currently requires that the bitSize of a divide 64 v‡v‡Abstract user identification ˆ‰Š‹ˆ‰Š‹ˆ‰Š‹‰Š‹ Abstract session identification           portable experimental!dominic.steinitz@blueyonder.co.ukŒ*The basic type for encoding and decoding. :Take a number a convert it to base n as a list of octets. ŽBThis is used to (approximately) get back to a starting word list. G For example, if you have a list of 3 Word8 and try to convert them to H a Word32, the Word32 will get null-padded, and without correction, you ; will get 4 Word8s when converting back. This corrects it. H Unfortunately, it also means you will have errors if trying to convert $ Word8 lists with nulls on the end. 2Converts a list of numbers into a list of octets. I The resultant list has nulls trimmed from the end to make this the dual J of listFromOctets (except when the original octet list ended with nulls;  see Ž). ŒŒ  Take [Octet] and return [Octet] according to the standard. H The length of the result is always 64 octets or 512 bits as required  by the standard.  ;Add this to your Dependency-List of your application state  non-portable experimental mail@n-sch.de    non-portable experimental mail@n-sch.deI‘’“”•–—˜™š›œžŸ ¡¢£ Username  Old password  New password €¥Š§š©ª«¬­® !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH+ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGH+GHEFCDAB?@=>;<9:78563412/0-.+,)*'(%&#$!" + !""#$$%&&'(()**+,,-../001223445667889::;<<=>>?@@ABBCDDEFFGHH non-portable experimental mail@n-sch.de6IJKLMNO either IP or "x-forwarded-for" header & user-agent P¯QR°ST±²³Žµ¶UVWXYZ[\]^Update (replace) a user _Warning: This  uses the internal types from  Happstack.Auth.Data.Internal `abcde·fWarning: This   uses the internal types from  Happstack.Auth.Data.Internal gKUpdate the session timeout of logged in users. Add this to the top of your ! application route, for example: ! appRoute :: ServerPart Response $ appRoute = updateTimeout 5 >> msum  [ {- your routing here -}  ] hSession timeout <Run with modified headers, including the new session cookie i3Handles data from a login form to log the user in. Session timeout *POST field to look for username (default: "username") *POST field to look for password (default: "password") Success response $Fail response. Arguments: Post data jkResponse after logout lmnGet the KJ! of the currently logged in user o+Get the identifier for the current session žpRun a ¹º with the KJ! of the currently logged in user  (if available) Logged in response Not logged in response qRequire a login  Logged in Not registered rRegister a new user Session timeout User exists response Success response s Old password  New password t/IJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst1rstghjikpqnolVWXY^Z[\]_cbad`efmPQRRQTSJKLMNOIU,IJKLMNOKLMNOPQRQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst»            !""#$%&''(())**++,,--..//00112233445566778899::;;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdeffgghiijklmnopqrs t e u v wxyz{|NFG}~JEHMIKLcb€PRSOQUT\V‚ƒ„…†‡ˆ‰Š‹ŒŠ‹Œhappstack-auth-0.2.1.1Happstack.Auth.Internal.DataHappstack.Auth.InternalHappstack.AuthData.Digest.SHA2%Happstack.Auth.Internal.Data.Username#Happstack.Auth.Internal.Data.UserId-Happstack.Auth.Internal.Data.Old.SessionData0'Happstack.Auth.Internal.Data.SessionKey%Happstack.Auth.Internal.Data.Sessions(Happstack.Auth.Internal.Data.SessionData Codec.UtilsData.Digest.SHA512'Happstack.Auth.Internal.Data.SaltedHash!Happstack.Auth.Internal.Data.User&Happstack.Auth.Internal.Data.AuthStateUsernameunUserUserIdunUid SessionKeySessions unsession SessionDatasesUid sesUsername sesTimeoutsesFingerprint SaltedHashUseruseridusernameuserpassUserDB AuthStatesessionsusersnextUidbuildSaltAndHash UpdateTimeoutClearExpiredSessions NumSessions DelSession NewSession GetSessions GetSession SetSessionClearAllSessionsChangePassword SetPassword UpdateUserNumUsers ListUsersIsUserAuthUserDelUser GetUserByIdGetUserAddUserAskUsersMinutes sessionUserIdsessionUsernamesessionTimeoutsessionFingerprintuserIduserNamePassword authProxyaddUsergetUser getUserByIddelUserauthUserisUser listUsersnumUsers updateUseraskUsersclearAllSessions setSession getSession newSession delSession numSessions getSessions updateTimeout performLogin loginHandler performLogout logoutHandlerclearSessionCookieclearExpiredSessionsgetSessionData getSessionKey withSession loginGateregisterchangePassword setPasswordHashtoOctetsHash224Hash384Hash512Hash8ShaData bigSigma0 bigSigma1 smallSigma0 smallSigma1kspaddingshaStepshasha512Octet trimNulls listToOctetshash saltLength strToOctetsslowHash randomSalt checkSaltmodUsers getAndIncUid askSessions modSessions _userPass sessionCookie fromDUsertoDUser maybeUser fromDSession toDSessiongetFingerprint withSessionIdhappstack-server-0.5.0.2Happstack.Server.SimpleHTTP ServerPartT