
    h1                       S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
Jr  S SKJrJrJrJrJr  SSKJrJrJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJ r!  SSK"J#r#  Sr$\$(       a  SSKJ%r%  \RL                  " \'5      r(\RR                  " S5      RT                  r+Sr,SSSSSSSSSSSSSSS S!.r-\RR                  " S"5      r.\R^                  r0 S#\0-  r1  " S$ S%\5      r2 " S& S'\5      r3SSS( jr4STSUS) jjr5 " S* S+5      r6 " S, S-\75      r8 " S. S/5      r9 " S0 S1\5      r: " S2 S3\65      r;SVS4 jr< " S5 S6\R*                  5      r=S7S8S9S:S;S<S=S=S=S>S?S@SASBSCSD.r>SWSE jr? " SF SG5      r@ " SH SI5      rA " SJ SK\5      rB                SXSL jrCSYSM jrD\?S4           SZSN jjrES[SO jrF\R                  " \=R                  \=\<5        \R                  " \=R                  \E5        \R                  " \=R                  \D5        \R                  " \=R                  SPSQ/5        \R                  " \=R                  SR5        g)\    )annotationsN)Callable)IntEnum)IOAny
NamedTupleNoReturncast   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)DeferredErrorF)_imagings   \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                  $    \ rS rSrSr Sr SrSrg)Disposalj   r   r   r%    N)__name__
__module____qualname____firstlineno__OP_NONEOP_BACKGROUNDOP_PREVIOUS__static_attributes__r/       D/var/www/html/env/lib/python3.13/site-packages/PIL/PngImagePlugin.pyr-   r-   j   s$    G M
 Kr8   r-   c                      \ rS rSrSr SrSrg)Blend   r   r   r/   N)r0   r1   r2   r3   	OP_SOURCEOP_OVERr7   r/   r8   r9   r;   r;      s    I
 Gr8   r;   c                    [         R                  " 5       nUR                  U [        5      nUR                  (       a  Sn[        U5      eU$ )Nz=Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)sdobj	plaintextmsgs       r9   _safe_zlib_decompressrJ      s>    D>2IMor8   c                4    [         R                  " X5      S-  $ )Nl    )r@   crc32)dataseeds     r9   _crc32rO      s    ::d!J..r8   c                  |    \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSSS jjrSrg)ChunkStream   c                    Xl         / U l        g Nfpqueue)selfrV   s     r9   __init__ChunkStream.__init__   s    $&:<
r8   c                   SnU R                   c   eU R                  (       a9  U R                  R                  5       u  pnU R                   R                  U5        OEU R                   R	                  S5      nUSS nU R                   R                  5       n[        U5      n[        U5      (       d/  [        R                  (       d  S[        U5       S3n[        U5      eXU4$ )z.Fetch a new chunk. Returns header information.Nr'   r&   zbroken PNG file (chunk ))rV   rW   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rX   cidposlengthrF   rI   s         r9   r_   ChunkStream.read   s    ww"""::#zz~~/CfGGLLQAAB%C'',,.CVFc{{22/S	{!<!#&&r8   c                    U $ rT   r/   rX   s    r9   	__enter__ChunkStream.__enter__   s    r8   c                $    U R                  5         g rT   )close)rX   argss     r9   __exit__ChunkStream.__exit__   s    

r8   c                     S =U l         U l        g rT   )rW   rV   rk   s    r9   ro   ChunkStream.close   s    ##
TWr8   c                \    U R                   c   eU R                   R                  XU45        g rT   )rW   appendrX   rf   rg   rh   s       r9   pushChunkStream.push   s)    zz%%%

3V,-r8   c                x    [         R                  SXU5        [        U SUR                  S5       35      " X#5      $ )z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecoderw   s       r9   callChunkStream.call   s8     	&&9tvcjj&9%:;<SIIr8   c                   [         R                  (       a"  US   S-	  S-  (       a  U R                  X5        gU R                  c   e [	        U[	        U5      5      n[        U R                  R                  S5      5      nX4:w  a  S[        U5       S3n[        U5      eg! [        R                   a   nS[        U5       S3n[        U5      UeSnAff = f)	zRead and verify checksumr      r   Nr&   z(broken PNG file (bad header checksum in r\   z(broken PNG file (incomplete checksum in )r   rc   crc_skiprV   rO   ra   r_   rd   re   structerror)rX   rf   rM   crc1crc2rI   es          r9   crcChunkStream.crc   s     **A!aMM#$ww"""	*$s,Dtww||A'D|@c1M!#&&  || 	*<T#YKqICc")	*s   AB! !C5CCc                X    U R                   c   eU R                   R                  S5        g)zRead checksumNr&   )rV   r_   )rX   rf   rM   s      r9   r   ChunkStream.crc_skip   s#     ww"""Qr8   c                :   / nU R                   c   e  U R                  5       u  p4nX1:X  a   U$ U R                  U[        R                  " U R                   U5      5        UR                  U5        M`  ! [        R                   a  nSn[	        U5      UeS nAff = f)Nztruncated PNG file)	rV   r_   r   r   OSErrorr   r   
_safe_readrv   )rX   endchunkcidsrf   rg   rh   r   rI   s           r9   verifyChunkStream.verify   s     ww"""*#'99; &
   HHS)..tww?@KK  << **cl)*s   A3 3BBBrU   NrV   	IO[bytes]returnNone)r   ztuple[bytes, int, int])r   rQ   )rp   objectr   r   r   r   )rf   bytesrg   intrh   r   r   r   )rf   r   rg   r   rh   r   r   r   )rf   r   rM   r   r   r   )   IEND)r   r   r   zlist[bytes])r0   r1   r2   r3   rY   r_   rl   rq   ro   rx   r   r   r   r   r7   r/   r8   r9   rQ   rQ      s:    = *$.J** r8   rQ   c                  V    \ rS rSr% SrS\S'   S\S'   \ S	       S
S jj5       rSrg)iTXt   ze
Subclass of string to allow iTXt chunks to look like strings while
keeping their extra information

zstr | bytes | NonelangtkeyNc                H    [         R                  X5      nX$l        X4l        U$ )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__r   r   )clstextr   r   rX   s        r9   r   iTXt.__new__  s!     {{3%		r8   )r   r   )NN)r   r   r   
str | Noner   r   r   r   )	r0   r1   r2   r3   __doc____annotations__staticmethodr   r7   r/   r8   r9   r   r      sJ     
DH(7A	 r8   r   c                  x    \ rS rSrSrS	S jrS
SS jjr   S           SS jjr S
       SS jjrSr	g)PngInfoi  z4
PNG chunk container (for use with save(pnginfo=))

c                    / U l         g rT   chunksrk   s    r9   rY   PngInfo.__init__  s	    79r8   c                >    U R                   R                  XU45        g)zAppends 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

N)r   rv   )rX   rf   rM   
after_idats       r9   addPngInfo.add   s     	Cz23r8   c                   [        U[        5      (       d  UR                  SS5      n[        U[        5      (       d  UR                  SS5      n[        U[        5      (       d  UR                  SS5      n[        U[        5      (       d  UR                  SS5      nU(       a9  U R                  SUS-   U-   S-   U-   S-   [        R
                  " U5      -   5        gU R                  SUS-   U-   S-   U-   S-   U-   5        g)	zAppends 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)
isinstancer   encoder   r@   compress)rX   keyvaluer   r   zips         r9   add_itxtPngInfo.add_itxt,  s    $ #u%%**Y1C%''LL(3E$&&;;w1D$&&;;w1DHHk!D(5047%?$--PUBVV
 HHWcIo4u<tCeKeSTr8   c                4   [        U[        5      (       aH  U R                  UUUR                  b  UR                  OSUR                  b  UR                  US9$ SUS9$ [        U[
        5      (       d   UR                  SS5      n[        U[
        5      (       d  UR                  SS5      nU(       a-  U R                  SUS-   [        R                  " U5      -   5        gU R                  SUS	-   U-   5        g! [         a    U R                  XUS9s $ f = f)
zAppends 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

Nr8   )r   r   r      zTXt        tEXtr   )r   r   r   r   r   r   r   UnicodeErrorr   r@   r   )rX   r   r   r   s       r9   add_textPngInfo.add_textO  s
    eT""==#jj4

##jj4

 !   ;> !   %'':Y9 #u%%**Y1CHHWcGmdmmE.BBCHHWcEkE12   :}}SS}99:s   4C: :DDr   Nr   F)rf   r   rM   r   r   boolr   r   ) r   F)r   str | bytesr   r   r   r   r   r   r   r   r   r   )r   r   r   zstr | bytes | iTXtr   r   r   r   )
r0   r1   r2   r3   r   rY   r   r   r   r7   r/   r8   r9   r   r     s    
:
4  !U!U !U 	!U
 !U !U 
!UH HM!3!3'9!3@D!3	!3 !3r8   r   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
_RewindStateiw  z dict[str | tuple[int, int], Any]infozlist[ImageFile._Tile]tilez
int | Noneseq_numr/   Nr0   r1   r2   r3   r   r7   r/   r8   r9   r   r   w  s    
**
r8   r   c                     ^  \ rS rSrSU 4S jjrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSS jrSrU =r$ )	PngStreami}  c                   > [         TU ]  U5        0 U l        0 U l        SU l        SU l        / U l        S U l        S U l        S U l	        S U l
        [        0 / S 5      U l        SU l        g )Nr   r   r   r   )superrY   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memory)rX   rV   	__class__s     r9   rY   PngStream.__init__~  sl     :<.0.048.2'+$((R6r8   c                    U =R                   U-  sl         U R                   [        :  a  SU R                    S3n[        U5      eg )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r   MAX_TEXT_MEMORYrE   )rX   chunklenrI   s      r9   check_text_memoryPngStream.check_text_memory  sN    H$o-7##$$46  S/! .r8   c                    [        U R                  R                  5       U R                  U R                  5      U l        g rT   )r   r   copyr   r   r   rk   s    r9   save_rewindPngStream.save_rewind  s-    (LLLLMM
r8   c                    U R                   R                  R                  5       U l        U R                   R                  U l        U R                   R                  U l        g rT   )r   r   r   r   r   r   r   r   rk   s    r9   rewindPngStream.rewind  sD    ((--224((--))11r8   c                   U R                   c   e[        R                  " U R                   U5      nUR                  S5      n[        R                  SUS U 5        X4S-      n[        R                  SU5        US:w  a  SU S3n[        U5      e [        X4S-   S  5      nXpR                  S	'   U$ ! [         a    [        R                  (       a  S n N3e [        R                   a    S n NKf = f)
Nr   ziCCP profile name %rr   zCompression method %sr   Unknown compression method z in iCCP chunkr%   icc_profile)rV   r   r   findr}   r~   re   rJ   rE   rc   r@   r   r   )rX   rg   rh   rF   icomp_methodrI   r   s           r9   
chunk_iCCPPngStream.chunk_iCCP  s    ww"""  &1 FF5M+QrU3Ah,k:!/}NKCc""	/a%'
;K '2]#  	.."zz 	K	s   B0 0!C,C,+C,c                   U R                   c   e[        R                  " U R                   U5      nUS:  a$  [        R                  (       a  U$ Sn[	        U5      e[        US5      [        US5      4U l         [        US   US   4   u  U l        U l	        US   (       a  SU R                  S	'   US
   (       a  Sn[        U5      eU$ ! [         a     N>f = f)N   zTruncated IHDR chunkr   r&   r'   	      r   	interlace   zunknown filter category)rV   r   r   rc   rE   ra   r   _MODESr   
im_rawmode	Exceptionr   re   rX   rg   rh   rF   rI   s        r9   
chunk_IHDRPngStream.chunk_IHDR  s    ww"""  &1B;..(CS/!1ay#a)+	,2AaD!A$<,@)DL$/ R5()DLL%R5+Cc""  		s   9C	 	
CCc                N   SU R                   ;   a1  [        R                  " SU R                   S   XR                  5      /nOLU R                  b  SU R                   S'   [        R                  " SSU R
                  -   XR                  5      /nX0l        X l        Sn[        U5      e)Nbboxr   Tdefault_imager   zimage data found)	r   r   _Tiler  r   r   r   im_idatEOFError)rX   rg   rh   r   rI   s        r9   
chunk_IDATPngStream.chunk_IDAT  s    T\\!OOE4<<+?ooVWD+04_-OOE6DLL+@#WXD smr8   c                    Sn[        U5      e)Nzend of PNG image)r  )rX   rg   rh   rI   s       r9   
chunk_IENDPngStream.chunk_IEND  s     smr8   c                    U R                   c   e[        R                  " U R                   U5      nU R                  S:X  a	  SU4U l        U$ )Nr   r   )rV   r   r   r   r   rX   rg   rh   rF   s       r9   
chunk_PLTEPngStream.chunk_PLTE  sD    ww"""  &1<<3#QhDOr8   c                   U R                   c   e[        R                  " U R                   U5      nU R                  S:X  aR  [        R                  U5      (       a'  UR                  S5      nUS:  a  X@R                  S'   U$ X0R                  S'    U$ U R                  S;   a  [        U5      U R                  S'   U$ U R                  S:X  a/  [        U5      [        US5      [        US5      4U R                  S'   U$ )	Nr   r   r   transparency)r   r   r   r   r%   r&   )	rV   r   r   r   _simple_palettematchr   r   i16)rX   rg   rh   rF   r   s        r9   
chunk_tRNSPngStream.chunk_tRNS  s    ww"""  &1<<3$$Q'' FF5M634LL0  01^,
 	 \\//+.q6DLL(  \\U"+.q63q!9c!Qi+GDLL(r8   c                    U R                   c   e[        R                  " U R                   U5      n[        U5      S-  U R                  S'   U$ )N     j@gamma)rV   r   r   ra   r   r  s       r9   
chunk_gAMAPngStream.chunk_gAMA  sD    ww"""  &1 #A 1Wr8   c                    U R                   c   e[        R                  " U R                   U5      n[        R                  " S[        U5      S-   S3U5      n[        S U 5       5      U R                  S'   U$ )N>r&   Ic              3  *   #    U  H	  oS -  v   M     g7f)r   Nr/   ).0elts     r9   	<genexpr>'PngStream.chunk_cHRM.<locals>.<genexpr>  s     ,Px8^xs   chromaticity)rV   r   r   r   unpacklentupler   )rX   rg   rh   rF   raw_valss        r9   
chunk_cHRMPngStream.chunk_cHRM
  si     ww"""  &1==1SVq[M!3Q7',,Px,P'P^$r8   c                    U R                   c   e[        R                  " U R                   U5      nUS:  a$  [        R                  (       a  U$ Sn[	        U5      eUS   U R
                  S'   U$ )Nr   zTruncated sRGB chunkr   srgb)rV   r   r   rc   rE   r   r  s        r9   
chunk_sRGBPngStream.chunk_sRGB  se     ww"""  &1A:..(CS/! tVr8   c                ^   U R                   c   e[        R                  " U R                   U5      nUS:  a$  [        R                  (       a  U$ Sn[	        U5      e[        US5      [        US5      peUS   nUS:X  a  US-  US-  4nXR                  S'   U$ US:X  a  XV4U R                  S	'   U$ )
Nr   zTruncated pHYs chunkr   r&   r'   r   
F%u?dpiaspect)rV   r   r   rc   rE   ra   r   )	rX   rg   rh   rF   rI   pxpyunitr9  s	            r9   
chunk_pHYsPngStream.chunk_pHYs%  s    ww"""  &1A:..(CS/!QC1IBt19v+rF{*C"%LL  QY%'VDLL"r8   c                   U R                   c   e[        R                  " U R                   U5      n UR                  SS5      u  pEU(       ac  UR                  SS5      nUR                  SS5      nUS:X  a  UOUU R                  U'   XpR                  U'   U R                  [        U5      5        U$ ! [         a    UnSn N|f = f)Nr   r   r8   r   r   replaces   exif)
rV   r   r   splitrE   r   r   r   r   r.  )rX   rg   rh   rF   kvk_strv_strs           r9   
chunk_tEXtPngStream.chunk_tEXt7  s    ww"""  &1	775!$DA
 HHY1EHHY	2E'(G|!DLL"'LL""3u:.  	AA	s   B2 2CCc                f   U R                   c   e[        R                  " U R                   U5      n UR                  SS5      u  pEU(       a  US   nOSnUS:w  a  SU S3n[        U5      e [        USS  5      nU(       a\  UR                  SS5      nUR                  SS	5      n	U	=U R                  U'   U R                  U'   U R                  [        U	5      5        U$ ! [         a    UnSn Nf = f! [         a    [        R                  (       a  Sn Ne [        R                   a    Sn Nf = f)
Nr   r   r8   r   r   z in zTXt chunkr   r   rA  )rV   r   r   rB  rE   re   rJ   rc   r@   r   r   r   r   r   r.  )
rX   rg   rh   rF   rC  rD  r   rI   rE  rF  s
             r9   
chunk_zTXtPngStream.chunk_zTXtK  s-   ww"""  &1	775!$DA A$KK!/}NKCc""	%ae,A HHY1EHHY	2E8==DLL$,,u"5""3u:.7  	AA	  	..zz 	A	s)   C  -C4  C10C14!D0D0/D0c                Z   U R                   c   e[        R                  " U R                   U5      =p4 UR                  SS5      u  pS[        U5      S:  a  U$ US   US   USS  p7n UR                  SS5      u  pn
US:w  a  US:X  a   [        U
5      n
OU$ US:X  a  XR                  S'    UR                  SS5      nUR                  S	S5      nU	R                  S	S5      nU
R                  S	S5      n[        XU5      =U R                  U'   U R                  U'   U R                  [        U5      5        U$ ! [         a    Us $ f = f! [         a    Us $ f = f! [         a    [        R                  (       a  Us $ e [        R                   a    Us $ f = f! [         a    Us $ f = f)
Nr   r   r%   r   s   XML:com.adobe.xmpxmpr   r   r   )rV   r   r   rB  rE   r.  rJ   rc   r@   r   r   r   r   r   r   r   )rX   rg   rh   rrF   rC  cfcmr   tkrD  rE  lang_strtk_strrF  s                  r9   
chunk_iTXtPngStream.chunk_iTXtn  s   ww"""$$TWWf55	775!$DA q6A:HaD!A$!"	''%+KDa 7Qw-a0A $$"#LL	HHY1E{{7H5HYYw1FHHWh/E 59&4QQUdll51s5z*G  	H	  	H	 "  66 zz H  	H	sN   D8 'E
 	E ,AF 8EE
EE!F?FFF*)F*c                    U R                   c   e[        R                  " U R                   U5      nSU-   U R                  S'   U$ )N   Exif  exif)rV   r   r   r   r  s       r9   
chunk_eXIfPngStream.chunk_eXIf  s@    ww"""  &1.2Vr8   c                   U R                   c   e[        R                  " U R                   U5      nUS:  a$  [        R                  (       a  U$ Sn[	        U5      eU R
                  b  S U l        [        R                  " S5        U$ [        U5      nUS:X  d  US:  a  [        R                  " S5        U$ XPl        [        US5      U R                  S'   SU l
        U$ )	Nr'   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r&   loopz
image/apng)rV   r   r   rc   rE   r   warningswarnra   r   r   )rX   rg   rh   rF   rI   n_framess         r9   
chunk_acTLPngStream.chunk_acTL  s    ww"""  &1A:..6CS/!'#DMMPQHq6q=Hz1MMPQH#"1ayV".r8   c                   U R                   c   e[        R                  " U R                   U5      nUS:  a$  [        R                  (       a  U$ Sn[	        U5      e[        U5      nU R                  c  US:w  d   U R                  b   U R                  US-
  :w  a  Sn[        U5      eXPl        [        US5      [        US5      pv[        US5      [        US	5      pU R                  u  pX-   U
:  d  X-   U:  a  S
n[        U5      eXX-   X-   4U R                  S'   [        US5      [        US5      pUS:X  a  Sn[        U5      [        U5      -  S-  U R                  S'   US   U R                  S'   US   U R                  S'   U$ )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)rV   r   r   rc   rE   ra   r   re   r   r   r  float)rX   rg   rh   rF   rI   seqwidthheightr;  r<  im_wim_h	delay_num	delay_dens                 r9   
chunk_fcTLPngStream.chunk_fcTL  sj   ww"""  &1B;..6CS/!!fMM!cQhMM%$--37*B7Cc""Aq	3q!9vQSBZB\\
:d 20Cc"" "
BK@V"1bz3q":9>I#(#3eI6F#F#MZ #$R5Z  !"Wr8   c                   U R                   c   eUS:  aE  [        R                  (       a#  [        R                  " U R                   U5      nU$ Sn[	        U5      e[        R                  " U R                   S5      n[        U5      nU R                  US-
  :w  a  Sn[        U5      eXPl        U R                  US-   US-
  5      $ )Nr&   z"APNG contains truncated fDAT chunkr   rd  )	rV   r   rc   r   rE   ra   r   re   r  )rX   rg   rh   rF   rI   ro  s         r9   
chunk_fdATPngStream.chunk_fdAT  s    ww"""A:..((&96CS/!  !,!f==C!G#7Cc""sQw
33r8   )r   r   r  r   r   r   r   r  r   r   r   r   r   r   )r   r   r   r   r   )rg   r   rh   r   r   r   )rg   r   rh   r   r   r	   )r0   r1   r2   r3   rY   r   r   r   r   r  r  r  r  r  r"  r1  r5  r>  rG  rJ  rT  rY  r`  rv  ry  r7   __classcell__r   s   @r9   r   r   }  ss    ""
2
8**"$(!F)V*<4 4r8   r   c                ,    U R                  [        5      $ rT   )
startswith_MAGIC)prefixs    r9   _acceptr    s    V$$r8   c                     ^  \ rS rSrSrSrSS jr\SS j5       rSS jr	SS jr
SSS jjrSS	 jrSS
 jrSS jrSS jrSS jrSU 4S jjrSrU =r$ )PngImageFilei  PNGzPortable network graphicsc                v   [        U R                  R                  S5      5      (       d  Sn[        U5      eU R                  U l        SU l        / U l        [        U R                  5      U l         U R                  R                  5       u  p#n U R                  R                  X#U5      nU R                  R%                  X%5        MW  ! [         a     O{[         ao    [        R                  SX#U5        [        R                  " U R                  U5      nUSS R!                  5       (       a  U R                  R#                  X%45         Nf = fU R                  R&                  U l        U R                  R*                  U l        U R                  R.                  U l        S U l        U R                  R4                  U l        U R                  R8                  U l        U R                  R<                  =(       d    SU l        U R0                  RA                  SS5      U l!        U R                  RD                  (       a3  U R                  RD                  u  pg[F        RH                  " Xg5      U l%        US	:X  a  US
-
  U l&        OX@l&        U R                  R<                  b  SU l'        U R                  RQ                  5         U RL                  U l)        U R                  RU                  5       U l+        U RB                  (       a  U =R>                  S-  sl        U RY                  S5        U R>                  S:  U l-        g )Nr'   znot a PNG filer   %r %s %s (unknown)r   r%   r  F   fdATr&   ).r  rV   r_   re   _fp_PngImageFile__frameprivate_chunksr   pngr   r  AttributeErrorr}   r~   r   r   islowerrv   r   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_idatr`   _PngImageFile__rewind_seekis_animated)rX   rI   rf   rg   rh   rF   rawmoderM   s           r9   _openPngImageFile._open  s^   tww||A''"Cc""77
 VX%.tww%7  $xx}}Cf9HHMM#F3 HHLL !   ! 913VD((&9q8##%%''..x8	9 XX%%
XX%%
HH$$	37
HH$$	#xx::,,1!YY]]?EB88 HH//MG'++G:DL'>"(1*D"(88+5:D2HH  "!%!4!4D HHMMODM!!"JJqM==1,s   C 
EA5EEc                ,   U R                   cm  U R                  (       a*  U R                  nU R                  U R                  S-
  5        U R                  5         U R                  (       a  U R                  W5        U R                   c   eU R                   $ )Nr   )r  r  r  r^   r_  load)rX   frames     r9   r   PngImageFile.text7  so     :: 		$--!+,IIK		% zz%%%zzr8   c                ~   U R                   c  Sn[        U5      eU R                   R                  U R                  S   S   S-
  5        U R                  c   eU R                  R                  5         U R                  R                  5         U R                  (       a  U R                   R                  5         SU l         g)zVerify PNG fileNz)verify must be called directly after openr   r%   r'   )rV   RuntimeErrorr^   r   r  r   ro   _exclusive_fp)rX   rI   s     r9   r   PngImageFile.verifyG  s     77?=Cs## 	TYYq\!_q()xx###GGMMOr8   c                X   U R                  U5      (       d  g XR                  :  a  U R                  SS5        U R                  n[        U R                  S-   US-   5       H  n U R                  U5        M     g ! [         a$  nU R                  U5        Sn[	        U5      UeS nAff = f)Nr   Tr   zno more images in APNG file)_seek_checkr  r  ranger  r^   )rX   r  
last_framefr   rI   s         r9   r^   PngImageFile.seekY  s    &&<<JJq$\\
t||a'3A+

1 4  +		*%3sm*+s   %A;;
B)B$$B)c                F   U R                   c   e[        U R                  [        5      (       a  U R                  R                  eU   S nUS:X  Ga8  U(       a  U R                  R                  U R                  5        U R                   R                  5         U R                  U l	        S U l
        U R                   R                  U l        U R                   R                  U l        U R                  U l        S U l        S U l        U R                  R%                  SS5      U l        U R                  R%                  S5      U l        U R                  R%                  S5      U l        U R                  R%                  S5      nSU l        GOpXR,                  S-   :w  a  SU 3n[/        U5      eU R1                  5         U R"                  (       a0  U R2                  R5                  U R"                  U R6                  5        U R2                  R9                  5       U l        U R                  U l        U R                  (       a2  [:        R<                  " U R                  U R                  5        SU l	        Sn U R                  R?                  S
5         U R                   R?                  5       u  pgnUS:X  a  Sn[G        U5      eUS:X  a  U(       a  Sn[E        U5      eS	n U R                   RI                  XgU5        M  U(       a  X0l        U R                   c3  U R(                  [R        RT                  :X  a  [R        RV                  U l        S U l        U R(                  [R        RT                  :X  a]  U R                   (       aK  U R                   R9                  5       U l        U RY                  U R"                  U R6                  5      U l        g g U R(                  [R        RV                  :X  ae  [Z        R\                  R_                  U R`                  U Rb                  5      U l        U RY                  U R"                  U R6                  5      U l        g g ! [@        RB                  [D        4 a     Of = f! [J         a     O[F         a?    US:X  a  US
-  nU(       a  Xl	         Ol[:        R<                  " U R                  U5         GN[L         a<    [N        RQ                  SXgU5        [:        R<                  " U R                  U5         GNf = fXl        U R                   R                  U l        U R                  R%                  S5      U l        U R                  R%                  S5      U l        U R                  R%                  S5      nU R                  (       a  GM  Sn[G        U5      e)Nr   r  Frk  rm  r
  r   zcannot seek to frame Tr&   r   zNo more images in APNG file   fcTLzAPNG missing frame datar  r  zimage not found in APNG frame)2r  r   r  r   exr^   r  r   r  r  _imr   r   r   r   rV   _prev_imdisposer  r  
dispose_opblend_opr  rE   r  impastedispose_extentr   r   r   r_   r   r   re   r  r   UnicodeDecodeErrorr  r}   r~   r-   r6   r5   _cropr   corefillmodesize)	rX   r  r   r  rI   frame_startrf   rg   rh   s	            r9   r  PngImageFile._seekh  s
   xx###dhh..((++A:dmm,!&*&8&8# HH,,	 HH,,	(( DMDL!%!FD"iimmJ7DO IIMM'2DM!YY]]62NDLq((-eW5 o% IIK||dllD,?,?@ GGLLNDMhhDG ""$$TWWd.A.AB&'#KQ'+xx}}$Cf '>7C"3-''>"7)#.."&K:HHMM#F3' T ES == T__8L8L%L&44DO??h222}}#}}113#zz$,,8K8KL  __ 6 66 ::??499dii@DL::dllD4G4GHDL 7c k2  *  :g~!&28/!((&9% :LL!5sH((&9: !L((DI"iimmJ7DO IIMM'2DM!YY]]62N9995sm#s7   Q Q+ Q('Q(+
T7!T!T>ATTc                    U R                   $ rT   )r  rk   s    r9   r`   PngImageFile.tell  s    ||r8   c                    U R                   R                  S5      (       a  U R                  S-   U l        U R                  U l        [
        R
                  R                  U 5        g)z"internal: prepare to read PNG filer  )r   N)r   r  decoderconfigr  _PngImageFile__idatr   load_preparerk   s    r9   r  PngImageFile.load_prepare  sK     99==%%!%!3!3d!:D))((.r8   c                P   U R                   c   eU R                  S:X  a  U R                  R                  S5        U R                   R                  5       u  p#nUS;  a  U R                   R	                  X#U5        gUS:X  a(   U R                   R                  X#U5        US-
  U l        OX@l        U R                  S:X  a  M  US::  a  U R                  nO[        XR                  5      nU R                  U-
  U l        U R                  R                  U5      $ ! [         a     Nf = f)zinternal: read more image datar   r&   )   IDATs   DDATr  r8   r  )r  r  rV   r_   rx   r   r  min)rX   
read_bytesrf   rg   rh   s        r9   	load_readPngImageFile.load_read  s     xx###kkQ GGLLO#xx}}Cf55c/g~HHMM#F3 %qj$% kkQ* ?JZ5JkkJ.ww||J''   s   D 
D%$D%c                n   U R                   c   eU R                  S:w  a%  U R                  R                  U R                  5         U R                  R                  S5         U R                   R                  5       u  pnUS:X  a  OZUS:X  a5  U R                  (       a$  SU l        U R                   R                  XU5        O U R                   R                  XU5        M  U R                   R.                  U l        U R                  (       d"  U R                   R3                  5         SU l         gU R4                  (       Ga_  U R6                  [8        R:                  :X  Ga?  U R=                  U R>                  U R@                  5      nU R>                  RB                  S:X  a0  SU RD                  ;   a   URG                  SU RD                  S   5      nOU R>                  RB                  S:X  al  SU RD                  ;   a\  U RD                  S   n[I        U[J        5      (       a  URM                  U5        O&[I        U[N        5      (       a  URQ                  U5        URS                  S5      nU R4                  RU                  X`R@                  U5        U R4                  U l        ggg! [        R
                  [        4 a     GM  f = f! [         a     GM  [         ab    US:X  a  US-  n [        R                  " U R                  U5         GN+! [         a$  n[        R                   (       a   SnA GMP  UeSnAff = f["         aq    [$        R'                  SXU5        [        R                  " U R                  U5      nUS	S
 R)                  5       (       a  U R*                  R-                  XS45         GNf = f)z%internal: finished reading image dataNr   Tr&   r   r  r  r  r   r%   r   r  r$   r   )+r  r  rV   r_   r   r   re   r  r  rx   r   r  r  r   r   r   rc   r  r}   r~   r  r  rv   r   r  ro   r  r  r;   r>   r  r  r  r  r   convert_transparentr   r   putpalettealphasr   putpalettealphaconvertr  )	rX   rf   rg   rh   r   rF   updatedmaskts	            r9   load_endPngImageFile.load_end  s   xx###;;!GGLL%GGLLO#'88==? & g~D$4$4&'#c/?c/# F XX%%
HHNNDH}}}%--!?**TWWd.A.AB77<<5(^tyy-H"66		. 9D ww||s*~/J IIn5%a//#44Q7'3//#33A6"??62D##G-@-@$G-- "@}G LL+.  &  	 '>aKF ((&9   66	 
 " ?13VD((&9q8##%%''..~>	?sU   "J  K  J?>J?
N4N4%!L		
L7L2(N40L22L77A9N43N4c                    SU R                   ;  a  U R                  5         SU R                   ;  a  SU R                   ;  a  g U R                  5       R                  5       $ )NrX  zRaw profile type exif)r   r  getexif_get_merged_dictrk   s    r9   _getexifPngImageFile._getexif8  sG    "IIK"'>dii'O||~..00r8   c                `   > SU R                   ;  a  U R                  5         [        TU ]  5       $ )NrX  )r   r  r   r  )rX   r   s    r9   r  PngImageFile.getexif?  s%    "IIKw  r8   )__frame__idat__prepare_idat__rewind__rewind_idatr  r  r  r  r  r  r  r  r  r  r  r  r  r  rV   r  r   r  r_  r  r  r  r   r   )r   zdict[str, str | iTXt])r  r   r   r   r   )r  r   r   r   r   r   )r   r   )r  r   r   r   )r   zdict[int, Any] | None)r   z
Image.Exif)r0   r1   r2   r3   formatformat_descriptionr  propertyr   r   r^   r  r`   r  r  r  r  r  r7   r{  r|  s   @r9   r  r    s`    F4A-F  $+bIH/ (D<(|1! !r8   r  )r      r   )L;1r  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$   c                    SR                  U5      nU R                  [        [        U5      5      U-   5        U R                  U5        [	        U[	        U5      5      nU R                  [        U5      5        g)z'Write a PNG chunk (including CRC field)r8   N)joinwriteo32r.  rO   )rV   rf   rM   	byte_datar   s        r9   putchunkr  ]  sW     IHHSY 3&'HHY
F3K
(CHHSXr8   c                  (    \ rS rSrSS jrSS jrSrg)_idatih  c                    Xl         X l        g rT   )rV   chunk)rX   rV   r  s      r9   rY   _idat.__init__k  s    
r8   c                >    U R                  U R                  SU5        g )Nr  r  rV   rX   rM   s     r9   r  _idat.writeo  s    

477GT*r8   r  N)rV   r   r  Callable[..., None]r   r   rM   r   r   r   r0   r1   r2   r3   rY   r  r7   r/   r8   r9   r  r  h  s    +r8   r  c                  (    \ rS rSrSS jrSS jrSrg)_fdatis  c                (    Xl         X l        X0l        g rT   )rV   r  r   )rX   rV   r  r   s       r9   rY   _fdat.__init__v  s    
r8   c                    U R                  U R                  S[        U R                  5      U5        U =R                  S-  sl        g )Nr  r   )r  rV   r  r   r  s     r9   r  _fdat.write{  s/    

477GS%6=r8   )r  rV   r   N)rV   r   r  r  r   r   r   r   r  r  r/   r8   r9   r   r   s  s    
r8   r   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
_Framei  Image.Imager  z tuple[int, int, int, int] | Noner
  zdict[str, Any]encoderinfor/   Nr   r/   r8   r9   r  r    s    O
**r8   r  c                   U R                   R                  S5      nU R                   R                  SU R                  R                  SS5      5      nU R                   R                  SU R                  R                  S[        R                  5      5      n	U R                   R                  SU R                  R                  S[
        R                  5      5      n
U(       a  [        R                  " U5      nO[        R                  " U /U5      n/ nSnU GH  n[        R                  " U5       GH  nUR                  U:X  a  UR                  5       nOUR                  U5      nU R                   R                  5       n[        U[        [         45      (       a  X}   US'   O%Uc"  SUR                  ;   a  UR                  S   US'   [        U	[        [         45      (       a  X   US'   [        U
[        [         45      (       a  X   US'   US-  nU(       Ga  US   nUR                   R                  S5      nUR                   R                  S5      nU[        R"                  :X  a  [%        U5      S:  a  [        R&                  nU[        R&                  :X  a  UR(                  R                  5       n[*        R,                  R/                  S	U R0                  S
5      nUR2                  nU(       a  UR5                  U5      nOSU R0                  -   nUR7                  UU5        O0U[        R"                  :X  a  US   R(                  nOUR(                  n[8        R:                  " UR                  S	5      UR                  S	5      5      nUR=                  SS9nU(       dM  UUR                  S5      :X  a8  UUR                  S5      :X  a#  SU;   a  UR                   S==   US   -  ss'   GM  OS nUR?                  [A        UUU5      5        GM     GM      [%        U5      S:X  a  U(       d  US   R(                  $ U" US[C        [%        U5      5      [C        U5      5        U(       a|  U R                  U:w  a  U R                  U5      n [D        RF                  " U [I        [J        [L           [O        X5      5      [D        RP                  " SSU R0                  -   SU5      /5        Sn[S        U5       GH  u  nnUR(                  nUR2                  (       d  SUR0                  -   nOUR2                  nUR5                  U5      nUR0                  nUR                   n[U        [W        UR                  SS5      5      5      nUR                  SU	5      nUR                  SU
5      nU" US[C        U5      [C        US   5      [C        US   5      [C        US   5      [C        US   5      [Y        U5      [Y        S5      [[        U5      [[        U5      5        US-  nUS:X  ae  U(       d^  [D        RF                  " U[I        [J        [L           [O        X5      5      [D        RP                  " SSUR0                  -   SU5      /5        GM  []        XU5      n[D        RF                  " U[I        [J        [L           U5      [D        RP                  " SSUR0                  -   SU5      /5        UR^                  nGM     g )Nri  r\  r   rk  rm  r   r%   r$   )r   r   r   r   r   F)
alpha_onlys   acTLr   r  rh  )0r  r  r   r-   r4   r;   r=   	itertoolschainr   Iteratorr  r   r  r   listr/  r6   r.  r5   r  r   r  r  r  r
  cropr  r   subtract_modulogetbboxrv   r  r  r   _saver
   r   r   r  r  	enumerater   roundo16r   r   r   ) r  rV   r  r  r  r  append_imagesri  r\  rk  rm  r  	im_framesframe_countim_seqim_framer  previousprev_disposal
prev_blendbase_imr  r
  deltar   r  
frame_datar  frame_durationframe_disposalframe_blendfdat_chunkss                                    r9   _write_multiple_framesr'    s    ~~!!*-H>>fbggkk&!&<=D~~!!*bggkk*hFVFV.WXHNNwGU__(MNE.m4 IK%..v6H}}$#==?#++D1..--/K(T5M22*2*?J'!jHMM&A*2--
*CJ'(T5M22*2*?J'%$//','9G$1K$R= ( 4 4 8 8 D%1155g>
 H$8$88S^a=O$,$:$:M H$:$::&kk..0G#jjoofbgg|LG#==D"),,t"4%/MM'40"h&:&::'m..G&kkG"22$$V,goof.E }}}6%)DD"koog&>>"k1((4J8OO4VHdK@Ae 7 j 9~=| 

C	ND		 77d?D!BEE",-__UFRWW$4aAB	
 G&y1z==HMM)D??D}}T*H}} ,,U;??:q#ABC$X>!oogu5LQLQLQLQLI~{O	
 	1A:mOORYb 01(>7KL  73KOORY,(>7KL
 "))GU 2V r8   c                    [        XUSS9  g )NT)save_all)r  )r  rV   filenames      r9   	_save_allr+    s    	"(T*r8   c                L  ^( U(       Ga  U R                   R                  SU R                  R                  S5      5      n[        5       n[        5       m(U R                   R                  S/ 5      n[        R
                  " U /U5       HV  n[        R                  " U5       H9  n	UR                  U	R                  5        T(R                  U	R                  5        M;     MX     S H
  n
X;   d  M
    O   UR                  5       n
[        U(4S j[        S5       5       5      nOU R                  nU R                  n
U
nU
S:X  a  SU R                   ;   a  [        SU R                   S   -  S	5      nOQU R                  (       a>  [!        [        [#        U R                  R%                  5       S   5      S
-  S	5      S5      nOS	nUS::  a  US::  a  SnOUS::  a  SnOSnUSU 3-  nU R                   R                  SS5      U R                   R                  SS5      U R                   R                  SS5      U R                   R                  SS5      4U l         [(        U   u  nnnUR/                  [0        5        U" US[3        US   5      [3        US   5      UUSSS5	        / SQnU R                   R                  SU R                  R                  S5      5      nU(       a9  SnUS-   [4        R6                  " U5      -   nU" USU5        UR9                  S5        U R                   R                  S 5      nU(       a  / S!QnUR:                   H  nUS S u  nnUU;   a  UR9                  U5        U" UUU5        M.  UU;   a  U" UUU5        M@  USS R=                  5       (       d  MZ  [#        U5      S
:H  =(       a    US   nU(       a  M}  U" UUU5        M     U R                  S:X  aR  WS
-  nU R>                  RA                  S"5      S U n[#        U5      U:  a  US-  n[#        U5      U:  a  M  U" US#U5        U R                   R                  S$U R                  R                  S$S 5      5      nU(       d  US:X  a  U R                  S:X  aR  Wn [C        U[D        5      (       a  U" US%US U  5        GO[!        S[        S&U5      5      nS'U-  S-   n!U" US%U!S U  5        OU R                  S(;   a*  [!        S[        S)U5      5      nU" US%[G        U5      5        OU R                  S":X  a2  Uu  n"n#n$U" US%[G        U"5      [G        U#5      -   [G        U$5      -   5        OwS$U R                   ;   a  S*n[-        U5      eOYU R                  S:X  aI  U R>                  RI                  5       S+:X  a+  U R>                  RA                  S+S,5      n!Wn U" US%U!S U  5        U R                   R                  S-5      n%U%(       aB  U" US.[3        [K        U%S   S/-  S0-   5      5      [3        [K        U%S   S/-  S0-   5      5      S15        U(       aB  S2S3/nUR:                   H.  nUS S u  nnUU;   d  M  UR9                  U5        U" UUU5        M0     U R                   R                  S45      n&U&(       aU  [C        U&[L        RN                  5      (       a  U&RQ                  S55      n&U&RS                  S65      (       a  U&S7S  n&U" US8U&5        U n'U(       a  [U        XX:UWW5      n'U'(       a[  [V        RX                  " U'[[        [\        [D           [_        X5      5      [V        R`                  " S9S:U'R                  -   SU5      /5        U(       ab  UR:                   HR  nUS S u  nnUSS R=                  5       (       d  M%  [#        U5      S
:H  =(       a    US   nU(       d  MH  U" UUU5        MT     U" US;S5        [c        US<5      (       a  URe                  5         g g ! [*         a  nSU
 S3n[-        U5      UeS nAff = f)=Nr  r  )r$   r   r   c              3  P   >^#    U  H  m[        U4S  jT 5       5      v   M     g7f)c              3  ,   >#    U  H	  oT   v   M     g 7frT   r/   )r(  
frame_sizer   s     r9   r*  "_save.<locals>.<genexpr>.<genexpr>1  s     ?:As   N)max)r(  r   sizess    @r9   r*  _save.<locals>.<genexpr>1  s     RAS????s   "&r%   r   bitsr      r)   r(   r&   ;optimizeFcompress_levelr
  compress_type
dictionaryr8   zcannot write mode z as PNGs   IHDRr   r   )s   cHRMs   cICPs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr;  pnginfo)s   sPLTr   r   r   r   s   PLTEr  s   tRNS      )r   r   r&  r   i  z%cannot use transparency for this moder$   Ar9  s   pHYsr8  g      ?r  s   bKGDs   hISTrX  r'   rW  r*   s   eXIfr   r   r   flush)3r  r  r   setr  r  r   r  r   r  r  r]   r/  r  r  r  r1  r.  getdataencoderconfig	_OUTMODESKeyErrorr   r  r  r  r@   r   remover   r  r  
getpaletter   r   r  getpalettemoder   r   Exiftobytesr~  r'  r   r  r
   r   r  r  hasattrr@  ))r  rV   r*  r  r)  r  modesr  r  r  r  r  outmodecolorsr4  r  	bit_depth
color_typer   rI   r   iccnamerM   r   chunks_multiple_allowed
info_chunkrf   r   palette_byte_numberpalette_bytesr  alpha_bytesalpharedgreenbluer9  rX  	single_imr2  s)                                           @r9   r  r    sE    **RWW[[9
 **?B?oordM:F)226:		(--(		(--( ; ; )D} ) 99;DRqRRwwwwGs{ R^^#bnnV44c:F zzSRZZ%7%7%9!%<!=!BCH!LR<{14&z!G 	:u-
+R0
?B/
<-	B")27);&J HHV	
DGDG
 DF
..

]BGGKK,F
GC
 g~c 22b'4  	g>>i(D"F++J"2AICf}c"b#t$//b#t$Qq!!## _1Cjm
!z"c4( & 
ww#~$qj((/0D1DE- #66U"M - #66b'=)>>%%nbggkk.RV6WXL|q(77c> K,..b'<#=>"1c#|&<=,.6b'5+#67WW//q#e\":;L"gs<01WW+C"gs3x#e*4s4y@A/ >cl"	 0 77c>bee224>EE$$VS1E K"gu\k23
..

U
#C
CFVOc)*+CFVOc)*+	
 7#++J"2AICf}c"b#t$	 & >>f%DdEJJ''<<?D???++8Db'4 $&I*E-
	 EE",-__UFY^^$;QHI	
 ++J"2AIC1Qx!! _1Cjm
:"c4( & 
"gsr7

 [  ""4&0cl!"s   ` 
`#``#c                p   ^ SSK Jn  / mSU4S jjnU" 5       n Xl        [        XSU5        U ?T$ ! U ?f = f)z4Return a list of PNG chunks representing this image.r   )BytesIOc                   > SR                  U5      n[        [        U[        U5      5      5      nTR                  XU45        g )Nr8   )r  r  rO   rv   )rV   rf   rM   r  r   r   s        r9   rv   getchunks.<locals>.append  s6    HHTN	&F3K01ss+,r8   r   rV   r   rf   r   rM   r   r   r   )ior^  r  r  )r  paramsr^  rv   rV   r   s        @r9   	getchunksrd    sB    F-
 
Bbb&!NM Ns   1 5z.pngz.apngz	image/png)rF   r   r   r   )r   )rM   r   rN   r   r   r   )r  r   r   r   ra  )r  r  rV   r   r  r  r  r   r  r   r  Image.Image | Noner  zlist[Image.Image]r   re  )r  r  rV   r   r*  r   r   r   )r  r  rV   r   r*  r   r  r  r)  r   r   r   )r  r  rc  r   r   z list[tuple[bytes, bytes, bytes]])M
__future__r   r  loggingrer   r]  r@   collections.abcr   enumr   typingr   r   r   r	   r
   r   r   r   r   r   r   _binaryr   r  r   ra   r   r   r  r   r  _utilr   TYPE_CHECKINGr   	getLoggerr0   r}   compiler  rb   r  r  r  	SAFEBLOCKrC   r   r-   r;   rJ   rO   rQ   r   r   r   r   r   r  r  rD  r  r  r   r  r'  r+  r  rd  register_openr  register_saveregister_save_allregister_extensionsregister_mimer/   r8   r9   <module>rw     s  B #   	    $  6 6 G G ! !  ! !  			8	$	L	!	'	' 
 !+
2 **01$$
 ~%w *G /[ [|3 6Y3 Y3@: d4 d4V%S!9&& S!v
 
!$$$	 
"	$'($$$	 $&!	(+ +
 
 Z  KKK K 	K
 K &K %K K\+ "*NNN N 	N
 N 
Nj2   L''w ?   L'' /   ++Y 7   ,--/@ A   L'' 5r8   