<!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>

]O                @   s  d  d l  Z  d  d l 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 l m Z e d  Z e e d	  BZ e d
  Z e e BZ e e d  Z e e d  Z e e d  Be d  Z e e BZ e e d  BZ e e BZ e e d  Z d d   Z Gd d   d  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z  Gd d   d e  Z! Gd  d!   d! e  Z" Gd" d#   d# e  Z# Gd$ d%   d% e  Z$ Gd& d'   d' e  Z% Gd( d)   d) e%  Z& Gd* d+   d+ e  Z' Gd, d-   d- e  Z( Gd. d/   d/ e  Z) Gd0 d1   d1 e  Z* Gd2 d3   d3 e  Z+ Gd4 d5   d5 e  Z, Gd6 d7   d7 e  Z- Gd8 d9   d9 e  Z. Gd: d;   d; e  Z/ Gd< d=   d= e  Z0 Gd> d?   d? e  Z1 Gd@ dA   dA e  Z2 GdB dC   dC e  Z3 GdD dE   dE e  Z4 GdF dG   dG e  Z5 GdH dI   dI e  Z6 GdJ dK   dK e  Z7 GdL dM   dM e  Z8 GdN dO   dO e  Z9 GdP dQ   dQ e  Z: GdR dS   dS e  Z; GdT dU   dU e;  Z< GdV dW   dW e  Z= GdX dY   dY e  Z> GdZ d[   d[ e  Z? Gd\ d]   d] e  Z@ Gd^ d_   d_ e  ZA Gd` da   da eA  ZB Gdb dc   dc eA  ZC Gdd de   de e  ZD Gdf dg   dg e  ZE Gdh di   di e  ZF Gdj dk   dk eG  ZH Gdl dm   dm eH  ZI Gdn do   do eH  ZJ Gdp dq   dq eI  ZK eJ d dr  ZL eJ ds dt  ZM eJ du dv  ZN e  jO dw jP dx jQ e    jR ZS e  jO dy jP dx jQ e  jT dz d{  jT d| d}    jU ZV e  jO d~  jW ZX e  jO dy jP dx jQ e  jT dz d{  jT d| d}    jU ZY e  jO dy jP dx jQ e  jT dz d{  jT d| d}    jU ZZ e  jO dy jP dx jQ e  jT dz d{  jT d| d}    jU Z[ d d   Z\ d d   Z] d d   Z^ d d   Z_ d d   Z` d d   Za d d   Zb d d   Zc d d   Zd d d   Ze d d   Zf d d   Zg d d   Zh d d   Zi d d   Zj d d   Zk d d   Zl d d   Zm d d   Zn d d   Zo d d   Zp d d   Zq d d   Zr d d   Zs d d   Zt d d   Zu d d   Zv d d   Zw d d   Zx d d   Zy d d   Zz d 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   Z d 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   Z d d   Z d d   Z d S)    N)	hexdigits)OrderedDict)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%c             C   s*   d t  |   j d d  j d d  d S)N"\z\\z\")strreplace)value r   9/opt/alt/python35/lib64/python3.5/_header_value_parser.pyquote_string`   s    r   c               @   s[   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d d  Z d S)_Foldedc             C   sC   | |  _  | |  _ d |  _ d  |  _ d |  _ g  |  _ g  |  _ d  S)Nr   T)maxlenpolicylastlenstickyspace	firstlinedonecurrent)selfr   r   r   r   r   __init__i   s    						z_Folded.__init__c             C   sC   |  j  j |  j  |  j  j |  j j  |  j j   d |  _ d  S)Nr   )r   extendr   appendr   linesepclearr   )r   r   r   r   newliner   s    z_Folded.newlinec             C   s   |  j  r |  j   d  S)N)r   r!   )r   r   r   r   finalizex   s    	z_Folded.finalizec             C   s   d j  |  j  S)N )joinr   )r   r   r   r   __str__|   s    z_Folded.__str__c             C   s   |  j  j |  d  S)N)r   r   )r   stokenr   r   r   r      s    z_Folded.appendNc             C   s  | d  k r t  |  } t |  } |  j d  k	 r+t |  j  } |  j | | |  j k r |  j j |  j  |  j | 7_ |  j j |  |  j | 7_ d  |  _ d |  _ d S| j r
| j	   } | d  k	 r |  j t  |  7_ | t |  7} | j
 |   d S| r| d |  j k r|  j | } d | k  oG| k  n r| | } |  j j |  j d  |   |  j | d   |  _ | } |  j   |  j j |  j  |  j j |  | | |  _ d  |  _ d |  _ d S|  j s|  j   |  j j |  j  |  j j |  d  |  _ d |  _ d S|  j | |  j k rd|  j j |  |  j | 7_ d S| |  j k  r|  j   |  j j |  | |  _ d Sd S)NFT   r   )r   lenr   r   r   r   r   r   has_fwspop_leading_fws_foldr!   )r   tokenr&   lZstickyspace_lenwsmarginZtrimr   r   r   append_if_fits   sf    			

			
		
	z_Folded.append_if_fits)	__name__
__module____qualname__r   r!   r"   r%   r   r0   r   r   r   r   r   g   s   	r   c                   s-  e  Z d  Z d Z   f d d   Z d d   Z   f d d   Z e d d	    Z e d
 d    Z	 e d d    Z
 d d   Z d d   Z d d   Z e d d    Z d d   Z e d d    Z d d   Z d d   Z d d   Z d  d!   Z d" d# d$  Z d" d% d&  Z d" d' d(  Z   S))	TokenListNc                s    t    j | |   g  |  _ d  S)N)superr   defects)r   argskw)	__class__r   r   r      s    zTokenList.__init__c             C   s   d j  d d   |  D  S)Nr#   c             s   s   |  ] } t  |  Vq d  S)N)r   ).0xr   r   r   	<genexpr>   s    z$TokenList.__str__.<locals>.<genexpr>)r$   )r   r   r   r   r%      s    zTokenList.__str__c                s   d j  |  j j t   j    S)Nz{}({}))formatr9   r1   r5   __repr__)r   )r9   r   r   r>      s    zTokenList.__repr__c             C   s   d j  d d   |  D  S)Nr#   c             s   s!   |  ] } | j  r | j  Vq d  S)N)r   )r:   r;   r   r   r   r<      s    z"TokenList.value.<locals>.<genexpr>)r$   )r   r   r   r   r      s    zTokenList.valuec             C   s   t  d d   |  D |  j  S)Nc             s   s   |  ] } | j  Vq d  S)N)all_defects)r:   r;   r   r   r   r<      s    z(TokenList.all_defects.<locals>.<genexpr>)sumr6   )r   r   r   r   r?      s    zTokenList.all_defectsc             c   s   |  j  } g  } x |  D]| } | j   r_ | r_ t |  d k rJ | d n	 | |  V| j   | j   } | j |  | r | |  V| g } q W| r t |  d k r | d n	 | |  Vd  S)Nr'   r   )r9   startswith_fwsr(   r    pop_trailing_wsr   )r   klassthisr,   Zend_wsr   r   r   parts   s    	'
zTokenList.partsc             C   s   |  d j    S)Nr   )rA   )r   r   r   r   rA   
  s    zTokenList.startswith_fwsc             C   s.   |  d j  d k r  |  j d  S|  d j   S)Nr   fws)
token_typepopr*   )r   r   r   r   r*     s    zTokenList.pop_leading_fwsc             C   s.   |  d j  d k r  |  j d  S|  d j   S)Nr'   cfwsrJ   rJ   )rG   rH   rB   )r   r   r   r   rB     s    zTokenList.pop_trailing_wsc             C   s"   x |  D] } | j  r d Sq Wd S)NTF)r)   )r   partr   r   r   r)     s    	zTokenList.has_fwsc             C   s   |  d j    S)Nr   )has_leading_comment)r   r   r   r   rL     s    zTokenList.has_leading_commentc             C   s+   g  } x |  D] } | j  | j  q W| S)N)r   comments)r   rM   r,   r   r   r   rM   !  s    zTokenList.commentsc            C   sE   | j  p t d  } t | |  } |  j |  | j   t |  S)Nz+inf)Zmax_line_lengthfloatr   r+   r"   r   )r   r   r   foldedr   r   r   fold(  s
    
zTokenList.foldc             C   s   g  } |  j    } | r% | j |  |  d j d k rG |  j d  n d } | j t j t |   |   | j |  d j |  S)Nr'   rF   r#   rJ   rJ   )r*   r   rG   rH   _ewencoder   r$   )r   charsetresr.   Ztrailerr   r   r   as_encoded_word0  s    (zTokenList.as_encoded_wordc             C   s=   g  } x' |  D] } | j  | j | |   q Wd j |  S)Nr#   )r   
cte_encoder$   )r   rS   r   rT   rK   r   r   r   rV   <  s    zTokenList.cte_encodec             C   s>  | j  j r d n d } x|  j D]} t |  } t |  } y t |  j |  Wn^ t k
 r t d d   | j D  r d } n d } | j	 | | j   } t |  } Yn X| j
 | |  r q" | j   } | d  k	 rt |  | _ | j
 |  rq" | j r| j |  q" | j |  | j   q" Wd  S)Nzutf-8asciic             s   s!   |  ] } t  | t j  Vq d  S)N)
isinstancer   UndecodableBytesDefect)r:   r;   r   r   r   r<   J  s   z"TokenList._fold.<locals>.<genexpr>zunknown-8bit)r   utf8rE   r   r(   rR   UnicodeEncodeErroranyr?   rV   r0   r*   r   r)   r+   r   r!   )r   rO   encodingrK   tstrtlenrS   r.   r   r   r   r+   B  s2    		zTokenList._foldr#   c             C   s#   t  d j |  j d d    d  S)N
indentr#   )printr$   _pp)r   ra   r   r   r   pprintc  s    zTokenList.pprintc             C   s   d j  |  j d d   S)Nr`   ra   r#   )r$   rc   )r   ra   r   r   r   ppstrf  s    zTokenList.ppstrc             c   s   d j  | |  j j |  j  VxH |  D]@ } t | d  sN | d j  |  Vq$ | j | d  Ed  Hq$ W|  j r d j  |  j  } n d } d j  | |  Vd  S)Nz{}{}/{}(rc   z*    !! invalid element in token list: {!r}z    z Defects: {}r#   z{}){})r=   r9   r1   rG   hasattrrc   r6   )r   ra   r,   extrar   r   r   rc   i  s    			zTokenList._pp)r1   r2   r3   rG   r   r%   r>   propertyr   r?   rE   rA   r*   rB   r)   rL   rM   rP   rU   rV   r+   rd   re   rc   r   r   )r9   r   r4      s(   +!r4   c               @   s4   e  Z d  Z e d d    Z e d d    Z d S)WhiteSpaceTokenListc             C   s   d S)N r   )r   r   r   r   r   }  s    zWhiteSpaceTokenList.valuec             C   s   d d   |  D S)Nc             S   s(   g  |  ] } | j  d  k r | j  q S)comment)rG   content)r:   r;   r   r   r   
<listcomp>  s   	 z0WhiteSpaceTokenList.comments.<locals>.<listcomp>r   )r   r   r   r   rM     s    zWhiteSpaceTokenList.commentsN)r1   r2   r3   rh   r   rM   r   r   r   r   ri   {  s   ri   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)UnstructuredTokenListunstructuredc             C   s)  d  } | j  j r d n d } x|  j D]} t |  } d } y t |  j |  Wnt k
 rgt d d   | j D  r d } n d } | d  k	 rNt d j	 | j
 | d   | g   j |  } t d d   | j
 d  |  D  }	 t |  }
 t |
  } |	 | | j k rN| j
 | d   =| j |
  |	 | | _ w( | j |  } d	 } Yn X| j | |  r| r( t | j
  d
 } q( | s| r| j |  q( | j   } | d  k	 rt |  | _ | j |  rq( | j r| j |  q( | j |  | j   d  } q( Wd  S)Nzutf-8rW   Fc             s   s!   |  ] } t  | t j  Vq d  S)N)rX   r   rY   )r:   r;   r   r   r   r<     s   z.UnstructuredTokenList._fold.<locals>.<genexpr>zunknown-8bitr#   c             s   s   |  ] } t  |  Vq d  S)N)r(   )r:   r;   r   r   r   r<     s    Tr'   )r   rZ   rE   r   rR   r[   r\   r?   get_unstructuredr$   r   rU   r@   r(   r   r   r   r0   Z_fold_as_ewr*   r   r)   r+   r!   )r   rO   last_ewr]   rK   r^   is_ewrS   chunkZ
oldlastlenschunklchunkr.   r   r   r   r+     sV    	/&	
zUnstructuredTokenList._foldc             C   s   g  } d  } x |  D] } t  |  } y | j d  | j |  Wq t k
 r | d  k r | j | j | |   t |  } n< t d j | | d   | g   } | j | j |   Yq Xq Wd j |  S)Nzus-asciir#   )	r   rR   r   r[   rV   r(   rp   r$   rU   )r   rS   r   rT   rq   rK   sparttlr   r   r   rV     s    &z UnstructuredTokenList.cte_encodeN)r1   r2   r3   rG   r+   rV   r   r   r   r   rn     s   5rn   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)Phrasephrasec             C   sa  d  } | j  j r d n d } x<|  j D]1} t |  } t |  } d } y t |  j |  Wnt k
 rt d d   | j D  r d } n d } | d  k	 r| j	   r| d j
 d k r | j r | j d  }	 n d	 }	 xC t |  D]5 \ }
 } | j
 d
 k r t | d  d    | |
 <q Wt d	 j | j | d   | g   j |  } t |  } t |  } | | | j k r| j | d   =| j |  t d d   | j D  | _ w( | j |  } t |  } d } Yn X| j | |  rL| r+| j r+t | j  d } q( | j sC| j
 d k r( d  } q( | j |  q( Wd  S)Nzutf-8rW   Fc             s   s!   |  ] } t  | t j  Vq d  S)N)rX   r   rY   )r:   r;   r   r   r   r<     s   zPhrase._fold.<locals>.<genexpr>zunknown-8bitr'   rI   r#   zbare-quoted-stringc             s   s   |  ] } t  |  Vq d  S)N)r(   )r:   r;   r   r   r   r<     s    Tzquoted-stringrJ   rJ   )r   rZ   rE   r   r(   rR   r[   r\   r?   rL   rG   rM   rH   	enumeratern   rp   r$   r   rU   r   r   r@   r   r0   r+   )r   rO   rq   r]   rK   r^   r_   Zhas_ewrS   	remainderir,   rs   rt   ru   r   r   r   r+     sN    	/zPhrase._foldc             C   s  g  } d  } d } x}|  D]u} t  |  } y | j d  | j |  Wnt k
 rhd } | d  k r | j s t |  } | j | j | |   n | j   sd| d	 j d k r | j r | j	 d
  } n d } xC t
 |  D]5 \ }	 }
 |
 j d k r t |
 d  d    | |	 <q Wt d j | | d   | g   } | j |  g | | d   <Yn X| j s| r | j d k r d  } q Wd j |  S)NFzus-asciiTr'   rI   r#   zbare-quoted-stringzquoted-stringrJ   rJ   )r   rR   r   r[   rM   r(   rV   rL   rG   rH   rz   rn   rp   r$   rU   )r   rS   r   rT   rq   rr   rK   rv   r{   r|   r,   rw   r   r   r   rV     s4    	&!
zPhrase.cte_encodeN)r1   r2   r3   rG   r+   rV   r   r   r   r   rx     s   ?rx   c               @   s   e  Z d  Z d Z d S)WordZwordN)r1   r2   r3   rG   r   r   r   r   r}   1  s   r}   c               @   s"   e  Z d  Z d Z d d   Z d S)CFWSListrI   c             C   s   t  |  j  S)N)boolrM   )r   r   r   r   rL   :  s    zCFWSList.has_leading_commentN)r1   r2   r3   rG   rL   r   r   r   r   r~   6  s   r~   c               @   s   e  Z d  Z d Z d S)AtomatomN)r1   r2   r3   rG   r   r   r   r   r   >  s   r   c               @   s   e  Z d  Z d Z d S)Tokenr,   N)r1   r2   r3   rG   r   r   r   r   r   C  s   r   c               @   s:   e  Z d  Z d Z d Z d Z d Z e d d    Z d S)EncodedWordzencoded-wordNc             C   s3   |  j  d  k	 r |  j  St j t |   |  j  d  S)N)cterQ   rR   r   rS   )r   r   r   r   encodedO  s    zEncodedWord.encoded)	r1   r2   r3   rG   r   rS   langrh   r   r   r   r   r   r   H  s
   r   c               @   sL   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z d S)	QuotedStringzquoted-stringc             C   s+   x$ |  D] } | j  d k r | j Sq Wd  S)Nzbare-quoted-string)rG   r   )r   r;   r   r   r   rl   [  s    zQuotedString.contentc             C   sY   g  } xC |  D]; } | j  d k r8 | j t |   q | j | j  q Wd j |  S)Nzbare-quoted-stringr#   )rG   r   r   r   r$   )r   rT   r;   r   r   r   quoted_valuea  s    zQuotedString.quoted_valuec             C   s+   x$ |  D] } | j  d k r | j Sq Wd  S)Nzbare-quoted-string)rG   r   )r   r,   r   r   r   stripped_valuek  s    zQuotedString.stripped_valueN)r1   r2   r3   rG   rh   rl   r   r   r   r   r   r   r   W  s   
r   c               @   s4   e  Z d  Z d Z d d   Z e d d    Z d S)BareQuotedStringzbare-quoted-stringc             C   s    t  d j d d   |  D   S)Nr#   c             s   s   |  ] } t  |  Vq d  S)N)r   )r:   r;   r   r   r   r<   w  s    z+BareQuotedString.__str__.<locals>.<genexpr>)r   r$   )r   r   r   r   r%   v  s    zBareQuotedString.__str__c             C   s   d j  d d   |  D  S)Nr#   c             s   s   |  ] } t  |  Vq d  S)N)r   )r:   r;   r   r   r   r<   {  s    z)BareQuotedString.value.<locals>.<genexpr>)r$   )r   r   r   r   r   y  s    zBareQuotedString.valueN)r1   r2   r3   rG   r%   rh   r   r   r   r   r   r   r  s   r   c               @   sR   e  Z d  Z d Z d d   Z d d   Z e d d    Z e d d	    Z d
 S)Commentrk   c                s8   d j  t d g   f d d     D d g g g    S)Nr#   r   c                s   g  |  ] }   j  |   q Sr   )quote)r:   r;   )r   r   r   rm     s   	 z#Comment.__str__.<locals>.<listcomp>))r$   r@   )r   r   )r   r   r%     s
    		zComment.__str__c             C   sG   | j  d k r t |  St |  j d d  j d d  j d d  S)Nrk   r   z\\r   z\(r   z\))rG   r   r   )r   r   r   r   r   r     s
    
zComment.quotec             C   s   d j  d d   |  D  S)Nr#   c             s   s   |  ] } t  |  Vq d  S)N)r   )r:   r;   r   r   r   r<     s    z"Comment.content.<locals>.<genexpr>)r$   )r   r   r   r   rl     s    zComment.contentc             C   s
   |  j  g S)N)rl   )r   r   r   r   rM     s    zComment.commentsN)	r1   r2   r3   rG   r%   r   rh   rl   rM   r   r   r   r   r   ~  s
   r   c               @   sL   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z d S)	AddressListzaddress-listc             C   s   d d   |  D S)Nc             S   s%   g  |  ] } | j  d  k r |  q S)address)rG   )r:   r;   r   r   r   rm     s   	 z)AddressList.addresses.<locals>.<listcomp>r   )r   r   r   r   	addresses  s    zAddressList.addressesc             C   s   t  d d   |  D g   S)Nc             s   s'   |  ] } | j  d  k r | j Vq d S)r   N)rG   	mailboxes)r:   r;   r   r   r   r<     s   z(AddressList.mailboxes.<locals>.<genexpr>)r@   )r   r   r   r   r     s    zAddressList.mailboxesc             C   s   t  d d   |  D g   S)Nc             s   s'   |  ] } | j  d  k r | j Vq d S)r   N)rG   all_mailboxes)r:   r;   r   r   r   r<     s   z,AddressList.all_mailboxes.<locals>.<genexpr>)r@   )r   r   r   r   r     s    zAddressList.all_mailboxesN)r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r     s   r   c               @   sL   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z d S)	Addressr   c             C   s"   |  d j  d k r |  d j Sd  S)Nr   group)rG   display_name)r   r   r   r   r     s    zAddress.display_namec             C   s@   |  d j  d k r |  d g S|  d j  d k r5 g  S|  d j S)Nr   mailboxzinvalid-mailbox)rG   r   )r   r   r   r   r     s
    zAddress.mailboxesc             C   sG   |  d j  d k r |  d g S|  d j  d k r< |  d g S|  d j S)Nr   r   zinvalid-mailbox)rG   r   )r   r   r   r   r     s
    zAddress.all_mailboxesN)r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r     s   r   c               @   s:   e  Z d  Z d Z e d d    Z e d d    Z d S)MailboxListzmailbox-listc             C   s   d d   |  D S)Nc             S   s%   g  |  ] } | j  d  k r |  q S)r   )rG   )r:   r;   r   r   r   rm     s   	 z)MailboxList.mailboxes.<locals>.<listcomp>r   )r   r   r   r   r     s    zMailboxList.mailboxesc             C   s   d d   |  D S)Nc             S   s%   g  |  ] } | j  d k r |  q S)r   invalid-mailbox)r   r   )rG   )r:   r;   r   r   r   rm     s   	 z-MailboxList.all_mailboxes.<locals>.<listcomp>r   )r   r   r   r   r     s    zMailboxList.all_mailboxesN)r1   r2   r3   rG   rh   r   r   r   r   r   r   r     s   r   c               @   s:   e  Z d  Z d Z e d d    Z e d d    Z d S)	GroupListz
group-listc             C   s)   |  s |  d j  d k r g  S|  d j S)Nr   zmailbox-list)rG   r   )r   r   r   r   r     s    zGroupList.mailboxesc             C   s)   |  s |  d j  d k r g  S|  d j S)Nr   zmailbox-list)rG   r   )r   r   r   r   r     s    zGroupList.all_mailboxesN)r1   r2   r3   rG   rh   r   r   r   r   r   r   r     s   r   c               @   sL   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z d S)	Groupr   c             C   s"   |  d j  d k r g  S|  d j S)N   z
group-list)rG   r   )r   r   r   r   r     s    zGroup.mailboxesc             C   s"   |  d j  d k r g  S|  d j S)Nr   z
group-list)rG   r   )r   r   r   r   r     s    zGroup.all_mailboxesc             C   s   |  d j  S)Nr   )r   )r   r   r   r   r     s    zGroup.display_nameN)r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r     s   r   c               @   sp   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z e d d	    Z e d
 d    Z	 d S)NameAddrz	name-addrc             C   s!   t  |   d k r d  S|  d j S)Nr'   r   )r(   r   )r   r   r   r   r     s    zNameAddr.display_namec             C   s   |  d j  S)Nr'   rJ   )
local_part)r   r   r   r   r     s    zNameAddr.local_partc             C   s   |  d j  S)Nr'   rJ   )domain)r   r   r   r   r     s    zNameAddr.domainc             C   s   |  d j  S)Nr'   rJ   )route)r   r   r   r   r   
  s    zNameAddr.routec             C   s   |  d j  S)Nr'   rJ   )	addr_spec)r   r   r   r   r     s    zNameAddr.addr_specN)
r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s^   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z e d d	    Z d
 S)	AngleAddrz
angle-addrc             C   s+   x$ |  D] } | j  d k r | j Sq Wd  S)Nz	addr-spec)rG   r   )r   r;   r   r   r   r     s    zAngleAddr.local_partc             C   s+   x$ |  D] } | j  d k r | j Sq Wd  S)Nz	addr-spec)rG   r   )r   r;   r   r   r   r     s    zAngleAddr.domainc             C   s+   x$ |  D] } | j  d k r | j Sq Wd  S)Nz	obs-route)rG   domains)r   r;   r   r   r   r   #  s    zAngleAddr.routec             C   s/   x( |  D] } | j  d k r | j Sq Wd Sd  S)Nz	addr-specz<>)rG   r   )r   r;   r   r   r   r   )  s    zAngleAddr.addr_specN)	r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r   r     s
   r   c               @   s(   e  Z d  Z d Z e d d    Z d S)ObsRoutez	obs-routec             C   s   d d   |  D S)Nc             S   s(   g  |  ] } | j  d  k r | j  q S)r   )rG   r   )r:   r;   r   r   r   rm   8  s   	 z$ObsRoute.domains.<locals>.<listcomp>r   )r   r   r   r   r   6  s    zObsRoute.domainsN)r1   r2   r3   rG   rh   r   r   r   r   r   r   2  s   r   c               @   sp   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z e d d	    Z e d
 d    Z	 d S)Mailboxr   c             C   s"   |  d j  d k r |  d j Sd  S)Nr   z	name-addr)rG   r   )r   r   r   r   r   ?  s    zMailbox.display_namec             C   s   |  d j  S)Nr   )r   )r   r   r   r   r   D  s    zMailbox.local_partc             C   s   |  d j  S)Nr   )r   )r   r   r   r   r   H  s    zMailbox.domainc             C   s"   |  d j  d k r |  d j Sd  S)Nr   z	name-addr)rG   r   )r   r   r   r   r   L  s    zMailbox.routec             C   s   |  d j  S)Nr   )r   )r   r   r   r   r   Q  s    zMailbox.addr_specN)
r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r   r   r   ;  s   r   c               @   s:   e  Z d  Z d Z e d d    Z e Z Z Z Z	 d S)InvalidMailboxzinvalid-mailboxc             C   s   d  S)Nr   )r   r   r   r   r   Z  s    zInvalidMailbox.display_nameN)
r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r   r   r   V  s   r   c                   s.   e  Z d  Z d Z e   f d d    Z   S)Domainr   c                s   d j  t   j j    S)Nr#   )r$   r5   r   split)r   )r9   r   r   r   e  s    zDomain.domain)r1   r2   r3   rG   rh   r   r   r   )r9   r   r   a  s   r   c               @   s   e  Z d  Z d Z d S)DotAtomzdot-atomN)r1   r2   r3   rG   r   r   r   r   r   j  s   r   c               @   s   e  Z d  Z d Z d S)DotAtomTextzdot-atom-textN)r1   r2   r3   rG   r   r   r   r   r   o  s   r   c               @   s^   e  Z d  Z d Z e d d    Z e d d    Z e d d    Z e d d	    Z d
 S)AddrSpecz	addr-specc             C   s   |  d j  S)Nr   )r   )r   r   r   r   r   x  s    zAddrSpec.local_partc             C   s!   t  |   d k  r d  S|  d j S)N   r'   rJ   )r(   r   )r   r   r   r   r   |  s    zAddrSpec.domainc             C   sJ   t  |   d k  r |  d j S|  d j j   |  d j |  d j j   S)Nr   r   r'   r   )r(   r   rstriplstrip)r   r   r   r   r     s    zAddrSpec.valuec             C   sh   t  |  j  } t |  t | t  k r= t |  j  } n	 |  j } |  j d  k	 rd | d |  j S| S)N@)setr   r(   DOT_ATOM_ENDSr   r   )r   ZnamesetZlpr   r   r   r     s    	zAddrSpec.addr_specN)	r1   r2   r3   rG   rh   r   r   r   r   r   r   r   r   r   t  s
   r   c               @   s   e  Z d  Z d Z d S)ObsLocalPartzobs-local-partN)r1   r2   r3   rG   r   r   r   r   r     s   r   c                   s@   e  Z d  Z d Z e d d    Z e   f d d    Z   S)DisplayNamezdisplay-namec             C   s   t  |   } | d j d k r/ | j d  n5 | d d j d k rd t  | d d d    | d <| d j d k r | j   n5 | d d j d k r t  | d d  d   | d	 <| j S)
Nr   rI   r'   rJ   rJ   rJ   rJ   rJ   rJ   )r4   rG   rH   r   )r   rT   r   r   r   r     s    zDisplayName.display_namec                s   d } |  j  r d } n& x# |  D] } | j d k r d } q W| r d } } |  d j d k sx |  d d j d k r~ d } |  d	 j d k s |  d
 d j d k r d } | t |  j  | St   j Sd  S)NFTzquoted-stringr#   r   rI   rj   r'   rJ   rJ   rJ   )r6   rG   r   r   r5   r   )r   r   r;   preZpost)r9   r   r   r     s    		

**zDisplayName.value)r1   r2   r3   rG   rh   r   r   r   r   )r9   r   r     s   r   c               @   s:   e  Z d  Z d Z e d d    Z e d d    Z d S)	LocalPartz
local-partc             C   s-   |  d j  d k r |  d j S|  d j Sd  S)Nr   zquoted-string)rG   r   r   )r   r   r   r   r     s    zLocalPart.valuec             C   s  t  g } t  } d } x |  d t  g D] } | j d k r? q' | r | j d k r | d j d k r t | d  d   | d <t | t  } | r | j d k r | d j d k r | j t | d d     n | j |  | d	 } | } q' Wt | d d
   } | j S)NFr   rI   dotr'   rJ   rJ   rJ   rJ   rJ   )DOTrG   r4   rX   r   r   )r   rT   ZlastZ
last_is_tltokZis_tlr   r   r   r     s$    	 

zLocalPart.local_partN)r1   r2   r3   rG   rh   r   r   r   r   r   r   r     s   r   c                   s@   e  Z d  Z d Z e   f d d    Z e d d    Z   S)DomainLiteralzdomain-literalc                s   d j  t   j j    S)Nr#   )r$   r5   r   r   )r   )r9   r   r   r     s    zDomainLiteral.domainc             C   s+   x$ |  D] } | j  d k r | j Sq Wd  S)Nptext)rG   r   )r   r;   r   r   r   ip  s    zDomainLiteral.ip)r1   r2   r3   rG   rh   r   r   r   r   )r9   r   r     s   r   c               @   s"   e  Z d  Z d Z d Z d Z d S)MIMEVersionzmime-versionN)r1   r2   r3   rG   majorminorr   r   r   r   r     s   r   c               @   sL   e  Z d  Z d Z d Z d Z d Z e d d    Z e d d    Z	 d S)		Parameter	parameterFzus-asciic             C   s   |  j  r |  d j Sd S)Nr'   r   )	sectionednumber)r   r   r   r   section_number   s    zParameter.section_numberc             C   s   xz |  D]r } | j  d k r# | j S| j  d k r xD | D]< } | j  d k r9 x$ | D] } | j  d k rU | j SqU Wq9 Wq Wd S)Nr   zquoted-stringzbare-quoted-stringr#   )rG   r   )r   r,   r   r   r   param_value  s    zParameter.param_valueN)
r1   r2   r3   rG   r   extendedrS   rh   r   r   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)InvalidParameterzinvalid-parameterN)r1   r2   r3   rG   r   r   r   r   r     s   r   c               @   s(   e  Z d  Z d Z e d d    Z d S)	Attribute	attributec             C   s.   x' |  D] } | j  j d  r | j Sq Wd  S)Nattrtext)rG   endswithr   )r   r,   r   r   r   r     s    zAttribute.stripped_valueN)r1   r2   r3   rG   rh   r   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)SectionsectionN)r1   r2   r3   rG   r   r   r   r   r   r   $  s   r   c               @   s(   e  Z d  Z d Z e d d    Z d S)Valuer   c             C   sC   |  d } | j  d k r# |  d } | j  j d  r< | j S|  j S)Nr   rI   r'   quoted-stringr   extended-attribute)r   r   r   )rG   r   r   r   )r   r,   r   r   r   r   .  s    

		zValue.stripped_valueN)r1   r2   r3   rG   rh   r   r   r   r   r   r   *  s   r   c               @   s4   e  Z d  Z d Z e d d    Z d d   Z d S)MimeParameterszmime-parametersc             c   s  t    } x| |  D]t } | j j d  s+ q | d j d k rA q | d j j   } | | k rj g  | | <| | j | j | f  q Wx| j   D]\ } } t | d t	 d  } | d d } | j
 } | j r1t |  d k r1| d d d k r1| d d j j t j d   | d  d  } g  } d } x/| D]'\ }	 }
 |	 | k r|
 j s|
 j j t j d   qDn |
 j j t j d   | d 7} |
 j } |
 j r^y t j j |  } Wn* t k
 rt j j | d	 d
 } Ync Xy | j | d  } Wn$ t k
 r8| j d d  } Yn Xt j |  r^|
 j j t j    | j |  qDWd j |  } | | f Vq Wd  S)Nr   r   r   keyr'   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingr]   zlatin-1surrogateescapezus-asciir#   )r   rG   r   r   stripr   r   itemssortedr   rS   r   r(   r6   r   InvalidHeaderDefectr   urllibparseZunquote_to_bytesr[   unquotedecodeLookupErrorr   _has_surrogatesrY   r$   )r   paramsr,   namerE   Zfirst_paramrS   Zvalue_partsr|   r   paramr   r   r   r   r   =  sZ    	
	
	


		zMimeParameters.paramsc             C   sv   g  } xL |  j  D]A \ } } | rD | j d j | t |    q | j |  q Wd j |  } | rr d | Sd S)Nz{}={}z; rj   r#   )r   r   r=   r   r$   )r   r   r   r   r   r   r   r%     s    "zMimeParameters.__str__N)r1   r2   r3   rG   rh   r   r%   r   r   r   r   r   9  s   Fr   c               @   s4   e  Z d  Z e d d    Z e d d    Z d S)ParameterizedHeaderValuec             C   s1   x* t  |   D] } | j d k r | j Sq Wi  S)Nzmime-parameters)reversedrG   r   )r   r,   r   r   r   r     s    zParameterizedHeaderValue.paramsc             C   sB   |  r5 |  d j  d k r5 t |  d  d  |  d  St |   j S)Nr'   zmime-parametersrJ   rJ   rJ   )rG   r4   rE   )r   r   r   r   rE     s    zParameterizedHeaderValue.partsN)r1   r2   r3   rh   r   rE   r   r   r   r   r     s   r   c               @   s"   e  Z d  Z d Z d Z d Z d S)ContentTypezcontent-typetextZplainN)r1   r2   r3   rG   maintypesubtyper   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)ContentDispositionzcontent-dispositionN)r1   r2   r3   rG   content_dispositionr   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)ContentTransferEncodingzcontent-transfer-encodingZ7bitN)r1   r2   r3   rG   r   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)HeaderLabelzheader-labelN)r1   r2   r3   rG   r   r   r   r   r     s   r   c               @   s"   e  Z d  Z d Z d d   Z d S)Headerheaderc             C   s   | j  t |  j d    t | j d  | _ |  d j d k rZ t |  j d   n d | _ |  j d  } |  r t d   | j	 |  d  S)Nr   rI   r#   zMalformed Header token list)
r   r   rH   r(   r   r   rG   r   
ValueErrorr+   )r   rO   restr   r   r   r+     s    1zHeader._foldN)r1   r2   r3   rG   r+   r   r   r   r   r     s   r   c                   s   e  Z d  Z   f d d   Z   f d d   Z e d d    Z d   f d d	  Z d
 d   Z d d   Z	 d d   Z
 e d d    Z d d   Z d d   Z   S)Terminalc                s+   t    j |  |  } | | _ g  | _ | S)N)r5   __new__rG   r6   )clsr   rG   r   )r9   r   r   r     s    		zTerminal.__new__c                s   d j  |  j j t   j    S)Nz{}({}))r=   r9   r1   r5   r>   )r   )r9   r   r   r>     s    zTerminal.__repr__c             C   s   t  |  j  S)N)listr6   )r   r   r   r   r?     s    zTerminal.all_defectsr#   c                sI   d j  | |  j j |  j t   j   |  j s3 d n d j  |  j   g S)Nz{}{}/{}({}){}r#   z {})r=   r9   r1   rG   r5   r>   r6   )r   ra   )r9   r   r   rc     s    	zTerminal._ppc             C   sJ   t  |   } y | j d  | SWn" t k
 rE t j | |  SYn Xd  S)Nzus-ascii)r   rR   r[   rQ   )r   rS   r   r   r   r   r   rV     s    zTerminal.cte_encodec             C   s   d  S)Nr   )r   r   r   r   rB     s    zTerminal.pop_trailing_wsc             C   s   d  S)Nr   )r   r   r   r   r*     s    zTerminal.pop_leading_fwsc             C   s   g  S)Nr   )r   r   r   r   rM     s    zTerminal.commentsc             C   s   d S)NFr   )r   r   r   r   rL     s    zTerminal.has_leading_commentc             C   s   t  |   |  j f S)N)r   rG   )r   r   r   r   __getnewargs__   s    zTerminal.__getnewargs__)r1   r2   r3   r   r>   rh   r?   rc   rV   rB   r*   rM   rL   r   r   r   )r9   r   r     s   	r   c               @   s4   e  Z d  Z e d d    Z d d   Z d Z d S)WhiteSpaceTerminalc             C   s   d S)Nrj   r   )r   r   r   r   r     s    zWhiteSpaceTerminal.valuec             C   s   d S)NTr   )r   r   r   r   rA   
  s    z!WhiteSpaceTerminal.startswith_fwsTN)r1   r2   r3   rh   r   rA   r)   r   r   r   r   r     s   r   c               @   s@   e  Z d  Z e d d    Z d d   Z d Z d d   Z d S)	ValueTerminalc             C   s   |  S)Nr   )r   r   r   r   r     s    zValueTerminal.valuec             C   s   d S)NFr   )r   r   r   r   rA     s    zValueTerminal.startswith_fwsFc             C   s   t  j t |   |  S)N)rQ   rR   r   )r   rS   r   r   r   rU     s    zValueTerminal.as_encoded_wordN)r1   r2   r3   rh   r   rA   r)   rU   r   r   r   r   r     s   r   c               @   sF   e  Z d  Z e d d    Z e d d    Z d d   Z d Z d S)	EWWhiteSpaceTerminalc             C   s   d S)Nr#   r   )r   r   r   r   r   !  s    zEWWhiteSpaceTerminal.valuec             C   s   |  d  d   S)Nr   )r   r   r   r   r   %  s    zEWWhiteSpaceTerminal.encodedc             C   s   d S)Nr#   r   )r   r   r   r   r%   )  s    zEWWhiteSpaceTerminal.__str__TN)r1   r2   r3   rh   r   r   r%   r)   r   r   r   r   r     s   r   r   ,zlist-separatorr   zroute-component-markerz([{}]+)r#   z[^{}]+r   z\\]z\]z[\x00-\x20\x7F]c             C   sW   t  |   } | r+ |  j j t j |   t j |   rS |  j j t j d   d  S)Nz*Non-ASCII characters found in header token)_non_printable_finderr6   r   r   ZNonPrintableDefectr   r   rY   )xtextZnon_printablesr   r   r   _validate_xtextW  s    r   c             C   s   t  |  d  ^ } } g  } d } d } x t t |   D]e } | | d k rn | re d } d } n	 d } q: | r} d } n | | | k r P| j | |  q: W| d } d j |  d j | | d   g |  | f S)Nr'   Fr   Tr#   )_wsp_splitterranger(   r   r$   )r   endcharsZfragmentr{   Zvcharsescapehad_qpposr   r   r   _get_ptext_to_endcharsa  s$    			
r   c             C   s?   |  j    } t |  d  t |   t |   d  } | | f S)NrF   )r   r   r(   )r   ZnewvaluerF   r   r   r   get_fws  s    )r  c             C   s<  t    } |  j d  s0 t j d j |     |  d d   j d d  ^ } } | |  d d   k r t j d j |     d j |  } t |  d k r | d t k r | d t k r | j d d  ^ } } | d | } t | j    d k r| j	 j
 t j d   |  | _ d j |  }  y' t j d | d  \ } } } }	 Wn- t k
 rt j d	 j | j    Yn X| | _ | | _ | j	 j |	  x | r1| d t k rt |  \ }
 } | j
 |
  qt | d  ^ } } t | d
  } t |  | j
 |  d j |  } qW| |  f S)Nz=?z"expected encoded word but found {}r   z?=r'   r#   r   zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtext)r   
startswithr   HeaderParseErrorr=   r   r$   r(   r   r6   r   r   r   rQ   r   r   rS   r   r   WSPr  r   r   r   )r   Zewr   r{   Zremstrr   r   rS   r   r6   r,   charsr  r   r   r   get_encoded_word  sH    	"2
	'			
r  c             C   so  t    } x_|  rj|  d t k rD t |   \ } }  | j |  q |  j d  ry t |   \ } }  Wn t j k
 r Yn Xd } t |  d k r | d j	 d k r | j
 j t j d   d } | rt |  d k r| d j	 d	 k rt | d d  | d <| j |  q t |  d  ^ } } t | d
  } t |  | j |  d j |  }  q W| S)Nr   z=?Tr'   rF   z&missing whitespace before encoded wordFr   zencoded-wordr  r#   rJ   rJ   rJ   )rn   r  r  r   r  r  r   r  r(   rG   r6   r   r   r   r   r   r$   )r   ro   r,   Zhave_wsr   r{   r  r   r   r   rp     s:    		

rp   c             C   s;   t  |  d  \ } }  } t | d  } t |  | |  f S)Nz()r   )r   r   r   )r   r   _r   r   r   get_qp_ctext  s    
r
  c             C   s;   t  |  d  \ } }  } t | d  } t |  | |  f S)Nr   r   )r   r   r   )r   r   r	  r   r   r   get_qcontent  s    

r  c             C   so   t  |   } | s* t j d j |     | j   } |  t |  d   }  t | d  } t |  | |  f S)Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r  r=   r   r(   r   r   )r   mr  r   r   r   	get_atext  s    
r  c             C   sQ  |  d d k r( t  j d j |     t   } |  d d   }  x |  r|  d d k r|  d t k r t |   \ } }  n |  d  d  d k r y/ t |   \ } }  | j j t  j	 d   Wqt  j k
 r t
 |   \ } }  YqXn t
 |   \ } }  | j |  qD W|  s=| j j t  j	 d   | |  f S| |  d d   f S)	Nr   r   zexpected '"' but found '{}'r'   r   z=?z!encoded word inside quoted stringz"end of header inside quoted string)r   r  r=   r   r  r  r  r6   r   r   r  )r   Zbare_quoted_stringr,   r   r   r   get_bare_quoted_string  s,    	

r  c             C   s
  |  r. |  d d k r. t  j d j |     t   } |  d d   }  x |  r |  d d k r |  d t k r t |   \ } }  n7 |  d d k r t |   \ } }  n t |   \ } }  | j |  qJ W|  s | j	 j t  j
 d   | |  f S| |  d d   f S)Nr   r   zexpected '(' but found '{}'r'   r   zend of header inside comment)r   r  r=   r   r  r  get_commentr
  r   r6   r   )r   rk   r,   r   r   r   r  <  s"    	

r  c             C   st   t    } x^ |  ri |  d t k ri |  d t k rG t |   \ } }  n t |   \ } }  | j |  q W| |  f S)Nr   )r~   CFWS_LEADERr  r  r  r   )r   rI   r,   r   r   r   get_cfwsU  s    	r  c             C   s   t    } |  r> |  d t k r> t |   \ } }  | j |  t |   \ } }  | j |  |  r |  d t k r t |   \ } }  | j |  | |  f S)Nr   )r   r  r  r   r  )r   Zquoted_stringr,   r   r   r   get_quoted_stringb  s    	r  c             C   s  t    } |  r> |  d t k r> t |   \ } }  | j |  |  rl |  d t k rl t j d j |     |  j d  r y t	 |   \ } }  Wq t j k
 r t
 |   \ } }  Yq Xn t
 |   \ } }  | j |  |  r|  d t k rt |   \ } }  | j |  | |  f S)Nr   zexpected atom but found '{}'z=?)r   r  r  r   	ATOM_ENDSr   r  r=   r  r  r  )r   r   r,   r   r   r   get_atomt  s$    	r  c             C   s   t    } |  s  |  d t k r8 t j d j |     xl |  r |  d t k r t |   \ } }  | j |  |  r; |  d d k r; | j t  |  d d   }  q; W| d t k r t j d j d |     | |  f S)Nr   z8expected atom at a start of dot-atom-text but found '{}'r	   r'   z4expected atom at end of dot-atom-text but found '{}'rJ   )r   r  r   r  r=   r  r   r   )r   Zdot_atom_textr,   r   r   r   get_dot_atom_text  s    	r  c             C   s   t    } |  d t k r8 t |   \ } }  | j |  |  j d  r y t |   \ } }  Wq t j k
 r t |   \ } }  Yq Xn t |   \ } }  | j |  |  r |  d t k r t |   \ } }  | j |  | |  f S)Nr   z=?)	r   r  r  r   r  r  r   r  r  )r   Zdot_atomr,   r   r   r   get_dot_atom  s    	r  c             C   s   |  d t  k r% t |   \ } }  n d  } |  d d k rP t |   \ } }  n= |  d t k r{ t j d j |     n t |   \ } }  | d  k	 r | g | d  d  <| |  f S)Nr   r   z1Expected 'atom' or 'quoted-string' but found '{}')r  r  r  SPECIALSr   r  r=   r  )r   leaderr,   r   r   r   get_word  s    r  c             C   sI  t    } y# t |   \ } }  | j |  Wn. t j k
 r\ | j j t j d   Yn Xx |  r>|  d t k r>|  d d k r | j t  | j j t j	 d   |  d d   }  q` y t |   \ } }  WnV t j k
 r-|  d t
 k r&t |   \ } }  | j j t j	 d   n   Yn X| j |  q` W| |  f S)Nzphrase does not start with wordr   r	   zperiod in 'phrase'r'   zcomment found without atom)rx   r  r   r   r  r6   r   PHRASE_ENDSr   ObsoleteHeaderDefectr  r  )r   ry   r,   r   r   r   
get_phrase  s.    	
r  c             C   s  t    } d  } |  d t k r1 t |   \ } }  |  sO t j d j |     y t |   \ } }  Wno t j k
 r y t |   \ } }  WnA t j k
 r |  d d k r |  d t k r   t	   } Yn XYn X| d  k	 r | g | d  d  <| j
 |  |  r|  d d k s)|  d t k rt t |  |   \ } }  | j d k rp| j j
 t j d   n | j j
 t j d   | | d <y | j j d  Wn+ t k
 r| j j
 t j d   Yn X| |  f S)	Nr   z"expected local-part but found '{}'r   zinvalid-obs-local-partz<local-part is not dot-atom, quoted-string, or obs-local-partz,local-part is not a dot-atom (contains CFWS)rW   z)local-part contains non-ASCII characters))r   r  r  r   r  r=   r  r  r  r4   r   get_obs_local_partr   rG   r6   r   r  r   rR   r[   ZNonASCIILocalPartDefect)r   r   r  r,   obs_local_partr   r   r   get_local_part   sB    	 &

r!  c             C   sH  t    } d } xv|  r|  d d k s8 |  d t k r|  d d k r | rg | j j t j d   | j t  d } |  d d   }  q n\ |  d d k r | j t |  d d   |  d d   }  | j j t j d	   d } q | r| d j d
 k r| j j t j d   y t	 |   \ } }  d } Wn: t j
 k
 rv|  d t k r`  t |   \ } }  Yn X| j |  q W| d j d
 k s| d j d k r| d j d
 k r| j j t j d   | d j d
 k s| d j d k r,| d j d
 k r,| j j t j d   | j r>d | _ | |  f S)NFr   r   r	   zinvalid repeated '.'Tr'   zmisplaced-specialz/'\' character outside of quoted-string/ccontentr   zmissing '.' between wordsrI   z!Invalid leading '.' in local partr   z"Invalid trailing '.' in local partzinvalid-obs-local-partrJ   rJ   rJ   r  )r   r  r6   r   r   r   r   r   rG   r  r  r  r  )r   r   Zlast_non_ws_was_dotr,   r   r   r   r  '  sV    	)






		r  c             C   sZ   t  |  d  \ } }  } t | d  } | rF | j j t j d   t |  | |  f S)Nz[]r   z(quoted printable found in domain-literal)r   r   r6   r   r   r  r   )r   r   r   r   r   r   	get_dtextV  s    

r"  c             C   s:   |  r
 d S| j  t j d   | j  t d d   d S)NFz"end of input inside domain-literalr   zdomain-literal-endT)r   r   r   r   )r   domain_literalr   r   r   _check_for_early_dl_endj  s    
r$  c             C   s  t    } |  d t k r8 t |   \ } }  | j |  |  sM t j d   |  d d k ru t j d j |     |  d d   }  t |  |  r | |  f S| j t d d   |  d t	 k r t
 |   \ } }  | j |  t |   \ } }  | j |  t |  |  r| |  f S|  d t	 k rJt
 |   \ } }  | j |  t |  |  rc| |  f S|  d d k rt j d j |     | j t d d	   |  d d   }  |  r|  d t k rt |   \ } }  | j |  | |  f S)
Nr   zexpected domain-literal[z6expected '[' at start of domain-literal but found '{}'r'   zdomain-literal-startr   z4expected ']' at end of domain-literal but found '{}'zdomain-literal-end)r   r  r  r   r   r  r=   r$  r   r  r  r"  )r   r#  r,   r   r   r   get_domain_literalr  sD    	


r&  c             C   s  t    } d  } |  d t k r1 t |   \ } }  |  sO t j d j |     |  d d k r t |   \ } }  | d  k	 r | g | d  d  <| j |  | |  f Sy t |   \ } }  Wn' t j k
 r t	 |   \ } }  Yn X|  r|  d d k rt j d   | d  k	 r+| g | d  d  <| j |  |  r|  d d k r| j
 j t j d   | d j d k r| d | d  d   <xP |  r|  d d k r| j t  t	 |  d	 d    \ } }  | j |  qW| |  f S)
Nr   zexpected domain but found '{}'r%  r   zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)zdot-atomr'   )r   r  r  r   r  r=   r&  r   r  r  r6   r  rG   r   )r   r   r  r,   r   r   r   
get_domain  s@    	

r'  c             C   s   t    } t |   \ } }  | j |  |  s? |  d d k rb | j j t j d   | |  f S| j t d d   t |  d d    \ } }  | j |  | |  f S)Nr   r   z"add-spec local part with no domainzaddress-at-symbolr'   )r   r!  r   r6   r   r   r   r'  )r   r   r,   r   r   r   get_addr_spec  s    	

r(  c             C   s  t    } x |  r |  d d k s2 |  d t k r |  d t k rd t |   \ } }  | j |  q |  d d k r | j t  |  d d   }  q W|  s |  d d k r t j d j |     | j t  t	 |  d d    \ } }  | j |  x |  r|  d d k r| j t  |  d d   }  |  s7P|  d t k rft |   \ } }  | j |  |  d d k r | j t  t	 |  d d    \ } }  | j |  q W|  st j d   |  d d k rt j d j |     | j t
 d d	   | |  d d   f S)
Nr   r   r'   r   z(expected obs-route domain but found '{}'z%end of header while parsing obs-route:z4expected ':' marking end of obs-route but found '{}'zend-of-obs-route-marker)r   r  r  r   ListSeparatorr   r  r=   RouteComponentMarkerr'  r   )r   Z	obs_router,   r   r   r   get_obs_route  sB    	)r,  c             C   s6  t    } |  d t k r8 t |   \ } }  | j |  |  sO |  d d k rg t j d j |     | j t d d   |  d d   }  |  d d k r | j t d d   | j j t j	 d   |  d d   }  | |  f Sy t
 |   \ } }  Wn t j k
 ry/ t |   \ } }  | j j t j d	   Wn- t j k
 rmt j d
 j |     Yn X| j |  t
 |   \ } }  Yn X| j |  |  r|  d d k r|  d d   }  n | j j t j	 d   | j t d d   |  r,|  d t k r,t |   \ } }  | j |  | |  f S)Nr   <z"expected angle-addr but found '{}'zangle-addr-startr'   >zangle-addr-endznull addr-spec in angle-addrz*obsolete route specification in angle-addrz.expected addr-spec or obs-route but found '{}'z"missing trailing '>' on angle-addr)r   r  r  r   r   r  r=   r   r6   r   r(  r,  r  )r   Z
angle_addrr,   r   r   r   get_angle_addr  sJ    	


r/  c             C   sR   t    } t |   \ } }  | j | d  d    | j d  d   | _ | |  f S)N)r   r  r   r6   )r   r   r,   r   r   r   get_display_name&  s
    	r0  c             C   s5  t    } d  } |  d t k rO t |   \ } }  |  sO t j d j |    |  d d k r |  d t k r t j d j |     t |   \ } }  |  s t j d j |    | d  k	 r | g | d d  d  <d  } | j |  t	 |   \ } }  | d  k	 r| g | d  d  <| j |  | |  f S)Nr   z!expected name-addr but found '{}'r-  )
r   r  r  r   r  r=   r  r0  r   r/  )r   Z	name_addrr  r,   r   r   r   get_name_addr5  s0    	r1  c             C   s   t    } y t |   \ } }  Wn[ t j k
 r| y t |   \ } }  Wn- t j k
 rw t j d j |     Yn XYn Xt d d   | j D  r d | _ | j	 |  | |  f S)Nzexpected mailbox but found '{}'c             s   s!   |  ] } t  | t j  Vq d  S)N)rX   r   r   )r:   r;   r   r   r   r<   b  s   zget_mailbox.<locals>.<genexpr>zinvalid-mailbox)
r   r1  r   r  r(  r=   r\   r?   rG   r   )r   r   r,   r   r   r   get_mailboxS  s    		r2  c             C   s   t    } xv |  r |  d | k r |  d t k r_ | j t |  d d   |  d d   }  q t |   \ } }  | j |  q W| |  f S)Nr   zmisplaced-specialr'   )r   r  r   r   r  )r   r   Zinvalid_mailboxr,   r   r   r   get_invalid_mailboxh  s    	
r3  c             C   sM  t    } x7|  rB|  d d k rBy# t |   \ } }  | j |  Wn`t j k
 rd  } |  d t k rt |   \ } }  |  s |  d d k r | j |  | j j t j d   qt	 |  d  \ } }  | d  k	 r | g | d  d  <| j |  | j j t j
 d   n |  d d k rI| j j t j d   nZ t	 |  d  \ } }  | d  k	 r}| g | d  d  <| j |  | j j t j
 d   Yn X|  r|  d d k r| d	 } d | _ t	 |  d  \ } }  | j |  | j j t j
 d   |  r |  d d k r | j t  |  d d   }  q W| |  f S)
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr   r'   zinvalid-mailboxrJ   )r   r2  r   r   r  r  r  r6   r  r3  r   rG   r   r*  )r   Zmailbox_listr,   r  r   r   r   r   get_mailbox_listz  sN    	
	
r5  c             C   sc  t    } |  s2 | j j t j d   | |  f Sd  } |  r |  d t k r t |   \ } }  |  s | j j t j d   | j |  | |  f S|  d d k r | j |  | |  f St |   \ } }  t | j	  d k r-| d  k	 r | j |  | j
 |  | j j t j d   | |  f S| d  k	 rL| g | d  d  <| j |  | |  f S)Nzend of header before group-listr   zend of header in group-listr4  zgroup-list with empty entries)r   r6   r   r   r   r  r  r5  r(   r   r   r  )r   Z
group_listr  r,   r   r   r   get_group_list  s8    	






r6  c             C   s  t    } t |   \ } }  |  s2 |  d d k rJ t j d j |     | j |  | j t d d   |  d d   }  |  r |  d d k r | j t d d   | |  d d   f St |   \ } }  | j |  |  s | j j t j	 d   |  d d k r#t j d	 j |     | j t d d   |  d d   }  |  r~|  d t
 k r~t |   \ } }  | j |  | |  f S)
Nr   r)  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr'   r4  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r0  r   r  r=   r   r   r6  r6   r   r  r  )r   r   r,   r   r   r   	get_group  s2    	
r7  c             C   s   t    } y t |   \ } }  Wn[ t j k
 r| y t |   \ } }  Wn- t j k
 rw t j d j |     Yn XYn X| j |  | |  f S)Nzexpected address but found '{}')r   r7  r   r  r2  r=   r   )r   r   r,   r   r   r   get_address  s    	r8  c             C   s_  t    } xI|  rTy# t |   \ } }  | j |  Wnt j k
 r} zbd  } |  d t k rt |   \ } }  |  s |  d d k r | j |  | j j t j d   qt	 |  d  \ } }  | d  k	 r | g | d  d  <| j t
 | g   | j j t j d   n |  d d k rG| j j t j d   nc t	 |  d  \ } }  | d  k	 r{| g | d  d  <| j t
 | g   | j j t j d   WYd  d  } ~ Xn X|  r%|  d d k r%| d	 d } d | _ t	 |  d  \ } }  | j |  | j j t j d   |  r | j t d d   |  d d   }  q W| |  f S)
Nr   r   z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr'   zinvalid-mailboxzlist-separatorrJ   )r   r8  r   r   r  r  r  r6   r  r3  r   r   rG   r   r   )r   Zaddress_listr,   errr  r   r   r   r   get_address_list	  sN    
			
r:  c             C   ss  t    } |  s, | j j t j d   | S|  d t k rz t |   \ } }  | j |  |  sz | j j t j d   d } xH |  r |  d d k r |  d t k r | |  d 7} |  d d   }  q W| j   s| j j t j d j	 |    | j t
 | d   n% t |  | _ | j t
 | d	   |  rl|  d t k rlt |   \ } }  | j |  |  s|  d d k r| j d  k	 r| j j t j d
   |  r| j t
 |  d   | S| j t
 d d   |  d d   }  |  r&|  d t k r&t |   \ } }  | j |  |  sX| j d  k	 rT| j j t j d
   | Sd } x8 |  r|  d t k r| |  d 7} |  d d   }  qaW| j   s| j j t j d j	 |    | j t
 | d   n% t |  | _ | j t
 | d	   |  r:|  d t k r:t |   \ } }  | j |  |  ro| j j t j d   | j t
 |  d   | S)Nz%Missing MIME version number (eg: 1.0)r   z0Expected MIME version number but found only CFWSr#   r	   r'   z1Expected MIME major version number but found {!r}r   digitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)r   r6   r   r   HeaderMissingRequiredValuer  r  isdigitr   r=   r   intr   r   )r   Zmime_versionr,   r;  r   r   r   parse_mime_versionQ	  sv    	

)


r?  c             C   s   t    } xv |  r |  d d k r |  d t k r_ | j t |  d d   |  d d   }  q t |   \ } }  | j |  q W| |  f S)Nr   r4  zmisplaced-specialr'   )r   r  r   r   r  )r   Zinvalid_parameterr,   r   r   r   get_invalid_parameter	  s    	
r@  c             C   so   t  |   } | s* t j d j |     | j   } |  t |  d   }  t | d  } t |  | |  f S)Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r  r=   r   r(   r   r   )r   r  rA  r   r   r   	get_ttext	  s    	
rC  c             C   s   t    } |  r> |  d t k r> t |   \ } }  | j |  |  rl |  d t k rl t j d j |     t |   \ } }  | j |  |  r |  d t k r t |   \ } }  | j |  | |  f S)Nr   zexpected token but found '{}')	r   r  r  r   
TOKEN_ENDSr   r  r=   rC  )r   Zmtokenr,   r   r   r   	get_token	  s    		rE  c             C   so   t  |   } | s* t j d j |     | j   } |  t |  d   }  t | d  } t |  | |  f S)Nz expected attrtext but found {!r}r   )_non_attribute_end_matcherr   r  r=   r   r(   r   r   )r   r  r   r   r   r   get_attrtext	  s    	
rG  c             C   s   t    } |  r> |  d t k r> t |   \ } }  | j |  |  rl |  d t k rl t j d j |     t |   \ } }  | j |  |  r |  d t k r t |   \ } }  | j |  | |  f S)Nr   zexpected token but found '{}')	r   r  r  r   ATTRIBUTE_ENDSr   r  r=   rG  )r   r   r,   r   r   r   get_attribute	  s    		rI  c             C   so   t  |   } | s* t j d j |     | j   } |  t |  d   }  t | d  } t |  | |  f S)Nz)expected extended attrtext but found {!r}zextended-attrtext)#_non_extended_attribute_end_matcherr   r  r=   r   r(   r   r   )r   r  r   r   r   r   get_extended_attrtext	  s    
rK  c             C   s   t    } |  r> |  d t k r> t |   \ } }  | j |  |  rl |  d t k rl t j d j |     t |   \ } }  | j |  |  r |  d t k r t |   \ } }  | j |  | |  f S)Nr   zexpected token but found '{}')	r   r  r  r   EXTENDED_ATTRIBUTE_ENDSr   r  r=   rK  )r   r   r,   r   r   r   get_extended_attribute
  s    	rM  c             C   s3  t    } |  s  |  d d k r8 t j d j |     | j t d d   |  d d   }  |  sv |  d j   r t j d j |     d } x8 |  r |  d j   r | |  d 7} |  d d   }  q W| d d k r| d k r| j j t j d	   t	 |  | _
 | j t | d
   | |  f S)Nr   *zExpected section but found {}zsection-markerr'   z$Expected section number but found {}r#   0z&section numberhas an invalid leading 0r;  )r   r   r  r=   r   r   r=  r6   ZInvalidHeaderErrorr>  r   )r   r   r;  r   r   r   get_section#
  s$    		rP  c             C   s   t    } |  s t j d   d  } |  d t k rF t |   \ } }  |  sd t j d j |    |  d d k r t |   \ } }  n t |   \ } }  | d  k	 r | g | d  d  <| j |  | |  f S)Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	r   r   r  r  r  r=   r  rM  r   )r   vr  r,   r   r   r   	get_valueA
  s     	rR  c             C   s  t    } t |   \ } }  | j |  |  s? |  d d k rk | j j t j d j |    | |  f S|  d d k ry, t |   \ } }  d | _ | j |  Wn t j	 k
 r Yn X|  s t j	 d   |  d d k r| j t
 d d   |  d d   }  d | _ |  d d	 k r2t j	 d
   | j t
 d	 d   |  d d   }  d  } |  r|  d t k rt |   \ } }  | j |  d  } | } | j r|  r|  d d k rt |   \ } } | j } d } | j d k r>| r| d d k rd } qkt |  \ } }	 |	 rk|	 d d k rkd } n- y t |  \ } }	 Wn Yn X|	 skd } | r| j j t j d   | j |  x4 | D], }
 |
 j d k rg  |
 d  d   <|
 } PqW| }  n d  } | j j t j d   |  r|  d d k rd  } n t |   \ } }  | j s@| j d k r|  sW|  d d k r| j |  | d  k	 rv| }  | |  f S| j j t j d   |  s| j j t j d   | j |  | d  k r| |  f Sn7| d  k	 r1x | D] }
 |
 j d k rPqW|
 j d k | j |
  |
 j | _ |  d d k rYt j	 d j |     | j t
 d d   |  d d   }  |  r|  d d k rt |   \ } }  | j |  | j | _ |  s|  d d k rt j	 d j |     | j t
 d d   |  d d   }  | d  k	 rt   } x |  r|  d t k rXt |   \ } }  nD |  d d k rt
 d d  } |  d d   }  n t |   \ } }  | j |  q-W| } n t |   \ } }  | j |  | d  k	 r| }  | |  f S)Nr   r4  z)Parameter contains name ({}) but no valuerN  TzIncomplete parameterzextended-parameter-markerr'   =zParameter not followed by '='zparameter-separatorr   F'z5Quoted string value for extended parameter is invalidzbare-quoted-stringzZParameter marked as extended but appears to have a quoted string value that is non-encodedzcApparent initial-extended-value but attribute was not marked as extended or was not initial sectionz(Missing required charset/lang delimiterszextended-attrtextr   z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231 delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)r   rI  r   r6   r   r   r=   rP  r   r  r   r   r  r  r  r   r   rG  rK  rG   rR  r   rS   r   r   r  r  r  )r   r   r,   r  r{   ZappendtoZqstringZinner_valueZ
semi_validr   trQ  r   r   r   get_parameterW
  s    	
					
	
	


			rV  c             C   s  t    } x|  ry# t |   \ } }  | j |  Wnt j k
 r=} z d  } |  d t k ru t |   \ } }  |  s | j |  | S|  d d k r | d  k	 r | j |  | j j t j d   nZ t	 |   \ } }  | r | g | d  d  <| j |  | j j t j d j
 |    WYd  d  } ~ Xn X|  r|  d d k r| d	 } d | _ t	 |   \ } }  | j |  | j j t j d j
 |    |  r | j t d d   |  d d   }  q W| S)
Nr   r4  zparameter entry with no contentzinvalid parameter {!r}r'   zinvalid-parameterz)parameter with invalid trailing text {!r}zparameter-separatorrJ   )r   rV  r   r   r  r  r  r6   r   r@  r=   rG   r   r   )r   Zmime_parametersr,   r9  r  r   r   r   r   parse_mime_parameters
  sD    		&
	rW  c             C   s   xv | rx | d d k rx | d t  k rV |  j t | d d   | d d   } q t |  \ } } |  j |  q W| s d  S|  j t d d   |  j t | d d     d  S)Nr   r4  zmisplaced-specialr'   zparameter-separator)r  r   r   r  rW  )Z	tokenlistr   r,   r   r   r   _find_mime_parameters  s    rX  c             C   s;  t    } d } |  s2 | j j t j d   | Sy t |   \ } }  WnH t j k
 r | j j t j d j |     t	 | |   | SYn X| j |  |  s |  d d k r | j j t j d   |  r t	 | |   | S| j
 j   j   | _ | j t d d   |  d d   }  y t |   \ } }  WnH t j k
 r| j j t j d	 j |     t	 | |   | SYn X| j |  | j
 j   j   | _ |  s| S|  d d
 k r| j j t j d j |     | ` | ` t	 | |   | S| j t d
 d   | j t |  d d     | S)NFz"Missing content type specificationz(Expected content maintype but found {!r}r   /zInvalid content typezcontent-type-separatorr'   z'Expected content subtype but found {!r}r4  z<Only parameters are valid after content type, but found {!r}zparameter-separator)r   r6   r   r   r<  rE  r  r   r=   rX  r   r   lowerr   r   r   rW  )r   ZctypeZrecoverr,   r   r   r   parse_content_type_header)  sX    	
	
	r[  c             C   s6  t    } |  s, | j j t j d   | Sy t |   \ } }  WnH t j k
 r | j j t j d j |     t	 | |   | SYn X| j |  | j
 j   j   | _ |  s | S|  d d k r | j j t j d j |     t	 | |   | S| j t d d   | j t |  d d     | S)NzMissing content dispositionz+Expected content disposition but found {!r}r   r4  zCOnly parameters are valid after content disposition, but found {!r}zparameter-separatorr'   )r   r6   r   r   r<  rE  r  r   r=   rX  r   r   rZ  r   r   rW  )r   Zdisp_headerr,   r   r   r    parse_content_disposition_headerb  s2    	
	r\  c             C   s1  t    } |  s, | j j t j d   | Sy t |   \ } }  Wn7 t j k
 r{ | j j t j d j |     Yn& X| j |  | j	 j
   j   | _ |  s | Sx |  r,| j j t j d   |  d t k r
| j t |  d d   |  d d   }  q t |   \ } }  | j |  q W| S)Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   zmisplaced-specialr'   )r   r6   r   r   r<  rE  r  r   r=   r   r   rZ  r   r  r   r  )r   Z
cte_headerr,   r   r   r   &parse_content_transfer_encoding_header  s.    	
	
r]  )rer   stringr   collectionsr   operatorr   Zemailr   rQ   r   r   r   r  r  r  r  r   r  Z	TSPECIALSrD  Z	ASPECIALSrH  rL  r   r   r   r4   ri   rn   rx   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*  r+  compiler=   r$   r   r   r   matchr  findallr   rB  rF  rJ  r   r   r  r  rp   r
  r  r  r  r  r  r  r  r  r  r  r  r!  r  r"  r$  r&  r'  r(  r,  r/  r0  r1  r2  r3  r5  r6  r7  r8  r:  r?  r@  rC  rE  rG  rI  rK  rM  rP  rR  rV  rW  rX  r[  r\  r]  r   r   r   r   <module>F   s  


TK`		 '#
U3$000!
*8&'/'&).9%>D49