ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ A[c@`sdZddlmZddlmZddlmZddlmZddlmZddd d gZdd l Z dd l Z d Z d Z dZ ddddddddddddddddddd d!d"d#d$d%gZd&d'd(d)d*d+d,gZidd-6dd.6dd/6dd06d1d26d3d46d5d66d1d76d8d96d5d:6d;d<6d8d=6d>d?6d;d@6ZdAZdBZdCZdDZdEZdFefdGYZdHefdIYZd S(JucEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. i(tunicode_literals(tprint_function(tdivision(tabsolute_import(tintu mktime_tzu parsedateu parsedate_tzuquoteNu uu, ujanufebumaruaprumayujunujuluaugusepuoctunovudecujanuaryufebruaryumarchuaprilujuneujulyuaugustu septemberuoctoberunovemberudecemberumonutueuweduthuufriusatusunuUTuUTCuGMTuZipuASTiuADTi uESTuEDTiuCSTuCDTiDuMSTuMDTiuPSTuPDTcC`s=t|}|sdS|ddkr3d|d@,:;."[]iu u u.uN( tspecialstpostLWStCRtFWStatomendsR/t phraseendstfieldt commentlist(tselfR:((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt__init__s     cC`sg}x|jt|jkr|j|j|jdkr|j|jdkrn|j|j|jn|jd7_q |j|jdkr|jj|jq Pq Wtj|S(u&Skip white space and extract comments.u iu(( R4RR:R5RR;t getcommentt EMPTYSTRINGtjoin(R<twslist((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pytgotonextscC`sUg}xH|jt|jkrP|j}|r@||7}q |jdq W|S(uVParse all addresses. Returns a list containing all of the addresses. u(uu(R4RR:t getaddressR(R<tresulttad((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt getaddrlists  cC`sg|_|j|j}|j}|j}|jg}|jt|jkr|rPtj|j|dfg}qPn|j|jdkr||_||_|j}tj|j|fg}nz|j|jdkrg}t|j}|jd7_x=|jt|jkr|j|j|krm|j|jdkrm|jd7_Pn||j }qWn|j|jdkr|j }|jrtj|ddj|jd |fg}qPtj||fg}nS|r%tj|j|dfg}n+|j|j|j krP|jd7_n|j|jt|jkr|j|jd kr|jd7_n|S( uParse the next address.iu.@u:iu;uu@u:(R:R4tFalseRBRt getdomaintTrueRI(R<t expectroutetadlist((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRJEs.     cC`sg}|jx3|jt|jkrEt}|j|jdkr|rk|dj rk|jn|jd|jd7_t}n|j|jdkr|jdt |j nT|j|j|j kr|r|dj r|jnPn|j|j |j}|r|r|j|qqW|jt|jkst|j|jdkrt j|S|jd|jd7_|jt j||jS(uParse an RFC 2822 addr-spec.u.iiu"u"%s"u@(RBR4RR:RTtstriptpopRRRR1tgetquoteR8tgetatomR?R@RS(R<taslistt preserve_wstws((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRIes4        .   cC`sg}x|jt|jkr|j|j|jkrL|jd7_q |j|jdkr{|jj|jq |j|jdkr|j|jq |j|jdkr|jd7_|jdq |j|j|jkrPq |j|j q Wt j |S(u-Get the complete domain name from an address.iu(u[u.( R4RR:R5R;RR>tgetdomainliteralR8RZR?R@(R<tsdlist((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRSscC`s-|j|j|krdSdg}t}|jd7_x|jt|jkr|ry|j|j|jt}n|j|j|kr|jd7_Pnk|r|j|jdkr|j|jq;n6|j|jdkrt}n|j|j|j|jd7_q;Wtj|S(uParse a header fragment delimited by special characters. `beginchar' is the start character for the fragment. If self is not looking at an instance of `beginchar' then getdelimited returns the empty string. `endchars' is a sequence of allowable end-delimiting characters. Parsing stops when one of these is encountered. If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed within the parsed fragment. uiu(u\( R:R4RRRRR>RTR?R@(R<t beginchartendcharst allowcommentstslistR1((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt getdelimiteds(    cC`s|jddtS(u1Get a quote-delimited fragment from self's field.u"u" (RdRR(R<((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRYscC`s|jddtS(u7Get a parenthesis-delimited fragment from self's field.u(u) (RdRT(R<((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR>scC`sd|jddtS(u!Parse an RFC 2822 domain-literal.u[%s]u[u] (RdRR(R<((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR^scC`sdg}|dkr!|j}nx\|jt|jkr|j|j|krVPn|j|j|j|jd7_q$Wtj|S(uParse an RFC 2822 atom. Optional atomends specifies a different set of end token delimiters (the default is to use self.atomends). This is used e.g. in getphraselist() since phrase endings must not include the `.' (which is legal in phrases).uiN(RR8R4RR:RR?R@(R<R8tatomlist((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRZs   cC`sg}x|jt|jkr|j|j|jkrL|jd7_q |j|jdkrx|j|jq |j|jdkr|jj|jq |j|j|jkrPq |j|j |jq W|S(uParse a sequence of RFC 2822 phrases. A phrase is a sequence of words, which are in turn either RFC 2822 atoms or quoted-strings. Phrases are canonicalized by squeezing all runs of continuous whitespace into one space. iu"u(( R4RR:R7RRYR;R>R9RZ(R<RM((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRGsN(t__name__t __module__t__doc__R=RBRFRCRJRIRSRTRdRYR>R^RRZRG(((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR2s    ; !  %    t AddressListcB`sMeZdZdZdZdZdZdZdZdZ RS(u@An AddressList encapsulates a list of parsed RFC 2822 addresses.cC`s5tj|||r(|j|_n g|_dS(N(R2R=RFt addresslist(R<R:((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyR=scC`s t|jS(N(RRj(R<((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt__len__scC`sStd}|j|_x3|jD](}||jkr#|jj|q#q#W|S(N(RiRRjR(R<tothertnewaddrtx((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt__add__s   cC`s:x3|jD](}||jkr |jj|q q W|S(N(RjR(R<RlRn((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt__iadd__ scC`sFtd}x3|jD](}||jkr|jj|qqW|S(N(RiRRjR(R<RlRmRn((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt__sub__s  cC`s:x3|jD](}||jkr |jj|q q W|S(N(Rjtremove(R<RlRn((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt__isub__scC`s |j|S(N(Rj(R<R((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyt __getitem__ s( RfRgRhR=RkRoRpRqRsRt(((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyRis     (Rht __future__RRRRtfuture.builtinsRt__all__R*R,RHR?t COMMASPACERRRR RR)R.R1tobjectR2Ri(((sR/opt/alt/python27/lib/python2.7/site-packages/future/backports/email/_parseaddr.pyts@  u %