U e5dT@sdZddddgZdZdZdZdZzd d lmZmZWne k rPd Zd ZYnXd d Z ddZ dddZ dddZ dddZdddZddZddZddZedkred S) zHConversions to/from quoted-printable transport encoding as per RFC 1521.encodedecode encodestring decodestring=Ls0123456789ABCDEF)a2b_qpb2a_qpNcCsHt|tst|dkr|S|dkr&|S|tkpFd|ko@dkn S)zDecide whether a particular byte ordinal needs to be quoted. The 'quotetabs' flag indicates whether embedded tabs and spaces should be quoted. Note that line-ending tabs and spaces are always encoded, as per RFC 1521.  _ ~) isinstancebytesAssertionErrorESCAPE)c quotetabsheaderr/usr/lib64/python3.8/quopri.py needsquotings rcCsBt|trt|dkstt|}ttt|dt|dfS)zQuote a single character.)rrlenrordrHEXrrrrquote$srFc Cs2tdk r,|}t|||d}||dS|dfdd}d}|}|sNqg} d} |dddkrv|dd}d} |D]D} t| f} t| ||rt| } |r| dkr| d qz| | qz|dk r||t | } t | t kr|| dt d d d | t d d} q| }q>|dk r.||| d dS) avRead 'input', apply quoted-printable encoding, and write to 'output'. 'input' and 'output' are binary file objects. The 'quotetabs' flag indicates whether embedded tabs and spaces should be quoted. Note that line-ending tabs and spaces are always encoded, as per RFC 1521. The 'header' flag indicates whether we are encoding spaces as _ as per RFC 1522.Nrr cSsj|r<|dddkr<||ddt|dd|n*|dkrX|t||n|||dS)Nr .)writer)soutputlineEndrrrr$;s (zencode..writerr"r r rs= )r') r readr$readlinerrrappend EMPTYSTRINGjoinr MAXLINESIZE) inputr&rrdataodatar$ZprevlinelineZoutlinestrippedrZthislinerrrr,s>           cCsFtdk rt|||dSddlm}||}|}t|||||S)Nr rBytesIO)r ior4rgetvalue)r%rrr4infpoutfprrrrjs c Cstdk r*|}t||d}||dSd}|}|s>qdt|}}|dkr||d|dkrd} |d}|dkr||d|dkr|d}qtnd} ||kr|||d} | dkr|r|d }|d}q| tkr|| }|d}q|d|kr| sd} qq|d|krJ||d|d tkrJ|t}|d }q|d |krt||d|d rt||d |d r|tt||d|d f}|d }q|| }|d}q| s.||dd}q.|r||dS) zRead 'input', apply quoted-printable decoding, and write to 'output'. 'input' and 'output' are binary file objects. If 'header' is true, decode underscore as space (per RFC 1522).Nrrrrr!s r r ) r r(r$r)rrishexrunhex) r.r&rr/r0newr1inpartialrrrrrusP       ( B"  cCsDtdk rt||dSddlm}||}|}t|||d|S)Nr9rr3)r r5r4rr6)r%rr4r7r8rrrrs  cCsVt|tstd|ko dknpTd|ko8dknpTd|koPdkSS)zDReturn true if the byte ordinal 'c' is a hexadecimal digit in ASCII.09afAF)rrrrrrrr<sr<cCsd}|D]}t|f}d|kr*dkr8nn td}n`d|krLdkr^nntdd}n:d |krrd krnntd d}nd std t||d t||}q|S)z.Get the integer value of a hexadecimal number.rrBrC0rDrEa rFrGFznon-hex digit r)rrrrepr)r%bitsrr?rrrr=s  r=c Csddl}ddl}z||jddd\}}WnV|jk r}z6|j|_t|tdtdtd|dW5d}~XYnXd}d}|D] \}}|dkrd}|d krd}q|r|r|j|_td |d|sd g}d} |D]} | d kr|jj } nTzt | d } WnDt k rP}z$|j d | |fd} WYqW5d}~XYnXz*|rjt| |jj nt| |jj |W5| d kr| Xq| r|| dS)NrrZtdz"usage: quopri [-t | -d] [file] ...z-t: quote tabsz-d: decode; default encoder:z-tz-dz -t and -d are mutually exclusive-rbz%s: can't open (%s) )sysgetoptargverrorstderrstdoutprintexitstdinbufferopenOSErrorr$closerr) rOrPZoptsargsmsgZdecoZtabsorIstsfilefprrrmainsT     rb__main__)F)FF)F)F)__doc____all__rr-rr+Zbinasciir r ImportErrorrrrrrrr<r=rb__name__rrrrs*   > + .