3
ûâdea~  ã                @   sì  d dl mZmZmZ d dlmZ d dlmZmZ d dl	Z	d dl
Z
d dlmZmZ d dlmZ ddlmZmZmZmZ dd	lmZ dd
lmZ edd„ eD ƒƒZedd„ eD ƒƒZedd„ eD ƒƒZeeddgƒB ZdZej�redE dkrøejdƒdksüt ‚e
j!eddF… e"dƒ d ƒZ#n
e
j!eƒZ#ddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3h Z$e
j!d4ƒZ%i Z&G d5d6„ d6e'ƒZ(d7d8„ Z)G d9d:„ d:e'ƒZ*G d;d<„ d<e*ƒZ+G d=d>„ d>e,ƒZ-G d?d@„ d@e'ƒZ.G dAdB„ dBe'ƒZ/dCdD„ Z0dS )Gé    )Úabsolute_importÚdivisionÚunicode_literals)Ú	text_type)Úhttp_clientÚurllibN)ÚBytesIOÚStringIO)Úwebencodingsé   )ÚEOFÚspaceCharactersÚasciiLettersÚasciiUppercase)Ú_ReparseException)Ú_utilsc             C   s   g | ]}|j d ƒ‘qS )Úascii)Úencode)Ú.0Úitem© r   ú@/tmp/pip-build-red6nood/pip/pip/_vendor/html5lib/_inputstream.pyú
<listcomp>   s    r   c             C   s   g | ]}|j d ƒ‘qS )r   )r   )r   r   r   r   r   r      s    c             C   s   g | ]}|j d ƒ‘qS )r   )r   )r   r   r   r   r   r      s    ó   >ó   <uš   [---ÂŸï·�-ï·¯ï¿¾ï¿¿ðŸ¿¾ðŸ¿¿ð¯¿¾ð¯¿¿ð¿¿¾ð¿¿¿ñ�¿¾ñ�¿¿ñŸ¿¾ñŸ¿¿ñ¯¿¾ñ¯¿¿ñ¿¿¾ñ¿¿¿ò�¿¾ò�¿¿òŸ¿¾òŸ¿¿ò¯¿¾ò¯¿¿ò¿¿¾ò¿¿¿ó�¿¾ó�¿¿óŸ¿¾óŸ¿¿ó¯¿¾ó¯¿¿ó¿¿¾ó¿¿¿ô�¿¾ô�¿¿]ú]z"\uD800-\uDFFF"iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ	 iÿÿ	 iþÿ
 iÿÿ
 iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ iþÿ iÿÿ z[	- -/:-@\[-`{-~]c               @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚBufferedStreamzÆBuffering for streams that do not have buffering of their own

    The buffer is implemented as a list of chunks on the assumption that
    joining many strings will be slow since it is O(n**2)
    c             C   s   || _ g | _ddg| _d S )Nr   r   éÿÿÿÿ)ÚstreamÚbufferÚposition)Úselfr   r   r   r   Ú__init__:   s    zBufferedStream.__init__c             C   s@   d}x(| j d | jd … D ]}|t|ƒ7 }qW || jd 7 }|S )Nr   r   )r   r    Úlen)r!   ÚposÚchunkr   r   r   Útell?   s
    zBufferedStream.tellc             C   sX   || j ƒ kst‚|}d}x0t| j| ƒ|k rH|t| j| ƒ8 }|d7 }qW ||g| _d S )Nr   r   )Ú_bufferedBytesÚAssertionErrorr#   r   r    )r!   r$   ÚoffsetÚir   r   r   ÚseekF   s    zBufferedStream.seekc             C   sT   | j s| j|ƒS | jd t| j ƒkrF| jd t| j d ƒkrF| j|ƒS | j|ƒS d S )Nr   r   r   )r   Ú_readStreamr    r#   Ú_readFromBuffer)r!   Úbytesr   r   r   ÚreadO   s    

zBufferedStream.readc             C   s   t dd„ | jD ƒƒS )Nc             S   s   g | ]}t |ƒ‘qS r   )r#   )r   r   r   r   r   r   Y   s    z1BufferedStream._bufferedBytes.<locals>.<listcomp>)Úsumr   )r!   r   r   r   r'   X   s    zBufferedStream._bufferedBytesc             C   s<   | j j|ƒ}| jj|ƒ | jd  d7  < t|ƒ| jd< |S )Nr   r   )r   r/   r   Úappendr    r#   )r!   r.   Údatar   r   r   r,   [   s
    zBufferedStream._readStreamc             C   sÔ   |}g }| j d }| j d }x˜|t| jƒk r´|dkr´|dks@t‚| j| }|t|ƒ| krn|}||| g| _ n"t|ƒ| }|t|ƒg| _ |d7 }|j|||| … ƒ ||8 }d}qW |rÊ|j| j|ƒƒ dj|ƒS )Nr   r   ó    )r    r#   r   r(   r1   r,   Újoin)r!   r.   ÚremainingBytesÚrvÚbufferIndexÚbufferOffsetÚbufferedDataÚbytesToReadr   r   r   r-   b   s&    


zBufferedStream._readFromBufferN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r"   r&   r+   r/   r'   r,   r-   r   r   r   r   r   3   s   		r   c             K   s’   t | tjƒs(t | tjjƒr.t | jtjƒr.d}n&t| dƒrJt | jdƒt	ƒ}n
t | t	ƒ}|r‚dd„ |D ƒ}|rvt
d| ƒ‚t| f|ŽS t| f|ŽS d S )NFr/   r   c             S   s   g | ]}|j d ƒr|‘qS )Ú	_encoding)Úendswith)r   Úxr   r   r   r   ‹   s    z#HTMLInputStream.<locals>.<listcomp>z3Cannot set an encoding with a unicode input, set %r)Ú
isinstancer   ÚHTTPResponser   ÚresponseÚaddbaseÚfpÚhasattrr/   r   Ú	TypeErrorÚHTMLUnicodeInputStreamÚHTMLBinaryInputStream)ÚsourceÚkwargsÚ	isUnicodeÚ	encodingsr   r   r   ÚHTMLInputStream}   s    

rO   c               @   sp   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
ddd„Zdd„ Zdd„ Zddd„Zdd„ ZdS )rI   z×Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    i (  c             C   sZ   t jsd| _ntdƒdkr$| j| _n| j| _dg| _tdƒdf| _| j	|ƒ| _
| jƒ  dS )a¿  Initialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        Nu   ô�¿¿r   r   zutf-8Úcertain)r   Úsupports_lone_surrogatesÚreportCharacterErrorsr#   ÚcharacterErrorsUCS4ÚcharacterErrorsUCS2ÚnewLinesÚlookupEncodingÚcharEncodingÚ
openStreamÚ
dataStreamÚreset)r!   rK   r   r   r   r"   ž   s    
zHTMLUnicodeInputStream.__init__c             C   s.   d| _ d| _d| _g | _d| _d| _d | _d S )NÚ r   )r%   Ú	chunkSizeÚchunkOffsetÚerrorsÚprevNumLinesÚprevNumColsÚ_bufferedCharacter)r!   r   r   r   rZ   ¾   s    zHTMLUnicodeInputStream.resetc             C   s   t |dƒr|}nt|ƒ}|S )zvProduces a file object from source.

        source can be either a file object, local filename or a string.

        r/   )rG   r	   )r!   rK   r   r   r   r   rX   Ì   s    
z!HTMLUnicodeInputStream.openStreamc             C   sT   | j }|jdd|ƒ}| j| }|jdd|ƒ}|dkr@| j| }n||d  }||fS )NÚ
r   r   r   )r%   Úcountr_   Úrfindr`   )r!   r)   r%   ÚnLinesÚpositionLineÚlastLinePosÚpositionColumnr   r   r   Ú	_positionÚ   s    
z HTMLUnicodeInputStream._positionc             C   s   | j | jƒ\}}|d |fS )z:Returns (line, col) of the current position in the stream.r   )ri   r]   )r!   ÚlineÚcolr   r   r   r    å   s    zHTMLUnicodeInputStream.positionc             C   s6   | j | jkr| jƒ stS | j }| j| }|d | _ |S )zo Read one character from the stream or queue if available. Return
            EOF when EOF is reached.
        r   )r]   r\   Ú	readChunkr   r%   )r!   r]   Úcharr   r   r   rm   ê   s    

zHTMLUnicodeInputStream.charNc             C   sê   |d kr| j }| j| jƒ\| _| _d| _d| _d| _| jj|ƒ}| j	rX| j	| }d | _	n|s`dS t
|ƒdkr®t|d ƒ}|dks˜d|  ko’dkn  r®|d | _	|d d… }| jr¾| j|ƒ |jdd	ƒ}|jd
d	ƒ}|| _t
|ƒ| _dS )Nr[   r   Fr   é   i Ø  iÿÛ  z
rb   úTr   r   r   )Ú_defaultChunkSizeri   r\   r_   r`   r%   r]   rY   r/   ra   r#   ÚordrR   Úreplace)r!   r\   r2   Úlastvr   r   r   rl   ù   s0    
 


z HTMLUnicodeInputStream.readChunkc             C   s,   x&t ttj|ƒƒƒD ]}| jjdƒ qW d S )Nzinvalid-codepoint)Úranger#   Úinvalid_unicode_reÚfindallr^   r1   )r!   r2   Ú_r   r   r   rS     s    z*HTMLUnicodeInputStream.characterErrorsUCS4c             C   sº   d}x°t j|ƒD ]¢}|rqt|jƒ ƒ}|jƒ }tj|||d … ƒrttj|||d … ƒ}|tkrn| j	j
dƒ d}q|dkr¢|dkr¢|t|ƒd kr¢| j	j
dƒ qd}| j	j
dƒ qW d S )NFé   zinvalid-codepointTi Ø  iÿß  r   )ru   Úfinditerrq   ÚgroupÚstartr   ÚisSurrogatePairÚsurrogatePairToCodepointÚnon_bmp_invalid_codepointsr^   r1   r#   )r!   r2   ÚskipÚmatchÚ	codepointr$   Úchar_valr   r   r   rT   #  s     z*HTMLUnicodeInputStream.characterErrorsUCS2Fc       
      C   s  yt ||f }W nl tk
r|   x|D ]}t|ƒdk s&t‚q&W djdd„ |D ƒƒ}|s^d| }tjd| ƒ }t ||f< Y nX g }x||j| j| j	ƒ}|dkr¬| j	| j
krÜP n0|jƒ }|| j
krÜ|j| j| j	|… ƒ || _	P |j| j| j	d… ƒ | jƒ s„P q„W dj|ƒ}	|	S )zð Returns a string of characters from the stream up to but not
        including any character in 'characters' or EOF. 'characters' must be
        a container that supports the 'in' method and iteration over its
        characters.
        é€   r[   c             S   s   g | ]}d t |ƒ ‘qS )z\x%02x)rq   )r   Úcr   r   r   r   H  s    z5HTMLUnicodeInputStream.charsUntil.<locals>.<listcomp>z^%sz[%s]+N)ÚcharsUntilRegExÚKeyErrorrq   r(   r4   ÚreÚcompiler€   r%   r]   r\   Úendr1   rl   )
r!   Ú
charactersÚoppositeÚcharsr„   Úregexr6   Úmr‰   Úrr   r   r   Ú
charsUntil:  s2    
 

z!HTMLUnicodeInputStream.charsUntilc             C   sT   |t k	rP| jdkr.|| j | _|  jd7  _n"|  jd8  _| j| j |ksPt‚d S )Nr   r   )r   r]   r%   r\   r(   )r!   rm   r   r   r   Úungeti  s    
zHTMLUnicodeInputStream.unget)N)F)r;   r<   r=   r>   rp   r"   rZ   rX   ri   r    rm   rl   rS   rT   r�   r‘   r   r   r   r   rI   ”   s    
&
/rI   c               @   sL   e Zd ZdZddd„Zdd„ Zd	d
„ Zddd„Zdd„ Zdd„ Z	dd„ Z
dS )rJ   z×Provides a unicode stream of characters to the HTMLTokenizer.

    This class takes care of character encoding and removing or replacing
    incorrect byte-sequences and also provides column and line tracking.

    Núwindows-1252Tc             C   sn   | j |ƒ| _tj| | jƒ d| _d| _|| _|| _|| _|| _	|| _
| j|ƒ| _| jd dk	sbt‚| jƒ  dS )a¿  Initialises the HTMLInputStream.

        HTMLInputStream(source, [encoding]) -> Normalized stream from source
        for use by html5lib.

        source can be either a file-object, local filename or a string.

        The optional encoding parameter must be a string that indicates
        the encoding.  If specified, that encoding will be used,
        regardless of any BOM or later declaration (such as in a meta
        element)

        i   éd   r   N)rX   Ú	rawStreamrI   r"   ÚnumBytesMetaÚnumBytesChardetÚoverride_encodingÚtransport_encodingÚsame_origin_parent_encodingÚlikely_encodingÚdefault_encodingÚdetermineEncodingrW   r(   rZ   )r!   rK   r—   r˜   r™   rš   r›   Ú
useChardetr   r   r   r"   ‚  s    zHTMLBinaryInputStream.__init__c             C   s&   | j d jj| jdƒ| _tj| ƒ d S )Nr   rr   )rW   Ú
codec_infoÚstreamreaderr”   rY   rI   rZ   )r!   r   r   r   rZ   ¬  s    zHTMLBinaryInputStream.resetc             C   sL   t |dƒr|}nt|ƒ}y|j|jƒ ƒ W n tk
rF   t|ƒ}Y nX |S )zvProduces a file object from source.

        source can be either a file object, local filename or a string.

        r/   )rG   r   r+   r&   Ú	Exceptionr   )r!   rK   r   r   r   r   rX   °  s    
z HTMLBinaryInputStream.openStreamc             C   s   | j ƒ df}|d d k	r|S t| jƒdf}|d d k	r:|S t| jƒdf}|d d k	rX|S | jƒ df}|d d k	rt|S t| jƒdf}|d d k	r¤|d jjdƒ r¤|S t| jƒdf}|d d k	rÂ|S |�rtyddl	m
} W n tk
rì   Y nˆX g }|ƒ }xF|j�s>| jj| jƒ}t|tƒ�s t‚|�s(P |j|ƒ |j|ƒ qúW |jƒ  t|jd ƒ}| jjdƒ |d k	�rt|dfS t| jƒdf}|d d k	�r”|S tdƒdfS )NrP   r   Ú	tentativezutf-16)ÚUniversalDetectorÚencodingzwindows-1252)Ú	detectBOMrV   r—   r˜   ÚdetectEncodingMetar™   ÚnameÚ
startswithrš   Z%pip._vendor.chardet.universaldetectorr¢   ÚImportErrorÚdoner”   r/   r–   rB   r.   r(   r1   ÚfeedÚcloseÚresultr+   r›   )r!   ÚchardetrW   r¢   ÚbuffersÚdetectorr   r£   r   r   r   rœ   Ã  sR    


z'HTMLBinaryInputStream.determineEncodingc             C   sž   | j d dkst‚t|ƒ}|d kr&d S |jdkrFtdƒ}|d k	sšt‚nT|| j d krf| j d df| _ n4| jjdƒ |df| _ | jƒ  td| j d |f ƒ‚d S )	Nr   rP   úutf-16beúutf-16lezutf-8r   zEncoding changed from %s to %s)r°   r±   )rW   r(   rV   r¦   r”   r+   rZ   r   )r!   ÚnewEncodingr   r   r   ÚchangeEncoding  s    

z$HTMLBinaryInputStream.changeEncodingc          
   C   sª   t jdt jdt jdt jdt jdi}| jjdƒ}t|t	ƒs<t
‚|j|dd… ƒ}d}|s~|j|ƒ}d}|s~|j|dd	… ƒ}d	}|r–| jj|ƒ t|ƒS | jjd
ƒ dS dS )z©Attempts to detect at BOM at the start of the stream. If
        an encoding can be determined from the BOM return the name of the
        encoding otherwise return Nonezutf-8zutf-16lezutf-16bezutf-32lezutf-32beé   Né   rx   r   )ÚcodecsÚBOM_UTF8ÚBOM_UTF16_LEÚBOM_UTF16_BEÚBOM_UTF32_LEÚBOM_UTF32_BEr”   r/   rB   r.   r(   Úgetr+   rV   )r!   ÚbomDictÚstringr£   r+   r   r   r   r¤     s$    
zHTMLBinaryInputStream.detectBOMc             C   sV   | j j| jƒ}t|tƒst‚t|ƒ}| j jdƒ |jƒ }|dk	rR|j	dkrRt
dƒ}|S )z9Report the encoding declared by the meta element
        r   Núutf-16beúutf-16lezutf-8)r¿   rÀ   )r”   r/   r•   rB   r.   r(   ÚEncodingParserr+   ÚgetEncodingr¦   rV   )r!   r   Úparserr£   r   r   r   r¥   3  s    z(HTMLBinaryInputStream.detectEncodingMeta)NNNNr’   T)T)r;   r<   r=   r>   r"   rZ   rX   rœ   r³   r¤   r¥   r   r   r   r   rJ   z  s     
(
>"rJ   c               @   sŽ   e Zd Z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eee
ƒZdd„ ZeeƒZefdd„Zdd„ Zdd„ Zdd„ ZdS )ÚEncodingBytesz£String-like object with an associated position and various extra methods
    If the position is ever greater than the string length then an exception is
    raisedc             C   s   t |tƒst‚tj| |jƒ ƒS )N)rB   r.   r(   Ú__new__Úlower)r!   Úvaluer   r   r   rÅ   F  s    zEncodingBytes.__new__c             C   s
   d| _ d S )Nr   r   )ri   )r!   rÇ   r   r   r   r"   J  s    zEncodingBytes.__init__c             C   s   | S )Nr   )r!   r   r   r   Ú__iter__N  s    zEncodingBytes.__iter__c             C   s>   | j d  }| _ |t| ƒkr"t‚n|dk r.t‚| ||d … S )Nr   r   )ri   r#   ÚStopIterationrH   )r!   Úpr   r   r   Ú__next__Q  s    zEncodingBytes.__next__c             C   s   | j ƒ S )N)rË   )r!   r   r   r   ÚnextY  s    zEncodingBytes.nextc             C   sB   | j }|t| ƒkrt‚n|dk r$t‚|d  | _ }| ||d … S )Nr   r   )ri   r#   rÉ   rH   )r!   rÊ   r   r   r   Úprevious]  s    zEncodingBytes.previousc             C   s   | j t| ƒkrt‚|| _ d S )N)ri   r#   rÉ   )r!   r    r   r   r   ÚsetPositionf  s    zEncodingBytes.setPositionc             C   s*   | j t| ƒkrt‚| j dkr"| j S d S d S )Nr   )ri   r#   rÉ   )r!   r   r   r   ÚgetPositionk  s
    
zEncodingBytes.getPositionc             C   s   | | j | j d … S )Nr   )r    )r!   r   r   r   ÚgetCurrentByteu  s    zEncodingBytes.getCurrentBytec             C   sL   | j }x:|t| ƒk r@| ||d … }||kr6|| _|S |d7 }qW || _dS )zSkip past a list of charactersr   N)r    r#   ri   )r!   rŒ   rÊ   r„   r   r   r   r   z  s    zEncodingBytes.skipc             C   sL   | j }x:|t| ƒk r@| ||d … }||kr6|| _|S |d7 }qW || _d S )Nr   )r    r#   ri   )r!   rŒ   rÊ   r„   r   r   r   Ú	skipUntil†  s    zEncodingBytes.skipUntilc             C   s(   | j || jƒ}|r$|  jt|ƒ7  _|S )zÓLook for a sequence of bytes at the start of a string. If the bytes
        are found return True and advance the position to the byte after the
        match. Otherwise return False and leave the position alone)r§   r    r#   )r!   r.   r6   r   r   r   Ú
matchBytes‘  s    zEncodingBytes.matchBytesc             C   s>   y | j || jƒt|ƒ d | _W n tk
r8   t‚Y nX dS )z�Look for the next sequence of bytes matching a given sequence. If
        a match is found advance the position to the last byte of the matchr   T)Úindexr    r#   ri   Ú
ValueErrorrÉ   )r!   r.   r   r   r   ÚjumpToš  s
     
zEncodingBytes.jumpToN)r;   r<   r=   r>   rÅ   r"   rÈ   rË   rÌ   rÍ   rÎ   rÏ   Úpropertyr    rÐ   ÚcurrentByteÚspaceCharactersBytesr   rÑ   rÒ   rÕ   r   r   r   r   rÄ   B  s    	
	rÄ   c               @   sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )rÁ   z?Mini parser for detecting character encoding from meta elementsc             C   s   t |ƒ| _d| _dS )z3string - the data to work on for encoding detectionN)rÄ   r2   r£   )r!   r2   r   r   r   r"   §  s    
zEncodingParser.__init__c             C   sÐ   d| j krd S d| jfd| jfd| jfd| jfd| jfd| jff}x†| j D ]|}d}y| j jdƒ W n tk
rx   P Y nX xD|D ]<\}}| j j|ƒr€y|ƒ }P W q€ tk
rº   d}P Y q€X q€W |sJP qJW | j	S )	Ns   <metas   <!--s   </s   <!s   <?r   TF)
r2   ÚhandleCommentÚ
handleMetaÚhandlePossibleEndTagÚhandleOtherÚhandlePossibleStartTagrÕ   rÉ   rÒ   r£   )r!   ÚmethodDispatchrw   ÚkeepParsingÚkeyÚmethodr   r   r   rÂ   ¬  s2    
zEncodingParser.getEncodingc             C   s   | j jdƒS )zSkip over commentss   -->)r2   rÕ   )r!   r   r   r   rÙ   Ê  s    zEncodingParser.handleCommentc             C   sä   | j jtkrdS d}d }xÆ| jƒ }|d kr.dS |d dkr^|d dk}|rÜ|d k	rÜ|| _dS q|d dkrŽ|d }t|ƒ}|d k	rÜ|| _dS q|d dkrtt|d ƒƒ}|jƒ }|d k	rt|ƒ}|d k	r|rØ|| _dS |}qW d S )	NTFr   s
   http-equivr   s   content-types   charsets   content)	r2   r×   rØ   ÚgetAttributer£   rV   ÚContentAttrParserrÄ   Úparse)r!   Ú	hasPragmaÚpendingEncodingÚattrÚtentativeEncodingÚcodecÚcontentParserr   r   r   rÚ   Î  s:    zEncodingParser.handleMetac             C   s
   | j dƒS )NF)ÚhandlePossibleTag)r!   r   r   r   rÝ   ò  s    z%EncodingParser.handlePossibleStartTagc             C   s   t | jƒ | jdƒS )NT)rÌ   r2   rë   )r!   r   r   r   rÛ   õ  s    
z#EncodingParser.handlePossibleEndTagc             C   sf   | j }|jtkr(|r$|jƒ  | jƒ  dS |jtƒ}|dkrD|jƒ  n| jƒ }x|d k	r`| jƒ }qNW dS )NTr   )r2   r×   ÚasciiLettersBytesrÍ   rÜ   rÑ   ÚspacesAngleBracketsrâ   )r!   ÚendTagr2   r„   rç   r   r   r   rë   ù  s    



z EncodingParser.handlePossibleTagc             C   s   | j jdƒS )Nr   )r2   rÕ   )r!   r   r   r   rÜ     s    zEncodingParser.handleOtherc             C   s  | j }|jttdgƒB ƒ}|dks2t|ƒdks2t‚|d	kr>dS g }g }xt|dkrX|rXP nX|tkrl|jƒ }P nD|d
kr‚dj|ƒdfS |tkrš|j|j	ƒ ƒ n|dkr¦dS |j|ƒ t
|ƒ}qHW |dkrÚ|jƒ  dj|ƒdfS t
|ƒ |jƒ }|dk�rT|}x¤t
|ƒ}||k�r(t
|ƒ dj|ƒdj|ƒfS |tk�rB|j|j	ƒ ƒ n
|j|ƒ � qúW nJ|dk�rldj|ƒdfS |tk�r†|j|j	ƒ ƒ n|dk�r”dS |j|ƒ x^t
|ƒ}|tk�rÆdj|ƒdj|ƒfS |tk�rà|j|j	ƒ ƒ n|dk�rîdS |j|ƒ �q W dS )z_Return a name,value pair for the next attribute in the stream,
        if one is found, or Noneó   /Nr   r   ó   =r3   ó   'ó   ")r   N)rï   r   )rñ   rò   )r2   r   rØ   Ú	frozensetr#   r(   r4   ÚasciiUppercaseBytesr1   rÆ   rÌ   rÍ   rí   )r!   r2   r„   ÚattrNameÚ	attrValueÚ	quoteCharr   r   r   râ     sh    










zEncodingParser.getAttributeN)r;   r<   r=   r>   r"   rÂ   rÙ   rÚ   rÝ   rÛ   rë   rÜ   râ   r   r   r   r   rÁ   ¤  s   $rÁ   c               @   s   e Zd Zdd„ Zdd„ ZdS )rã   c             C   s   t |tƒst‚|| _d S )N)rB   r.   r(   r2   )r!   r2   r   r   r   r"   a  s    zContentAttrParser.__init__c             C   s  yê| j jdƒ | j  jd7  _| j jƒ  | j jdks8d S | j  jd7  _| j jƒ  | j jdkr¢| j j}| j  jd7  _| j j}| j j|ƒrœ| j || j j… S d S nF| j j}y| j jtƒ | j || j j… S  tk
ræ   | j |d … S X W n tk
�r    d S X d S )Ns   charsetr   rð   rò   rñ   )rò   rñ   )r2   rÕ   r    r   r×   rÑ   rØ   rÉ   )r!   Ú	quoteMarkÚoldPositionr   r   r   rä   e  s.    

zContentAttrParser.parseN)r;   r<   r=   r"   rä   r   r   r   r   rã   `  s   rã   c             C   s`   t | tƒr.y| jdƒ} W n tk
r,   dS X | dk	rXy
tj| ƒS  tk
rT   dS X ndS dS )z{Return the python codec name corresponding to an encoding or None if the
    string doesn't correspond to a valid encoding.r   N)rB   r.   ÚdecodeÚUnicodeDecodeErrorr
   ÚlookupÚAttributeError)r£   r   r   r   rV   ‡  s    

rV   r   r   )1Ú
__future__r   r   r   Zpip._vendor.sixr   Zpip._vendor.six.movesr   r   r¶   r‡   Úior   r	   Úpip._vendorr
   Ú	constantsr   r   r   r   r   r[   r   ró   rØ   rì   rô   rí   Úinvalid_unicode_no_surrogaterQ   rc   r(   rˆ   Úevalru   r~   Úascii_punctuation_rer…   Úobjectr   rO   rI   rJ   r.   rÄ   rÁ   rã   rV   r   r   r   r   Ú<module>   sP   








J g Ib ='