a ÕDOg:Eã@s¤dZgd¢ZddlZddlZdZdZdZgd¢Zgd¢Zddddd d d d d d d d dd dœZ dd„Z dd„Z dd„Z dd„Z dd„ZGdd„dƒZGdd„deƒZdS)zcEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. )Ú mktime_tzÚ parsedateÚ parsedate_tzÚquoteéNú Úz, )ZjanZfebZmarZaprÚmayZjunZjulZaugÚsepÚoctZnovZdecZjanuaryZfebruaryZmarchZaprilrZjuneZjulyZaugustZ septemberZoctoberZnovemberZdecember)ZmonZtueZwedZthuZfriZsatZsunipþÿÿiÔþÿÿi þÿÿi¨ýÿÿiDýÿÿiàüÿÿ)ZUTZUTCZGMTÚZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTcCs,t|ƒ}|sdS|ddur$d|d<t|ƒS)zQConvert a date string to a time tuple. Accounts for military timezones. Né r)Ú _parsedate_tzÚtuple)ÚdataÚres©rú5/opt/alt/python39/lib64/python3.9/email/_parseaddr.pyr-s  rc CsÊ|sdS| ¡}|sdS|d d¡s6|d ¡tvr>|d=n.|d d¡}|dkrl|d|dd…|d<t|ƒdkr¢|d d¡}t|ƒdkr¢||dd…}t|ƒdkr|d}| d¡}|d krÔ| d¡}|dkrþ|d|…||d…g|dd…<n | d ¡t|ƒd krdS|dd …}|\}}}}}| ¡}|tvrb|| ¡}}|tvrbdSt  |¡d}|d kr‚|d 8}|d dkrœ|dd …}| d ¡}|dkrº||}}|d dkrÔ|dd …}|d  ¡sì||}}|d dkr|dd …}| d ¡}t|ƒdkr,|\} } d} n„t|ƒdkrF|\} } } njt|ƒdkr¬d|dvr¬|d d¡}t|ƒdkrŒ|\} } d} nt|ƒdkr¦|\} } } ndSndSz,t |ƒ}t |ƒ}t | ƒ} t | ƒ} t | ƒ} Wnt yòYdS0|dkr|dkr|d7}n|d7}d} |  ¡}|tvr:t|} n@,:;."[]rz z rrN) ÚspecialsÚposÚLWSZCRÚFWSÚatomendsr>Ú phraseendsÚfieldÚ commentlist©ÚselfrGrrrÚ__init__ÙszAddrlistClass.__init__cCsŒg}|jt|jƒkr‚|j|j|jdvr\|j|jdvrL| |j|j¡|jd7_q|j|jdkr‚|j | ¡¡qq‚qt |¡S)z&Skip white space and extract comments.z rú() rBr(rGrCr*rHÚ getcommentÚ EMPTYSTRINGÚjoin)rJZwslistrrrÚgotonextìszAddrlistClass.gotonextcCs:g}|jt|jƒkr6| ¡}|r*||7}q| d¡q|S)zVParse all addresses. Returns a list containing all of the addresses. )rr)rBr(rGÚ getaddressr*)rJÚresultZadrrrÚ getaddrlistús  zAddrlistClass.getaddrlistcCsög|_| ¡|j}|j}| ¡}| ¡g}|jt|jƒkr\|rXt |j¡|dfg}n\|j|jdvr–||_||_| ¡}t |j¡|fg}n"|j|jdkrg}t|jƒ}|jd7_|jt|jƒkr¸| ¡|j|kr|j|jdkr|jd7_q¸||  ¡}qÄnš|j|jdkrx|  ¡}|jrft |¡dd |j¡d |fg}nt |¡|fg}n@|r–t |j¡|dfg}n"|j|j|j vr¸|jd7_| ¡|jt|jƒkrò|j|jd krò|jd7_|S) zParse the next address.rz.@rrú;úú@Tr)rGrBrPr(Ú getdomainrY)rJZ expectrouteZadlistrrrrZCs. zAddrlistClass.getrouteaddrcCsTg}| ¡|jt|jƒkræd}|j|jdkrf|rH|d ¡sH| ¡| d¡|jd7_d}nd|j|jdkrŽ| dt| ¡ƒ¡n<|j|j|j vr¼|ræ|d ¡sæ| ¡qæn| |  ¡¡| ¡}|r |r | |¡q |jt|jƒks |j|jdkrt   |¡S| d¡|jd7_| ¡|  ¡}|sFt St   |¡|S) zParse an RFC 2822 addr-spec.TrrrFr=z"%s"r])rPrBr(rGÚstripÚpopr*rÚgetquoterEÚgetatomrNrOr^)rJZaslistZ preserve_wsZwsZdomainrrrrYcs:  $  zAddrlistClass.getaddrspeccCsæg}|jt|jƒkrÜ|j|j|jvr6|jd7_q|j|jdkrX|j | ¡¡q|j|jdkrx| | ¡¡q|j|jdkr¢|jd7_| d¡q|j|jdkr¶tS|j|j|j vrÌqÜq| |  ¡¡qt  |¡S)z-Get the complete domain name from an address.rrLú[rr]) rBr(rGrCrHr*rMÚgetdomainliteralrNrErbrO)rJZsdlistrrrr^‰s" zAddrlistClass.getdomainTcCsâ|j|j|krdSdg}d}|jd7_|jt|jƒkrØ|rX| |j|j¡d}np|j|j|vrz|jd7_qØnN|r |j|jdkr | | ¡¡q,n(|j|jdkr¶d}n| |j|j¡|jd7_q,t |¡S)aæParse 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. rFrrLr<T)rGrBr(r*rMrNrO)rJZ begincharZendcharsZ allowcommentsZslistrrrrÚ getdelimited s( zAddrlistClass.getdelimitedcCs| ddd¡S)z1Get a quote-delimited fragment from self's field.r=z" F©re©rJrrrraÅszAddrlistClass.getquotecCs| ddd¡S)z7Get a parenthesis-delimited fragment from self's field.rLz) TrfrgrrrrMÉszAddrlistClass.getcommentcCsd| ddd¡S)z!Parse an RFC 2822 domain-literal.z[%s]rcz] FrfrgrrrrdÍszAddrlistClass.getdomainliteralNcCsddg}|dur|j}|jt|jƒkrZ|j|j|vr8qZn| |j|j¡|jd7_qt |¡S)aParse 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).rNr)rErBr(rGr*rNrO)rJrEZatomlistrrrrbÑszAddrlistClass.getatomcCs¦g}|jt|jƒkr¢|j|j|jvr6|jd7_q|j|jdkrV| | ¡¡q|j|jdkrx|j | ¡¡q|j|j|jvrŽq¢q| |  |j¡¡q|S)zýParse 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. rr=rL) rBr(rGrDr*rarHrMrFrb)rJr[rrrrWåszAddrlistClass.getphraselist)T)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rKrPrSrQrZrYr^rerarMrdrbrWrrrrr@Ïs ; & % r@c@sHeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)Ú AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.cCs&t ||¡|r| ¡|_ng|_dS©N)r@rKrSÚ addresslistrIrrrrKþs  zAddressList.__init__cCs t|jƒSrm)r(rnrgrrrÚ__len__szAddressList.__len__cCs>tdƒ}|jdd…|_|jD]}||jvr|j |¡q|Srm©rlrnr*©rJÚotherZnewaddrÚxrrrÚ__add__s   zAddressList.__add__cCs&|jD]}||jvr|j |¡q|Srm)rnr*©rJrrrsrrrÚ__iadd__s  zAddressList.__iadd__cCs.tdƒ}|jD]}||jvr|j |¡q|SrmrprqrrrÚ__sub__s   zAddressList.__sub__cCs&|jD]}||jvr|j |¡q|Srm)rnÚremoverurrrÚ__isub__ s  zAddressList.__isub__cCs |j|Srm)rn)rJr,rrrÚ __getitem__'szAddressList.__getitem__N) rhrirjrkrKrortrvrwryrzrrrrrlüs rl)rkÚ__all__r9r;rXrNZ COMMASPACEr+r&r1rr rrrr@rlrrrrÚs.û  y   /