o
    ÒèFhŠ- ã                #   @  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 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! e "e#¡Z$dZ%dZ&dZ'd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/ZHd0ZId1ZJd2ZKd3ZLd4ZMd5ZNd6ZOd7ZPd8ZQd9ZRd:ZSi dd;“d<d=“d>d?“d@dA“dBdC“dDdE“dFdG“dHdI“dJdK“dLdM“dNdO“dPdQ“dRdS“dTdU“dVdW“dXdY“dZd[“ZTd\d]„ eT U¡ D ƒZVi e)d d^dd^d_fd`“e*d d^dd^d_fd`“e)d d^d<d^d_fda“e*d d^d<d^d_fda“e)dd^dd^d_fdb“e*dd^dd^d_fdb“e)dd^d<d^d_fdc“e*dd^d<d^d_fdc“e)d d^dddd_fde“e*d d^dddd_fde“e)d d^d<ddd_fdf“e*d d^d<ddd_fdf“e)dd^dddd_fdg“e*dd^dddd_fdg“e)dd^d<ddd_fdh“e*dd^d<ddd_fdh“e)d d^ddid_fdj“i e*d d^ddid_fdj“e)d d^d<did_fdk“e*d d^d<did_fdk“e)dd^ddid_fdl“e*dd^ddid_fdl“e)dd^d<did_fdm“e*dd^d<did_fdm“e)d d^ddnd_fdo“e*d d^ddnd_fdo“e)d d^d<dnd_fdp“e*d d^d<dnd_fdp“e)dd^ddnd_fdq“e*dd^ddnd_fdq“e)dddddnd_fdq“e*dddddnd_fdq“e)dd^d<dnd_fdr“e*dd^d<dnd_fdr“¥i e)dd^ddsd_fdt“e)d d^ddud_fdv“e)dd^ddud_fdv“e*dd^ddud_fdw“e)dd^d<dud_fdx“e)dddddud_fdy“e*dddddud_fdz“e)d d{dd|d_fd}“e*d d{dd|d_fd~“e)dd^dd|d_fd“e)ddddd|d_fd€“e*ddddd|d_fd�“e)dd{dd|d_fd}“e*dd{dd|d_fd~“e)dd^dd‚ddfdƒ“e*dd^dd‚ddfdƒ“e)d<d^dd„d_fd…“¥i e*d<d^dd„d_fd…“e)d<d^d<d„d_fd†“e*d<d^d<d„d_fd†“e)d<d^dd‡d_fdˆ“e*d<d^dd‡d_fdˆ“e)d<d^dd‡d‰fdŠ“e*d<d^dd‡d‰fdŠ“e)d<d^dd‹dŒfd�“e*d<d^dd‹dŒfd�“e)d<d^ddŽd�fd�“e*d<d^ddŽd�fd�“e)d<d^dd‡d^fd‘“e*d<d^dd‡d^fd‘“e)d<d^dd‹d’fd““e*d<d^dd‹d’fd““e)d<d^ddŽd”fd•“e*d<d^ddŽd”fd•“¥i e)d<d^dd‡ddfdˆ“e*d<d^dd‡ddfdˆ“e)d<d^dd‹d–fd—“e*d<d^dd‹d–fd—“e)d<d^ddŽd˜fd™“e*d<d^ddŽd˜fd™“e)d<d^dd‡dšfdˆ“e*d<d^dd‡dšfdˆ“e)d<d^dd›d_fdœ“e*d<d^dd›d_fd�“e)d<d^ddžd_fdŸ“e*d<d^ddžd_fd “e)d<d^ddžd‰fd¡“e*d<d^ddžd‰fd¢“e)d<d^ddžd^fd£“e*d<d^ddžd^fd¤“e)d<d^ddžddfdŸ“¥i e*d<d^ddžddfd “e)d>d^dd^d_fd¥“e*d>d^dd^d_fd¥“e)d>d^d<d^d_fd¦“e*d>d^d<d^d_fd¦“e)d>d^dddd_fd§“e*d>d^dddd_fd§“e)d>d^d<ddd_fd¨“e*d>d^d<ddd_fd¨“e)d>d^ddid_fd©“e*d>d^ddid_fd©“e)d>d^d<did_fdª“e*d>d^d<did_fdª“e)d>d^ddnd_fd«“e*d>d^ddnd_fd«“e)d>d^dd‚ddfd¬“e*d>d^dd‚ddfd¬“¥e)d>d^d<dnd_fd­e*d>d^d<dnd_fd­e)dBd^dd‡d_fd®e*dBd^dd‡d_fd®e)dBd^dd‹d‰fd¯e*dBd^dd‹d‰fd¯e)dBd^ddŽdŒfd°e*dBd^ddŽdŒfd°e)dBd^ddžd_fd±e)dDd^ddnd_fdqe*dDd^ddnd_fdqe)dDd^dd„d_fd²e*dDd^dd„d_fd²e)dHd^dd„d_fd³e*dHd^dd„d_fd³i¥ZWeXd´dµ„ eWD ƒƒZYg d¶¢ZZd·d¸„ Z[d¹dº„ Z\d»d¼„ Z]i Z^i Z_d½d¾„ Z`G d¿dÀ„ dÀeƒZadÁdÂ„ ZbdÃdÄ„ ZcdÅdÆ„ Zde�rde
eeef Zfne
ZfG dÇdÈ„ dÈefƒZge^eg_^e_eg__e! U¡ D ]!\ZhZiei jdÉdÊ¡ZiekegdËei e^eh d ƒ ekegdÌei e_eh ƒ �qx[^[_[h[iG dÍdÎ„ dÎegƒZlelZmG dÏdÐ„ dÐejƒZni dÑdÑe)ddd^df“dÒdÒe)dddndf“dÓdÓe)ddd‚d<f“dÔdÔe)d>ddndf“dÕdÕe)d>dd‚d<f“dÖd×e)dd<d|df“dØdØe)dddudf“dÙdÙe)dd<dudf“dÚdÛe)dd>d|df“dÜdÜe)d<dd„df“dÝdÝe)d<dd‡d f“dÞdÞe)d<dd‡d<f“dßdße)dBdd‡df“dàdàe)dDdd„df“dádáe)dHdd„df“dâdâe*dd<d|df“dãdãe*dddudf“däe*dd<dudfdåe*dd>d|dfdæœ¥Zodçdè„ ZpG dédê„ dêƒZqdëdì„ Zre senjtene[¡ e uenjtep¡ e venjter¡ e wenjtdídîg¡ e xenjtdï¡ dS )ðé    )ÚannotationsN)ÚMutableMapping)ÚFraction)ÚNumberÚRational)ÚTYPE_CHECKINGÚAnyÚCallableé   )ÚExifTagsÚImageÚ	ImageFileÚImageOpsÚImagePaletteÚTiffTags)Úi16be)Úi32be©Úo8©Ú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—Æ  Úrawé   Ú
tiff_ccitté   Úgroup3é   Úgroup4é   Útiff_lzwé   Ú	tiff_jpegé   Újpegé   Útiff_adobe_deflatei€  Útiff_raw_16i€  Úpackbitsi)€  Útiff_thunderscani²€  Útiff_deflateit‡  Útiff_sgilogiu‡  Útiff_sgilog24imˆ  ÚlzmaiPÃ  ÚzstdiQÃ  Úwebpc                 C  s   i | ]\}}||“qS © r4   )Ú.0ÚkÚvr4   r4   úL/var/www/html/loop/nvenv/lib/python3.10/site-packages/PIL/TiffImagePlugin.pyÚ
<dictcomp>Ž   s    r9   ©r
   r4   )Ú1z1;I)r;   z1;IR)r;   r;   )r;   z1;R)r   )ÚLzL;2I)r<   zL;2IR)r<   zL;2)r<   zL;2R)r!   )r<   zL;4I)r<   zL;4IR)r<   zL;4)r<   zL;4R)r)   )r<   zL;I)r<   zL;IR)r<   r<   )r<   zL;R)é   )úI;16zI;12)é   )r>   r>   )úI;16Br@   )r>   zI;16R)ÚIúI;16S)rA   úI;16BS)r   )é    )ÚFúF;32F)rE   úF;32BF)rA   zI;32N)rA   úI;32S)rA   úI;32BS)r)   r)   )ÚLArJ   )r)   r)   r)   )ÚRGBrK   )rK   zRGB;R)r)   r)   r)   r)   )ÚRGBArL   ©r   )ÚRGBXrN   )r)   r)   r)   r)   r)   ©r   r   )rN   ÚRGBXX)r)   r)   r)   r)   r)   r)   )r   r   r   )rN   ÚRGBXXX)rL   ÚRGBa)r
   r   )rL   ÚRGBaX)r
   r   r   )rL   ÚRGBaXX)r   r   )rL   ÚRGBAX)r   r   r   )rL   ÚRGBAXX)iç  )r?   r?   r?   )rK   zRGB;16L)rK   zRGB;16B)r?   r?   r?   r?   )rL   zRGBA;16L)rL   zRGBA;16B)rN   zRGBX;16L)rN   zRGBX;16B)rL   zRGBa;16L)rL   zRGBa;16B)ÚPzP;1)rW   zP;1R)rW   zP;2)rW   zP;2R)rW   zP;4)rW   zP;4R)rW   rW   )ÚPArX   )rW   zP;R)ÚCMYKrY   )rY   ÚCMYKX)rY   ÚCMYKXX)rY   zCMYK;16L)rK   rN   )ÚLABr\   c                 c  s   � | ]	}t |d  ƒV  qdS )r!   N)Úlen)r5   Úkey_tpr4   r4   r8   Ú	<genexpr>  ó   € r_   )ó   MM *ó   II* s   MM* s   II *s   MM +s   II+ c                 C  s   | d d… t v S ©Nr!   )ÚPREFIXES©Úprefixr4   r4   r8   Ú_accept  ó   rg   c                 C  s<   t | ƒdk}t|rd|  n| ƒ |¡}|r|d d d… S |S )Nr
   éÿÿÿÿ)ÚabsÚIFDRationalÚlimit_rational)ÚvalÚmax_valÚinvÚn_dr4   r4   r8   Ú_limit_rational  s   rq   c                 C  sP   t | ƒ}|j|jf}t|ƒ|k rt| t|ƒƒ}t|ƒ|kr&t |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminrq   rj   Úmax)rm   rn   Úmin_valÚfracrp   r4   r4   r8   Ú_limit_signed_rational"  s   
ry   c                   ó   ‡ fdd„}|S )Nc                   s   t | jˆ ƒ|Ž S rr   )ÚgetattrÚ_val)ÚselfÚargs©Úopr4   r8   Údelegate8  rh   z_delegate.<locals>.delegater4   )r€   r�   r4   r   r8   Ú	_delegate7  s   r‚   c                   @  sP  e Zd ZdZ	 dZd2dd„Zedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dd„ Z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d*ƒZ$ed+ƒZ%ed,ƒZ&ed-ƒZ'ed.ƒZ(ed/ƒZ)e*e+d0ƒr¦ed0ƒZ,d1S d1S )3rk   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Ú_denominatorr|   r
   c                 C  sŠ   t |tƒr|j| _|j| _|j| _dS t |tƒr!|j| _|j| _n|| _|| _|dkr2tdƒ| _dS |dkr=t|ƒ| _dS 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
   )	Ú
isinstancerk   rs   rƒ   rt   r„   r|   r   Úfloat)r}   Úvaluert   r4   r4   r8   Ú__init__L  s   


zIFDRational.__init__c                 C  ó   | j S rr   )rƒ   ©r}   r4   r4   r8   rs   f  ó   zIFDRational.numeratorc                 C  rŠ   rr   )r„   r‹   r4   r4   r8   rt   j  rŒ   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   )rt   rs   r|   Úlimit_denominator)r}   Úmax_denominatorÚfr4   r4   r8   rl   n  s   
zIFDRational.limit_rationalc                 C  s   t t| jƒƒS rr   )Ústrr‡   r|   r‹   r4   r4   r8   Ú__repr__{  s   zIFDRational.__repr__c                 C  s
   | j  ¡ S rr   )r|   Ú__hash__r‹   r4   r4   r8   r’   ~  s   
zIFDRational.__hash__c                 C  s0   | j }t|tƒr|j }t|tƒrt|ƒ}||kS rr   )r|   r†   rk   r‡   )r}   Úotherrm   r4   r4   r8   Ú__eq__�  s   

zIFDRational.__eq__c                 C  s   | j | j| jgS rr   )r|   rƒ   r„   r‹   r4   r4   r8   Ú__getstate__‰  rh   zIFDRational.__getstate__c                 C  s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rk   r‰   r|   rƒ   r„   )r}   Ústater|   rƒ   r„   r4   r4   r8   Ú__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__Nr:   )-Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r‰   Úpropertyrs   rt   rl   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«   r¬   r­   r®   r¯   r°   r±   Úhasattrr   r²   r4   r4   r4   r8   rk   >  sZ    



ÿrk   c                   s   ‡ ‡fdd„}|S )Nc                   sB   ddl m} | j d¡r| jdd …  dd¡|ˆ < ˆ| ftˆ < | S )Nr
   r   Úload_r#   Ú_ú )r   r   r³   Ú
startswithÚreplaceÚ_load_dispatch)Úfuncr   ©ÚidxÚsizer4   r8   Ú	decorator»  s
   z#_register_loader.<locals>.decoratorr4   )rÂ   rÃ   rÄ   r4   rÁ   r8   Ú_register_loaderº  s   rÅ   c                   rz   )Nc                   s   | t ˆ < | S rr   )Ú_write_dispatch)rÀ   ©rÂ   r4   r8   rÄ   Ç  s   z#_register_writer.<locals>.decoratorr4   )rÂ   rÄ   r4   rÇ   r8   Ú_register_writerÆ  s   rÈ   c                   sX   ddl m} | \}‰ }|||< t dˆ  ¡‰ˆd‡ ‡fdd„	ft|< ‡ fdd„t|< d S )	Nr
   r   ú=Tc                   s   |   t|ƒˆ › ˆ › �|¡S rr   )Ú_unpackr]   ©r}   ÚdataÚ
legacy_api©ÚfmtrÃ   r4   r8   Ú<lambda>Ö  s   z!_register_basic.<locals>.<lambda>c                   s   d  ‡‡ fdd„|D ƒ¡S )Nó    c                 3  s   � | ]	}ˆ  ˆ |¡V  qd S rr   )Ú_pack©r5   rˆ   )rÏ   r}   r4   r8   r_   Û  r`   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©r}   Úvalues)rÏ   r‹   r8   rÐ   Ú  s   ©T)r   r   ÚstructÚcalcsizer¿   rÆ   )Úidx_fmt_namer   rÂ   Únamer4   rÎ   r8   Ú_register_basicÎ  s   
þrÝ   c                   @  s  e Zd ZU dZi Zded< i Zded< d\dd	„Zed
d„ ƒZ	edd„ ƒZ
edd„ ƒZej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 d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zeeeejd(d)fejd*d+fejd,d-fej d.d/fej!d0d1fej"d2d3fej#d4d5fej$d*d+fej%d6d7fg	ƒƒ e&d8d8ƒd]d:d;„ƒZ'e(d8ƒd<d=„ ƒZ)e&d>d8ƒd]d?d@„ƒZ*e(d>ƒdAdB„ ƒZ+e&dCdDƒd]dEdF„ƒZ,e(dCƒdGdH„ ƒZ-e&dId8ƒd]dJdK„ƒZ.e(dIƒdLdM„ ƒZ/e&dNdDƒd]dOdP„ƒZ0e(dNƒdQdR„ ƒZ1dSdT„ Z2dUdV„ Z3d^dXdY„Z4dZd[„ Z5dS )_Ú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*     Nc                 C  sÊ   t |ƒsdt|ƒ› d�}t|ƒ‚|dur|n|dd… | _| jtkr&d| _n| jtkr/d| _nd}t|ƒ‚|d dk| _|| _i | _		 |  
¡  | jrT|  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)   r<   r!   F)rg   ÚreprÚSyntaxErrorÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffÚgroupÚtagtypeÚresetrÊ   ÚnextÚ_legacy_api)r}   Úifhrf   rë   Úmsgr4   r4   r8   r‰   %  s$   

,ÿ
zImageFileDirectory_v2.__init__c                 C  rŠ   rr   )ræ   r‹   r4   r4   r8   rÐ   E  ó    zImageFileDirectory_v2.<lambda>c                 C  rŠ   rr   )Ú_offsetr‹   r4   r4   r8   rÐ   F  rò   c                 C  rŠ   rr   )rï   r‹   r4   r4   r8   rÍ   H  rŒ   z ImageFileDirectory_v2.legacy_apic                 C  s   d}t |ƒ‚)Nz"Not allowing setting of legacy api)Ú	Exception)r}   rˆ   rñ   r4   r4   r8   rÍ   L  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rr   )Ú_tags_v1Ú_tags_v2Ú_tagdatarì   Ú_nextró   r‹   r4   r4   r8   rí   Q  s   
zImageFileDirectory_v2.resetc                 C  s   t t| ƒƒS rr   )r�   Údictr‹   r4   r4   r8   Ú__str__Y  ó   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 r4   )r   Úlookuprë   rÜ   )r5   Úcoderˆ   r‹   r4   r8   r9   b  s    ÿÿz/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsr‹   r4   r‹   r8   Únamed\  s   
þzImageFileDirectory_v2.namedc                 C  ó   t t| jƒt| jƒB ƒS rr   )r]   Úsetr÷   rö   r‹   r4   r4   r8   Ú__len__g  ó   zImageFileDirectory_v2.__len__c                 C  sf   || j vr| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jr1t|ttfƒs1|f}|S rr   )rö   r÷   rì   r¿   rÍ   r†   ÚtupleÚbytes)r}   ÚtagrÌ   ÚtyprÃ   Úhandlerrm   r4   r4   r8   Ú__getitem__j  s   



z!ImageFileDirectory_v2.__getitem__c                 C  ó   || j v p	|| jv S rr   )rö   r÷   ©r}   r  r4   r4   r8   Ú__contains__u  ó   z"ImageFileDirectory_v2.__contains__c                 C  s   |   ||| j¡ d S rr   )Ú_setitemrÍ   )r}   r  rˆ   r4   r4   r8   Ú__setitem__x  r  z!ImageFileDirectory_v2.__setitem__c              
     sª  t ttf}t || j¡‰ t||ƒr|gn|}|| jvr²ˆ jr%ˆ j| j|< n�tj	| j|< t
dd„ |D ƒƒrGt
dd„ |D ƒƒr@tjntj| j|< nkt
dd„ |D ƒƒrƒt
dd„ |D ƒƒr`tj| j|< nRt
dd„ |D ƒƒrptj| j|< nBt
dd„ |D ƒƒr|tjntj| j|< n/t
dd„ |D ƒƒr“tj| j|< nt
d	d„ |D ƒƒr£tj| j|< nt
d
d„ |D ƒƒr²t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}|�sOˆ jdk�s| j| tjk�sˆ jd u �rOt|ƒdk�rO|�sO|�r'| j| tjtjfv �r'|f}z|\||< W d S  t�yN   t d|› dt|ƒ› d�¡ |d ||< Y d S w |||< d S )Nc                 s  ó   � | ]}t |tƒV  qd S rr   )r†   rk   ©r5   r7   r4   r4   r8   r_   †  ó   € z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s  ó   � | ]}|d kV  qdS ©r   Nr4   r  r4   r4   r8   r_   ‰  ó   € c                 s  r  rr   )r†   Úintr  r4   r4   r8   r_   Œ  r  c                 s  s(   � | ]}d |  kodk n  V  qdS )r   r   Nr4   r  r4   r4   r8   r_   �  ó   €& c                 s  s(   � | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr4   r  r4   r4   r8   r_   �  r  c                 s  r  r  r4   r  r4   r4   r8   r_   ”  r  c                 s  r  rr   )r†   r‡   r  r4   r4   r8   r_   —  r  c                 s  r  rr   )r†   r�   r  r4   r4   r8   r_   ™  r  c                 s  r  rr   )r†   r  r  r4   r4   r8   r_   ›  r  c                 S  s&   g | ]}t |tƒr| d d¡n|‘qS )Úasciir¾   )r†   r�   Úencoder  r4   r4   r8   Ú
<listcomp>Ÿ  s    ÿÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |tƒrt|ƒn|‘qS r4   )r†   r  r‡   r  r4   r4   r8   r  ¤  s   " c                 3  s   � | ]}ˆ   |¡V  qd S rr   )Úcvt_enumrÓ   ©Úinfor4   r8   r_   ¨  r  r
   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r  r�   r   rü   rë   r†   rì   ÚtypeÚ	UNDEFINEDÚallÚRATIONALÚSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTErù   r  rõ   rö   Úlengthr]   Ú
ValueErrorÚwarningsÚwarn)r}   r  rˆ   rÍ   Ú	basetypesr×   Úis_ifdÚdestr4   r  r8   r  {  sr   

ÿ
ýÿ
ýþ þÿÿúzImageFileDirectory_v2._setitemc                 C  s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S rr   )rö   Úpoprõ   r÷   r  r4   r4   r8   Ú__delitem__Ë  s   z!ImageFileDirectory_v2.__delitem__c                 C  r   rr   )Úiterr  r÷   rö   r‹   r4   r4   r8   Ú__iter__Ð  r  zImageFileDirectory_v2.__iter__c                 C  s   t  | j| |¡S rr   )rÙ   Úunpackrè   )r}   rÏ   rÌ   r4   r4   r8   rÊ   Ó  s   zImageFileDirectory_v2._unpackc                 G  s   t j| j| g|¢R Ž S rr   )rÙ   Úpackrè   )r}   rÏ   r×   r4   r4   r8   rÒ   Ö  r  zImageFileDirectory_v2._packÚHÚshortr<   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longr�   r‡   ÚdÚdoublerã   Úlong8r
   Tc                 C  ó   |S rr   r4   rË   r4   r4   r8   Ú	load_byteê  ó   zImageFileDirectory_v2.load_bytec                 C  s*   t |tƒr	t|ƒ}t |tƒrt|fƒ}|S rr   )r†   rk   r  r  ©r}   rÌ   r4   r4   r8   Ú
write_byteî  s
   


z ImageFileDirectory_v2.write_byter   c                 C  s"   |  d¡r|d d… }| dd¡S )Nó    ri   zlatin-1r¾   )ÚendswithÚdecoderË   r4   r4   r8   Úload_stringö  s   
z!ImageFileDirectory_v2.load_stringc                 C  s0   t |tƒr	t|ƒ}t |tƒs| dd¡}|d S )Nr  r¾   rE  )r†   r  r�   r  r  ©r}   rˆ   r4   r4   r8   Úwrite_stringü  s
   

z"ImageFileDirectory_v2.write_stringr#   r)   c                   óV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr!   r<   c                   ó   ˆ r| |fS t | |ƒS rr   ©rk   ©Úar:  ©rÍ   r4   r8   Úcombine	  ó   z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3  ó   � | ]
\}}ˆ ||ƒV  qd S rr   r4   ©r5   ÚnumÚdenom©rQ  r4   r8   r_     ó   € z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r
   ©rÊ   r]   r  Úzip©r}   rÌ   rÍ   Úvalsr4   ©rQ  rÍ   r8   Úload_rational  ó   0z#ImageFileDirectory_v2.load_rationalc                   ó   d  ‡ fdd„|D ƒ¡S )NrÑ   c                 3  s(   � | ]}ˆ j d gt|dƒ¢R Ž V  qdS )Ú2Ll   ÿÿ N)rÒ   rq   ©r5   rx   r‹   r4   r8   r_     s   € 
ÿz7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>rÔ   rÖ   r4   r‹   r8   Úwrite_rational  s   ÿz$ImageFileDirectory_v2.write_rationalr'   c                 C  r@  rr   r4   rË   r4   r4   r8   Úload_undefined  rB  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tƒr	t|ƒ}t |tƒrt|ƒ dd¡}|S )Nr  r¾   )r†   rk   r  r�   r  rI  r4   r4   r8   Úwrite_undefined  s
   

z%ImageFileDirectory_v2.write_undefinedé
   c                   rK  )	Nr!   r<  c                   rL  rr   rM  rN  rP  r4   r8   rQ  $  rR  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  rS  rr   r4   rT  rW  r4   r8   r_   '  rX  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r
   rY  r[  r4   r]  r8   Úload_signed_rational   r_  z*ImageFileDirectory_v2.load_signed_rationalc                   r`  )NrÑ   c                 3  s*   � | ]}ˆ j d gt|ddƒ¢R Ž V  qdS )Ú2liÿÿÿi   €N)rÒ   ry   rb  r‹   r4   r8   r_   +  s
   € ÿ
ÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>rÔ   rÖ   r4   r‹   r8   Úwrite_signed_rational)  s   þz+ImageFileDirectory_v2.write_signed_rationalc                 C  s8   |  |¡}t|ƒ|krd|› dt|ƒ› d�}t|ƒ‚|S )Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )Úreadr]   ÚOSError)r}   ÚfprÃ   Úretrñ   r4   r4   r8   Ú_ensure_read0  s   
ÿÿÿz"ImageFileDirectory_v2._ensure_readc              
   C  sl  |   ¡  | ¡ | _�z| jr|  d|  |d¡¡n	|  d|  |d¡¡d }t|ƒD ]Õ}| jr7|  d|  |d¡¡n	|  d|  |d	¡¡\}}}}t || j	¡j
}t |d
¡}	d|› d|› d|	› d|› d�	}
z	| j| \}}W n ty{   t d|
|¡ Y q(w || }|| jr†dndkr´| ¡ }|  | jr”dnd|¡\}|
d|› d|› �7 }
| |¡ t ||¡}| |¡ n|d |… }t|ƒ|krÖt d|› dt|ƒ› d|› �¡ t |
¡ q(|sÞt |
¡ q(|| j|< || j|< |
d|dkròd| nt|ƒ 7 }
t |
¡ q(| j�r|  d|  |d¡¡n	|  d|  |d¡¡\| _W d S  t�y5 }
 zt t|
ƒ¡ W Y d }
~
d S d }
~
ww )Nrã   r)   r7  r   r   ÚHHQ8sé   ÚHHL4sr=   Úunknownztag: ú (ú
) - type: ú)z%s - unsupported type %sr!   r<   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rj  z. Skipping tag ú
 - value: rD   ú<table: %d bytes>)rí   Útellró   rê   rÊ   ro  Úranger   rü   rë   rÜ   r   Úgetr¿   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readr]   r,  r-  r÷   rì   rä   rî   rl  r�   )r}   rm  Ú	tag_countÚir  r  ÚcountrÌ   ÚtagnameÚtypnamerñ   Ú	unit_sizer  rÃ   ÚhereÚoffsetr4   r4   r8   Úload:  sz   
ÿüÿ
ýþ
ÿÿþÿ



ÿÿý€þ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oHt|tƒ}|rs| jdkrSd}	nd}	t|	|d�}
| j| }| ¡ D ]\}}||
|< qd|
 |¡}nt|tƒrz|n|f}| j| | g|¢R Ž }t || j¡j}|r”d	nt |d
¡}d|› d|› d|› d|› d�	}|dt|ƒdkr·dt|ƒ nt|ƒ 7 }t 	|¡ |rÇd}n|tjtjtjfv rÖt|ƒ}nt|ƒ}t|ƒdkrï| |||| dd¡df¡ q#| ||||   d|¡|f¡ |t|ƒd d d 7 }q#|d u�r8|| \}}}}}|�r!d}t|ƒ‚|   d|  d|¡d | ¡}|||||f||< |D ]!\}}}}}t 	d|||t
|ƒt
|ƒ¡ ||   d||||¡7 }�q:|d7 }|D ]\}}}}}||7 }t|ƒd@ �rx|d7 }�qb|S )Nr7  r=   r!   zTag %s, Type: %s, Value: %srá   s   II*    s   MM *   )rë   Úifdrs  zsave: rt  ru  rv  rw  r?   rx  r
   rE  rÑ   r<   r   z&multistrip support not yet implementedr   z%s %s %s %s %srr  s       ) rÒ   r]   rö   Úsortedrþ   ÚSTRIPOFFSETSrì   r{  r}  r~  rä   r   r%  r†   rù   rè   rÞ   Útobytesr  rÆ   rü   rë   rÜ   r   r�   r)  r(  r  ÚappendÚljustÚNotImplementedErrorrÊ   )r}   rˆ  ÚresultÚentriesÚstripoffsetsr  rˆ   r  r/  rð   rŠ  r×   Úifd_tagÚ	ifd_valuerÌ   r„  r…  rñ   rƒ  r4   r4   r8   r�  }  sl   


ÿ


€zImageFileDirectory_v2.tobytesc                 C  sN   |  ¡ dkr| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ÚHLé*   r)   )ry  Úwriteræ   rÒ   r�  r]   )r}   rm  rˆ  r‘  r4   r4   r8   ÚsaveÊ  s   

zImageFileDirectory_v2.save)rß   NNrØ   rM   )6r³   r´   rµ   r¶   r¿   Ú__annotations__rÆ   r‰   r¸   rf   rˆ  rÍ   Úsetterrí   rú   rÿ   r  r	  r  r  r  r2  r4  rÊ   rÒ   ÚlistÚmaprÝ   r   r#  r%  ÚSIGNED_BYTEr$  r&  ÚFLOATr'  ÚIFDÚLONG8rÅ   rA  rÈ   rD  rH  rJ  r^  rc  rd  re  rg  ri  ro  r‰  r�  r™  r4   r4   r4   r8   rÞ   å  s|   
 <
 

P








÷þÿ






CMrÞ   r¼   r»   rº   Ú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„ Zdd„ Z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|i |¤Ž d| _d S )NT)Úsuperr‰   rï   )r}   r~   Úkwargs©Ú	__class__r4   r8   r‰   ò  s   
zImageFileDirectory_v1.__init__c                 C  rŠ   rr   )rõ   r‹   r4   r4   r8   rÐ   ö  rò   zImageFileDirectory_v1.<lambda>c                 C  rŠ   rr   )r÷   r‹   r4   r4   r8   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`

        re   )rf   r÷   rì   rî   )ÚclsÚoriginalrŠ  r4   r4   r8   Úfrom_v2ý  s
   zImageFileDirectory_v1.from_v2c                 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`

        re   )rÞ   rf   rù   r÷   rì   rö   )r}   rŠ  r4   r4   r8   Úto_v2  s
   zImageFileDirectory_v1.to_v2c                 C  r
  rr   )rõ   r÷   r  r4   r4   r8   r     r  z"ImageFileDirectory_v1.__contains__c                 C  r   rr   )r]   r  r÷   rõ   r‹   r4   r4   r8   r  #  r  zImageFileDirectory_v1.__len__c                 C  r   rr   )r3  r  r÷   rõ   r‹   r4   r4   r8   r4  &  r  zImageFileDirectory_v1.__iter__c                 C  s   dD ]	}|   |||¡ qd S ©N)FT)r  )r}   r  rˆ   rÍ   r4   r4   r8   r  )  s   ÿz!ImageFileDirectory_v1.__setitem__c                 C  sn   || j vr&| j| }| j| }| j| \}}dD ]}|  ||| ||ƒ|¡ q| j | }t|ttfƒs5|f}|S r¬  )rõ   r÷   rì   r¿   r  r†   r  r  )r}   r  rÌ   r  rÃ   r  Úlegacyrm   r4   r4   r8   r	  -  s   



z!ImageFileDirectory_v1.__getitem__)r³   r´   rµ   r¶   r‰   r¸   ÚtagsÚtagdatarš  Úclassmethodrª  r«  r  r  r4  r  r	  Ú__classcell__r4   r4   r¦  r8   r£  ß  s   
 
r£  c                      sŠ   e Zd ZdZdZdZd‡ fdd„	Zdd„ Zed	d
„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚTiffImageFileÚTIFFz
Adobe TIFFFNc                   s"   d | _ 	 d | _	 tƒ  ||¡ d S rr   )Útag_v2r  r¤  r‰   )r}   rm  Úfilenamer¦  r4   r8   r‰   G  s
   zTiffImageFile.__init__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â   Nri   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )rm  rk  rÞ   r´  rŠ  rî   Ú_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_fpÚ
_frame_posÚ	_n_framesr}  r~  rä   Ú_seek)r}   rð   r4   r4   r8   Ú_openP  s   

zTiffImageFile._openc                 C  sX   | j d u r)|  ¡ }|  t| jƒ¡ | j d u r$|  |  ¡ d ¡ | j d u s|  |¡ | j S )Nr
   )r»  ry  r¼  r]   rº  r  )r}   Úcurrentr4   r4   r8   Ún_framesk  s   


ÿ
zTiffImageFile.n_framesc                 C  s<   |   |¡sdS |  |¡ t | j¡ tj | j| j¡| _dS )z%Select a given frame as current imageN)	Ú_seek_checkr¼  r   Ú_decompression_bomb_checkrÃ   ÚcoreÚnewÚmodeÚim)r}   Úframer4   r4   r8   r  u  s
   

zTiffImageFile.seekc                 C  sX  | j | _| j ¡  t| jƒ|kr…| jsd}t|ƒ‚t d|| j	| j| j ¡ ¡ | jdkr2d}t
|ƒ‚| j | j¡ | j | j¡ t d| j ¡ ¡ | j | j¡ | jj| jv r[d| _n| jj| _| jdkrj|d | _t| jƒdkrw| jdk| _|  j	d7  _	t| jƒ|ks| j | j| ¡ | j | j¡ |  ¡  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
   )r¹  rm  ry  r]   rº  r·  ÚEOFErrorr}  r~  r¸  r+  r  rŽ  r´  r‰  rî   r»  Úis_animatedÚ_reload_exifr£  rª  r  rŠ  Ú_setup)r}   rÆ  rñ   r4   r4   r8   r¼  €  sF   
û



äzTiffImageFile._seekc                 C  rŠ   )zReturn the current frame number)r¸  r‹   r4   r4   r8   ry  ¬  rŒ   zTiffImageFile.tellc                 C  s   t | jv r|  | jt  ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        )ÚXMPr´  Ú_getxmpr‹   r4   r4   r8   Úgetxmp°  s   zTiffImageFile.getxmpc                 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… }|dd… dks|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   rf  rÌ   )	r´  r{  r   ÚBaseÚImageResourcesÚi16ÚmathÚceilÚi32)r}   Úblocksrm   ÚidÚnrÃ   rÌ   r4   r4   r8   Úget_photoshop_blocks¹  s   "ùz"TiffImageFile.get_photoshop_blocksc                   s   | j r
| jr
|  ¡ S tƒ  ¡ S rr   )ÚtileÚuse_load_libtiffÚ_load_libtiffr¤  r‰  r‹   r¦  r4   r8   r‰  Î  s   
zTiffImageFile.loadc                 C  sn   | j sd| _| j ¡  |  ¡ }tjD ]}||vrq| |¡ qtj	| dd� t
jj| jv r5| jt
jj= d S d S )NT)Úin_place)rÈ  Ú!_close_exclusive_fp_after_loadingrm  ry  Úgetexifr   ÚTAGS_V2_GROUPSÚget_ifdr   Úexif_transposer   rÎ  ÚOrientationr´  )r}   ÚexifÚkeyr4   r4   r8   Ú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 ƒ}zt| jdƒo2| j 	¡ }t| jdƒr>| j 
¡  W n tyJ   d}Y nw |rQ||d< t  | jd	t|ƒ| j¡}z	| | j|¡ W n tyy } zd
}t|ƒ|‚d}~ww | jo€| j }t| jdƒr—t d¡ | | j ¡ ¡\}}	n,|r®t 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‰  Úload_preparer]   rØ  rl  rœ  r¹   rm  rå  ræ  Ú_getdecoderrÄ  r  ÚdecoderconfigÚsetimagerÅ  r+  Ú_exclusive_fprÈ  r}  r~  rG  rè  r  rk  Úreadonlyrä  Úclose)
r}   rñ   Úextentsr~   rm  ÚdecoderÚeÚclose_self_fprÖ  Úerrr4   r4   r8   rÚ  è  s`   
€ýÿ
€þ




zTiffImageFile._load_libtiffc              
   C  sæ  d| j v rd}t|ƒ‚t| j  td¡ | _| j  td¡| _| j  td¡}| jdkr+d}| 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r–t|ƒt|ƒ  kr’dkr–n nd}| j  td¡}| j  td¡}|dv r«d}	n	|dkr²d}	nd}	|	t|ƒ7 }	t|ƒ}
| j  t| jdkrÍ|dv 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 �y6 } zt
 d¡ d}t|ƒ|‚d}~ww t
 d|¡ t
 d| j!¡ | j| j"d< | j  t#d¡}| j  t$d¡}|�r�|�r�| j  t%¡}|dk�rq||f| j"d < n,|dk�r‚|d! |d! f| j"d < n|du �r–||f| j"d < ||f| j"d"< n||f| j"d"< d } }}g | _&t'�p­| jd#k| _(| j(�r|dk�rÓ|dd… d |dd…  }t
 d|¡ t| \| _}|d$k�rÚd%}d&|v �rå| )d&d'¡}d(|v �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¡ n¬t,| j v �s't-| j v �r¼t,| j v �r?| j t, }| j  t.|¡}| jd }n| j t- }| j  t/¡}| j  t0¡}|D ]h}|| |k�rd|t1|ƒ d- }nd}|}| jdk�rv|| }||	 }|t|ƒdf}| j& +| j||t|| |ƒt|| |ƒf||f¡ || }|| jd k�r¹d|| }}|| jd k�r¹d }}|d7 }�qRnt
 d.¡ d}t|ƒ‚t2| j v �rÕ| j t2 | j"d/< | j!d0v �rñd1d2„ | j t3 D ƒ}t4 5d3d4 6|¡¡| _7dS d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: %sr:   r4   )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   r>   úI;16Nz;16Bz;16Nz;16Lr(   rK   Frç  r)   z- unsupported data organizationÚicc_profile©rW   rX   c                 S  s   g | ]}t |d  ƒ‘qS ©r   r   )r5   r:  r4   r4   r8   r    s    z(TiffImageFile._setup.<locals>.<listcomp>úRGB;LrÑ   )8r´  rl  ÚCOMPRESSION_INFOr{  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONÚ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERr}  r~  r  ÚYCBCRSUBSAMPLINGr  Ú
IMAGEWIDTHÚIMAGELENGTHÚ_sizerÃ   ÚSAMPLEFORMATr]   rv   ru   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELÚMAX_SAMPLESPERPIXELÚerrorrå   rf   Ú	OPEN_INFOÚ_moder|  rÄ  r  ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITrØ  ÚREAD_LIBTIFFrÙ  r¾   rˆ  rŽ  rŒ  ÚTILEOFFSETSÚROWSPERSTRIPÚ	TILEWIDTHÚ
TILELENGTHÚsumÚ
ICCPROFILEÚCOLORMAPr   r   rÕ   Úpalette)r}   rñ   ÚphotoÚ	fillorderÚxsizeÚysizeÚsample_formatÚ	bps_tupleÚextra_tupleÚ	bps_countÚbps_actual_countÚsamples_per_pixelrã  Úrawmoderò  ÚxresÚyresÚresunitÚxÚyÚlayerrO  Úoffsetsr;  Úwrˆ  ÚstrideÚtile_rawmoder  r4   r4   r8   rÊ  =  s  



,þÿú

€ý









üÿ€å
þzTiffImageFile._setup)NN)r³   r´   rµ   ÚformatÚformat_descriptionrÜ  r‰   r½  r¸   r¿  r  r¼  ry  rÍ  r×  r‰  rä  rÚ  rÊ  r±  r4   r4   r¦  r8   r²  B  s"    	
	,	Ur²  r;   r<   rJ   rW   rX   rA   rH   r>   rB   rE   rF   rK   rN   rL   rY   ÚYCbCrr\   rI   r@   rC   rG   )rC   rG   c           5      C  s(	  zt | j \}}}}}}W n ty% }	 zd| j› d�}
t|
ƒ|	‚d }	~	ww t|d�}| j}| j}z|d }W n tyM   | j d¡}t	|t
ƒrKd }Y nw |d u rUd}n|dkr\d}n|dkrbd	}tpg|dk}d
|t< | jd |t< | jd
 |t< d|v rƒ|d }nd|v rœ|d }t	|tƒr›t ¡ }| |¡ |}ni }t dt|ƒ¡ t	|tƒr¯| ¡ }|D ]/}t	|tjƒrÆ|tjv rÆ| |¡||< n| |¡||< z
|j| |j|< W q± tyà   Y q±w t| dƒ�rtt t!t"t#t$fD ]}|| j%v �r| j%| ||< | j%j| |j|< qï| 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t*dft+dff
D ]\}}||v �rH|| ||< �q9| d¡}|�rbd|t< |d |t < |d
 |t!< |dk�rx||t,< t-|ƒd
k�rxt-|ƒ|t.< |d u�r�||t/< |d
k�rŠ||t0< t1|v�r”||t1< nF| jdv �rÚ|t1 dk�rÚ| jdk�rÕ|  2¡ }| ¡ }t3|j4ƒD ]}t3|j5ƒD ]}|||f dk�rÈdnd|||f< �q»�q´|} nt6 7| ¡} | jd v �r| j8 9d!d"¡}g }t-|ƒd# }t3d#ƒD ]}|d$d%„ ||| ||d
  … D ƒ7 }|dgd&|  7 }�qó||t:< |t |t }}t-|ƒ||d  d' d(  } t;|v�rh|�r[| d)t<¡}!| dk�rCd
nt=|!|  |ƒ}"|dk�rZt=|"d' d( d( |ƒ}"n|}"|"dk�rdd
}"|"|t;< | dk�rod
n| |t;  }#||t;  d
 |t;  }$|#d*k�rŒtj>|jt?< |#f|$d
  | | |#|$d
   f |t?< t@t3d|#|$ |#ƒƒ|tA< tB |d
¡|tC< | jd+k�rÎtDd,tEd-i F¡ D ]\}%}&| G|%|&¡ �qÂtHtItJtKg}'|�rhd.|v �r|d. }(t	|(t
ƒ�rð|(dk �sð|(d/k�röd0}
tL|
ƒ‚|dk�rd1}
tL|
ƒ‚|(|tM< t d2¡ t d3tN| F¡ ƒ¡ d})t|d4ƒ�r6z| Od¡ tP Q| R¡ ¡})W n tSjT�y5   Y nw i }*|'tUtEt?tAtVtWg7 }'t,|d i}+i },t| d5ƒ�rU| jX ¡ },i tY| di ƒ¥|,¥}-t0|-v �rg|-t0= tZ [| F¡ |- F¡ ¡D ]j\}%}&|%tj\v�r¬tYtj]d6d7ƒ�s…�qq|%|jv �r“|j|% |*|%< nt	|&t
t^t_tfƒ�sŸ�qqt `|%¡ja}.|.�r¬|.|*|%< |%|+v�rÚ|%|'v�rÚt	|&t_ƒ�rÈ|& bd8d9¡d: |+|%< �qqt	|&tcƒ�rÖt^|&ƒ|+|%< �qq|&|+|%< �qqt0|+v �ròt-|+t0 ƒd
k�rò|+t0 d |+t0< t d;tN|+ F¡ ƒ¡ | jd<v �rd=}t|+ F¡ ƒ}/|/ d¡  |||)||/|*f}0t e| jd>|0|¡}1|1 f| j8d?| j ¡ 	 |1 bdA¡d
d … \}2}3|)�s=| g|3¡ |2�rAn�q*|)�rXztP h|)¡ W n
 t�yW   Y nw |2dk �rgdB|2› dC�}
t|
ƒ‚n |'D ]}%||%= �qj| i|¡}4tj k| |dd?| j |4|| d
ffg¡ dD|v �r’|| _ld S d S )ENzcannot write mode z as TIFFre   rõ  r   r&   r(   r.   r*   r
   r   Útiffinforâ  zTiffinfo Keys: %sr´  rù  Údescriptionr÷  Úx_resolutionÚy_resolutionÚresolution_unitÚsoftwareÚ	date_timeÚartistÚ	copyrightrö  r   r:   )r;   r<   r;   r   rú  rK   rü  r   c                 S  s   g | ]}|d  ‘qS rû  r4   r  r4   r4   r8   r  ¾  s    z_save.<locals>.<listcomp>r   r'   r)   Ú
strip_sizer   r3  )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å  r  Úlibtiff_support_custom_tagsFr  r¾   rE  zConverted items: %s)r@   r>   rø  rç  rO   Ti @  zencoder error z when writing image fileÚ_debug_multipage)mÚ	SAVE_INFOrÄ  r|  rl  rÞ   ÚencoderinfoÚencoderconfigr  r{  r†   r  ÚWRITE_LIBTIFFr   rÃ   r  r  r  r   ÚExifr‰  r}  r~  rœ  r£  r«  r   rÞ  rß  rì   rô   r¹   r  r  r  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKrË  r´  r  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTr	  r]   r  r
  r  r  Úcopyrz  ÚheightÚwidthr   ÚinvertrÅ  Ú
getpaletter  r  Ú
STRIP_SIZEru   r%  ÚSTRIPBYTECOUNTSr  rŒ  ÚCOMPRESSION_INFO_REVrþ  r  ÚREFERENCEBLACKWHITErþ   Ú
setdefaultr  r  r  ÚTILEBYTECOUNTSr+  ÚJPEGQUALITYr‹  r  ÚosÚduprå  ÚioÚUnsupportedOperationÚOSUBFILETYPEÚTRANSFERFUNCTIONÚSUBIFDr  r{   Ú	itertoolsÚchainÚLIBTIFF_CORErÂ  r‡   r�   rü   r  r  rk   ÚsortÚ_getencoderrì  r˜  rï  r™  r   Ú_saverB  )5rÅ  rm  rµ  r&  rf   r  r1  ÚbitsÚextrarò  rñ   rŠ  rD  rE  rõ  rç  r  râ  rã  ÚiccrÜ   rö  Úinverted_imÚpxr+  r*  ÚlutÚcolormapÚcolorsr‚  r.  r;  r/  Úim_strip_sizeÚrows_per_stripÚstrip_byte_countsÚstrips_per_imager  rˆ   Ú	blocklistr?  r¹  ÚtypesÚattsÚ
legacy_ifdÚsupplied_tagsr  r®  rO  ÚencoderÚerrcoderÌ   rˆ  r4   r4   r8   rg  >  sÔ  
€þ

€ü


€
ÿú€ö
€





&ÿ
&

€


ÿÿþ
ý
 


ÿú


€
úÿ
þ

ÿ

þrg  c                   @  sÖ   e Zd Zg d¢Zh d£Zd1dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zejf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$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd2d.d/„Zd0S )3ÚAppendingTiffWriter)r   r
   r
   r   r!   r)   r
   r
   r   r!   r)   r!   r)   r!   r   r!   r)   >   é  é  é	  é   r   r   Fc                 C  st   t |dƒr|| _d| _n"|| _d| _zt||rdndƒ| _W n ty-   t|dƒ| _Y nw | j ¡ | _|  ¡  d S )Nrk  FTzw+bzr+b)	r¹   r�   Úclose_fprÜ   Úopenrl  ry  Ú	beginningÚsetup)r}   ÚfnrÃ  r4   r4   r8   r‰   †  s   
ÿzAppendingTiffWriter.__init__c                 C  sŒ   | j  | jtj¡ d | _d| _| j  d¡ | _}|sd| _	d S d| _	|dkr,|  
d¡ n|dkr6|  
d¡ nd	}t|ƒ‚|  ¡  |  ¡  d S )
Nr   r!   TFrb   rá   ra   rà   zInvalid TIFF file header)r�   r  r‚  r[  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPagerk  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)r}   Úiimmrñ   r4   r4   r8   rƒ  ”  s    zAppendingTiffWriter.setupc                 C  s„   | j rd S | j | j¡ | j d¡}|sd S || jkr!d}t|ƒ‚|  ¡ }|| j7 }| j | j¡ |  	|¡ | j |¡ |  
¡  d S )Nr!   z1IIMM of new page doesn't match IIMM of first page)r‰  r�   r  r‡  rk  rˆ  r‹  ÚreadLongr†  Ú	writeLongÚfixIFD)r}   rŽ  rñ   Ú
ifd_offsetr4   r4   r8   Úfinalize­  s   


zAppendingTiffWriter.finalizec                 C  s   |   ¡  |  ¡  d S rr   )r“  rƒ  r‹   r4   r4   r8   ÚnewFrameÄ  s   zAppendingTiffWriter.newFramec                 C  s   | S rr   r4   r‹   r4   r4   r8   Ú	__enter__É  s   zAppendingTiffWriter.__enter__c                 C  s   | j r|  ¡  dS )NF)r€  rï  )r}   Úexc_typeÚ	exc_valueÚ	tracebackr4   r4   r8   Ú__exit__Ì  s   zAppendingTiffWriter.__exit__c                 C  s   | j  ¡ | j S rr   )r�   ry  r‡  r‹   r4   r4   r8   ry  Ñ  rh   zAppendingTiffWriter.tellc                 C  s*   |t jkr
|| j7 }| j ||¡ |  ¡ S rr   )r[  r…  r‡  r�   r  ry  )r}   rˆ  Úwhencer4   r4   r8   r  Ô  s   

zAppendingTiffWriter.seekc                 C  s^   | j  dtj¡ | j  ¡ }d|d  }d|  k rdk r'n n| j  t|ƒ¡ | j  ¡ | _d S )Nr   r?   )r�   r  r[  ÚSEEK_ENDry  r˜  r  r‡  )r}   ÚposÚ	pad_bytesr4   r4   r8   r�  Û  s   
zAppendingTiffWriter.goToEndc                 C  s.   || _ | j d | _| j d | _| j d | _d S )Nr<   r7  ÚHHL)ÚendianÚlongFmtÚshortFmtÚ	tagFormat)r}   rŸ  r4   r4   r8   rŠ  å  s   zAppendingTiffWriter.setEndianc                 C  sP   	 |   ¡ }|dkr| j ¡ d | _d S | j |¡ |  ¡ }| j |d tj¡ q)NTr   r!   r=   )r�  r�   ry  r†  r  Ú	readShortr[  ÚSEEK_CUR)r}   r’  Únum_tagsr4   r4   r8   rŒ  ë  s   øzAppendingTiffWriter.skipIFDsc                 C  s   | j  |¡S rr   )r�   r˜  rC  r4   r4   r8   r˜  ö  rû   zAppendingTiffWriter.writec                 C  ó   t  | j| j d¡¡\}|S )Nr   )rÙ   r5  r¡  r�   rk  rI  r4   r4   r8   r£  ù  ó   zAppendingTiffWriter.readShortc                 C  r¦  rc   )rÙ   r5  r   r�   rk  rI  r4   r4   r8   r�  ý  r§  zAppendingTiffWriter.readLongc                 C  óR   | j  dtj¡ | j  t | j|¡¡}|d ur%|dkr'd|› d�}t|ƒ‚d S d S )Néþÿÿÿr!   úwrote only ú bytes but wanted 4©	r�   r  r[  r¤  r˜  rÙ   r6  r   r‹  ©r}   rˆ   Úbytes_writtenrñ   r4   r4   r8   ÚrewriteLastShortToLong  ó   þz*AppendingTiffWriter.rewriteLastShortToLongc                 C  r¨  )Nr©  r   rª  ú bytes but wanted 2)	r�   r  r[  r¤  r˜  rÙ   r6  r¡  r‹  r­  r4   r4   r8   ÚrewriteLastShort  r°  z$AppendingTiffWriter.rewriteLastShortc                 C  r¨  )Néüÿÿÿr!   rª  r«  r¬  r­  r4   r4   r8   ÚrewriteLastLong  r°  z#AppendingTiffWriter.rewriteLastLongc                 C  óB   | j  t | j|¡¡}|d ur|dkrd|› d�}t|ƒ‚d S d S )Nr   rª  r±  )r�   r˜  rÙ   r6  r¡  r‹  r­  r4   r4   r8   Ú
writeShort  ó
   þzAppendingTiffWriter.writeShortc                 C  rµ  )Nr!   rª  r«  )r�   r˜  rÙ   r6  r   r‹  r­  r4   r4   r8   r�    r·  zAppendingTiffWriter.writeLongc                 C  s   |   ¡  | j ¡  d S rr   )r“  r�   rï  r‹   r4   r4   r8   rï  "  s   zAppendingTiffWriter.closec                 C  s   |   ¡ }t|ƒD ]u}t | j| j d¡¡\}}}| j| }|| }|dk}|s5|  ¡ }	|	| j	7 }	|  
|	¡ || jv rs| j ¡ }
|rV| j||dk|dkd� | j |
d ¡ n| j |	¡ | j||dk|dkd� | j |
¡ d  }	}
q|r}| j dtj¡ qd S )Nr)   r!   r   )ÚisShortÚisLong)r£  rz  rÙ   r5  r¢  r�   rk  Ú
fieldSizesr�  r‡  r´  ÚTagsry  Ú
fixOffsetsr  r[  r¤  )r}   r¥  r‚  r  Ú
field_typerƒ  Ú
field_sizeÚ
total_sizeÚis_localrˆ  Úcur_posr4   r4   r8   r‘  &  s6   




ÿÿ
€âzAppendingTiffWriter.fixIFDc                 C  s¶   |s
|s
d}t |ƒ‚t|ƒD ]J}|r|  ¡ n|  ¡ }|| j7 }|rK|dkrK|dkr/d}t |ƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|rS|  |¡ q|  |¡ qd S )Nz offset is neither short nor longr   r
   znot implementediöÿÿÿr)   )r‹  rz  r£  r�  r‡  r¯  r�   r  r[  r¤  r¶  r   r%  r²  r´  )r}   rƒ  r¸  r¹  rñ   r‚  rˆ  r4   r4   r8   r¼  I  s$   

îzAppendingTiffWriter.fixOffsetsN)F)FF)r³   r´   rµ   rº  r»  r‰   rƒ  r“  r”  r•  r™  ry  r]  r…  r  r�  rŠ  rŒ  r˜  r£  r�  r¯  r²  r´  r¶  r�  rï  r‘  r¼  r4   r4   r4   r8   r{  h  s2    
	
#r{  c              	   C  sþ   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs|st| ||ƒS |  ¡ }zWt|ƒ�;}| g| D ]-}||_ ||_t|dƒs<d}	n|j	}	t
|	ƒD ]}
| |
¡ | ¡  t|||ƒ | ¡  qCq,W d   ƒ n1 sdw   Y  W |  |¡ d S W |  |¡ d S |  |¡ w )NÚappend_imagesr¿  r
   )rD  rO  rE  rœ  r{  r¹   rg  ry  r{  r¿  rz  r  r‰  r”  )rÅ  rm  rµ  rD  rE  rÂ  Úcur_idxÚtfÚimsÚnfrrÂ   r4   r4   r8   Ú	_save_allc  s2   




üøÿñrÇ  z.tifz.tiffz
image/tiff)yÚ
__future__r   r]  rb  ÚloggingrÑ  r[  rÙ   r,  Úcollections.abcr   Ú	fractionsr   Únumbersr   r   Útypingr   r   r	   Ú r   r   r   r   r   r   Ú_binaryr   rÐ  r   rÓ  r   r   Ú	getLoggerr³   r}  r  rF  ÚIFD_LEGACY_APIrT  ré   rç   r_  r  r  r	  rþ  r  r  rJ  rŒ  r  r  rU  r  r  r   r  r`  rK  rL  rM  Ú	PREDICTORr  r  r  r  rY  ra  r
  r  Ú
JPEGTABLESr  rW  rN  rH  rI  r  ÚEXIFIFDrË  rZ  ÚIMAGEJ_META_DATA_BYTE_COUNTSÚIMAGEJ_META_DATArý  rþ   rV  r  rv   r  rd   rg   rq   ry   r¿   rÆ   r‚   rk   rÅ   rÈ   rÝ   r  Ú
_IFDv2BaserÞ   rÂ   rÜ   r¾   Úsetattrr£  ÚImageFileDirectoryr²  rC  rg  r{  rÇ  Úregister_openr1  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer4   r4   r4   r8   Ú<module>   s&  ( 
þýüûúùø	÷
öõôóòñðïîýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì5Ë6Ê7É8È9Ç:Æ;Å<Ä=Ã>Â?Á@ÀA¿B¾C½D¼E»FºG¹H¸I·J¶KµL´M³N²O±P°Q¯R®S­T¬U«VªW©X¨Y§Z¦[¥\¤]£^¢_¡` aŸbžc�dœe›fšg™h˜i‡|
|   s\   fýüûúùø	÷
öõôóòñðïîíë  , |