a XC?h��� @s�ddlZddlZddlZddlmZddlmZddlmZ ddlm Z ddlm Z e d�Z e e d�BZe d �Zee BZee d �Zee d �Zee d �Be d �Zee BZee d �BZee BZee d�ZddhZeeBZdd�Zdd�Ze�dejejB�ZGdd�de �Z!Gdd�de!�Z"Gdd�de!�Z#Gdd�de!�Z$Gdd�de!�Z%Gd d!�d!e"�Z&Gd"d#�d#e!�Z'Gd$d%�d%e!�Z(Gd&d'�d'e!�Z)Gd(d)�d)e!�Z*Gd*d+�d+e*�Z+Gd,d-�d-e"�Z,Gd.d/�d/e!�Z-Gd0d1�d1e!�Z.Gd2d3�d3e!�Z/Gd4d5�d5e!�Z0Gd6d7�d7e!�Z1Gd8d9�d9e!�Z2Gd:d;�d;e!�Z3Gdd?�d?e!�Z5Gd@dA�dAe!�Z6GdBdC�dCe!�Z7GdDdE�dEe!�Z8GdFdG�dGe!�Z9GdHdI�dIe!�Z:GdJdK�dKe!�Z;GdLdM�dMe!�ZGdRdS�dSe!�Z?GdTdU�dUe!�Z@GdVdW�dWe!�ZAGdXdY�dYeA�ZBGdZd[�d[e!�ZCGd\d]�d]e!�ZDGd^d_�d_e!�ZEGd`da�dae!�ZFGdbdc�dce!�ZGGddde�deeG�ZHGdfdg�dgeG�ZIGdhdi�die!�ZJGdjdk�dke!�ZKGdldm�dme!�ZLGdndo�doeL�ZMGdpdq�dqeM�ZNGdrds�dse!�ZOGdtdu�dueP�ZQGdvdw�dweQ�ZRGdxdy�dyeQ�ZSGdzd{�d{eR�ZTGd|d}�d}e jU�ZVeSd d~�ZWeSdd��ZXeSd�d��ZYe�d��Zd��[e ���j\Z]e�d��Ze�^d��[e����j_Z`e�d��jaZbe�d��Ze�^d��[e����j_Zce�d��Ze�^d��[e����j_Zde�d��Ze�^d��[e����j_Zed�d��Zfd�d��Zgd�d��Zhd�d�d��Zid�d��Zjd�d��Zkd�d��Zld�d��Zmd�d��Znd�d��Zod�d��Zpd�d��Zqd�d��Zrd�d��Zsd�d��Ztd�d��Zud�d��Zvd�d��Zwd�d��Zxd�d��Zyd�d��Zzd�d��Z{d�d��Z|d�d��Z}d�d��Z~d�d��Zd�d��Z�d�d��Z�d�d��Z�d�dÄZ�d�dÅ„Z�d�dÇ„Z�d�dÉ„Z�d�dË„Z�d�dÍ„Z�d�dÏ„Z�d�dÑ„Z�d�dÓ„Z�d�dÕ„Z�d�dׄZ�d�dÙ„Z�d�dÛ„Z�d�dÝ„Z�d�dß„Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d�Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�dS)��N)� hexdigits)� itemgetter)�_encoded_words)�errors)�utilsz �(z ()<>@,:;.\"[]�.z."(z/?=z*'%�%� � cCst|��dd��dd�S)N�\�\\�"z\")�str�replace��value�r�?/opt/alt/python39/lib64/python3.9/email/_header_value_parser.py�make_quoted_pairscsrcCst|�}d|�d�S)Nr)r)rZescapedrrr� quote_stringhsrz� =\? # literal =? [^?]* # charset \? # literal ? [qQbB] # literal 'q' or 'b', case insensitive \? # literal ? .*? # encoded word \?= # literal ?= cs�eZdZdZdZdZ�fdd�Zdd�Z�fdd�Ze d d ��Z e d d ��Z d d�Z e dd��Z e dd��Zdd�Zddd�Zddd�Zddd�Z�ZS)� TokenListNTcst�j|i|��g|_dS�N)�super�__init__�defects)�self�args�kw�� __class__rrr�szTokenList.__init__cCsd�dd�|D��S)N�css|]}t|�VqdSr�r��.0�xrrr� ��z$TokenList.__str__..��join�rrrr�__str__�szTokenList.__str__csd�|jjt����S�Nz{}({})��formatr �__name__r�__repr__r*rrrr0�s �zTokenList.__repr__cCsd�dd�|D��S)Nr!css|]}|jr|jVqdSrrr#rrrr&�r'z"TokenList.value..r(r*rrrr�szTokenList.valuecCstdd�|D�|j�S)Ncss|] }|jVqdSr)� all_defectsr#rrrr&�r'z(TokenList.all_defects..)�sumrr*rrrr1�szTokenList.all_defectscCs |d��S�Nr)�startswith_fwsr*rrrr4�szTokenList.startswith_fwscCstdd�|D��S)Ncss|] }|jVqdSr)� as_ew_allowed)r$�partrrrr&�r'z*TokenList.as_ew_allowed..)�allr*rrrr5�szTokenList.as_ew_allowedcCsg}|D]}|�|j�q|Sr)�extend�comments)rr9�tokenrrrr9�szTokenList.commentscCs t||d�S)N��policy)�_refold_parse_tree�rr<rrr�fold�szTokenList.foldr!cCst|j|d��dS)N��indent)�print�ppstr�rrArrr�pprint�szTokenList.pprintcCsd�|j|d��S)Nr r@)r)�_pprDrrrrC�szTokenList.ppstrccszd�||jj|j�V|D]4}t|d�s:|d�|�Vq|�|d�EdHq|jrdd�|j�}nd}d�||�VdS)Nz{}{}/{}(rFz* !! invalid element in token list: {!r}z z Defects: {}r!z{}){})r.r r/� token_type�hasattrrFr)rrAr:ZextrarrrrF�s� � z TokenList._pp)r!)r!)r!)r/� __module__� __qualname__rG�syntactic_break�ew_combine_allowedrr+r0�propertyrr1r4r5r9r?rErCrF� __classcell__rrrrr}s&        rc@s$eZdZedd��Zedd��ZdS)�WhiteSpaceTokenListcCsdS�N� rr*rrrr�szWhiteSpaceTokenList.valuecCsdd�|D�S)NcSsg|]}|jdkr|j�qS)�comment)rG�contentr#rrr� �r'z0WhiteSpaceTokenList.comments..rr*rrrr9�szWhiteSpaceTokenList.commentsN)r/rIrJrMrr9rrrrrO�s rOc@seZdZdZdS)�UnstructuredTokenList� unstructuredN�r/rIrJrGrrrrrU�srUc@seZdZdZdS)�Phrase�phraseNrWrrrrrX�srXc@seZdZdZdS)�WordZwordNrWrrrrrZ�srZc@seZdZdZdS)�CFWSList�cfwsNrWrrrrr[�sr[c@seZdZdZdS)�Atom�atomNrWrrrrr]�sr]c@seZdZdZdZdS)�Tokenr:FN)r/rIrJrGZ encode_as_ewrrrrr_�sr_c@seZdZdZdZdZdZdS)� EncodedWord� encoded-wordN)r/rIrJrG�cte�charset�langrrrrr`�sr`c@s4eZdZdZedd��Zedd��Zedd��ZdS) � QuotedString� quoted-stringcCs"|D]}|jdkr|jSqdS�N�bare-quoted-string�rGr�rr%rrrrS�s zQuotedString.contentcCs>g}|D]*}|jdkr&|�t|��q|�|j�qd�|�S)Nrhr!)rG�appendrrr))r�resr%rrr� quoted_value�s  zQuotedString.quoted_valuecCs"|D]}|jdkr|jSqdSrgri�rr:rrr�stripped_value�s zQuotedString.stripped_valueN)r/rIrJrGrMrSrmrorrrrre�s  rec@s$eZdZdZdd�Zedd��ZdS)�BareQuotedStringrhcCstd�dd�|D���S)Nr!css|]}t|�VqdSrr"r#rrrr& r'z+BareQuotedString.__str__..)rr)r*rrrr+ szBareQuotedString.__str__cCsd�dd�|D��S)Nr!css|]}t|�VqdSrr"r#rrrr&r'z)BareQuotedString.value..r(r*rrrr szBareQuotedString.valueN)r/rIrJrGr+rMrrrrrrpsrpc@s8eZdZdZdd�Zdd�Zedd��Zedd ��Zd S) �CommentrRcs(d�tdg�fdd��D�dggg��S)Nr!rcsg|]}��|��qSr)�quoter#r*rrrTr'z#Comment.__str__..�))r)r2r*rr*rr+s��zComment.__str__cCs2|jdkrt|�St|��dd��dd��dd�S)NrRr r rz\(rsz\))rGrr)rrrrrrrs ��z Comment.quotecCsd�dd�|D��S)Nr!css|]}t|�VqdSrr"r#rrrr&%r'z"Comment.content..r(r*rrrrS#szComment.contentcCs|jgSr)rSr*rrrr9'szComment.commentsN) r/rIrJrGr+rrrMrSr9rrrrrqs rqc@s4eZdZdZedd��Zedd��Zedd��ZdS) � AddressListz address-listcCsdd�|D�S)NcSsg|]}|jdkr|�qS)�address�rGr#rrrrT1r'z)AddressList.addresses..rr*rrr� addresses/szAddressList.addressescCstdd�|D�g�S)Ncss|]}|jdkr|jVqdS�ruN�rG� mailboxesr#rrrr&5s �z(AddressList.mailboxes..�r2r*rrrrz3s ��zAddressList.mailboxescCstdd�|D�g�S)Ncss|]}|jdkr|jVqdSrx�rG� all_mailboxesr#rrrr&:s �z,AddressList.all_mailboxes..r{r*rrrr}8s ��zAddressList.all_mailboxesN)r/rIrJrGrMrwrzr}rrrrrt+s  rtc@s4eZdZdZedd��Zedd��Zedd��ZdS) �AddressrucCs|djdkr|djSdS)Nr�group�rG� display_namer*rrrr�BszAddress.display_namecCs4|djdkr|dgS|djdkr*gS|djS�Nr�mailbox�invalid-mailboxryr*rrrrzGs  zAddress.mailboxescCs:|djdkr|dgS|djdkr0|dgS|djSr�r|r*rrrr}Os   zAddress.all_mailboxesN)r/rIrJrGrMr�rzr}rrrrr~>s  r~c@s(eZdZdZedd��Zedd��ZdS)� MailboxList� mailbox-listcCsdd�|D�S)NcSsg|]}|jdkr|�qS)r�rvr#rrrrT]r'z)MailboxList.mailboxes..rr*rrrrz[szMailboxList.mailboxescCsdd�|D�S)NcSsg|]}|jdvr|�qS))r�r�rvr#rrrrTas �z-MailboxList.all_mailboxes..rr*rrrr}_szMailboxList.all_mailboxesN�r/rIrJrGrMrzr}rrrrr�Ws  r�c@s(eZdZdZedd��Zedd��ZdS)� GroupList� group-listcCs |r|djdkrgS|djS�Nrr�ryr*rrrrziszGroupList.mailboxescCs |r|djdkrgS|djSr�r|r*rrrr}oszGroupList.all_mailboxesNr�rrrrr�es  r�c@s4eZdZdZedd��Zedd��Zedd��ZdS) �GrouprcCs|djdkrgS|djS�N�r�ryr*rrrrzzszGroup.mailboxescCs|djdkrgS|djSr�r|r*rrrr}�szGroup.all_mailboxescCs |djSr3)r�r*rrrr��szGroup.display_nameN)r/rIrJrGrMrzr}r�rrrrr�vs  r�c@sLeZdZdZedd��Zedd��Zedd��Zedd ��Zed d ��Z d S) �NameAddr� name-addrcCst|�dkrdS|djS�N�r)�lenr�r*rrrr��s zNameAddr.display_namecCs |djS�N������� local_partr*rrrr��szNameAddr.local_partcCs |djSr���domainr*rrrr��szNameAddr.domaincCs |djSr�)�router*rrrr��szNameAddr.routecCs |djSr��� addr_specr*rrrr��szNameAddr.addr_specN� r/rIrJrGrMr�r�r�r�r�rrrrr��s    r�c@s@eZdZdZedd��Zedd��Zedd��Zedd ��Zd S) � AngleAddrz angle-addrcCs"|D]}|jdkr|jSqdS�N� addr-spec)rGr�rjrrrr��s zAngleAddr.local_partcCs"|D]}|jdkr|jSqdSr��rGr�rjrrrr��s zAngleAddr.domaincCs"|D]}|jdkr|jSqdS)N� obs-route)rG�domainsrjrrrr��s zAngleAddr.routecCs<|D]2}|jdkr|jr"|jSt|j�|jSqdS)Nr�z<>)rGr�r�rrjrrrr��s   zAngleAddr.addr_specN) r/rIrJrGrMr�r�r�r�rrrrr��s   r�c@seZdZdZedd��ZdS)�ObsRouter�cCsdd�|D�S)NcSsg|]}|jdkr|j�qSr�r�r#rrrrT�r'z$ObsRoute.domains..rr*rrrr��szObsRoute.domainsN)r/rIrJrGrMr�rrrrr��sr�c@sLeZdZdZedd��Zedd��Zedd��Zedd ��Zed d ��Z d S) �Mailboxr�cCs|djdkr|djSdS�Nrr�r�r*rrrr��szMailbox.display_namecCs |djSr3r�r*rrrr��szMailbox.local_partcCs |djSr3r�r*rrrr��szMailbox.domaincCs|djdkr|djSdSr�)rGr�r*rrrr��sz Mailbox.routecCs |djSr3r�r*rrrr��szMailbox.addr_specNr�rrrrr��s    r�c@s,eZdZdZedd��ZeZZZZ dS)�InvalidMailboxr�cCsdSrrr*rrrr��szInvalidMailbox.display_nameNr�rrrrr��s r�cs(eZdZdZdZe�fdd��Z�ZS)�Domainr�Fcsd�t�j���S�Nr!�r)rr�splitr*rrrr��sz Domain.domain)r/rIrJrGr5rMr�rNrrrrr��sr�c@seZdZdZdS)�DotAtom�dot-atomNrWrrrrr�sr�c@seZdZdZdZdS)� DotAtomTextz dot-atom-textTN�r/rIrJrGr5rrrrr�sr�c@seZdZdZdZdS)� NoFoldLiteralzno-fold-literalFNr�rrrrr� sr�c@sDeZdZdZdZedd��Zedd��Zedd��Zed d ��Z d S) �AddrSpecr�FcCs |djSr3r�r*rrrr�szAddrSpec.local_partcCst|�dkrdS|djS)N�r�)r�r�r*rrrr�s zAddrSpec.domaincCs<t|�dkr|djS|dj��|dj|dj��S)Nr�rr�r�)r�r�rstrip�lstripr*rrrrs  zAddrSpec.valuecCsLt|j�}t|�t|t�kr*t|j�}n|j}|jdurH|d|jS|S)N�@)�setr�r�� DOT_ATOM_ENDSrr�)rZnamesetZlprrrr�$s   zAddrSpec.addr_specN) r/rIrJrGr5rMr�r�rr�rrrrr�s   r�c@seZdZdZdZdS)� ObsLocalPartzobs-local-partFNr�rrrrr�0sr�cs4eZdZdZdZedd��Ze�fdd��Z�ZS)� DisplayNamez display-nameFcCs�t|�}t|�dkr|jS|djdkr4|�d�n*|ddjdkr^t|ddd��|d<|djdkrv|��n*|ddjdkr�t|ddd��|d<|jS)Nrr\r�r�)rr�rrG�pop)rrlrrrr�;s   zDisplayName.display_namecs�d}|jrd}n|D]}|jdkrd}qt|�dkr�|r�d}}|djdks`|ddjdkrdd}|djdks�|ddjdkr�d}|t|j�|St�jSdS) NFTrfrr!r\rQr�)rrGr�rr�rr)rrrr%ZpreZpostrrrrLs   zDisplayName.value) r/rIrJrGrLrMr�rrNrrrrr�6s  r�c@s,eZdZdZdZedd��Zedd��ZdS)� LocalPartz local-partFcCs&|djdkr|djS|djSdS)Nrrf)rGrmrr*rrrres zLocalPart.valuecCs�tg}t}d}|dtgD]�}|jdkr,q|r\|jdkr\|djdkr\t|dd��|d<t|t�}|r�|jdkr�|djdkr�|�t|dd���n |�|�|d}|}qt|dd��}|jS)NFrr\�dotr�r�)�DOTrGr� isinstancerkr)rrlZlastZ last_is_tl�tokZis_tlrrrr�ls(  �  � zLocalPart.local_partN)r/rIrJrGr5rMrr�rrrrr�`s  r�cs4eZdZdZdZe�fdd��Zedd��Z�ZS)� DomainLiteralzdomain-literalFcsd�t�j���Sr�r�r*rrrr��szDomainLiteral.domaincCs"|D]}|jdkr|jSqdS)N�ptextrirjrrr�ip�s zDomainLiteral.ip) r/rIrJrGr5rMr�r�rNrrrrr��s r�c@seZdZdZdZdZdS)� MIMEVersionz mime-versionN)r/rIrJrG�major�minorrrrrr��sr�c@s4eZdZdZdZdZdZedd��Zedd��Z dS) � Parameter� parameterF�us-asciicCs|jr|djSdSr�)� sectioned�numberr*rrr�section_number�szParameter.section_numbercCsf|D]\}|jdkr|jS|jdkr|D]4}|jdkr*|D] }|jdkr<|jSqrrrr?[sz MsgID.foldN)r/rIrJrGr5r?rrrrr�Wsr�c@seZdZdZdS)� MessageIDz message-idNrWrrrrr�`sr�c@seZdZdZdS)�InvalidMessageIDzinvalid-message-idNrWrrrrr�dsr�c@seZdZdZdS)�Header�headerNrWrrrrr�hsr�csreZdZdZdZdZ�fdd�Z�fdd�Zdd�Ze dd ��Z d�fd d � Z d d�Z e dd��Z dd�Z�ZS)�TerminalTcst��||�}||_g|_|Sr)r�__new__rGr)�clsrrGrrrrr�vszTerminal.__new__csd�|jjt����Sr,r-r*rrrr0|szTerminal.__repr__cCst|jjd|j�dS)N�/)rBr r/rGr*rrrrEszTerminal.pprintcCs t|j�Sr)�listrr*rrrr1�szTerminal.all_defectsr!c s2d�||jj|jt���|js"dn d�|j��gS)Nz {}{}/{}({}){}r!z {})r.r r/rGrr0rrDrrrrF�s�z Terminal._ppcCsdSrrr*rrr�pop_trailing_ws�szTerminal.pop_trailing_wscCsgSrrr*rrrr9�szTerminal.commentscCst|�|jfSr)rrGr*rrr�__getnewargs__�szTerminal.__getnewargs__)r!)r/rIrJr5rLrKr�r0rErMr1rFrr9rrNrrrrr�ps     r�c@s eZdZedd��Zdd�ZdS)�WhiteSpaceTerminalcCsdSrPrr*rrrr�szWhiteSpaceTerminal.valuecCsdS)NTrr*rrrr4�sz!WhiteSpaceTerminal.startswith_fwsN�r/rIrJrMrr4rrrrr�s rc@s eZdZedd��Zdd�ZdS)� ValueTerminalcCs|Srrr*rrrr�szValueTerminal.valuecCsdS)NFrr*rrrr4�szValueTerminal.startswith_fwsNrrrrrr�s rc@s eZdZedd��Zdd�ZdS)�EWWhiteSpaceTerminalcCsdSr�rr*rrrr�szEWWhiteSpaceTerminal.valuecCsdSr�rr*rrrr+�szEWWhiteSpaceTerminal.__str__N)r/rIrJrMrr+rrrrr�s rc@s eZdZdS)�_InvalidEwErrorN)r/rIrJrrrrr�srr��,�list-separatorr�zroute-component-markerz([{}]+)r!z[^{}]+z[\x00-\x20\x7F]cCs>t|�}|r|j�t�|��t�|�r:|j�t�d��dS)Nz*Non-ASCII characters found in header token)�_non_printable_finderrrkrZNonPrintableDefectrr�r�)�xtextZnon_printablesrrr�_validate_xtext�s  �r cCs�t|d�^}}g}d}d}tt|��D]L}||dkrJ|rDd}d}nd}q&|rTd}n|||vrdq||�||�q&|d}d�|�d�||d�g|�|fS)Nr�Fr Tr!)� _wsp_splitter�ranger�rkr))r�endcharsZfragment� remainderZvchars�escape�had_qp�posrrr�_get_ptext_to_endchars�s$   rcCs.|��}t|dt|�t|��d�}||fS)N�fws)r�rr�)rZnewvaluerrrr�get_fws sr�vtextc Cs�t�}|�d�s t�d�|���|dd��dd�^}}||dd�krXt�d�|���d�|�}t|�dkr�|dtvr�|dtvr�|� d�dkr�|�dd�^}}|d|}t|���dkr�|j � t� d ��||_ d�|�}zt�d|d�\}}} } Wn(ttf�y(td �|j ���Yn0||_| |_|j �| �|�r�|dtv�rpt|�\} }|� | ��qBt|d�^} }t| |�} t| �|� | �d�|�}�qB|�r�|dtv�r�|j � t� d ��||fS) N�=?z"expected encoded word but found {}r�z?=r�r!r�?zwhitespace inside encoded wordz!encoded word format invalid: '{}'z.missing trailing whitespace after encoded-word)r`� startswithr�HeaderParseErrorr.r�r)r�r�countrrkr�rb�_ewr�� ValueError�KeyErrorrrcrdr8�WSPrrrr )rZ terminal_typeZewr�rZremstr�restr�rcrdrr:�charsrrrr�get_encoded_wordsd ��   � � �  �  �       �r$cCsDt�}|�r@|dtvr0t|�\}}|�|�qd}|�d�r�zt|d�\}}Wn(tyfd}Yn�tjyxYnr0d}t |�dkr�|dj dkr�|j �t� d��d}|r�t |�d kr�|d j d kr�t |dd�|d<|�|�qt|d �^}}|�rt�|��r|�d�^}}t|d�}t|�|�|�d �|�}q|S) NrTrZutextFr�rz&missing whitespace before encoded wordr������rar!)rUr!rrkrr$rrrr�rGrr�rr�rfc2047_matcher�search� partitionrr r))rrVr:�valid_ewZhave_wsr�rrrrr�get_unstructuredIsH       ��    r*cCs*t|d�\}}}t|d�}t|�||fS)Nz()r�)rrr �rr��_rrr� get_qp_ctext�s  r-cCs*t|d�\}}}t|d�}t|�||fS)Nrr�)rrr r+rrr� get_qcontent�s  r.cCsNt|�}|st�d�|���|��}|t|�d�}t|d�}t|�||fS)Nzexpected atext but found '{}'�atext)�_non_atom_end_matcherrrr.rr�rr )r�mr/rrr� get_atext�s� r2cCsp|ddkrt�d�|���t�}|dd�}|rT|ddkrTt|�\}}|�|�|�r@|ddk�r@|dtvr�t|�\}}n�|dd�dk�r(d}z&t|�\}}|j �t� d��d }Wn tjy�t|�\}}Yn0|�r4t |�dk�r4|d j d k�r4|d j d k�r4t |d d �|d <n t|�\}}|�|�qT|�s`|j �t� d��||fS||dd�fS)Nrrzexpected '"' but found '{}'r�r�rFz!encoded word inside quoted stringTr�rr%raz"end of header inside quoted string)rrr.rpr.rkr!rr$rr�r�rGr)rZbare_quoted_stringr:r)rrr�get_bare_quoted_string�sJ �      � ��    �r3cCs�|r |ddkr t�d�|���t�}|dd�}|r�|ddkr�|dtvr\t|�\}}n&|ddkrvt|�\}}n t|�\}}|�|�q2|s�|j �t� d��||fS||dd�fS)Nrrzexpected '(' but found '{}'r�rszend of header inside comment) rrr.rqr!r� get_commentr-rkrr�)rrRr:rrrr4�s&�      �r4cCsPt�}|rH|dtvrH|dtvr0t|�\}}n t|�\}}|�|�q||fSr3)r[� CFWS_LEADERr!rr4rk)rr\r:rrr�get_cfwss   r6cCspt�}|r,|dtvr,t|�\}}|�|�t|�\}}|�|�|rh|dtvrht|�\}}|�|�||fSr3)rer5r6rkr3)rZ quoted_stringr:rrr�get_quoted_string s      r7cCs�t�}|r,|dtvr,t|�\}}|�|�|rL|dtvrLt�d�|���|�d�r�zt |�\}}Wq�tjy�t |�\}}Yq�0n t |�\}}|�|�|r�|dtvr�t|�\}}|�|�||fS)Nrzexpected atom but found '{}'r) r]r5r6rk� ATOM_ENDSrrr.rr$r2)rr^r:rrr�get_atoms&  �     r9cCs�t�}|r|dtvr&t�d�|���|rt|dtvrtt|�\}}|�|�|r&|ddkr&|�t�|dd�}q&|dtur�t�d�d|���||fS)Nrz8expected atom at a start of dot-atom-text but found '{}'rr�r�z4expected atom at end of dot-atom-text but found '{}')r�r8rrr.r2rkr�)rZ dot_atom_textr:rrr�get_dot_atom_text:s �    �r:cCs�t�}|dtvr(t|�\}}|�|�|�d�rfzt|�\}}Wqrtjybt|�\}}Yqr0n t|�\}}|�|�|r�|dtvr�t|�\}}|�|�||fS)Nrr) r�r5r6rkrr$rrr:)rZdot_atomr:rrr� get_dot_atomMs        r;cCs�|dtvrt|�\}}nd}|s,t�d��|ddkrFt|�\}}n*|dtvrdt�d�|���n t|�\}}|dur�|g|dd�<||fS)Nrz5Expected 'atom' or 'quoted-string' but found nothing.rz1Expected 'atom' or 'quoted-string' but found '{}')r5r6rrr7�SPECIALSr.r9)r�leaderr:rrr�get_wordfs" �  � r>cCs�t�}zt|�\}}|�|�Wn&tjyF|j�t�d��Yn0|r�|dtvr�|ddkr�|�t�|j�t� d��|dd�}qHzt|�\}}WnBtjy�|dt vr�t |�\}}|j�t� d��n�Yn0|�|�qH||fS)Nzphrase does not start with wordrrzperiod in 'phrase'r�zcomment found without atom) rXr>rkrrrr�� PHRASE_ENDSr��ObsoleteHeaderDefectr5r6)rrYr:rrr� get_phrase�s4   �    �   � rAc Cspt�}d}|dtvr"t|�\}}|s6t�d�|���zt|�\}}WnZtjy�zt|�\}}Wn4tjy�|ddkr�|dtvr��t �}Yn0Yn0|dur�|g|dd�<|� |�|�r0|ddks�|dtv�r0t t |�|�\}}|j dk�r|j� t�d��n|j� t�d��||d<z|j�d�Wn&t�yf|j� t�d��Yn0||fS) Nrz"expected local-part but found '{}'r �invalid-obs-local-partzr?rrk�get_obs_local_partrrGrr�r@r�encoder�ZNonASCIILocalPartDefect)rr�r=r:�obs_local_partrrr�get_local_part�sJ  �    � � � rGcCs�t�}d}|�r&|ddks*|dtv�r&|ddkrj|rL|j�t�d��|�t�d}|dd�}q nD|ddkr�|�t|dd��|dd�}|j�t�d ��d}q |r�|d jd kr�|j�t�d ��zt |�\}}d}Wn2tj �y|dt v�r�t |�\}}Yn0|�|�q |djd k�sV|djd k�rh|djd k�rh|j�t�d��|d jd k�s�|d jd k�r�|djd k�r�|j�t�d��|j�r�d|_||fS)NFrr rzinvalid repeated '.'Tr��misplaced-specialz/'\' character outside of quoted-string/ccontentr�r�zmissing '.' between wordsr\z!Invalid leading '.' in local partr%z"Invalid trailing '.' in local partrB) r�r?rrkrr�r�rrGr>rr5r6)rrFZlast_non_ws_was_dotr:rrrrD�sj   �    �  � �   � � � � � �rDcCs@t|d�\}}}t|d�}|r0|j�t�d��t|�||fS)Nz[]r�z(quoted printable found in domain-literal)rrrrkrr@r )rr�rrrr� get_dtexts   �rIcCs,|rdS|�t�d��|�tdd��dS)NFz"end of input inside domain-literal�]�domain-literal-endT)rkrr�r)r�domain_literalrrr�_check_for_early_dl_ends�rMcCsjt�}|dtvr(t|�\}}|�|�|s6t�d��|ddkrRt�d�|���|dd�}t||�rp||fS|�tdd��|dt vr�t |�\}}|�|�t |�\}}|�|�t||�r�||fS|dt vr�t |�\}}|�|�t||�r�||fS|ddk�rt�d�|���|�tdd ��|dd�}|�rb|dtv�rbt|�\}}|�|�||fS) Nrzexpected domain-literal�[z6expected '[' at start of domain-literal but found '{}'r�zdomain-literal-startrJz4expected ']' at end of domain-literal but found '{}'rK) r�r5r6rkrrr.rMrr!rrI)rrLr:rrr�get_domain_literal sH     �            �   rOcCspt�}d}|dtvr"t|�\}}|s6t�d�|���|ddkrvt|�\}}|durd|g|dd�<|�|�||fSzt|�\}}Wn tjy�t |�\}}Yn0|r�|ddkr�t�d��|dur�|g|dd�<|�|�|�rh|ddk�rh|j �t� d��|dj dk�r(|d|dd�<|�rh|ddk�rh|�t �t |d d��\}}|�|��q(||fS) Nrzexpected domain but found '{}'rNr�zInvalid Domainrz(domain is not a dot-atom (contains CFWS)r�r�)r�r5r6rrr.rOrkr;r9rr@rGr�)rr�r=r:rrr� get_domainGsD  �      � rPcCs|t�}t|�\}}|�|�|r,|ddkrF|j�t�d��||fS|�tdd��t|dd��\}}|�|�||fS)Nrr�z#addr-spec local part with no domain�address-at-symbolr�)r�rGrkrrr�rrP)rr�r:rrr� get_addr_specms   � rRcCs�t�}|rj|ddks"|dtvrj|dtvrFt|�\}}|�|�q|ddkr|�t�|dd�}q|rz|ddkr�t�d�|���|�t�t |dd��\}}|�|�|�r>|ddk�r>|�t�|dd�}|s�q>|dtv�rt|�\}}|�|�|ddkr�|�t�t |dd��\}}|�|�q�|�sNt�d��|ddk�rlt�d�|���|�t dd ��||dd�fS) Nrr 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 '{}'zend-of-obs-route-marker) r�r5r6rk� ListSeparatorrrr.�RouteComponentMarkerrPr)rZ obs_router:rrr� get_obs_route}sF     �          �rVc Cs�t�}|dtvr(t|�\}}|�|�|r8|ddkrHt�d�|���|�tdd��|dd�}|ddkr�|�tdd��|j�t� d��|dd�}||fSzt |�\}}Wnvtj�y,z"t |�\}}|j�t� d ��Wn&tj�yt�d �|���Yn0|�|�t |�\}}Yn0|�|�|�rZ|ddk�rZ|dd�}n|j�t� d ��|�tdd��|�r�|dtv�r�t|�\}}|�|�||fS) Nr�zangle-addr-endznull 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�r5r6rkrrr.rrr�rRrVr@)rZ angle_addrr:rrr�get_angle_addr�sT   �   �   � �    �  rYcCs<t�}t|�\}}|�|dd��|jdd�|_||fSr)r�rAr8r)rr�r:rrr�get_display_name�s  rZcCs�t�}d}|dtvr6t|�\}}|s6t�d�|���|ddkr�|dtvr^t�d�|���t|�\}}|s~t�d�|���|dur�|g|ddd�<d}|�|�t |�\}}|dur�|g|dd�<|�|�||fS)Nrz!expected name-addr but found '{}'rW) r�r5r6rrr.r?rZrkrY)rZ name_addrr=r:rrr� get_name_addr�s6  �  � �   r[c Cs�t�}zt|�\}}WnJtjy`zt|�\}}Wn$tjyZt�d�|���Yn0Yn0tdd�|jD��r|d|_|� |�||fS)Nzexpected mailbox but found '{}'css|]}t|tj�VqdSr)r�rr�r#rrrr&s�zget_mailbox..r�) r�r[rrrRr.�anyr1rGrk)rr�r:rrr� get_mailboxs �� r]cCsdt�}|r\|d|vr\|dtvrD|�t|dd��|dd�}qt|�\}}|�|�q||fS)NrrHr�)r�r?rkrrA)rrZinvalid_mailboxr:rrr�get_invalid_mailboxs  �  r^cCs�t�}|�r�|ddk�r�zt|�\}}|�|�W�ntj�y:d}|dtvr�t|�\}}|rt|ddvr�|�|�|j�t�d��n@t |d�\}}|dur�|g|dd�<|�|�|j�t� d��nb|ddkr�|j�t�d��nBt |d�\}}|du�r|g|dd�<|�|�|j�t� d��Yn0|�r�|ddv�r�|d}d|_ t |d�\}}|� |�|j�t� d��|r|ddkr|�t �|d d�}q||fS) Nr�;z,;zempty element in mailbox-listzinvalid mailbox in mailbox-listr r�r�r�)r�r]rkrrr5r6rr@r^r�rGr8rT)rZ mailbox_listr:r=r�rrr�get_mailbox_list(sX      �  �  �   �   � r`cCst�}|s$|j�t�d��||fSd}|r�|dtvr�t|�\}}|sl|j�t�d��|�|�||fS|ddkr�|�|�||fSt|�\}}t|j �dkr�|dur�|�|�|� |�|j�t� d��||fS|dur�|g|dd�<|�|�||fS)Nzend of header before group-listrzend of header in group-listr_zgroup-list with empty entries) r�rrkrr�r5r6r`r�r}r8r@)rZ group_listr=r:rrr�get_group_listas> �  �       � racCs t�}t|�\}}|r"|ddkr2t�d�|���|�|�|�tdd��|dd�}|r�|ddkr�|�tdd��||dd�fSt|�\}}|�|�|s�|j�t� d��n|ddkr�t�d �|���|�tdd��|dd�}|�r|dt v�rt |�\}}|�|�||fS) NrrSz8expected ':' at end of group display name but found '{}'zgroup-display-name-terminatorr�r_zgroup-terminatorzend of header in groupz)expected ';' at end of group but found {}) r�rZrrr.rkrrarr�r5r6)rrr:rrr� get_group�s8 �     � �   rbc Cstt�}zt|�\}}WnJtjy`zt|�\}}Wn$tjyZt�d�|���Yn0Yn0|�|�||fS)Nzexpected address but found '{}')r~rbrrr]r.rk)rrur:rrr� get_address�s� rcc Cs�t�}|�r�zt|�\}}|�|�W�n$tj�yL}�zd}|dtvr�t|�\}}|rj|ddkr�|�|�|j�t�d��nFt |d�\}}|dur�|g|dd�<|�t |g��|j�t� d��nh|ddkr�|j�t�d��nHt |d�\}}|du�r|g|dd�<|�t |g��|j�t� d��WYd}~n d}~00|�r�|ddk�r�|dd}d|_ t |d�\}}|� |�|j�t� d��|r|�tdd��|d d�}q||fS) Nrr z"address-list entry with no contentzinvalid address in address-listzempty element in address-listr�r�r r�)rtrcrkrrr5r6rr@r^r~r�rGr8r)rZ address_listr:�errr=r�rrr�get_address_list�sX      � �  �  �   �recCs�t�}|st�d�|���|ddkr6t�d�|���|�tdd��|dd�}t|�\}}|�|�|rx|ddkr�t�d�|���|�tdd ��||dd�fS) Nz'expected no-fold-literal but found '{}'rrNz;expected '[' at the start of no-fold-literal but found '{}'zno-fold-literal-startr�rJz9expected ']' at the end of no-fold-literal but found '{}'zno-fold-literal-end)r�rrr.rkrrI)rZno_fold_literalr:rrr�get_no_fold_literal�s.� ��   ��rfcCs�t�}|r,|dtvr,t|�\}}|�|�|r<|ddkrLt�d�|���|�tdd��|dd�}zt|�\}}Wn\tjy�z"t |�\}}|j �t� d��Wn$tjy�t�d�|���Yn0Yn0|�|�|r�|ddk�r<|j �t� d ��|�r4|dd k�r4|�td d ��|dd�}||fS|�tdd ��|dd�}zt|�\}}Wn�tj�yzt |�\}}Wnrtj�y�}zVz"t|�\}}|j �t� d ��Wn&tj�y�t�d�|���Yn0WYd}~n d}~00Yn0|�|�|�r0|dd k�r0|dd�}n|j �t� d��|�td d ��|�r||dtv�r|t|�\}}|�|�||fS)NrrWzexpected msg-id but found '{}'z msg-id-startr�zobsolete id-left in msg-idz4expected dot-atom-text or obs-id-left but found '{}'r�zmsg-id with no id-rightrXz msg-id-endrQzobsolete id-right in msg-idzFexpected dot-atom-text, no-fold-literal or obs-id-right but found '{}'zmissing trailing '>' on msg-id)r�r5r6rkrrr.rr:rDrr@r�rfrP)rZmsg_idr:�errr� get_msg_ids~  �   � ��  �    � ��&  �  rhc Cs�t�}zt|�\}}|�|�WnNtjyn}z4t|�}t|�}|j�t�d� |���WYd}~n&d}~00|r�|j�t�d� |���|S)NzInvalid msg-id: {!r}zUnexpected {!r}) r�rhrkrrr*r�rr�r.)rZ message_idr:Zexrrr�parse_message_idSs � �ricCs�t�}|s |j�t�d��|S|dtvrXt|�\}}|�|�|sX|j�t�d��d}|r�|ddkr�|dtvr�||d7}|dd�}q\|��s�|j�t�d� |���|�t |d��nt |�|_ |�t |d ��|�r|dtv�rt|�\}}|�|�|�r|ddk�rT|j du�r:|j�t�d ��|�rP|�t |d��|S|�t dd ��|dd�}|�r�|dtv�r�t|�\}}|�|�|�s�|j du�r�|j�t�d ��|Sd}|�r�|dtv�r�||d7}|dd�}�q�|���s*|j�t�d � |���|�t |d��nt |�|_ |�t |d ��|�rn|dtv�rnt|�\}}|�|�|�r�|j�t�d ��|�t |d��|S)Nz%Missing MIME version number (eg: 1.0)rz0Expected MIME version number but found only CFWSr!rr�z1Expected MIME major version number but found {!r}r �digitsz0Incomplete MIME version; found only major numberzversion-separatorz1Expected MIME minor version number but found {!r}z'Excess non-CFWS text after MIME version)r�rrkr�HeaderMissingRequiredValuer5r6�isdigitr�r.r�intr�r�)rZ mime_versionr:rjrrr�parse_mime_versionos� �    �  �     �     �   �    �rncCsdt�}|r\|ddkr\|dtvrD|�t|dd��|dd�}qt|�\}}|�|�q||fS)Nrr_rHr�)r�r?rkrrA)rZinvalid_parameterr:rrr�get_invalid_parameter�s  �  rocCsNt|�}|st�d�|���|��}|t|�d�}t|d�}t|�||fS)Nzexpected ttext but found '{}'�ttext)�_non_token_end_matcherrrr.rr�rr )rr1rprrr� get_ttext�s � rrcCs�t�}|r,|dtvr,t|�\}}|�|�|rL|dtvrLt�d�|���t|�\}}|�|�|r�|dtvr�t|�\}}|�|�||fS�Nrzexpected token but found '{}') r_r5r6rk� TOKEN_ENDSrrr.rr)rZmtokenr:rrr� get_token�s   �    rucCsNt|�}|st�d�|���|��}|t|�d�}t|d�}t|�||fS)Nz expected attrtext but found {!r}r�)�_non_attribute_end_matcherrrr.rr�rr �rr1r�rrr� get_attrtext�s � rxcCs�t�}|r,|dtvr,t|�\}}|�|�|rL|dtvrLt�d�|���t|�\}}|�|�|r�|dtvr�t|�\}}|�|�||fSrs) r�r5r6rk�ATTRIBUTE_ENDSrrr.rx�rr�r:rrr� get_attribute s   �    r{cCsNt|�}|st�d�|���|��}|t|�d�}t|d�}t|�||fS)Nz)expected extended attrtext but found {!r}�extended-attrtext)�#_non_extended_attribute_end_matcherrrr.rr�rr rwrrr�get_extended_attrtext s� r~cCs�t�}|r,|dtvr,t|�\}}|�|�|rL|dtvrLt�d�|���t|�\}}|�|�|r�|dtvr�t|�\}}|�|�||fSrs) r�r5r6rk�EXTENDED_ATTRIBUTE_ENDSrrr.r~rzrrr�get_extended_attribute+ s  �    r�cCs�t�}|r|ddkr&t�d�|���|�tdd��|dd�}|rR|d��sbt�d�|���d}|r�|d��r�||d7}|dd�}qf|ddkr�|dkr�|j�t�d ��t |�|_ |�t|d ��||fS) Nr�*zExpected section but found {}zsection-markerr�z$Expected section number but found {}r!�0z'section number has an invalid leading 0rj) r�rrr.rkrrlrZInvalidHeaderErrorrmr�)rr�rjrrr� get_sectionA s, � �  � r�cCs�t�}|st�d��d}|dtvr0t|�\}}|sDt�d�|���|ddkr^t|�\}}n t|�\}}|dur�|g|dd�<|�|�||fS)Nz&Expected value but found end of stringrz Expected value but found only {}r) r�rrr5r6r.r7r�rk)r�vr=r:rrr� get_value_ s"   �   r�c Cs�t�}t|�\}}|�|�|r,|ddkrL|j�t�d�|���||fS|ddkr�z t|�\}}d|_|�|�Wntj y�Yn0|s�t� d��|ddkr�|�t dd��|dd�}d|_ |dd kr�t� d ��|�t d d ��|dd�}d}|�r*|dt v�r*t |�\}}|�|�d}|}|j �rD|�rD|dd k�rDt|�\}}|j}d }|jdk�r�|�r�|ddk�r�d}n$t|�\}} | �r�| ddk�r�d}n(zt|�\}} Wn Yn 0| �s�d}|�r.|j�t�d��|�|�|D](} | jdk�r�g| dd�<| }�q(�q�|}nd}|j�t�d��|�r^|ddk�r^d}n t|�\}}|j �r~|jdk�r�|�r�|ddk�r�|�|�|du�r�|}||fS|j�t�d��|�s�|j�t�d��|�|�|du�r�||fSn�|du�r>|D]} | jdk�r�q"�q| jdk|�| �| j|_|ddk�r\t� d�|���|�t dd��|dd�}|�r�|ddk�r�t|�\}}|�|�|j|_|�r�|ddk�r�t� d�|���|�t dd��|dd�}|du�rbt�} |�r\|dtv�rt|�\}}n2|dd k�rBt d d�}|dd�}n t|�\}}| �|��q�| }n t|�\}}|�|�|du�r�|}||fS)Nrr_z)Parameter contains name ({}) but no valuer�TzIncomplete parameterzextended-parameter-markerr��=zParameter not followed by '='�parameter-separatorrF�'z5Quoted string value for extended parameter is invalidrhzZParameter 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}zRFC2231-delimiterz;Expected RFC2231 char/lang encoding delimiter, but found {}ZDQUOTE)r�r{rkrrr�r.r�r�rrr�r5r6r7ror�rxr~rGr�rrcrdr�r!rr.) rr�r:r=rZappendtoZqstringZ inner_valueZ semi_validr"�tr�rrr� get_parameteru s�   �              �     �    � �        �   �       r�c Cspt�}|�rlzt|�\}}|�|�Wn�tjy�}z�d}|dtvrTt|�\}}|sr|�|�|WYd}~S|ddkr�|dur�|�|�|j�t�d��n@t |�\}}|r�|g|dd�<|�|�|j�t�d� |���WYd}~n d}~00|�rJ|ddk�rJ|d}d|_ t |�\}}|� |�|j�t�d� |���|r|�t dd��|d d�}q|S) Nrr_zparameter entry with no contentzinvalid parameter {!r}r�r�z)parameter with invalid trailing text {!r}r�r�)r�r�rkrrr5r6rr�ror.rGr8r)rZmime_parametersr:rdr=r�rrr�parse_mime_parameters sJ        �   �   �r�cCs�|rV|ddkrV|dtvr>|�t|dd��|dd�}qt|�\}}|�|�q|s^dS|�tdd��|�t|dd���dS)Nrr_rHr�r�)r?rkrrAr�)Z tokenlistrr:rrr�_find_mime_parameters7 s   r�c Cs�t�}d}|s$|j�t�d��|Szt|�\}}Wn:tjyn|j�t�d�|���t ||�|YS0|�|�|r�|ddkr�|j�t�d��|r�t ||�|S|j � �� �|_ |�tdd��|dd�}zt|�\}}Wn<tj�y&|j�t�d �|���t ||�|YS0|�|�|j � �� �|_|�sL|S|dd k�r�|j�t�d �|���|` |`t ||�|S|�td d ��|�t|dd���|S) NFz"Missing content type specificationz(Expected content maintype but found {!r}rrzInvalid content typezcontent-type-separatorr�z'Expected content subtype but found {!r}r_zt| �} |s�| jdvr�t � | � }n t � | � }z| � |�|} Wn4t y�td d �| jD��r�d } nd} d }Yn0| jd kr�t| |||�q>|�r�|�s�| j�s|d}d}| j�r|| j|d�dt|j� �} |j| v�r|t| �|t|d�k�rjt|�}|�|�|d| 7<q>t| d��s�t| �| } nt| |||| j| �}d}q>t| �|t|d�k�r�|d| 7<q>| j�r"t| �d|k�r"t|�}|�s| ���r"|�|| �d}q>t| d��s�t| �}| jdk�rhtdd�gdd�|D�tdd�g}| j�s�|d7}|�|�|| } q>| j�r�|�s�| �d| �d }q>t|�}|�s�| ���r�|�|| �q>|d| 7<q>|j�|�|jS)N�utf-8r�r!rF�wrap_as_ew_blockedr�)r�rcss|]}t|tj�VqdSr)r�rr�r#rrrr&� s�z%_refold_parse_tree..� unknown-8bitTr�r;r�rErhrr�cSsg|]}tt|�d��qS)r�)rr)r$�prrrrT1 s�z&_refold_parse_tree..)Zmax_line_length�sys�maxsize�utf8r�rr�rrG� SPECIALSNL� isdisjoint�NLSETrEr�r\r1�_fold_mime_parametersr5rKr?r�r�r�rkrH� _fold_as_ewrLr4r�insertr))Z parse_treer<�maxlenr�r��last_ewr�Z want_encodingZend_ew_not_allowedr�r6�tstrrcZ encoded_part�newlineZnewpartsrrrr=� s�       �       ��   �� ��  r=cCs�|dur<|rrArGrDrIrMrOrPrRrVrYrZr[r]r^r`rarbrcrerfrhrirnrorrrurxr{r~r�r�r�r�r�r�r�r�r�r�r=r�r�rrrr�Fs2           �C  "   !*$ V +      � ���  1C+ "&'/'&).9%7ED49/tA