a
    ƒc:E  ã                   @   s¤   d Z g d¢ZddlZddlZdZdZdZg d¢Zg d¢Zddddd	d
dd	dddddddœZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZG dd„ dƒZG dd„ deƒZdS )zcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
)Ú	mktime_tzÚ	parsedateÚparsedate_tzÚquoteé    Nú Ú z, )ZjanZfebZmarZaprÚmayZjunZjulZaugÚsepÚoctZnovZdecZjanuaryZfebruaryZmarchZaprilr   ZjuneZjulyZaugustZ	septemberZoctoberZnovemberZdecember)ZmonZtueZwedZthuZfriZsatZsunipþÿÿiÔþÿÿiþÿÿi¨ýÿÿiDýÿÿiàüÿÿ)ZUTÚUTCÚGMTÚZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTc                 C   s,   t | ƒ}|sdS |d du r$d|d< t|ƒS )zQConvert a date string to a time tuple.

    Accounts for military timezones.
    Né	   r   )Ú_parsedate_tzÚtuple)ÚdataÚres© r   úa/home/jack/SDK/XuTao-WR3000-OpenWrt-21.02/build_dir/hostpkg/Python-3.9.16/Lib/email/_parseaddr.pyr   -   s    r   c              
   C   sÊ  | sdS |   ¡ } | sdS | d  d¡s6| d  ¡ tv r>| d= n.| d  d¡}|dkrl| d |d d… | d< t| ƒdkr¢| d   d¡}t|ƒdkr¢|| dd…  } t| ƒdkr| d }| d¡}|d	krÔ| d¡}|dkrþ|d|… ||d… g| dd…< n
|  d
¡ t| ƒdk rdS | dd… } | \}}}}}| ¡ }|tvrb|| ¡  }}|tvrbdS t 	|¡d }|dkr‚|d8 }|d	 dkrœ|dd	… }| d¡}|dkrº|| }}|d	 dkrÔ|dd	… }|d  
¡ sì|| }}|d	 dkr|dd	… }|  d¡}t|ƒdkr,|\}	}
d}n„t|ƒdkrF|\}	}
}njt|ƒdkr¬d|d v r¬|d   d¡}t|ƒdkrŒ|\}	}
d}nt|ƒdkr¦|\}	}
}ndS ndS z,t|ƒ}t|ƒ}t|	ƒ}	t|
ƒ}
t|ƒ}W n tyò   Y dS 0 |dk r|dkr|d7 }n|d7 }d}| ¡ }|tv r:t| }n<zt|ƒ}W n tyZ   Y n0 |dkrv| d¡rvd}|r²|dk r’d	}| }nd}||d d |d d   }||||	|
|ddd	|g
S )a†  Convert date to extended time tuple.

    The last (additional) element is the time zone offset in seconds, except if
    the timezone was specified as -0000.  In that case the last element is
    None.  This indicates a UTC timestamp that explicitly declaims knowledge of
    the source timezone, as opposed to a +0000 timestamp that indicates the
    source timezone really was UTC.

    Nr   ú,é   é   ú-é   ú+éÿÿÿÿr   é   é   ú:é   Ú0Ú.éd   éD   il  iÐ  i  é<   )ÚsplitÚendswithÚlowerÚ	_daynamesÚrfindÚlenÚfindÚappendÚ_monthnamesÚindexÚisdigitÚintÚ
ValueErrorÚupperÚ
_timezonesÚ
startswith)r   ÚiÚstuffÚsÚddÚmmZyyÚtmÚtzZthhZtmmZtssZtzoffsetZtzsignr   r   r   r   9   s²    


"














r   c                 C   s&   t | ƒ}t|tƒr|dd… S |S dS )z&Convert a time string to a time tuple.Nr   )r   Ú
isinstancer   ©r   Útr   r   r   r   ²   s    
r   c                 C   s<   | d du r"t  | dd… d ¡S t | ¡}|| d  S dS )zETurn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.r   Né   )r   )ÚtimeÚmktimeÚcalendarZtimegmr=   r   r   r   r   »   s    
r   c                 C   s   |   dd¡  dd¡S )zøPrepare string to be used in a quoted string.

    Turns backslash and double quote characters into quoted pairs.  These
    are the only characters that need to be quoted inside a quoted string.
    Does not add the surrounding double quotes.
    ú\z\\ú"z\")Úreplace)Ústrr   r   r   r   Å   s    r   c                   @   s|   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
ddd„Zdd„ Zdd„ Zdd„ Zddd„Zdd„ ZdS ) ÚAddrlistClassa  Address parser class by Ben Escoto.

    To understand what this class does, it helps to have a copy of RFC 2822 in
    front of you.

    Note: this class interface is deprecated and may be removed in the future.
    Use email.utils.AddressList instead.
    c                 C   sZ   d| _ d| _d| _d| _| j| j | _| j | j | j | _| j dd¡| _|| _g | _	dS )zƒInitialize a new instance.

        `field' is an unparsed address header field, containing
        one or more addresses.
        z()<>@,:;."[]r   z 	z
r!   r   N)
ÚspecialsÚposÚLWSZCRÚFWSÚatomendsrE   Ú
phraseendsÚfieldÚcommentlist©ÚselfrN   r   r   r   Ú__init__Ù   s    zAddrlistClass.__init__c                 C   sŒ   g }| j t| jƒk r‚| j| j  | jd v r\| j| j  dvrL| | j| j  ¡ |  j d7  _ q| j| j  dkr‚| j |  ¡ ¡ qq‚qt |¡S )z&Skip white space and extract comments.z
r   ú()	rI   r*   rN   rJ   r,   rO   Ú
getcommentÚEMPTYSTRINGÚjoin)rQ   Zwslistr   r   r   Úgotonextì   s    zAddrlistClass.gotonextc                 C   s:   g }| j t| jƒk r6|  ¡ }|r*||7 }q| d¡ q|S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )rI   r*   rN   Ú
getaddressr,   )rQ   ÚresultZadr   r   r   Úgetaddrlistú   s    
zAddrlistClass.getaddrlistc                 C   sö  g | _ |  ¡  | j}| j }|  ¡ }|  ¡  g }| jt| jƒkr\|rXt | j ¡|d fg}n\| j| j dv r–|| _|| _ |  ¡ }t | j ¡|fg}n"| j| j dkrg }t| jƒ}|  jd7  _| jt| jƒk r¸|  ¡  | j|k r| j| j dkr|  jd7  _q¸||  	¡  }qÄnš| j| j dkrx|  
¡ }| j rft |¡d d | j ¡ d	 |fg}nt |¡|fg}n@|r–t | j ¡|d fg}n"| j| j | jv r¸|  jd7  _|  ¡  | jt| jƒk rò| j| j d
krò|  jd7  _|S )zParse the next address.r   z.@r   r   ú;ú<z (r   ú)r   )rO   rW   rI   Úgetphraselistr*   rN   ÚSPACErV   ÚgetaddrspecrX   ÚgetrouteaddrrH   )rQ   ZoldposZoldclÚplistZ
returnlistZaddrspecZfieldlenZ	routeaddrr   r   r   rX     sX    

ÿÿÿ$zAddrlistClass.getaddressc                 C   sà   | j | j dkrdS d}|  jd7  _|  ¡  d}| jt| j ƒk rÜ|rT|  ¡  d}n~| j | j dkrv|  jd7  _qÜn\| j | j dkrš|  jd7  _d}n8| j | j d	krº|  jd7  _n|  ¡ }|  jd7  _qÜ|  ¡  q2|S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        r\   NFr   r   ú>ú@Tr   )rN   rI   rW   r*   Ú	getdomainr`   )rQ   ZexpectrouteZadlistr   r   r   ra   C  s.    
zAddrlistClass.getrouteaddrc                 C   sT  g }|   ¡  | jt| jƒk ræd}| j| j dkrf|rH|d  ¡ sH| ¡  | d¡ |  jd7  _d}nd| j| j dkrŽ| dt|  ¡ ƒ ¡ n<| j| j | j	v r¼|ræ|d  ¡ sæ| ¡  qæn| |  
¡ ¡ |   ¡ }|r|r| |¡ q| jt| jƒks
| j| j dkrt |¡S | d¡ |  jd7  _|   ¡  |  ¡ }|sFtS t |¡| S )	zParse an RFC 2822 addr-spec.Tr!   r   r   FrD   z"%s"rd   )rW   rI   r*   rN   ÚstripÚpopr,   r   ÚgetquoterL   ÚgetatomrU   rV   re   )rQ   ZaslistZpreserve_wsÚwsÚdomainr   r   r   r`   c  s:    
$

zAddrlistClass.getaddrspecc                 C   sæ   g }| j t| jƒk rÜ| j| j  | jv r6|  j d7  _ q| j| j  dkrX| j |  ¡ ¡ q| j| j  dkrx| |  ¡ ¡ q| j| j  dkr¢|  j d7  _ | d¡ q| j| j  dkr¶tS | j| j  | j	v rÌqÜq| |  
¡ ¡ qt |¡S )z-Get the complete domain name from an address.r   rS   ú[r!   rd   )rI   r*   rN   rJ   rO   r,   rT   ÚgetdomainliteralrU   rL   ri   rV   )rQ   Zsdlistr   r   r   re   ‰  s"    zAddrlistClass.getdomainTc                 C   sâ   | j | j |krdS dg}d}|  jd7  _| jt| j ƒk rØ|rX| | j | j ¡ d}np| j | j |v rz|  jd7  _qØnN|r | j | j dkr | |  ¡ ¡ q,n(| j | j dkr¶d}n| | j | j ¡ |  jd7  _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.
        r   Fr   rS   rC   T)rN   rI   r*   r,   rT   rU   rV   )rQ   Z	begincharZendcharsZallowcommentsZslistr   r   r   r   Úgetdelimited   s(    zAddrlistClass.getdelimitedc                 C   s   |   ddd¡S )z1Get a quote-delimited fragment from self's field.rD   z"F©rn   ©rQ   r   r   r   rh   Å  s    zAddrlistClass.getquotec                 C   s   |   ddd¡S )z7Get a parenthesis-delimited fragment from self's field.rS   z)Tro   rp   r   r   r   rT   É  s    zAddrlistClass.getcommentc                 C   s   d|   ddd¡ S )z!Parse an RFC 2822 domain-literal.z[%s]rl   z]Fro   rp   r   r   r   rm   Í  s    zAddrlistClass.getdomainliteralNc                 C   sd   dg}|du r| j }| jt| jƒk rZ| j| j |v r8qZn| | j| j ¡ |  jd7  _qt |¡S )a  Parse 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).r   Nr   )rL   rI   r*   rN   r,   rU   rV   )rQ   rL   Zatomlistr   r   r   ri   Ñ  s    zAddrlistClass.getatomc                 C   s¦   g }| j t| jƒk r¢| j| j  | jv r6|  j d7  _ q| j| j  dkrV| |  ¡ ¡ q| j| j  dkrx| j |  ¡ ¡ q| j| j  | jv rŽ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.
        r   rD   rS   )
rI   r*   rN   rK   r,   rh   rO   rT   rM   ri   )rQ   rb   r   r   r   r^   å  s    zAddrlistClass.getphraselist)T)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rR   rW   rZ   rX   ra   r`   re   rn   rh   rT   rm   ri   r^   r   r   r   r   rG   Ï   s   	; &
%
rG   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚAddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.c                 C   s&   t  | |¡ |r|  ¡ | _ng | _d S ©N)rG   rR   rZ   ÚaddresslistrP   r   r   r   rR   þ  s    zAddressList.__init__c                 C   s
   t | jƒS rv   )r*   rw   rp   r   r   r   Ú__len__  s    zAddressList.__len__c                 C   s>   t d ƒ}| jd d … |_|jD ]}|| jvr|j |¡ q|S rv   ©ru   rw   r,   ©rQ   ÚotherZnewaddrÚxr   r   r   Ú__add__  s    

zAddressList.__add__c                 C   s&   |j D ]}|| j vr| j  |¡ q| S rv   )rw   r,   ©rQ   r{   r|   r   r   r   Ú__iadd__  s    

zAddressList.__iadd__c                 C   s.   t d ƒ}| jD ]}||jvr|j |¡ q|S rv   ry   rz   r   r   r   Ú__sub__  s
    

zAddressList.__sub__c                 C   s&   |j D ]}|| j v r| j  |¡ q| S rv   )rw   Úremover~   r   r   r   Ú__isub__   s    

zAddressList.__isub__c                 C   s
   | j | S rv   )rw   )rQ   r.   r   r   r   Ú__getitem__'  s    zAddressList.__getitem__N)rq   rr   rs   rt   rR   rx   r}   r   r€   r‚   rƒ   r   r   r   r   ru   ü  s   	ru   )rt   Ú__all__r@   rB   r_   rU   Ú
COMMASPACEr-   r(   r3   r   r   r   r   r   rG   ru   r   r   r   r   Ú<module>   s.   û	y	

  /