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m	Z	 ddl
mZmZmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ e e¡Ze d¡jZdZ ddddddddddddddddœZ!e d¡Z"ej#Z$	 de$ Z%	 G dd „ d e	ƒZ&G d!d"„ d"e	ƒZ'd#d$„ Z(dSd%d&„Z)G d'd(„ d(ƒZ*G d)d*„ d*e+ƒZ,G d+d,„ d,ƒZ-G d-d.„ d.e*ƒZ.d/d0„ Z/G d1d2„ d2ejƒZ0d3d4d5d6d7d8d9d9d9d:d;d<d=d>d?d@œZ1dAdB„ Z2G dCdD„ dDƒZ3G dEdF„ dFƒZ4dGdH„ Z5dIdJ„ Z6e2dKfdLdM„Z7dNdO„ Z8e 9e0j:e0e/¡ e ;e0j:e7¡ e <e0j:e6¡ e =e0j:dPdQg¡ e >e0j:dR¡ dS )Té    )ÚannotationsN)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32bes   \w\w\w\ws   ‰PNG

)Ú1r   )ÚLúL;2)r   úL;4)r   r   )úI;16úI;16B)ÚRGBr   )r   zRGB;16B)ÚPúP;1)r   úP;2)r   úP;4)r   r   )ÚLAr   )ÚRGBAzLA;16B)r   r   )r   zRGBA;16B))r   r   )é   r   )é   r   )é   r   )é   r   )r   r   )r   r   )r   é   )r   r    )r   r    )r   r    )r   r   )r   r   )r   é   )r   r!   s   ^ÿ* ÿ*$é@   c                   @  s   e Zd ZdZ	 dZ	 dZdS )ÚDisposalr   r   r   N)Ú__name__Ú
__module__Ú__qualname__ÚOP_NONEÚOP_BACKGROUNDÚOP_PREVIOUS© r*   r*   úK/var/www/html/loop/nvenv/lib/python3.10/site-packages/PIL/PngImagePlugin.pyr#   c   s    r#   c                   @  s   e Zd ZdZ	 dZdS )ÚBlendr   r   N)r$   r%   r&   Ú	OP_SOURCEÚOP_OVERr*   r*   r*   r+   r,   x   s
    r,   c                 C  s*   t  ¡ }| | t¡}|jrd}t|ƒ‚|S )NzDecompressed Data Too Large)ÚzlibÚdecompressobjÚ
decompressÚMAX_TEXT_CHUNKÚunconsumed_tailÚ
ValueError)ÚsÚdobjÚ	plaintextÚmsgr*   r*   r+   Ú_safe_zlib_decompress†   s   r9   c                 C  s   t  | |¡d@ S )Nl   ÿÿ )r/   Úcrc32)ÚdataÚseedr*   r*   r+   Ú_crc32�   ó   r=   c                   @  s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„ZdS )ÚChunkStreamc                 C  s   || _ g | _d S ©N)ÚfpÚqueue©ÚselfrA   r*   r*   r+   Ú__init__˜   ó   
zChunkStream.__init__c                 C  s‚   d}| j r| j  ¡ \}}}| j |¡ n| j d¡}|dd… }| j ¡ }t|ƒ}t|ƒs<tj	s<dt
|ƒ› d�}t|ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ú))rB   ÚpoprA   ÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rD   ÚcidÚposÚlengthr5   r8   r*   r*   r+   rJ   œ   s   

zChunkStream.readc                 C  s   | S r@   r*   ©rD   r*   r*   r+   Ú	__enter__°   ó   zChunkStream.__enter__c                 G  s   |   ¡  d S r@   )Úclose)rD   Úargsr*   r*   r+   Ú__exit__³   s   zChunkStream.__exit__c                 C  s   d  | _ | _d S r@   )rB   rA   rT   r*   r*   r+   rW   ¶   r>   zChunkStream.closec                 C  s   | j  |||f¡ d S r@   )rB   Úappend©rD   rQ   rR   rS   r*   r*   r+   Úpush¹   s   zChunkStream.pushc                 C  s*   t  d|||¡ t| d| d¡ ƒ||ƒS )z"Call the appropriate chunk handlerzSTREAM %r %s %sÚchunk_Úascii)ÚloggerÚdebugÚgetattrÚdecoder[   r*   r*   r+   Úcall¼   s   zChunkStream.callc              
   C  s    t jr|d d? d@ r|  ||¡ dS z"t|t|ƒƒ}t| j d¡ƒ}||kr3dt|ƒ› d�}t|ƒ‚W dS  t	j
yO } zdt|ƒ› d�}t|ƒ|‚d}~ww )	zRead and verify checksumr   é   r   Nr   z(broken PNG file (bad header checksum in rG   z(broken PNG file (incomplete checksum in )r   rN   Úcrc_skipr=   rL   rA   rJ   rO   rP   ÚstructÚerror)rD   rQ   r;   Úcrc1Úcrc2r8   Úer*   r*   r+   ÚcrcÂ   s   þ
€þzChunkStream.crcc                 C  s   | j  d¡ dS )zRead checksumr   N)rA   rJ   )rD   rQ   r;   r*   r*   r+   re   Ö   s   zChunkStream.crc_skipó   IENDc              
   C  sr   g }	 z	|   ¡ \}}}W n tjy  } zd}t|ƒ|‚d }~ww ||kr(	 |S |  |t | j|¡¡ | |¡ q)NTztruncated PNG file)	rJ   rf   rg   ÚOSErrorrk   r   Ú
_safe_readrA   rZ   )rD   ÚendchunkÚcidsrQ   rR   rS   rj   r8   r*   r*   r+   ÚverifyÛ   s   
€þý
özChunkStream.verifyN)rl   )r$   r%   r&   rE   rJ   rU   rY   rW   r\   rc   rk   re   rq   r*   r*   r*   r+   r?   —   s    r?   c                   @  s   e Zd ZdZeddd„ƒZdS )ÚiTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    Nc                 C  s   t  | |¡}||_||_|S )zÇ
        :param cls: the class to use when creating the instance
        :param text: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )ÚstrÚ__new__ÚlangÚtkey)ÚclsÚtextru   rv   rD   r*   r*   r+   rt   ÷   s   	ziTXt.__new__)NN)r$   r%   r&   Ú__doc__Ústaticmethodrt   r*   r*   r*   r+   rr   ð   s    rr   c                   @  s6   e Zd ZdZdd„ Zddd„Zddd	„Zdd
d„ZdS )ÚPngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    c                 C  s
   g | _ d S r@   )ÚchunksrT   r*   r*   r+   rE     s   
zPngInfo.__init__Fc                 C  s*   ||g}|r|  d¡ | j  t|ƒ¡ dS )a"  Appends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data
        :param after_idat: for use with private chunks. Whether the chunk
                           should be written after IDAT

        TN)rZ   r|   Útuple)rD   rQ   r;   Ú
after_idatÚchunkr*   r*   r+   Úadd  s   

zPngInfo.addÚ c                 C  s²   t |tƒs| dd¡}t |tƒs| dd¡}t |tƒs!| dd¡}t |tƒs,| dd¡}|rE|  d|d | d | d t |¡ ¡ dS |  d|d | d | d | ¡ dS )	zùAppends an iTXt chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        :param zip: compression flag

        úlatin-1Ústrictúutf-8ó   iTXts     ó    s      N)Ú
isinstanceÚbytesÚencoder€   r/   Úcompress)rD   ÚkeyÚvalueru   rv   Úzipr*   r*   r+   Úadd_itxt  s   



 þ(zPngInfo.add_itxtc                 C  s°   t |tƒr| j|||j|j|d�S t |tƒs0z| dd¡}W n ty/   | j|||d� Y S w t |tƒs;| dd¡}|rL|  d|d t	 
|¡ ¡ dS |  d|d | ¡ dS )	zæAppends a text chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key, text or an
           :py:class:`PIL.PngImagePlugin.iTXt` instance
        :param zip: compression flag

        )r�   r‚   rƒ   ó   zTXtó     ó   tEXtr†   N)r‡   rr   rŽ   ru   rv   rˆ   r‰   ÚUnicodeErrorr€   r/   rŠ   )rD   r‹   rŒ   r�   r*   r*   r+   Úadd_text:  s   
	
ÿ
zPngInfo.add_textN©F)r�   r�   F)r$   r%   r&   ry   rE   r€   rŽ   r“   r*   r*   r*   r+   r{     s    

r{   c                      s¼   e Zd Z‡ 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dd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z‡  ZS )+Ú	PngStreamc                   sR   t ƒ  |¡ i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )N©r   r   r   )ÚsuperrE   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryrC   ©Ú	__class__r*   r+   rE   [  s   
zPngStream.__init__c                 C  s2   |  j |7  _ | j tkrd| j › d�}t|ƒ‚d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r¢   ÚMAX_TEXT_MEMORYr4   )rD   Úchunklenr8   r*   r*   r+   Úcheck_text_memoryl  s   
ÿÿûzPngStream.check_text_memoryc                 C  s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)r˜   Úcopyrœ   r    r¡   rT   r*   r*   r+   Úsave_rewindu  s   ýzPngStream.save_rewindc                 C  s,   | j d  ¡ | _| j d | _| j d | _d S )Nr¨   r©   rª   )r¡   r«   r˜   rœ   r    rT   r*   r*   r+   Úrewind|  s   zPngStream.rewindc                 C  s¾   t  | j|¡}| d¡}t d|d |… ¡ ||d  }t d|¡ |dkr0d|› d�}t|ƒ‚zt||d d … ƒ}W n tyL   t j	rId }n‚ Y n t
jyW   d }Y nw || jd	< |S )
Nr†   ziCCP profile name %rr   zCompression method %sr   úUnknown compression method z in iCCP chunkr   Úicc_profile)r   rn   rA   Úfindr_   r`   rP   r9   r4   rN   r/   rg   r˜   )rD   rR   rS   r5   ÚiÚcomp_methodr8   r¯   r*   r*   r+   Ú
chunk_iCCP�  s(   
þÿ
zPngStream.chunk_iCCPc                 C  s    t  | j|¡}|dk rt jr|S d}t|ƒ‚t|dƒt|dƒf| _zt|d |d f \| _| _	W n	 t
y:   Y nw |d rDd| jd	< |d
 rNd}t|ƒ‚|S )Né   zTruncated IHDR chunkr   r   r   é	   é   r   Ú	interlaceé   zunknown filter category)r   rn   rA   rN   r4   rL   rš   Ú_MODESr›   Ú
im_rawmodeÚ	Exceptionr˜   rP   ©rD   rR   rS   r5   r8   r*   r*   r+   Ú
chunk_IHDRœ  s$    ÿ
zPngStream.chunk_IHDRc                 C  sd   d| j v rd| j d || jfg}n| jd urd| j d< dd| j || jfg}|| _|| _d}t|ƒ‚)NÚbboxr�   TÚdefault_imager–   zimage data found)r˜   rº   rŸ   rš   rœ   Úim_idatÚEOFError)rD   rR   rS   r©   r8   r*   r*   r+   Ú
chunk_IDAT°  s   


zPngStream.chunk_IDATc                 C  s   d}t |ƒ‚)Nzend of PNG image)rÁ   )rD   rR   rS   r8   r*   r*   r+   Ú
chunk_IEND½  s   zPngStream.chunk_IENDc                 C  s&   t  | j|¡}| jdkrd|f| _|S )Nr   r   )r   rn   rA   r›   r�   ©rD   rR   rS   r5   r*   r*   r+   Ú
chunk_PLTEÁ  s   

zPngStream.chunk_PLTEc                 C  sš   t  | j|¡}| jdkr(t |¡r!| d¡}|dkr|| jd< |S || jd< |S | jdv r6t|ƒ| jd< |S | jdkrKt|ƒt|dƒt|dƒf| jd< |S )	Nr   r†   r   Útransparency)r   r   r   r   r   r   )	r   rn   rA   r›   Ú_simple_paletteÚmatchr°   r˜   Úi16)rD   rR   rS   r5   r±   r*   r*   r+   Ú
chunk_tRNSÈ  s   



	
û
ü
þ zPngStream.chunk_tRNSc                 C  s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma)r   rn   rA   rL   r˜   rÄ   r*   r*   r+   Ú
chunk_gAMAÜ  s   zPngStream.chunk_gAMAc                 C  sB   t  | j|¡}t dt|ƒd  |¡}tdd„ |D ƒƒ| jd< |S )Nz>%dIr   c                 s  s   � | ]}|d  V  qdS )rË   Nr*   )Ú.0Úeltr*   r*   r+   Ú	<genexpr>è  ó   € z'PngStream.chunk_cHRM.<locals>.<genexpr>Úchromaticity)r   rn   rA   rf   ÚunpackÚlenr}   r˜   )rD   rR   rS   r5   Úraw_valsr*   r*   r+   Ú
chunk_cHRMâ  s   zPngStream.chunk_cHRMc                 C  s>   t  | j|¡}|dk rt jr|S d}t|ƒ‚|d | jd< |S )Nr   zTruncated sRGB chunkr   Úsrgb)r   rn   rA   rN   r4   r˜   r¼   r*   r*   r+   Ú
chunk_sRGBë  s   zPngStream.chunk_sRGBc           	      C  sŠ   t  | j|¡}|dk rt jr|S d}t|ƒ‚t|dƒt|dƒ}}|d }|dkr8|d |d f}|| jd< |S |dkrC||f| jd	< |S )
Nrµ   zTruncated pHYs chunkr   r   r   r   ç¦
F%uš?ÚdpiÚaspect)r   rn   rA   rN   r4   rL   r˜   )	rD   rR   rS   r5   r8   ÚpxÚpyÚunitrÚ   r*   r*   r+   Ú
chunk_pHYsû  s   
þzPngStream.chunk_pHYsc                 C  sŒ   t  | j|¡}z
| dd¡\}}W n ty   |}d}Y nw |rD| dd¡}| dd¡}|dkr3|n|| j|< || j|< |  t	|ƒ¡ |S )Nr†   r   ó    r‚   rƒ   ÚreplaceÚexif)
r   rn   rA   Úsplitr4   rb   r˜   r™   r§   rÔ   )rD   rR   rS   r5   ÚkÚvÚv_strr*   r*   r+   Ú
chunk_tEXt  s   ý
zPngStream.chunk_tEXtc                 C  sú   t  | j|¡}z
| dd¡\}}W n ty   |}d}Y nw |r&|d }nd}|dkr6d|› d�}t|ƒ‚z
t|dd … ƒ}W n tyP   t jrMd}n‚ Y n tj	y[   d}Y nw |r{| 
dd¡}| 
dd	¡}| | j|< | j|< |  t|ƒ¡ |S )
Nr†   r   rà   r   r®   z in zTXt chunkr‚   rƒ   rá   )r   rn   rA   rã   r4   rP   r9   rN   r/   rg   rb   r˜   r™   r§   rÔ   )rD   rR   rS   r5   rä   rå   r²   r8   r*   r*   r+   Ú
chunk_zTXt  s:   þ
þÿzPngStream.chunk_zTXtc                 C  sl  t  | j|¡ }}z
| dd¡\}}W n ty   | Y S w t|ƒdk r'|S |d |d |dd … }}}z| dd¡\}}	}
W n tyM   | Y S w |dkry|dkrwzt|
ƒ}
W n tyk   t jrj| Y S ‚  tj	yv   | Y S w |S z| 
dd¡}| 
dd¡}|	 
dd¡}	|
 
dd¡}
W n tyž   | Y S w t|
||	ƒ | j|< | j|< |  t|
ƒ¡ |S )Nr†   r   r   r   r‚   rƒ   r„   )r   rn   rA   rã   r4   rÔ   r9   rN   r/   rg   rb   r’   rr   r˜   r™   r§   )rD   rR   rS   Úrr5   rä   ÚcfÚcmru   Útkrå   r*   r*   r+   Ú
chunk_iTXtA  sJ   ÿ ÿÿÿzPngStream.chunk_iTXtc                 C  s    t  | j|¡}d| | jd< |S )Nó   Exif  râ   )r   rn   rA   r˜   rÄ   r*   r*   r+   Ú
chunk_eXIfi  s   zPngStream.chunk_eXIfc                 C  s�   t  | j|¡}|dk rt jr|S d}t|ƒ‚| jd ur%d | _t d¡ |S t|ƒ}|dks1|dkr8t d¡ |S || _t|dƒ| j	d< d| _
|S )	Nr   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r   Úloopz
image/apng)r   rn   rA   rN   r4   rŸ   ÚwarningsÚwarnrL   r˜   rž   )rD   rR   rS   r5   r8   Ún_framesr*   r*   r+   Ú
chunk_acTLo  s$   


zPngStream.chunk_acTLc                 C  s@  t  | j|¡}|dk rt jr|S d}t|ƒ‚t|ƒ}| jd u r#|dks/| jd ur5| j|d kr5d}t|ƒ‚|| _t|dƒt|dƒ}}t|dƒt|d	ƒ}}	| j\}
}|| |
ks_|	| |kred
}t|ƒ‚||	|| |	| f| j	d< t
|dƒt
|dƒ}}|dkrƒd}t|ƒt|ƒ d | j	d< |d | j	d< |d | j	d< |S )Né   z"APNG contains truncated fcTL chunkr   r   ú#APNG contains frame sequence errorsr   r   r¶   r   zAPNG contains invalid framesr¾   é   é   éd   éè  Údurationé   Údisposalé   Úblend)r   rn   rA   rN   r4   rL   r    rP   rš   r˜   rÉ   Úfloat)rD   rR   rS   r5   r8   ÚseqÚwidthÚheightrÜ   rÝ   Úim_wÚim_hÚ	delay_numÚ	delay_denr*   r*   r+   Ú
chunk_fcTLƒ  s4   
zPngStream.chunk_fcTLc                 C  sv   |dk rt jrt  | j|¡}|S d}t|ƒ‚t  | jd¡}t|ƒ}| j|d kr.d}t|ƒ‚|| _|  |d |d ¡S )Nr   z"APNG contains truncated fDAT chunkr   rö   )	r   rN   rn   rA   r4   rL   r    rP   rÂ   )rD   rR   rS   r5   r8   r  r*   r*   r+   Ú
chunk_fdAT   s   zPngStream.chunk_fdAT)r$   r%   r&   rE   r§   r¬   r­   r³   r½   rÂ   rÃ   rÅ   rÊ   rÍ   rÖ   rØ   rß   rç   rè   rí   rï   rô   r  r	  Ú__classcell__r*   r*   r£   r+   r•   Z  s,    		"(r•   c                 C  s   | d d… t kS )Nr   )Ú_MAGIC)Úprefixr*   r*   r+   Ú_accept´  r>   r  c                      s‚   e Zd ZdZdZdd„ Zedd„ ƒZdd„ Zd	d
„ Z	d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‡  ZS )ÚPngImageFileÚPNGzPortable network graphicsc              	   C  sÄ  t | j d¡ƒsd}t|ƒ‚| j| _d| _g | _t| jƒ| _	 | j ¡ \}}}z
| j 	|||¡}W n0 t
y:   Y n0 tya   t d|||¡ t | j|¡}|dd…  ¡ r_| j ||f¡ Y nw | j ||¡ q| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjp‹d| _| j  dd	¡| _!| jj"r¦| jj"\}}t# $||¡| _%|d
kr°|d | _&n|| _&| jjd urÚd	| _'| j (¡  | j&| _)| j *¡ | _+| j!rÕ|  jd7  _|  ,d¡ | jdk| _-d S )Nr   znot a PNG filer   Tú%r %s %s (unknown)r   r   r¿   Fó   fdATr   ).r  rA   rJ   rP   Ú_fpÚ_PngImageFile__frameÚprivate_chunksr•   Úpngrc   rÁ   ÚAttributeErrorr_   r`   r   rn   ÚislowerrZ   rk   r›   Ú_moderš   Ú_sizer˜   r¨   Ú_textrœ   r©   rž   Úcustom_mimetyperŸ   ró   Úgetr¿   r�   r   ÚrawÚpaletteÚ_PngImageFile__prepare_idatÚ!_close_exclusive_fp_after_loadingr¬   Ú_PngImageFile__rewind_idatrK   Ú_PngImageFile__rewindÚ_seekÚis_animated)rD   r8   rQ   rR   rS   r5   Úrawmoder;   r*   r*   r+   Ú_openÀ  sZ   €üð






zPngImageFile._openc                 C  sD   | j d u r| jr| j}|  | jd ¡ |  ¡  | jr|  |¡ | j S )Nr   )r  r$  r  rI   ró   Úload)rD   Úframer*   r*   r+   rx     s   

zPngImageFile.textc                 C  s^   | j du rd}t|ƒ‚| j  | jd d d ¡ | j ¡  | j ¡  | jr*| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )rA   ÚRuntimeErrorrI   r©   r  rq   rW   Ú_exclusive_fp)rD   r8   r*   r*   r+   rq     s   




zPngImageFile.verifyc                 C  s†   |   |¡sd S || jk r|  dd¡ | j}t| jd |d ƒD ]!}z|  |¡ W q ty@ } z|  |¡ d}t|ƒ|‚d }~ww d S )Nr   Tr   zno more images in APNG file)Ú_seek_checkr  r#  ÚrangerÁ   rI   )rD   r(  Ú
last_frameÚfrj   r8   r*   r*   r+   rI   #  s   



€ýýzPngImageFile.seekFc              	   C  s   |dkrT|r-| j  | j¡ | j ¡  | j| _d | _| jrd | _| jj	| _
| jj| _| j | _d | _d | _| j
 dd¡| _| j
 d¡| _| j
 d¡| _| j
 d¡| _d| _nâ|| jd krdd|› �}t|ƒ‚|  ¡  | jrt| j | j| j¡ | j ¡ | _| j | _| jrŒt | j| j¡ d| _d}	 | j d
¡ z
| j ¡ \}}}W n tjtfy«   Y ndw |dkr¶d}t |ƒ‚|dkrÄ|rÂd}t|ƒ‚d	}z
| j !|||¡ W n? t"y×   Y n8 t yõ   |dkrì|d
8 }|rì|| _Y n#t | j|¡ Y n t#�y   t$ %d|||¡ t | j|¡ Y nw q�|| _| jj| _| j
 d¡| _| j
 d¡| _| j
 d¡| _| j�s6d}t |ƒ‚| jd u �rG| jt&j'k�rGt&j(| _| jt&j'k�r_| j ¡ | _|  )| j| j¡| _d S | jt&j(k�r{t*j+ ,| j-| j.¡| _|  )| j| j¡| _d S d | _d S )Nr   r¿   Frý   rÿ   r¾   r   zcannot seek to frame Tr   rl   zNo more images in APNG fileó   fcTLzAPNG missing frame datar  r  zimage not found in APNG frame)/r  rI   r"  r  r­   r!  r  ÚimÚpyaccessr˜   r¨   rœ   r©   rA   Ú_prev_imÚdisposer  r¿   Ú
dispose_opÚblend_opÚdispose_extentr  r4   r'  Úpaster«   r   rn   rJ   rf   rg   rP   rÁ   rc   ÚUnicodeDecodeErrorr  r_   r`   r#   r)   r(   Ú_cropr   ÚcoreÚfillÚmodeÚsize)rD   r(  r­   r8   Úframe_startrQ   rR   rS   r*   r*   r+   r#  2  sœ   



ÿþã!

zPngImageFile._seekc                 C  s   | j S r@   )r  rT   r*   r*   r+   rK   �  s   zPngImageFile.tellc                 C  s0   | j  d¡r| jd | _| j| _tj | ¡ dS )z"internal: prepare to read PNG filer·   )r   N)r¨   r  Údecoderconfigr  Ú_PngImageFile__idatr   Úload_preparerT   r*   r*   r+   rA  “  s   zPngImageFile.load_preparec                 C  sÂ   | j dkrG| j d¡ | j ¡ \}}}|dvr!| j |||¡ dS |dkr?z
| j |||¡ W n	 ty8   Y nw |d | _ n|| _ | j dks|dkrO| j }nt|| j ƒ}| j | | _ | j |¡S )zinternal: read more image datar   r   )ó   IDATs   DDATr  rà   r  )r@  rA   rJ   r  r\   rc   rÁ   Úmin)rD   Ú
read_bytesrQ   rR   rS   r*   r*   r+   Ú	load_readœ  s(   
ÿ
îzPngImageFile.load_readc                 C  s  | j dkr| j | j ¡ 	 | j d¡ z
| j ¡ \}}}W n tjtfy)   Y nˆw |dkr/n‚|dkrB| jrBd| _| j 	|||¡ noz
| j 
|||¡ W nc tyU   Y n\ ty‡   |dkrc|d8 }z	t | j|¡ W n ty„ } ztjr~W Y d}~Y n3|‚d}~ww Y n) ty¯   t d|||¡ t | j|¡}|d	d
…  ¡ r­| j ||df¡ Y nw q| jj| _| jsÃ| j ¡  d| _dS | j�r| jtjk�r|  | j| j ¡}| jj!dkrëd| j"v rë| #d| j"d ¡}n| $d¡}| j %|| j |¡ | j| _| j&�r
d| _&dS dS dS dS )z%internal: finished reading image datar   Tr   rl   r/  r  Nr  r   r   r   rÆ   r   )'r@  rA   rJ   r  rf   rg   rP   r$  r  r\   rc   r8  rÁ   r   rn   rm   rN   r  r_   r`   r  r  rZ   r™   r  rW   r2  r5  r,   r.   r9  r0  r6  r<  r¨   Úconvert_transparentÚconvertr7  r1  )rD   rQ   rR   rS   rj   r5   ÚupdatedÚmaskr*   r*   r+   Úload_end½  sp   
ÿ€üÿ€üâ
#


ÿ

õ
zPngImageFile.load_endc                 C  s6   d| j vr	|  ¡  d| j vrd| j vrd S |  ¡  ¡ S )Nrâ   zRaw profile type exif)r¨   r'  ÚgetexifÚ_get_merged_dictrT   r*   r*   r+   Ú_getexifö  s
   
zPngImageFile._getexifc                   s   d| j vr	|  ¡  tƒ  ¡ S )Nrâ   )r¨   r'  r—   rK  rT   r£   r*   r+   rK  ý  s   

zPngImageFile.getexifc                 C  s   d| j v r|  | j d ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        zXML:com.adobe.xmp)r¨   Ú_getxmprT   r*   r*   r+   Úgetxmp  s
   
	ÿÿýzPngImageFile.getxmpr”   )r$   r%   r&   ÚformatÚformat_descriptionr&  Úpropertyrx   rq   rI   r#  rK   rA  rE  rJ  rM  rK  rO  r
  r*   r*   r£   r+   r  ¼  s     C

^	!9r  )r   ó    )úL;1rS  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   rT  r   r   r   r   ÚIr   r   r   r   r   r   r   r   c                 G  sJ   d  |¡}|  tt|ƒƒ| ¡ |  |¡ t|t|ƒƒ}|  t|ƒ¡ dS )z'Write a PNG chunk (including CRC field)rà   N)ÚjoinÚwriteÚo32rÔ   r=   ©rA   rQ   r;   rk   r*   r*   r+   Úputchunk(  s
   

rZ  c                   @  ó   e Zd Zdd„ Zdd„ ZdS )Ú_idatc                 C  s   || _ || _d S r@   )rA   r   )rD   rA   r   r*   r*   r+   rE   6  rF   z_idat.__init__c                 C  s   |   | jd|¡ d S )NrB  )r   rA   ©rD   r;   r*   r*   r+   rW  :  ó   z_idat.writeN©r$   r%   r&   rE   rW  r*   r*   r*   r+   r\  3  s    r\  c                   @  r[  )Ú_fdatc                 C  s   || _ || _|| _d S r@   )rA   r   rª   )rD   rA   r   rª   r*   r*   r+   rE   A  s   
z_fdat.__init__c                 C  s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr  r   )r   rA   rX  rª   r]  r*   r*   r+   rW  F  s   z_fdat.writeNr_  r*   r*   r*   r+   r`  >  s    r`  c                 C  s.  | j  d| j dd¡¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}| j  d| j dtj¡¡}	|r:t |¡}
nt | g|¡}
g }d}|
D ]ñ}t	 
|¡D ]é}|j|krZ| ¡ }n| |¡}| j  ¡ }t|ttfƒrq|| |d< t|ttfƒr~|| |d< t|	ttfƒr‹|	| |d< |d7 }|�r#|d }|d  d¡}|d  d¡}|tjkr²t|ƒd	k r²tj}|tjkrÞ|d
  ¡ }tj d| jd¡}|d }|rÒ| |¡}nd| j }| ||¡ n|tjkrê|d d
 }n|d
 }t | d¡| d¡¡}|jdd�}|�s"|| d¡k�r"|| d¡k�r"|d d  | d|¡7  < qNnd }d|v�r.||d< | |||dœ¡ qNqGt|ƒdk�rI|�sI|d d
 S ||dtt|ƒƒt|ƒƒ |�rv| j|k�rd|  |¡} t  | t!||ƒdd| j d|fg¡ d}t"|ƒD ]˜\}}|d
 }|d �s�d|j }n	|d }| |¡}|j}|d }t#t$|d ƒƒ}| d|¡}| d|	¡}||dt|ƒt|d ƒt|d ƒt|d ƒt|d ƒt%|ƒt%dƒt&|ƒt&|ƒƒ |d7 }|dk�rû|�sût  |t!||ƒdd|j d|fg¡ �q|t'|||ƒ}t  ||dd|j d|fg¡ |j(}�q|d S )Nrû   r   rð   rý   rÿ   r   éÿÿÿÿÚencoderinfor   r0  r   )r   r   r   r   r¾   r–   éþÿÿÿF)Ú
alpha_only)r0  r¾   rb  s   acTLr�   r/  rú   ))rb  r  r¨   r#   r'   r,   r-   Ú	itertoolsÚchainr	   ÚIteratorr<  r«   rG  r‡   Úlistr}   r)   rÔ   r(   r   r:  r;  r=  Úcropr7  r   Úsubtract_moduloÚgetbboxrZ   rX  r   Ú_saver\  Ú	enumerateÚintÚroundÚo16r   r`  rª   )r0  rA   r   r%  r¿   Úappend_imagesrû   rð   rý   rÿ   rf  Ú	im_framesÚframe_countÚim_seqÚim_framerb  ÚpreviousÚprev_disposalÚ
prev_blendÚbase_imr3  r¾   Údeltarª   r(  Ú
frame_datar=  Úframe_durationÚframe_disposalÚframe_blendÚfdat_chunksr*   r*   r+   Ú_write_multiple_framesK  sÚ   






ÿÿÿ€
Í5
ü
$





õýý
Ör€  c                 C  s   t | ||dd� d S )NT)Úsave_all)rl  )r0  rA   Úfilenamer*   r*   r+   Ú	_save_allÍ  r^  rƒ  Fc           $   
     s&  |rU| j  d| j d¡¡}tƒ }tƒ ‰ | j  dg ¡}t | g|¡D ]}t |¡D ]}	| |	j	¡ ˆ  |	j
¡ q(q!dD ]}
|
|v rB nq:| ¡ }
t‡ fdd„tdƒD ƒƒ}n| j
}| j	}
|
dkr¡d| j v rotd	| j d > d
ƒ}n| jr„ttt| j ¡ d	 ƒd d
ƒd	ƒ}nd
}|dkr¡|dkr‘d	}n	|dkr˜d}nd}|
› d|› �}
| j  dd¡| j  dd¡| j  dd¡| j  dd¡f| _zt|
 \}}
W n tyÛ } zd|
› d�}t|ƒ|‚d }~ww | t¡ ||dt|d ƒt|d	 ƒ|
dddƒ g d¢}| j  d| j d¡¡}|�rd}|d t |¡ }||d|ƒ | d ¡ | j  d!¡}|�rog d"¢}|jD ]B}|d d… \}}||v �rH| |¡ ||||ƒ �q,||v �rU||||ƒ �q,|d	d…  ¡ �rm|dd… }|�sm||||ƒ �q,| j	dk�r›|d }| j  d#¡d |… }t|ƒ|k �r•|d7 }t|ƒ|k �sŠ||d$|ƒ | j  d%| j d%d ¡¡}|�s¯|dk�r!| j	dk�rá|}t!|t"ƒ�rÈ||d&|d |… ƒ nztdtd'|ƒƒ}d(| d }||d&|d |… ƒ na| j	d)v �røtdtd*|ƒƒ}||d&t#|ƒƒ nJ| j	d#k�r|\}} }!||d&t#|ƒt#| ƒ t#|!ƒ ƒ n.d%| j v �r d+}t|ƒ‚n!| j	dk�rB| j $¡ d,k�rB| j  d,d-¡}|}||d&|d |… ƒ | j  d.¡}"|"�rg||d/tt%|"d d0 d1 ƒƒtt%|"d	 d0 d1 ƒƒd2ƒ |�r�d3d4g}|jD ]}|d d… \}}||v �r‹| |¡ ||||ƒ �qq| j  d5¡}#|#�r´t!|#t&j'ƒ�r¢|# (d6¡}#|# )d7¡�r®|#d8d … }#||d9|#ƒ |�rÀt*| |||||ƒ} | �rÕt+ ,| t-||ƒd:d;| j
 d|fg¡ |�rÿ|jD ]#}|d d… \}}|d	d…  ¡ �rý|dd… }|�rý||||ƒ �qÛ||d<dƒ t.|d=ƒ�r| /¡  d S d S )>Nr¿   rq  )r   r   r   c                 3  s&   � | ]‰ t ‡ fd d„ˆD ƒƒV  qdS )c                 3  s   � | ]}|ˆ  V  qd S r@   r*   )rÎ   Ú
frame_size©r±   r*   r+   rÐ   ä  rÑ   z"_save.<locals>.<genexpr>.<genexpr>N)Úmax)rÎ   ©Úsizesr…  r+   rÐ   ä  s   €$ z_save.<locals>.<genexpr>r   r   Úbitsr   é   r    r   r   ú;ÚoptimizeFÚcompress_levelra  Úcompress_typeÚ
dictionaryrà   zcannot write mode z as PNGs   IHDRr   r†   )s   cHRMs   gAMAs   sBITó   sRGBs   tIMEr¯   s   ICC Profiler�   s   iCCPr�  Úpnginfo)s   sPLTr…   r‘   r�   r   s   PLTErÆ   s   tRNSéÿ   ó   ÿ)r   r   rU  r   iÿÿ  z%cannot use transparency for this moder   ÚArÚ   s   pHYsrÙ   g      à?ó   s   bKGDs   hISTrâ   r   rî   r!   s   eXIfr�   r–   rl   Úflush)0rb  r  r¨   Úsetre  rf  r	   rg  r€   r<  r=  rH   r}   r,  rC  r  r†  rÔ   ÚgetdataÚencoderconfigÚ	_OUTMODESÚKeyErrorrm   rW  r  rX  r/   rŠ   Úremover|   r  r0  Ú
getpaletter‡   rˆ   rp  Úgetpalettemodern  r   ÚExifÚtobytesÚ
startswithr€  r   rl  r\  Úhasattrr–  )$r0  rA   r‚  r   r�  r¿   Úmodesrq  rt  ru  r<  r=  Úcolorsr‰  r%  rj   r8   r|   ÚiccÚnamer;   r¨   Úchunks_multiple_allowedÚ
info_chunkrQ   r~   Úpalette_byte_numberÚpalette_bytesrÆ   Úalpha_bytesÚalphaÚredÚgreenÚbluerÚ   râ   r*   r‡  r+   rl  Ñ  s,  ÿþÿ
$ü
€þ


ø




€ÿ
"üû


€
ÿ$
€ÿrl  c                 K  sD   G dd„ dƒ}dd„ }|ƒ }z|| _ t| |d|ƒ W | ` |jS | ` w )z4Return a list of PNG chunks representing this image.c                   @  s    e Zd Zg Zdd„ Zdd„ ZdS )zgetchunks.<locals>.collectorc                 S  s   d S r@   r*   r]  r*   r*   r+   rW  Ÿ  rV   z"getchunks.<locals>.collector.writec                 S  s   | j  |¡ d S r@   )r;   rZ   )rD   r   r*   r*   r+   rZ   ¢  r>   z#getchunks.<locals>.collector.appendN)r$   r%   r&   r;   rW  rZ   r*   r*   r*   r+   Ú	collectorœ  s    r°  c                 W  s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )Nrà   )rV  rX  r=   rZ   rY  r*   r*   r+   rZ   ¥  s   
zgetchunks.<locals>.appendN)rb  rl  r;   )r0  Úparamsr°  rZ   rA   r*   r*   r+   Ú	getchunks™  s   	þr²  z.pngz.apngz	image/png)r   )?Ú
__future__r   re  ÚloggingÚrerf   rñ   r/   Úenumr   r�   r   r   r   r   r	   Ú_binaryr
   rÉ   r   rL   r   r   rp  r   rX  Ú	getLoggerr$   r_   ÚcompilerÈ   rM   r  r¹   rÇ   Ú	SAFEBLOCKr2   r¥   r#   r,   r9   r=   r?   rs   rr   r{   r•   r  r  rš  rZ  r\  r`  r€  rƒ  rl  r²  Úregister_openrP  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer*   r*   r*   r+   Ú<module>   s¤    
ë

	YT  \  \ð  I