a
    ¥Q•hM‹  ã                   @   s–  d dl Z d dlZd dlZd dlZd dlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ G dd	„ d	eƒZejZd
d„ ZG dd„ de	j	ƒZdd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 d!„ Zd"d#„ Z d$d%„ Z!dZ"d&d'„ Z#d(d)„ Z$d*d+„ Z%d,d-„ Z&d.d/„ Z'd0d1„ Z(d2d3„ Z)d<d4d5„Z*d=d7d8„Z+e ,ej-ee¡ e .ej-e¡ e /ej-e¡ e 0ej-d9¡ e 1ej-d:¡ dS )>é    N)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16lec                   @   s   e Zd ZdZdZdZdZdS )ÚLoadingStrategyz.. versionadded:: 9.1.0r   r   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚRGB_AFTER_FIRSTÚ RGB_AFTER_DIFFERENT_PALETTE_ONLYÚ
RGB_ALWAYS© r   r   úK/var/www/sistema_ama/venv/lib/python3.9/site-packages/PIL/GifImagePlugin.pyr   '   s   r   c                 C   s   | d d… dv S )Né   )s   GIF87as   GIF89ar   )Úprefixr   r   r   Ú_accept6   s    r   c                       s~   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	e
dd„ ƒZe
dd„ ƒZdd„ Zddd„Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚGifImageFileZGIFzCompuserve GIFFNc                 C   s,   | j  d¡}|r(|d r(| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr   r   r   ÚdataF   s    zGifImageFile.datac                 C   sX   t dt|ƒdƒD ]B}|d ||   krJ||d    krJ||d  ksn  dS qdS )Nr   é   r   r   TF)ÚrangeÚlen)r   ÚpÚir   r   r   Ú_is_palette_neededL   s    8zGifImageFile._is_palette_neededc                 C   sØ   | j  d¡}t|ƒs d}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rª|d
 | jd< | j  d|> ¡}|  |¡rªt	 
d|¡}| | _| _| j | _| j  ¡ | _d | _d | _|  d¡ d S )Né   znot a GIF filer   Úversioné   é
   é   r   é€   é   Ú
backgroundr    ÚRGBr   )r   r   r   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtiler%   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_is_animatedÚ_seek)r   r   ÚmsgÚflagsÚbitsr#   r   r   r   Ú_openR   s(    
zGifImageFile._openc                 C   s^   | j d u rX|  ¡ }z|  |  ¡ d d¡ qW n  tyL   |  ¡ d | _ Y n0 |  |¡ | j S )Nr   F)r:   r8   r<   ÚEOFErrorÚseek©r   Úcurrentr   r   r   Ún_framesn   s    

zGifImageFile.n_framesc                 C   sv   | j d u rp| jd ur"| jdk| _ nN|  ¡ }|r6d| _ n:z|  dd¡ d| _ W n tyd   d| _ Y n0 |  |¡ | j S )Nr   TF)r;   r:   r8   r<   rA   rB   rC   r   r   r   Úis_animatedz   s    



zGifImageFile.is_animatedc                 C   s˜   |   |¡sd S || jk r(d | _|  d¡ | j}t| jd |d ƒD ]P}z|  |¡ W qB ty� } z$|  |¡ d}t|ƒ|‚W Y d }~qBd }~0 0 qBd S )Nr   r   zno more images in GIF file)Ú_seek_checkÚ_GifImageFile__frameÚimr<   r!   rA   rB   )r   ÚframeZ
last_frameÚfÚer=   r   r   r   rB   �   s    



zGifImageFile.seekTc                    sò  |dkrBdˆ _ d ˆ _dˆ _ˆ j ˆ j¡ dˆ _dˆ jv rTˆ jd= nˆ jrT|rTˆ  	¡  |ˆ jd krtd|› �}t
|ƒ‚ˆ jˆ _ˆ j r ˆ j ˆ j ¡ ˆ  ¡ ršq�dˆ _ ˆ j d¡}|r¸|dkr¼t‚d }i }d }d }d }	|sàˆ j d¡}|rì|dkrô�qr�nx|dk�rHˆ j d¡}ˆ  ¡ }
|d dk�rj|
d }|d@ �r:|
d	 }t|
dƒd
 |d< d|@ }|d? }|�r6|ˆ _nÌ|d dk�rÆd}|
�r–||
7 }ˆ  ¡ }
�q|d|v �r¶|d  d| 7  < n||d< d }qÐnp|d dk�r6|dk�r6|
ˆ j ¡ f|d< |
d d… dk�r6ˆ  ¡ }
t|
ƒd	k�r6|
d dk�r6t|
dƒˆ jd< ˆ  ¡ �rl�q6�n$|dk�rlˆ j d¡}t|dƒt|dƒ }}|t|dƒ |t|dƒ  }}|ˆ jd k�s²|ˆ jd k�ræ|�ræt|ˆ jd ƒt|ˆ jd ƒfˆ _t ˆ j¡ ||||f}	|d }|d@ dk}|d@ �rJ|d@ d }ˆ j d	|> ¡}ˆ  |¡�rFt d|¡}nd}ˆ j d¡d }ˆ j ¡ ˆ _ �qrn d }qÐ|d u �r€t‚|ˆ _|�s�d S g ˆ _ˆ j�r°ˆ j ˆ jˆ j¡ |d u�r¾|nˆ jˆ _|ˆ _|dk�r:ˆ j�rt t!j"k�r |d u�rød ndˆ _#nd!ˆ _#nd"ˆ _#|�s2ˆ j�r2dd#l$m$} |ˆ jƒ}|ˆ _%n‚ˆ j&d!k�r¼t t!j'k�sX|�r¼d ˆ _(d$ˆ jv �r¢ˆ j )ˆ jd$ d¡ ˆ j *d tj+j,¡ˆ _d ˆ _#ˆ jd$= ndˆ _#ˆ j *dtj+j,¡ˆ _‡ fd%d&„}|	ˆ _�zJˆ jdk �rèd ˆ _�n0ˆ jdk�r�ˆ j\}}}}|| || f}t |¡ d!}ˆ j -d$|¡}|d u�rVˆ j&d'v �r|d }||ƒd( }n&ˆ j -d)d¡}ˆ j&d'v �r|d}||ƒ}tj. /|||¡ˆ _nˆˆ jd u�r°ˆ  0ˆ jˆ j¡ˆ _nh|d u�rˆ j\}}}}|| || f}t |¡ d!}|}ˆ j&d'v �rd }||ƒd( }tj. /|||¡ˆ _W n t1�y.   Y n0 |d u�ršd}|d u�rz|dk�rjt t!j"k�rz|ˆ jd$< nˆ j&d'v�rz|}d*||||fˆ j |||ffgˆ _| -d¡�r´|d ˆ jd< d+D ]4}||v �rÖ|| ˆ j|< n|ˆ jv �r¸ˆ j|= �q¸d S ),Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;ó   !éù   r    r)   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionr,   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r(   é@   r+   r*   r.   FÚRGBAÚPÚL)ÚcopyÚtransparencyc                    s6   ˆ j r(tˆ j j| d | d d … ƒ} n
| | | f} | S )Nr    )Ú_frame_paletteÚtupler6   )Úcolor©r   r   r   Ú_rgbN  s    "
z GifImageFile._seek.<locals>._rgb©r.   r_   )r   r-   Úgif)rR   rX   )2Z_GifImageFile__offsetZdisposerH   r7   rB   r9   Zdisposal_methodr0   r3   ÚloadÚ
ValueErrorr   r   r   rA   r1   r8   r"   ÚsizeÚmaxr2   r   Ú_decompression_bomb_checkr%   r   r4   rI   ÚpasteÚdispose_extentr5   rd   Ú_frame_transparencyÚLOADING_STRATEGYr   r   Ú_moderb   r6   Úmoder   ÚpyaccessÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillÚ_cropÚAttributeError)r   rJ   Zupdate_imager=   r   r6   r0   Zframe_transparencyÚ	interlaceZframe_dispose_extentÚblockr>   Zdispose_bitsrN   Úx0Úy0Úx1Úy1r?   r#   rb   rh   Zdispose_sizeZdispose_moderf   rc   Úkr   rg   r   r<   �   sR   








&"



ÿþ









üÿ	
zGifImageFile._seekc                    s¦   | j r
dnd}d | _| jdkr@| jd urŒtj || j| j¡| _nL| j	dv rŒ| j| _| j r†tj d| j| jpld¡| _| jj
| j  ¡ Ž  nd | _|| _d | _ tƒ  ¡  d S )Nr`   ra   r   ri   )rd   Ú_prev_imrH   rr   r   r|   r}   rm   rI   ru   Ú
putpaletteÚgetdatart   ÚsuperÚload_prepare)r   Z	temp_mode©Ú	__class__r   r   r‹   œ  s     


ÿ
zGifImageFile.load_preparec                 C   sð   | j dkr`| jdkr\ttjkr\| jd ur@| j | jd¡ d| _nd| _| j 	| jt
jj¡| _d S | jsjd S | jd ur’| j | jd¡ | j 	d¡}n| j 	d¡}|  || j¡}| j| _| jj| _|jdkrÜ| j || j|¡ n| j || j¡ d S )Nr   r`   r_   r.   )rH   ru   rs   r   r   rr   rI   rw   rt   rx   r   ry   rz   r‡   r~   rq   rp   )r   Zframe_imr   r   r   Úload_end°  s(    




zGifImageFile.load_endc                 C   s   | j S ©N)rH   rg   r   r   r   r8   Ê  s    zGifImageFile.tell)T)r   r   r   ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingr5   r   r%   r@   ÚpropertyrE   rF   rB   r<   r‹   rŽ   r8   Ú__classcell__r   r   rŒ   r   r   ?   s$   


  r   ra   r`   )Ú1ra   r`   c                 C   s‚   | j tv r|  ¡  | S t | j ¡dkrx| jdtjjd�} | jj dkrt| jj	D ]&}|d dkrL| jj	| | j
d<  qtqL| S |  d¡S )	a  
    Takes an image (or frame), returns an image in a mode that is appropriate
    for saving in a Gif.

    It may return the original image, or it may return an image converted to
    palette or 'L' mode.

    :param im: Image object
    :returns: Image object
    r.   r`   ©r6   r_   r    r   rc   ra   )ru   ÚRAWMODErk   r   Úgetmodebaserx   ÚPaletteÚADAPTIVEr6   Úcolorsr0   )rI   Úrgbar   r   r   Ú_normalize_modeÕ  s    
r�   c           	      C   s`  d}|r>t |tttfƒr(t|dd… ƒ}t |tjƒr>t|jƒ}| jdkrb|sŒ| j d¡dd… }n*|s|tdd„ t	dƒD ƒƒ}tjd|d�| _|�r4g }t	dt
|ƒd	ƒD ]<}t|||d	 … ƒ}| jj |¡}||v rØd}| |¡ q¦t|ƒD ]:\}}|du rìt	t
|ƒƒD ]}||v�r|||<  qì�qqì|  |¡} n t| |ƒ}|du�rT|  ||¡S || j_| S )
at  
    Normalizes the palette for image.
      - Sets the palette to the incoming palette, if provided.
      - Ensures that there's a palette for L mode images
      - Optimizes the palette if necessary/desired.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: Image object
    Ni   r`   r.   c                 s   s   | ]}|d  V  qdS )r    Nr   )Ú.0r$   r   r   r   Ú	<genexpr>  rU   z%_normalize_palette.<locals>.<genexpr>r–   r   r    )Ú
isinstanceÚbytesÚ	bytearrayÚlistr   r6   ru   rI   Ú
getpaletter!   r"   re   r›   r{   ÚappendÚ	enumerateÚremap_paletteÚ_get_optimize)	rI   r6   r0   Úsource_paletteÚused_palette_colorsr$   Zsource_colorÚindexÚjr   r   r   Ú_normalize_paletteî  s@    





r­   c              	   C   s¶   t | ƒ}|j ¡ D ]\}}| j ||¡ qt||| jƒ}t|| jƒD ]}| |¡ qDd}t| ƒrh|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )Nr   r^   ©r   r   r(   rj   ó    )r�   r0   ÚitemsÚencoderinfoÚ
setdefaultr­   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerÚencoderconfigr   Ú_saverm   r—   ru   )rI   r   r6   Zim_outr†   Úvr   r>   r   r   r   Ú_write_single_frame"  s    $rº   c                 C   sB   t |ƒt | ƒkrt || ¡}nt | d¡|  d¡¡}|jdd�S )Nr_   F)Ú
alpha_only)Ú_get_palette_bytesr   Zsubtract_modulorx   Úgetbbox)Zbase_imÚim_frameÚdeltar   r   r   Ú_getbbox7  s    ÿrÀ   c              	   C   sÐ  | j  d¡}| j  d| j d¡¡}g }d}d }t | g| j  dg ¡¡D �]´}t |¡D �]¢}	t|	 ¡ ƒ}	|dkrœ|	j 	¡ D ] \}
}|
dkrŒqz| j  
|
|¡ qz| j  ¡ }t|	||ƒ}	d|	jv rÎ| 
d|	jd ¡ t|ttfƒrê|| |d< n$|d u �rd|	jv �r|	jd |d< t|ttfƒ�r*|| |d< |d7 }|�rä|d }t|d |	ƒ}|�sx| d¡rV|d	 d  |d 7  < qV| d¡d
k�rè|d u �rØ| j  d| j dd¡¡}t|	|ƒ}t d|	j|¡}| |d d j¡ t||	ƒ}nd }| |	||dœ¡ qVqFt|ƒdk�r–|D ]€}|d }	|d �sLt|	|d	 ƒD ]}| |¡ �q4d}n0|�s^d|d	 d< |	 |d ¡}	|d d d
… }t||	||d	 ƒ �qdS d| j v �rÌt| j d ttfƒ�rÌt| j d ƒ| j d< d S )NrR   Údisposalr   Zappend_imagesrc   r   rM   rI   r±   r   )r   r   r   r`   )rI   Úbboxr±   rÂ   r®   TÚinclude_color_table)r±   r{   r0   Ú	itertoolsÚchainr   ÚIteratorr�   rb   r°   r²   r­   r    r£   re   rÀ   Ú_get_backgroundr   Únewrm   rˆ   r6   r¥   r"   r³   r´   ÚcropÚ_write_frame_dataÚsum)rI   r   r6   rR   rÁ   Z	im_framesZframe_countZbackground_imZ
imSequencer¾   r†   r¹   r±   ÚpreviousrÂ   rf   r-   Z
frame_datar   Úoffsetr   r   r   Ú_write_multiple_framesA  sv    



ÿ

ÿrÎ   c                 C   s   t | ||dd� d S )NT)Úsave_all)r¸   )rI   r   Úfilenamer   r   r   Ú	_save_allŒ  s    rÑ   Fc                 C   s€   d| j v sd| jv r,| j  d| j d¡¡}nd }| j  dd¡| j d< |rTt| ||ƒs`t| ||ƒ | d¡ t|dƒr|| ¡  d S )Nr6   ÚoptimizeTrO   Úflush)r±   r0   r{   rÎ   rº   r´   ÚhasattrrÓ   )rI   r   rÐ   rÏ   r6   r   r   r   r¸   �  s    

r¸   c                 C   s$   | j  dd¡}t| jƒdk r d}|S )Nr€   r   é   r   )r±   r{   Úminrm   )rI   r€   r   r   r   rµ   ¡  s    rµ   c              	   C   s¶  d}zt |jd ƒ}W n ttfy,   Y n@0 d}t||jƒ}|d urlz| |¡}W n tyj   d}Y n0 d|jv rŠt |jd d ƒ}nd}t |j dd¡ƒ}|s²|dks²|�r|rºdnd}	|	|d	> O }	|sÒd}|  d
tdƒ tdƒ t|	ƒ t	|ƒ t|ƒ tdƒ ¡ |j d¡}
|
�rDt
|ƒ}t|ƒ}|�rD|dB }||B }|  dt	|d ƒ t	|d ƒ t	|jd ƒ t	|jd ƒ t|ƒ ¡ |
�r¤|�r¤|  t|ƒ¡ |  tdƒ¡ d S )NFrc   TrR   r)   r   rÁ   r   r   rP   rQ   r]   rÃ   r+   r[   r(   )Úintr±   ÚKeyErrorrl   r¨   r«   r{   r´   r
   Úo16r¼   Ú_get_color_table_sizerm   Ú_get_header_palette)r   rI   rÍ   r>   Ztransparent_color_existsrc   rª   rR   rÁ   Zpacked_flagrÃ   Úpalette_bytesÚcolor_table_sizer   r   r   r¶   «  sv    

ÿþýüûúÿ

ÿ
þýüûÿr¶   c           
      C   s  |   ¡ }zæt|dƒ�¦}| jdkr8tjd|g|tjd� ntdd|g}dg}tj|tjtjd�}tj||j|tjd�}|j 	¡  | 
¡ }	|	r”t |	|¡‚| 
¡ }	|	r¬t |	|¡‚W d   ƒ n1 sÀ0    Y  W zt |¡ W n tyì   Y n0 n&zt |¡ W n t�y   Y n0 0 d S )NÚwbr.   Zppmtogif)ÚstdoutÚstderrZppmquantZ256)Ústdinrß   rà   )Ú_dumpÚopenru   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErß   ÚcloseÚwaitÚCalledProcessErrorÚosÚunlinkÚOSError)
rI   r   rÐ   ÚtempfilerK   Z	quant_cmdZ	togif_cmdZ
quant_procZ
togif_procÚretcoder   r   r   Ú_save_netpbmé  sB    
ÿ

ÿü
,ýrñ   c                 C   sÆ   | j dv rÂ|rÂ| dd¡rÂtp&| j dk}|s<| j| j dk rÂg }t|  ¡ ƒD ]\}}|rL| |¡ qL|sxt|ƒt	|ƒkr||S t	| j
j
ƒt | j
j ¡ }d|d  ¡ > }t	|ƒ|d krÂ|dkrÂ|S dS )	aL  
    Palette optimization is a potentially expensive operation.

    This function determines if the palette should be optimized using
    some heuristics, then returns the list of palette entries in use.

    :param im: Image object
    :param info: encoderinfo
    :returns: list of indexes of palette entries in use, or None
    )r`   ra   rÒ   r   ra   i   r   r   N)ru   r{   Ú_FORCE_OPTIMIZEÚwidthÚheightr¦   Ú	histogramr¥   rn   r"   r6   r   ÚgetmodebandsÚ
bit_length)rI   r0   Zoptimiserª   r$   ÚcountZnum_palette_colorsZcurrent_palette_sizer   r   r   r¨     s$    ÿþür¨   c                 C   s:   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S d S )Nr   r\   r   r    r   )r"   ÚmathÚceilÚlog)rÜ   r   r   r   rÚ   K  s
    rÚ   c                 C   s<   t | ƒ}d|> t| ƒd  }|dkr8| tdƒd | 7 } | S )zä
    Returns the palette, null padded to the next power of 2 (*3) bytes
    suitable for direct inclusion in the GIF header

    :param palette_bytes: Unpadded palette bytes, in RGBRGB form
    :returns: Null padded palette
    r   r    r   )rÚ   r"   r
   )rÜ   rÝ   Zactual_target_size_diffr   r   r   rÛ   U  s
    rÛ   c                 C   s   | j r| j j S dS )zš
    Gets the palette for inclusion in the gif header

    :param im: Image object
    :returns: Bytes, len<=768 suitable for inclusion in gif header
    rU   r–   )rI   r   r   r   r¼   g  s    r¼   c              
   C   sb   d}|r^t |tƒrZz| j || ¡}W q^ tyV } zt|ƒdvrB‚ W Y d }~q^d }~0 0 n|}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r    re   r6   Úgetcolorrl   Ústr)rI   Zinfo_backgroundr-   rL   r   r   r   rÇ   q  s    
rÇ   c                 C   s„  d}| j  d¡dksB|rFd|v sB| d¡dusB| d¡sB| d¡rFd}t| | d	¡ƒ}t| ƒ}t|ƒ}d
| t| jd ƒ t| jd ƒ t|d ƒt|ƒtdƒ t|ƒg}| d¡durú| 	dtdƒ tdƒ d tdƒ tdƒ t|d ƒ tdƒ ¡ | d¡�r€dtdƒ }|d }t
|tƒ�r.| ¡ }tdt|ƒdƒD ]*}	||	|	d … }
|tt|
ƒƒ|
 7 }�q>|tdƒ7 }| 	|¡ |S )z2Return a list of strings representing a GIF headers   87ar'   s   89arc   rZ   NrR   rN   r-   s   GIFr   r   r+   rP   rW   r,   rY   r    rT   )r0   r{   rÇ   r¼   rÚ   rÙ   rm   r
   rÛ   r¥   r    rý   Úencoder!   r"   )rI   r0   r'   r-   rÜ   rÝ   ÚheaderZcomment_blockrN   r$   Zsubblockr   r   r   r³   ˆ  sp    ÿýüûú	ÿþý
õÿþýüû
úùÿ

r³   c              	   C   sV   zJ||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W |` n|` 0 d S )Nr   rj   r®   r¯   )r±   r¶   r   r¸   rm   r—   ru   r´   )r   r¾   rÍ   Úparamsr   r   r   rÊ   Æ  s    ÿrÊ   c                 C   sd   t | |ƒ}|du ri }d|vr6d| jv r6| jd |d< t| ||ƒ}|j| _|j| _t| |ƒ}||fS )a  
    Legacy Method to get Gif data from image.

    Warning:: May modify image data.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: tuple of(list of header items, optimized palette)

    Nr-   )r¨   r0   r­   r6   rI   r³   )rI   r6   r0   rª   Zim_modrÿ   r   r   r   Ú	getheaderÚ  s    

r  r®   c                 K   s0   G dd„ dƒ}|   ¡  |ƒ }t|| ||ƒ |jS )aë  
    Legacy Method

    Return a list of strings representing this image.
    The first string is a local image header, the rest contains
    encoded image data.

    To specify duration, add the time in milliseconds,
    e.g. ``getdata(im_frame, duration=1000)``

    :param im: Image object
    :param offset: Tuple of (x, y) pixels. Defaults to (0, 0)
    :param \**params: e.g. duration or other encoder info parameters
    :returns: List of bytes containing GIF encoded frame data

    c                   @   s   e Zd Zg Zdd„ ZdS )zgetdata.<locals>.Collectorc                 S   s   | j  |¡ d S r�   )r   r¥   )r   r   r   r   r   r´     s    z getdata.<locals>.Collector.writeN)r   r   r   r   r´   r   r   r   r   Ú	Collector  s   r  )rk   rÊ   r   )rI   rÍ   r   r  r   r   r   r   r‰   ö  s
    r‰   z.gifz	image/gif)F)NN)r®   )2rÄ   rù   rì   rä   Úenumr   Ú r   r   r   r   r   Ú_binaryr	   r1   r
   r   rÙ   r   r   rs   r   r   r—   r�   r­   rº   rÀ   rÎ   rÑ   r¸   rµ   r¶   rñ   rò   r¨   rÚ   rÛ   r¼   rÇ   r³   rÊ   r  r‰   Úregister_openr�   Úregister_saveÚregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   sR   		   4
K

>1.

>

$