U
    M»{j”1 ã                ð   @  s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
 d dlmZ d dlmZmZ d dlmZmZmZmZmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lm Z! ddlm"Z" ddl#m$Z$ ddlm%Z% e &e'¡Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;d Z<d!Z=d"Z>d#Z?d$Z@d%ZAd&ZBd'ZCd(ZDd)ZEd*ZFd+ZGd,ZHd-ZId.ZJd/ZKd0ZLd1ZMd2ZNd3ZOd4ZPd5ZQd6ZRd7ZSd8ZTd9ZUd:ZVd;ZWd<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMœZXdNdO„ eX Y¡ D ƒZZe-d dPddPdQfdRe.d dPddPdQfdRe-d dPdSdPdQfdTe.d dPdSdPdQfdTe-ddPddPdQfdUe.ddPddPdQfdUe-ddPdSdPdQfdVe.ddPdSdPdQfdVe-d dPddWdQfdXe.d dPddWdQfdXe-d dPdSdWdQfdYe.d dPdSdWdQfdYe-ddPddWdQfdZe.ddPddWdQfdZe-ddPdSdWdQfd[e.ddPdSdWdQfd[e-d dPdd\dQfd]e.d dPdd\dQfd]e-d dPdSd\dQfd^e.d dPdSd\dQfd^e-ddPdd\dQfd_e.ddPdd\dQfd_e-ddPdSd\dQfd`e.ddPdSd\dQfd`e-d dPddadQfdbe.d dPddadQfdbe-d dPdSdadQfdce.d dPdSdadQfdce-ddPddadQfdde.ddPddadQfdde-ddWddadQfdde.ddWddadQfdde-ddPdSdadQfdee.ddPdSdadQfdee-ddPddfdQfdge-d dPddhdQfdie-ddPddhdQfdie.ddPddhdQfdje-ddPdSdhdQfdke-ddWddhdQfdle.ddWddhdQfdme-d dnddodQfdpe.d dnddodQfdqe-ddPddodQfdre-ddWddodQfdse.ddWddodQfdte-ddnddodQfdpe.ddnddodQfdqe-ddPddudWfdve.ddPddudWfdve-dSdPddwdQfdxe.dSdPddwdQfdxe-dSdPdSdwdQfdye.dSdPdSdwdQfdye-dSdPddzdQfd{e.dSdPddzdQfd{e-dSdPddzd|fd}e.dSdPddzd|fd}e-dSdPdd~dfd€e.dSdPdd~dfd€e-dSdPdd�d‚fdƒe.dSdPdd�d‚fdƒe-dSdPddzdPfd„e.dSdPddzdPfd„e-dSdPdd~d…fd†e.dSdPdd~d…fd†e-dSdPdd�d‡fdˆe.dSdPdd�d‡fdˆe-dSdPddzdWfd{e.dSdPddzdWfd{e-dSdPdd~d‰fdŠe.dSdPdd~d‰fdŠe-dSdPdd�d‹fdŒe.dSdPdd�d‹fdŒe-dSdPddzd�fd{e.dSdPddzd�fd{e-dSdPddŽdQfd�e.dSdPddŽdQfd�e-dSdPdd‘dQfd’e.dSdPdd‘dQfd“e-dSdPdd‘d|fd”e.dSdPdd‘d|fd•e-dSdPdd‘dPfd–e.dSdPdd‘dPfd—e-dSdPdd‘dWfd’e.dSdPdd‘dWfd“e-d˜dPddPdQfd™e.d˜dPddPdQfd™e-d˜dPdSdPdQfdše.d˜dPdSdPdQfdše-d˜dPddWdQfd›e.d˜dPddWdQfd›e-d˜dPdSdWdQfdœe.d˜dPdSdWdQfdœe-d˜dPdd\dQfd�e.d˜dPdd\dQfd�e-d˜dPdSd\dQfdže.d˜dPdSd\dQfdže-d˜dPddadQfdŸe.d˜dPddadQfdŸe-d˜dPddud|fd e-d˜dPddudWfd¡e.d˜dPddudWfd¡e-d˜dPdSdadQfd¢e.d˜dPdSdadQfd¢e-d£dPddzdQfd¤e.d£dPddzdQfd¤e-d£dPdd~d|fd¥e.d£dPdd~d|fd¥e-d£dPdd�dfd¦e.d£dPdd�dfd¦e-d£dPdd‘dQfd§e-d¨dPddadQfdde.d¨dPddadQfdde-d¨dPddwdQfd}e.d¨dPddwdQfd}e-d©dPddwdQfdªe.d©dPddwdQfdªivZ[e\d«d¬„ e[D ƒƒZ]d­d®d¯d°d±d²gZ^e_ej`d³dƒ�	s„e$d´dµƒ d¶d·d¸œd¹dº„Zad»d¼„ Zbd½d¾„ Zci Zdi Zed¿dÀ„ ZfG dÁdÂ„ dÂeƒZgdÃdÄ„ ZhdÅdÆ„ ZidÇdÈ„ Zje�	rðe
ekef Zlne
ZlG dÉdÊ„ dÊelƒZmedem_deeem_ee% Y¡ D ]F\ZnZoeo pdËdÌ¡ZoeqemdÍeo› �eden d ƒ eqemdÎeo› �eeen ƒ �
q[d[e[n[oG dÏdÐ„ dÐemƒZrerZsG dÑdÒ„ dÒejƒZtdÓe-dddPdfdÔe-dddadfdÕe-dddudSfdÖe-d˜ddadfd×e-d˜ddudSfdØe-ddSdodfdÙe-dddhdfdÚe-ddSdhdfdÛe-dd˜dodfdÜe-dSddwdfdÝe-dSddzd fdÞe-dSddzdSfdße-d£ddzdfdàe-d¨ddwdfdáe-d©ddwdfdâe.ddSdodfdãe.dddhdfdäe.ddSdhdfdåe.dd˜dodfdæœZudçdè„ ZvG dédê„ dêƒZwdëdìdídîdïœdðdñ„Zxe yetjzetea¡ e {etjzev¡ e |etjzex¡ e }etjzdòdóg¡ e ~etjzdô¡ dS )õé    )ÚannotationsN)ÚMutableMapping)ÚFraction)ÚNumberÚRational)ÚIOÚTYPE_CHECKINGÚAnyÚCallableÚNoReturné   )ÚExifTagsÚImageÚ	ImageFileÚImageOpsÚImagePaletteÚTiffTags)Úi16be)Úi32be©Úo8)Ú	deprecate©ÚTYPESFTé   s   IIs   MMéÿ   é   i  i  i  i  i
  i  é  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  éD  iE  iJ  iR  iS  i[  i  i  i˜‚  i»ƒ  iI†  is‡  ii‡  i¼  i  i–Æ  i—Æ  ÚrawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzwÚ	tiff_jpegÚjpegÚtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscanÚtiff_deflateZtiff_sgilogZtiff_sgilog24ÚlzmaZzstdZwebp)r   é   é   é   é   é   é   é   i€  i€  i)€  i²€  it‡  iu‡  imˆ  iPÃ  iQÃ  c                 C  s   i | ]\}}||“qS © r,   )Ú.0ÚkÚvr,   r,   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/PIL/TiffImagePlugin.pyÚ
<dictcomp>�   s      r1   ©r   r,   )Ú1z1;Ir%   )r3   z1;IR)r3   r3   )r3   z1;R)r%   )ÚLzL;2I)r4   zL;2IR)r4   zL;2)r4   zL;2R)r'   )r4   zL;4I)r4   zL;4IR)r4   zL;4)r4   zL;4R)r+   )r4   zL;I)r4   zL;IR)r4   r4   )r4   zL;R)é   )úI;16zI;12)é   )r6   r6   )úI;16Br8   )r6   zI;16R)ÚIúI;16S)r9   úI;16BS)r&   )é    )ÚFúF;32F)r=   úF;32BF)r9   zI;32N)r9   úI;32S)r9   úI;32BS)r+   r+   )ÚLArB   )r+   r+   r+   )ÚRGBrC   )rC   zRGB;R)r+   r+   r+   r+   )ÚRGBArD   )r   )rC   ÚRGBX)r+   r+   r+   r+   r+   ©r   r   )rC   ZRGBXX)r+   r+   r+   r+   r+   r+   )r   r   r   )rC   ZRGBXXX)rD   ZRGBa)r   r   )rD   ZRGBaX)r   r   r   )rD   ZRGBaXX)r%   r   )rD   ZRGBAX)r%   r   r   )rD   ZRGBAXX)iç  )r7   r7   r7   )rC   zRGB;16L)rC   zRGB;16B)r7   r7   r7   r7   )rD   zRGBA;16L)rD   zRGBA;16B)rC   zRGBX;16L)rC   zRGBX;16B)rD   zRGBa;16L)rD   zRGBa;16Br&   )ÚPzP;1)rG   zP;1R)rG   zP;2)rG   zP;2R)rG   zP;4)rG   zP;4R)rG   rG   )rG   ZPX)ÚPArH   )rG   zP;Rr(   )ÚCMYKrI   )rI   ZCMYKX)rI   ZCMYKXX)rI   zCMYK;16Lr)   r+   )ÚLABrJ   c                 c  s   | ]}t |d  ƒV  qdS )r'   N)Úlen)r-   Zkey_tpr,   r,   r0   Ú	<genexpr>  s     rL   ó   MM *ó   II* s   MM* s   II *s   MM +s   II+ Úlibtiff_support_custom_tagsz*Support for LibTIFF earlier than version 4r5   ÚbytesÚbool)ÚprefixÚreturnc                 C  s   | d d… t kS ©Nr'   )ÚPREFIXES©rR   r,   r,   r0   Ú_accept  s    rW   c                 C  s<   t | ƒdk}t|rd|  n| ƒ |¡}|r8|d d d… S |S )Nr   éÿÿÿÿ)ÚabsÚIFDRationalÚlimit_rational)ÚvalÚmax_valÚinvÚn_dr,   r,   r0   Ú_limit_rational!  s    r`   c                 C  sP   t | ƒ}|j|jf}t|ƒ|k r.t| t|ƒƒ}t|ƒ|krLt |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminr`   rY   Úmax)r\   r]   Zmin_valÚfracr_   r,   r,   r0   Ú_limit_signed_rational'  s    
rg   c                   s   ‡ fdd„}|S )Nc                   s   t | jˆ ƒ|Ž S ra   )ÚgetattrÚ_val©ÚselfÚargs©Úopr,   r0   Údelegate=  s    z_delegate.<locals>.delegater,   )rn   ro   r,   rm   r0   Ú	_delegate<  s    rp   c                   @  s^  e Zd ZdZdZd8dd„Zedd„ ƒZedd	„ ƒZd
d„ Z	ddœdd„Z
ddœdd„Zdddœdd„Zdd„ Zdd„ ZedƒZedƒZedƒZedƒZed ƒZed!ƒZed"ƒZed#ƒZed$ƒZed%ƒZed&ƒZed'ƒZed(ƒZed)ƒZed*ƒZed+ƒZed,ƒZ ed-ƒZ!ed.ƒZ"ed/ƒZ#ed0ƒZ$ed1ƒZ%ed2ƒZ&ed3ƒZ'ed4ƒZ(ed5ƒZ)e*e+d6ƒ�rZed6ƒZ,d7S )9rZ   zÀImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )Ú
_numeratorÚ_denominatorri   r   c                 C  s†   t |tƒr&|j| _|j| _|j| _dS t |tƒrB|j| _|j| _n|| _|| _|dkrbtdƒ| _n |dkrvt|ƒ| _nt||ƒ| _dS )z®
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   Únanr   )	Ú
isinstancerZ   rb   rq   rc   rr   ri   r   Úfloat)rk   Úvaluerc   r,   r,   r0   Ú__init__Q  s    


zIFDRational.__init__c                 C  s   | j S ra   )rq   ©rk   r,   r,   r0   rb   k  s    zIFDRational.numeratorc                 C  s   | j S ra   )rr   rx   r,   r,   r0   rc   o  s    zIFDRational.denominatorc                 C  s.   | j dkr| j| j fS | j |¡}|j|j fS )z…

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rc   rb   ri   Úlimit_denominator)rk   Úmax_denominatorÚfr,   r,   r0   r[   s  s    
zIFDRational.limit_rationalÚstr©rS   c                 C  s   t t| jƒƒS ra   )r|   ru   ri   rx   r,   r,   r0   Ú__repr__€  s    zIFDRational.__repr__Úintc                 C  s
   | j  ¡ S ra   )ri   Ú__hash__rx   r,   r,   r0   r€   ƒ  s    zIFDRational.__hash__ÚobjectrQ   )ÚotherrS   c                 C  s0   | j }t|tƒr|j }t|tƒr(t|ƒ}||kS ra   )ri   rt   rZ   ru   )rk   r‚   r\   r,   r,   r0   Ú__eq__†  s    

zIFDRational.__eq__c                 C  s   | j | j| jgS ra   )ri   rq   rr   rx   r,   r,   r0   Ú__getstate__Ž  s    zIFDRational.__getstate__c                 C  s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rZ   rw   ri   rq   rr   )rk   Ústateri   rq   rr   r,   r,   r0   Ú__setstate__‘  s
    
zIFDRational.__setstate__Ú__add__Ú__radd__Ú__sub__Ú__rsub__Ú__mul__Ú__rmul__Ú__truediv__Ú__rtruediv__Ú__floordiv__Ú__rfloordiv__Ú__mod__Ú__rmod__Ú__pow__Ú__rpow__Ú__pos__Ú__neg__Ú__abs__Ú	__trunc__Ú__lt__Ú__gt__Ú__le__Ú__ge__Ú__bool__Ú__ceil__Ú	__floor__Ú	__round__Ú__int__N)r   )-Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rw   Úpropertyrb   rc   r[   r~   r€   rƒ   r„   r†   rp   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    Úhasattrr   r¡   r,   r,   r,   r0   rZ   C  sR   


rZ   c                   s   ‡ ‡fdd„}|S )Nc                   sB   ddl m} | j d¡r2| jdd …  dd¡|ˆ < ˆ| ftˆ < | S )Nr   r   Úload_r(   Ú_ú )r   r   r¢   Ú
startswithÚreplaceÚ_load_dispatch)Úfuncr   ©ÚidxÚsizer,   r0   Ú	decoratorÀ  s
    z#_register_loader.<locals>.decoratorr,   )r±   r²   r³   r,   r°   r0   Ú_register_loader¿  s    r´   c                   s   ‡ fdd„}|S )Nc                   s   | t ˆ < | S ra   )Ú_write_dispatch)r¯   ©r±   r,   r0   r³   Ì  s    z#_register_writer.<locals>.decoratorr,   )r±   r³   r,   r¶   r0   Ú_register_writerË  s    r·   c                   sZ   ddl m} | \}‰ }|||< t dˆ › �¡‰ˆd‡ ‡fdd„	ft|< ‡ fdd„t|< d S )	Nr   r   ú=Tc                   s   |   t|ƒˆ › ˆ › �|¡S ra   )Ú_unpackrK   ©rk   ÚdataÚ
legacy_api©Úfmtr²   r,   r0   Ú<lambda>Û  s    z!_register_basic.<locals>.<lambda>c                   s   d  ‡‡ fdd„|D ƒ¡S )Nó    c                 3  s   | ]}ˆ  ˆ |¡V  qd S ra   )Ú_pack©r-   rv   )r¾   rk   r,   r0   rL   à  s     z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©rk   Úvalues)r¾   rx   r0   r¿   ß  s    )T)r   r   ÚstructÚcalcsizer®   rµ   )Zidx_fmt_namer   r±   Únamer,   r½   r0   Ú_register_basicÓ  s    
þrÊ   c                   @  s8  e Zd ZU dZi Zded< i Zded< dhdd	d
ddœdd„Zedd„ ƒZ	edd„ ƒZ
eddœdd„ƒZejdddœdd„ƒZddœdd„Zddœdd„Zdd„ Zd dœd!d"„Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd dd+œd,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zeeeejd4d5fejd6d7fejd8d9fej d:d;fej!d<d=fej"d>d?fej#d@dAfej$d6d7fej%dBdCfg	ƒƒ e&dDdDƒdidFdG„ƒZ'e(dDƒdHdI„ ƒZ)e&dJdDƒdjdKdL„ƒZ*e(dJƒdMdN„ ƒZ+e&dOdPƒdkdQdR„ƒZ,e(dOƒdSdT„ ƒZ-e&dUdDƒdldVdW„ƒZ.e(dUƒdXdY„ ƒZ/e&dZdPƒdmd[d\„ƒZ0e(dZƒd]d^„ ƒZ1d_d`„ Z2dadb„ Z3dnddde„Z4dfdg„ Z5dS )oÚImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    z>dict[int, Callable[[ImageFileDirectory_v2, bytes, bool], Any]]r®   zdict[int, Callable[..., Any]]rµ   ó   II*     NrP   zbytes | Noneú
int | NoneÚNone)ÚifhrR   ÚgrouprS   c                 C  sÈ   t |ƒs dt|ƒ› d�}t|ƒ‚|dk	r,|n
|dd… | _| jtkrLd| _n| jtkr^d| _nd}t|ƒ‚|d dk| _|| _i | _	|  
¡  | jr¦|  d	|d
d… ¡n|  d|dd… ¡\| _d| _dS )a—  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr%   ú>ú<znot a TIFF IFDé+   ÚQr+   r4   r'   F)rW   ÚreprÚSyntaxErrorÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffrÐ   ÚtagtypeÚresetr¹   ÚnextÚ_legacy_api)rk   rÏ   rR   rÐ   Úmsgr,   r,   r0   rw   *  s"    

,ÿzImageFileDirectory_v2.__init__c                 C  s   | j S ra   )r×   rx   r,   r,   r0   r¿   O  rÀ   zImageFileDirectory_v2.<lambda>c                 C  s   | j S ra   )Ú_offsetrx   r,   r,   r0   r¿   P  rÀ   rQ   r}   c                 C  s   | j S ra   )rß   rx   r,   r,   r0   r¼   R  s    z ImageFileDirectory_v2.legacy_apir   ©rv   rS   c                 C  s   d}t |ƒ‚d S )Nz"Not allowing setting of legacy api)Ú	Exception)rk   rv   rà   r,   r,   r0   r¼   V  s    c                 C  s(   i | _ i | _i | _i | _d | _d | _d S ra   )Ú_tags_v1Ú_tags_v2Ú_tagdatarÜ   Ú_nextrá   rx   r,   r,   r0   rÝ   [  s    zImageFileDirectory_v2.resetr|   c                 C  s   t t| ƒƒS ra   )r|   Údictrx   r,   r,   r0   Ú__str__c  s    zImageFileDirectory_v2.__str__c                   s   ‡ fdd„ˆ   ¡ D ƒS )z�
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                   s"   i | ]\}}t  |ˆ j¡j|“qS r,   )r   ÚlookuprÐ   rÉ   )r-   Úcoderv   rx   r,   r0   r1   l  s   ÿ z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsrx   r,   rx   r0   Únamedf  s    
þzImageFileDirectory_v2.namedr   c                 C  s   t t| jƒt| jƒB ƒS ra   )rK   Úsetræ   rå   rx   r,   r,   r0   Ú__len__q  s    zImageFileDirectory_v2.__len__c                 C  sf   || j kr>| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jrbt|ttfƒsb|f}|S ra   )rå   ræ   rÜ   r®   r¼   rt   ÚtuplerP   )rk   Útagr»   Útypr²   Úhandlerr\   r,   r,   r0   Ú__getitem__t  s    



z!ImageFileDirectory_v2.__getitem__c                 C  s   || j kp|| jkS ra   )rå   ræ   ©rk   rñ   r,   r,   r0   Ú__contains__  s    z"ImageFileDirectory_v2.__contains__c                 C  s   |   ||| j¡ d S ra   )Ú_setitemr¼   )rk   rñ   rv   r,   r,   r0   Ú__setitem__‚  s    z!ImageFileDirectory_v2.__setitem__c              
     sÀ  t ttf}t || j¡‰ t||ƒr(|gn|}|| jk�rpˆ jrNˆ j| j|< �n"tj	| j|< t
dd„ |D ƒƒr’t
dd„ |D ƒƒr„tjntj| j|< nÞt
dd„ |D ƒƒ�rt
dd„ |D ƒƒrÆtj| j|< nDt
dd„ |D ƒƒrætj| j|< n$t
dd„ |D ƒƒrþtjntj| j|< ndt
dd„ |D ƒƒ�r.tj| j|< nBt
d	d„ |D ƒƒ�rPtj| j|< n t
d
d„ |D ƒƒ�rptj| j|< | j| tj	k�r’dd„ |D ƒ}n | j| tjk�r²dd„ |D ƒ}| j| tjk�oÌt|tƒ}|�sêt‡ fdd„|D ƒƒ}|�rö| jn| j}|�s´ˆ jdk�s@| j| tjk�s@ˆ jd k�r´t|ƒdk�r´|�s´|�rd| j| tjtjfk�rd|f}z|\||< W n> tk
�r°   t d|› dt|ƒ› d�¡ |d ||< Y nX n|||< d S )Nc                 s  s   | ]}t |tƒV  qd S ra   )rt   rZ   ©r-   r/   r,   r,   r0   rL   �  s     z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s  s   | ]}|d kV  qdS ©r   Nr,   rù   r,   r,   r0   rL   “  s     c                 s  s   | ]}t |tƒV  qd S ra   )rt   r   rù   r,   r,   r0   rL   –  s     c                 s  s&   | ]}d |  kodk n  V  qdS )r   r   Nr,   rù   r,   r,   r0   rL   —  s     c                 s  s&   | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr,   rù   r,   r,   r0   rL   ™  s     c                 s  s   | ]}|d kV  qdS rú   r,   rù   r,   r,   r0   rL   ž  s     c                 s  s   | ]}t |tƒV  qd S ra   )rt   ru   rù   r,   r,   r0   rL   ¡  s     c                 s  s   | ]}t |tƒV  qd S ra   )rt   r|   rù   r,   r,   r0   rL   £  s     c                 s  s   | ]}t |tƒV  qd S ra   )rt   rP   rù   r,   r,   r0   rL   ¥  s     c                 S  s&   g | ]}t |tƒr| d d¡n|‘qS )Úasciir­   )rt   r|   Úencoderù   r,   r,   r0   Ú
<listcomp>©  s   ÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |tƒrt|ƒn|‘qS r,   )rt   r   ru   rù   r,   r,   r0   rý   ®  s     c                 3  s   | ]}ˆ   |¡V  qd S ra   )Zcvt_enumrÂ   ©Úinfor,   r0   rL   ²  s     r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   rP   r|   r   rê   rÐ   rt   rÜ   ÚtypeÚ	UNDEFINEDÚallZRATIONALZSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTErè   rð   rä   rå   ÚlengthrK   Ú
ValueErrorÚwarningsÚwarn)rk   rñ   rv   r¼   Z	basetypesrÆ   Úis_ifdÚdestr,   rþ   r0   r÷   …  sz    
ÿý
ÿý
þÿþý
ýýþÿzImageFileDirectory_v2._setitem)rñ   rS   c                 C  s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S ra   )rå   Úpoprä   ræ   rõ   r,   r,   r0   Ú__delitem__Õ  s    z!ImageFileDirectory_v2.__delitem__c                 C  s   t t| jƒt| jƒB ƒS ra   )Úiterrî   ræ   rå   rx   r,   r,   r0   Ú__iter__Ú  s    zImageFileDirectory_v2.__iter__c                 C  s   t  | j| |¡S ra   )rÇ   ÚunpackrÙ   )rk   r¾   r»   r,   r,   r0   r¹   Ý  s    zImageFileDirectory_v2._unpackc                 G  s   t j| j| f|žŽ S ra   )rÇ   ÚpackrÙ   )rk   r¾   rÆ   r,   r,   r0   rÁ   à  s    zImageFileDirectory_v2._packÚHÚshortr4   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longr{   ru   ÚdÚdoublerÔ   Zlong8r   Tc                 C  s   |S ra   r,   rº   r,   r,   r0   Ú	load_byteô  s    zImageFileDirectory_v2.load_bytec                 C  s*   t |tƒrt|ƒ}t |tƒr&t|fƒ}|S ra   )rt   rZ   r   rP   ©rk   r»   r,   r,   r0   Ú
write_byteø  s
    


z ImageFileDirectory_v2.write_byter%   c                 C  s"   |  d¡r|d d… }| dd¡S )Nó    rX   zlatin-1r­   )ÚendswithÚdecoderº   r,   r,   r0   Úload_string   s    
z!ImageFileDirectory_v2.load_stringc                 C  s0   t |tƒrt|ƒ}t |tƒs(| dd¡}|d S )Nrû   r­   r!  )rt   r   r|   rP   rü   ©rk   rv   r,   r,   r0   Úwrite_string  s
    

z"ImageFileDirectory_v2.write_stringr(   r+   c                   sV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr'   r4   c                   s   ˆ r| |fS t | |ƒS ra   ©rZ   ©Úar  ©r¼   r,   r0   Úcombine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  s   | ]\}}ˆ ||ƒV  qd S ra   r,   ©r-   ÚnumÚdenom©r+  r,   r0   rL     s     z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r%   r   ©r¹   rK   rð   Úzip©rk   r»   r¼   Úvalsr,   ©r+  r¼   r0   Úload_rational  s    z#ImageFileDirectory_v2.load_rationalc                   s   d  ‡ fdd„|D ƒ¡S )NrÀ   c                 3  s"   | ]}ˆ j dt|dƒžŽ V  qdS )Ú2Ll   ÿÿ N)r6  )rÁ   r`   ©r-   rf   rx   r,   r0   rL     s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>rÃ   rÅ   r,   rx   r0   Úwrite_rational  s    ÿz$ImageFileDirectory_v2.write_rationalr*   c                 C  s   |S ra   r,   rº   r,   r,   r0   Úload_undefined  s    z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tƒrt|ƒ}t |tƒr,t|ƒ dd¡}|S )Nrû   r­   )rt   rZ   r   r|   rü   r%  r,   r,   r0   Úwrite_undefined"  s
    

z%ImageFileDirectory_v2.write_undefinedé
   c                   sV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr'   r  c                   s   ˆ r| |fS t | |ƒS ra   r'  r(  r*  r,   r0   r+  .  s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  s   | ]\}}ˆ ||ƒV  qd S ra   r,   r,  r/  r,   r0   rL   1  s     z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r%   r   r0  r2  r,   r4  r0   Úload_signed_rational*  s    z*ImageFileDirectory_v2.load_signed_rationalc                   s   d  ‡ fdd„|D ƒ¡S )NrÀ   c                 3  s$   | ]}ˆ j dt|ddƒžŽ V  qdS )Ú2liÿÿÿi   €N)r=  )rÁ   rg   r7  rx   r,   r0   rL   5  s   ÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>rÃ   rÅ   r,   rx   r0   Úwrite_signed_rational3  s    þz+ImageFileDirectory_v2.write_signed_rationalc                 C  s8   |  |¡}t|ƒ|kr4d|› dt|ƒ› d�}t|ƒ‚|S )Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )ÚreadrK   ÚOSError)rk   Úfpr²   Úretrà   r,   r,   r0   Ú_ensure_read:  s    
ÿz"ImageFileDirectory_v2._ensure_readc              
   C  s„  |   ¡  | ¡ | _�z2| jr0|  d|  |d¡¡n|  d|  |d¡¡d }t|ƒD �]¼}| jrp|  d|  |d¡¡n|  d|  |d	¡¡\}}}}t || j	¡j
}t |d
¡}	d|› d|› d|	› d|› d�	}
z| j| \}}W n& tk
rþ   t d|
|¡ Y qPY nX || }|| j�rdndk�rv| ¡ }|  | j�r6dnd|¡\}|
d|› d|› �7 }
| |¡ t ||¡}| |¡ n|d |… }t|ƒ|k�r¼t d|› dt|ƒ› d|› �¡ t |
¡ qP|�sÎt |
¡ qP|| j|< || j|< |
d|dk�rød| nt|ƒ 7 }
t |
¡ qP| j�r,|  d|  |d¡¡n|  d|  |d¡¡\| _W n8 tk
�r~ }
 zt t|
ƒ¡ W Y ¢d S d }
~
X Y nX d S )NrÔ   r+   r  r%   r   ZHHQ8sé   ÚHHL4sr5   Úunknownztag: ú (ú
) - type: ú)z%s - unsupported type %sr'   r4   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r?  z. Skipping tag ú
 - value: r<   ú<table: %d bytes>)rÝ   Útellrá   rÛ   r¹   rD  Úranger   rê   rÐ   rÉ   r   Úgetr®   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readrK   r  r  ræ   rÜ   rÕ   rÞ   rA  r|   )rk   rB  Z	tag_countÚirñ   rò   Úcountr»   ÚtagnameÚtypnamerà   Z	unit_sizeró   r²   ÚhereÚoffsetr,   r,   r0   ÚloadD  sj    
ÿýÿÿý


ÿ



ÿÿý
zImageFileDirectory_v2.loadr   c              
   C  s  |   dt| jƒ¡}g }|t|ƒ t| jƒd  d }d }t| j ¡ ƒD �]Ô\}}|tkr`t|ƒ}| j |¡}t 	d||t
|ƒ¡ |tjko’t|tƒ}|rè| jdkr¨d}	nd}	t|	|d�}
| j| }| ¡ D ]\}}||
|< qÊ|
 |¡}n(t|tƒrö|n|f}| j| | f|žŽ }t || j¡j}|�r*d	n
t |d
¡}d|› d|› d|› d|› d�	}|dt|ƒdk�rrdt|ƒ nt|ƒ 7 }t 	|¡ |�r”d}n(|tjtjtjfk�r´t|ƒ}nt|ƒ}t|ƒdk�rè| |||| dd¡df¡ qF| ||||   d|¡|f¡ |t|ƒd d d 7 }qF|d k	�rz|| \}}}}}|�rLd}t|ƒ‚|   d|  d|¡d | ¡}|||||f||< |D ]B\}}}}}t 	d|||t
|ƒt
|ƒ¡ ||   d||||¡7 }�q~|d7 }|D ].\}}}}}||7 }t|ƒd@ �rÎ|d7 }�qÎ|S )Nr  r5   r'   zTag %s, Type: %s, Value: %srÒ   s   II*    s   MM *   )rÐ   ÚifdrG  zsave: rH  rI  rJ  rK  r7   rL  r   r!  rÀ   r4   r%   z&multistrip support not yet implementedr   z%s %s %s %s %srF  s       ) rÁ   rK   rå   Úsortedrì   ÚSTRIPOFFSETSrÜ   rO  rQ  rR  rÕ   r   r  rt   rè   rÙ   rË   Útobytesrð   rµ   rê   rÐ   rÉ   r   r|   r	  r  r  ÚappendÚljustÚNotImplementedErrorr¹   )rk   rZ  ÚresultÚentriesZstripoffsetsrñ   rv   rò   r  rÏ   r\  rÆ   Zifd_tagZ	ifd_valuer»   rW  rX  rà   rV  r,   r,   r0   r_  ‡  sj    


 ÿ


zImageFileDirectory_v2.tobytesc                 C  sN   |  ¡ dkr&| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ZHLé*   r+   )rM  Úwriter×   rÁ   r_  rK   )rk   rB  rZ  rc  r,   r,   r0   ÚsaveÔ  s    

zImageFileDirectory_v2.save)rÌ   NN)T)T)T)T)T)r   )6r¢   r£   r¤   r¥   r®   Ú__annotations__rµ   rw   r§   rR   rZ  r¼   ÚsetterrÝ   ré   rí   rï   rô   rö   rø   r÷   r  r  r¹   rÁ   ÚlistÚmaprÊ   r   r  r  ZSIGNED_BYTEr  r  ÚFLOATr  ZIFDZLONG8r´   r  r·   r   r$  r&  r5  r8  r9  r:  r<  r>  rD  r[  r_  rg  r,   r,   r,   r0   rË   ê  s€   
<   ü%P








÷þÿ





C
MrË   r«   rª   r©   Zwrite_c                      sŠ   e Zd ZU dZ‡ fdd„Zedd„ ƒZedd„ ƒZded< e	d	d
„ ƒZ
ddœdd„Zdd„ Zddœdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚImageFileDirectory_v1aþ  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                   s   t ƒ j||Ž d| _d S )NT)Úsuperrw   rß   )rk   rl   Úkwargs©Ú	__class__r,   r0   rw   ü  s    zImageFileDirectory_v1.__init__c                 C  s   | j S ra   )rä   rx   r,   r,   r0   r¿      rÀ   zImageFileDirectory_v1.<lambda>c                 C  s   | j S ra   )ræ   rx   r,   r,   r0   r¿     rÀ   zdict[int, int]rÜ   c                 C  s(   | |j d�}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        rV   )rR   ræ   rÜ   rÞ   )ÚclsÚoriginalr\  r,   r,   r0   Úfrom_v2  s
    zImageFileDirectory_v1.from_v2rË   r}   c                 C  s4   t | jd�}t| jƒ|_t| jƒ|_t| jƒ|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        rV   )rË   rR   rè   ræ   rÜ   rå   )rk   r\  r,   r,   r0   Úto_v2  s
    zImageFileDirectory_v1.to_v2c                 C  s   || j kp|| jkS ra   )rä   ræ   rõ   r,   r,   r0   rö   *  s    z"ImageFileDirectory_v1.__contains__r   c                 C  s   t t| jƒt| jƒB ƒS ra   )rK   rî   ræ   rä   rx   r,   r,   r0   rï   -  s    zImageFileDirectory_v1.__len__c                 C  s   t t| jƒt| jƒB ƒS ra   )r  rî   ræ   rä   rx   r,   r,   r0   r  0  s    zImageFileDirectory_v1.__iter__c                 C  s   dD ]}|   |||¡ qd S ©N)FT)r÷   )rk   rñ   rv   r¼   r,   r,   r0   rø   3  s    z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j krL| j| }| j| }| j| \}}dD ]}|  ||| ||ƒ|¡ q0| j | }t|ttfƒsj|f}|S rv  )rä   ræ   rÜ   r®   r÷   rt   rð   rP   )rk   rñ   r»   rò   r²   ró   Úlegacyr\   r,   r,   r0   rô   7  s    



z!ImageFileDirectory_v1.__getitem__)r¢   r£   r¤   r¥   rw   r§   ÚtagsZtagdatarh  Úclassmethodrt  ru  rö   rï   r  rø   rô   Ú__classcell__r,   r,   rp  r0   rm  é  s   

rm  c                      s¤   e Zd ZdZdZdZd‡ fdd„	Zddœd	d
„Zedd„ ƒZ	dddœdd„Z
dddœdd„Zddœdd„Zdd„ Z‡ fdd„Zddœdd„Zdd„ Zdd„ Z‡  ZS ) ÚTiffImageFileZTIFFz
Adobe TIFFFNc                   s   d | _ d | _tƒ  ||¡ d S ra   )Útag_v2rñ   rn  rw   )rk   rB  Úfilenamerp  r,   r0   rw   Q  s    zTiffImageFile.__init__rÎ   r}   c                 C  s˜   | j  d¡}|d dkr(|| j  d¡7 }t|ƒ| _d| _| jj | _| _d| _| j | _	g | _
d| _t d¡ t d| j¡ t dt|ƒ¡ |  d	¡ dS )
z#Open the first image in a TIFF filer+   r%   rÓ   NrX   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )rB  r@  rË   r|  r\  rÞ   Z_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_fpÚ
_frame_posÚ	_n_framesrQ  rR  rÕ   Ú_seek)rk   rÏ   r,   r,   r0   Ú_openZ  s    

zTiffImageFile._openc                 C  sP   | j d krJ|  ¡ }|  t| jƒ¡ | j d kr@|  |  ¡ d ¡ q"|  |¡ | j S )Nr   )r‚  rM  rƒ  rK   r�  rS  )rk   Úcurrentr,   r,   r0   Ún_framesu  s    


zTiffImageFile.n_framesr   )ÚframerS   c                 C  s<   |   |¡sdS |  |¡ t | j¡ tj | j| j¡| _dS )z%Select a given frame as current imageN)	Z_seek_checkrƒ  r   Z_decompression_bomb_checkr²   ÚcoreÚnewÚmodeÚim)rk   r‡  r,   r,   r0   rS    s
    

zTiffImageFile.seekc                 C  s~  | j | _| j ¡  t| jƒ|krþ| js2d}t|ƒ‚t d|| j	| j| j ¡ ¡ | jdkrdd}t
|ƒ‚| j | j¡ | j | j¡ t d| j ¡ ¡ | j | j¡ | jj| jkr¶d| _n
| jj| _| jdkrÔ|d | _t| jƒdkrî| jdk| _|  j	d7  _	q| j | j| ¡ | j | j¡ t| jk�r<| jt | jd< nd| jk�rP| jd= |  ¡  t | j¡ | _| _|| _	|  ¡  d S )	Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %sl            zUnable to seek to framezLoading tags, location: %sr   r   Zxmp)r€  rB  rM  rK   r�  r~  ÚEOFErrorrQ  rR  r  r  rS  r`  r|  r[  rÞ   r‚  Úis_animatedÚXMPrÿ   Z_reload_exifrm  rt  rñ   r\  Ú_setup)rk   r‡  rà   r,   r,   r0   rƒ  Š  sL    
û



zTiffImageFile._seekc                 C  s   | j S )zReturn the current frame number)r  rx   r,   r,   r0   rM  º  s    zTiffImageFile.tellc                 C  s¶   i }| j  tjj¡}|r²|dd… dkr²t|dd… ƒ}t |d d d ¡d }t|d| d| … ƒ}|d| d| | … }d|i||< |t d| | d ¡d d… }q|S )	a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        Nr'   s   8BIMr)   r   r%   r;  r»   )	r|  rO  r   ÚBaseZImageResourcesÚi16ÚmathÚceilÚi32)rk   Úblocksr\   ÚidÚnr²   r»   r,   r,   r0   Úget_photoshop_blocks¾  s    $z"TiffImageFile.get_photoshop_blocksc                   s   | j r| jr|  ¡ S tƒ  ¡ S ra   )ÚtileÚuse_load_libtiffÚ_load_libtiffrn  r[  rx   rp  r,   r0   r[  Ó  s    zTiffImageFile.loadc                 C  sj   | j s>d| _| j ¡  |  ¡ }tjD ]}||kr2q$| |¡ q$tj	| dd� t
jj| jkrf| jt
jj= d S )NT)Zin_place)r�  Ú!_close_exclusive_fp_after_loadingrB  rM  Zgetexifr   ÚTAGS_V2_GROUPSÚget_ifdr   Zexif_transposer   r�  ZOrientationr|  )rk   ÚexifÚkeyr,   r,   r0   Úload_endØ  s    

zTiffImageFile.load_endc           
   
   C  sâ  t j  | ¡ |  ¡  t| jƒdks.d}t|ƒ‚| jd d }t| jd d ƒ}z0t| jdƒod| j 	¡ }t| jdƒr|| j 
¡  W n tk
r–   d}Y nX |r¤||d< t  | jd	t|ƒ| j¡}z| | j|¡ W n0 tk
rþ } zd
}t|ƒ|‚W 5 d}~X Y nX | j�o| j }t| jdƒ�r>t d¡ | | j ¡ ¡\}}	n\|�rpt d¡ |�s`| j d¡ | d¡\}}	n*t d¡ | j d¡ | | j ¡ ¡\}}	g | _d| _|  ¡  |�rÄ| j ¡  d| _|	dk �rÖt|	ƒ‚t j  | ¡S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r&   ÚfilenoÚflushFr%   ÚlibtiffzCouldn't set the imageNÚgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   r[  Zload_preparerK   r™  rA  rj  r¨   rB  r¢  r£  Z_getdecoderrŠ  rð   ZdecoderconfigÚsetimager‹  r  Z_exclusive_fpr�  rQ  rR  r#  r¥  rS  r@  Úreadonlyr¡  Úclose)
rk   rà   Zextentsrl   rB  ÚdecoderÚeZclose_self_fpr—  Úerrr,   r,   r0   r›  í  s^    
   ÿ





zTiffImageFile._load_libtiffc              
   C  s  d| j krd}t|ƒ‚t| j  td¡ | _| j  td¡| _| j  td¡}| jdkrVd}| j  t	d¡}t
 d¡ t
 d| j¡ t
 d	|¡ t
 d
| j¡ t
 d|¡ t
 d| j t¡¡ t| j  t¡ƒ}t| j  t¡ƒ}||f| _t
 d| j¡ | j  td¡}t|ƒdk�r2t|ƒt|ƒ  k�r*dk�r2n nd}| j  td¡}| j  td¡}|dk�r^d}	n|dk�rnd}	nd}	|	t|ƒ7 }	t|ƒ}
| j  t| jdk�r¨|dk�r¨dnd¡}|tk�rÐt
 d|¡ d}t|ƒ‚||
k �rè|d|… }n||
k�r|
dk�r|| }t|ƒ|k�rd}t|ƒ‚| j j|||||f}t
 d|¡ zt| \| _}W n< t k
�rŒ } zt
 d¡ d}t|ƒ|‚W 5 d}~X Y nX t
 d|¡ t
 d| j!¡ | j| j"d< | j  t#d¡}| j  t$d¡}|�rZ|�rZ| j  t%¡}|dk�r||f| j"d < nX|dk�r$|d! |d! f| j"d < n6|dk�rL||f| j"d < ||f| j"d"< n||f| j"d"< d } }}g | _&t'�pz| jd#k| _(| j(�rX|dk�rÆ|dd… d |dd…  }t
 d|¡ t| \| _}|d$k�rÔd%}d&|k�rê| )d&d'¡}d(|k�r | )d(d'¡}|dk�r&| jd)k�r&| jdk�r&d*}|| jd+| j j*f}| j& +d,dd||fd|f¡ �nXt,| j k�spt-| j k�ršt,| j k�r | j t, }| j  t.|¡}| jd }n"| j t- }| j  t/¡}| j  t0¡}|D ]Ð}|| |k�rê|t1|ƒ d- }nd}|}| jdk�r|| }||	 }|t|ƒdf}| j& +| j||t|| |ƒt|| |ƒf||f¡ || }|| jd k�rÆd||  }}|| jd k�rÆd }}|d7 }�qÆnt
 d.¡ d}t|ƒ‚t2| j k�rÌ| j t2 | j"d/< | j!d0k�r d1d2„ | j t3 D ƒ}t4 5d3d4 6|¡¡| _7dS )5z-Setup this image object based on current tagsi¼  z+Windows Media Photo files not yet supportedr   r   r    r)   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %sz
- size: %sr2   r,   )r%   r)   r+   r&   r(   r'   )r%   r)   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %sÚcompressionr%   ÚdpigR¸…ëQ@Ú
resolutionr   r6   úI;16Nz;16Bz;16Nz;16Lr!   rC   Fr¤  r+   z- unsupported data organizationÚicc_profile©rG   rH   c                 S  s   g | ]}t |d  ƒ‘qS ©r   r   )r-   r  r,   r,   r0   rý     s     z(TiffImageFile._setup.<locals>.<listcomp>úRGB;LrÀ   )8r|  rA  ÚCOMPRESSION_INFOrO  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONZ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERrQ  rR  rñ   ÚYCBCRSUBSAMPLINGr   Ú
IMAGEWIDTHÚIMAGELENGTHÚ_sizer²   ÚSAMPLEFORMATrK   re   rd   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELÚMAX_SAMPLESPERPIXELÚerrorrÖ   rR   Ú	OPEN_INFOÚ_moderP  rŠ  rÿ   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITr™  ÚREAD_LIBTIFFrš  r­   rZ  r`  r^  ÚTILEOFFSETSÚROWSPERSTRIPÚ	TILEWIDTHÚ
TILELENGTHÚsumÚ
ICCPROFILEÚCOLORMAPr   r   rÄ   Úpalette)rk   rà   ÚphotoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr   Úrawmoderª  ZxresZyresZresunitÚxÚyÚlayerr)  Úoffsetsr  ÚwrZ  ÚstrideZtile_rawmoderÑ  r,   r,   r0   r�  B  s   



2

þ
 ÿ
ú







ÿþý 

üÿ
zTiffImageFile._setup)NN)r¢   r£   r¤   ÚformatÚformat_descriptionrœ  rw   r„  r§   r†  rS  rƒ  rM  r˜  r[  r¡  r›  r�  rz  r,   r,   rp  r0   r{  L  s   	
	0Ur{  r3   r4   rB   rG   rH   r@   r6   r:   r>   rC   rE   rD   rI   ÚYCbCrrJ   rA   r8   r;   r?   )r3   r4   rB   rG   rH   r9   r6   r:   r=   rC   rE   rD   rI   rÜ  rJ   rA   r8   r;   r?   c           5      C  s€	  zt | j \}}}}}}W n: tk
rT }	 zd| j› d�}
t|
ƒ|	‚W 5 d }	~	X Y nX t|d�}| j}| j}z|d }W n. tk
r¦   | j d¡}t	|t
ƒr¢d }Y nX |d kr¶d}n|dkrÄd}n|dkrÐd	}tpÚ|dk}d
|t< | jd |t< | jd
 |t< d|k�r|d }n:d|k�rJ|d }t	|tƒ�rNt ¡ }| |¡ |}ni }t dt|ƒ¡ t	|tƒ�rr| ¡ }|D ]j}t	|tjƒ�r¤|tjk�r¤| |¡||< n| |¡||< z|j| |j|< W n tk
�rÜ   Y nX �qvi }t| dƒ�rü| j ¡ }|t | di ƒ–}t!t"fD ]}||k�r||= �qt| dƒ�r¨t#t$t%t&t't(fD ]^}|| j)k�rH|t&k�r„| j)j| tj*tj+fk�r„||= n | j)| ||< | j)j| |j|< �qH| d| j d¡¡}|�rÊ||t,< t-dft$dft%dft$dft%dft#dft.dft/dft0dft1dff
D ] \}}||k�r
|| ||< �q
| d¡}|�r\d|t#< |d |t$< |d
 |t%< |dk�rˆ||t2< t3|ƒd
k�rˆt3|ƒ|t4< |d k	�rš||t5< |d
k�r¬||t"< t6|k�rÀ||t6< nŒ| jdk�rL|t6 dk�rL| jdk�rB|  7¡ }| ¡ }t8|j9ƒD ]:}t8|j:ƒD ](}|||f d k�r(dnd |||f< �q�q |} n
t; <| ¡} | jd!k�rÆ| j= >d"d#¡}g }t3|ƒd$ }t8d$ƒD ]>} |d%d&„ |||  || d
  … D ƒ7 }|dgd'|  7 }�q~||t?< |t |t  }!}"t3|ƒ|!|d  d( d)  }#t@|k�rh|�rN| d*tA¡}$|#dk�rd
ntB|$|# |"ƒ}%|dk�rRtB|%d( d) d) |"ƒ}%n|"}%|%dk�r`d
}%|%|t@< |#dk�rvd
n
|#|t@  }&|"|t@  d
 |t@  }'|&d+k�r°tjC|jtD< |&f|'d
  |#|" |&|'d
   f |tD< tEt8d|&|' |&ƒƒ|tF< tG |d
¡|tH< | jd,k�r4tId-tJd.i K¡ D ]\}}(| L||(¡ �qtMtNtOtPg})|�	r,d/|k�r¢|d/ }*t	|*t
ƒ�rx|*dk �sx|*d0k�r„d1}
tQ|
ƒ‚|dk�ršd2}
tQ|
ƒ‚|*|tR< t d3¡ t d4tS| K¡ ƒ¡ d}+t|d5ƒ�rz| Td¡ tU V| W¡ ¡}+W n tXjYk
�r   Y nX i },|)tZtJtDtFt[t\g7 })t2|d i}-t] ^| K¡ | K¡ ¡D ]Ò\}}(|tj_k�r¶t tj`d6d7ƒ�sf�q>||jk�r‚|j| |,|< n4t	|(t
tatbtfƒ�sœ�q>nt c|¡jd}.|.�r¶|.|,|< ||-k�r>||)k�r>t	|(tbƒ�rì|( ed8d9¡d: |-|< n"t	|(tfƒ�rta|(ƒ|-|< n|(|-|< �q>t"|-k�r>t3|-t" ƒd
k�r>|-t" d |-t"< t d;tS|- K¡ ƒ¡ | jd<k�rbd=}t|- K¡ ƒ}/|/ g¡  |||+||/|,f}0t h| jd>|0|¡}1|1 i| j=d?| j ¡ |1 ed@¡d
d … \}2}3|+�sÒ| j|3¡ |2�r¬�qà�q¬|+�	rztU k|+¡ W n tk
�	r
   Y nX |2dk �	rldA|2› dB�}
t|
ƒ‚n@|)D ]}||= �	q0| l|¡}4tm n| |dd?| j |4||#d
ffg¡ dC|k�	r||| _od S )DNzcannot write mode z as TIFFrV   r¬  r   r    r!   r#   r"   r   r   ZtiffinforŸ  zTiffinfo Keys: %srñ   r|  r°  Údescriptionr®  Zx_resolutionZy_resolutionZresolution_unitZsoftwareÚ	date_timeZartistÚ	copyrightr­  r%   r2   )r3   r4   r3   r   r±  rC   r³  r&   c                 S  s   g | ]}|d  ‘qS r²  r,   rù   r,   r,   r0   rý   ×  s     z_save.<locals>.<listcomp>r   r*   r+   Z
strip_sizer   rÜ  )r   r   )r   r   é€   r   rà  r   Úqualityéd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr¢  rO   Frû   r­   r!  zConverted items: %s)r8   r6   r¯  r¤  rF   i @  zencoder error z when writing image fileÚ_debug_multipage)pÚ	SAVE_INFOrŠ  rP  rA  rË   ÚencoderinfoÚencoderconfigrÿ   rO  rt   r   ÚWRITE_LIBTIFFr·  r²   r»  r¼  rP   r   ZExifr[  rQ  rR  rj  rm  ru  r   r�  rž  rÜ   rã   r¨   rñ   rh   ÚEXIFIFDr¾  rÈ  rÆ  rÇ  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKrŽ  r|  r	  r  rÏ  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTr¿  rK   rÁ  rÀ  r¸  ÚcopyrN  ÚheightÚwidthr   Úinvertr‹  Z
getpaletterÐ  rË  Ú
STRIP_SIZErd   r  ÚSTRIPBYTECOUNTSrð   r^  ÚCOMPRESSION_INFO_REVrµ  rº  ÚREFERENCEBLACKWHITErì   Ú
setdefaultrÌ  rÍ  rÊ  ÚTILEBYTECOUNTSr  ÚJPEGQUALITYr]  rS  ÚosÚdupr¢  ÚioÚUnsupportedOperationÚOSUBFILETYPEÚTRANSFERFUNCTIONÚSUBIFDÚ	itertoolsÚchainZLIBTIFF_CORErˆ  ru   r|   rê   r   rü   rZ   ÚsortZ_getencoderr¦  rf  r¨  rg  r   Ú_saverã  )5r‹  rB  r}  rÓ  rR   rÒ  rÚ  ÚbitsÚextrarª  rà   r\  rå  ræ  r¬  r¤  rÿ   rŸ  r   Z
legacy_ifdZsupplied_tagsrñ   ZiccrÉ   r­  Zinverted_imZpxrÕ  rÔ  ZlutZcolormapÚcolorsrU  rØ  r  rÙ  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagerv   Z	blocklistrá  r€  ÚtypesZattsr   rx  r)  ÚencoderÚerrcoder»   rZ  r,   r,   r0   r  C  sÆ   








ü

úþö






*
&



ÿ
ÿ  þ
 


ú





  ÿ
r  c                   @  sŠ  e Zd ZdddddddddddddddddgZdddd	d
dhZdGdd„Zddœdd„Zddœdd„Zddœdd„Zd dœdd„Z	dddœdd„Z
ddœdd„Zejfd d!„Zddœd"d#„Zd$dd%œd&d'„Zddœd(d)„Zd*d+d,œd-d.„Zddœd/d0„Zddœd1d2„Zddd3œd4d5„Zddd3œd6d7„Zddd3œd8d9„Zddd3œd:d;„Zddd3œd<d=„Zddœd>d?„Zddœd@dA„ZdHddBdBddCœdDdE„ZdFS )IÚAppendingTiffWriterr   r   r%   r'   r+   r   i   r   i  i  i	  Fc                 C  sv   t |dƒr|| _d| _nF|| _d| _zt||r2dndƒ| _W n  tk
r\   t|dƒ| _Y nX | j ¡ | _|  ¡  d S )Nr@  FTzw+bzr+b)	r¨   r{   Úclose_fprÉ   ÚopenrA  rM  Ú	beginningÚsetup)rk   Úfnr‰  r,   r,   r0   rw   •  s    
zAppendingTiffWriter.__init__rÎ   r}   c                 C  sŒ   | j  | jtj¡ d | _d| _| j  d¡ | _}|s>d| _	d S d| _	|dkrX|  
d¡ n |dkrl|  
d¡ nd	}t|ƒ‚|  ¡  |  ¡  d S )
Nr   r'   TFrN   rÒ   rM   rÑ   zInvalid TIFF file header)r{   rS  r  rû  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPager@  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)rk   Úiimmrà   r,   r,   r0   r  £  s     zAppendingTiffWriter.setupc                 C  s„   | j r
d S | j | j¡ | j d¡}|s,d S || jkrBd}t|ƒ‚|  ¡ }|| j7 }| j | j¡ |  	|¡ | j |¡ |  
¡  d S )Nr'   z1IIMM of new page doesn't match IIMM of first page)r  r{   rS  r  r@  r  r  ÚreadLongr  Ú	writeLongÚfixIFD)rk   r  rà   Ú
ifd_offsetr,   r,   r0   Úfinalize¼  s    


zAppendingTiffWriter.finalizec                 C  s   |   ¡  |  ¡  d S ra   )r   r  rx   r,   r,   r0   ÚnewFrameÓ  s    zAppendingTiffWriter.newFramec                 C  s   | S ra   r,   rx   r,   r,   r0   Ú	__enter__Ø  s    zAppendingTiffWriter.__enter__r�   )rl   rS   c                 G  s   | j r|  ¡  d S ra   )r  r¨  rj   r,   r,   r0   Ú__exit__Û  s    zAppendingTiffWriter.__exit__r   c                 C  s   | j  ¡ | j S ra   )r{   rM  r  rx   r,   r,   r0   rM  ß  s    zAppendingTiffWriter.tellc                 C  s*   |t jkr|| j7 }| j ||¡ |  ¡ S ra   )rû  r  r  r{   rS  rM  )rk   rZ  Úwhencer,   r,   r0   rS  â  s    

zAppendingTiffWriter.seekc                 C  s^   | j  dtj¡ | j  ¡ }d|d  }d|  k r:dk rNn n| j  t|ƒ¡ | j  ¡ | _d S )Nr   r7   )r{   rS  rû  ÚSEEK_ENDrM  rf  rP   r  )rk   ÚposZ	pad_bytesr,   r,   r0   r  é  s    
zAppendingTiffWriter.goToEndr|   )ÚendianrS   c                 C  s4   || _ | j › d�| _| j › d�| _| j › d�| _d S )Nr4   r  ZHHL)r'  ÚlongFmtÚshortFmtÚ	tagFormat)rk   r'  r,   r,   r0   r  ó  s    zAppendingTiffWriter.setEndianc                 C  sP   |   ¡ }|dkr"| j ¡ d | _qL| j |¡ |  ¡ }| j |d tj¡ q d S )Nr   r'   r5   )r  r{   rM  r  rS  Ú	readShortrû  ÚSEEK_CUR)rk   r  Únum_tagsr,   r,   r0   r  ù  s    zAppendingTiffWriter.skipIFDsrP   rÍ   )r»   rS   c                 C  s   | j  |¡S ra   )r{   rf  r  r,   r,   r0   rf    s    zAppendingTiffWriter.writec                 C  s   t  | j| j d¡¡\}|S )Nr%   )rÇ   r  r)  r{   r@  r%  r,   r,   r0   r+    s    zAppendingTiffWriter.readShortc                 C  s   t  | j| j d¡¡\}|S rT   )rÇ   r  r(  r{   r@  r%  r,   r,   r0   r    s    zAppendingTiffWriter.readLongrâ   c                 C  sN   | j  dtj¡ | j  t | j|¡¡}|d k	rJ|dkrJd|› d�}t|ƒ‚d S )Néþÿÿÿr'   úwrote only ú bytes but wanted 4©	r{   rS  rû  r,  rf  rÇ   r  r(  r  ©rk   rv   Zbytes_writtenrà   r,   r,   r0   ÚrewriteLastShortToLong  s
    z*AppendingTiffWriter.rewriteLastShortToLongc                 C  sN   | j  dtj¡ | j  t | j|¡¡}|d k	rJ|dkrJd|› d�}t|ƒ‚d S )Nr.  r%   r/  ú bytes but wanted 2)	r{   rS  rû  r,  rf  rÇ   r  r)  r  r2  r,   r,   r0   ÚrewriteLastShort  s
    z$AppendingTiffWriter.rewriteLastShortc                 C  sN   | j  dtj¡ | j  t | j|¡¡}|d k	rJ|dkrJd|› d�}t|ƒ‚d S )Néüÿÿÿr'   r/  r0  r1  r2  r,   r,   r0   ÚrewriteLastLong  s
    z#AppendingTiffWriter.rewriteLastLongc                 C  s>   | j  t | j|¡¡}|d k	r:|dkr:d|› d�}t|ƒ‚d S )Nr%   r/  r4  )r{   rf  rÇ   r  r)  r  r2  r,   r,   r0   Ú
writeShort$  s    zAppendingTiffWriter.writeShortc                 C  s>   | j  t | j|¡¡}|d k	r:|dkr:d|› d�}t|ƒ‚d S )Nr'   r/  r0  )r{   rf  rÇ   r  r(  r  r2  r,   r,   r0   r  *  s    zAppendingTiffWriter.writeLongc                 C  s   |   ¡  | j ¡  d S ra   )r   r{   r¨  rx   r,   r,   r0   r¨  0  s    zAppendingTiffWriter.closec                 C  sü   |   ¡ }t|ƒD ]æ}t | j| j d¡¡\}}}| j| }|| }|dk}|sf|  ¡ | j	 }	|  
|	¡ || jkrâ| j ¡ }
|r¨| j||dk|dkd� | j |
d ¡ n0| j |	¡ | j||dk|dkd� | j |
¡ d  }	}
q|r| j dtj¡ qd S )Nr+   r'   r%   )ÚisShortÚisLong)r+  rN  rÇ   r  r*  r{   r@  Ú
fieldSizesr  r  r7  ÚTagsrM  Ú
fixOffsetsrS  rû  r,  )rk   r-  rU  rñ   Z
field_typerV  Z
field_sizeZ
total_sizeÚis_localrZ  Zcur_posr,   r,   r0   r  4  s8    



  ÿ  ÿ
zAppendingTiffWriter.fixIFDrQ   )rV  r9  r:  rS   c                 C  s¶   |s|sd}t |ƒ‚t|ƒD ]”}|r,|  ¡ n|  ¡ }|| j7 }|r–|dkr–|dkr^d}t |ƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|r¦|  |¡ q|  |¡ qd S )Nz offset is neither short nor longr   r   znot implementediöÿÿÿr+   )r  rN  r+  r  r  r3  r{   rS  rû  r,  r8  r   r  r5  r7  )rk   rV  r9  r:  rà   rU  rZ  r,   r,   r0   r=  W  s"    

zAppendingTiffWriter.fixOffsetsN)F)FF)r¢   r£   r¤   r;  r<  rw   r  r   r!  r"  r#  rM  rý  r  rS  r  r  r  rf  r+  r  r3  r5  r7  r8  r  r¨  r  r=  r,   r,   r,   r0   r  w  sb   ïú	

$   ÿr  zImage.Imagez	IO[bytes]zstr | bytesrÎ   )r‹  rB  r}  rS   c              	   C  sÒ   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs:|s:t| ||ƒS |  ¡ }z~t	|ƒ�l}| g| D ]Z}||_ ||_t|dƒsxd}	n|j
}	t|	ƒD ]*}
| |
¡ | ¡  t|||ƒ | ¡  q†qXW 5 Q R X W 5 |  |¡ X d S )NÚappend_imagesr†  r   )rå  rð  ræ  rj  rO  r¨   r  rM  rS  r  r†  rN  r[  r!  )r‹  rB  r}  rå  ræ  r?  Zcur_idxÚtfZimsZnfrr±   r,   r,   r0   Ú	_save_alls  s(    



rA  z.tifz.tiffz
image/tiff)Ú
__future__r   rý  r  Úloggingr’  rû  rÇ   r  Úcollections.abcr   Ú	fractionsr   Únumbersr   r   Útypingr   r   r	   r
   r   Ú r   r   r   r   r   r   Ú_binaryr   r‘  r   r”  r   Z
_deprecater   r   Ú	getLoggerr¢   rQ  rÉ  rç  ZIFD_LEGACY_APIrô  rÚ   rØ   rÿ  r»  r¼  r¿  rµ  r¸  r¹  rë  r^  rÁ  rË  rõ  rÆ  rÇ  r·  rÈ  r   rì  rí  rî  Z	PREDICTORrÐ  rÌ  rÍ  rÊ  rù  r  rÀ  r¾  Z
JPEGTABLESrº  r÷  rï  ré  rê  rÏ  rè  rŽ  rú  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr´  rì   rö  rÄ  re   rÂ  rU   rh   rˆ  rW   r`   rg   r®   rµ   rp   rZ   r´   r·   rÊ   r   Z
_IFDv2BaserË   r±   rÉ   r­   Úsetattrrm  ZImageFileDirectoryr{  rä  r  r  rA  Zregister_openrÚ  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer,   r,   r,   r0   Ú<module>)   s   
î                                                                                                                      †}ú	
|   x\   dë  6 }