3
	jQc                 @   s  d dl mZmZ ddlmZmZmZmZ ddlm	Z	m
Z
 d dlZd dlmZ d dlmZ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mZ d	Zd
Zd
Zd
ZdZdZdZdZdZ dZ!dZ"dZ#d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.d/d0d1d2d3d4d5d6d7d8d9d:d;d<Z?d=d> e?j@ D ZAed dddf fded dddf fded ddAdf fded ddAdf fdeddddf fdeddddf fdedddAdf fdedddAdf fded dddf fded dddf fded ddAdf fded ddAdf fdeddddf fdeddddf fdedddAdf fdedddAdf fded dddf fded dddf fded ddAdf fded ddAdf fdeddddf fdeddddf fdedddAdf fdedddAdf fded dddf fded dddf fded ddAdf fded ddAdf fdeddddf fdeddddf fdedddAdf fdedd dAdf fdeddddf fdeddddf fdedd	dd
f fdeddddf fdeddddf fded dddf fded dddf fdeddddf fdeddddf fdeddddf fd edd!dd"f fd#edd$dd%f fd&edd'dd(d)fd*edd+dd,d-fd.edAd/dd0f fd1edAd2dd3f fd4edAd5dAd6f fd7edAd8dAd9f fd:edAd;dd<f fd=edAd>dd?f fd@edAdAddBdCfdDedAdEddFdGfdHedAdIddJdKfdLedAdMddNdOfdPedAdQddRdSfdTedAdUddVdWfdXedAdYddZd[fd\edAd]dd^d_fd`edAdaddbdcfddedAdeddfdgfdhedAdiddjdkfdledAdmddndofdpedAdqddrf fdsedAdtdduf fdvedAdwddxf fdyedAdzdd{f fd|edAd}dd~dfdedAddddfdedAddddfdedAddddfdedAddddfdedAddddfdedZdddf fdedZdddf fdedZddAdf fdedZddAdf fdedZdddf fdedZdddf fdedZddAdf fdedZddAdf fdedZdddf fdedZdddf fdedZddAdf fdedZddAdf fdedZdddf fdedZdddf fdedZddddfdedZdddĐdfdedZddAdf fdedZddAdf fded|dddf fded|dddf fded|dddԐdfded|dddؐdfded|dddܐdfded|ddddfdeddddf fdeddddf fdedddddfdedddddfdedddddfdedddddfdedddddfdedddddfd edNdddf fdedNdddf fdilZBddddgZCdd ZDdd ZEi ZFi ZGG dd deZHG dd dejIZJeFeJ_FeGeJ_GxNej@ D ]B\ZKZLeLjMddZLeNeJdeL eFeK d  eNeJdeL eGeK  
qW [F[G[K[LG dd deJZOeOZPG dd dejZQd?eddddfdDeddddfdbeddd	dAfdsedZdd
dfdzedZdddAfd`eddAddfdSeddddfdXeddAddfd]eddZddfdcedAdddfdfedAddd fdeedAdddAfd}ed|dddfdeddddfdedNdddfdaeddAddfdVeddddfdYeddAddfd^eddZddfdZRdd ZSG dd dZTdd ZUejVeQjWeQeD ejXeQjWeS ejYeQjWeU ejZeQjWddg ej[eQjWd dS (      )divisionprint_function   )Image	ImageFileImagePaletteTiffTags)i8o8N)Fraction)NumberRational)TYPESz1.3.5FTs   IIs   MM   i  i  i  i  i
  i  i  i  i  i  i  i  i  i(  i1  i2  i;  i=  i@  iD  iR  iS  i[  i  i  iI  is  ii  i  i  i  rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzwZ	tiff_jpegZjpegZtiff_adobe_deflateZtiff_raw_16packbitsZtiff_thunderscanZtiff_deflateZtiff_sgilogZtiff_sgilog24)r                        i  i  i)  i  it  iu  c             C   s   i | ]\}}||qS  r   ).0kvr   r   5/usr/lib/python3/dist-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r   11;Ir   1;IR1;RLL;2IL;2IRL;2L;2Rr   L;4IL;4IRL;4L;4Rr   L;IL;IRL;R   I;16I;12   I;16BII;16SI;16BSr       FF;32FF;32BFI;32NI;32SI;32BSLARGBRGB;RRGBARGBXRGBXXRGBXXXRGBa  RGB;16LRGB;16BRGBA;16LRGBA;16BRGBX;16LRGBX;16BRGBa;16LRGBa;16BPP;1P;1RP;2P;2RP;4P;4RPAP;Rr   CMYKCMYKXCMYKXXr   YCbCrYCbCrXYCbCrXXXLABs   MM *s   II* s   MM* s   II *c             C   s   | d d t kS )Nr   )PREFIXES)prefixr   r   r   _accept
  s    ra   c             C   s<   t | dk}t|rd|  n| j|}|r8|d d d S |S )Nr   )absIFDRationallimit_rational)valZmax_valinvZn_dr   r   r   _limit_rational  s    rh   c               @   s>  e Zd ZdZd3Zd4d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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d0Z(ed1Z)d2S )5rd   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_denominator_valr   c             C   s   || _ || _td| _t|tr6|j| _|j| _ || _t|tr\|j| _ |j| _|j| _dS |dkrrtd| _dS |dkrt|| _nt||| _dS )z
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        r   Nr   nan)	rj   ri   floatrk   
isinstancer   	numeratordenominatorrd   )selfvaluerp   r   r   r   __init__)  s$    



zIFDRational.__init__c             C   s   | j S )N)ri   )ar   r   r   ro   G  s    zIFDRational.numeratorc             C   s   | j S )N)rj   )rt   r   r   r   rp   K  s    zIFDRational.denominatorc             C   s.   | j dkr| j| j fS | jj|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rp   ro   rk   Zlimit_denominator)rq   Zmax_denominatorfr   r   r   re   O  s    
zIFDRational.limit_rationalc             C   s   t t| jS )N)strrm   rk   )rq   r   r   r   __repr__\  s    zIFDRational.__repr__c             C   s
   | j j S )N)rk   __hash__)rq   r   r   r   rx   _  s    zIFDRational.__hash__c             C   s
   | j |kS )N)rk   )rq   otherr   r   r   __eq__b  s    zIFDRational.__eq__c                s    fdd}|S )Nc                s   t | j | S )N)getattrrk   )rq   args)opr   r   delegatef  s    z'IFDRational._delegate.<locals>.delegater   )r}   r~   r   )r}   r   	_delegatee  s    zIFDRational._delegate__add____radd____sub____rsub____div____rdiv____mul____rmul____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__	__trunc____lt____gt____le____ge____nonzero____ceil__	__floor__	__round__N)ri   rj   rk   )r   )*__name__
__module____qualname____doc__	__slots__rs   propertyro   rp   re   rw   rx   rz   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   r   rd     sL   
rd   c               @   s  e Zd ZdZdad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eekrd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dbdcdddedfdgdhg edAdAdidCdDZedAdEdF ZedGdAdjdHdIZ edGdJdK Z!edLd5dkdMdNZ"edLdOdP Z#edQdAdldRdSZ$edQdTdU Z%edVd5dmdWdXZ&edVdYdZ Z'd[d\ Z(d]d^ Z)d_d` Z*dS )n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] = 2
        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
    `~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 `~PIL.TiffTags.TYPES`

    .. versionadded:: 3.0.0
       II*     Nc             C   s   |dd t krtd| |dk	r(|n
|dd | _| jtkrHd| _n| jtkrZd| _ntd| j  | j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.
        Nr   z%not a TIFF file (header %r not valid)r   ><znot a TIFF IFDr#   F)
r_   SyntaxError_prefixMM_endianIIreset_unpacknext_legacy_api)rq   ifhr`   r   r   r   rs     s    

zImageFileDirectory_v2.__init__c             C   s   | j S )N)r   )rq   r   r   r   <lambda>  s    zImageFileDirectory_v2.<lambda>c             C   s   | j S )N)_offset)rq   r   r   r   r     s    c             C   s   | j S )N)r   )rq   r   r   r   r     s    c             C   s   t dd S )Nz"Not allowing setting of legacy api)	Exception)rq   rr   r   r   r   
legacy_api  s    z ImageFileDirectory_v2.legacy_apic             C   s(   i | _ i | _i | _i | _d | _d | _d S )N)_tags_v1_tags_v2_tagdatatagtypeZ_nextr   )rq   r   r   r   r     s    zImageFileDirectory_v2.resetc             C   s   t t| S )N)rv   dict)rq   r   r   r   __str__  s    zImageFileDirectory_v2.__str__c             C   s   t dd | j D S )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c             s   s"   | ]\}}t j|j|fV  qd S )N)r   lookupname)r   coderr   r   r   r   	<genexpr>  s   z.ImageFileDirectory_v2.named.<locals>.<genexpr>)r   items)rq   r   r   r   named  s    zImageFileDirectory_v2.namedc             C   s   t t| jt| jB S )N)lensetr   r   )rq   r   r   r   __len__  s    zImageFileDirectory_v2.__len__c             C   sh   || j kr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrdt|ttf rd|f}|S )N)r   r   r   _load_dispatchr   rn   tuplebytes)rq   tagdatatypsizehandlerrf   r   r   r   __getitem__  s    



z!ImageFileDirectory_v2.__getitem__c             C   s   || j kp|| jkS )N)r   r   )rq   r   r   r   r   __contains__  s    z"ImageFileDirectory_v2.__contains__c             C   s   || kS )Nr   )rq   r   r   r   r   has_key  s    zImageFileDirectory_v2.has_keyc             C   s   | j ||| j d S )N)_setitemr   )rq   r   rr   r   r   r   __setitem__  s    z!ImageFileDirectory_v2.__setitem__c                s  t ttf}ttkr|tf7 }tj| t||r6|gn|}|| jkr jrZ j| j|< nd| j|< t	dd |D rd| j|< nt	dd |D rt	dd |D rd| j|< n
d| j|< nPt	d	d |D rd
| j|< n2ttkrd| j|< nt	dd |D rd| j|< | j| dkrFttk	rFt|tr@|j
ddn|g}t fdd|D }|rh| jn| j} jdks jd krt|dkr| r|r| j| dkr|f}y|\||< W n8 tk
r   tjd|t|f  |d ||< Y nX n|||< d S )Nr   c             s   s   | ]}t |tV  qd S )N)rn   rd   )r   r   r   r   r   r     s    z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>r   c             s   s   | ]}t |tV  qd S )N)rn   int)r   r   r   r   r   r      s    c             s   s   | ]}|dk V  qdS )r   r2   Ni   r   )r   r   r   r   r   r   !  s    r   r   c             s   s   | ]}t |tV  qd S )N)rn   rm   )r   r   r   r   r   r   %  s    r/   r   c             s   s   | ]}t |tV  qd S )N)rn   rv   )r   r   r   r   r   r   ,  s    asciireplacec             3   s   | ]} j |V  qd S )N)Zcvt_enum)r   rr   )infor   r   r   3  s    r   
   z=Metadata Warning, tag %s had too many entries: %s, expected 1r   )r   r   )r   r   rv   unicoder   r   rn   r   typeallencoder   r   r   Zlengthr   
ValueErrorwarningswarn)rq   r   rr   r   Z	basetypesvaluesdestr   )r   r   r     sL    




"zImageFileDirectory_v2._setitemc             C   s.   | j j|d  | jj|d  | jj|d  d S )N)r   popr   r   )rq   r   r   r   r   __delitem__O  s    z!ImageFileDirectory_v2.__delitem__c             C   s   t t| jt| jB S )N)iterr   r   r   )rq   r   r   r   __iter__T  s    zImageFileDirectory_v2.__iter__c             C   s   t j| j| |S )N)structunpackr   )rq   fmtr   r   r   r   r   W  s    zImageFileDirectory_v2._unpackc             G   s   t j| j| f| S )N)r   packr   )rq   r   r   r   r   r   _packZ  s    zImageFileDirectory_v2._packc                s    fdd}|S )Nc                sB   ddl m} | jjdr2| jdd  jdd| < | ft < | S )Nr   )r   load_r   _ )r   r   r   
startswithr   r   )funcr   )idxr   r   r   	decorator^  s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr   )r   r   r   r   )r   r   r   _register_loader]  s    z&ImageFileDirectory_v2._register_loaderc                s    fdd}|S )Nc                s   | t  < | S )N)_write_dispatch)r   )r   r   r   r   g  s    z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr   )r   r   r   )r   r   _register_writerf  s    z&ImageFileDirectory_v2._register_writerc                sX   ddl m} | \} }|||< tjd  d fdd	ft|<  fddt|< d S )	Nr   )r   =Tc                s   | j djt|  |S )Nz{}{})r   formatr   )rq   r   r   )r   r   r   r   r   q  s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                s   dj  fdd|D S )N    c             3   s   | ]}j  |V  qd S )N)r   )r   rr   )r   rq   r   r   r   t  s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)join)rq   r   )r   )rq   r   r   s  s    )T)r   r   r   Zcalcsizer   r   )Zidx_fmt_namer   r   r   r   )r   r   r   _register_basicl  s    
z%ImageFileDirectory_v2._register_basicr   Hshortr   r#   longr   bsigned byter   hsigned short	   lsigned long   ru   rm   r/   ddoubler   Tc             C   s   |S )Nr   )rq   r   r   r   r   r   	load_byte  s    zImageFileDirectory_v2.load_bytec             C   s   |S )Nr   )rq   r   r   r   r   
write_byte  s    z ImageFileDirectory_v2.write_byter   c             C   s"   |j dr|d d }|jddS )N    r   zlatin-1r   rb   )endswithdecode)rq   r   r   r   r   r   load_string  s    
z!ImageFileDirectory_v2.load_stringc             C   s,   t jjdkr|jdd}d|jdd d S )Nr   r   r   r   r  )sysversion_infomajorr  r   )rq   rr   r   r   r   write_string  s    z"ImageFileDirectory_v2.write_stringr   c                sV   | j djt|d |}fdd t fddt|d d d |dd d D S )	Nz{}Lr   c                s    r| |fS t | |S )N)rd   )rt   r   )r   r   r   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec             3   s   | ]\}} ||V  qd S )Nr   )r   numdenom)r  r   r   r     s   z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   )r   r   r   r   zip)rq   r   r   valsr   )r  r   r   load_rational  s    z#ImageFileDirectory_v2.load_rationalc                s   dj  fdd|D S )Nr   c             3   s"   | ]} j dt|d V  qdS )2Lr      N)r  l        )r   rh   )r   frac)rq   r   r   r     s   z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)r   )rq   r   r   )rq   r   write_rational  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   |S )Nr   )rq   r   r   r   r   r   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   |S )Nr   )rq   rr   r   r   r   write_undefined  s    z%ImageFileDirectory_v2.write_undefinedr   c                sV   | j djt|d |}fdd t fddt|d d d |dd d D S )	Nz{}lr   c                s    r| |fS t | |S )N)rd   )rt   r   )r   r   r   r    s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec             3   s   | ]\}} ||V  qd S )Nr   )r   r  r  )r  r   r   r     s   z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   )r   r   r   r   r  )rq   r   r   r  r   )r  r   r   load_signed_rational  s    z*ImageFileDirectory_v2.load_signed_rationalc                s   dj  fdd|D S )Nr   c             3   s"   | ]} j dt|d V  qdS )r  r      N)r  i   @)r   rh   )r   r  )rq   r   r   r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)r   )rq   r   r   )rq   r   write_signed_rational  s    z+ImageFileDirectory_v2.write_signed_rationalc             C   s2   |j |}t||kr.tdd|t|f  |S )NzCorrupt EXIF data.  z,Expecting to read %d bytes but only got %d. )readr   IOError)rq   fpr   Zretr   r   r   _ensure_read  s    
z"ImageFileDirectory_v2._ensure_readc             C   s  | j   |j | _yxt| jd| j|dd D ]j}| jd| j|d\}}}}trtj|j	}t
j|d}td||||f dd	 y| j| \}	}
W n$ tk
r   trtd
| w6Y nX ||	 }|dkr(|j }| jd|\}trtd||f dd	 |j| tj||}|j| n|d | }t||kr\tjd|t||f  q6|sdq6|| j|< || j|< tr6|dkrtd|  q6td| |  q6W | jd| j|d\| _W n0 tk
r } ztjt| d S d }~X nX d S )Nr   r   r   HHL4sr/   unknownztag: %s (%d) - type: %s (%d)r   )endz- unsupported typer   r#   z$Tag Location: %s - Data Location: %szXPossibly corrupt EXIF data.  Expecting to read %d bytes but only got %d. Skipping tag %sr7   z- value: <table: %d bytes>z- value:)r   tellr   ranger   r  DEBUGr   r   r   r   getprintr   KeyErrorseekr   Z
_safe_readr   r   r   r   r   r   r  rv   )rq   r  ir   r   countr   tagnametypnameZ	unit_sizer   r   hereoffsetmsgr   r   r   load  sX    
&





zImageFileDirectory_v2.loadc             C   s  |j  dkr&|j| j| jddd  |j| jdt| j g }|j  t| jd  d }d }xPt| jj D ]<\}}|tkrt|}| j	j
|}trtd|||f  t|tr|n|f}| j| | f| }	tr6tj|j}
tj
|d	}td
|
|||f dd t|	dkr,tdt|	  n
td| |dkrHt|	nt|}t|	dkr||j||||	jdddf qr|j|||| jd||	f |t|	d d d 7 }qrW |d k	r|| \}}}}}	|	rtd| jd| jd|d | }|||||	f||< xR|D ]J\}}}}}	tdkrBt|||t|t|	 |j| jd|||| qW |jd x:|D ]2\}}}}}	|j|	 t|	d@ rp|jd qpW |S )Nr   ZHL*   r   r   r/   r   zTag %s, Type: %s, Value: %sr!  zsave: %s (%d) - type: %s (%d)r   )r"  r2   z- value: <table: %d bytes>z- value:r   r   r  r   r#   r   z&multistrip support not yet implementedr   s       )r   r   )r#  writer   r   r   r   sortedr   STRIPOFFSETSr   r&  r%  r'  rn   r   r   r   r   r   r   appendljustNotImplementedErrorr   repr)rq   r  Zentriesr/  Zstripoffsetsr   rr   r   r   r   r,  r-  r+  r   r   r   save  sZ    




zImageFileDirectory_v2.save)r   N)r   r   r   )r   r#   r   )r   r   r   )r   r   r   )r   r   r   )r   ru   rm   )r/   r  r  )T)T)T)T)T)+r   r   r   r   rs   r   r`   r/  r   setterr   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   listmapr  r  r  r  r  r  r  r  r  r  r  r1  r:  r   r   r   r   r     sb   
	>	

9r   r   r   r   Zwrite_c               @   sl   e Zd ZdZdd Zed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d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] = 2
        print(ifd[key])
        ('Some Data',)

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

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c             O   s   t j| f|| d| _d S )NT)r   rs   r   )rq   r|   kwargsr   r   r   rs   Y  s    zImageFileDirectory_v1.__init__c             C   s   | j S )N)r   )rq   r   r   r   r   ]  s    zImageFileDirectory_v1.<lambda>c             C   s   | j S )N)r   )rq   r   r   r   r   ^  s    c             C   s(   | |j d}|j|_|j|_|j|_|S )a3   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`

        )r`   )r`   r   r   r   )clsZoriginalifdr   r   r   from_v2`  s
    zImageFileDirectory_v1.from_v2c             C   s4   t | jd}t| j|_t| j|_t| j|_|S )a3   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`

        )r`   )r   r`   r   r   r   r   )rq   rA  r   r   r   to_v2r  s
    zImageFileDirectory_v1.to_v2c             C   s   || j kp|| jkS )N)r   r   )rq   r   r   r   r   r     s    z"ImageFileDirectory_v1.__contains__c             C   s   t t| jt| jB S )N)r   r   r   r   )rq   r   r   r   r     s    zImageFileDirectory_v1.__len__c             C   s   t t| jt| jB S )N)r   r   r   r   )rq   r   r   r   r     s    zImageFileDirectory_v1.__iter__c             C   s    xdD ]}| j ||| qW d S )NFT)FT)r   )rq   r   rr   r   r   r   r   r     s    
z!ImageFileDirectory_v1.__setitem__c             C   sr   || j krP| j| }| j| }| j| \}}x"dD ]}| j||| ||| q2W | j | }t|ttfsn|f}|S )NFT)FT)r   r   r   r   r   rn   r   r   )rq   r   r   r   r   r   Zlegacyrf   r   r   r   r     s    




z!ImageFileDirectory_v1.__getitem__N)r   r   r   r   rs   r   ZtagsZtagdataclassmethodrB  rC  r   r   r   r   r   r   r   r   r   r>  G  s   r>  c                   s   e Zd ZdZdZdZdd Zedd Zedd	 Z	d
d Z
dd Zdd ZdddZ fddZdd Zdd Zdd Z  ZS )TiffImageFileZTIFFz
Adobe TIFFFc             C   s   | j jd}t|| _d | _| _| jj | _| _d| _	| j | _
g | _d| _d| _trttd td| j td| | jd dS )	z#Open the first image in a TIFF filer   Nr   z*** TiffImageFile._open ***z
- __first:z- ifh: r   rb   )r  r  r   tag_v2r   rA  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_frames_is_animatedr%  r'  _seek)rq   r   r   r   r   _open  s    

zTiffImageFile._openc             C   sb   | j d kr\| j }yx| j| j d  qW W n" tk
rP   | j d | _ Y nX | j| | j S )Nr   )rK  r#  rM  EOFErrorr)  )rq   currentr   r   r   n_frames  s    

zTiffImageFile.n_framesc             C   sj   | j d krd| jd k	r"| jdk| _ nB| j }y| jd d| _ W n tk
rX   d| _ Y nX | j| | j S )Nr   TF)rL  rK  r#  r)  rO  )rq   rP  r   r   r   is_animated  s    




zTiffImageFile.is_animatedc             C   s<   | j |sdS | j| tj| j tjj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkrM  r   Z_decompression_bomb_checkr   Zcorenewmodeim)rq   framer   r   r   r)    s
    

zTiffImageFile.seekc             C   s   | j | _xt| j|kr| js&tdtrHtd|| j| j| jj	 f  | jj	  | jj
| j | jj| j trtd| jj	   | jj| j | jj| _|  jd7  _q
W | jj
| j|  | jj| j | jj| _tj| j | _| _|| _| j  d S )Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %szLoading tags, location: %sr   )rI  r  r   rJ  rG  rO  r%  r'  rH  r#  r)  r6  rF  r1  r   r>  rB  r   rA  _setup)rq   rV  r   r   r   rM    s*    


zTiffImageFile._seekc             C   s   | j S )zReturn the current frame number)rH  )rq   r   r   r   r#  	  s    zTiffImageFile.tellNc             C   sH   d}|dkr| j dkr|| }| j}|dkr8|ddf}n|dkrD|}|S )zSetup decoder contextsNr?   r   r   r   r   r   )_planar_configuration_compression)rq   rawmodeZlayertiler|   compressionr   r   r   _decoder  s    zTiffImageFile._decoderc                s   | j r| j S tt| j S )N)use_load_libtiff_load_libtiffsuperrE  r1  )rq   )	__class__r   r   r1    s    zTiffImageFile.loadc             C   s   | j dkr| j rd| _d S )Nr   T)rH  rG  !_close_exclusive_fp_after_loading)rq   r   r   r   load_end   s    zTiffImageFile.load_endc             C   s  t j j| }| jdkrtd| js(|S | j  t| jdksFtd| jd d }t| jd d | jjg }y6t	| j
dotj| j
j }t	| j
dr| j
j  W n tk
r   d	}Y nX |r||d
< t j| jdt|| j}y|j| j| W n tk
r   tdY nX t	| j
drHtr2td |j| j
j \}}nZt	| j
drtrdtd | j
jd |jd\}}n"trtd |j| j
j \}}g | _d| _| jr| jdkr| j r| j
j   d| _
|dk rt|t j j| S )z] Overload method triggered when we detect a compressed tiff
            Calls out to libtiff Nzcannot load this imager   zNot exactly one tiler   r   filenoflushFr   libtiffzCouldn't set the image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   r1  r[  r  Zload_preparer   r<  rF  r/  hasattrr  osduprd  re  Z_getdecoderrT  r   ZdecoderconfigsetimagerU  r   r%  r'  r  rg  r)  r  readonlyZ_exclusive_fprH  rG  close)rq   ZpixelZextentsr|   r  decodernerrr   r   r   r_  &  sZ    




zTiffImageFile._load_libtiffc             C   s~  d| j krtdt| j jtd | _| j jtd| _| j jtd}| j jt	d}t
rtd td| j td| td| j td	| t| j jt}t| j jt}||f| _t
rtd
| j | j jtd.}t|dkot|t|  kodkn  rd/}| j jtd0}| j jtf }|d1kr0d}n|dkr@d}nd}|t|7 }|t|krtt|dkrt|| }| j j|||||f}	t
rtd|	 yt|	 \| _}
W n, tk
r   t
rtd tdY nX t
rtd|
 td| j | j| jd< | j jtd}| j jtd}|r|r| j jt}|dkrN||f| jd< nX|dkrp|d |d f| jd< n6|dkr||f| jd< ||f| jd< n||f| jd< d } }}g | _d| _ t!| j krR| j t! }| j jt"|}| jd }t#s| jdkrd| _ |dkrT| j j||d| j jtd2| j jtf f}	t
rFtd|	 t|	 \| _}
|
dkrbd}
d |
krx|
j$d d!}
d"|
kr|
j$d"d!}
|
| jdf}| jj%| jdd||fd|f d}nxt&|D ]\}}| j'|
||}| jj%| jdt|||t|| |f||f t
rtd#| j || }|| jd krFd }}|d7 }d}qW nt(| j kr| j jd$}| j jd%}d}x| j t( D ]}|s| j'|
|}| jj%| j|||| || f||f || }|| jd krd||  }}|| jd krd }}|d7 }d}qW nt
r"td& td't)| j krF| j t) | jd(< | jd)krzd*d+ | j t* D }t+j,d,d-j-|| _.dS )3z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   z*** Summary ***z- compression:z- photometric_interpretation:z- planar_configuration:z- fill_order:z- size:r   r   r   r   r   r   zformat key:z- unsupported formatzunknown pixel modez- raw mode:z- pil mode:r\  dpigRQ@N
resolutionFr   TzI;16zI;16Nz;16Bz;16Nz;16Lztiles: iB  iC  z- unsupported data organizationzunknown data organizationicc_profilerO   c             S   s   g | ]}t |d  qS )r   )r
   )r   r   r   r   r   
<listcomp>A  s    z(TiffImageFile._setup.<locals>.<listcomp>zRGB;Lr   )r   )r   )r   )r   r   r   )r   )/rF  r  COMPRESSION_INFOr&  COMPRESSIONrY  PLANAR_CONFIGURATIONrX  PHOTOMETRIC_INTERPRETATION	FILLORDERr%  r'  r   
IMAGEWIDTHIMAGELENGTHr   SAMPLEFORMATr   maxminBITSPERSAMPLEEXTRASAMPLESr`   	OPEN_INFOrT  r(  r   r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr[  r^  r5  ROWSPERSTRIPREAD_LIBTIFFr   r6  	enumerater]  TILEOFFSETS
ICCPROFILECOLORMAPr   r   r   palette)rq   photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countkeyrZ  ZxresZyresZresunitxyr   Zoffsetsr   wrt   r*  r/  or  r   r   r   rW  }  s    



"

















zTiffImageFile._setup)N)r   r   r   r   Zformat_descriptionrb  rN  r   rQ  rR  r)  rM  r#  r]  r1  rc  r_  rW  __classcell__r   r   )ra  r   rE    s   
WrE  )r   r#   r>   rO   rV   r4   zI;16zI;16Sr8   r?   rB   rA   rX   r[   r^   zI;32BSzI;16BzI;16BSzF;32BFc             C   s*  yt | j \}}}}}}W n" tk
r<   td| j Y nX t|d}	| jjd| jjdd}
tpj|
dk}t	| dd|	t
< | jd |	t< | jd |	t< | jjdi }trtd	t|  t|tr|j }x<|D ]4}|j||	|< y|j| |	j|< W q   Y qX qW t| d
r^xFttttttfD ]2}|| jkr(| j| |	|< | jj| |	j|< q(W d| jkrx| jd |	t< xht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g
D ]$\}}|| jkr| j| |	|< qW | jjd}|rd|	t< |d |	t< |d |	t< |d.kr@||	t#< t$|dkr@t$||	t%< |d k	rR||	t&< |dkrd||	t'< ||	t(< | jdkr| j)j*dd}t+dd |D |	t,< t$|| jd |d  d d  }| jd |	t-< || jd  |	t.< d|	t/< t0j|
d|	t1< |rtrtd tdt2|	j3   d}t|d rdy|j4d t5j6|j7 }W n t8j9k
rb   Y nX t/t.g}i }|d |t#< i }t| d!r| j:j }xt;j<|	j3 t	| d
i j3 |j3 D ]\}}|t=j>krҐq||kr||krt|t?t@krtAnt@r|jBd"d#d$ ||< n"t|tCr0tD|||< n|||< qW trXtd%t2|j3   | jd/krhd(}||
|||f}tEjF| jd)|| jG}|jH| j)d0| j  x.|jBd1\}}}|s|jI| |rP qW |dk rtd,| n.|	jJ|}tKjL| |dd2| j |||dffg d-| jkr&|	| _Md S )3Nzcannot write mode %s as TIFF)r`   r\  r   rX  r   r   ZtiffinfozTiffinfo Keys: %srF  rs  Zdescriptionrr  Zx_resolutionZy_resolutionZresolution_unitZsoftwareZ	date_timeZartist	copyrightrq  r   rO   r?   zRGB;Lc             s   s   | ]}t |d  V  qdS )r   N)r	   )r   r   r   r   r   r     s    z_save.<locals>.<genexpr>r   r   zSaving using libtiff encoderz	Items: %srd  r   r   r   r  zConverted items: %sI;16BI;16zI;16Nrf  r2   i   z(encoder error %d when writing image file_debug_multipage)r   )r  r  )r   r   i @  )r   r   )N	SAVE_INFOrT  r(  r  r   encoderinfor&  r   WRITE_LIBTIFFr{   rw  r   rz  r{  r%  r'  r<  rn   r>  rC  r   rh  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPrF  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  r   SAMPLESPERPIXELr  r|  rx  rU  Z
getpaletter   r  r  STRIPBYTECOUNTSr5  COMPRESSION_INFO_REVrv  r4  r   r)  ri  rj  rd  ioUnsupportedOperationr   	itertoolschainr   ZLIBTIFF_COREr   rv   r   r   rd   rm   r   Z_getencoderencoderconfigrk  r3  r:  r   _saver  )rU  r  filenamerZ  r`   r  r   bitsZextrarA  r\  rf  r   r  r   rq  ZlutZstrideZ_fpZ	blocklistZattsZ
legacy_ifdr   rr   rt   er   sr  r/  r   r   r   r  f  s    






"




r  c               @   s   e Zd ZdddddddddddddgZdddd	d
dhZd: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d)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd;d7d8Zd9S )<AppendingTiffWriterr   r   r   r   r   i  i   iD  i  i  i	  Fc             C   sz   t |dr|| _d| _nJ|| _d| _ytj||r4dnd| _W n" tk
r`   tj|d| _Y nX | jj | _| j	  d S )Nr  FTzw+bzr+b)
rh  ru   close_fpr   r  openr  r#  	beginningsetup)rq   fnrS  r   r   r   rs   '  s    
zAppendingTiffWriter.__init__c             C   s   | j j| jtj d | _d| _| j jd | _}|s>d| _	d S d| _	|dkrX| j
d n|dkrl| j
d ntd	| j  | j  d S )
Nr   r   TFs   II* r   s   MM *r   zInvalid TIFF file header)ru   r)  r  ri  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rq   r  r   r   r   r  5  s    zAppendingTiffWriter.setupc             C   s   | j r
d S | jj| j | jjd}|s,d S || jkr>td| j }|| j7 }| jj| j | j	| | jj| | j
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r  ru   r)  r  r  r  r  readLongr  	writeLongfixIFD)rq   r  	IFDoffsetr   r   r   finalizeM  s    


zAppendingTiffWriter.finalizec             C   s   | j   | j  d S )N)r  r  )rq   r   r   r   newFramee  s    zAppendingTiffWriter.newFramec             C   s   | S )Nr   )rq   r   r   r   	__enter__j  s    zAppendingTiffWriter.__enter__c             C   s   | j r| j  dS )NF)r  rm  )rq   exc_type	exc_value	tracebackr   r   r   __exit__m  s    zAppendingTiffWriter.__exit__c             C   s   | j j | j S )N)ru   r#  r  )rq   r   r   r   r#  r  s    zAppendingTiffWriter.tellc             C   s*   |t jkr|| j7 }| jj|| | j S )N)ri  r  r  ru   r)  r#  )rq   r/  whencer   r   r   r)  u  s    

zAppendingTiffWriter.seekc             C   sb   | j jdtj | j j }d|d  }d|  k o8dk n  rR| j jtt| | j j | _d S )Nr   r2   )	ru   r)  ri  SEEK_ENDr#  r3  r   	bytearrayr  )rq   posZpadBytesr   r   r   r  |  s    
zAppendingTiffWriter.goToEndc             C   s.   || _ | j d | _| j d | _| j d | _d S )Nr#   r   ZHHL)endianlongFmtshortFmt	tagFormat)rq   r  r   r   r   r    s    zAppendingTiffWriter.setEndianc             C   sT   xN| j  }|dkr$| jj d | _P | jj| | j }| jj|d tj qW d S )Nr   r   r/   )r  ru   r#  r  r)  	readShortri  SEEK_CUR)rq   r  numTagsr   r   r   r    s    zAppendingTiffWriter.skipIFDsc             C   s   | j j|S )N)ru   r3  )rq   r   r   r   r   r3    s    zAppendingTiffWriter.writec             C   s   t j| j| jjd\}|S )Nr   )r   r   r  ru   r  )rq   rr   r   r   r   r    s    zAppendingTiffWriter.readShortc             C   s   t j| j| jjd\}|S )Nr   )r   r   r  ru   r  )rq   rr   r   r   r   r    s    zAppendingTiffWriter.readLongc             C   sF   | j jdtj | j jtj| j|}|d k	rB|dkrBtd| d S )Nr   r   z wrote only %u bytes but wanted 4)	ru   r)  ri  r  r3  r   r   r  r  )rq   rr   bytesWrittenr   r   r   rewriteLastShortToLong  s
    z*AppendingTiffWriter.rewriteLastShortToLongc             C   sF   | j jdtj | j jtj| j|}|d k	rB|dkrBtd| d S )Nr   z wrote only %u bytes but wanted 2r  )	ru   r)  ri  r  r3  r   r   r  r  )rq   rr   r  r   r   r   rewriteLastShort  s
    z$AppendingTiffWriter.rewriteLastShortc             C   sF   | j jdtj | j jtj| j|}|d k	rB|dkrBtd| d S )Nr   z wrote only %u bytes but wanted 4)	ru   r)  ri  r  r3  r   r   r  r  )rq   rr   r  r   r   r   rewriteLastLong  s
    z#AppendingTiffWriter.rewriteLastLongc             C   s6   | j jtj| j|}|d k	r2|dkr2td| d S )Nr   z wrote only %u bytes but wanted 2)ru   r3  r   r   r  r  )rq   rr   r  r   r   r   
writeShort  s    zAppendingTiffWriter.writeShortc             C   s6   | j jtj| j|}|d k	r2|dkr2td| d S )Nr   z wrote only %u bytes but wanted 4)ru   r3  r   r   r  r  )rq   rr   r  r   r   r   r    s    zAppendingTiffWriter.writeLongc             C   s   | j   | jj  d S )N)r  ru   rm  )rq   r   r   r   rm    s    zAppendingTiffWriter.closec             C   s  | j  }xt|D ]}tj| j| jjd\}}}| j| }|| }|dk}|sl| j }	|	| j	7 }	| j
|	 || jkr| jj }
|r| j||dk|dkd | jj|
d  n0| jj|	 | j||dk|dkd | jj|
 d  }	}
q|r| jjdtj qW d S )Nr   r   r   )isShortisLong)r  r$  r   r   r  ru   r  
fieldSizesr  r  r  Tagsr#  
fixOffsetsr)  ri  r  )rq   r  r*  r   Z	fieldTyper+  Z	fieldSizeZ	totalSizeZisLocalr/  ZcurPosr   r   r   r    s0    





zAppendingTiffWriter.fixIFDc             C   s   | r| rt dxt|D ]}|r.| j n| j }|| j7 }|r|dkr|dkr\t d| j| | jjdtj	 | j
d | jjdtj	 q|r| j| q| j| qW d S )	Nz offset is neither short nor longi   r   znot implementedr   r   r   i)r  r$  r  r  r  r  ru   r)  ri  r  r  r  r  )rq   r+  r  r  r*  r/  r   r   r   r    s    


zAppendingTiffWriter.fixOffsetsN)F)FF)r   r   r   r  r  rs   r  r  r  r  r  r#  r)  r  r  r  r3  r  r  r  r  r  r  r  rm  r  r  r   r   r   r   r    sH   	

"r  c             C   s   | j j }| j}t|jdg }t| d r>| r>t| ||S | j }zt|t}xl| g| D ]^}||_ ||_t|ds~d}	n|j	}	x6t
|	D ]*}
|j|
 |j  t||| |j  qW q^W W d Q R X W d | j| X d S )Nappend_imagesrQ  r   )r  copyr  r<  r&  rh  r  r#  r  rQ  r$  r)  r1  r  )rU  r  r  r  r  r  Zcur_idxZtfZimsZnfrr   r   r   r   	_save_all  s(    



r  z.tifz.tiffz
image/tiff)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"   )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'   )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+   )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.   )r   )r/   )r0   r1   )r   )r2   )r0   r0   )r   )r2   )r3   r3   )r   )r2   )r4   r5   )r   )r2   )r4   r6   )r   )r7   )r8   r9   )r   )r7   )r8   r:   )r   )r7   )r4   r;   )r   )r7   )r4   r<   )r   )r7   )r4   r=   )r   )r7   )r8   r9   )r   )r7   )r8   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   )r   r   r   )r?   r@   )r   )r   r   r   r   )rA   rA   )r   )r   r   r   r   )rA   rA   )r   )r   r   r   r   )r   )rB   rB   )r   )r   r   r   r   )r   )rB   rB   )r   )r   r   r   r   r   )r   r   )rB   rC   )r   )r   r   r   r   r   )r   r   )rB   rC   )r   )r   r   r   r   r   r   )r   r   r   )rB   rD   )r   )r   r   r   r   r   r   )r   r   r   )rB   rD   )r   )r   r   r   r   )r   )rA   rE   )r   )r   r   r   r   )r   )rA   rE   )r   )r   r   r   r   )r   )rA   rA   )r   )r   r   r   r   )r   )rA   rA   )r   )r   r   r   r   )rF   )rA   rA   )r   )r   r   r   r   )rF   )rA   rA   )r   )r2   r2   r2   )r?   rG   )r   )r2   r2   r2   )r?   rH   )r   )r2   r2   r2   r2   )rA   rI   )r   )r2   r2   r2   r2   )rA   rJ   )r   )r2   r2   r2   r2   )r   )rB   rK   )r   )r2   r2   r2   r2   )r   )rB   rL   )r   )r2   r2   r2   r2   )r   )rA   rM   )r   )r2   r2   r2   r2   )r   )rA   rN   )r   )r2   r2   r2   r2   )r   )rA   rI   )r   )r2   r2   r2   r2   )r   )rA   rJ   )r   )r   )rO   rP   )r   )r   )rO   rP   )r   )r   )rO   rQ   )r   )r   )rO   rQ   )r   )r   )rO   rR   )r   )r   )rO   rR   )r   )r   )rO   rS   )r   )r   )rO   rS   )r   )r   )rO   rT   )r   )r   )rO   rT   )r   )r   )rO   rU   )r   )r   )rO   rU   )r   )r   )rO   rO   )r   )r   )rO   rO   )r   )r   r   )r   )rV   rV   )r   )r   r   )r   )rV   rV   )r   )r   )rO   rW   )r   )r   )rO   rW   )r   )r   r   r   r   )rX   rX   )r   )r   r   r   r   )rX   rX   )r   )r   r   r   r   r   )r   )rX   rY   )r   )r   r   r   r   r   )r   )rX   rY   )r   )r   r   r   r   r   r   )r   r   )rX   rZ   )r   )r   r   r   r   r   r   )r   r   )rX   rZ   )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   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   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   )r7   )r2   )r2   )r7   )r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   )r   r   r   )r7   )r2   )r2   )r7   )\Z
__future__r   r    r   r   r   r   Z_binaryr	   r
   collectionsZ	fractionsr   Znumbersr   r   r  r  ri  r   r	  r   r   __version__r%  r  r  ZIFD_LEGACY_APIr   r   rz  r{  r  rv  rx  ry  r  r5  r  r  r  r  r  rw  r  r  r  r  Z	PREDICTORr  r  r  r|  Z
JPEGTABLESr  r  r  r  ZEXIFIFDr  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAru  r   r  r  r_   ra   rh   r   r   rd   MutableMappingr   r   r   r   setattrr>  ZImageFileDirectoryrE  r  r  r  r  Zregister_openr   Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r   <module>*   s  	u   0W   . ) t