<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
B
    ÍAÒ[íC  ã               @   s  d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddd	d
gZddl	Z	ddl
Z
dZdZdZddddddddddddddddddd d!d"d#d$d%gZd&d'd(d)d*d+d,gZddddd-d.d/d-d0d/d1d0d2d1d3œZd4d	„ Zd5d6„ Zd7d„ Zd8d„ Zd9d
„ ZG d:d;„ d;eƒZG d<d=„ d=eƒZdS )>zcEmail address parsing code.

Lifted directly from rfc822.py.  This should eventually be rewritten.
é    )Úunicode_literals)Úprint_function)Údivision)Úabsolute_import)ÚintÚ	mktime_tzÚ	parsedateÚparsedate_tzÚquoteNú Ú z, ZjanZfebZmarZaprZmayZjunZjulZaugÚsepÚoctZnovZdecZjanuaryZfebruaryZmarchZaprilZjuneZjulyZaugustZ	septemberZoctoberZnovemberZdecemberZmonZtueZwedZthuZfriZsatZsunipþÿÿiÔþÿÿiþÿÿi¨ýÿÿiDýÿÿiàüÿÿ)ZUTZUTCZGMTÚZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTc             C   s,   t | ƒ}|sdS |d dk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   úR/opt/alt/python37/lib/python3.7/site-packages/future/backports/email/_parseaddr.pyr	   3   s    c          
   C   s¼  | sdS |   ¡ } | d  d¡s.| d  ¡ tkr6| d= n.| d  d¡}|dkrd| 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krX|| ¡  }}|tkrXdS t 	|¡d }|dkrx|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r<|\}	}
}ndt|ƒdkrœd|d krœ|d   d¡}t|ƒdkr‚|\}	}
d}nt|ƒdkr |\}	}
}ndS y,t|ƒ}t|ƒ}t|	ƒ}	t|
ƒ}
t|ƒ}W n tk
râ   dS X |dk r
|dkr|d7 }n|d7 }d}| ¡ }|tkr*t| }n>yt|ƒ}W n tk
rL   Y nX |dkrh| d¡rhd}|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Úisdigitr   Ú
ValueErrorÚupperÚ
_timezonesÚ
startswith)r   ÚiZstuffÚsZddZmmZyyZtmZtzZthhZtmmZtssZtzoffsetZtzsignr   r   r   r   ?   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    
c             C   s<   | d dk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timegm)r   r9   r   r   r   r   ½   s    
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    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Úatomendsr@   Ú
phraseendsÚfieldÚcommentlist)ÚselfrI   r   r   r   Ú__init__Û   s    zAddrlistClass.__init__c             C   s   g }x€| j t| jƒk r„| j| j  | jd kr^| j| j  dkrN| | j| j  ¡ |  j d7  _ q| j| j  dkr€| j |  ¡ ¡ qP qW t |¡S )z&Skip white space and extract comments.z
r   ú()	rD   r,   rI   rE   r.   rJ   Ú
getcommentÚEMPTYSTRINGÚjoin)rK   Zwslistr   r   r   Úgotonextî   s    zAddrlistClass.gotonextc             C   s>   g }x4| j t| jƒk r8|  ¡ }|r,||7 }q| d¡ qW |S )zVParse all addresses.

        Returns a list containing all of the addresses.
        )r   r   )rD   r,   rI   Ú
getaddressr.   )rK   Ú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kr–|| _|| _ |  ¡ }t | j ¡|fg}n$| j| j dkr g }t| jƒ}|  jd7  _xô| jt| jƒk r|  ¡  | j|k r| j| j dkr|  jd7  _P ||  	¡  }qÆW nš| j| j dkrz|  
¡ }| j rht |¡d d | j ¡ d	 |fg}nt |¡|fg}n@|r˜t | j ¡|d fg}n"| j| j | jk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   )rJ   rQ   rD   Úgetphraselistr,   rI   ÚSPACErP   ÚgetaddrspecrR   ÚgetrouteaddrrC   )rK   ZoldposZoldclÚplistZ
returnlistZaddrspecZfieldlenZ	routeaddrr   r   r   rR   
  sL    
&$zAddrlistClass.getaddressc             C   sä   | j | j dkrdS d}|  jd7  _|  ¡  d}x¬| jt| j ƒk rÞ|rV|  ¡  d}n~| j | j dkrx|  jd7  _P n\| j | j dkrœ|  jd7  _d}n8| j | j d	kr¼|  jd7  _n|  ¡ }|  jd7  _P |  ¡  q4W |S )
zParse a route address (Return-path value).

        This method just skips all the route stuff and returns the addrspec.
        rV   NFr   r   ú>ú@Tr    )rI   rD   rQ   r,   Ú	getdomainrZ   )rK   ZexpectrouteZadlistr   r   r   r[   E  s.    zAddrlistClass.getrouteaddrc             C   sJ  g }|   ¡  xÜ| jt| jƒk rèd}| j| j dkrh|rJ|d  ¡ sJ| ¡  | d¡ |  jd7  _d}nd| j| j dkr| dt|  ¡ ƒ ¡ n<| j| j | j	kr¾|rº|d  ¡ sº| ¡  P n| |  
¡ ¡ |   ¡ }|r|r| |¡ qW | jt| jƒks| j| j dkrt |¡S | d¡ |  jd7  _|   ¡  t |¡|  ¡  S )	zParse an RFC 2822 addr-spec.Tr#   r   r   Fr?   z"%s"r^   )rQ   rD   r,   rI   ÚstripÚpopr.   r
   ÚgetquoterG   ÚgetatomrO   rP   r_   )rK   ZaslistZpreserve_wsZwsr   r   r   rZ   e  s4    
$

zAddrlistClass.getaddrspecc             C   sÖ   g }xÆ| j t| jƒk rÊ| j| j  | jkr8|  j d7  _ q| j| j  dkrZ| j |  ¡ ¡ q| j| j  dkrz| |  ¡ ¡ q| j| j  dkr¤|  j d7  _ | d¡ q| j| j  | jkrºP q| |  	¡ ¡ qW t
 |¡S )z-Get the complete domain name from an address.r   rM   ú[r#   )rD   r,   rI   rE   rJ   r.   rN   ÚgetdomainliteralrG   rc   rO   rP   )rK   Zsdlistr   r   r   r_   †  s    zAddrlistClass.getdomainTc             C   sæ   | j | j |krdS dg}d}|  jd7  _x®| jt| j ƒk rÚ|rZ| | j | j ¡ d}np| j | j |kr||  jd7  _P nN|r¢| j | j dkr¢| |  ¡ ¡ q.n(| j | j dkr¸d}n| | j | j ¡ |  jd7  _q.W 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   rM   r>   T)rI   rD   r,   r.   rN   rO   rP   )rK   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.r?   z"F)rf   )rK   r   r   r   rb   ¾  s    zAddrlistClass.getquotec             C   s   |   ddd¡S )z7Get a parenthesis-delimited fragment from self's field.rM   z)T)rf   )rK   r   r   r   rN   Â  s    zAddrlistClass.getcommentc             C   s   d|   ddd¡ S )z!Parse an RFC 2822 domain-literal.z[%s]rd   z]F)rf   )rK   r   r   r   re   Æ  s    zAddrlistClass.getdomainliteralNc             C   sh   dg}|dkr| j }xH| jt| jƒk r\| j| j |kr:P n| | j| j ¡ |  jd7  _qW 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   )rG   rD   r,   rI   r.   rO   rP   )rK   rG   Zatomlistr   r   r   rc   Ê  s    zAddrlistClass.getatomc             C   sª   g }x | j t| jƒk r¤| j| j  | jkr8|  j d7  _ q| j| j  dkrX| |  ¡ ¡ q| j| j  dkrz| j |  ¡ ¡ q| j| j  | jkrP q| |  	| j¡¡ qW |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   r?   rM   )
rD   r,   rI   rF   r.   rb   rJ   rN   rH   rc   )rK   r\   r   r   r   rX   Þ  s    zAddrlistClass.getphraselist)T)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rL   rQ   rT   rR   r[   rZ   r_   rf   rb   rN   re   rc   rX   r   r   r   r   rB   Ñ   s   ; !
%
rB   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)rB   rL   rT   Úaddresslist)rK   rI   r   r   r   rL   ÷  s    zAddressList.__init__c             C   s
   t | jƒS )N)r,   rl   )rK   r   r   r   Ú__len__þ  s    zAddressList.__len__c             C   sB   t d ƒ}| jd d … |_x$|jD ]}|| jkr |j |¡ q W |S )N)rk   rl   r.   )rK   ÚotherÚnewaddrÚxr   r   r   Ú__add__  s    
zAddressList.__add__c             C   s*   x$|j D ]}|| j kr| j  |¡ qW | S )N)rl   r.   )rK   rn   rp   r   r   r   Ú__iadd__
  s    
zAddressList.__iadd__c             C   s2   t d ƒ}x$| jD ]}||jkr|j |¡ qW |S )N)rk   rl   r.   )rK   rn   ro   rp   r   r   r   Ú__sub__  s
    
zAddressList.__sub__c             C   s*   x$|j D ]}|| j kr| j  |¡ qW | S )N)rl   Úremove)rK   rn   rp   r   r   r   Ú__isub__  s    
zAddressList.__isub__c             C   s
   | j | S )N)rl   )rK   r0   r   r   r   Ú__getitem__   s    zAddressList.__getitem__N)rg   rh   ri   rj   rL   rm   rq   rr   rs   ru   rv   r   r   r   r   rk   õ  s   	rk   )rj   Z
__future__r   r   r   r   Zfuture.builtinsr   Ú__all__r;   r=   rY   rO   Z
COMMASPACEr/   r*   r4   r	   r   r   r   r
   ÚobjectrB   rk   r   r   r   r   Ú<module>   sB   

u	

  &