
    ;e             	          	 d dl Z 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  ed          Ze ed          z  Z ed	          Zeez  Ze ed
          z
  Ze ed          z
  Ze ed          z   ed
          z
  Zeez  Ze ed          z  Zeez  Ze ed          z
  Zd Z e j        de j        e j        z            Z G d de          Z G d de          Z G d de          Z  G d de          Z! G d de          Z" G d de          Z# G d de          Z$ G d d e          Z% G d! d"e          Z& G d# d$e          Z' G d% d&e'          Z( G d' d(e          Z) G d) d*e          Z* G d+ d,e          Z+ G d- d.e          Z, G d/ d0e          Z- G d1 d2e          Z. G d3 d4e          Z/ G d5 d6e          Z0 G d7 d8e          Z1 G d9 d:e          Z2 G d; d<e          Z3 G d= d>e          Z4 G d? d@e          Z5 G dA dBe          Z6 G dC dDe          Z7 G dE dFe          Z8 G dG dHe          Z9 G dI dJe!          Z: G dK dLe          Z; G dM dNe          Z< G dO dPe          Z= G dQ dRe          Z> G dS dTe>          Z? G dU dVe          Z@ G dW dXe          ZA G dY dZe          ZB G d[ d\e          ZC G d] d^e          ZD G d_ d`eD          ZE G da dbeD          ZF G dc dde          ZG G de dfe          ZH G dg dhe          ZI G di djeI          ZJ G dk dleJ          ZK G dm dne          ZL G do dpeM          ZN G dq dreN          ZO G ds dteN          ZP G du dveO          ZQ G dw dxe
jR                  ZS ePd
dy          ZT ePdzd{          ZU ePd|d}          ZV e j        d~W                    dX                    e                              jY        ZZ e j        dW                     e j[        dX                    e                                        j\        Z] e j        d          j^        Z_ e j        dW                     e j[        dX                    e                                        j\        Z` e j        dW                     e j[        dX                    e                                        j\        Za e j        dW                     e j[        dX                    e                                        j\        Zbd Zcd Zdd Zed Zfd Zgd Zhd Zid Zjd Zkd Zld Zmd Znd Zod Zpd Zqd Zrd Zsd Ztd Zud Zvd Zwd Zxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )    N)	hexdigits)
itemgetter)_encoded_words)errors)utilsz 	(z()<>@,:;.\"[].z."(z/?=z*'%%c                 |    dt          |                               dd                              dd          z   dz   S )N"\\\z\")strreplacevalues    1/usr/lib/python3.11/email/_header_value_parser.pyquote_stringr   `   s8    s5zz!!$//77UCCCCGG    z
   =\?            # literal =?
   [^?]*          # charset
   \?             # literal ?
   [qQbB]         # literal 'q' or 'b', case insensitive
   \?             # literal ?
  .*?             # encoded word
  \?=             # literal ?=
c                        e Zd ZdZdZdZ fdZd Z fdZe	d             Z
e	d             Zd Ze	d	             Ze	d
             Zd ZddZddZddZ xZS )	TokenListNTc                 H     t                      j        |i | g | _        d S N)super__init__defects)selfargskw	__class__s      r   r   zTokenList.__init__y   s*    $%"%%%r   c                 @    d                     d | D                       S )N c              3   4   K   | ]}t          |          V  d S r   r   .0xs     r   	<genexpr>z$TokenList.__str__.<locals>.<genexpr>~   (      ,,!s1vv,,,,,,r   joinr   s    r   __str__zTokenList.__str__}   s#    ww,,t,,,,,,r   c                     d                     | j        j        t                                                                S Nz{}({})formatr    __name__r   __repr__r   r    s    r   r3   zTokenList.__repr__   s3    t~6"WW--//1 1 	1r   c                 @    d                     d | D                       S )Nr"   c              3   2   K   | ]}|j         	|j         V  d S r   r   r%   s     r   r(   z"TokenList.value.<locals>.<genexpr>   s+      8818qw888888r   r*   r,   s    r   r   zTokenList.value   s#    ww88888888r   c                 @    t          d | D             | j                  S )Nc              3   $   K   | ]}|j         V  d S r   )all_defectsr%   s     r   r(   z(TokenList.all_defects.<locals>.<genexpr>   s$      00aAM000000r   )sumr   r,   s    r   r9   zTokenList.all_defects   s#    004000$,???r   c                 6    | d                                          S Nr   )startswith_fwsr,   s    r   r=   zTokenList.startswith_fws   s    Aw%%'''r   c                 6    	 t          d | D                       S )Nc              3   $   K   | ]}|j         V  d S r   )as_ew_allowed)r&   parts     r   r(   z*TokenList.as_ew_allowed.<locals>.<genexpr>   s%      77$4%777777r   )allr,   s    r   r@   zTokenList.as_ew_allowed   s"    O77$777777r   c                 H    g }| D ]}|                     |j                   |S r   )extendcomments)r   rE   tokens      r   rE   zTokenList.comments   s2     	, 	,EOOEN++++r   c                $    t          | |          S )Npolicy)_refold_parse_treer   rI   s     r   foldzTokenList.fold   s    !$v6666r   r"   c                 L    t          |                     |                     d S )Nindent)printppstrr   rO   s     r   pprintzTokenList.pprint   s$    djjj''(((((r   c                 T    d                     |                     |                    S )N
rN   )r+   _pprR   s     r   rQ   zTokenList.ppstr   s"    yy00111r   c              #   n  K   d                     || j        j        | j                  V  | D ]K}t	          |d          s|d                     |          z   V  -|                    |dz             E d {V  L| j        rd                     | j                  }nd}d                     ||          V  d S )Nz{}{}/{}(rV   z*    !! invalid element in token list: {!r}z    z Defects: {}r"   z{}){})r1   r    r2   
token_typehasattrrV   r   )r   rO   rF   extras       r   rV   zTokenList._pp   s      N#O  	 	 	  	4 	4E5%(( 4 !55;VE]]C D D D D !99VF]3333333333< 	"))$,77EEEnnVU+++++++r   r"   )r2   
__module____qualname__rX   syntactic_breakew_combine_allowedr   r-   r3   propertyr   r9   r=   r@   rE   rL   rS   rQ   rV   __classcell__r    s   @r   r   r   s   s9       JO    - - -1 1 1 1 1 9 9 X9 @ @ X@( ( ( 8 8 X8   X7 7 7) ) ) )2 2 2 2, , , , , , , ,r   r   c                   :    e Zd Zed             Zed             ZdS )WhiteSpaceTokenListc                     dS N  r,   s    r   r   zWhiteSpaceTokenList.value       sr   c                     d | D             S )Nc                 2    g | ]}|j         d k    |j        S )comment)rX   contentr%   s     r   
<listcomp>z0WhiteSpaceTokenList.comments.<locals>.<listcomp>   s&    CCCa1<+B+B	+B+B+Br   rh   r,   s    r   rE   zWhiteSpaceTokenList.comments   s    CC4CCCCr   N)r2   r\   r]   r`   r   rE   rh   r   r   rd   rd      sM          X D D XD D Dr   rd   c                       e Zd ZdZdS )UnstructuredTokenListunstructuredNr2   r\   r]   rX   rh   r   r   rp   rp      s        JJJr   rp   c                       e Zd ZdZdS )PhrasephraseNrr   rh   r   r   rt   rt              JJJr   rt   c                       e Zd ZdZdS )WordwordNrr   rh   r   r   rx   rx              JJJr   rx   c                       e Zd ZdZdS )CFWSListcfwsNrr   rh   r   r   r|   r|      rz   r   r|   c                       e Zd ZdZdS )AtomatomNrr   rh   r   r   r   r      rz   r   r   c                       e Zd ZdZdZdS )TokenrF   FN)r2   r\   r]   rX   encode_as_ewrh   r   r   r   r      s        JLLLr   r   c                       e Zd ZdZdZdZdZdS )EncodedWordencoded-wordN)r2   r\   r]   rX   ctecharsetlangrh   r   r   r   r      s"        J
CGDDDr   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )QuotedStringquoted-stringc                 8    | D ]}|j         dk    r	|j        c S d S Nbare-quoted-stringrX   r   r   r'   s     r   rm   zQuotedString.content   s9     	 	A|333w 4	 	r   c                     g }| D ]J}|j         dk    r#|                    t          |                     0|                    |j                   Kd                    |          S )Nr   r"   )rX   appendr   r   r+   )r   resr'   s      r   quoted_valuezQuotedString.quoted_value   sf     	$ 	$A|333

3q66""""

17####wws||r   c                 8    | D ]}|j         dk    r	|j        c S d S r   r   r   rF   s     r   stripped_valuezQuotedString.stripped_value   s=     	# 	#E#777{""" 8	# 	#r   N)r2   r\   r]   rX   r`   rm   r   r   rh   r   r   r   r      sh         J  X
   X # # X# # #r   r   c                   .    e Zd ZdZd Zed             ZdS )BareQuotedStringr   c                 Z    t          d                    d | D                                 S )Nr"   c              3   4   K   | ]}t          |          V  d S r   r$   r%   s     r   r(   z+BareQuotedString.__str__.<locals>.<genexpr>   s(      #9#9qCFF#9#9#9#9#9#9r   )r   r+   r,   s    r   r-   zBareQuotedString.__str__   s+    BGG#9#9D#9#9#999:::r   c                 @    d                     d | D                       S )Nr"   c              3   4   K   | ]}t          |          V  d S r   r$   r%   s     r   r(   z)BareQuotedString.value.<locals>.<genexpr>  r)   r   r*   r,   s    r   r   zBareQuotedString.value  #    ww,,t,,,,,,r   N)r2   r\   r]   rX   r-   r`   r   rh   r   r   r   r      sC        %J; ; ; - - X- - -r   r   c                   J    e Zd ZdZd Zd Zed             Zed             ZdS )Commentrl   c                 l     d                     t          dg fd D             dggg                     S )Nr"   r   c                 :    g | ]}                     |          S rh   )quote)r&   r'   r   s     r   rn   z#Comment.__str__.<locals>.<listcomp>  s#    999qTZZ]]999r   ))r+   r:   r,   s   `r   r-   zComment.__str__  sP    wws E9999D999 E  "	# # $ $ 	$r   c                     |j         dk    rt          |          S t          |                              dd                              dd                              dd          S )Nrl   r   r   r   z\(r   z\))rX   r   r   )r   r   s     r   r   zComment.quote  sc    y((u::5zz!!$//77"%u. ..5g"%u/. /.	.r   c                 @    d                     d | D                       S )Nr"   c              3   4   K   | ]}t          |          V  d S r   r$   r%   s     r   r(   z"Comment.content.<locals>.<genexpr>  r)   r   r*   r,   s    r   rm   zComment.content  r   r   c                     | j         gS r   )rm   r,   s    r   rE   zComment.comments  s    ~r   N)	r2   r\   r]   rX   r-   r   r`   rm   rE   rh   r   r   r   r     sm        J$ $ $. . . - - X-   X  r   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )AddressListzaddress-listc                     d | D             S )Nc                 (    g | ]}|j         d k    |S )addressrX   r%   s     r   rn   z)AddressList.addresses.<locals>.<listcomp>'  $    ;;;a1<#:#:#:#:#:r   rh   r,   s    r   	addresseszAddressList.addresses%      ;;4;;;;r   c                 6    t          d | D             g           S )Nc              3   :   K   | ]}|j         d k    |j        V  dS r   NrX   	mailboxesr%   s     r   r(   z(AddressList.mailboxes.<locals>.<genexpr>+  s<       > >Q\9%<%< K%<%<%<%<> >r   r:   r,   s    r   r   zAddressList.mailboxes)  6     > >!> > >?AC C 	Cr   c                 6    t          d | D             g           S )Nc              3   :   K   | ]}|j         d k    |j        V  dS r   rX   all_mailboxesr%   s     r   r(   z,AddressList.all_mailboxes.<locals>.<genexpr>0  s<       > >Q\9%<%< O%<%<%<%<> >r   r   r,   s    r   r   zAddressList.all_mailboxes.  r   r   N)r2   r\   r]   rX   r`   r   r   r   rh   r   r   r   r   !  sp        J< < X< C C XC C C XC C Cr   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )Addressr   c                 B    | d         j         dk    r| d         j        S d S )Nr   grouprX   display_namer,   s    r   r   zAddress.display_name8  s)    7((7'' )(r   c                 v    | d         j         dk    r	| d         gS | d         j         dk    rg S | d         j        S Nr   mailboxinvalid-mailboxr   r,   s    r   r   zAddress.mailboxes=  sE    7**G9!W#444IAw  r   c                     | d         j         dk    r	| d         gS | d         j         dk    r	| d         gS | d         j        S r   r   r,   s    r   r   zAddress.all_mailboxesE  sL    7**G9!W#444G9Aw$$r   N)r2   r\   r]   rX   r`   r   r   r   rh   r   r   r   r   4  sh        J( ( X( ! ! X! % % X% % %r   r   c                   >    e Zd ZdZed             Zed             ZdS )MailboxListmailbox-listc                     d | D             S )Nc                 (    g | ]}|j         d k    |S )r   r   r%   s     r   rn   z)MailboxList.mailboxes.<locals>.<listcomp>S  r   r   rh   r,   s    r   r   zMailboxList.mailboxesQ  r   r   c                     d | D             S )Nc                 $    g | ]}|j         d v |S ))r   r   r   r%   s     r   rn   z-MailboxList.all_mailboxes.<locals>.<listcomp>W  s/     ? ? ?a|=== ===r   rh   r,   s    r   r   zMailboxList.all_mailboxesU  s"    ? ?4 ? ? ? 	?r   Nr2   r\   r]   rX   r`   r   r   rh   r   r   r   r   M  sM        J< < X< ? ? X? ? ?r   r   c                   >    e Zd ZdZed             Zed             ZdS )	GroupList
group-listc                 F    | r| d         j         dk    rg S | d         j        S Nr   r   r   r,   s    r   r   zGroupList.mailboxes_  s-     	tAw)^;;IAw  r   c                 F    | r| d         j         dk    rg S | d         j        S r   r   r,   s    r   r   zGroupList.all_mailboxese  s-     	tAw)^;;IAw$$r   Nr   rh   r   r   r   r   [  sM        J! ! X!
 % % X% % %r   r   c                   T    e Zd ZdZed             Zed             Zed             ZdS )Groupr   c                 B    | d         j         dk    rg S | d         j        S N   r   r   r,   s    r   r   zGroup.mailboxesp  s&    7--IAw  r   c                 B    | d         j         dk    rg S | d         j        S r   r   r,   s    r   r   zGroup.all_mailboxesv  s&    7--IAw$$r   c                     | d         j         S r<   )r   r,   s    r   r   zGroup.display_name|  s    Aw##r   N)r2   r\   r]   rX   r`   r   r   r   rh   r   r   r   r   l  sh        J! ! X!
 % % X%
 $ $ X$ $ $r   r   c                       e Zd ZdZed             Zed             Zed             Zed             Zed             Z	dS )NameAddr	name-addrc                 F    t          |           dk    rd S | d         j        S N   r   )lenr   r,   s    r   r   zNameAddr.display_name  s#    t99>>4Aw##r   c                     | d         j         S N
local_partr,   s    r   r   zNameAddr.local_part  s    Bx""r   c                     | d         j         S r   domainr,   s    r   r   zNameAddr.domain  s    Bxr   c                     | d         j         S r   )router,   s    r   r   zNameAddr.route  s    Bx~r   c                     | d         j         S r   	addr_specr,   s    r   r   zNameAddr.addr_spec  s    Bx!!r   N
r2   r\   r]   rX   r`   r   r   r   r   r   rh   r   r   r   r     s        J$ $ X$
 # # X#   X   X " " X" " "r   r   c                   j    e Zd ZdZed             Zed             Zed             Zed             ZdS )	AngleAddrz
angle-addrc                 8    | D ]}|j         dk    r	|j        c S d S N	addr-spec)rX   r   r   s     r   r   zAngleAddr.local_part  s;     	$ 	$A|{**|### +	$ 	$r   c                 8    | D ]}|j         dk    r	|j        c S d S r   rX   r   r   s     r   r   zAngleAddr.domain  s8     	  	 A|{**x +	  	 r   c                 8    | D ]}|j         dk    r	|j        c S d S )N	obs-route)rX   domainsr   s     r   r   zAngleAddr.route  s;     	! 	!A|{**y    +	! 	!r   c                     | D ];}|j         dk    r.|j        r	|j        c S t          |j                  |j        z   c S <dS )Nr   z<>)rX   r   r   r   r   s     r   r   zAngleAddr.addr_spec  s`     	 	A|{**< D;&&&'55CCCC	 + 4r   N)	r2   r\   r]   rX   r`   r   r   r   r   rh   r   r   r   r     s        J$ $ X$
     X 
 ! ! X!
   X  r   r   c                   (    e Zd ZdZed             ZdS )ObsRouter   c                     d | D             S )Nc                 2    g | ]}|j         d k    |j        S r   r   r%   s     r   rn   z$ObsRoute.domains.<locals>.<listcomp>  s&    CCCQ!,(*B*B*B*B*Br   rh   r,   s    r   r   zObsRoute.domains  s    CC$CCCCr   N)r2   r\   r]   rX   r`   r   rh   r   r   r   r     s7        JD D XD D Dr   r   c                       e Zd ZdZed             Zed             Zed             Zed             Zed             Z	dS )Mailboxr   c                 B    | d         j         dk    r| d         j        S d S Nr   r   r   r,   s    r   r   zMailbox.display_name  s)    7,,7'' -,r   c                     | d         j         S r<   r   r,   s    r   r   zMailbox.local_part      Aw!!r   c                     | d         j         S r<   r   r,   s    r   r   zMailbox.domain  s    Aw~r   c                 B    | d         j         dk    r| d         j        S d S r  )rX   r   r,   s    r   r   zMailbox.route  s(    7,,7=  -,r   c                     | d         j         S r<   r   r,   s    r   r   zMailbox.addr_spec  s    Aw  r   Nr   rh   r   r   r  r    s        J( ( X( " " X"   X ! ! X! ! ! X! ! !r   r  c                   8    e Zd ZdZed             ZexZxZxZZ	dS )InvalidMailboxr   c                     d S r   rh   r,   s    r   r   zInvalidMailbox.display_name      tr   Nr   rh   r   r   r  r    sB        "J  X /;:J::%)))r   r  c                   6     e Zd ZdZdZe fd            Z xZS )Domainr   Fc                 t    d                     t                      j                                                  S Nr"   r+   r   r   splitr4   s    r   r   zDomain.domain  '    wwuww}**,,---r   )r2   r\   r]   rX   r@   r`   r   ra   rb   s   @r   r  r    sL        JM. . . . X. . . . .r   r  c                       e Zd ZdZdS )DotAtomdot-atomNrr   rh   r   r   r  r    s        JJJr   r  c                       e Zd ZdZdZdS )DotAtomTextzdot-atom-textTNr2   r\   r]   rX   r@   rh   r   r   r  r    s         JMMMr   r  c                       e Zd ZdZdZdS )NoFoldLiteralzno-fold-literalFNr  rh   r   r   r  r     s        "JMMMr   r  c                   n    e Zd ZdZdZed             Zed             Zed             Zed             Z	dS )AddrSpecr   Fc                     | d         j         S r<   r   r,   s    r   r   zAddrSpec.local_part
  r  r   c                 F    t          |           dk     rd S | d         j        S )N   r   )r   r   r,   s    r   r   zAddrSpec.domain  s"    t99q==4Bxr   c                     t          |           dk     r| d         j        S | d         j                                        | d         j        z   | d         j                                        z   S )Nr"  r   r   r   )r   r   rstriplstripr,   s    r   r   zAddrSpec.value  sW    t99q==7= Aw}##%%d1gm3DGM4H4H4J4JJJr   c                     t          | j                  }t          |          t          |t          z
            k    rt	          | j                  }n| j        }| j        |dz   | j        z   S |S )N@)setr   r   DOT_ATOM_ENDSr   r   )r   namesetlps      r   r   zAddrSpec.addr_spec  se    do&&w<<#gm34444do..BBB;"8dk))	r   N)
r2   r\   r]   rX   r@   r`   r   r   r   r   rh   r   r   r  r    s        JM" " X"   X
 K K XK
   X  r   r  c                       e Zd ZdZdZdS )ObsLocalPartzobs-local-partFNr  rh   r   r   r-  r-  &  s        !JMMMr   r-  c                   L     e Zd ZdZdZed             Ze fd            Z xZS )DisplayNamezdisplay-nameFc                    t          |           }t          |          dk    r|j        S |d         j        dk    r|                    d           n7|d         d         j        dk    r t          |d         dd                    |d<   |d         j        dk    r|                                 n7|d         d         j        dk    r t          |d         d d                   |d<   |j        S )Nr   r}   r   r   )r   r   r   rX   pop)r   r   s     r   r   zDisplayName.display_name1  s    oos88q==9q6&&GGAJJJJ1vay#v--"3q6!"":..Ar7''GGIIII2wr{%//#CGCRCL11Byr   c                 t   d}| j         rd}n| D ]}|j        dk    rd}t          |           dk    rt|rrdx}}| d         j        dk    s| d         d         j        dk    rd}| d         j        dk    s| d         d         j        dk    rd}|t          | j                  z   |z   S t                      j        S )	NFTr   r   r"   r}   rg   r   )r   rX   r   r   r   r   r   )r   r   r'   prepostr    s        r   r   zDisplayName.valueB  s    < 	!EE ! !<?22 Et99>>e>OC$Aw!6))T!WQZ-BF-J-JBx"F**d2hrl.Ev.M.M|D$5666t;;77= r   )	r2   r\   r]   rX   r_   r`   r   r   ra   rb   s   @r   r/  r/  ,  sh        J  X  ! ! ! ! X! ! ! ! !r   r/  c                   B    e Zd ZdZdZed             Zed             ZdS )	LocalPartz
local-partFc                 X    | d         j         dk    r| d         j        S | d         j        S )Nr   r   )rX   r   r   r,   s    r   r   zLocalPart.value[  s-    7007''7= r   c                 
   t           g}t           }d}| d         t           gz   D ]}|j        dk    r|r6|j        dk    r+|d         j        dk    rt          |d d                   |d<   t          |t                    }|rG|j        dk    r<|d         j        dk    r+|                    t          |dd                               n|                    |           |d         }|}t          |dd                   }|j        S )NFr   r}   dotr   r   )DOTrX   r   
isinstancer   r   )r   r   last
last_is_tltokis_tls         r   r   zLocalPart.local_partb  s    e
7cU? 	 	C~'' /s~66H'611#D"I..BsI..E  $/U22F%//

9SW--....

3r7DJJAbD	""yr   N)r2   r\   r]   rX   r@   r`   r   r   rh   r   r   r6  r6  V  sR        JM! ! X!   X  r   r6  c                   L     e Zd ZdZdZe fd            Zed             Z xZS )DomainLiteralzdomain-literalFc                 t    d                     t                      j                                                  S r  r  r4   s    r   r   zDomainLiteral.domain  r  r   c                 8    | D ]}|j         dk    r	|j        c S d S )Nptextr   r   s     r   ipzDomainLiteral.ip  s8     	 	A|w&&w '	 	r   )	r2   r\   r]   rX   r@   r`   r   rE  ra   rb   s   @r   rA  rA  z  sg        !JM. . . . X.   X    r   rA  c                       e Zd ZdZdZdZdS )MIMEVersionzmime-versionN)r2   r\   r]   rX   majorminorrh   r   r   rG  rG    s        JEEEEr   rG  c                   J    e Zd ZdZdZdZdZed             Zed             Z	dS )	Parameter	parameterFus-asciic                 .    | j         r| d         j        ndS r   )	sectionednumberr,   s    r   section_numberzParameter.section_number  s     "&6tAw~~Q6r   c                     | D ]N}|j         dk    r	|j        c S |j         dk    r-|D ]*}|j         dk    r|D ]}|j         dk    r|j        c c c S +OdS )Nr   r   r   r"   )rX   r   r   s     r   param_valuezParameter.param_value  s      	< 	<E7**++++?22" < <E'+???%* < <E$/7::','; ; ; ; ; ; ; ;  ;rr   N)
r2   r\   r]   rX   rO  extendedr   r`   rQ  rS  rh   r   r   rK  rK    s\        JIHG7 7 X7
   X  r   rK  c                       e Zd ZdZdS )InvalidParameterinvalid-parameterNrr   rh   r   r   rV  rV    s        $JJJr   rV  c                   (    e Zd ZdZed             ZdS )	Attribute	attributec                 V    | D ]%}|j                             d          r	|j        c S &d S )Nattrtext)rX   endswithr   r   s     r   r   zAttribute.stripped_value  sG     	# 	#E((44 #{"""#	# 	#r   Nr2   r\   r]   rX   r`   r   rh   r   r   rY  rY    s2        J# # X# # #r   rY  c                       e Zd ZdZdZdS )SectionsectionN)r2   r\   r]   rX   rP  rh   r   r   r`  r`    s        JFFFr   r`  c                   (    e Zd ZdZed             ZdS )Valuer   c                     | d         }|j         dk    r| d         }|j                             d          r|j        S | j        S )Nr   r}   r   )r   rZ  zextended-attribute)rX   r]  r   r   r   s     r   r   zValue.stripped_value  sS    Qv%%GE$$DF F 	(''zr   Nr^  rh   r   r   rc  rc    s2        J  X  r   rc  c                   2    e Zd ZdZdZed             Zd ZdS )MimeParametersmime-parametersFc              #     K   i }| D ]y}|j                             d          s|d         j         dk    r/|d         j                                        }||vrg ||<   ||                             |j        |f           z|                                D ]4\  }}t          |t          d                    }|d         d         }|j	        }|j
        sgt          |          dk    rT|d         d         dk    rB|d         d         j                            t          j        d                     |d d         }g }d}|D ]j\  }	}
|	|k    r`|
j
        s-|
j                            t          j        d                     @|
j                            t          j        d                     |dz  }|
j        }|
j
        r	 t           j                            |          }	 |                    |d	          }n-# t(          t*          f$ r |                    d
d	          }Y nw xY wt-          j        |          r+|
j                            t          j                               n1# t*          $ r$ t           j                            |d          }Y nw xY w|                    |           ld                    |          }||fV  6d S )NrL  r   rZ  )keyr   z.duplicate parameter name; duplicate(s) ignoredz+duplicate parameter name; duplicate ignoredz(inconsistent RFC2231 parameter numberingsurrogateescaperM  zlatin-1)encodingr"   )rX   r]  r   stripr   rQ  itemssortedr   r   rT  r   r   r   InvalidHeaderDefectrS  urllibparseunquote_to_bytesdecodeLookupErrorUnicodeEncodeErrorr   _has_surrogatesUndecodableBytesDefectunquoter+   )r   paramsrF   namepartsfirst_paramr   value_partsirQ  paramr   s               r   ry  zMimeParameters.params  sF       	? 	?E#,,[99 Qx"k118>''))D6!!!t4L!5u =>>>>!<<>> 3	 3	KD%5jmm444E(1+K!)G ' &CJJNN8A;!##!HQK'..v/IH0J 0J K K K!"1"IE KA). !* !*%!Q&& !> I,,V-GI.K .K L L L ,,V-GF.H .H I I IQ)> RR & = =e D DP$)LL:K$L$LEE +-?@ P P P
 %*LL=N$O$OEEEP !077 R!M001N1P1PQQQ . P P P !' 4 4UY 4 O O	P  ""5))))GGK((E+g3	 3	s$   I&"G99'H#"H#&+JJc           	          g }| j         D ]S\  }}|r7|                    d                    |t          |                               >|                    |           Td                    |          }|rd|z   ndS )N{}={}z; rg   r"   )ry  r   r1   r   r+   )r   ry  rz  r   s       r   r-   zMimeParameters.__str__  s    ; 	$ 	$KD% $gnnT<3F3FGGHHHHd####6""%-sV||2-r   N)r2   r\   r]   rX   r^   r`   ry  r-   rh   r   r   rf  rf    sJ        "JOC C XCJ. . . . .r   rf  c                   (    e Zd ZdZed             ZdS )ParameterizedHeaderValueFc                 R    t          |           D ]}|j        dk    r	|j        c S i S )Nrg  )reversedrX   ry  r   s     r   ry  zParameterizedHeaderValue.params-  s>    d^^ 	$ 	$E#444|### 5	r   N)r2   r\   r]   r^   r`   ry  rh   r   r   r  r  '  s4         O  X  r   r  c                       e Zd ZdZdZdZdZdS )ContentTypezcontent-typeFtextplainN)r2   r\   r]   rX   r@   maintypesubtyperh   r   r   r  r  5  s"        JMHGGGr   r  c                       e Zd ZdZdZdZdS )ContentDispositionzcontent-dispositionFN)r2   r\   r]   rX   r@   content_dispositionrh   r   r   r  r  <  s         &JMr   r  c                       e Zd ZdZdZdZdS )ContentTransferEncodingzcontent-transfer-encodingF7bitN)r2   r\   r]   rX   r@   r   rh   r   r   r  r  B  s        ,JM
CCCr   r  c                       e Zd ZdZdZdS )HeaderLabelzheader-labelFNr  rh   r   r   r  r  H  s        JMMMr   r  c                       e Zd ZdZdZd ZdS )MsgIDzmsg-idFc                 0    t          |           |j        z   S r   )r   lineseprK   s     r   rL   z
MsgID.foldQ  s    4yy6>))r   N)r2   r\   r]   rX   r@   rL   rh   r   r   r  r  M  s-        JM* * * * *r   r  c                       e Zd ZdZdS )	MessageIDz
message-idNrr   rh   r   r   r  r  V  s        JJJr   r  c                       e Zd ZdZdS )InvalidMessageIDzinvalid-message-idNrr   rh   r   r   r  r  Z  s        %JJJr   r  c                       e Zd ZdZdS )HeaderheaderNrr   rh   r   r   r  r  ^  rv   r   r  c                   ~     e Zd ZdZdZdZ fdZ fdZd Ze	d             Z
d fd	Zd Ze	d	             Zd
 Z xZS )TerminalTc                 h    t                                          | |          }||_        g |_        |S r   )r   __new__rX   r   )clsr   rX   r   r    s       r   r  zTerminal.__new__l  s-    wwsE**$r   c                     d                     | j        j        t                                                                S r/   r0   r4   s    r   r3   zTerminal.__repr__r  s,    t~68H8H8J8JKKKr   c                 N    t          | j        j        dz   | j        z              d S )N/)rP   r    r2   rX   r,   s    r   rS   zTerminal.pprintu  s'    dn%+do=>>>>>r   c                 *    t          | j                  S r   )listr   r,   s    r   r9   zTerminal.all_defectsx  s    DL!!!r   r"   c           	          d                     || j        j        | j        t	                                                      | j        sdnd                     | j                            gS )Nz{}{}/{}({}){}r"   z {})r1   r    r2   rX   r   r3   r   )r   rO   r    s     r   rV   zTerminal._pp|  s_    &&N#OGGlBBBT\(B(B   	r   c                     d S r   rh   r,   s    r   pop_trailing_wszTerminal.pop_trailing_ws  r  r   c                     g S r   rh   r,   s    r   rE   zTerminal.comments  s    	r   c                 .    t          |           | j        fS r   )r   rX   r,   s    r   __getnewargs__zTerminal.__getnewargs__  s    4yy$/**r   r[   )r2   r\   r]   r@   r_   r^   r  r3   rS   r`   r9   rV   r  rE   r  ra   rb   s   @r   r  r  f  s        MO    L L L L L? ? ? " " X"          X+ + + + + + +r   r  c                   *    e Zd Zed             Zd ZdS )WhiteSpaceTerminalc                     dS rf   rh   r,   s    r   r   zWhiteSpaceTerminal.value  ri   r   c                     dS )NTrh   r,   s    r   r=   z!WhiteSpaceTerminal.startswith_fws  s    tr   Nr2   r\   r]   r`   r   r=   rh   r   r   r  r    s<          X    r   r  c                   *    e Zd Zed             Zd ZdS )ValueTerminalc                     | S r   rh   r,   s    r   r   zValueTerminal.value  s    r   c                     dS )NFrh   r,   s    r   r=   zValueTerminal.startswith_fws  s    ur   Nr  rh   r   r   r  r    s<          X    r   r  c                   *    e Zd Zed             Zd ZdS )EWWhiteSpaceTerminalc                     dS r  rh   r,   s    r   r   zEWWhiteSpaceTerminal.value  s    rr   c                     dS r  rh   r,   s    r   r-   zEWWhiteSpaceTerminal.__str__  s    rr   N)r2   r\   r]   r`   r   r-   rh   r   r   r  r    s<          X    r   r  c                       e Zd ZdS )_InvalidEwErrorN)r2   r\   r]   rh   r   r   r  r    s        ;;r   r  r9  ,list-separatorr'  zroute-component-markerz([{}]+)r"   z[^{}]+z[\x00-\x20\x7F]c                    	 t          |           }|r,| j                            t          j        |                     t          j        |           r.| j                            t          j        d                     d S d S )Nz*Non-ASCII characters found in header token)_non_printable_finderr   r   r   NonPrintableDefectr   rv  rw  )xtextnon_printabless     r   _validate_xtextr    s    J*511N HV6~FFGGGU## ;V:8: : 	; 	; 	; 	; 	;; ;r   c                 n   	 t          | d          ^}}g }d}d}t          t          |                    D ]D}||         dk    r
|rd}d}nd}|rd}n||         |v r n!|                    ||                    E|dz   }d                    |          d                    ||d          g|z             |fS )Nr   Fr   Tr"   )_wsp_splitterranger   r   r+   )r   endcharsfragment	remaindervcharsescapehad_qpposs           r   _get_ptext_to_endcharsr    s     )22HyFFFS]]##  C=D    	FFc]h&&Ehsm$$$$Ag776??BGGXcdd^$4y$@AA6IIr   c                     	 |                                  }t          | d t          |           t          |          z
           d          }||fS )Nfws)r%  r  r   )r   newvaluer  s      r   get_fwsr    sK     ||~~H
U#<CJJs8}}$<#<=u
E
EC=r   c                    	 t                      }|                     d          s't          j        d                    |                     | dd                              dd          ^}}|| dd          k    r't          j        d                    |                     d                    |          }t          |          dk    rW|d         t          v rH|d         t          v r9|	                    d          dk     r |                    dd          ^}}|dz   |z   }t          |                                          dk    r,|j
                            t          j        d	                     | |_        d                    |          } 	 t          j        d|z   dz             \  }}}}	n<# t           t"          f$ r( t%          d
                    |j                            w xY w||_        ||_        |j
                            |	           |r|d         t,          v r(t/          |          \  }
}|                    |
           9t1          |d          ^}}t3          |d          }t5          |           |                    |           d                    |          }|| r;| d         t,          vr,|j
                            t          j        d                     || fS )N=?z"expected encoded word but found {}r   z?=r   r"   r   ?zwhitespace inside encoded wordz!encoded word format invalid: '{}'vtextz.missing trailing whitespace after encoded-word)r   
startswithr   HeaderParseErrorr1   r  r+   r   r   countr   r   ro  r   _ewrs  
ValueErrorKeyErrorr  r   r   rD   WSPr  r  r  r  )r   ewr>  r  remstrrestr  r   r   r   rF   charsr  s                r   get_encoded_wordr    s    
BD!! @%077>>@ @ 	@ABBioodA..OC)
eABBi%077>>@ @ 	@WWYFFaq	Yq	Y		#!<<a00yDj4
399;;!

&4,. . 	/ 	/ 	/BFGGIE@'*z$*t2C'D'D$gtWW! @ @ @/66rv>>@ @ 	@@ BJBGJg
 	"7c>>!$--KE4IIe)$22	eW--
		%wwy!!  	"  ?q$$

&4<> > 	? 	? 	?u9s   F. .9G'c                    	 t                      }| r| d         t          v r(t          |           \  }} |                    |           :d}|                     d          r	 t          |           \  }} d}t          |          dk    r?|d         j        dk    r.|j                            t          j
        d                     d}|r=t          |          dk    r*|d	         j        d
k    rt          |d         d          |d<   |                    |           # t          $ r d}Y nt          j        $ r Y nw xY wt          | d          ^}}|r1t                              |          r|                     d          ^}}t%          |d          }t'          |           |                    |           d                    |          } | |S )Nr   Tr  r   r  z&missing whitespace before encoded wordFr   r   r  r"   )rp   r  r  r   r  r  r   rX   r   r   ro  r  r  r  r  rfc2047_matchersearch	partitionr  r  r+   )r   rq   rF   valid_ewhave_wsr>  r  r  s           r   get_unstructuredr  ?  s'   , )**L
 (#8s??"5>>LE5&&&D!! 	/66u |$$q((#B'2e;;$,33F4ND5F 5F G G G"' 5s<00144#B'2nDD+?(,e,5 ,5R(##E***% # ! ! ! *    " (q11i  	4..s33 	4#ood33OC)c7++E"""	""Q  (#R s   "D D=,D=<D=c                 r    	 t          | d          \  }} }t          |d          }t          |           || fS )Nz()rD  )r  r  r  r   rD  _s      r   get_qp_ctextr    sE    
 -UD99OE5!ug..EE%<r   c                 r    	 t          | d          \  }} }t          |d          }t          |           || fS )Nr   rD  )r  r  r  r  s      r   get_qcontentr    sE     -UC88OE5!%))EE%<r   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nzexpected atext but found '{}'atext)_non_atom_end_matcherr   r  r1   r   r   r  r  )r   mr  s      r   	get_atextr    s    
 	e$$A ;%+22599; ; 	;GGIIE#e**++E%))EE%<r   c                    	 | d         dk    r't          j        d                    |                     t                      }| dd          } | r3| d         dk    r't	          |           \  }} |                    |           | r/| d         dk    r"| d         t          v rt          |           \  }} n| d d         dk    rd}	 t          |           \  }} |j	                            t          j
        d                     d	}n'# t           j        $ r t	          |           \  }} Y nw xY w|rNt          |          dk    r;|d
         j        dk    r*|d         j        dk    rt          |d
         d          |d
<   nt	          |           \  }} |                    |           | r| d         dk    "| s0|j	                            t          j
        d                     || fS || dd          fS )Nr   r   zexpected '"' but found '{}'r   r   r  Fz!encoded word inside quoted stringTr   r  r  r   z"end of header inside quoted string)r   r  r1   r   r  r   r  r  r  r   ro  r   rX   r  )r   bare_quoted_stringrF   r  s       r   get_bare_quoted_stringr    sJ    Qx3%*11%88: : 	:)++!""IE )qS#E**u!!%(((
 )E!HOO8s??"5>>LE552A2Y$H3/66u"*11&2L739 39 : : :* 3 3 3+E22uuu3  7C 233a77&r*5>>*2.9^KK-A*2..7 .7&r* (..LE5!!%(((+  )E!HOO,  )"))&*D0+2 +2 	3 	3 	3!5((uQRRy((s   A D !D*)D*c                 "   	 | r3| d         dk    r't          j        d                    |                     t                      }| dd          } | r| d         dk    rv| d         t          v rt          |           \  }} n1| d         dk    rt          |           \  }} nt          |           \  }} |                    |           | r| d         dk    v| s0|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  r1   r   r  r  get_commentr  r   r   ro  )r   rl   rF   s      r   r  r    s7   
  9qS%)00779 9 	9iiG!""IE
 E!HOO8s??"5>>LE551X__&u--LE55'..LE5u  E!HOO  v9* ,  , 	- 	- 	-~E!""Ir   c                     	 t                      }| ri| d         t          v rZ| d         t          v rt          |           \  }} nt	          |           \  }} |                    |           | r| d         t          v Z|| fS r<   )r|   CFWS_LEADERr  r  r  r   )r   r}   rF   s      r   get_cfwsr    s     ::D
 E!H++8s??"5>>LE55&u--LE5E  E!H++ ;r   c                 V   	 t                      }| r6| d         t          v r't          |           \  }} |                    |           t	          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS r<   )r   r  r  r   r  )r   quoted_stringrF   s      r   get_quoted_stringr    s     !NNM $q[((uU###)%00LE5 $q[((uU###%r   c                 f   	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     |                     d          r;	 t          |           \  }} n9# t
          j        $ r t          |           \  }} Y nw xY wt          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS )Nr   zexpected atom but found '{}'r  )r   r  r  r   	ATOM_ENDSr   r  r1   r  r  r  )r   r   rF   s      r   get_atomr    sN    66D q[((uE :qY&&%*11%88: : 	: (	,+E22LE55& 	, 	, 	, %U++LE555	,
 !''uKK q[((uE;s   B) )!CCc                     	 t                      }| r| d         t          v r't          j        d                    |                     | ry| d         t          vrjt          |           \  }} |                    |           | r0| d         dk    r$|                    t                     | dd          } | r| d         t          vj|d         t          u r*t          j        d                    d| z                       || fS )Nr   z8expected atom at a start of dot-atom-text but found '{}'r	   r   r   z4expected atom at end of dot-atom-text but found '{}')r  r  r   r  r1   r  r   r:  )r   dot_atom_textrF   s      r   get_dot_atom_textr  0  s     MMM :E!H	))% '++16%==: : 	:
 E!HI-- ''uU### 	U1X__  %%%!""IE  E!HI-- RC% '#VCI..0 0 	0%r   c                    	 t                      }| d         t          v r't          |           \  }} |                    |           |                     d          r;	 t          |           \  }} n9# t          j        $ r t          |           \  }} Y nw xY wt          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS )Nr   r  )	r  r  r  r   r  r  r   r  r  )r   dot_atomrF   s      r   get_dot_atomr  C  s   
 yyHQx;u 0	4+E22LE55& 	4 	4 	4 -U33LE555	4
 )//uOOE q[((uU?s   A/ /!BBc                 b   	 | d         t           v rt          |           \  }} nd }| st          j        d          | d         dk    rt	          |           \  }} nH| d         t
          v r't          j        d                    |                     t          |           \  }} ||g|d d<   || fS )Nr   z5Expected 'atom' or 'quoted-string' but found nothing.r   z1Expected 'atom' or 'quoted-string' but found '{}')r  r  r   r  r  SPECIALSr1   r  )r   leaderrF   s      r   get_wordr  \  s     Qx;  E%CE E 	EQx}}(//uu	qX		% '77=ve}}F F 	F  uHbqb	%<r   c                    	 t                      }	 t          |           \  }} |                    |           nA# t          j        $ r/ |j                            t          j        d                     Y nw xY w| r
| d         t          vr| d         dk    rQ|                    t                     |j                            t          j	        d                     | dd          } n	 t          |           \  }} nd# t          j        $ rR | d         t          v r?t          |           \  }} |j                            t          j	        d                     n Y nw xY w|                    |           | r| d         t          v|| fS )Nzphrase does not start with wordr   r	   zperiod in 'phrase'r   zcomment found without atom)rt   r  r   r   r  r   ro  PHRASE_ENDSr:  ObsoleteHeaderDefectr  r  )r   ru   rF   s      r   
get_phraser  ~  s   
 XXF0ue" 0 0 0f8-/ / 	0 	0 	0 	0 	00  !E!HK//8S==MM#N!!&"=$#& #& ' ' '!""IEE'uu*   8{**#+E??LE5N))&*E4+6 +6 7 7 7 7 7 7 MM%   !  !E!HK//" 5=s"   '9 ;A76A7*C= =AEEc                    	 t                      }d }| d         t          v rt          |           \  }} | s't          j        d                    |                     	 t          |           \  }} nh# t          j        $ rV 	 t          |           \  }} n?# t          j        $ r- | d         dk    r| d         t          v r t                      }Y nw xY wY nw xY w||g|d d<   |
                    |           | r| d         dk    s| d         t          vrt          t          |          | z             \  }} |j        dk    r-|j        
                    t          j        d                     n,|j        
                    t          j        d                     ||d<   	 |j                            d           n<# t&          $ r/ |j        
                    t          j        d                     Y nw xY w|| fS )	Nr   z"expected local-part but found '{}'r   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)asciiz)local-part contains non-ASCII characters))r6  r  r  r   r  r1   r  r  r  r   r   get_obs_local_partr   rX   r   ro  r  r   encoderu  NonASCIILocalPartDefect)r   r   r  rF   obs_local_parts        r   get_local_partr    sl    JFQx;  @%077>>@ @ 	@ #E**uu"      	 #E??LE55& 	  	  	 Qx4E!H$;$;KKEEE	   Hbqb	e '%(D..E!HK$?$? 23z??U3J K K$(@@@%%f&@N'P 'P Q Q Q Q %%f&A>'@ '@ A A A&
1>(((( > > >!!&"@;#= #= 	> 	> 	> 	> 	>> usH   A0 0C BC9CCCCC F; ;6G43G4c                     	 t                      }d}| r| d         dk    s| d         t          vr| d         dk    rU|r,|j                            t	          j        d                     |                    t                     d}| dd          } | d         dk    rb|                    t          | d         d                     | dd          } |j                            t	          j        d	                     d}|r=|d
         j        dk    r,|j                            t	          j        d                     	 t          |           \  }} d}n7# t          j
        $ r% | d         t          vr t          |           \  }} Y nw xY w|                    |           | r| d         dk    | d         t          v|d         j        dk    s"|d         j        dk    r=|d         j        dk    r,|j                            t	          j        d                     |d
         j        dk    s"|d
         j        dk    r=|d         j        dk    r,|j                            t	          j        d                     |j        rd|_        || fS )NFr   r   r	   zinvalid repeated '.'Tr   misplaced-specialz/'\' character outside of quoted-string/ccontentr   r9  zmissing '.' between wordsr}   z!Invalid leading '.' in local partr  z"Invalid trailing '.' in local partr  )r-  r  r   r   r   ro  r:  r  rX   r  r  r  r  )r   r  last_non_ws_was_dotrF   s       r   r  r    s   !^^N
 %U1Xt^^uQx{'B'B8s??" -&--f.H*/, /, - - -!!#&&&"&!""IE1Xt^^!!-a0C#E #E F F F!""IE"))&*DB+D +D E E E"' 	.nR0;uDD"))&*D++- +- . . .	+#E??LE5"'& 	+ 	+ 	+Qx{**#E??LE555	+ 	e$$$7  %U1Xt^^uQx{'B'B8 	q$--1(&001(%//%%f&@/'1 '1 	2 	2 	2r%..2)6112)500%%f&@0'2 '2 	3 	3 	3 =$<!5  s    E 1F	F	c                     	 t          | d          \  }} }t          |d          }|r,|j                            t	          j        d                     t          |           || fS )Nz[]rD  z(quoted printable found in domain-literal)r  r  r   r   r   r  r  )r   rD  r  s      r   	get_dtextr     sz    
 2%>>E5&%))E 9V868 8 	9 	9 	9E%<r   c                     | rdS |                     t          j        d                     |                     t          dd                     dS )NFz"end of input inside domain-literal]domain-literal-endT)r   r   ro  r  )r   domain_literals     r   _check_for_early_dl_endr%    s]     u&4,. . / / /--ABBCCC4r   c                 N   	 t                      }| d         t          v r't          |           \  }} |                    |           | st	          j        d          | d         dk    r't	          j        d                    |                     | dd          } t          | |          r|| fS |                    t          dd                     | d         t          v r't          |           \  }} |                    |           t          |           \  }} |                    |           t          | |          r|| fS | d         t          v r't          |           \  }} |                    |           t          | |          r|| fS | d         dk    r't	          j        d                    |                     |                    t          dd	                     | dd          } | r6| d         t          v r't          |           \  }} |                    |           || 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 '{}'r#  )rA  r  r  r   r   r  r1   r%  r  r  r  r   )r   r$  rF   s      r   get_domain_literalr(    s;    #__NQx;ue$$$ A%&?@@@Qx3% '!!'0 0 	0!""IEun55 %u$$--CDDEEEQx3u~~ue$$$U##LE5%   un55 %u$$Qx3u~~ue$$$un55 %u$$Qx3% '!!'0 0 	0--ABBCCC!""IE %q[((ue$$$5  r   c                    	 t                      }d }| d         t          v rt          |           \  }} | s't          j        d                    |                     | d         dk    r5t          |           \  }} ||g|d d<   |                    |           || fS 	 t          |           \  }} n'# t          j        $ r t          |           \  }} Y nw xY w| r | d         dk    rt          j        d          ||g|d d<   |                    |           | r| d         dk    r|j
                            t          j        d                     |d         j        dk    r|d         |d d <   | rc| d         dk    rW|                    t                     t          | d	d                    \  }} |                    |           | r| d         dk    W|| fS )
Nr   zexpected domain but found '{}'r'  r'  zInvalid Domainr	   z(domain is not a dot-atom (contains CFWS)r  r   )r  r  r  r   r  r1   r(  r   r  r  r   r  rX   r:  )r   r   r  rF   s       r   
get_domainr*  =  s    XXFFQx;  <%,33E::< < 	<Qx3)%00uE"1"Ieu}'#E**uu" ' ' 'uuu' 8qS%&6777Hbqb	
MM% !qSf968 8 	9 	9 	9!9:--q	F111I 	!aCMM##E!""I..LE5MM%     	!aC 5=s   B1 1!CCc                    	 t                      }t          |           \  }} |                    |           | r| d         dk    r0|j                            t	          j        d                     || fS |                    t          dd                     t          | dd                    \  }} |                    |           || fS )Nr   r'  z#addr-spec local part with no domainaddress-at-symbolr   )r  r  r   r   r   ro  r  r*  )r   r   rF   s      r   get_addr_specr-  c  s     

I!%((LE5U  E!HOO  !;1"3 "3 	4 	4 	4%]3(;<<===eABBi((LE5Uer   c                    	 t                      }| r| d         dk    s| d         t          v r| d         t          v r(t          |           \  }} |                    |           n0| d         dk    r$|                    t                     | dd          } | r| d         dk    u| d         t          v | r| d         dk    r't          j        d                    |                     |                    t                     t          | dd                    \  }} |                    |           | r| d         dk    r|                    t                     | dd          } | sn| d         t          v r't          |           \  }} |                    |           | d         dk    rI|                    t                     t          | dd                    \  }} |                    |           | r| d         dk    | st          j        d          | d         dk    r't          j        d                    |                     |                    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  r1   RouteComponentMarkerr*  r  )r   	obs_routerF   s      r   get_obs_router3  s  s    

I
 U1Xs]]eAh+&=&=8{""#E??LE5U####1X__]+++!""IE  U1Xs]]eAh+&=&=  FE!HOO%6==eDDF F 	F)***eABBi((LE5U
 $E!HcMM'''abb	 	8{""#E??LE5U###8s??1222%eABBi00LE5U###  $E!HcMM  O%&MNNNQx3% (''-ve}}6 6 	6]3(ABBCCCeABBir   c                 (   	 t                      }| d         t          v r't          |           \  }} |                    |           | r| d         dk    r't	          j        d                    |                     |                    t          dd                     | dd          } | d         dk    r]|                    t          dd                     |j                            t	          j	        d                     | dd          } || fS 	 t          |           \  }} n# t          j        $ r 	 t          |           \  }} |j                            t	          j        d	                     n:# t          j        $ r( t	          j        d
                    |                     w xY w|                    |           t          |           \  }} Y nw xY w|                    |           | r| d         dk    r| dd          } n,|j                            t	          j	        d                     |                    t          dd                     | r6| d         t          v r't          |           \  }} |                    |           || 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  r1   r  r   ro  r-  r3  r  )r   
angle_addrrF   s      r   get_angle_addrr8    s    JQx;u%    @E!HOO%077>>@ @ 	@mC);<<===!""IE Qx3--=>>???!!&"<*#, #, 	- 	- 	-abb	5  ,$U++uu" 	, 	, 	,	P(//LE5%%f&A<'> '> ? ? ? ?& 	P 	P 	P)@GGNNP P P	P 	%   $U++uuu	, e 3qSabb	!!&"<0#2 #2 	3 	3 	3mC)9::;;; !q[((u%   us*   D% %G5>E43G47F++*GGc                     	 t                      }t          |           \  }} |                    |d d                     |j        d d          |_        || fS r   )r/  r  rD   r   )r   r   rF   s      r   get_display_namer:    s]     ==Le$$LE5aaa!!! =+Lr   c                 j   	 t                      }d }| d         t          v r;t          |           \  }} | s't          j        d                    |                    | d         dk    r| d         t          v r't          j        d                    |                     t          |           \  }} | s't          j        d                    |                    ||g|d         d d<   d }|                    |           t          |           \  }} ||g|d d<   |                    |           || fS )Nr   z!expected name-addr but found '{}'r5  )
r   r  r  r   r  r1   r  r:  r   r8  )r   	name_addrr  rF   s       r   get_name_addrr=    sf    

IFQx;  	D)3::6BBD D DQx38{"")3::5AAC C C'..u 	C)3::5AAC C C"8E!HRaRLF!%((LE5Hbqb	Uer   c                    	 t                      }	 t          |           \  }} nc# t          j        $ rQ 	 t	          |           \  }} n:# t          j        $ r( t          j        d                    |                     w xY wY nw xY wt          d |j        D                       rd|_        |	                    |           || fS )Nzexpected mailbox but found '{}'c              3   J   K   | ]}t          |t          j                  V  d S r   )r;  r   ro  r%   s     r   r(   zget_mailbox.<locals>.<genexpr>  sC       3 3 a344 3 3 3 3 3 3r   r   )
r  r=  r   r  r-  r1   anyr9   rX   r   )r   r   rF   s      r   get_mailboxrA    s   
 iiGA$U++uu" A A A	A(//LE55& 	A 	A 	A)188??A A A	A 5A  3 3 % 13 3 3 3 3 /.NN5E>&   $ BAB7A>>BBc                 ,   	 t                      }| r| d         |vrv| d         t          v r4|                    t          | d         d                     | dd          } n't	          |           \  }} |                    |           | r
| d         |vv|| fS )Nr   r  r   )r  r  r   r  r  )r   r  invalid_mailboxrF   s       r   get_invalid_mailboxrE    s     %&&O
 *E!HH,,8{""""=q1D$F $F G G G!""IEE%e,,LE5""5)))  *E!HH,, E!!r   c                    	 t                      }| rd| d         dk    rW	 t          |           \  }} |                    |           n}# t          j        $ rj d }| d         t
          v rt          |           \  }} | r
| d         dv rB|                    |           |j                            t          j        d                     nt          | d          \  }} ||g|d d<   |                    |           |j                            t          j
        d                     n| d         dk    r-|j                            t          j        d                     n^t          | d          \  }} ||g|d d<   |                    |           |j                            t          j
        d                     Y nw xY w| rm| d         dvrc|d         }d|_        t          | d          \  }} |                    |           |j                            t          j
        d                     | r0| d         dk    r$|                    t                     | d	d          } | r| d         dk    W|| fS )
Nr   ;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr  r   r   r   )r   rA  r   r   r  r  r  r   r  rE  ro  rX   rD   r0  )r   mailbox_listrF   r  r   s        r   get_mailbox_listrI    s   
 ==L
 (E!HOO	8&u--LE5&&&&& 	8 	8 	8FQx;&& ( 
<aD 0 0 ''/// (//0K719 19 : : : : $7ud#C#CLE5)%+Hbqb	 ''... (//0J91; 1; < < < <qS$++F,G3-5 -5 6 6 6 6  35$??u%!'E"1"I##E***$++F,F5-7 -7 8 8 8/	82  	4U1XT)) #2&G!2G.ud;;LE5NN5!!! ''(B1)3 )3 4 4 4 	U1X__...!""IEQ  (E!HOOR s   'A
 
E7GGc                    	 t                      }| s0|j                            t          j        d                     || fS d }| r| d         t
          v r~t          |           \  }} | sE|j                            t          j        d                     |                    |           || fS | d         dk    r|                    |           || fS t          |           \  }} t          |j	                  dk    r\||                    |           |
                    |           |j                            t          j        d                     || fS ||g|d d<   |                    |           || fS )Nzend of header before group-listr   zend of header in group-listrG  zgroup-list with empty entries)r   r   r   r   ro  r  r  rI  r   r   rD   r  )r   
group_listr  rF   s       r   get_group_listrL  W  s    J !!!&"<-#/ #/ 	0 	0 	05  F %q[((  	% %%f&@-'/ '/ 0 0 0f%%%u$$8s??f%%%u$$#E**LE5
5""f%%%%   !!&"=+#- #- 	. 	. 	.5  Hbqb	eur   c                    	 t                      }t          |           \  }} | r| d         dk    r't          j        d                    |                     |                    |           |                    t          dd                     | dd          } | r;| d         dk    r/|                    t          dd                     || dd          fS t          |           \  }} |                    |           | s-|j                            t          j	        d                     n3| d         dk    r't          j        d	                    |                     |                    t          dd                     | dd          } | r6| d         t          v r't          |           \  }} |                    |           || fS )
Nr   r/  z8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr   rG  zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {})r   r:  r   r  r1   r   r  rL  r   ro  r  r  )r   r   rF   s      r   	get_grouprN  |  s    GGE#E**LE5 9E!HOO% '**0&--9 9 	9	LL	LLs$CDDEEE!""IE  qS]3(:;;<<<eABBi!%((LE5	LL GV7$& & 	' 	' 	' 	'	qS%7>>uEEG G 	G	LLs$677888!""IE q[((uU%<r   c                 @   	 t                      }	 t          |           \  }} nc# t          j        $ rQ 	 t	          |           \  }} n:# t          j        $ r( t          j        d                    |                     w xY wY nw xY w|                    |           || fS )Nzexpected address but found '{}')r   rN  r   r  rA  r1   r   )r   r   rF   s      r   get_addressrP    s      iiGA ''uu" A A A	A&u--LE55& 	A 	A 	A)188??A A A	A 5A NN5E>rB  c                    	 t                      }| rv	 t          |           \  }} |                    |           n# t          j        $ r}d }| d         t
          v rt          |           \  }} | r| d         dk    rC|                    |           |j                            t          j        d                     nt          | d          \  }} ||g|d d<   |                    t          |g                     |j                            t          j        d                     n| d         dk    r-|j                            t          j        d                     nlt          | d          \  }} ||g|d d<   |                    t          |g                     |j                            t          j        d                     Y d }~nd }~ww xY w| ru| d         dk    ri|d         d         }d|_        t          | d          \  }} |                    |           |j                            t          j        d                     | r-|                    t          dd                     | d	d          } | v|| fS )
Nr   r  z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr   r   r  r   )r   rP  r   r   r  r  r  r   r  rE  r   ro  rX   rD   r  )r   address_listrF   errr  r   s         r   get_address_listrT    s    ==L
 (	8&u--LE5&&&&& 	8 	8 	8FQx;&& ( 
<aC ''/// (//0K<1> 1> ? ? ? ? $7uc#B#BLE5)%+Hbqb	 ''(8(8999 (//0J91; 1; < < < <qS$++F,G3-5 -5 6 6 6 6  35#>>u%!'E"1"I##GUG$4$4555$++F,F5-7 -7 8 8 8/	82  	4U1X__ #2&q)G!2G.uc::LE5NN5!!! ''(B1)3 )3 4 4 4 	c3C D DEEE!""IEQ  (R s   '= GFGGc                 H   	 t                      }| s't          j        d                    |                     | d         dk    r't          j        d                    |                     |                    t          dd                     | dd          } t          |           \  }} |                    |           | r| d         dk    r't          j        d                    |                     |                    t          dd	                     || dd          fS )
Nz'expected no-fold-literal but found '{}'r   r'  z;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr   r"  z9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r  r   r  r1   r   r  r   )r   no_fold_literalrF   s      r   get_no_fold_literalrW    s4   #ooO E%5<<UCCE E 	EQx3%#VE]], , 	, =.EFFGGG!""IEU##LE55!!! ,E!HOO%#VE]], , 	, =.CDDEEEE!""I%%r   c                 (   	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r| d         dk    r't	          j        d                    |                     |                    t          dd                     | dd          } 	 t          |           \  }} n# t          j        $ r} 	 t          |           \  }} |j
                            t	          j        d                     n:# t          j        $ r( t	          j        d                    |                     w xY wY nw xY w|                    |           | r| d         dk    rk|j
                            t	          j        d	                     | r9| d         d
k    r-|                    t          d
d                     | dd          } || fS |                    t          dd                     | dd          } 	 t          |           \  }} n# t          j        $ r 	 t          |           \  }} n# t          j        $ r}	 t          |           \  }} |j
                            t	          j        d                     n:# t          j        $ r( t	          j        d                    |                     w xY wY d }~nd }~ww xY wY nw xY w|                    |           | r| d         d
k    r| dd          } n,|j
                            t	          j        d                     |                    t          d
d                     | r6| d         t          v r't          |           \  }} |                    |           || fS )Nr   r5  zexpected msg-id but found '{}'zmsg-id-startr   zobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r'  zmsg-id with no id-rightr6  z
msg-id-endr,  zobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)r  r  r  r   r   r  r1   r  r  r  r   r  ro  rW  r*  )r   msg_idrF   es       r   
get_msg_idr[    s   
 WWF q[((ue <E!HOO%,33E::< < 	<
MM-^44555!""IE1(//uu" 	1 	1 	1	1-e44LE5N!!&"=,#. #. / / / /& 	1 	1 	1)""(&--1 1 1	1/ /		1 MM% 	E!HOOf8%' ' 	( 	( 	(
  	U1X__MM-\::;;;!""IEu}
MM-%899:::!""IE5(//uu" 5 5 5
	5.u55LE55& 	5 	5 	55)%00u%%f&A1'3 '3 4 4 4 4* 5 5 5-&&,fUmm5 5 554 4 4 4 4	55 MM% /qSabb	f8,. . 	/ 	/ 	/
MM-\22333 q[((ue5=sx   +B> >E
>DE
7EE
	E
	H K,H?>K?K>JK7KKKKKKc                    	 t                      }	 t          |           \  }} |                    |           | r?|j                            t	          j        d                    |                                ny# t          j        $ rg}t          |           }t          |          }|j                            t	          j        d                    |                               Y d }~nd }~ww xY w|S )NzUnexpected {!r}zInvalid msg-id: {!r})
r  r[  r   r   r   ro  r1   r  r  r  )r   
message_idrF   exs       r   parse_message_idr_  I  s#   J2!%((u%     	2%%f&@!((//'1 '1 2 2 2 " K K K ''%e,,
!!&'='D'DR'H'HII	K 	K 	K 	K 	K 	K 	K 	KK s   'A: :C0	AC++C0c                    	 t                      }| s.|j                            t          j        d                     |S | d         t
          v rUt          |           \  }} |                    |           | s,|j                            t          j        d                     d}| rM| d         dk    rA| d         t
          vr2|| d         z  }| dd          } | r| d         dk    r| d         t
          v2|                                sc|j                            t          j        d	                    |                               |                    t          |d                     n7t          |          |_        |                    t          |d	                     | r6| d         t
          v r't          |           \  }} |                    |           | r| d         dk    rZ|j        ,|j                            t          j        d
                     | r#|                    t          | d                     |S |                    t          dd                     | dd          } | r6| d         t
          v r't          |           \  }} |                    |           | s5|j        ,|j                            t          j        d
                     |S d}| r5| d         t
          vr&|| d         z  }| dd          } | r| d         t
          v&|                                sc|j                            t          j        d	                    |                               |                    t          |d                     n7t          |          |_        |                    t          |d	                     | r6| d         t
          v r't          |           \  }} |                    |           | rO|j                            t          j        d                     |                    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)rG  r   r   r   HeaderMissingRequiredValuer  r  isdigitro  r1   r  intrH  rI  )r   mime_versionrF   ra  s       r   parse_mime_versionrf  e  s   
 ==L ##F$E3%5 %5 	6 	6 	6Qx;uE""" 	E ''(IB)D )D E E EF
 E!HOOa(C(C%(abb	  E!HOOa(C(C >> =##F$>?FFvNN%P %P 	Q 	Q 	QM&'::;;;; [[M&(;;<<< #q[((uE""" E!HOO) ''(BB)D )D E E E 	?eW = =>>>c+>??@@@!""IE #q[((uE""" ) ''(BB)D )D E E EF
 E!HK//%(abb	  E!HK// >> =##F$>?FFvNN%P %P 	Q 	Q 	QM&'::;;;; [[M&(;;<<< #q[((uE""" ;##F$>5%7 %7 	8 	8 	8M%99:::r   c                 4   	 t                      }| r| d         dk    rx| d         t          v r4|                    t          | d         d                     | dd          } n't	          |           \  }} |                    |           | r| d         dk    x|| fS )Nr   rG  r  r   )rV  r  r   r  r  )r   invalid_parameterrF   s      r   get_invalid_parameterri    s     )**
 ,E!HOO8{""$$]583F&H &H I I I!""IEE%e,,LE5$$U+++  ,E!HOO e##r   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nzexpected ttext but found '{}'ttext)_non_token_end_matcherr   r  r1   r   r   r  r  )r   r  rk  s      r   	get_ttextrm    s     	u%%A ;%+22599; ; 	;GGIIE#e**++E%))EE%<r   c                    	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     t          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS Nr   zexpected token but found '{}')	r   r  r  r   
TOKEN_ENDSr   r  r1   rm  )r   mtokenrF   s      r   	get_tokenrr    s     WWF q[((ue ;qZ''%+22599; ; 	;U##LE5
MM% q[((ue5=r   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nz expected attrtext but found {!r}r\  )_non_attribute_end_matcherr   r  r1   r   r   r  r  r   r  r\  s      r   get_attrtextrv    s     	#5))A >%.55e<<> > 	>wwyyH#h--..!EXz22HHU?r   c                    	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     t          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS ro  )	rY  r  r  r   ATTRIBUTE_ENDSr   r  r1   rv  r   rZ  rF   s      r   get_attributerz    s     I  q[((u ;q^++%+22599; ; 	;&&LE5U  q[((uer   c                    	 t          |           }|s't          j        d                    |                     |                                }| t          |          d          } t          |d          }t          |           || fS )Nz)expected extended attrtext but found {!r}extended-attrtext)#_non_extended_attribute_end_matcherr   r  r1   r   r   r  r  ru  s      r   get_extended_attrtextr~  	  s     	,E22A G%7>>uEEG G 	GwwyyH#h--..!EX':;;HHU?r   c                    	 t                      }| r6| d         t          v r't          |           \  }} |                    |           | r6| d         t          v r't          j        d                    |                     t          |           \  }} |                    |           | r6| d         t          v r't          |           \  }} |                    |           || fS ro  )	rY  r  r  r   EXTENDED_ATTRIBUTE_ENDSr   r  r1   r~  ry  s      r   get_extended_attributer  !	  s     I  q[((u ;q444%+22599; ; 	;(//LE5U  q[((uer   c                    	 t                      }| r| d         dk    r't          j        d                    |                     |                    t          dd                     | dd          } | r| d                                         s't          j        d                    |                     d}| rK| d                                         r1|| d         z  }| dd          } | r| d                                         1|d         dk    r2|dk    r,|j                            t          j        d	                     t          |          |_
        |                    t          |d
                     || fS )Nr   *zExpected section but found {}zsection-markerr   z$Expected section number but found {}r"   0z'section number has an invalid leading 0ra  )r`  r   r  r1   r   r  rc  r   ro  rd  rP  )r   ra  ra  s      r   get_sectionr  7	  s    iiG 0E!HOO%&E&L&L(-'/ '/ 0 0 	0NN=&677888!""IE @a((** @% '117@ @ 	@F
 E!H$$&& %(abb	  E!H$$&&  ayCFcMMv99 ;  ; 	< 	< 	<[[GNNN=22333E>r   c                    	 t                      }| st          j        d          d }| d         t          v rt	          |           \  }} | s't          j        d                    |                    | d         dk    rt          |           \  }} nt          |           \  }} ||g|d d<   |                    |           || fS )Nz&Expected value but found end of stringr   z Expected value but found only {}r   )	rc  r   r  r  r  r1   r  r  r   )r   vr  rF   s       r   	get_valuer  U	  s     	A P%&NOOOFQx;  @% '006v@ @ 	@Qx3(//uu-e44uHbqb	HHUOOOe8Or   c                 T   	 t                      }t          |           \  }} |                    |           | r| d         dk    rC|j                            t	          j        d                    |                               || fS | d         dk    r	 t          |           \  }} d|_        |                    |           n# t          j	        $ r Y nw xY w| st	          j	        d          | d         dk    r4|                    t          dd                     | dd          } d|_        | d         d	k    rt	          j	        d
          |                    t          d	d                     | dd          } d }| r6| d         t          v r't          |           \  }} |                    |           d }|}|j        r| r| d         dk    rt          |           \  }}|j        }d}|j        dk    r4|r|d         dk    rd}nBt#          |          \  }}	|	r|	d         dk    rd}n	 t%          |          \  }}	|	sd}n#  Y nxY w|r_|j                            t	          j        d                     |                    |           |D ]}
|
j        dk    rg |
d d <   |
} n|} n.d }|j                            t	          j        d                     | r| d         dk    rd }nt)          |           \  }} |j        r|j        dk    rW| r| d         dk    r|                    |           ||} || fS |j                            t	          j        d                     | sI|j                            t	          j        d                     |                    |           ||| fS nC|>|D ]}
|
j        dk    r n|
j        dk     |                    |
           |
j        |_        | d         dk    r't	          j	        d                    |                     |                    t          dd                     | dd          } | rt| d         dk    rht#          |           \  }} |                    |           |j        |_        | r| d         dk    r't	          j	        d                    |                     |                    t          dd                     | dd          } |t1                      }| rr| d         t2          v rt5          |           \  }} n9| d         dk    rt          dd          }| dd          } nt7          |           \  }} |                    |           | r|}nt)          |           \  }} |                    |           ||} || fS )Nr   rG  z)Parameter contains name ({}) but no valuer  TzIncomplete parameterzextended-parameter-markerr   =zParameter not followed by '='parameter-separatorr   F'z5Quoted string value for extended parameter is invalidr   zZParameter 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 delimitersr|  r\  z=Expected RFC2231 char/lang encoding delimiter, but found {!r}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}DQUOTE)rK  rz  r   r   r   ro  r1   r  rO  r  r  rT  r  r  r  r   rQ  rv  r~  rX   r  r   r   r   rc  r  r  r  )r   r  rF   r  r  appendtoqstringinner_value
semi_validr  tr  s               r   get_parameterr  k	  s    KKE ''LE5	LL E!HOOV7 9%%+VE]]4 4 	5 	5 	5e|Qx3	&u--LE5"EOLL& 	 	 	D	 	B)*@AAA8s??LLs,GHHIII!""IE!ENQx3%&EFFF	LLs$9::;;;!""IEF q[((uUIH~ $<% $<E!HOO /u55,
1$$ &{1~44!

*;77t &DGsNN!%J&3K@@t  &!%J	  	<M  !;G"I "I J J JLL!!!  <#777AaaaD HE 8  EEIM  !;:"; "; < < <  (qS ''u> 	FU1A55 	 aCOOE"""$!%<V7DE E 	F 	F 	F  V768 8 	9 	9 	9%<    <#666E 7LJ&&OOAGEM8s??) +FFLfUmmU U Uc+>??@@@abb	 	KU1X__'..LE5OOE"""EJ KE!HOO- /<<BF5MMK K Kc+>??@@@abb	GG 	Qx3&u~~uuqS%c844abb	+E22uHHUOOO  	  ''uOOE%<s   .C CC-I Ic                 $   	 t                      }| r	 t          |           \  }} |                    |           n# t          j        $ r}d }| d         t
          v rt          |           \  }} | s|                    |           |cY d }~S | d         dk    rD||                    |           |j                            t          j        d                     npt          |           \  }} |r|g|d d<   |                    |           |j                            t          j        d
                    |                               Y d }~nd }~ww xY w| r| d         dk    ru|d         }d|_        t          |           \  }} |                    |           |j                            t          j        d
                    |                               | r-|                    t          dd                     | d	d          } | |S )
Nr   rG  zparameter entry with no contentzinvalid parameter {!r}r   rW  z)parameter with invalid trailing text {!r}r  r   )rf  r  r   r   r  r  r  r   ro  ri  r1   rX   rD   r  )r   mime_parametersrF   rS  r  r  s         r   parse_mime_parametersr  	  sl    %&&O
 #	=(//LE5""5))))& 	= 	= 	=FQx;&& ( '&&v...&&&&&&&Qx3%#**6222'..v/I507 07 8 8 8 8  5U;;u )!'E"1"I&&u---'..v/I,33E::0< 0< = = =#	=&  	LU1X__ $B'E2E077LE5LL#**6+E;BB5II,K ,K L L L 	""=6K#L#LMMM!""IEG  #H s"   '= E;EEC EEc                    	 |r|d         dk    rx|d         t           v r4|                     t          |d         d                     |dd          }n't          |          \  }}|                     |           |r|d         dk    x|sd S |                     t          dd                     |                     t	          |dd                               d S )Nr   rG  r  r   r  )r  r   r  r  r  )	tokenlistr   rF   s      r   _find_mime_parametersr  -
  s      $E!HOO8{""]585HIIJJJ!""IEE%e,,LE5U###  $E!HOO  ]3(=>>???*595566666r   c                    	 t                      }d}| s.|j                            t          j        d                     |S 	 t          |           \  }} nf# t          j        $ rT |j                            t          j        d                    |                                t          ||            |cY S w xY w|                    |           | r| d         dk    r@|j                            t          j        d                     | rt          ||            |S |j
                                                                        |_        |                    t          dd                     | dd          } 	 t          |           \  }} nf# t          j        $ rT |j                            t          j        d	                    |                                t          ||            |cY S w xY w|                    |           |j
                                                                        |_        | s|S | d         d
k    rU|j                            t          j        d                    |                                |`|`t          ||            |S |                    t          d
d                     |                    t!          | dd                               |S )NFz"Missing content type specificationz(Expected content maintype but found {!r}r   r  zInvalid content typezcontent-type-separatorr   z'Expected content subtype but found {!r}rG  z<Only parameters are valid after content type, but found {!r}r  )r  r   r   r   rb  rr  r  ro  r1   r  r   rl  lowerr  r  r  r  )r   ctyperecoverrF   s       r   parse_content_type_headerr  =
  s    MMEG V>02 2 	3 	3 	3 ''uu"   V76==eDDF F 	G 	G 	GeU+++	
 
LL  E!HOOV7"$ $ 	% 	% 	% 	0!%///[&&((..00EN	LLs$<==>>>!""IE ''uu"   V75<<UCCE E 	F 	F 	FeU+++	
 
LLK%%''--//EM Qx3V7( ( 	) 	) 	) NEMeU+++	LLs$9::;;;	LL&uQRRy11222Ls&   A A B98B9=F A G32G3c                 ^   	 t                      }| s.|j                            t          j        d                     |S 	 t          |           \  }} nf# t          j        $ rT |j                            t          j        d                    |                                t          ||            |cY S w xY w|                    |           |j
                                                                        |_        | s|S | d         dk    rQ|j                            t          j        d                    |                                t          ||            |S |                    t          dd                     |                    t          | dd                               |S )NzMissing content dispositionz+Expected content disposition but found {!r}r   rG  zCOnly parameters are valid after content disposition, but found {!r}r  r   )r  r   r   r   rb  rr  r  ro  r1   r  r   rl  r  r  r  r  )r   disp_headerrF   s      r    parse_content_disposition_headerr  v
  s    %&&K ""6#D)$+ $+ 	, 	, 	, ''uu"   ""6#=9@@GG$I $I 	J 	J 	Jk5111	
 u&+k&7&7&9&9&?&?&A&AK# Qx3""6#=$( $( 	) 	) 	) 	k5111}S*?@@AAA,U122Y77888s   A A B76B7c                    	 t                      }| s.|j                            t          j        d                     |S 	 t          |           \  }} |                    |           |j                                                                        |_	        nT# t          j
        $ rB |j                            t          j        d                    |                                Y nw xY w| s|S | r|j                            t          j        d                     | d         t          v r4|                    t          | d         d                     | dd          } n't          |           \  }} |                    |           | |S )Nz!Missing content transfer encodingz1Expected content transfer encoding but found {!r}z*Extra text after content transfer encodingr   r  r   )r  r   r   r   rb  rr  r   rl  r  r   r  ro  r1   r  r  r  )r   
cte_headerrF   s      r   &parse_content_transfer_encoding_headerr  
  s    )**J !!&"C/#1 #1 	2 	2 	25 ''u
 	%   **,,2244
 " P P P!!&"<?FFuMM#O #O 	P 	P 	P 	P 	PP  
 %!!&"<8#: #: 	; 	; 	;8{""mE!H6IJJKKK!""IEE%e,,LE5e$$$  % s   B AC*)C*c                     d}| r>| d         r6| d         d         t           v r!| d         d         }| d         d d         | d<   |S )Nr"   r   )r  )lineswsps     r   _steal_trailing_WSP_if_existsr  
  sS    
C #r #uRy}33Bim"IcrcNb	Jr   c                   	 |j         pt          j        }|j        rdnd}dg}d }d}d}t	          dd          }t          |           }	|	r|	                    d          }
|
|u r|dz  }"t          |
          }|
j        dk    rt          |          t          z  rd	}	 |                    |           |}n5# t          $ r( t          d
 |
j        D                       rd}nd}d	}Y nw xY w|
j        dk    rt          |
|||           |r|s|
j        sd}d }|
j        r|
                    |          d t'          |j                            }|j        |vr_t'          |          |t'          |d                   z
  k    r$t+          |          }|                    |           |dxx         |z  cc<   pt/          |
d          st          |
          |	z   }	nt1          |||||
j        |          }d}t'          |          |t'          |d                   z
  k    r|dxx         |z  cc<   |
j        rWt'          |          dz   |k    rAt+          |          }|s|
                                r|                    ||z              d }It/          |
d          s7t          |
          }|
j        s|dz  }|                    |           ||	z   }	|
j        r|s|	                    d|
           d	}t+          |          }|s|
                                r|                    ||z              n|dxx         |z  cc<   |	|j                            |          |j        z   S )Nutf-8rM  r"   r   Fwrap_as_ew_blockedr   rD  Tc              3   J   K   | ]}t          |t          j                  V  d S r   )r;  r   rw  r%   s     r   r(   z%_refold_parse_tree.<locals>.<genexpr>
  sC       . . a!>?? . . . . . .r   unknown-8bitrg  rH   r   r  )max_line_lengthsysmaxsizeutf8r  r  r1  r   rX   r(  r  r  ru  r@  r9   _fold_mime_parametersr@   r^   rL   r   r  r  r   rY   _fold_as_ewr_   r=   insertr+   )
parse_treerI   maxlenrk  r  last_ewr  want_encodingend_ew_not_allowedr{  rA   tstrr   encoded_partnewlinenewpartss                   r   rJ   rJ   
  s"    #2s{F +5ww:HDEGM!"&:;;E
 Wyy||%%%!#4yy?g%%#d))h*>% M	!KK!!!GG! 	! 	! 	! . . ,. . . . . "( " MMM	! ?///!$vx@@@ 	!3 	% ! %' 
!#'99F9#;#;<Qc&.>Q>Q=Q<Q#RL~\99|,,vE"I/FFF&CE&J&JG!LL111b			\1			 
 4** HT

U* &dE67&*&=wH H!Mt99U2Y///"IIIIII   	D		A''3E::G $--// Wt^,,,tX&& 	DzzH% 4"a'" 2333u$E 	&8 	 LLD!!! M/66 	d))++ 	LL4(((( "IIIIIIo  Wp >u%%66s   B6 6/C('C(c                 z   	 |B|r@t          t          |d         |d          | z                       } |d         d |         |d<   | d         t          v r]| d         }| dd          } t          |d                   |k    r"|                    t          |                     |dxx         |z  cc<   d}| d         t          v r| d         }| d d         } |t          |d                   n|}|dk    rdn|}	t          |	          dz   }
|
dz   |k    rt          j        d          | r|t          |d                   z
  }||
z
  }|dk    r|                    d	           ;| d |         }t          j	        ||	
          }t          |          |z
  }|dk    r8|d d         }t          j	        ||	
          }t          |          |z
  }|dk    8|dxx         |z  cc<   | t          |          d          } | r*|                    d	           t          |d                   }| |dxx         |z  cc<   |r|nd S )Nr   r   r   r"   rM  r     z3max_line_length is too small to fit an encoded wordrg   )r   )
r   r  r  r   r   r  r   r  r  r  )	to_encoder  r  r  r_   r   leading_wsptrailing_wspnew_last_ew	encode_as
chrome_lenremaining_space
text_spaceto_encode_wordencoded_wordexcesss                   r   r  r  1  s   	 1U2Ywxx09<==? ?	"Ihwh'b	|s  labbM	b	NNf$$LL6u==>>>b			[ 			L} }crcN	$+O#eBi...K"j00gI Y!#JQ6!!%AC C 	C  ) 3uRy>>1$z1
??LL";J;/z.)DDD\""_4qjj ,CRC0N:niHHHL&&8F qjj 	b			\!			c.11223	 	)LLeBi..K+  ), 
"IIIIII,6;;$6r   c           	         	 | j         D ]O\  }}|d                                                             d          s|dxx         dz  cc<   |}d}	 |                    |           d}n-# t          $ r  d}t          j        |          rd}d}nd}Y nw xY w|r:t          j        	                    |d	|
          }	d
                    |||	          }
n#d
                    |t          |                    }
t          |d                   t          |
          z   dz   |k     r|d         dz   |
z   |d<   +t          |
          dz   |k    r|                    d|
z              [d}|dz   }|rt          |          t          t          |                    z   dz   t          |          z   }||dz   k    rd}||z
  dz
  x}}	 |d |         }t          j        	                    |d	|
          }	t          |	          |k    rn|dz  }F|                    d
                    ||||	                     d	}|dz  }||d          }|r|dxx         dz  cc<   |Qd S )Nr   rG  strictFTr  rj  r  r"   )safer   z
{}*={}''{}r  r   rg   r   r   z''r"  N   z {}*{}*={}{})ry  r$  r]  r  ru  r   rv  rp  rq  r   r1   r   r   r   r   )rA   r  r  rk  rz  r   r   error_handlerencoding_requiredencoded_valuer  ra  extra_chromer  
splitpointmaxcharspartials                    r   r  r  r  s    { :! :!e Ry!!**3// 	"IIIIII 		"LL""" %! 	" 	" 	" $$U++ "( 1!	"  	="L..B} / 6 6M&&tWmDDDD>>$U(;(;<<DuRy>>CII%)F22b	C$.E"IYY]f$$LLt$$$ ~ 	!TSW%6%66:S=N=NNJa''
 $*Z$7!$;;J , & 2 2"] !3 !< !<}%%11a
  LL..g|]< < = = =LqLG*++&E !b			S 			-  	!I:! :!s   A))'BB)rer  rp  stringr   operatorr   emailr   r  r   r   r(  r  r  r  r  r)  r  	TSPECIALSrp  	ASPECIALSrx  r  r   compileVERBOSE	MULTILINEr  r  r   rd   rp   rt   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/  r6  rA  rG  rK  rV  rY  r`  rc  rf  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r:  r0  r1  r1   r+   r  r  r  matchr  findallr  rl  rt  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-  r3  r8  r:  r=  rA  rE  rI  rL  rN  rP  rT  rW  r[  r_  rf  ri  rm  rr  rv  rz  r~  r  r  r  r  r  r  r  r  r  r  rJ   r  r  rh   r   r   <module>r     sa  CJ 
			 



              ' ' ' ' ' '             
c%jjCCHHn3  sN	CCHH$U#E

"cc#hh.	_
E

"	S(33s883 H H H "*  Z",   @, @, @, @, @, @, @, @,FD D D D D) D D D         I          Y       9       "       9       I   
    )   # # # # #9 # # #6	- 	- 	- 	- 	-| 	- 	- 	-    !   4C C C C C) C C C&% % % % %i % % %2? ? ? ? ?) ? ? ?% % % % %	 % % %"$ $ $ $ $I $ $ $*" " " " "y " " "6    	   DD D D D Dy D D D! ! ! ! !i ! ! !6; ; ; ; ;Y ; ; ;. . . . .Y . . .    i       )   
    I   
    y   B    9   '! '! '! '! '!& '! '! '!T! ! ! ! !	 ! ! !H    I        )       	   8% % % % %y % % %
# # # # #	 # # #    i       I   S. S. S. S. S.Y S. S. S.l    y       *       1       i       )   
* * * * *I * * *       & & & & &y & & &    Y   (+ (+ (+ (+ (+s (+ (+ (+V           H       -   < < < < <f- < < < mCc#344$}S*BCC . 
:,,RWWS\\::;;A"
9#3#3BIbggi  !!$# $# $ $$) "
#566> #I$4$4BIbggj!!""%$ %$ % %%* 'RZ	(8(8BIbggn%%&&)( )( ) )). &0bj1A1ABIbgg-..//21 21 '2 '227 $; ; ;J J J<
 
 
/ / /bA A AF  "     )) )) ))V  2       $  6     &  2     D$ $ $L% % %N-! -! -!^  (  %! %! %!N$ $ $L   '  '  ' R, , ,\    <  *" " "$6 6 6r# # #J  <  :4 4 4n& & &,B B BJ  8B B BH$ $ $$  &  .  &  .  $  ,  <  ,L L L\2 2 2h7 7 7 7 7 7r  <  ^  e7 e7 e7N?7 ?7 ?7BI! I! I! I! I!r   