
    gA                       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mZ d dl	m
Z
 d dlmZmZmZmZmZmZmZ ddlmZmZ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  erddlm!Z!  G d de      Z"e"jF                  Z$d,dZ% G d dej,                        Z&ddddZ'd-dZ(ee)e*ee+   ej2                  f   Z,	 	 	 	 	 	 	 	 d.dZ-	 	 	 	 	 	 	 	 d/dZ.	 	 	 	 	 	 d0dZ/ G d de      Z0	 	 	 	 	 	 	 	 d1dZ1d2dZ2	 d3	 	 	 	 	 	 	 	 	 d4dZ3d5dZ4	 	 	 	 	 	 	 	 	 	 d6dZ5d2d Z6dZ7d7d!Z8d8d"Z9d9d#Z:d:d$Z;	 	 	 	 	 	 d;d%Z<d<d&Z=	 	 	 	 	 	 	 	 	 	 d=d'Z>	 d>	 	 	 	 	 	 	 d?d(Z?	 d@	 	 	 	 	 	 	 dAd)Z@ ej                  e&j                  e&e%        ej                  e&j                  e3        ej                  e&j                  e2        ej                  e&j                  d*        ej                  e&j                  d+       y)B    )annotationsN)IntEnum)cached_property)IOTYPE_CHECKINGAnyListLiteral
NamedTupleUnion   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)_imagingc                      e Zd ZdZdZdZdZy)LoadingStrategyz.. versionadded:: 9.1.0r   r      N)__name__
__module____qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS     G/var/www/openai/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.pyr   r   6   s    !O'($Jr$   r   c                    | d d dv S )N   )s   GIF87as   GIF89ar#   )prefixs    r%   _acceptr)   E   s    "1:///r$   c                       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d fdZddZddZ xZS )GifImageFileGIFzCompuserve GIFFNc                    | j                   j                  d      }|r#|d   r| j                   j                  |d         S y )Nr   r   )fpread)selfss     r%   datazGifImageFile.dataU   s6    GGLLO177<<!%%r$   c                    t        dt        |      d      D ]*  }|dz  ||   cxk(  r||dz      cxk(  r||dz      k(  r' y  y y)Nr      r   r   TF)rangelen)r0   pis      r%   _is_palette_neededzGifImageFile._is_palette_needed[   sS    q#a&!$AFad:aAh:!AE(: ; % r$   c                T   | j                   j                  d      }t        |      sd}t        |      |d d | j                  d<   t        |d      t        |d      f| _        g | _        |d   }|dz  dz   }|d	z  re|d
   | j                  d<   | j                   j                  d|z        }| j                  |      r$t        j                  d|      }|x| _        | _        | j                   | _        | j                   j                         | _        d | _        | j#                  d       y )N   znot a GIF filer'   version   
      r         
backgroundr4   RGBr   )r.   r/   r)   SyntaxErrorinfoi16_sizetiler9   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r0   r1   msgflagsbitsr7   s         r%   _openzGifImageFile._opena   s    GGLLqz"Cc"" !u		)AYAq	)
	"	Q3;&'eDIIl#Q$Y'A&&q) $$UA.566#dl77%)

1r$   c                   | j                   6| j                         }	 	 | j                  | j                         dz   d       $| j                   S # t        $ r | j                         dz   | _         Y nw xY w| j	                  |       E)Nr   FrO   rM   rP   EOFErrorseek)r0   currents     r%   n_frameszGifImageFile.n_frames|   sw    >>!iikG1JJtyy{Q6 
 ~~  1!%q1IIgs   %A !A32A3c                    | j                   | j                   dk7  S | j                         }|ry	 | j                  dd       d}| j	                  |       |S # t        $ r d}Y  w xY w)Nr   TFrV   )r0   rY   is_animateds      r%   r\   zGifImageFile.is_animated   sn    >>%>>Q&&))+	 JJq% K 			'	  	 K	 s   A A%$A%c                T   | j                  |      sy || j                  k  rd | _        | j                  d       | j                  }t	        | j                  dz   |dz         D ]  }	 | j                  |        y # t
        $ r$}| j                  |       d}t        |      |d }~ww xY w)Nr   r   no more images in GIF file)_seek_check_GifImageFile__frameimrP   r5   rW   rX   )r0   frame
last_frameferQ   s         r%   rX   zGifImageFile.seek   s    &4<<DGJJqM\\
t||a'3A+

1 4  +		*%2sm*+s   &A::	B'B""B'c                2    |dk(  r]d _         d  _        d _         j                  j	                   j
                         d _        d j                  v r, j                  d= n j                  r|r j                          | j                  dz   k7  rd| }t        |       j                   _         j                   rN j                  j	                   j                           j                         r	  j                         rd _          j                  j                  d      }|r|dk(  rd}t        |      d }i }d }d }d }		 |s j                  j                  d      }|r|dk(  rn|dk(  rG j                  j                  d      } j                         }
|d   d	k(  r7|
5|
d   }|dz  r|
d
   }t        |
d      dz  |d<   d|z  }|dz	  }|r| _        n|d   dk(  r9d}|
r||
z  } j                         }
|
rd|v r|dxx   d|z   z  cc<   n||d<   d }|d   dk(  ro|dk(  rj|
h|
 j                  j!                         f|d<   |
d d dk(  rA j                         }
|
r/t#        |
      d
k\  r!|
d   dk(  rt        |
d       j                  d<    j                         r	  j                         rny|dk(  rs j                  j                  d      }t        |d      t        |d      }}|t        |d      z   |t        |d      z   }}| j$                  d   kD  s| j$                  d   kD  rX|rVt'        | j$                  d         t'        | j$                  d         f _        t+        j,                   j(                         ||||f}	|d   }|dz  dk7  }|dz  rP|dz  dz   } j                  j                  d
|z        } j/                  |      rt1        j2                  d|      }nd } j                  j                  d      d   } j                  j!                          _         nd }|d!}t        |      | _        |sy g  _         j                  r0 j4                  j7                   j                   j8                         ||n j:                   _        | _        |dk(  rl j<                  r+t@        tB        jD                  k(  r|d"nd _#        nd# _#        nd$ _#        |s$ j:                  rdd%l$m$}  | j:                        }| _%        n jL                  d#k(  rt@        tB        jN                  k7  s|rd  _(        d& j                  v rw j4                  jS                   j                  d&   d        j4                  jU                  d"t*        jV                  jX                         _        d" _#         j                  d&= n@d _#         j4                  jU                  dt*        jV                  jX                         _        d- fd'}d  _        |	 _         j8                  r j                  dk\  r	  j                  dk(  rǉ j8                  \  }}}}||z
  ||z
  f}t+        j,                  |       d#} j                  j[                  d&|      }| jL                  d(v rBd"} ||      d)z   }n4 j                  j[                  d*d      } jL                  d(v r
d} ||      }t*        j\                  j_                  |||       _        n j4                  , ja                   j4                   j8                         _        nw|u j8                  \  }}}}||z
  ||z
  f}t+        j,                  |       d#}|} jL                  d(v rd"} ||      d)z   }t*        j\                  j_                  |||       _        |]d}|<|dk(  r't@        tB        jD                  k7  r | j                  d&<   n jL                  d(vr|}d+f j                   ||ffg _        |j[                  d      r|d    j                  d<   d,D ]5  }||v r||    j                  |<   | j                  v s) j                  |= 7 y # tb        $ r Y w xY w).Nr   commentr   zcannot seek to frame    ;r^      !   r4   r>   duration   r      r$      
   	extensionrA      NETSCAPE2.0loop   ,	      r'   r=   @   r@   r?   rC   Fzimage not found in GIF frameRGBAPL)copytransparencyc                    j                   rU| dz  dz   t        j                   j                        kD  rd} t        j                   j                  | dz  | dz  dz          S | | | fS )Nr4   r   )_frame_paletter6   rK   tuple)colorr0   s    r%   _rgbz GifImageFile._seek.<locals>._rgbX  sj    ""19q=3t':':'B'B#CCET0088UQYQR]STTue,,r$   rC   rx   )r   rB   gif)rl   rq   )r   intreturnztuple[int, int, int])2_GifImageFile__offsetdisposer`   rL   rX   rN   disposal_methodrE   rH   load
ValueErrorr.   r2   r/   rW   rF   rM   r6   sizemaxrG   r   _decompression_bomb_checkr9   r   rI   ra   pastedispose_extentrJ   r~   _frame_transparencyLOADING_STRATEGYr   r"   _moder{   rK   moder!   pyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r0   rb   update_imagerQ   r1   rK   rE   frame_transparency	interlaceframe_dispose_extentblockrR   dispose_bitsrh   x0y0x1y1rS   r7   r{   r   dispose_sizedispose_moder   r|   ks   `                          r%   rP   zGifImageFile._seek   s   A:DM8<DLDLHHMM$--(#$D DII%IIi( yy\		DLL1$$)%1CS/!((==GGLL'))+ ))+DMGGLLOAI.C3-EI!!	#GGLLOT	d GGLLO		Q43;5#4 "!HEqy-21X*'*5!}r'9D$ $.#5L#/1#4L#
 0<,qTS[ "G  5( $		   !D(Y57?:*1YAqTS[UaZE4E ).tww||~(=D%Sbz^3 $		 SZ1_qQ03E1DIIf-iik iik d GGLLO QC1IBc!Qic!QiB1%diil):!$R1!6B		!8M!MDJ33DJJ?')2r2~$!"RZA-	3;!AI?DQ$Y/A..q1"."2"25!"<"' ww||Aq) $As v 0C3-	<<GGMM$,,(;(;<)0)<g$BUBU#5 A:""#'A'AA+=+IuDJ!$DJ 
t22%t223"DLyyC$(X(XX$(DM%2//		.0I1M"&''//&%,,:U:U"V%+
 IIn5%*
"&''//%9T9T"U	- 24#7#71#<*''1, &*%8%8NBB$&GR"W#5L33LA $'L IIMM.:LME(997+1L$(K$$6E $		lA >997+0L$(KE#(::??<u#UDL ww*'+zz$''4;N;N'O+7)-)<)<BB(*Rb'977E'* 2997+1L$();$<t$CE',zz(,(  L!-A:'?+E+EE4F		.1YYo5#5L R$MM9l3	DI 88I#'	?DIIi *ADy#Aw		!diiIIaL	 +- " s   Fb
 
	bbc                d   | j                   rdnd}d | _        | j                  dk(  rG| j                  t        j
                  j                  || j                  | j                        | _        n| j                  dv r| j                  | _        | j                   rtt        j
                  j                  d| j                  | j                  xs d      | _         | j                  j                  dg| j                   j                           nd | _        || _        d | _         t        | 9          y )Nry   rz   r   r   rC   )r~   _prev_imr`   r   r   r   r   r   ra   r   
putpalettegetdatar   superload_prepare)r0   	temp_mode	__class__s     r%   r   zGifImageFile.load_prepare  s    ..CC	<<1''3**//tyy$*B*B YY/) GGDM""**//#tyy$:R:R:WVWX"""5I4+>+>+F+F+HI
"r$   c                   | j                   dk(  r| j                  dk(  rt        t        j                  k(  r| j
                  .| j                  j                  | j
                  d       d| _        nd| _        | j                  j                  | j                  t        j                  j                        | _        y | j                  sy | j
                  B| j                  j                  | j
                  d       | j                  j                  d      }n| j                  j                  d      }| j                  J | j                  || j                        }| j                  | _        | j                  j                  | _        |j                  dk(  r(| j                  j!                  || j                  |       y | j                  j!                  || j                         y )Nr   ry   rx   rC   )r`   r   r   r   r"   r   ra   r   r   r   r   r   r   r   r   r   r   )r0   frame_ims     r%   load_endzGifImageFile.load_end  sW   <<1yyC$48R8R$R++7GG++D,D,DaH!'DJ!&DJ''//$))U\\5P5PQ}}##/GG##D$<$<a@wwv.Hwwu-H""...::h(;(;<--WW\\
==F"GGMM(D$7$7BGGMM(D$7$78r$   c                    | j                   S N)r`   )r0   s    r%   rM   zGifImageFile.tell  s    ||r$   )r   zbytes | None)r7   bytesr   bool)r   None)r   r   )r   r   )rb   r   r   r   )T)rb   r   r   r   r   r   )r   r   r   formatformat_description!_close_exclusive_fp_after_loadingrJ   r2   r9   rT   propertyrZ   r   r\   rX   rP   r   r   rM   __classcell__)r   s   @r%   r+   r+   N   sk    F)(-%N6 	 	  "+ |!|(98r$   r+   rz   ry   )1rz   ry   c                   | j                   t        v r| j                          | S t        j                  | j                         dk(  r| j                  dt        j                  j                        } | j                  j                   dk(  rL| j                  j                  D ]3  }|d   dk(  s| j                  j                  |   | j                  d<    | S  | S | j                  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
    rC   ry   rK   rx   r4   r   r|   rz   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErK   colorsrE   )ra   rgbas     r%   _normalize_moder     s     
ww'
		!U*ZZU]]%;%;Z<::??f$

))7a<.0jj.?.?.EBGGN+		 * 	::c?r$   c                   d}|rXt        |t        t        t        f      rt        |dd       }t        |t        j                        rt        |j
                        }| j                  dk(  r!|sX| j                  j                  d      dd }n9|st        d t        d      D              }t	        j                  d|      | _        |rg }|J t        dt        |      d      D ]O  }t        |||dz          }| j
                  j                  j                  |      }||v rd}|j                  |       Q t        |      D ],  \  }}|	t        t        |            D ]  }||vs|||<    , . | j!                  |      } n@t#        | |      }|2| j!                  ||      } d	|v r	 |j%                  |d	         |d	<   | S | S || j
                  _        | S # t&        $ r |d	= Y | S w xY w)
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   ry   rC   c              3  &   K   | ]	  }|d z    yw)r4   Nr#   ).0r8   s     r%   	<genexpr>z%_normalize_palette.<locals>.<genexpr>  s     &Bz!qAvzs   r   r   r4   r|   )
isinstancer   	bytearraylistr   rK   r   ra   
getpaletter5   r6   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )	ra   rK   rE   source_paletteused_palette_colorsr8   source_colorr   js	            r%   _normalize_paletter     s    Ngy$78&wt}5Ng|889&w7N	ww#~UU--e4Tc:N&&BuSz&BBN!..unM
  )))q#n-q1A AE!:;LJJ%%)),7E++&&u- 2 ""56HAu}s#678A 3312+A. 9 7 12+B5*!!"5~FB%-+>+D+D^,,D(
 I2I'BJJI " -^,I-s   'G G%$G%c           	        t        |       }|j                  j                         D ]!  \  }}| j                  j	                  ||       # t        ||| j                        }t        || j                        D ]  }|j                  |        d}t        |       r|dz  }t        || d|       dt        |       f|_
        t        j                  ||dd| j                  z   dt        |j                     fg       |j                  d       y )Nr   rw   r   r   r=   r       )r   rE   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   )ra   r.   rK   im_outr   vr1   rR   s           r%   _write_single_framer   ?  s    
 R F!!#1
!!!Q' $@F7
 8 ER
B.}R01FOOFB%"'')91gfkk>R!S TUHHUOr$   c                    t        |      t        |       k7  r"|j                  d      }| j                  d      } t        j                  ||       }||j	                  d      fS )Nrx   F)
alpha_only)_get_palette_bytesr   r   subtract_modulogetbbox)base_imim_framedeltas      r%   _getbboxr   X  s]     (#'9''BB##F+//&)&&x9E%--5-111r$   c                  ,    e Zd ZU ded<   ded<   ded<   y)_FrameImage.Imagera   z tuple[int, int, int, int] | Nonebboxdict[str, Any]r   N)r   r   r   __annotations__r#   r$   r%   r   r   b  s    O
**r$   r   c           	     \
   | j                   j                  d      }| j                   j                  d| j                  j                  d            }g }d }d}d }t        j                  | g| j                   j                  dg             D ]  }	t        j                  |	      D ]  }
t        |
j                               }
|dk(  rD|
j                  j                         D ]'  \  }}|dk(  r| j                   j                  ||       ) | j                   j                         }d|
j                  v r|j                  d|
j                  d          t        |
||      }
t        |t        t        f      r	||   |d<   n"| d|
j                  v r|
j                  d   |d<   t        |t        t        f      r||   |d<   |dz  }d }|rP|rMt        ||
      \  }}|s0|j                  d      r|d   j                   dxx   |d   z  cc<   g|d   j                   j                  d      dk(  r|| j                   j                  d| j                  j                  dd	            }t!        |
|      }t#        j$                  d
|
j&                  |      }|j)                  |d   j*                  j,                         t        ||
      d   }nO|j                  d      r=|
j.                  dk7  r-d|vr	 |
j,                  j1                  |
      |d<   d|v r|
j                         }t#        j$                  d
|j&                  |d         }|j.                  dk(  r1|j5                         \  }}}}t7        j8                  d ||||      }nh|j.                  d
k(  rAt#        j$                  d|j&                        }|j;                  |j=                                |}t7        j8                  d |      }|j?                  |tA        jB                  |             nd }|
}|jE                  tG        |xs |
||               tI        |      dk(  r.d| j                   v r|d   j                   d   | j                   d<   y|D ]  }|j*                  }
|jJ                  s/tM        |
|j                         D ]  }|jO                  |        d}n;|sd|j                   d<   |
jQ                  |jJ                        }
|jJ                  d d }tS        ||
||j                           y# t2        $ r Y w xY w)Nrl   disposalr   append_imagesr|   r   rg   r   )r   r   r   ry   optimizer   rx   c                t     | d    | d    | d    | d   | d   | d         | d         | d         dz  d      S )	Nr   r   rgbarp   r   r#   argss    r%   <lambda>z(_write_multiple_frames.<locals>.<lambda>  sb    _T)_$/DK(3U,7DKS	49,MtTWy)* )-S		%& '*%* %(	."r$   )r   r   r  r  rz   c                &     | d   | d   dz  d      S )Nr   ra   rp   r   r#   r  s    r%   r  z(_write_multiple_frames.<locals>.<lambda>  s    _T)_T$Z#=Ms-Sr$   ra   )maskFr   Tinclude_color_table)*r   r   rE   	itertoolschainr   Iteratorr   r{   r   r   r   r   r   r   r   _get_backgroundr   newr   r   ra   rK   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r   r6   r   r   r   crop_write_frame_data)ra   r.   rK   rl   r   	im_framesprevious_imframe_countbackground_im
imSequencer   r   r   r   
diff_framer   r   r   rB   r   r   r   r  r  r  delta_l
frame_datar1   offsets                                r%   _write_multiple_framesr  h  s    ~~!!*-H~~!!*bggkk*.EFH I&*KKMoordBNN,>,>PR,ST
%..z:H&x}}7Ha$MM//1DAqN* NN--a3 2
 ..--/K.&&~x}}^7TU)(G[IH(T5M2*2;*?J'!jHMM&A*2--
*CJ'(T5M2*2;*?J'1KJ[&{H=t"z2!"11*=ZAXX=R=,,00<A$, " 2 2*BGGKK	,R! &5Xu%E
(-		#x}}j(Q%0011H1HI#M8<Q?D __Z0X]]c5I%[8! ( 0 0 A A( K (7
 &4%-]]_
$yyejj+n:UV ::/).JAq!Q#,#8#8	!" #$"#"#"#$D"  %zzS0*/))C*D ' @(/#,#8#8 S#($D #((HOOD4I(J"KVJ$:(D+NOg ; Ul 9~')21)A)A*)MBNN:&
=='*2H2HI JF @D
&&'<=}}Z__5H__Ra(F"h
0F0FG   {  * ! !s   0T	T+*T+c                "    t        | ||d       y )NT)save_all)r   )ra   r.   filenames      r%   	_save_allr#    s    	"b(T*r$   Fc                x   d| j                   v sd| j                  v r6| j                   j                  d| j                  j                  d            }nd }| j                   j                  dd       |rt	        | ||      st        | ||       |j                  d       t        |d      r|j                          y y )NrK   r   Tri   flush)	r   rE   r   r   r  r   r   hasattrr%  )ra   r.   r"  r!  rK   s        r%   r   r     s     BNN"i277&:..$$YI0FG
!!*d31"b'BBG,HHTNr7

 r$   c                r    | j                   j                  dd      }t        | j                        dk  rd}|S )Nr   r      r   )r   r   minr   )ra   r   s     r%   r   r     s5    "";2I 277|b	r$   c                   	 |j                   d   }d|j                   v rt        |j                   d   dz        }nd}t        |j                   j                  dd            }||dk7  s|rk|dnd}||dz  z  }| j	                  dt        d	      z   t        d
      z   t        |      z   t        |      z   t        |xs d      z   t        d      z          |j                   j                  d      }|r"t        |      }	t        |	      }
|
r
|dz  }||
z  }| j	                  dt        |d         z   t        |d         z   t        |j                  d         z   t        |j                  d         z   t        |      z          |r
r| j	                  t        	             | j	                  t        d             y # t        $ r d }Y w xY w)Nr|   rl   r>   r   r   r   r   rj   rk   rv   r	  r@   rt   r=   )r   KeyErrorr   r   r   r   o16r   _get_color_table_sizer   _get_header_palette)r.   ra   r  rR   r|   rl   r   packed_flagr	  palette_bytescolor_table_sizes              r%   r   r     s   ~~n5 R^^#r~~j1B672>>%%j!45H8q=H'3ax1}$
ge o (m	
 "#$ e	
 ..,,-BC*2.0?CKE,,EHH
fQi.	
fQi.	 bggaj/	 bggaj/		
 U)	 /
$]34HHRUOU  s   F; ;G
	G
c                @   | j                         }	 t        |d      5 }| j                  dk7  r)t        j                  d|g|t        j
                         ndd|g}dg}t        j                  |t        j                  t        j
                        }t        j                  ||j                  |t        j
                        }|j                  J |j                  j                          |j                         }	|	rt        j                  |	|      |j                         }	|	rt        j                  |	|      d d d        	 t        j                  |       y # 1 sw Y    xY w# t        $ r Y y w xY w# 	 t        j                  |       w # t        $ r Y w w xY wxY w)NwbrC   ppmtogif)stdoutstderrppmquant256)stdinr5  r6  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPEr5  closewaitCalledProcessErrorosunlinkOSError)
ra   r.   r"  tempfilerd   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r%   _save_netpbmrM  3  sn    xxzH$(D!Qww%%%*1Z=O=O (9	'L	'--jooj>P>P
 (--$++%--	
 "((444!!'')$//+$77KK$//+$77KK= "@	IIhC "!D  			IIh 		sY   E6 DE<E6 E' E$ E6 '	E32E36F8FF	FFFFc                F   | j                   dv r|r|j                  d      rt        xs | j                   dk(  }|s| j                  | j                  z  dk  rg }t        | j                               D ]  \  }}|s	|j                  |        |st        |      t        |      k\  r|S t        | j                  j                        t        j                  | j                  j                         z  }d|dz
  j                         z  }t        |      |dz  k  r|dkD  r|S y)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
    )ry   rz   r   rz   i   r   r   N)r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r6   rK   r   getmodebands
bit_length)ra   rE   optimiser   r8   countnum_palette_colorscurrent_palette_sizes           r%   r   r   h  s    
ww*$((:*> #4bggnrxx"))+i7"$%blln55'..q1 6 323s;N7OO**!$RZZ%7%7!8E<N<N

= " $%);a)?(K(K(M#M  '(,@A,EE(1,**r$   c                    | syt        |       dk  ryt        j                  t        j                  t        |       dz  d            dz
  S )Nr   ru   r   r4   r   )r6   mathceillog)r0  s    r%   r-  r-    sA    	]	a	yy#m"4"91=>BBr$   c                v    t        |       }d|z  t        |       dz  z
  }|dkD  r| t        d      dz  |z  z  } | 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   r4   r   )r-  r6   r   )r0  r1  actual_target_size_diffs      r%   r.  r.    sR     -];  !$44M8Ja8OO"A%<<<r$   c                J    | 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
    r$   r   r  s    r%   r   r     s     "$2::44r$   c                    d}|r1t        |t              r	 | j                  j                  ||       }|S |}|S # t        $ r}t        |      dvr Y d }~|S d }~ww xY w)Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   r   rK   getcolorr   str)ra   info_backgroundrB   re   s       r%   r  r    s{     Jou-
ZZ00"E
  )J  q6 "   s   8 	AAAc                   d}| j                   j                  d      dk(  s9|r9d|v s3|j                  d      "|j                  d      s|j                  d      rd}t        | |j                  d            }t        |       }t	        |      }d	|z   t        | j                  d
         z   t        | j                  d         z   t        |dz         t        |      t        d
      z   t        |      g}|j                  d      _|j                  dt        d      z   t        d      z   dz   t        d      z   t        d      z   t        |d         z   t        d
      z          |j                  d      rdt        d      z   }|d   }t        |t              r|j                         }t        d
t        |      d      D ]$  }	||	|	dz    }
|t        t        |
            |
z   z  }& |t        d
      z  }|j                  |       |S )z2Return a list of strings representing a GIF headers   87ar<   s   89ar|   rs   rl   rh   rB   s   GIFr   r   r@   rj   rp   rA   rr   r4   rn   )rE   r   r  r   r-  r,  r   r   r.  r   r   rb  encoder5   r6   )ra   rE   r<   rB   r0  r1  headercomment_blockrh   r8   subblocks              r%   r   r     s     G	ww{{9'd"xx+xx
#xx	"  TXXl%;<J&r*M,]; 	
	
bggaj/	 bggaj/	 	c!"
:AM*F xx#gf  e	
 e $v,  e		
 xx	r#wy/gs#nn&Gq#g,,Aq1s7+HRH.99M - 	Am$Mr$   c           	         	 ||_         t        | ||d       t        j                  || dd|j                  z   dt
        |j                     fg       | j                  d       |` y # |` w xY w)Nr   r   r   r   )r   r   r   r   r   r   r   r   )r.   r   r  paramss       r%   r  r    sj    !% 	B&!4bE6HMM#91ghmm>TUV	
 	 H s   A A% %A)c                    |i }t        | |      }d|vr d| j                  v r| 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)

    rB   )r   rE   r   rK   ra   r   )ra   rK   rE   r   im_modrf  s         r%   	getheaderrm  .  s}     |'D14LBGG$;WW\2\GT2FBJIIBED)F&&&r$   c                    ddl m}  G d d|      }| j                           |       }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

    r   )BytesIOc                  L    e Zd Zg Zej
                  dk\  rddlmZ ddZyddZy)	getdata.<locals>.Collector)r4      r   )Bufferc                N    | j                   j                  |       t        |      S r   r2   r   r6   r0   r2   s     r%   r   z getdata.<locals>.Collector.writeg      		  &4y r$   c                N    | j                   j                  |       t        |      S r   ru  rv  s     r%   r   z getdata.<locals>.Collector.writem  rw  r$   N)r2   rs  r   r   )r2   r   r   r   )	r   r   r   r2   sysversion_infocollections.abcrs  r   r#   r$   r%   	Collectorrq  a  s"    w&.!!r$   r|  )ioro  r   r  r2   )ra   r  rj  ro  r|  r.   s         r%   r   r   L  s<    & !G !  GGI	Bb"ff-77Nr$   z.gifz	image/gif)r(   r   r   r   )ra   r   r   r   )ra   r   rK   _Palette | NonerE   r   r   r   )ra   r   r.   	IO[bytes]rK   r~  r   r   )r   r   r   r   r   z4tuple[Image.Image, tuple[int, int, int, int] | None])ra   r   r.   r  rK   r~  r   r   )ra   r   r.   r  r"  str | bytesr   r   )F)
ra   r   r.   r  r"  r  r!  r   r   r   )ra   r   r   r   )
r.   r  ra   r   r  tuple[int, int]rR   r   r   r   )ra   r   rE   r   r   zlist[int] | None)r0  r   r   r   )r0  r   r   r   )ra   r   r   r   )ra   r   rc  z=int | tuple[int, int, int] | tuple[int, int, int, int] | Noner   r   )ra   r   rE   r   r   list[bytes])
r.   r  r   r   r  r  rj  r   r   r   )NN)ra   r   rK   r~  rE   zdict[str, Any] | Noner   z$tuple[list[bytes], list[int] | None])r   )ra   r   r  r  rj  r   r   r  )G
__future__r   r
  rZ  rD  r<  ry  enumr   	functoolsr   typingr   r   r   r	   r
   r   r    r   r   r   r   r   r   r   _binaryr   rF   r   r   r,  r   r   r    r   r)   r+   r   r   r   r   r   _Paletter   r   r   r   r  r#  r   r   r   rM  rO  r   r-  r.  r   r  r   r  rm  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer#   r$   r%   <module>r     s  4 #   	  
  % K K K   "  !g  #22 0K9&& Kd #C
(2 	49l.G.GGH==-=5C==@  
	222$/292 Z  uu"u-<u	up+
 MR".9EI	&//"/,;/DG/	/d-d ,^C$5R 	4;|!!! ! 	!
 
!4 UY''-'<Q')'> 06++,+AD++b   L''w ?   L'' /   ++Y 7   ,,f 5   L'' 5r$   