JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrJFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3RbrB YI~d&^@sdddgZddlZddlZddlZddlZddlmZddlmZ e j Z dZ dZ d Z d Zd Zd Zd Ze dZe dZedejejBZedZedZejjZddZdddZGdddZGdddZGddde Z!dS)Header decode_header make_headerN)HeaderParseError)charset   z Nz zus-asciizutf-8ai =\? # literal =? (?P[^?]*?) # non-greedy up to the next ? is the charset \? # literal ? (?P[qQbB]) # either a "q" or a "b", case insensitive \? # literal ? (?P.*?) # non-greedy up to the next ?= is the encoded string \?= # literal ?= z[\041-\176]+:$z \n[^ \t]+:c Cst|drdd|jDSt|s.|dfgSg}x|D]}t|}d}xp|r|d}|rn|}d}|r||ddf|rP|d }|d }|d}||||fqPWqMsz!decode_header..TrFqbz===zBase64 decoding errorzUnexpected encoding: zraw-unicode-escape)hasattrr ecresearch splitlinessplitpoplstripappendlower enumerateisspacereversedemail quoprimimeZ header_decodelenZ base64mimedecodebinasciiErrorrAssertionError isinstancerbytesBSPACE)headerZwordslinepartsfirstZ unencodedrencodingZencodedZdroplistnwdZ decoded_wordsZencoded_stringZwordZpaderrZ collapsedZ last_word last_charsetr r rr=sz       4           cCsJt|||d}x6|D].\}}|dk r6t|ts6t|}|||qW|S)N) maxlinelen header_namecontinuation_ws)rr,Charsetr )Z decoded_seqr8r9r:hsrr r rrs c@sJeZdZdddZddZdd Zdd d Zd d ZdddZddZ dS)rNrstrictcCs||dkrt}nt|ts t|}||_||_g|_|dk rH|||||dkrTt}||_|dkrjd|_ nt |d|_ dS)Nrr) USASCIIr,r;r_continuation_wsr r MAXLINELEN _maxlinelen _headerlenr')selfr=rr8r9r:errorsr r r__init__s zHeader.__init__c Cs|g}d}d}x|jD]\}}|}|tjkrJ|dd}|dd}|r|o^||d}|dkr|dkr|s|td}n|dkr|s|t|o||d}|}||qWt |S)Nasciisurrogateescapereplacer)Nzus-ascii) _normalizer r UNKNOWN8BITencoder( _nonctextr SPACE EMPTYSTRINGjoin) rDZuchunkslastcs lastspacerrZnextcsZoriginal_byteshasspacer r r__str__s*       zHeader.__str__cCs |t|kS)N)r)rDotherr r r__eq__sz Header.__eq__cCs|dkr|j}nt|ts"t|}t|tsZ|jp4d}|tjkrN|dd}n |||}|jpbd}|tjkry|||Wn"t k r|dkrt }YnX|j ||fdS)Nzus-asciirH) rr,r;rZ input_codecrLr(Z output_codecrMUnicodeEncodeErrorUTF8r r )rDr=rrEZ input_charsetoutput_charsetr r rr s$        z Header.appendcCs|p|dkS)N)()\)r#)rDr=r r rrN4szHeader._nonctext;, rcCs||dkr|j}|dkr"d}t|j||j|}d}d}}x.|jD]"\}} |dk r|ol||d}|dkr|r| dkr|n| dkr|s||o||d}| }d}|} | r| d| d| n| dd| xp| ddD]`} | | j dk r(| |jd| | q| } | dt | t | } | | | | qWt | dkrJ| qJW|jr|||}t|rtd ||S) Nri@B)Nzus-asciirJFr rrz8header value appears to contain an embedded header: {!r})rKrB_ValueFormatterrCr@r rNadd_transitionrfeednewlineheader_encodingrr'_str_embedded_headerrrformat)rD splitcharsr8linesep formatterrRrTrSrrlinesr0Zslinefwsvaluer r rrM9sR!         z Header.encodecCs|g}d}g}xL|jD]B\}}||kr0||q|dk rL|t||f|g}|}qW|rr|t||f||_dS)N)r r rOrQ)rDZchunksr7Z last_chunkrrr r rrKs zHeader._normalize)NNNNrr>)Nr>)r^Nr) __name__ __module__ __qualname__rFrUrWr rNrMrKr r r rrs -  + Pc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)r_cCs0||_||_t||_||_g|_t||_dS)N)_maxlenr@r'_continuation_ws_len _splitchars_lines _Accumulator _current_line)rDZ headerlenmaxlenr:rgr r rrFs  z_ValueFormatter.__init__cCs|||jS)N)rbrQrs)rDrhr r rrdsz_ValueFormatter._strcCs |tS)N)rdNL)rDr r rrUsz_ValueFormatter.__str__cCsv|j}|dkr|jj|t|jdkrh|jrV|jrV|jdt|j7<n|jt|j|jdS)N)rr rrJ) rurpushr' is_onlywsrsrr reset)rDZ end_of_liner r rrbs  z_ValueFormatter.newlinecCs|jdddS)Nrr )rurx)rDr r rr`sz_ValueFormatter.add_transitioncCs|jdkr||||jdS|||}y|d}Wntk rPdSX|dk rf|||y |}Wntk rdSX||j |j |x|D]}|j |j |qWdS)Nr)rc _ascii_splitrrZheader_encode_lines _maxlengthsr IndexError _append_chunkrbrurxr@rsr )rDrkrrZ encoded_linesZ first_line last_liner0r r rras$    z_ValueFormatter.feedccs*|jt|jVx|j|jVqWdS)N)rpr'rurq)rDr r rr|sz_ValueFormatter._maxlengthscCsjtdtd||}|dr0dg|dd<n |dx*tt|gdD]\}}|||qNWdS)Nz([z]+)rr r)rerFWSrzipiterr~)rDrkrrgr1partr r rr{s  z_ValueFormatter._ascii_splitcCs |j||t|j|jkrx|jD]t}xlt|jdddD]P}|rp|j|d}|rp|d|krpP|j|dd}|rD|d|krDPqDWq(Pq(W|j\}}|jj dkr| |sd}|j||dS|j |}|j t|j|j|dS)NrrrJr)rurxr'rprrrange part_countr#r _initial_sizerbpop_fromrsr rrz)rDrkrZchiZprevpartrZ remainderr r rr~s.   z_ValueFormatter._append_chunkN) rmrnrorFrdrUrbr`rar|r{r~r r r rr_s %r_csjeZdZdfdd ZddZdddZfdd Zd d Zd d ZdddZ ddZ fddZ Z S)rtrcs||_tdS)N)rsuperrF)rDZ initial_size) __class__r rrFsz_Accumulator.__init__cCs|||fdS)N)r )rDrkrr r rrx#sz_Accumulator.pushcCs||d}g||d<|S)Nr )rDrZpoppedr r rr&s  z_Accumulator.pop_fromcs|dkrdStS)Nr)r r )rrr)rD)rr rr+s z_Accumulator.popcCstdd|D|jS)Ncss"|]\}}t|t|VqdS)N)r')rrkrr r r 1sz'_Accumulator.__len__..)sumr)rDr r r__len__0sz_Accumulator.__len__cCstdd|DS)Ncss |]\}}t||fVqdS)N)rPrQ)rrkrr r rr5sz'_Accumulator.__str__..)rPrQ)rDr r rrU4s z_Accumulator.__str__NcCs"|dkr g}||dd<d|_dS)Nr)r)rDZstartvalr r rrz8s z_Accumulator.resetcCs|jdko| pt|S)Nr)rrr#)rDr r rry>sz_Accumulator.is_onlywscs tS)N)rr)rD)rr rrAsz_Accumulator.part_count)r)r)N) rmrnrorFrxrrrrUrzryr __classcell__r r )rrrts   rt)NNr)"__all__rr)Zemail.quoprimimer%Zemail.base64mimeZ email.errorsrrrr;rwrOr.ZSPACE8rPrArr?rYcompileVERBOSE MULTILINErZfcrerer&Z _max_appendrrrr_listrtr r r rs>    _ k