
    rbi	                    H   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 d dlmZmZ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 ddl m!Z! ddl"m#Z# dZ$e$rd dl%m&Z& d dlm'Z'm(Z( ddlm)Z)  ej*        e+          Z, ej-        d          j.        Z/dZ0dddddddddddd d!d"d#d$Z1 ej-        d%          Z2ej3        Z4	 d&e4z  Z5	  G d' d(e	          Z6 G d) d*e	          Z7dvd.Z8dwdxd2Z9 G d3 d4          Z: G d5 d6e;          Z< G d7 d8          Z= G d9 d:e          Z> G d; d<e:          Z?dyd?Z@ G d@ dAej                  ZAdBdCdDdEdFdGdHdHdHdIdJdKdLdMdNdOZBdzdTZC G dU dV          ZD G dW dX          ZEd{d]ZF G d^ d_e          ZGd|diZHd}dlZIeCdfd~dnZJddrZK ejL        eAjM        eAe@            ejN        eAjM        eJ            ejO        eAjM        eI            ejP        eAjM        dsdtg            ejQ        eAjM        du           dS )    )annotationsN)IntEnum)Fraction)IO
NamedTuplecast   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)	deprecate)DeferredErrorF)Callable)AnyNoReturn)_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                      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     b/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/PIL/PngImagePlugin.pyr/   r/   n   s1        G M
 K r7   r/   c                      e Zd ZdZ	 dZdS )Blendr   r	   N)r0   r1   r2   	OP_SOURCEOP_OVERr6   r7   r8   r:   r:      s%        I
 G r7   r:   sbytesreturnc                    t          j                    }|                    | t                    }|j        rd}t          |          |S )Nz=Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)r=   dobj	plaintextmsgs       r8   _safe_zlib_decompressrJ      sE    D>22I Moor7   dataseedintc                2    t          j        | |          dz  S )Nl    )rA   crc32)rK   rL   s     r8   _crc32rP      s    :dD!!J..r7   c                  `    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 )&ChunkStreamfp	IO[bytes]r?   Nonec                "    || _         g | _        d S N)rS   queue)selfrS   s     r8   __init__zChunkStream.__init__   s    $&:<


r7   tuple[bytes, int, int]c                   d}| j         J | j        r8| j                                        \  }}}| j                             |           nL| 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 ))rS   rX   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rY   cidposlengthr=   rI   s         r8   r`   zChunkStream.read   s    w""": 	#z~~//CfGLLQAABB%C',,..CVVFc{{ 	'2 '<S		<<<!#&&&Cr7   c                    | S rW   r6   rY   s    r8   	__enter__zChunkStream.__enter__   s    r7   argsobjectc                .    |                                   d S rW   )close)rY   rm   s     r8   __exit__zChunkStream.__exit__   s    

r7   c                "    d x| _         | _        d S rW   )rX   rS   rk   s    r8   rp   zChunkStream.close   s    ##
TWWWr7   rg   r>   rh   rM   ri   c                R    | j         J | j                             |||f           d S rW   )rX   appendrY   rg   rh   ri   s       r8   pushzChunkStream.push   s3    z%%%
3V,-----r7   c                    t                               d|||            t          | d|                    d                     ||          S )z"Call the appropriate chunk handlerzSTREAM %r %s %schunk_ascii)loggerdebuggetattrdecoderu   s       r8   callzChunkStream.call   sN     	&S&999<wt;cjj&9&9;;<<S&IIIr7   rK   c                   t           j        r&|d         dz	  dz  r|                     ||           dS | j        J 	 t	          |t	          |                    }t          | j                            d                    }||k    r"dt          |           d}t          |          dS # t          j
        $ r(}dt          |           d}t          |          |d}~ww xY w)	zRead and verify checksumr      r	   Nr(   z(broken PNG file (bad header checksum in r]   z(broken PNG file (incomplete checksum in )r   rd   crc_skiprS   rP   rb   r`   re   rf   structerror)rY   rg   rK   crc1crc2rI   es          r8   crczChunkStream.crc   s     * 	A!a 	MM#t$$$Fw"""	*$s,,Dtw||A''Dt||McMMM!#&&& | | 	* 	* 	*IT#YYIIICc"")	*s   A,B+ +C":#CC"c                L    | j         J | j                             d           dS )zRead checksumNr(   )rS   r`   )rY   rg   rK   s      r8   r   zChunkStream.crc_skip   s'     w"""Qr7      IENDendchunklist[bytes]c                :   g }| j         J 	 	 |                                 \  }}}n)# t          j        $ r}d}t	          |          |d }~ww xY w||k    rnD|                     |t          j        | j         |                     |                    |           |S )NTztruncated PNG file)	rS   r`   r   r   OSErrorr   r   
_safe_readrt   )rY   r   cidsrg   rh   ri   r   rI   s           r8   verifyzChunkStream.verify   s     w"""
	*#'99;; S&&< * * **cll)* hHHS).tw??@@@KK
	 s   ' AAANrS   rT   r?   rU   )r?   r[   )r?   rR   )rm   rn   r?   rU   r?   rU   )rg   r>   rh   rM   ri   rM   r?   rU   )rg   r>   rh   rM   ri   rM   r?   r>   )rg   r>   rK   r>   r?   rU   )r   )r   r>   r?   r   )r0   r1   r2   rZ   r`   rl   rq   rp   rv   r~   r   r   r   r6   r7   r8   rR   rR      s        = = = =       *      $ $ $ $. . . .J J J J* * * **         r7   rR   c                  D    e Zd ZU dZded<   ded<   e	 ddd
            ZdS )iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NonelangtkeyNtextstr
str | Noner?   c                X    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
        )r   __new__r   r   )clsr   r   r   rY   s        r8   r   ziTXt.__new__
  s*     {{3%%		r7   )NN)r   r   r   r   r   r   r?   r   )r0   r1   r2   __doc____annotations__staticmethodr   r6   r7   r8   r   r      s`           DH    \  r7   r   c                  @    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=))

    r?   rU   c                    g | _         d S rW   )chunksrk   s    r8   rZ   zPngInfo.__init__!  s    79r7   Frg   r>   rK   
after_idatboolc                @    | j                             |||f           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

        N)r   rt   )rY   rg   rK   r   s       r8   addzPngInfo.add$  s'     	Cz233333r7    keystr | bytesvaluer   r   zipc                *   t          |t                    s|                    dd          }t          |t                    s|                    dd          }t          |t                    s|                    dd          }t          |t                    s|                    dd          }|r<|                     d|dz   |z   dz   |z   dz   t	          j        |          z              dS |                     d|dz   |z   dz   |z   dz   |z              dS )	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   rA   compress)rY   r   r   r   r   r   s         r8   add_itxtzPngInfo.add_itxt0  s)   $ #u%% 	2**Y11C%'' 	4LL(33E$&& 	2;;w11D$&& 	2;;w11D 	UHHk!D(5047%?$-PUBVBVV    
 HHWcIo4u<tCeKeSTTTTTr7   str | bytes | iTXtc                8   t          |t                    r6|                     |||j        |j        nd|j        |j        nd|          S t          |t
                    s@	 |                    dd          }n(# t          $ r |                     |||          cY S w xY wt          |t
                    s|                    dd          }|r0|                     d|dz   t          j
        |          z              dS |                     d|d	z   |z              dS )
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

        Nr7   )r   r   r      zTXt        tEXtr   )r   r   r   r   r   r>   r   UnicodeErrorr   rA   r   )rY   r   r   r   s       r8   add_textzPngInfo.add_textS  s@    eT"" 	==#j4

##j4

# !    %'' 	::Y99 : : :}}S%S}99999: #u%% 	2**Y11C 	3HHWcGmdmE.B.BBCCCCCHHWcEkE122222s   "A9 9"BBNr   F)rg   r>   rK   r>   r   r   r?   rU   )r   r   F)r   r   r   r   r   r   r   r   r   r   r?   rU   )r   r   r   r   r   r   r?   rU   )r0   r1   r2   r   rZ   r   r   r   r6   r7   r8   r   r     s         
: : : :
4 
4 
4 
4 
4  !U !U !U !U !UH HM!3 !3 !3 !3 !3 !3 !3r7   r   c                  .    e Zd ZU ded<   ded<   ded<   dS )_RewindStatez dict[str | tuple[int, int], Any]infozlist[ImageFile._Tile]tilez
int | Noneseq_numNr0   r1   r2   r   r6   r7   r8   r   r   {  s6         ****r7   r   c                       e Zd Zd  f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 xZS )%	PngStreamrS   rT   r?   rU   c                   t                                          |           i | _        i | _        d| _        d| _        g | _        d | _        d | _        d | _	        d | _
        t          i g d           | _        d| _        d S )Nr   r   r   r   )superrZ   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memory)rY   rS   	__class__s     r8   rZ   zPngStream.__init__  s     :<.0.048.2'+$((R66r7   chunklenrM   c                z    | xj         |z  c_         | 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_MEMORYrF   )rY   r   rI   s      r8   check_text_memoryzPngStream.check_text_memory  sY    H$o--6#6 6 6  S//! .-r7   c                t    t          | j                                        | j        | j                  | _        d S rW   )r   r   copyr   r   r   rk   s    r8   save_rewindzPngStream.save_rewind  s5    (LLM
 
r7   c                    | j         j                                        | _        | j         j        | _        | j         j        | _        d S rW   )r   r   r   r   r   r   r   r   rk   s    r8   rewindzPngStream.rewind  s9    (-2244(-)1r7   rh   ri   r>   c                   | j         J t          j        | j         |          }|                    d          }t                              d|d |                    ||dz            }t                              d|           |dk    rd| d}t          |          	 t          ||dz   d                    }n2# t          $ r t          j	        rd }n Y nt          j        $ r d }Y nw xY w|| j        d	<   |S )
Nr   ziCCP profile name %rr	   zCompression method %sr   Unknown compression method z in iCCP chunkr'   icc_profile)rS   r   r   findrz   r{   rf   rJ   rF   rd   rA   r   r   )rY   rh   ri   r=   icomp_methodrI   r   s           r8   
chunk_iCCPzPngStream.chunk_iCCP  s$   w""" &11 FF5MM+QrrU333Ah,k:::!KKKKCc"""	/!a%''
;;KK 	 	 	. "  z 	 	 	KKK	&1]#s   B9 9C(C('C(c                   | j         J t          j        | j         |          }|dk     rt          j        r|S d}t	          |          t          |d          t          |d          f| _        	 t          |d         |d         f         \  | _        | _	        n# t          $ r Y nw xY w|d         r
d| j        d	<   |d
         rd}t          |          |S )N   zTruncated IHDR chunkr   r(   r)   	      r	   	interlace   zunknown filter category)rS   r   r   rd   rF   rb   r   _MODESr   
im_rawmode	Exceptionr   rf   rY   rh   ri   r=   rI   s        r8   
chunk_IHDRzPngStream.chunk_IHDR  s    w""" &11B;;. (CS//!1ayy#a))+	,2AaD!A$<,@)DL$// 	 	 	D	R5 	*()DL%R5 	#+Cc"""s   /(B 
B%$B%r   c                   d| j         v r)t          j        d| j         d         || j                  g}n6| j        
d| j         d<   t          j        dd| j        z   || j                  g}|| _        || _        d}t          |          )Nbboxr   Tdefault_imager   zimage data found)	r   r   _Tiler   r   r   r   im_idatEOFError)rY   rh   ri   r   rI   s        r8   
chunk_IDATzPngStream.chunk_IDAT  s    T\!!OE4<+?doVVWDD+04_-OE6DL+@#tWWXD smmr7   c                $    d}t          |          )Nzend of PNG image)r   )rY   rh   ri   rI   s       r8   
chunk_IENDzPngStream.chunk_IEND  s     smmr7   c                t    | j         J t          j        | j         |          }| j        dk    r	d|f| _        |S )Nr!   r    )rS   r   r   r   r   rY   rh   ri   r=   s       r8   
chunk_PLTEzPngStream.chunk_PLTE  sA    w""" &11<3#QhDOr7   c                
   | j         J t          j        | j         |          }| j        dk    rKt                              |          r&|                    d          }|dk    r
|| j        d<   n|| j        d<   n| j        dk    rt          |          rdnd| j        d<   nb| j        dv rt          |          | j        d<   nA| j        dk    r6t          |          t          |d	          t          |d
          f| j        d<   |S )Nr!   r   r   transparencyr      )r   r   r    r'   r(   )	rS   r   r   r   _simple_palettematchr   r   i16)rY   rh   ri   r=   r   s        r8   
chunk_tRNSzPngStream.chunk_tRNS  s   w""" &11<3$$Q'' 	1 FF5MM6634DL0 01^,,\S  25a&&+?33aDL((\]**+.q66DL((\U""+.q663q!99c!Qii+GDL(r7   c                    | j         J t          j        | j         |          }t          |          dz  | j        d<   |S )N     j@gamma)rS   r   r   rb   r   r   s       r8   
chunk_gAMAzPngStream.chunk_gAMA	  s@    w""" &11 #A 1Wr7   c                    | j         J t          j        | j         |          }t          j        dt          |          dz   d|          }t          d |D                       | j        d<   |S )N>r(   Ic              3      K   | ]	}|d z  V  
dS )r  Nr6   ).0elts     r8   	<genexpr>z'PngStream.chunk_cHRM.<locals>.<genexpr>  s&      ,P,PS8^,P,P,P,P,P,Pr7   chromaticity)rS   r   r   r   unpacklentupler   )rY   rh   ri   r=   raw_valss        r8   
chunk_cHRMzPngStream.chunk_cHRM  su     w""" &11=!3SVVq[!3!3!3Q77',,P,Px,P,P,P'P'P^$r7   c                    | j         J t          j        | j         |          }|dk     rt          j        r|S d}t	          |          |d         | j        d<   |S )Nr	   zTruncated sRGB chunkr   srgb)rS   r   r   rd   rF   r   r   s        r8   
chunk_sRGBzPngStream.chunk_sRGB  se     w""" &11A::. (CS//! tVr7   c                @   | j         J t          j        | j         |          }|dk     rt          j        r|S d}t	          |          t          |d          t          |d          }}|d         }|dk    r|dz  |dz  f}|| j        d<   n|dk    r||f| j        d	<   |S )
Nr   zTruncated pHYs chunkr   r(   r)   r	   
F%u?dpiaspect)rS   r   r   rd   rF   rb   r   )	rY   rh   ri   r=   rI   pxpyunitr  s	            r8   
chunk_pHYszPngStream.chunk_pHYs+  s    w""" &11A::. (CS//!QC1IIBt199v+rF{*C"%DLQYY%'VDL"r7   c                   | j         J t          j        | j         |          }	 |                    dd          \  }}n# t          $ r |}d}Y nw xY w|rj|                    dd          }|                    dd          }|dk    r|n|| j        |<   || j        |<   |                     t          |                     |S )Nr   r	   r7   r   r   replaces   exif)
rS   r   r   splitrF   r}   r   r   r   r  )rY   rh   ri   r=   kvk_strv_strs           r8   
chunk_tEXtzPngStream.chunk_tEXt=  s    w""" &11	775!$$DAqq 	 	 	AAAA	  	/HHY11EHHY	22E'(G||!!DL"'DL""3u::...s   ? AAc                X   | j         J t          j        | j         |          }	 |                    dd          \  }}n# t          $ r |}d}Y nw xY w|r	|d         }nd}|dk    rd| d}t          |          	 t          |dd                    }n2# t          $ r t          j        rd}n Y nt          j	        $ r d}Y nw xY w|rb|
                    dd          }|
                    dd	          }	|	x| j        |<   | j        |<   |                     t          |	                     |S )
Nr   r	   r7   r   r   z in zTXt chunkr   r   r!  )rS   r   r   r"  rF   rf   rJ   rd   rA   r   r}   r   r   r   r  )
rY   rh   ri   r=   r#  r$  r   rI   r%  r&  s
             r8   
chunk_zTXtzPngStream.chunk_zTXtQ  s   w""" &11	775!$$DAqq 	 	 	AAAA	  	A$KKK!KKKKCc"""	%ae,,AA 	 	 	.   z 	 	 	AAA	  	/HHY11EHHY	22E8==DL$,u"5""3u::...s'   ? AA<B C0CCc                   | j         J t          j        | j         |          x}}	 |                    dd          \  }}n# t          $ r |cY S w xY wt          |          dk     r|S |d         |d         |dd          }}}	 |                    dd          \  }}	}
n# t          $ r |cY S w xY w|dk    rJ|dk    rB	 t          |
          }
n3# t          $ r t          j        r|cY S  t          j	        $ r |cY S w xY w|S |dk    r
|
| j
        d<   	 |                    dd          }|                    d	d          }|	                    d	d          }|
                    d	d          }n# t          $ r |cY S w xY wt          |||          x| j
        |<   | j        |<   |                     t          |                     |S )
Nr   r	   r'   r   s   XML:com.adobe.xmpxmpr   r   r   )rS   r   r   r"  rF   r  rJ   rd   rA   r   r   r}   r   r   r   r   )rY   rh   ri   rr=   r#  cfcmr   tkr$  r%  lang_strtk_strr&  s                  r8   
chunk_iTXtzPngStream.chunk_iTXtt  s0   w"""$TWf555A	775!$$DAqq 	 	 	HHH	q66A::HaD!A$!""B	''%++KD"aa 	 	 	HHH	77Qww-a00AA!    6  z   HHH $$$"#DL	HHY11E{{7H55HYYw11FHHWh//EE 	 	 	HHH	 59&4Q4QQUdl51s5zz***sN   A AAB B-,B-=C C;'C;:C;AE* *E98E9c                f    | j         J t          j        | j         |          }d|z   | j        d<   |S )N   Exif  exif)rS   r   r   r   r   s       r8   
chunk_eXIfzPngStream.chunk_eXIf  s:    w""" &11.2Vr7   c                   | j         J t          j        | j         |          }|dk     rt          j        r|S d}t	          |          | j        d | _        t          j        d           |S t          |          }|dk    s|dk    rt          j        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)rS   r   r   rd   rF   r   warningswarnrb   r   r   )rY   rh   ri   r=   rI   n_framess         r8   
chunk_acTLzPngStream.chunk_acTL  s    w""" &11A::. 6CS//!'#DMPQQQHq66q==Hz11MPQQQH#"1ayyV".r7   c                   | j         J t          j        | j         |          }|dk     rt          j        r|S d}t	          |          t          |          }| j        |dk    s| j        | j        |dz
  k    rd}t          |          || _        t          |d          t          |d          }}t          |d          t          |d	          }	}| j        \  }
}||z   |
k    s	|	|z   |k    rd
}t          |          ||	||z   |	|z   f| j	        d<   t          |d          t          |d          }}|dk    rd}t          |          t          |          z  dz  | 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)rS   r   r   rd   rF   rb   r   rf   r   r   r  float)rY   rh   ri   r=   rI   seqwidthheightr  r  im_wim_h	delay_num	delay_dens                 r8   
chunk_fcTLzPngStream.chunk_fcTL  s   w""" &11B;;. 6CS//!!ffM!cQhhM%$-37*B*B7Cc"""Aq		3q!99vQSBZZB\
d:Vd 2 20Cc""" "BU
BK@V"1bzz3q"::9	>>I#(#3#3eI6F6F#F#MZ #$R5Z  !"Wr7   c                h   | j         J |dk     r9t          j        rt          j        | j         |          }|S d}t	          |          t          j        | j         d          }t          |          }| j        |dz
  k    rd}t          |          || _        |                     |dz   |dz
            S )Nr(   z"APNG contains truncated fDAT chunkr	   r?  )	rS   r   rd   r   rF   rb   r   rf   r   )rY   rh   ri   r=   rI   rJ  s         r8   
chunk_fdATzPngStream.chunk_fdAT  s    w"""A::. (&996CS//! !,,!ff=C!G##7Cc"""sQw
333r7   r   )r   rM   r?   rU   r   )rh   rM   ri   rM   r?   r>   )rh   rM   ri   rM   r?   r   )r0   r1   r2   rZ   r   r   r   r   r   r   r   r   r  r  r  r  r  r'  r)  r2  r6  r<  rQ  rS  __classcell__r   s   @r8   r   r     s            "" " " "
 
 
 
2 2 2 2
   8   *            .         "   $   (! ! ! !F) ) ) )V      *   <4 4 4 4 4 4 4 4r7   r   prefixr   c                6    |                      t                    S rW   )
startswith_MAGIC)rV  s    r8   _acceptrZ    s    V$$$r7   c                       e Zd ZdZdZddZedd            Zd fdZddZ	dddZ
ddZddZd dZddZd!dZd" fdZ xZS )#PngImageFilePNGzPortable network graphicsr?   rU   c                   | j         J t          | j                             d                    sd}t          |          | j         | _        d| _        g | _        t          | j                   | _        	 | j                                        \  }}}	 | j        	                    |||          }n# t          $ r Y nt          $ rr t                              d|||           t          j        | j         |          }|dd                                         r| j                            ||f           Y nw xY w| j                            ||           | j        j        | _        | j        j        | _        | j        j        | _        d | _        | j        j        | _        | j        j        | _        | j        j        pd| _        | j                             dd	          | _!        | j        j"        r)| j        j"        \  }}tG          j$        ||          | _%        |d
k    r|dz
  | _&        n|| _&        | j        j        vd	| _'        | j        (                                 | j&        | _)        | j        *                                | _+        | j!        r| xj        dz  c_        | ,                    d           | j        dk    | _-        d S )Nr)   znot a PNG filer   T%r %s %s (unknown)r	   r'   r   F   fdATr(   ).rS   rZ  r`   rf   _fp_PngImageFile__frameprivate_chunksr   pngr~   r   AttributeErrorrz   r{   r   r   islowerrt   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_idatra   _PngImageFile__rewind_seekis_animated)rY   rI   rg   rh   ri   r=   rawmoderK   s           r8   _openzPngImageFile._open  s   w"""tw||A'' 	#"Cc"""7
 VX%.tw%7%7	!  $x}}Cf9HMM#sF33   ! 9 9 913VDDD(&99qs8##%% 9'..Qx888	9 HLLa   !	!2 X%
X%
H$	37
H$	#x:,1!Y]]?EBB8 	; H/MGT'+GT::DL'>>"(1*D"(D8+5:D2H  """!%!4D HMMOODM! #"JJqMMM=1,s   B1 1
D8=A8D87D8dict[str, str | iTXt]c                    | j         [| j        r$| j        }|                     | j        dz
             |                                  | j        r|                     |           | j         J | j         S )Nr	   )ri  rs  rb  r_   r;  load)rY   frames     r8   r   zPngImageFile.text>  sy     :  -		$-!+,,,IIKKK !		%   z%%%zr7   c                J   | j         d}t          |          | j                             | j        d         d         dz
             | j        J | j                                         | j                                         t                                                       dS )zVerify PNG fileNz)verify must be called directly after openr   r'   r)   )rS   RuntimeErrorr_   r   rd  r   rp   r   )rY   rI   r   s     r8   r   zPngImageFile.verifyN  s     7?=Cs### 	TYq\!_q()))x###r7   ry  rM   c                ^   |                      |          sd S || j        k     r|                     dd           | j        }t          | j        dz   |dz             D ]Q}	 |                     |           # t          $ r,}|                     |           d}t	          |          |d }~ww xY wd S )Nr   Tr	   zno more images in APNG file)_seek_checkrb  rr  ranger   r_   )rY   ry  
last_framefr   rI   s         r8   r_   zPngImageFile.seek^  s    && 	F4<JJq$\
t|a'33 	+ 	+A+

1 + + +		*%%%3smm*+	+ 	+s   A44
B*>'B%%B*Fr   r   c                	   | j         J t          | j        t                    r| j        j        |  d }|dk    r
|ry| j                            | j                   | j                                          | j        | _	        d | _
        | j         j        | _        | j         j        | _        | j        | _        d | _        d | _        | j                            dd          | _        | j                            d          | _        | j                            d          | _        | j                            d          }d| _        nx|| j        dz   k    rd| }t/          |          |                                  | j        r%| j                            | j        | j                   | j                                        | _        | j        | _        | j	        r&t;          j        | j        | j	                   d| _	        d}	 | j                            d
           	 | j                                         \  }}}n# t@          j!        tD          f$ r Y nw xY w|dk    rd}tG          |          |dk    r|rd}tE          |          d	}	 | j         $                    |||           n# tJ          $ r Y ntF          $ r3 |dk    r|d
z  }|r	|| _	        Y ndt;          j        | j        |           Y nFtL          $ r: tN          (                    d|||           t;          j        | j        |           Y nw xY w4|| _        | j         j        | _        | j                            d          | _        | j                            d          | _        | j                            d          }| j        sd}tG          |          |r|| _        | j        &| j        tR          j*        k    rtR          j+        | _        d | _        | j        tR          j*        k    rN| j        rE| j                                        | _        | ,                    | j        | j                  | _        d S d S | j        tR          j+        k    rVtZ          j.        /                    | j0        | j1                  | _        | ,                    | j        | j                  | _        d S d S )Nr   r   FrF  rH  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)2rd  r   ra  r   exr_   rq  r   rp  rn  _imr   r   r   r   rS   _prev_imdisposerk  r   
dispose_opblend_oprb  rF   rx  impastedispose_extentr   r   r   r`   r   r   rf   r   r~   UnicodeDecodeErrorre  rz   r{   r/   r5   r4   _cropr
   corefillmodesize)	rY   ry  r   r  rI   frame_startrg   rh   ri   s	            r8   rr  zPngImageFile._seekm  s   x###dh.. 	(+1A:: #dm,,,!!!&*&8# H,	 H,	( DMDL!%!F!FD"immJ77DO IMM'22DM!Y]]622NDLLq(((5e55 oo% IIKKK| AdlD,?@@@ GLLNNDMhDG " ($TWd.ABBB&'#K:Q'+x}}$Cffk2   E '>>7C"3--''>>" /7)#..."&K:HMM#sF3333)   E : : :g~~!& "28D/!E(&99999% : : :LL!5sCHHH(&99999:;:B !DL(DI"immJ77DO IMM'22DM!Y]]622N9 $5smm# 	TESD = T_8L%L%L&4DO?h222} M#}1133#zz$,8KLLM M _ 666 :??49di@@DL::dlD4GHHDLLL 76s7   H: :II	J& &
L02L0L0-A L0/L0c                    | j         S rW   )rb  rk   s    r8   ra   zPngImageFile.tell  s
    |r7   c                    | j                             d          r| j        dz   | _        | j        | _        t
          j                            |            dS )z"internal: prepare to read PNG filer   )r	   N)r   rk  decoderconfigrn  _PngImageFile__idatr   load_preparerk   s    r8   r  zPngImageFile.load_prepare  sQ     9==%% 	;!%!3d!:D)((.....r7   
read_bytesr>   c                (   | j         J | j        J | j        dk    r| j                            d           | j                                         \  }}}|dvr| j                             |||           dS |dk    r9	 | j                             |||           n# t          $ r Y nw xY w|dz
  | _        n|| _        | j        dk    |dk    r| j        }nt          || j                  }| j        |z
  | _        | j                            |          S )zinternal: read more image dataNr   r(   )   IDATs   DDATr`  r7   r`  )rd  rS   r  r`   rv   r~   r   min)rY   r  rg   rh   ri   s        r8   	load_readzPngImageFile.load_read  s2    x###w"""kQ GLLOOO#x}}Cf555c3///sg~~HMM#sF3333   D$qj$% kQ* ??JJZ55JkJ.w||J'''s   >B 
B('B(c                   | j         J | j        J | j        dk    r| j                            | j                   	 | j                            d           	 | j                                         \  }}}n# t          j        t          f$ r Y nAw xY w|dk    rn5|dk    r,| j        r%d| _        | j         	                    |||           n	 | j         
                    |||           n# t          $ r Y nt          $ rP |dk    r|dz  }	 t          j        | j        |           n&# t          $ r}t          j        rY d}~Y n|d}~ww xY wY nt"          $ rs t$                              d|||           t          j        | j        |          }|d	d
                                         r| j                            ||df           Y nw xY w| j         j        | _        | j        s"| j                                          d| _         dS | j        r0| j        t8          j        k    r|                     | j        | j                   }| j        j!        dk    r+d| j"        v r"|#                    d| j"        d                   }n| j        j!        dk    rkd| j"        v rb| j"        d         }tI          |tJ                    r|&                    |           n*tI          |tN                    r|(                    |           |)                    d          }| j        *                    || j         |           | j        | _        dS dS dS )z%internal: finished reading image dataNr   Tr(   r   r  r`  r_  r	   r'   r    r   r&   r!   )+rd  rS   r  r`   r   r   rf   rs  rn  rv   r~   r  r   r   r   r   rd   re  rz   r{   rf  rc  rt   r   ri  rp   r  r  r:   r<   r  r  r  r  r   convert_transparentr   r>   putpalettealphasrM   putpalettealphaconvertr  )	rY   rg   rh   ri   r   r=   updatedmaskts	            r8   load_endzPngImageFile.load_end   s   x###w""";!GLL%%%"	?GLLOOO#'8==?? S&&L+.    g~~D$4&'#c3///?c3////%    	  	  	 '>>aKF (&9999       6  	  :9 " ? ? ?13VDDD(&99qs8##%% ?'..Q~>>>	?="	?F X%
 	(HNNDHHH} (%-!?!?**TWd.ABB7<5((^ty-H-H"66	. 9 DD w|s**~/J/J In5%a// 7#44Q7777'3// 7#33A666"??622D##GT-@$GGG-( (!?!?sa   A7 7BBC, ,
G8GD('G(
E2E>GEEGA9GGdict[int, Any] | Nonec                    d| j         vr|                                  d| j         vrd| j         vrd S |                                                                 S )Nr5  zRaw profile type exif)r   rx  getexif_get_merged_dictrk   s    r8   _getexifzPngImageFile._getexif?  sU    ""IIKKK""'>di'O'O4||~~..000r7   
Image.Exifc                ~    d| j         vr|                                  t                                                      S )Nr5  )r   rx  r   r  )rY   r   s    r8   r  zPngImageFile.getexifF  s1    ""IIKKKww   r7   r   )r?   rv  )ry  rM   r?   rU   r   )ry  rM   r   r   r?   rU   )r?   rM   )r  rM   r?   r>   )r?   r  )r?   r  )r0   r1   r2   formatformat_descriptionru  propertyr   r   r_   rr  ra   r  r  r  r  r  rT  rU  s   @r8   r\  r\    s=       F4B- B- B- B-H    X      + + + +bI bI bI bI bIH   / / / /!( !( !( !(F=( =( =( =(~1 1 1 1! ! ! ! ! ! ! ! ! !r7   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&   rS   rT   rg   rU   c                <   d                     |          }|                     t          t          |                    |z              |                     |           t	          |t	          |                    }|                     t          |                     dS )z'Write a PNG chunk (including CRC field)r7   N)joinwriteo32r  rP   )rS   rg   rK   	byte_datar   s        r8   putchunkr  d  s}     IHHSY  3&'''HHY
F3KK
(
(CHHSXXr7   c                      e Zd ZddZdd
ZdS )_idatrS   rT   chunkCallable[..., None]r?   rU   c                "    || _         || _        d S rW   )rS   r  )rY   rS   r  s      r8   rZ   z_idat.__init__r  s    


r7   rK   r>   c                >    |                      | j        d|           d S )Nr  )r  rS   rY   rK   s     r8   r  z_idat.writev  s     

47GT*****r7   N)rS   rT   r  r  r?   rU   rK   r>   r?   rU   r0   r1   r2   rZ   r  r6   r7   r8   r  r  o  s<           + + + + + +r7   r  c                      e Zd Zdd	ZddZdS )_fdatrS   rT   r  r  r   rM   r?   rU   c                0    || _         || _        || _        d S rW   )rS   r  r   )rY   rS   r  r   s       r8   rZ   z_fdat.__init__}  s    
r7   rK   r>   c                    |                      | j        dt          | j                  |           | xj        dz  c_        d S )Nr`  r	   )r  rS   r  r   r  s     r8   r  z_fdat.write  s:    

47GS%6%6===r7   N)rS   rT   r  r  r   rM   r?   rU   r  r  r6   r7   r8   r  r  z  s<           
     r7   r  r  Image.Imageencoderinfodict[str, Any]c                    |                     dd          |                     dd          |                     dd          |                     dd          f| _        d S )NoptimizeFcompress_levelcompress_type
dictionaryr7   )rk  encoderconfig)r  r  s     r8   _apply_encoderinfor    sW    
E**("--,,c**	Br7   c                  .    e Zd ZU ded<   ded<   ded<   dS )_Framer  r  z tuple[int, int, int, int] | Noner   r  r  Nr   r6   r7   r8   r  r    s3         OOO****r7   r  r  r  r  r   rt  r   Image.Image | Noneappend_imageslist[Image.Image]c                   | j                             d          }| j                             d| j                            dd                    }| j                             d| j                            dt          j                            }	| j                             d| j                            dt
          j                            }
|rt          j        |          }nt          j        | g|          }g }d}|D ]}t          j
        |          D ]}|j        |k    r|                                }n|                    |          }| j                                         }t          |t          t           f          r||         |d<   n|d|j        v r|j        d         |d<   t          |	t          t           f          r|	|         |d<   t          |
t          t           f          r|
|         |d<   |dz  }|r|d         }|j                             d          }|j                             d          }|t          j        k    rt%          |          dk     rt          j        }|t          j        k    r|j                                        }t*          j                            d	| j        d
          }|j        }|r|                    |          }n
d| j        z   }|                    ||           n%|t          j        k    r|d         j        }n|j        }t9          j        |                    d	          |                    d	                    }|                    d          }|sS||                    d          k    r:||                    d          k    r!d|v r|j         dxx         |d         z  cc<   nd }|                    tA          |||                     ؐt%          |          dk    r|s|d         j        S  ||dtC          t%          |                    tC          |                     |r| j        |k    r| n|                     |          }tE          || j                    tG          j$        |tK          tL          tN                   tQ          ||                    tG          j)        dd| j        z   d|          g           d}tU          |          D ]f\  }}|j        }|j        sd|j        z   }n|j        }|                    |          }|j        }|j         }|                    dd          }tW          |dz            ,                    d          }|j-        dk    rd}t]          |          |                    d|	          } |                    d|
          }! ||dtC          |          tC          |d                   tC          |d                   tC          |d                   tC          |d                   t_          |j-                  t_          |j0                  tc          |           tc          |!                     |dz  }tE          || j                    |dk    rd|sbtG          j$        |tK          tL          tN                   tQ          ||                    tG          j)        dd|j        z   d|          g           te          |||          }"tG          j$        |tK          tL          tN                   |"          tG          j)        dd|j        z   d|          g           |"j3        }hd S )NrD  r8  r   rF  rH  r	   r  r'   r&   )r   r   r   r   r   F)
alpha_onlys   acTLr   rC    zcannot write durationr  )4r  rk  r   r/   r3   r:   r;   	itertoolschainr   Iteratorr  r   r  r   listr  r5   r  r4   r  r
   r  r  r  r   cropr  r   subtract_modulogetbboxrt   r  r  r  r   _saver   r   r>   r  r   	enumerater   limit_denominator	numeratorrF   o16denominatorr   r  r   )#r  rS   r  r  rt  r   r  rD  r8  rF  rH  r  	im_framesframe_countim_seqim_framer  previousprev_disposal
prev_blendbase_imr  r   delta
default_imr   ry  
frame_datar  frame_durationdelayrI   frame_disposalframe_blendfdat_chunkss#                                      r8   _write_multiple_framesr    s    ~!!*--H>fbgkk&!&<&<==D~!!*bgkk*hFV.W.WXXHNwGU_(M(MNNE 5..m44 IK 3B 3B%.v66 2	B 2	BH}$$#==??#++D11.--//K(T5M22 D*2;*?J''!jHM&A&A*2-
*CJ'(T5M22 @*2;*?J'%$// :',['9G$1K !$R= ( 4 8 8 D D%155g>>
 H$888S^^a=O=O$,$:M H$:::&k..00G#joofbg|LLG#=D 0"),,t"4"4%/MM'40000"h&:::'m.GG&kG"2$$V,,goof.E.E  }}}66%)D)DDD"koog&>&>>>"k11(444J8OO444VHdK@@AAAAe2	Bh 9~~=| 
E
C	NND			    
7d??RR

40@0@
:r~666EE"e,,--_UFRW$4aAAB	
 	
 	
 G&y11 /* /*z= 	+HM)DD?D}}T**H} ,$Q77$.//AA%HH?U"")CS//!$X>>!oogu55LLQLLQLLQLLQLL  !""~{OO	
 	
 	
 	18R^444A::m:ORYb% 0 011(>7KKL     E733KORY,,(>7KKL  
 ")GG4r7   filenamer   c                ,    t          | ||d           d S )NT)save_all)r  )r  rS   r  s      r8   	_save_allr   )  s    	"b(T******r7   r  c                0  ( |r| j                             d| j                            d                    }t                      }t                      (| j                             dg           }t	          j        | g|          D ]M}t          j        |          D ]6}	|                    |	j	                   (                    |	j
                   7NdD ]}
|
|v r n	|                                }
t          (fdt          d          D                       }n| j
        }| j	        }
|
}|
dk    rd| j         v rt          d| j         d         z  d	          }nU| j        rLt!          t          t#          | j                                        d                   d
z  d	          d          }nd	}|dk    r|dk    rd}n|dk    rd}nd}|d| z  }	 t&          |         \  }}}n(# t(          $ r}d|
 d}t+          |          |d }~ww xY w|dk    rt-          ddd           |                    t0                      ||dt3          |d                   t3          |d                   ||ddd	  	         g d}| j                             d| j                            d                    }|r>d}|dz   t5          j        |          z   } ||d|           |                    d           | j                             d          }|rg d}|j        D ]}|d d         \  }}||v r#|                    |            ||||           6||v r ||||           H|dd                                         r*t#          |          d
k    o|d         }|s ||||           | j	        dk    r_|d
z  }| j                             d          d |         }t#          |          |k     r|dz  }t#          |          |k      ||d |           | j                             d!| j                            d!d                     }|s|dk    r| j	        dk    rk|} tC          |tD                    r ||d"|d |                     n@t!          dt          d#|                    }d$|z  dz   }! ||d"|!d |                     n| j	        d%v r9t!          dt          d&|                    } ||d"tG          |                     n| j	        dk    rA|\  }"}#}$ ||d"tG          |"          tG          |#          z   tG          |$          z              nud!| j         v rd'}t+          |          nZ| j	        dk    rO| j        $                                d(k    r2| j                             d(d)          }!|}  ||d"|!d |                     | j                             d*          }%|%r[ ||d+t3          tK          |%d         d,z  d-z                       t3          tK          |%d         d,z  d-z                       d.           |rAd/d0g}|j        D ]5}|d d         \  }}||v r"|                    |            ||||           6| j                             d1          }&|&r[tC          |&tL          j'                  r|&(                    d2          }&|&)                    d3          r
|&d4d          }& ||d5|&           | }'|rtU          | |||
|||          }'|'rutW          |'| j                    tY          j-        |'t]          t^          tD                   ta          ||                    tY          j1        d6d7|'j
        z   d|          g           |r]|j        D ]U}|d d         \  }}|dd                                         r*t#          |          d
k    o|d         }|r ||||           V ||d8d9           te          |d:          r|3                                 d S d S );Nr   r  )r&   r    r!   c              3  P   K   | ]t          fd D                       V   dS )c              3  (   K   | ]}|         V  d S rW   r6   )r  
frame_sizer   s     r8   r  z"_save.<locals>.<genexpr>.<genexpr>F  s'      ??:A??????r7   N)max)r  r   sizess    @r8   r  z_save.<locals>.<genexpr>F  sA      RRAS?????????RRRRRRr7   r'   r!   bitsr	      r+   r*   r(   ;zcannot write mode z as PNGr
  zSaving I mode images as PNGr   )
stacklevels   IHDRr   r   )s   cHRMs   cICPs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr  pnginfo)s   sPLTr   r   r   r    s   PLTEr   s   tRNSr      )r   r   r
  r   r  z%cannot use transparency for this moder&   Ar  s   pHYsr  g      ?r  s   bKGDs   hISTr5  r)   r4  r,   s   eXIfr   r   r   r7   flush)4r  rk  r   setr  r  r   r  r   r  r  r^   r  r~  r  rm  r  r  getdata	_OUTMODESKeyErrorr   r   r  rY  r  rA   r   remover   rf  r  
getpaletter   r>   r  getpalettemoderM   r
   ExiftobytesrX  r  r  r   r  r   r   r  r   hasattrr  ))r  rS   r  r  r  r   modesr  r  r  r  r  outmodecolorsr  rt  	bit_depth
color_typer   rI   r   iccnamerK   r   chunks_multiple_allowed
info_chunkrg   r   palette_byte_numberpalette_bytesr   alpha_bytesalpharedgreenbluer  r5  	single_imr  s)                                           @r8   r  r  -  s:	     **RW[[99
 
 **?B??ordM:: 	) 	)F)26:: ) )		(-(((		(-(((() ) 	 	Du}}  99;;DRRRRqRRRRRwwGs{{ R^##bnV44c::FF z SRZ%7%7%9%9!%<!=!=!BCHH!LLR<<{{1z4zz!G")27);&JJ " " "04000cll!" #~~/BBBB
 HHV	E
DGDG
 
 
 DCCF
.

]BGKK,F,F
G
GC
  g~c 2 22b'4    	g>i((D )"F"F"F+ 	) 	)J"2A2ICf}}c"""b#t$$$$///b#t$$$$QqS!!## ) __1Cjm
! )E"c4(((	w#~~$qj((//0D1D0DE-  #666U"M -  #666b'=)))>%%nbgkk.RV6W6WXXL 4|q((7c>> K,.. 8b'<#=>>>>"1c#|&<&<==,.6b'5+#67777W///q#e\":":;;LE"gs<001111W+CE"gs3xx#e**4s4yy@AAAA// >cll"	 0 7c>>be2244>>E$$VS11E KE"gu\k\2333
.

U
#
#C
 
CFVOc)**++CFVOc)**++	
 	
 	
  %7#+ 	% 	%J"2A2ICf}}c"""b#t$$$>f%%D !dEJ'' 	#<<??D???++ 	8Db'4   $&I 
*E4-
 
	  
9bn555EE"e,,--_UFY^$;QHHI	
 	
 	
  )+ 	) 	)J"2A2IC1Q3x!! ) __1Cjm
 )E"c4(((	E"gsr7 





 s   G# #
H-HHparamsr    list[tuple[bytes, bytes, bytes]]c                    ddl m} g dfd
} |            }	 || _        t          | |d|           | `n# | `w xY wS )z4Return a list of PNG chunks representing this image.r   )BytesIOrS   rT   rg   r>   rK   r?   rU   c                    d                     |          }t          t          |t          |                              }                    |||f           d S )Nr7   )r  r  rP   rt   )rS   rg   rK   r  r   r   s        r8   rt   zgetchunks.<locals>.append  sN    HHTNN	&F3KK0011sIs+,,,,,r7   r   rS   rT   rg   r>   rK   r>   r?   rU   )ior.  r  r  )r  r+  r.  rt   rS   r   s        @r8   	getchunksr2    s    F- - - - - -
 
Bb"b&!!!NNBNMs   7 ;z.pngz.apngz	image/png)r=   r>   r?   r>   )r   )rK   r>   rL   rM   r?   rM   )rV  r>   r?   r   r0  )r  r  r  r  r?   rU   )r  r  rS   rT   r  r  r  r   rt  r   r   r  r  r  r?   r  )r  r  rS   rT   r  r   r?   rU   )r  r  rS   rT   r  r   r  r  r  r   r?   rU   )r  r  r+  r   r?   r,  )R
__future__r   r  loggingrer   r9  rA   enumr   	fractionsr   typingr   r   r   r   r
   r   r   r   r   _binaryr   r  r   rb   r   r   r  r   r  
_deprecater   _utilr   TYPE_CHECKINGcollections.abcr   r   r   r   	getLoggerr0   rz   compiler  rc   rY  r   r   	SAFEBLOCKrD   r   r/   r:   rJ   rP   rR   r   r   r   r   r   rZ  r\  r  r  r  r  r  r  r  r   r  r2  register_openr  register_saveregister_save_allregister_extensionsregister_mimer6   r7   r8   <module>rF     s  B # " " " " "      				                ' ' ' ' ' ' ' ' ' ' G G G G G G G G G G G G G G ! ! ! ! ! ! ! ! ! ! ! !       ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !             (((((($$$$$$$$		8	$	$	L	!	!	' 
 !+
 
2 "*011$
 ~%    w   *    G      / / / / /[ [ [ [ [ [ [ [|    3   6Y3 Y3 Y3 Y3 Y3 Y3 Y3 Y3@    :   f4 f4 f4 f4 f4 f4 f4 f4Z% % % %T! T! T! T! T!9& T! T! T!x
 
!$$$	 
"	$'($$$	 $&! 	(   + + + + + + + +
 
 
 
 
 
 
 
            Z      P P P Pf+ + + + "*I I I I I`   2  L'w ? ? ?  L' / / /  +Y 7 7 7  ,-/@ A A A  L' 5 5 5 5 5r7   