U
    d                     @   s  d Z dZdZddlZddlZeedeZeedeZ	e
e ZeedeZejd dk r`eefnefZd	d
 Zdd Zdd ZdDddZdEddZdd Zdd Zdd ZdFddZG dd deZdd Zd d! Zd"d# ZG d$d% d%e Z!G d&d' d'e!Z"G d(d) d)e!Z#G d*d+ d+e$Z%G d,d- d-e"Z&ejd dk rFd.d/ Z'ni Z(d0d/ Z'd1d2 Z)d3d4 Z*d5d6 Z+d7d8 Z,d9d: Z-d;d< Z.d=d> Z/d?d@ dAD Z0dBdC Z1dS )Gz$
Utility functions for PDF library.
zMathieu Fenniakzbiziqe@mathieu.fenniak.net    Nxrange
basestringunicode   c                 C   s
   t | tS )z8Test if arg is a string. Compatible with Python 2 and 3.)
isinstance_basestrings r
   0/tmp/pip-unpacked-wheel-eeeohlmn/PyPDF3/utils.pyisString0   s    r   c                 C   s
   t | tS )z6Test if arg is an int. Compatible with Python 2 and 3.)r   	int_types)nr
   r
   r   isInt5   s    r   c                 C   s
   t | tS )z@Test if arg is a bytes instance. Compatible with Python 2 and 3.)r   
bytes_typebr
   r
   r   isBytes:   s    r   c                 C   sH   z| ddddd }W n tk
r4   |}Y nX d|j| ||f S )N/\   z%s: %s [%s:%s]
)replacersplit
IndexError__name__)messagecategoryfilenamelinenolinefiler
   r
   r   formatWarning@   s
    
r!   c                 C   s<   t d}| d}| s8|s q8||7 }t||krq8q|S )z
    Reads non-whitespace characters and returns them.
    Stops upon encountering whitespace or when maxchars is reached.
     r   )b_readisspacelen)streamZmaxcharstxttokr
   r
   r   readUntilWhitespaceH   s    
r*   c                 C   s    t d }|t kr| d}q|S )zQ
    Finds and reads the next non-whitespace character (ignores whitespace).
    r   r   WHITESPACESr$   r'   r)   r
   r
   r   readNonWhitespaceX   s    r.   c                 C   s0   t d }d}|t kr(| d}|d7 }q|dkS )zq
    Similar to readNonWhitespace, but returns a Boolean if more than
    one whitespace character was read.
    r   r   r+   )r'   r)   Zcntr
   r
   r   skipOverWhitespaceb   s    

r/   c                 C   sF   |  d}| dd |tdkrB|tdtdfkrB|  d}q"d S )Nr   %
)r$   seekr#   r-   r
   r
   r   skipOverCommento   s
    
r5   Fc                 C   sx   t d}| d}|s*|dkr"|S td||}|dk	rj||d|  7 }| | t| d qt||7 }q|S )z
    Reads until the regular expression pattern matched (ignore the match)
    Raise PdfStreamError on premature end-of-file.
    :param bool ignore_eof: If true, ignore end-of-line and return immediately
    r"      TzStream has ended unexpectedlyNr   )r#   r$   PdfStreamErrorsearchstartr4   r&   )r'   regexZ
ignore_eofnamer)   mr
   r
   r   readUntilRegexw   s    


r=   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ConvertFunctionsToVirtualListc                 C   s   || _ || _d S N)lengthFunctiongetFunction)selfr@   rA   r
   r
   r   __init__   s    z&ConvertFunctionsToVirtualList.__init__c                 C   s   |   S r?   )r@   )rB   r
   r
   r   __len__   s    z%ConvertFunctionsToVirtualList.__len__c                    s   t |tr:t|t  t}| j fddS t|sJtdt}|dk rb|| }|dk sr||krzt	d
|S )Nc                    s    |   S r?   r
   )idxindicesrB   r
   r   <lambda>       z;ConvertFunctionsToVirtualList.__getitem__.<locals>.<lambda>z!sequence indices must be integersr   zsequence index out of range)r   slice	xrange_fnrG   r&   typerD   r   	TypeErrorr   rA   )rB   indexclsZlen_selfr
   rF   r   __getitem__   s    
z)ConvertFunctionsToVirtualList.__getitem__N)r   
__module____qualname__rC   rD   rP   r
   r
   r
   r   r>      s   r>   c                 C   s   dd t dD }d}t dD ]B}|||  t| |t|    d }|| ||  ||< ||< qd\}}g }t t|D ]p}|d d }|||  d }|| ||  ||< ||< ||| ||  d  }|ttt|| |A  qztd|S )Nc                 S   s   g | ]}|qS r
   r
   ).0ir
   r
   r   
<listcomp>   s     zRC4_encrypt.<locals>.<listcomp>   r   )r   r   r   r"   )rangeord_r&   appendr#   chrjoin)key	plaintextSjrT   retvalxtr
   r
   r   RC4_encrypt   s    $ rc   c                    s    fdd| D S )Nc                    s"   g | ]  fd dt  D qS )c                    s$   g | ]}t d d t |D qS )c                 S   s    g | ]\}}t |t | qS r
   )float)rS   rT   r_   r
   r
   r   rU      s   z8matrixMultiply.<locals>.<listcomp>.<listcomp>.<listcomp>)sumzip)rS   colrowr
   r   rU      s   z-matrixMultiply.<locals>.<listcomp>.<listcomp>)rf   )rS   r   rh   r   rU      s   
z"matrixMultiply.<locals>.<listcomp>r
   )ar   r
   r   r   matrixMultiply   s    
rk   c                 C   s`   d}|  | d tdd}|| | |d || | |  |  | d dS )z6Creates text file showing current location in context.i  r   zPyPDF2_pdfLocation.txtwZHEREN)r4   openwriter$   close)r'   ZRADIUSZ	outputDocr
   r
   r   markLocation   s    

rp   c                   @   s   e Zd ZdS )
PyPdfErrorNr   rQ   rR   r
   r
   r
   r   rq      s   rq   c                   @   s   e Zd ZdS )PdfReadErrorNrr   r
   r
   r
   r   rs      s   rs   c                   @   s   e Zd ZdS )PageSizeNotDefinedErrorNrr   r
   r
   r
   r   rt      s   rt   c                   @   s   e Zd ZdS )PdfReadWarningNrr   r
   r
   r
   r   ru      s   ru   c                   @   s   e Zd ZdS )r7   Nrr   r
   r
   r
   r   r7      s   r7   c                 C   s   | S r?   r
   r   r
   r
   r   r#      s    r#   c                 C   sJ   t }| |kr||  S t| tkr$| S | d}t| dk rB||| < |S d S )Nlatin-1   )B_CACHErL   bytesencoder&   )r	   Zbcrr
   r
   r   r#      s    
c                 C   s    t jd dk rt| dS | S d S )Nr   r   Zunicode_escape)sysversion_infor   r   r
   r
   r   u_   s    
r~   c                 C   s0   t jd dk r| S t| tkr(| dS | S d S )Nr   r   rv   )r|   r}   rL   ry   decoder   r
   r
   r   str_   s
    
r   c                 C   s*   t jd dk st| tkr"t| S | S d S Nr   r   )r|   r}   rL   strordr   r
   r
   r   rX     s    rX   c                 C   s   t jd dk r| S t| S d S r   )r|   r}   rZ   )cr
   r
   r   chr_  s    r   c                 C   s   t jd dk r| S t| S d S r   )r|   r}   	bytearrayr   r
   r
   r   barray  s    r   c                 C   s:   t jd dk r| dS dd l}|d}|| d S d S )Nr   r   hex	hex_codec)r|   r}   rz   codecs
getencoder)r   r   Zcoderr
   r
   r   	hexencode  s
    

r   c                 C   s   t | ddS )NLr"   )r   r   )numr
   r
   r   hexStr"  s    r   c                 C   s   g | ]}t |qS r
   )r#   )rS   ra   r
   r
   r   rU   &  s     rU   ) r2   r3   	 c                 C   sX   | | | }t ||  }t || }t || }||krD||krD| S ||krP|S |S d S r?   )abs)leftZupZup_leftpZ	dist_leftZdist_upZdist_up_leftr
   r
   r   paethPredictor)  s    r   )N)N)F)2__doc__
__author____author_email__r|   builtinsgetattrrW   rK   r   r   rL   ry   r   Zstring_typer}   intlongr   r   r   r   r!   r*   r.   r/   r5   r=   objectr>   rc   rk   rp   	Exceptionrq   rs   rt   UserWarningru   r7   r#   rx   r~   r   rX   r   r   r   r   r,   r   r
   r
   r
   r   <module>   sP   






	