Ë
    îÿæi(±  ã            	       óø  — d dl Z d dlmZmZmZm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 	 d,de
j"                  dee   dee   fd	„Zi fd
edee   deeef   fd„Zd-d„Zdee   defd„Zdee   dedee   fd„Zdedededee   fd„Z G d„ d«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ d e«      Z G d!„ d"e«      Z  G d#„ d$e«      Z! G d%„ d&e«      Z"d'„ Z# G d(„ d)e«      Z$ G d*„ d+e«      Z%y).é    N)ÚAnyÚDictÚListÚOptional)Útree_flattenÚtree_mapÚtree_unflattené   ©Úcreate_causal_maskÚmodelÚmax_kv_sizeÚreturnc                 ó  — t        | d«      r| j                  «       S t        | j                  «      }|�$t	        |«      D �cg c]  }t        |d¬«      ‘Œ c}S t	        |«      D �cg c]  }t        «       ‘Œ c}S c c}w c c}w )aÍ  
    Construct the model's cache for use in generation.

    This function will defer the cache construction to the model if it has a
    ``make_cache`` method, otherwise it will make a default KV cache.

    Args:
        model (nn.Module): The language model.
        max_kv_size (Optional[int]): If provided and the model does not have a
            ``make_cache`` method, a ``RotatingKVCache`` is used with a maximum
            size of ``max_kv_size``
    Ú
make_cacheé   )Úmax_sizeÚkeep)Úhasattrr   ÚlenÚlayersÚrangeÚRotatingKVCacheÚKVCache)r   r   Ú
num_layersÚ_s       úh/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_lm/models/cache.pyÚmake_prompt_cacher      s„   € ô  ˆu�lÔ#Ø×ÑÓ!Ð!ä�U—\‘\Ó"€JØÐäCHÈÔCTó
ÙCT¸aŒO [°qÖ9ÐCTñ
ð 	
ô $)¨Ô#4Ó5Ñ#4˜a”•	Ð#4Ñ5Ð5ùò	
ùò 6s   ÁA9Á%A>Ú	file_nameÚcacheÚmetadatac                 óR  — |D �cg c]  }|j                   ‘Œ }}|D �cg c]  }|j                  ‘Œ }}t        t        |«      «      }|D �cg c]  }t	        |«      j
                  ‘Œ }}|||g}t        t        |«      «      }t        j                  | ||«       yc c}w c c}w c c}w )a  
    Save a pre-computed prompt cache to a file.

    Args:
        file_name (str): The ``.safetensors`` file name.
        cache (List[Any]): The model state.
        metadata (Dict[str, str]): Optional metadata to save along with model
            state.
    N)ÚstateÚ
meta_stateÚdictr   ÚtypeÚ__name__ÚmxÚsave_safetensors)r   r    r!   ÚcÚ
cache_dataÚ
cache_infoÚcache_classesÚcache_metadatas           r   Úsave_prompt_cacher/   )   s™   € ñ $)Ó)¡5˜a�!—'“' 5€JÐ)Ù(-Ó.© 1�!—,“,¨€JÐ.Ü”l :Ó.Ó/€JÙ/4Ó5©u¨!”T˜!“W×%Ó%¨u€MÐ5Ø  (¨MÐ:€NÜœ, ~Ó6Ó7€NÜ×Ñ˜	 :¨~Õ>ùò *ùÚ.ùâ5s   …BžBÁB$c           	      ób  — t        j                  | d¬«      \  }}t        t        |j	                  «       «      «      }t        t        |j	                  «       «      «      }|\  }}}t        |||«      D ���	cg c]#  \  }}}	t        «       |   j                  ||	«      ‘Œ% }
}}}	|r|
|fS |
S c c}	}}w )aR  
    Load a prompt cache from a file.

    Args:
        file_name (str): The ``.safetensors`` file name.
        return_metadata (bool): Whether or not to return metadata.
            Default: ``False``.

    Returns:
        List[Any] or Tuple[List[Any], Dict[str, str]]: The prompt cache and
            the metadata if requested.
    T)Úreturn_metadata)r(   Úloadr	   ÚlistÚitemsÚzipÚglobalsÚ
from_state)r   r1   Úarraysr.   Úinfor!   Úclassesr*   r#   r$   r    s              r   Úload_prompt_cacher;   <   s°   € ô  ŸW™W YÀÔEÑ€FˆNÜœD §¡£Ó0Ó1€FÜ#¤D¨×)=Ñ)=Ó)?Ó$@ÓA€NØ,Ñ€Dˆ(�Gô %(¨°¸Ô$>õá$>Ñ ˆAˆu�jô 	‹	�!‰×Ñ  zÕ2Ø$>ð 
ò ñ Ø�hˆÐØ€Lùôs   Á6(B*c                 ó&   — t        d„ | D «       «      S )z0
    Check if model's cache can be trimmed.
    c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­w©N©Úis_trimmable©Ú.0r*   s     r   Ú	<genexpr>z(can_trim_prompt_cache.<locals>.<genexpr>Z   s   è ø€ Ð/© Aˆq�~‰~×©ùó   ‚)Úall©r    s    r   Úcan_trim_prompt_cacherG   V   s   € ô Ñ/©Ó/Ó/Ð/ó    Ú
num_tokensc                 ó„   — t        | «      rt        | «      dk(  ry| D �cg c]  }|j                  |«      ‘Œ c}d   S c c}w )aj  
    Trim the model's cache by the given number of tokens.

    This function will trim the cache if possible (in-place) and return the
    number of tokens that were trimmed.

    Args:
        cache (List[Any]): The model's cache.
        num_tokens (int): The number of tokens to trim.

    Returns:
        (int): The number of tokens that were trimmed.
    r   )rG   r   Útrim)r    rI   r*   s      r   Útrim_prompt_cacherL   ]   s?   € ô ! Ô'¬3¨u«:¸ª?ØÙ(-Ó.© 1ˆA�F‰F�:Õ¨Ñ.¨qÑ1Ð1ùÒ.s   Ÿ=ÚNÚoffsetÚreturn_arrayÚwindow_sizec                 óP   — |�t        | ||¬«      S | dk(  ry |rt        | ||¬«      S y)N©rP   r
   Úcausalr   )rM   rN   rO   rP   s       r   Úcreate_attention_maskrT   p   s8   € ð ÐÜ! ! V¸ÔEÐEØ	
ˆaŠØÙ	Ü! ! V¸ÔEÐEàrH   c                   ó¦   — e Zd Zed„ «       Zej
                  d„ «       Zed„ «       Zej
                  d„ «       Zd„ Zd„ Zed„ «       Z	d„ Z
ed	„ «       Zy
)Ú
_BaseCachec                 ó   — g S r>   © ©Úselfs    r   r#   z_BaseCache.state~   s   € àˆ	rH   c                 ó$   — |�|rt        d«      ‚y y )Nz,This cache has no state but a state was set.©Ú
ValueError©rZ   Úvs     r   r#   z_BaseCache.state‚   s   € àˆ=™QÜÐKÓLÐLð ˆ=rH   c                  ó   — y)NÚ rX   rY   s    r   r$   z_BaseCache.meta_state‡   s   € àrH   c                 ó$   — |�|rt        d«      ‚y y )Nz6This cache has no meta_state but a meta_state was set.r\   r^   s     r   r$   z_BaseCache.meta_state‹   s   € àˆ=™QÜÐUÓVÐVð ˆ=rH   c                  ó   — y©NFrX   rY   s    r   r@   z_BaseCache.is_trimmable�   s   € ØrH   c                  ó   — y)zÓ
        Return the size (i.e. sequence length) of the cache.

        Not every cache is required to implement this, in which case the size
        will always be 0 (though the cache may not be empty).
        r   rX   rY   s    r   Úsizez_BaseCache.size“   s   € ð rH   c                 ó   — t        d«      ‚)z&Return the size of this cache in bytesz%Cache sub-class must implement nbytes©ÚNotImplementedErrorrY   s    r   Únbytesz_BaseCache.nbytesœ   s   € ô "Ð"IÓJÐJrH   c                 ó   — t        d«      ‚)z6
        Return if the cache is empty or not.
        z$Cache sub-class must implement this.rh   rY   s    r   Úemptyz_BaseCache.empty¡   s   € ô "Ð"HÓIÐIrH   c                 óD   — | j                  | «      }||_        ||_        |S r>   )Ú__new__r#   r$   )Úclsr#   r$   Úobjs       r   r7   z_BaseCache.from_state§   s%   € ð �k‰k˜#ÓˆØˆŒ	Ø#ˆŒØˆ
rH   N)r'   Ú
__module__Ú__qualname__Úpropertyr#   Úsetterr$   r@   rf   rj   rl   Úclassmethodr7   rX   rH   r   rV   rV   }   s˜   „ Øñó ðð ‡\�\ñMó ðMð ñó ðð ×ÑñWó ðWòòð ñKó ðKòJð ñó ñrH   rV   c                   óx   — e Zd ZdZd„ Zd„ Zed„ «       Zej                  d„ «       Zd„ Z	d„ Z
d„ Zd	„ Zed
„ «       Zy)ÚConcatenateKVCachea  ConcatenateKVCache the simplest KV cache implementation.

    Can be used as a mock KV cache or when large blocks are being processed at
    a time in which case KVCache isn't necessarily faster. Consider using the
    KVCache with a larger step size before using this cache.
    c                 ó.   — d | _         d | _        d| _        y ©Nr   ©ÚkeysÚvaluesrN   rY   s    r   Ú__init__zConcatenateKVCache.__init__¸   ó   € ØˆŒ	ØˆŒØˆ�rH   c                 óD  — | j                   €|| _         || _        nPt        j                  | j                   |gd¬«      | _         t        j                  | j                  |gd¬«      | _        | j                   j                  d   | _        | j                   | j                  fS )Néþÿÿÿ©Úaxis)r{   r|   r(   ÚconcatenateÚshaperN   ©rZ   r{   r|   s      r   Úupdate_and_fetchz#ConcatenateKVCache.update_and_fetch½   sw   € Ø�9‰9ÐØˆDŒIØ ˆD�KäŸ™¨¯	©	°4Ð'8¸rÔBˆDŒIÜŸ.™.¨$¯+©+°vÐ)>ÀRÔHˆDŒKØ—i‘i—o‘o bÑ)ˆŒà�y‰y˜$Ÿ+™+Ð%Ð%rH   c                 ó2   — | j                   | j                  fS r>   ©r{   r|   rY   s    r   r#   zConcatenateKVCache.stateÈ   s   € à�y‰y˜$Ÿ+™+Ð%Ð%rH   c                 ó^   — |\  | _         | _        | j                   j                  d   | _        y )Nr€   ©r{   r|   r„   rN   r^   s     r   r#   zConcatenateKVCache.stateÌ   s$   € à!"ÑˆŒ	�4”;Ø—i‘i—o‘o bÑ)ˆ�rH   c                  ó   — y©NTrX   rY   s    r   r@   zConcatenateKVCache.is_trimmableÑ   ó   € ØrH   c                 ó\   — t        | j                  |«      }| xj                  |z  c_        |S r>   ©ÚminrN   ©rZ   Úns     r   rK   zConcatenateKVCache.trimÔ   ó%   € Ü�—‘˜QÓˆØ�Š�qÑ�ØˆrH   c                 ó0   — t        |d| j                  i|¤ŽS ©NrN   ©rT   rN   ©rZ   ÚargsÚkwargss      r   Ú	make_maskzConcatenateKVCache.make_maskÙ   ó   € Ü$ dÐI°4·;±;ÐIÀ&ÑIÐIrH   c                 ó   — | j                   d u S r>   ©r{   rY   s    r   rl   zConcatenateKVCache.emptyÜ   ó   € Ø�y‰y˜DÐ Ð rH   c                 óv   — | j                   €y| j                   j                  | j                  j                  z   S ry   ©r{   rj   r|   rY   s    r   rj   zConcatenateKVCache.nbytesß   ó.   € à�9‰9ÐØØ�y‰y×Ñ $§+¡+×"4Ñ"4Ñ4Ð4rH   N)r'   rq   rr   Ú__doc__r}   r†   rs   r#   rt   r@   rK   rš   rl   rj   rX   rH   r   rw   rw   °   sf   „ ñòò
	&ð ñ&ó ð&ð ‡\�\ñ*ó ð*òòò
Jò!ð ñ5ó ñ5rH   rw   c                   ó¸   — e Zd ZdZddedefd„Zd„ Zed„ «       Zej                  d„ «       Zed„ «       Z
e
j                  d	„ «       Z
d
„ Zd„ Zd„ Zd„ Zed„ «       Zy)ÚQuantizedKVCacheé   Ú
group_sizeÚbitsc                 óJ   — d | _         d | _        d| _        || _        || _        y ry   )r{   r|   rN   r¦   r§   ©rZ   r¦   r§   s      r   r}   zQuantizedKVCache.__init__é   s%   € ØˆŒ	ØˆŒØˆŒØ$ˆŒØˆ�	rH   c                 óÊ  ‡ ‡‡‡‡— ‰j                   \  }}}}|j                   d   }‰ j                  Š‰ j                  �#‰|z   ‰ j                  d   j                   d   kD  �rdt        j                  j
                  z  ‰ j                  z  Š‰ j                  |z   dz
  ‰ j                  z  ‰ j                  z  }|||fŠˆˆˆ ˆfd„}	ˆfd„}
‰ j                  �t‰‰ j                  z  dk7  r2t        ˆfd„‰ j                  ‰ j                  f«      \  ‰ _        ‰ _	        t        |
‰ j                  ‰ j                  f«      \  ‰ _        ‰ _	        n |	|«       |	|«      c‰ _        ‰ _	        ‰ xj                  |z  c_        t        j                  ‰‰ j                  ‰ j                  ¬	«      Št        j                  |‰ j                  ‰ j                  ¬	«      }t        t        ‰ j                  «      «      D ]N  }‰|   ‰ j                  |   d
‰‰ j                  …d d …f<   ||   ‰ j                  |   d
‰‰ j                  …d d …f<   ŒP t        ˆ fd„‰ j                  ‰ j                  f«      S )Néÿÿÿÿr   r€   é   r
   c                 ó(  •— t        j                  g ‰¢| ‰z  ‘­t         j                  ¬«      t        j                  g ‰¢| ‰j                  z  ‘­‰j                  ¬«      t        j                  g ‰¢| ‰j                  z  ‘­‰j                  ¬«      fS )N©Údtype)r(   ÚzerosÚuint32r¦   r¯   )ÚdimÚ
el_per_intr{   rZ   r„   s    €€€€r   Ú
init_quantz5QuantizedKVCache.update_and_fetch.<locals>.init_quantú   s{   ø€ ä—H‘HÐ8˜uÐ8 c¨ZÑ&7Ñ8ÄÇ	Á	ÔJÜ—H‘HÐ=˜uÐ= c¨T¯_©_Ñ&<Ñ=ÀTÇZÁZÔPÜ—H‘HÐ=˜uÐ= c¨T¯_©_Ñ&<Ñ=ÀTÇZÁZÔPðð rH   c                 óœ   •— t        j                  g ‰¢| j                  d   ‘­| j                  ¬«      }t        j                  | |gd¬«      S )Nr«   r®   r€   r�   )r(   r°   r„   r¯   rƒ   )ÚxÚnew_xr„   s     €r   Úexpand_quantz7QuantizedKVCache.update_and_fetch.<locals>.expand_quant  s?   ø€ ÜŸ™Ð!6 5Ð!6¨!¯'©'°"©+Ñ!6¸a¿g¹gÔF�Ü—~‘~ q¨% j°rÔ:Ð:rH   c                 ó   •— | dd ‰…d d …f   S ©N.rX   )r¶   Úprevs    €r   Ú<lambda>z3QuantizedKVCache.update_and_fetch.<locals>.<lambda>  s   ø€  ! C¨¨$¨² MÒ"2rH   ©r¦   r§   .c                 ó0   •— | dd ‰j                   …d d …f   S rº   ©rN   ©r¶   rZ   s    €r   r¼   z3QuantizedKVCache.update_and_fetch.<locals>.<lambda>  s   ø€  ! C¨¨4¯;©;¨ºÐ$9Ò":rH   )r„   rN   r{   r(   r±   rf   r§   Ústepr   r|   Úquantizer¦   r   r   )rZ   r{   r|   ÚBÚ
n_kv_headsÚ	num_stepsÚ
k_head_dimÚ
v_head_dimÚ	new_stepsr´   r¸   Úir³   r»   r„   s   ``          @@@r   r†   z!QuantizedKVCache.update_and_fetchð   sò  ü€ Ø/3¯z©zÑ,ˆˆ:�y *Ø—\‘\ "Ñ%ˆ
Ø�{‰{ˆà�9‰9Ð ¨	Ñ!1°T·Y±Y¸q±\×5GÑ5GÈÑ5KÓ KØœRŸY™YŸ^™^Ñ+¨t¯y©yÑ8ˆJØŸ™ YÑ.°Ñ2°t·y±yÑ@À4Ç9Á9ÑLˆIØ˜
 IÐ.ˆE÷ô;ð �y‰yÐ$Ø˜$Ÿ)™)Ñ# qÒ(Ü-5Û2°T·Y±YÀÇÁÐ4Ló.Ñ*�D”I˜tœ{ô *2Ø  4§9¡9¨d¯k©kÐ":ó*Ñ&�”	˜4�;ñ *4°JÓ)?ÁÈJÓAWÐ&�”	˜4œ;à�Š�yÑ �ä�{‰{˜4¨D¯O©OÀ$Ç)Á)ÔLˆÜ—‘˜V°·±ÀdÇiÁiÔPˆÜ”s˜4Ÿ9™9“~Ö&ˆAØ7;¸A±wˆD�I‰I�a‰L˜˜d T§[¡[Ð0²!Ð3Ñ4Ø9?À¹ˆD�K‰K˜‰N˜3  t§{¡{Ð 2²AÐ5Ò6ð 'ô Ó:¸T¿Y¹YÈÏÉÐ<TÓUÐUrH   c                 óÐ   ‡ — ‰ j                   ‰ j                  d   j                  d   k(  r‰ j                  ‰ j                  fS t	        ˆ fd„‰ j                  ‰ j                  f«      S )Nr   é   c                 ó0   •— | dd ‰j                   …d d …f   S rº   r¿   rÀ   s    €r   r¼   z(QuantizedKVCache.state.<locals>.<lambda>!  s   ø€ ˜!˜C  4§;¡; ²Ð1Ò2rH   )rN   r{   r„   r|   r   rY   s   `r   r#   zQuantizedKVCache.state  sT   ø€ à�;‰;˜$Ÿ)™) A™,×,Ñ,¨QÑ/Ò/Ø—9‘9˜dŸk™kÐ)Ð)äÛ2°T·Y±YÀÇÁÐ4Lóð rH   c                 ó"   — |\  | _         | _        y r>   rˆ   r^   s     r   r#   zQuantizedKVCache.state$  ó   € à!"ÑˆŒ	�4•;rH   c                 óv   — t        t        t        | j                  | j                  | j
                  f«      «      S r>   )ÚtupleÚmapÚstrrN   r¦   r§   rY   s    r   r$   zQuantizedKVCache.meta_state(  s'   € ä”Sœ˜tŸ{™{¨D¯O©O¸T¿Y¹YÐGÓHÓIÐIrH   c                 óJ   — t        t        |«      \  | _        | _        | _        y r>   )rÑ   ÚintrN   r¦   r§   r^   s     r   r$   zQuantizedKVCache.meta_state,  s   € ä25´c¸1³+Ñ/ˆŒ�T”_ d¥irH   c                  ó   — yrŒ   rX   rY   s    r   r@   zQuantizedKVCache.is_trimmable0  r�   rH   c                 ó\   — t        | j                  |«      }| xj                  |z  c_        |S r>   r�   r‘   s     r   rK   zQuantizedKVCache.trim3  r“   rH   c                 ó0   — t        |d| j                  i|¤ŽS r•   r–   r—   s      r   rš   zQuantizedKVCache.make_mask8  r›   rH   c                 ó   — | j                   d u S r>   r�   rY   s    r   rl   zQuantizedKVCache.empty;  rž   rH   c                 óJ   — t        d„ | j                  | j                  fd«      S )Nc                 ó    — | |j                   z   S r>   ©rj   )Úar¶   s     r   r¼   z)QuantizedKVCache.nbytes.<locals>.<lambda>@  s   € ¨¨A¯H©HªrH   r   )Útree_reducer{   r|   rY   s    r   rj   zQuantizedKVCache.nbytes>  s    € äÑ4°t·y±yÀ$Ç+Á+Ð6NÐPQÓRÐRrH   N)é@   r¬   )r'   rq   rr   rÁ   rÔ   r}   r†   rs   r#   rt   r$   r@   rK   rš   rl   rj   rX   rH   r   r¤   r¤   æ   s¨   „ Ø€Dñ 3ð °3ó ò)VðV ñó ðð ‡\�\ñ#ó ð#ð ñJó ðJð ×Ññ>ó ð>òòò
Jò!ð ñSó ñSrH   r¤   c                   ó¤   — e Zd ZdZd„ Zd„ Zd„ Zed„ «       Zej                  d„ «       Zd„ Z
d„ Zdd	ed
edefd„Zd„ Zed„ «       Zd„ Zed„ «       Zy)r   r¥   c                 ó.   — d | _         d | _        d| _        y ry   rz   rY   s    r   r}   zKVCache.__init__F  r~   rH   c                 óœ  — | j                   }| j                  �-||j                  d   z   | j                  j                  d   kD  �rf|j                  \  }}}}|j                  d   }| j                  |j                  d   z   dz
  | j                  z  }	|||	| j                  z  |f}
|||	| j                  z  |f}t	        j
                  |
|j                  «      }t	        j
                  ||j                  «      }| j                  �™|| j                  z  dk7  r6| j                  dd |…d d …f   | _        | j                  dd |…d d …f   | _        t	        j                  | j                  |gd¬«      | _        t	        j                  | j                  |gd¬«      | _        n||c| _        | _        | xj                   |j                  d   z  c_         || j                  d|| j                   …d d …f<   || j                  d|| j                   …d d …f<   | j                  dd | j                   …d d …f   | j                  dd | j                   …d d …f   fS ©NrË   é   r
   r   .r�   )	rN   r{   r„   rÁ   r(   r°   r¯   r|   rƒ   ©rZ   r{   r|   r»   rÃ   rÄ   r   rÆ   rÇ   Ún_stepsÚk_shapeÚv_shapeÚnew_kÚnew_vs                 r   r†   zKVCache.update_and_fetchK  sò  € Ø�{‰{ˆØ�9‰9Ð ¨¯
©
°1©Ñ!5¸¿¹¿¹ÈÑ9KÓ KØ+/¯:©:Ñ(ˆAˆz˜1˜jØŸ™ a™ˆJØ—y‘y 4§:¡:¨a¡=Ñ0°1Ñ4¸¿¹ÑBˆGØ˜* g°·	±	Ñ&9¸:ÐFˆGØ˜* g°·	±	Ñ&9¸:ÐFˆGÜ—H‘H˜W d§j¡jÓ1ˆEÜ—H‘H˜W f§l¡lÓ3ˆEØ�y‰yÐ$Ø˜$Ÿ)™)Ñ# qÒ(Ø $§	¡	¨#¨u°¨u²a¨-Ñ 8�D”IØ"&§+¡+¨c°5°D°5º!¨mÑ"<�D”KÜŸN™N¨D¯I©I°uÐ+=ÀAÔF�”	Ü Ÿn™n¨d¯k©k¸5Ð-AÈÔJ�•à).°Ð&�”	˜4œ;à�Š�t—z‘z !‘}Ñ$�Ø04ˆ�	‰	�#�t˜dŸk™kÐ)ª1Ð,Ñ-Ø28ˆ�‰�C˜ §¡Ð+ªQÐ.Ñ/Ø�y‰y˜˜m §¡˜mªQÐ.Ñ/°·±¸SÀ-ÀDÇKÁKÀ-ÒQRÐ=RÑ1SÐSÐSrH   c                 ó   — | j                   S r>   r¿   rY   s    r   rf   zKVCache.sizec  s   € Ø�{‰{ÐrH   c                 óþ   — | j                   | j                  j                  d   k(  r| j                  | j                  fS | j                  dd | j                   …d d …f   | j                  dd | j                   …d d …f   fS ©NrË   .©rN   r{   r„   r|   rY   s    r   r#   zKVCache.statef  óp   € à�;‰;˜$Ÿ)™)Ÿ/™/¨!Ñ,Ò,Ø—9‘9˜dŸk™kÐ)Ð)ð —	‘	˜#˜} §¡˜}ªaÐ/Ñ0Ø—‘˜C  4§;¡; ²Ð1Ñ2ðð rH   c                 ó^   — |\  | _         | _        | j                   j                  d   | _        y ©NrË   rŠ   r^   s     r   r#   zKVCache.statep  ó$   € à!"ÑˆŒ	�4”;Ø—i‘i—o‘o aÑ(ˆ�rH   c                  ó   — yrŒ   rX   rY   s    r   r@   zKVCache.is_trimmableu  r�   rH   c                 ó\   — t        | j                  |«      }| xj                  |z  c_        |S r>   r�   r‘   s     r   rK   zKVCache.trimx  r“   rH   r¦   r§   r   c                 óö   — t        ||¬«      }| j                  |_        | j                  �Nt        j                  | j                  ||¬«      |_        t        j                  | j
                  ||¬«      |_        |S )Nr½   )r¤   rN   r{   r(   rÂ   r|   )rZ   r¦   r§   Úquant_caches       r   Úto_quantizedzKVCache.to_quantized}  sb   € Ü&°*À4ÔHˆØ!Ÿ[™[ˆÔØ�9‰9Ð Ü!Ÿ{™{¨4¯9©9ÀÐRVÔWˆKÔÜ!#§¡Ø—‘¨
¸ô"ˆKÔð ÐrH   c                 ó0   — t        |d| j                  i|¤ŽS r•   r–   r—   s      r   rš   zKVCache.make_mask‡  r›   rH   c                 ó,   — t         j                  |«      S r>   )ÚBatchKVCacheÚmerge©r   Úcachess     r   rú   zKVCache.mergeŠ  s   € ä×!Ñ! &Ó)Ð)rH   c                 ó   — | j                   d u S r>   r�   rY   s    r   rl   zKVCache.emptyŽ  rž   rH   c                 óv   — | j                   €y| j                   j                  | j                  j                  z   S ry   r    rY   s    r   rj   zKVCache.nbytes‘  r¡   rH   N©rÞ   r   )r'   rq   rr   rÁ   r}   r†   rf   rs   r#   rt   r@   rK   rÔ   r¤   rö   rš   ru   rú   rl   rj   rX   rH   r   r   r   C  s›   „ Ø€Dòò
Tò0ð ñó ðð ‡\�\ñ)ó ð)òòñ
 sð °sð ÐCSó òJð ñ*ó ð*ò!ð ñ5ó ñ5rH   r   c                   ó  — e Zd ZdZdd„Zdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
ed
„ «       Zej                  d„ «       Zed„ «       Zej                  d„ «       Zd„ Zd„ Zddededefd„Z	 ddedee   defd„Zed„ «       Zd„ Zed„ «       Zy)r   r¥   c                 óX   — || _         d | _        d | _        d| _        || _        d| _        y ry   )r   r{   r|   rN   r   Ú_idx)rZ   r   r   s      r   r}   zRotatingKVCache.__init__›  s,   € ØˆŒ	ØˆŒ	ØˆŒØˆŒØ ˆŒØˆ�	rH   Nc                 óÊ   — g }|dkD  r0|dd | j                   …d d …f   |d|| j                   z   d …d d …f   g}n|g}|�|j                  |«       t        j                  |d¬«      S ©Nr   .rË   r�   )r   Úappendr(   rƒ   )rZ   Ú	trim_sizer_   r  Úto_cats        r   Ú_trimzRotatingKVCache._trim£  sn   € ØˆØ�qŠ=Ø˜˜[˜tŸy™y˜[ª!Ð+Ñ,¨a°°YÀÇÁÑ5JÑ5LÊaÐ0OÑ.PÐQ‰Fà�SˆFØÐØ�M‰M˜&Ô!Ü�~‰~˜f¨1Ô-Ð-rH   c           	      ó\  — | j                   |j                  d   k(  r|S | j                   | j                  k  r`t        j                  |dd| j
                  …dd…f   |d| j                   d…dd…f   |d| j
                  | j                   …dd…f   gd¬«      S |dd| j                   …dd…f   S )zY
        Rearrange the cache into temporal order, slicing off the end if unused.
        rË   .Nr�   )r  r„   rN   r(   rƒ   r   r^   s     r   Ú_temporal_orderzRotatingKVCache._temporal_order­  s¬   € ð �9‰9˜Ÿ™ ™
Ò"ØˆHØ�Y‰Y˜Ÿ™Ò$Ü—>‘>à�c˜;˜TŸY™Y˜;ªÐ)Ñ*Ø�c˜4Ÿ9™9™;ªÐ)Ñ*Ø�c˜4Ÿ9™9 t§y¡yÐ0²!Ð3Ñ4ðð
 ôð ð �S˜+˜DŸI™I˜+¢qÐ(Ñ)Ð)rH   c                 ód  — | j                   €|| _         || _        n¾| j                  | j                   «      | _         | j                  | j                  «      | _        | j                   j                  d   | _        | j                  | j
                  z
  dz   }| j                  || j                   |«      | _         | j                  || j                  |«      | _        | xj                  |j                  d   z  c_        | j                   j                  d   | _        | j                   | j                  fS ©NrË   r
   )r{   r|   r
  r„   r  r   r  rN   )rZ   r{   r|   r  s       r   Ú_update_concatzRotatingKVCache._update_concat¿  sâ   € Ø�9‰9ÐØˆDŒIØ ˆD�Kð ×,Ñ,¨T¯Y©YÓ7ˆDŒIØ×.Ñ.¨t¯{©{Ó;ˆDŒKØŸ	™	Ÿ™¨Ñ*ˆDŒIð Ÿ	™	 D§M¡MÑ1°AÑ5ˆIØŸ
™
 9¨d¯i©i¸Ó>ˆDŒIØŸ*™* Y°·±¸VÓDˆDŒKØ�Š�t—z‘z !‘}Ñ$�Ø—I‘I—O‘O AÑ&ˆŒ	Ø�y‰y˜$Ÿ+™+Ð%Ð%rH   c                 óö  — |j                   \  }}}}| j                  }| j                  �C|| j                  j                   d   k\  �r| j                  j                   d   | j                  k  rñ|j                   d   }t	        | j
                  | j                  |z
  «      }	|||	|f}
|||	|f}t        j                  |
|j                  «      }t        j                  ||j                  «      }| j                  �Qt        j                  | j                  |gd¬«      | _        t        j                  | j                  |gd¬«      | _
        n||c| _        | _
        || _        | j                  j                   d   | j                  z
  }|dkD  rS| j                  || j                  «      | _        | j                  || j                  «      | _
        | j                  | _        | j                  | j                  k(  r| j                  | _        || j                  d| j                  | j                  |z   …d d …f<   || j                  d| j                  | j                  |z   …d d …f<   | xj                  |z  c_        | xj                  |z  c_        | j                  | j                  k  r@| j                  dd | j                  …d d …f   | j                  dd | j                  …d d …f   fS | j                  | j                  fS )NrË   rã   r�   r   .)r„   rN   r{   r   r�   rÁ   r(   r°   r¯   rƒ   r|   r  r  r   ©rZ   r{   r|   rÃ   rÄ   ÚSrÆ   r»   rÇ   Únew_sizeræ   rç   rè   ré   r  s                  r   Ú_update_in_placez RotatingKVCache._update_in_placeÓ  sY  € ð (,§z¡zÑ$ˆˆ:�q˜*Ø�{‰{ˆØ�9‰9ÐØ�D—I‘I—O‘O AÑ&Ó&¨4¯9©9¯?©?¸1Ñ+=ÀÇÁÒ+MàŸ™ a™ˆJÜ˜4Ÿ9™9 d§m¡m°dÑ&:Ó;ˆHØ˜* h°
Ð;ˆGØ˜* h°
Ð;ˆGÜ—H‘H˜W d§j¡jÓ1ˆEÜ—H‘H˜W f§l¡lÓ3ˆEØ�y‰yÐ$ÜŸN™N¨D¯I©I°uÐ+=ÀAÔF�”	Ü Ÿn™n¨d¯k©k¸5Ð-AÈÔJ�•à).°Ð&�”	˜4œ;ØˆDŒIð —I‘I—O‘O AÑ&¨¯©Ñ6ˆ	Ø�qŠ=ØŸ
™
 9¨d¯i©iÓ8ˆDŒIØŸ*™* Y°·±Ó<ˆDŒKØŸ™ˆDŒIð �9‰9˜Ÿ™Ò%ØŸ	™	ˆDŒIð 8<ˆ�	‰	�#�t—y‘y 4§9¡9¨q¡=Ð0²!Ð3Ñ4Ø9?ˆ�‰�C˜Ÿ™ T§Y¡Y°¡]Ð2²AÐ5Ñ6Ø�Š�qÑ�Ø�	Š	�Q‰�	ð �;‰;˜Ÿ™Ò&Ø—9‘9˜S - D§K¡K -²Ð2Ñ3°T·[±[ÀÀmÈÏÉÀmÒUVÐAVÑ5WÐWÐWØ�y‰y˜$Ÿ+™+Ð%Ð%rH   c                 ón   — |j                   d   dk(  r| j                  ||«      S | j                  ||«      S r  ©r„   r  r  r…   s      r   r†   z RotatingKVCache.update_and_fetchþ  ó8   € Ø�:‰:�a‰=˜AÒØ×(Ñ(¨¨vÓ6Ð6Ø×"Ñ" 4¨Ó0Ð0rH   c                 óB   — t        | j                  | j                  «      S r>   )r�   rN   r   rY   s    r   rf   zRotatingKVCache.size  s   € Ü�4—;‘; §¡Ó.Ð.rH   c                 óþ   — | j                   | j                  j                  d   k  r@| j                  dd | j                   …d d …f   | j                  dd | j                   …d d …f   fS | j                  | j                  fS rì   rí   rY   s    r   r#   zRotatingKVCache.state  sj   € à�;‰;˜Ÿ™Ÿ™¨Ñ+Ò+Ø—9‘9˜S - D§K¡K -²Ð2Ñ3°T·[±[ÀÀmÈÏÉÀmÒUVÐAVÑ5WÐWÐWà—9‘9˜dŸk™kÐ)Ð)rH   c                 ó"   — |\  | _         | _        y r>   rˆ   r^   s     r   r#   zRotatingKVCache.state  rÎ   rH   c           	      óŒ   — t        t        t        | j                  | j                  | j
                  | j                  f«      «      S r>   )rÐ   rÑ   rÒ   r   r   rN   r  rY   s    r   r$   zRotatingKVCache.meta_state  s-   € ä”Sœ˜tŸy™y¨$¯-©-¸¿¹ÀdÇiÁiÐPÓQÓRÐRrH   c                 óV   — t        t        |«      \  | _        | _        | _        | _        y r>   )rÑ   rÔ   r   r   rN   r  r^   s     r   r$   zRotatingKVCache.meta_state  s#   € ä;>ÜØó<
Ñ8ˆŒ	�4”= $¤+¨t­yrH   c                 ó4   — | j                   | j                  k  S r>   )rN   r   rY   s    r   r@   zRotatingKVCache.is_trimmable  s   € Ø�{‰{˜TŸ]™]Ñ*Ð*rH   c                 ó†   — t        | j                  |«      }| xj                  |z  c_        | xj                  |z  c_        |S r>   )r�   rN   r  r‘   s     r   rK   zRotatingKVCache.trim  s2   € Ü�—‘˜QÓˆØ�Š�qÑ�Ø�	Š	�Q‰�	ØˆrH   r¦   r§   r   c                 ó   — t        d«      ‚)Nz RotatingKVCache Quantization NYIrh   r©   s      r   rö   zRotatingKVCache.to_quantized%  s   € Ü!Ð"DÓEÐErH   rM   rP   rO   c                 óü  — |dkD  rL|xs | j                   }t        | j                   dz
  | j                  «      }||z   |kD  s|rt        |||¬«      S y|€y | j                  |k\  r™| j                   |kD  r‰| j                  }|| j                   k\  rd}| j                  | j                   k  r| j                  dz   }n| j                   }t        j                  |«      ||z
  k\  }t        j                  ||dz   ¬«      }|S y y )Nr
   rR   rS   r   )Úshift)r   r�   rN   r   r  r(   ÚarangeÚroll)rZ   rM   rP   rO   rN   ÚidxÚ	mask_sizeÚmasks           r   rš   zRotatingKVCache.make_mask(  sì   € ð ˆqŠ5Ø%Ò6¨¯©ˆKÜ˜Ÿ™¨Ñ*¨D¯K©KÓ8ˆFØ˜‰z˜KÒ'©<Ü)¨!¨VÀÔMÐMààÐ"Øà�{‰{˜kÒ)¨d¯m©m¸kÒ.IØ—i‘i�Ø˜$Ÿ-™-Ò'Ø�CØ—;‘; §¡Ò.Ø $§¡¨a¡‘Ià $§¡�IÜ—y‘y Ó+°	¸KÑ0GÑH�Ü—w‘w˜t¨3°©7Ô3�Ø�ð /JÐ)rH   c                 ó,   — t         j                  |«      S r>   )ÚBatchRotatingKVCacherú   rû   s     r   rú   zRotatingKVCache.mergeB  s   € ä#×)Ñ)¨&Ó1Ð1rH   c                 ó   — | j                   d u S r>   r�   rY   s    r   rl   zRotatingKVCache.emptyF  rž   rH   c                 óv   — | j                   €y| j                   j                  | j                  j                  z   S ry   r    rY   s    r   rj   zRotatingKVCache.nbytesI  r¡   rH   )r   r>   rÿ   rd   )r'   rq   rr   rÁ   r}   r  r
  r  r  r†   rf   rs   r#   rt   r$   r@   rK   rÔ   r¤   rö   r   Úboolrš   ru   rú   rl   rj   rX   rH   r   r   r   ˜  s  „ Ø€Dóó.ò*ò$&ò()&òV1ò
/ð ñ*ó ð*ð ‡\�\ñ#ó ð#ð ñSó ðSð ×Ññ
ó ð
ò+òñF sð F°sð FÐCSó Fð OTñØðØ#+¨C¡=ðØGKóð4 ñ2ó ð2ò!ð ñ5ó ñ5rH   r   c                   óÐ   ‡ — e Zd Zˆ fd„Zddeee      fd„Zd„ Zd„ Z	e
d„ «       Zej                  d„ «       Zd„ Zd	„ Zd
„ Zdd„Zd„ Zd„ Zdefd„Zed„ «       Zd„ Ze
d„ «       Zˆ xZS )ÚArraysCachec                 óB   •— t         ‰| �  | «      }d |_        d |_        |S r>   )Úsuperrn   Úleft_paddingÚlengths)ro   r˜   r™   ÚinstanceÚ	__class__s       €r   rn   zArraysCache.__new__Q  s&   ø€ Ü‘7‘? 3Ó'ˆØ $ˆÔØˆÔØˆrH   r.  c                 óT   — d g|z  | _         |rt        j                  |«      | _        y y r>   )r    r(   Úarrayr.  )rZ   rf   r.  s      r   r}   zArraysCache.__init__W  s(   € Ø�V˜d‘]ˆŒ
ÙÜ "§¡¨Ó 6ˆDÕð rH   c                 ó"   — || j                   |<   y r>   rF   )rZ   r"  Úvalues      r   Ú__setitem__zArraysCache.__setitem__\  s   € Øˆ�
‰
�3ŠrH   c                 ó    — | j                   |   S r>   rF   ©rZ   r"  s     r   Ú__getitem__zArraysCache.__getitem___  s   € Ø�z‰z˜#‰ÐrH   c                 ó   — | j                   S r>   rF   rY   s    r   r#   zArraysCache.stateb  s   € à�z‰zÐrH   c                 ó   — || _         y r>   rF   r^   s     r   r#   zArraysCache.statef  s	   € àˆ�
rH   c                 óR   — | j                   D �cg c]  }||   ‘Œ	 c}| _         yc c}w ©úN
        In-place filter to keep just the given indices in the cache.
        NrF   ©rZ   Úbatch_indicesr*   s      r   ÚfilterzArraysCache.filterj  s&   € ð 15·
²
Ó;±
¨1�a˜Ó&°
Ñ;ˆ�
ùÒ;s   �$c                 óª   — t        | j                  |j                  «      D ��cg c]  \  }}t        j                  ||g«      ‘Œ c}}| _        yc c}}w ©úB
        In-place extend this cache with the other cache.
        N)r5   r    r(   rƒ   ©rZ   Úotherr*   Úos       r   ÚextendzArraysCache.extendp  s?   € ô :=¸T¿Z¹ZÈÏÉÔ9UÔVÑ9U±°°A”b—n‘n a¨ VÕ,Ð9UÒVˆ�
ùÓVs   ¤!Ac                 ó–   — t        t        | j                  «      «      }| j                  D �cg c]
  }|||dz    ‘Œ c}|_        |S c c}w ©Nr
   )r+  r   r    )rZ   r"  r    r*   s       r   ÚextractzArraysCache.extractv  sC   € ÜœC §
¡
›OÓ,ˆØ15·²Ó<±¨A�q˜˜s Q™wÒ'°Ñ<ˆŒØˆùò =s   ­Ac                 ó8   — t        j                  |«      | _        y r>   )r(   r3  r/  )rZ   r/  r™   s      r   ÚpreparezArraysCache.prepare{  s   € Ü—x‘x Ó(ˆ�rH   c                 ó    — d | _         d | _        y r>   ©r/  r.  rY   s    r   ÚfinalizezArraysCache.finalize~  s   € ØˆŒØ ˆÕrH   c                 óŠ   — | j                   �| xj                   |z  c_         | j                  �| xj                  |z  c_        y y r>   rO  )rZ   rM   s     r   ÚadvancezArraysCache.advance‚  s<   € Ø�<‰<Ð#Ø�LŠL˜AÑ�LØ×ÑÐ(Ø×Ò Ñ"Öð )rH   rM   c                 óà   — | j                   �+t        j                  |«      }|| j                   d d …d f   k\  S | j                  �+t        j                  |«      }|| j                  d d …d f   k  S y r>   )r.  r(   r   r/  )rZ   rM   Úposs      r   rš   zArraysCache.make_maskˆ  sg   € Ø×ÑÐ(Ü—)‘)˜A“,ˆCØ˜$×+Ñ+ªA¨t¨GÑ4Ñ4Ð4Ø�\‰\Ð%Ü—)‘)˜A“,ˆCØ˜Ÿ™¢a¨ gÑ.Ñ.Ð.àrH   c                 ó†  ‡— t        |d   j                  «      }t        |«      } | |«      }t        |«      D ]†  Št        t	        ˆfd„|D «       «      «      }t        |j                  «      }||d<   t        j                  ||j                  «      |‰<   t        |«      D ]  }||   ‰   €Œ||   ‰   |‰   ||dz    Œ Œˆ |S )Nr   c              3   ó4   •K  — | ]  }|‰   €Œ	|‰   –— Œ y ­wr>   rX   )rB   r*   Úes     €r   rC   z$ArraysCache.merge.<locals>.<genexpr>˜  s   øè ø€ ÐH©V¨°q¸±tÑ7G˜q �t©Vùs   ƒ
Ž
r
   )
r   r    r   ÚnextÚiterr3   r„   r(   r°   r¯   )	ro   rü   Ún_staterÃ   r    Úc_initr„   rÉ   rW  s	           @r   rú   zArraysCache.merge’  s»   ø€ ä�f˜Q‘i—o‘oÓ&ˆÜ�‹KˆÙ�G“ˆÜ�w–ˆAÜœ$ÓH©VÓHÓHÓIˆFÜ˜Ÿ™Ó&ˆEØˆE�!‰HÜ—x‘x  v§|¡|Ó4ˆE�!‰HÜ˜1–X�Ø˜!‘9˜Q‘<Ð'ØØ&,¨Q¡i°¡l��a‘˜˜Q ™UÑ#ñ ð  ð ˆrH   c                 ó$   — | j                   d   d u S ry   rF   rY   s    r   rl   zArraysCache.empty¢  s   € Ø�z‰z˜!‰} Ð$Ð$rH   c                 ó:   — t        d„ | j                  D «       «      S )Nc              3   ó:   K  — | ]  }|€Œ|j                   –— Œ y ­wr>   rÛ   rA   s     r   rC   z%ArraysCache.nbytes.<locals>.<genexpr>§  s   è ø€ ÐA¡Z °1±=�1—8•8¡Zùs   ‚Š)Úsumr    rY   s    r   rj   zArraysCache.nbytes¥  s   € äÑA T§Z¢ZÓAÓAÐArH   r>   )r'   rq   rr   rn   r   r   rÔ   r}   r6  r9  rs   r#   rt   rA  rH  rK  rM  rP  rR  rš   ru   rú   rl   rj   Ú__classcell__)r1  s   @r   r+  r+  P  s­   ø„ ôñ7¨8°D¸±IÑ+>ó 7ò
 òð ñó ðð ‡\�\ñó ðò<òWòó
)ò!ò#ð˜3ó ð ñó ðò%ð ñBó ôBrH   r+  c                   ó¬   — e Zd ZdZd„ Zd„ Zd„ Zed„ «       Zej                  d„ «       Zd„ Z
d„ Zed	„ «       Zej                  d
„ «       Zd„ Zed„ «       Zy)ÚChunkedKVCacher¥   c                 óJ   — d | _         d | _        d| _        || _        d| _        y ry   )r{   r|   rN   Ú
chunk_sizeÚstart_position)rZ   rd  s     r   r}   zChunkedKVCache.__init__­  s&   € ØˆŒ	ØˆŒØˆŒØ$ˆŒØˆÕrH   c                 óv  — | j                   �­| j                   j                  d   | j                  k\  r†| xj                  | j                   j                  d   | j                  z
  z  c_        | j                   d| j                   d …d d …f   | _         | j                  d| j                   d …d d …f   | _        y y y rì   )r{   r„   rd  re  r|   rY   s    r   Úmaybe_trim_frontzChunkedKVCache.maybe_trim_front´  s–   € à�9‰9Ð  T§Y¡Y§_¡_°QÑ%7¸4¿?¹?Ò%JØ×Ò 4§9¡9§?¡?°1Ñ#5¸¿¹Ñ#GÑGÕØŸ	™	 #¨¯©Ð'7Ñ'9º1Ð"<Ñ=ˆDŒIØŸ+™+ c¨D¯O©OÐ+;Ñ+=ºqÐ&@ÑAˆD�Kð &KÐ rH   c                 ó˜  — | j                   | j                  z
  }| j                  �-||j                  d   z   | j                  j                  d   kD  �rf|j                  \  }}}}|j                  d   }| j                  |j                  d   z   dz
  | j                  z  }	|||	| j                  z  |f}
|||	| j                  z  |f}t        j                  |
|j                  «      }t        j                  ||j                  «      }| j                  �™|| j                  z  dk7  r6| j                  dd |…d d …f   | _        | j                  dd |…d d …f   | _        t        j                  | j                  |gd¬«      | _        t        j                  | j                  |gd¬«      | _        n||c| _        | _        | xj                   |j                  d   z  c_         | j                   | j                  z
  }|| j                  d||…d d …f<   || j                  d||…d d …f<   | j                  dd |…d d …f   | j                  dd |…d d …f   fS râ   )
rN   re  r{   r„   rÁ   r(   r°   r¯   r|   rƒ   )rZ   r{   r|   r»   rÃ   rÄ   r   rÆ   rÇ   rå   ræ   rç   rè   ré   Úends                  r   r†   zChunkedKVCache.update_and_fetch»  sü  € Ø�{‰{˜T×0Ñ0Ñ0ˆØ�9‰9Ð ¨¯
©
°1©Ñ!5¸¿¹¿¹ÈÑ9KÓ KØ+/¯:©:Ñ(ˆAˆz˜1˜jØŸ™ a™ˆJØ—y‘y 4§:¡:¨a¡=Ñ0°1Ñ4¸¿¹ÑBˆGØ˜* g°·	±	Ñ&9¸:ÐFˆGØ˜* g°·	±	Ñ&9¸:ÐFˆGÜ—H‘H˜W d§j¡jÓ1ˆEÜ—H‘H˜W f§l¡lÓ3ˆEØ�y‰yÐ$Ø˜$Ÿ)™)Ñ# qÒ(Ø $§	¡	¨#¨u°¨u²a¨-Ñ 8�D”IØ"&§+¡+¨c°5°D°5º!¨mÑ"<�D”KÜŸN™N¨D¯I©I°uÐ+=ÀAÔF�”	Ü Ÿn™n¨d¯k©k¸5Ð-AÈÔJ�•à).°Ð&�”	˜4œ;à�Š�t—z‘z !‘}Ñ$�Ø�k‰k˜D×/Ñ/Ñ/ˆØ&*ˆ�	‰	�#�t˜C�x¢Ð"Ñ#Ø(.ˆ�‰�C˜˜c˜¢1Ð$Ñ%Ø�y‰y˜˜d˜s˜d¢A˜Ñ&¨¯©°C¸¸#¸ºq°LÑ(AÐAÐArH   c                 óþ   — | j                   | j                  j                  d   k(  r| j                  | j                  fS | j                  dd | j                   …d d …f   | j                  dd | j                   …d d …f   fS rì   rí   rY   s    r   r#   zChunkedKVCache.stateÔ  rî   rH   c                 ó^   — |\  | _         | _        | j                   j                  d   | _        y rð   rŠ   r^   s     r   r#   zChunkedKVCache.stateÞ  rñ   rH   c                  ó   — yrŒ   rX   rY   s    r   r@   zChunkedKVCache.is_trimmableã  r�   rH   c                 óv   — t        | j                  | j                  z
  |«      }| xj                  |z  c_        |S r>   )r�   rN   re  r‘   s     r   rK   zChunkedKVCache.trimæ  s0   € Ü�—‘˜d×1Ñ1Ñ1°1Ó5ˆØ�Š�qÑ�ØˆrH   c                 ó`   — t        t        t        | j                  | j                  f«      «      S r>   )rÐ   rÑ   rÒ   rd  re  rY   s    r   r$   zChunkedKVCache.meta_stateë  s#   € ä”Sœ˜tŸ™°×0CÑ0CÐDÓEÓFÐFrH   c                 ó>   — t        t        |«      \  | _        | _        y r>   )rÑ   rÔ   rd  re  r^   s     r   r$   zChunkedKVCache.meta_stateï  s   € ä/2´3¸«{Ñ,ˆŒ˜Õ,rH   c                 ó   — | j                   d u S r>   r�   rY   s    r   rl   zChunkedKVCache.emptyó  rž   rH   c                 óv   — | j                   €y| j                   j                  | j                  j                  z   S ry   r    rY   s    r   rj   zChunkedKVCache.nbytesö  r¡   rH   N)r'   rq   rr   rÁ   r}   rg  r†   rs   r#   rt   r@   rK   r$   rl   rj   rX   rH   r   rb  rb  ª  s—   „ Ø€Dò òBòBð2 ñó ðð ‡\�\ñ)ó ð)òòð
 ñGó ðGð ×Ññ;ó ð;ò!ð ñ5ó ñ5rH   rb  c                   óæ   — e Zd Zd„ Zd„ Zd„ Zd„ Zed„ «       Zej                  d„ «       Zed„ «       Z
e
j                  d„ «       Z
d	„ Zd
„ Zed„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zed„ «       Zed„ «       Zy)Ú	CacheListc                 ó   — || _         y r>   ©rü   )rZ   rü   s     r   r}   zCacheList.__init__þ  s	   € Øˆ�rH   c                 ó    — | j                   |   S r>   ru  r8  s     r   r9  zCacheList.__getitem__  s   € Ø�{‰{˜3ÑÐrH   c                 ó:   — t        d„ | j                  D «       «      S )Nc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr>   r?   rA   s     r   rC   z)CacheList.is_trimmable.<locals>.<genexpr>  s   è ø€ Ð9©[¨�1—>‘>×#©[ùrD   )rE   rü   rY   s    r   r@   zCacheList.is_trimmable  s   € ÜÑ9¨T¯[ª[Ó9Ó9Ð9rH   c                 óJ   — | j                   D ]  }|j                  |«      }Œ S r>   )rü   rK   )rZ   r’   r*   Úms       r   rK   zCacheList.trim  s"   € Ø—”ˆAØ—‘�q“	‰Að àˆrH   c                 óT   — | j                   D �cg c]  }|j                  ‘Œ c}S c c}w r>   )rü   r#   ©rZ   r*   s     r   r#   zCacheList.state  s"   € à!%§¢Ó-¡˜A�—“ Ñ-Ð-ùÒ-s   �%c                 óN   — t        | j                  |«      D ]  \  }}||_        Œ y r>   )r5   rü   r#   )rZ   r_   r*   Úss       r   r#   zCacheList.state  s"   € ä˜Ÿ™ QÖ'‰DˆAˆqØˆA�Gñ (rH   c                 ó¸   — | j                   D �cg c]  }t        |«      j                  ‘Œ c}| j                   D �cg c]  }|j                  ‘Œ c}fS c c}w c c}w r>   )rü   r&   r'   r$   r|  s     r   r$   zCacheList.meta_state  sN   € ð (,§{¢{Ó3¡{ !ŒT�!‹W×Ó {Ñ3Ø#'§;¢;Ó/¡;˜aˆQ�\‹\ ;Ñ/ð
ð 	
ùÚ3ùÚ/s
   �A»Ac                 óT   — t        | j                  |d   «      D ]  \  }}||_        Œ y rJ  )r5   rü   r$   )rZ   r_   r*   rz  s       r   r$   zCacheList.meta_state  s&   € ä˜Ÿ™ Q q¡TÖ*‰DˆAˆqØˆA�Lñ +rH   c                 óH   — | j                   D ]  }|j                  |«       Œ yr=  )rü   rA  r?  s      r   rA  zCacheList.filter!  s   € ð —”ˆAØ�H‰H�]Õ#ñ rH   c                 óv   — t        | j                  |j                  «      D ]  \  }}|j                  |«       Œ yrC  )r5   rü   rH  rE  s       r   rH  zCacheList.extend(  s,   € ô ˜Ÿ™ U§\¡\Ö2‰DˆAˆqØ�H‰H�Q�Kñ 3rH   c           	      ó†   ‡—  | «       }t        ˆfd„t        t        ‰d   j                  «      «      D «       «      |_        |S )Nc              3   ó    •K  — | ]@  }‰d    j                   |   j                  ‰D �cg c]  }|j                   |   ‘Œ c}«      –— ŒB yc c}w ­w©r   N)rü   rú   )rB   rÉ   r*   rü   s      €r   rC   z"CacheList.merge.<locals>.<genexpr>2  sP   øè ø€ ð 
á1�ð �1‰I×Ñ˜QÑ×%Ñ%¹FÓ&C¹F°q q§x¡x°£{¸FÑ&C×DÙ1ùò 'Dùs   ƒ$A§A	
½Ar   )rÐ   r   r   rü   )ro   rü   r    s    ` r   rú   zCacheList.merge/  s>   ø€ á“ˆÜó 
äœ3˜v a™y×/Ñ/Ó0Ô1ó
ó 
ˆŒð ˆrH   c                 ó:   ‡— t        ˆfd„| j                  D «       Ž S )Nc              3   ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­wr>   )rK  )rB   r*   r"  s     €r   rC   z$CacheList.extract.<locals>.<genexpr>9  s   øè ø€ Ð?±;¨a˜1Ÿ9™9 SŸ>±;ùs   ƒ)rs  rü   r8  s    `r   rK  zCacheList.extract8  s   ø€ ÜÓ?°4·;²;Ó?Ð@Ð@rH   c                 óJ   — | j                   D ]  } |j                  di |¤Ž Œ y )NrX   )rü   rM  )rZ   r™   r*   s      r   rM  zCacheList.prepare;  s!   € Ø—”ˆAØˆA�I‰IÑ˜Óñ rH   c                 óF   — | j                   D ]  }|j                  «        Œ y r>   )rü   rP  r|  s     r   rP  zCacheList.finalize?  s   € Ø—”ˆAØ�J‰J�Lñ rH   c                 ó:   — t        d„ | j                  D «       «      S )Nc              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wr>   )rf   rA   s     r   rC   z!CacheList.size.<locals>.<genexpr>D  s   è ø€ Ð1¡[ �1—6‘6—8¡[ùrD   )Úmaxrü   rY   s    r   rf   zCacheList.sizeC  s   € ÜÑ1 T§[¢[Ó1Ó1Ð1rH   c                 ó<   — | j                   d   j                  «       S ry   )rü   rl   rY   s    r   rl   zCacheList.emptyF  s   € Ø�{‰{˜1‰~×#Ñ#Ó%Ð%rH   c                 ó:   — t        d„ | j                  D «       «      S )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr>   rÛ   rA   s     r   rC   z#CacheList.nbytes.<locals>.<genexpr>K  s   è ø€ Ð1¡[ �1—8•8¡[ùs   ‚)r_  rü   rY   s    r   rj   zCacheList.nbytesI  s   € äÑ1 T§[¢[Ó1Ó1Ð1rH   c           	      óº   — | j                  | «      }t        |g|¢­Ž D ���cg c]#  \  }}}t        «       |   j                  ||«      ‘Œ% c}}}|_        |S c c}}}w r>   )rn   r5   r6   r7   rü   )ro   r#   r$   rp   r~  r*   rz  s          r   r7   zCacheList.from_stateM  s[   € à�k‰k˜#Óˆä9<¸UÐ9PÀZÓ9Põ
Ù9P©g¨a°°AŒG‹I�a‰L×#Ñ# A qÕ)Ð9Pó
ˆŒ
ð ˆ
ùô
s   ¢(AN)r'   rq   rr   r}   r9  r@   rK   rs   r#   rt   r$   rA  rH  ru   rú   rK  rM  rP  rf   rl   rj   r7   rX   rH   r   rs  rs  ý  sÐ   „ òò ò:òð
 ñ.ó ð.ð ‡\�\ñó ðð ñ
ó ð
ð ×Ññó ðò$òð ñó ðòAò òò2ò&ð ñ2ó ð2ð ñó ñrH   rs  c                 óÊ   — | j                   |   }dd| j                  |z
  z  z   }|d d }t        j                  |«      |   ||   z
  |z  }t        j                  | ||¬«      }|S )N).r>   r«   r�   )r„   Úndimr(   r   Útake_along_axis)r¶   Úshiftsr‚   r’   Úexpand_shiftsÚexpand_indicesr"  Úrolleds           r   Údynamic_rollr˜  V  sl   € Ø	�‰�‰€AØ˜W¨¯©°©Ñ6Ñ6€MØ" 3 BÐ'€NÜ�9‰9�Q‹<˜Ñ'¨&°Ñ*?Ñ?À1Ñ
D€CÜ×Ñ  3¨TÔ2€FØ€MrH   c                   óÈ   — e Zd ZdZdee   fd„Zd„ Zddddœd„Zd„ Z	e
d	„ «       Zej                  d
„ «       Zd„ Zd„ Zddedefd„Zd„ Zd„ Zd„ Zed„ «       Zd„ Ze
d„ «       Zy)rù   r¥   r.  c                 óÌ   — d| _         d| _        t        j                  |«      | _        t        j                  |D �cg c]  }| ‘Œ c}«      | _        d| _        d| _        yc c}w )a•  
        The BatchKV cache expects inputs to be left-padded.

        E.g. the following prompts:

            [1, 3, 5]
            [7]
            [2, 6, 8, 9]

        Should be padded like so:

            [0, 1, 3, 5]
            [0, 0, 0, 7]
            [2, 6, 8, 9]

        And ``left_padding`` specifies the amount of padding for each.
        In this case, ``left_padding = [1, 3, 0]``.
        Nr   )r{   r|   r(   r3  r.  rN   r  Ú_right_padding)rZ   r.  Úls      r   r}   zBatchKVCache.__init__b  sX   € ð& ˆŒ	ØˆŒÜŸH™H \Ó2ˆÔÜ—h‘h©LÓ9©L q ¢¨LÑ9Ó:ˆŒØˆŒ	à"ˆÕùò  :s   ¼
A!c                 óà  — | j                   }| j                  �-||j                  d   z   | j                  j                  d   kD  �rf|j                  \  }}}}|j                  d   }| j                  |j                  d   z   dz
  | j                  z  }	|||	| j                  z  |f}
|||	| j                  z  |f}t	        j
                  |
|j                  «      }t	        j
                  ||j                  «      }| j                  �™|| j                  z  dk7  r6| j                  dd |…d d …f   | _        | j                  dd |…d d …f   | _        t	        j                  | j                  |gd¬«      | _        t	        j                  | j                  |gd¬«      | _        n||c| _        | _        | xj                  |j                  d   z  c_	        | xj                   |j                  d   z  c_         || j                  d|| j                   …d d …f<   || j                  d|| j                   …d d …f<   | j                  dd | j                   …d d …f   | j                  dd | j                   …d d …f   fS râ   )
r  r{   r„   rÁ   r(   r°   r¯   r|   rƒ   rN   rä   s                 r   r†   zBatchKVCache.update_and_fetch}  s  € Ø�y‰yˆØ�9‰9Ð ¨¯
©
°1©Ñ!5¸¿¹¿¹ÈÑ9KÓ KØ+/¯:©:Ñ(ˆAˆz˜1˜jØŸ™ a™ˆJØ—y‘y 4§:¡:¨a¡=Ñ0°1Ñ4¸¿¹ÑBˆGØ˜* g°·	±	Ñ&9¸:ÐFˆGØ˜* g°·	±	Ñ&9¸:ÐFˆGÜ—H‘H˜W d§j¡jÓ1ˆEÜ—H‘H˜W f§l¡lÓ3ˆEØ�y‰yÐ$Ø˜$Ÿ)™)Ñ# qÒ(Ø $§	¡	¨#¨u°¨u²a¨-Ñ 8�D”IØ"&§+¡+¨c°5°D°5º!¨mÑ"<�D”KÜŸN™N¨D¯I©I°uÐ+=ÀAÔF�”	Ü Ÿn™n¨d¯k©k¸5Ð-AÈÔJ�•à).°Ð&�”	˜4œ;à�Š�t—z‘z !‘}Ñ$�Ø�	Š	�T—Z‘Z ‘]Ñ"�	Ø.2ˆ�	‰	�#�t˜dŸi™iÐ'ªÐ*Ñ+Ø06ˆ�‰�C˜ §	¡	Ð)ª1Ð,Ñ-Ø�y‰y˜˜k §	¡	˜kª1Ð,Ñ-¨t¯{©{¸3ÀÀ$Ç)Á)ÀÊQÐ;NÑ/OÐOÐOrH   N©r.  r/  Úright_paddingc                ó  — |�V| j                   �t        d«      ‚t        j                  |«      }| xj                  |z  c_        | xj
                  |z  c_        |�*t        |«      dkD  rt        j                  |«      | _        y y y )Nz7Left padding can only be added to an empty BatchKVCacher   )r{   r]   r(   r3  r.  rN   rŒ  r›  ©rZ   r.  r/  rŸ  s       r   rM  zBatchKVCache.prepare–  s}   € ØÐ#Ø�y‰yÐ$Ü ØMóð ô Ÿ8™8 LÓ1ˆLØ×Ò Ñ-ÕØ�KŠK˜<Ñ'�KàÐ$¬¨]Ó);¸aÒ)?Ü"$§(¡(¨=Ó"9ˆDÕð *@Ð$rH   c                 ó(  — | j                   �†| j                   }t        | j                  |d d …d f   d¬«      | _        t        | j                  |d d …d f   d¬«      | _        | xj                  |z  c_        | xj
                  |z  c_        d | _         y y )NrË   r�   )r›  r˜  r{   r|   rN   r.  )rZ   Úpaddings     r   rP  zBatchKVCache.finalize£  s   € Ø×ÑÐ*Ø×)Ñ)ˆGÜ$ T§Y¡Y°º¸4¸Ñ0@ÀqÔIˆDŒIÜ& t§{¡{°GºA¸t¸GÑ4DÈ1ÔMˆDŒKØ�KŠK˜7Ñ"�KØ×Ò Ñ(ÕØ"&ˆDÕð +rH   c                 óö   — | j                   | j                  }}| j                  |j                  d   k  r,|dd | j                  …d d …f   }|dd | j                  …d d …f   }||| j                  | j
                  fS rì   )r{   r|   r  r„   rN   r.  ©rZ   Úkr_   s      r   r#   zBatchKVCache.state¬  sr   € à�y‰y˜$Ÿ+™+ˆ1ˆØ�9‰9�q—w‘w˜q‘zÒ!Ø�#�{˜Ÿ™�{¢AÐ%Ñ&ˆAØ�#�{˜Ÿ™�{¢AÐ%Ñ&ˆAØ�!�T—[‘[ $×"3Ñ"3Ð3Ð3rH   c                 óv   — |\  | _         | _        | _        | _        | j                   j                  d   | _        y rð   )r{   r|   rN   r.  r„   r  r^   s     r   r#   zBatchKVCache.state´  s-   € àABÑ>ˆŒ	�4”; ¤¨TÔ->Ø—I‘I—O‘O AÑ&ˆ�	rH   c                  ó   — yrŒ   rX   rY   s    r   r@   zBatchKVCache.is_trimmable¹  r�   rH   c                 ó†   — t        | j                  |«      }| xj                  |z  c_        | xj                  |z  c_        |S r>   )r�   r  rN   r‘   s     r   rK   zBatchKVCache.trim¼  s2   € Ü�—	‘	˜1ÓˆØ�	Š	�Q‰�	Ø�Š�qÑ�ØˆrH   rM   rO   c                 óH   — t        |f| j                  | j                  dœ|¤ŽS )N)rN   r.  )r   r  r.  )rZ   rM   rO   r™   s       r   rš   zBatchKVCache.make_maskÂ  s.   € Ü!Øð
Ø—i‘i¨d×.?Ñ.?ñ
ØCIñ
ð 	
rH   c                 óÀ  — | j                   |   | _         | j                  |   | _        | j                  |   | _        | j                  |   | _        | j                  j	                  «       j                  «       }|dkD  ra| j                   d|d…dd…f   | _         | j                  d|d…dd…f   | _        | xj                  |z  c_        | xj                  |z  c_        yy)r>  r   .N)r{   r|   rN   r.  r�   Úitemr  )rZ   r@  Úmin_left_pads      r   rA  zBatchKVCache.filterÇ  sÄ   € ð —I‘I˜mÑ,ˆŒ	Ø—k‘k -Ñ0ˆŒØ—k‘k -Ñ0ˆŒØ ×-Ñ-¨mÑ<ˆÔð ×(Ñ(×,Ñ,Ó.×3Ñ3Ó5ˆØ˜!ÒØŸ	™	 # |¡}²aÐ"7Ñ8ˆDŒIØŸ+™+ c¨<©=º!Ð&;Ñ<ˆDŒKØ�IŠI˜Ñ%�IØ×Ò Ñ-Öð	 rH   c           	      ód  ‡‡— t        | j                  |j                  «      Št        | j                  j                  d   |j                  j                  d   «      Šˆˆfd„}t	        t
        j                  t         || «       ||«      fŽ «      \  | _        | _        | _	        | _
        ‰| _        y)rD  rË   c                 óˆ  •— ‰| j                   z
  }‰| j                  j                  d   z
  |z
  }| j                  | j                  }}|dk  r|dd |…d d …f   }|dd |…d d …f   }d}|dk7  s|dk7  r4dd||fdg}t	        j
                  ||«      }t	        j
                  ||«      }| j                  |z   }||| j                  |fS ©NrË   r   .)r   r   ©r  r{   r„   r|   r(   Úpadr.  rN   ©	r*   ÚleftÚrightr¦  r_   r²  r.  Úmax_idxr   s	          €€r   r²  z BatchKVCache.extend.<locals>.padá  óÏ   ø€ Ø˜QŸV™VÑ#ˆDØ˜qŸv™vŸ|™|¨A™Ñ.°Ñ5ˆEØ—6‘6˜1Ÿ8™8ˆqˆAØ�qŠyØ�c˜6˜E˜6¢1�nÑ%�Ø�c˜6˜E˜6¢1�nÑ%�Ø�Ø�qŠy˜E QšJØ˜v¨¨e }°fÐ=�Ü—F‘F˜1˜c“N�Ü—F‘F˜1˜c“N�ØŸ>™>¨DÑ0ˆLØ�a˜Ÿ™ <Ð/Ð/rH   N)rŒ  r  r{   r„   rÑ   r(   rƒ   r5   r|   rN   r.  ©rZ   rF  r²  r¶  r   s      @@r   rH  zBatchKVCache.extendØ  s‹   ù€ ô �d—i‘i §¡Ó,ˆÜ�t—y‘y—‘ qÑ)¨5¯:©:×+;Ñ+;¸AÑ+>Ó?ˆõ	0ô BEÜ�N‰NœC¡# d£)©S°«ZÐ!8Ð9óB
Ñ>ˆŒ	�4”; ¤¨TÔ->ð ˆ�	rH   c                 ó„  — t        «       }| j                  |   j                  «       }t        j                  | j
                  ||dz   …d d …|| j                  …f   «      |_        t        j                  | j                  ||dz   …d d …|| j                  …f   «      |_        |j
                  j                  d   |_	        |S )Nr
   rË   )
r   r.  r¬  r(   Ú
contiguousr{   r  r|   r„   rN   )rZ   r"  r    r£  s       r   rK  zBatchKVCache.extractõ  sŸ   € Ü“	ˆØ×#Ñ# CÑ(×-Ñ-Ó/ˆÜ—]‘] 4§9¡9¨S°3¸±7¨]ºA¸wÈÏÉÐ?RÐ-RÑ#SÓTˆŒ
Ü—}‘} T§[¡[°°s¸Q±w°ÂÀ7ÈTÏYÉYÐCVÐ1VÑ%WÓXˆŒØ—z‘z×'Ñ'¨Ñ*ˆŒØˆrH   c                 ó”  — |D �cg c]  }|j                  «       ‘Œ }}t        |«      }|D �cg c]  }||z
  ‘Œ	 }}t        |«      }t        d„ |D «       «      }t        d„ |D «       «      }	t        d„ |D «       «      }
t        t	        d„ |D «       «      «      }t        j                  ||||	f|¬«      }t        j                  ||||
f|¬«      }t        t        ||«      «      D ]�  \  }\  }}|j                  €Œ|j                  dd |j                  …d d …f   |||dz   …d d …|||j                  z   …f<   |j                  dd |j                  …d d …f   |||dz   …d d …|||j                  z   …f<   Œ�  | |«      }||_	        ||_        |xj                  |j                  d   z  c_
        |j                  d   |_        |S c c}w c c}w )	Nc              3   óh   K  — | ]*  }|j                   €Œ|j                   j                  d   –— Œ, y ­wrJ  ©r{   r„   rA   s     r   rC   z%BatchKVCache.merge.<locals>.<genexpr>  ó&   è ø€ ÐF© A°1·6±6Ñ3E�—‘—‘˜Q•©ùó   ‚2”2c              3   óh   K  — | ]*  }|j                   €Œ|j                   j                  d   –— Œ, y ­w©Nrã   r½  rA   s     r   rC   z%BatchKVCache.merge.<locals>.<genexpr>  ó&   è ø€ ÐG©& Q°A·F±FÑ4F�—‘—‘˜a•©&ùr¿  c              3   óh   K  — | ]*  }|j                   €Œ|j                   j                  d   –— Œ, y ­wrÁ  ©r|   r„   rA   s     r   rC   z%BatchKVCache.merge.<locals>.<genexpr>  ó'   è ø€ ÐK©F q°a·h±hÑ6J�—‘—‘ Õ"©Fùr¿  c              3   ób   K  — | ]'  }|j                   €Œ|j                   j                  –— Œ) y ­wr>   ©r{   r¯   rA   s     r   rC   z%BatchKVCache.merge.<locals>.<genexpr>  ó"   è ø€ ÐJ©V¨°q·v±vÑ7I�q—v‘v—|•|©Vùó   ‚/”/r®   .r
   rË   )rf   rŒ  r   rX  rY  r(   r°   Ú	enumerater5   r{   rN   r|   r„   r  )ro   rü   r*   r/  Ú
max_lengthrœ  r£  rÃ   ÚHÚDkÚDvÚdtr{   r|   rÉ   Úpr    s                    r   rú   zBatchKVCache.mergeý  s®  € á%+Ó,¡V �1—6‘6•8 VˆÐ,Ü˜“\ˆ
Ù+2Ó3©7 a�: “>¨7ˆÐ3Ü�‹KˆÜÑF©ÓFÓFˆÜÑG©&ÓGÓGˆÜÑK©FÓKÓKˆÜ”$ÑJ©VÓJÓJÓKˆä�x‰x˜˜A˜z¨2Ð.°bÔ9ˆÜ—‘˜1˜a ¨RÐ0¸Ô;ˆÜ"¤3 w°Ó#7Ö8‰IˆA‰v��1Ø�v‰vˆ~ØØ34·6±6¸#¸zÀÇÁ¸zÊ1Ð:LÑ3MˆD��Q˜‘U�šA˜q 1 q§x¡x¡<Ð/Ð/Ñ0Ø56·X±X¸cÀ:ÀQÇXÁXÀ:ÊqÐ>PÑ5QˆF�1�q˜1‘u�9ša  Q¨¯©¡\Ð!1Ð1Ò2ð	 9ñ �G“ˆØˆŒ
ØˆŒØ�Š˜Ÿ
™
 1™Ñ%�Ø—Z‘Z ‘]ˆŒ
àˆùò/ -ùâ3s
   …G ­Gc                 ó   — | j                   d u S r>   r�   rY   s    r   rl   zBatchKVCache.empty  rž   rH   c                 óv   — | j                   €y| j                   j                  | j                  j                  z   S ry   r    rY   s    r   rj   zBatchKVCache.nbytes  r¡   rH   ©F)r'   rq   rr   rÁ   r   rÔ   r}   r†   rM  rP  rs   r#   rt   r@   rK   r)  rš   rA  rH  rK  ru   rú   rl   rj   rX   rH   r   rù   rù   _  sµ   „ Ø€Dð# T¨#¡Yó #ò6Pð2 '+°DÈô :ò'ð ñ4ó ð4ð ‡\�\ñ'ó ð'òòñ
˜3ð 
¨dó 
ò
.ò"ò:ð ñó ðò4!ð ñ5ó ñ5rH   rù   c                   ó8  — e Zd ZdZdee   fd„Zd!d„Zd„ Zd„ Z	d„ Z
d	„ Zdddd
œd„Zd„ Zed„ «       Zej                   d„ «       Zed„ «       Zej                   d„ «       Zd„ Zd„ Zd"dededefd„Z	 d#dedee   defd„Zd„ Zd„ Zd„ Zed„ «       Zd„ Zed „ «       Zy)$r&  r¥   r.  c                 óö   — d | _         d | _        t        j                  |«      | _        t        j                  |D �cg c]  }| ‘Œ c}«      | _        || _        d| _        d| _        d| _	        d | _
        y c c}w )Nr   F)r{   r|   r(   r3  r.  rN   r   r  Ú_offsetÚrotatedÚ_lengths)rZ   r   r.  rœ  s       r   r}   zBatchRotatingKVCache.__init__%  sl   € ØˆŒ	ØˆŒäŸH™H \Ó2ˆÔÜ—h‘h©LÓ9©L q ¢¨LÑ9Ó:ˆŒà ˆŒØˆŒ	ØˆŒØˆŒð ˆ�ùò  :s   ¼
A6Nc                 ó^   — |dkD  r|d|d …d d …f   }|�t        j                  ||gd¬«      S |S r  )r(   rƒ   )rZ   r  r_   r  s       r   r  zBatchRotatingKVCache._trim5  s<   € Ø�qŠ=Ø�#�y‘z¢1Ð$Ñ%ˆAØÐÜ—>‘> 1 f +°AÔ6Ð6ØˆrH   c                 ó0  — | j                   rŠt        j                  | j                  | j                   d¬«      | _        t        j                  | j
                  | j                   d¬«      | _        | j                  j                  d   | _        d| _         yy)z:
        Rearrange the cache into temporal order.
        rË   r�   FN)r×  r(   r!  r{   r  r|   r„   rY   s    r   r
  z$BatchRotatingKVCache._temporal_order<  sg   € ð �<Š<ÜŸ™ §	¡	¨D¯I©I¨:¸AÔ>ˆDŒIÜŸ'™' $§+¡+°·	±	¨zÀÔBˆDŒKØŸ	™	Ÿ™¨Ñ*ˆDŒIØ ˆD�Lð	 rH   c                 óî  — | j                   €|| _         || _        �n¥| j                  «        | j                   j                  d   | j                  kD  rJ| j                   dd | j                  …d d …f   | _         | j                  dd | j                  …d d …f   | _        | j
                  �Ÿt        j                  d| j                  | j
                  z
  «      }t        | j                   |d d …d f   d¬«      | _         t        | j                  |d d …d f   d¬«      | _        | xj                  |z  c_
        | xj                  |z  c_        | j                  | j                  z
  dz   }|dkD  r| xj                  |z  c_
        | j                  || j                   |«      | _         | j                  || j                  |«      | _        | xj                  |j                  d   z  c_        | xj                  |j                  d   z  c_        | j                   j                  d   | _        t        j                  | j                   | j                  | j                  f«      | _         | j                   | j                  fS )NrË   .r   r�   r
   )r{   r|   r
  r„   r  rØ  r(   ÚmaximumrN   r˜  r.  r   r  rÖ  Údepends)rZ   r{   r|   r!  r  s        r   r  z#BatchRotatingKVCache._update_concatF  sÜ  € Ø�9‰9ÐØˆDŒIØ ˆDŽKð × Ñ Ô"ð �y‰y�‰˜qÑ! D§I¡IÒ-Ø ŸI™I c¨;¨T¯Y©Y¨;ºÐ&9Ñ:�”	Ø"Ÿk™k¨#¨{°·±¨{ºAÐ*=Ñ>�”ð �}‰}Ð(Ü—z‘z ! T§[¡[°4·=±=Ñ%@ÓA�Ü(¨¯©°Dº¸D¸±MÈÔJ�”	Ü*¨4¯;©;¸ºQÀ¸W¹ÈAÔN�”Ø×!Ò! TÑ)Õ!Ø—’˜tÑ#•ð Ÿ	™	 D§M¡MÑ1°AÑ5ˆIØ˜1Š}Ø×!Ò! YÑ.Õ!ØŸ
™
 9¨d¯i©i¸Ó>ˆDŒIØŸ*™* Y°·±¸VÓDˆDŒKØ�Š�t—z‘z !‘}Ñ$�Ø�Š˜Ÿ
™
 1™Ñ%�Ø—I‘I—O‘O AÑ&ˆŒ	ô —J‘J˜tŸy™y¨4×+<Ñ+<¸d¿k¹kÐ*JÓKˆŒ	à�y‰y˜$Ÿ+™+Ð%Ð%rH   c                 ó*  — | j                   �t        d«      ‚|j                  \  }}}}| j                  }| j                  �C|| j                  j                  d   k\  �r| j                  j                  d   | j
                  k  rñ|j                  d   }t        | j                  | j
                  |z
  «      }	|||	|f}
|||	|f}t        j                  |
|j                  «      }t        j                  ||j                  «      }| j                  �Qt        j                  | j                  |gd¬«      | _        t        j                  | j                  |gd¬«      | _        n||c| _        | _        || _        | j                  j                  d   | j
                  z
  }|dkD  rh| j                  || j                  «      | _        | j                  || j                  «      | _        | j
                  | _        | xj                  |z  c_        | j                  | j
                  k(  rd| _        d| _        | j                   r| xj                  |z  c_        || j                  d| j                  | j                  |z   …d d …f<   || j                  d| j                  | j                  |z   …d d …f<   | xj                  |z  c_        | xj"                  |z  c_        | xj                  |z  c_        t        j$                  | j                  | j                  | j"                  f«      | _        | j                  | j
                  k  r@| j                  dd | j                  …d d …f   | j                  dd | j                  …d d …f   fS | j                  | j                  fS )NzFfinalize() should be called before deocoding with BatchRotatingKVCacherË   rã   r�   r   T.)rØ  ÚRuntimeErrorr„   rÖ  r{   r   r�   rÁ   r(   r°   r¯   rƒ   r|   r  r  r.  r×  rN   rÝ  r  s                  r   r  z%BatchRotatingKVCache._update_in_placem  sÚ  € Ø�=‰=Ð$ÜØXóð ð (,§z¡zÑ$ˆˆ:�q˜*Ø�|‰|ˆØ�9‰9ÐØ�D—I‘I—O‘O AÑ&Ó&¨4¯9©9¯?©?¸1Ñ+=ÀÇÁÒ+MàŸ™ a™ˆJÜ˜4Ÿ9™9 d§m¡m°dÑ&:Ó;ˆHØ˜* h°
Ð;ˆGØ˜* h°
Ð;ˆGÜ—H‘H˜W d§j¡jÓ1ˆEÜ—H‘H˜W f§l¡lÓ3ˆEØ�y‰yÐ$ÜŸN™N¨D¯I©I°uÐ+=ÀAÔF�”	Ü Ÿn™n¨d¯k©k¸5Ð-AÈÔJ�•à).°Ð&�”	˜4œ;ØˆDŒIð —I‘I—O‘O AÑ&¨¯©Ñ6ˆ	Ø�qŠ=ØŸ
™
 9¨d¯i©iÓ8ˆDŒIØŸ*™* Y°·±Ó<ˆDŒKØŸ™ˆDŒIØ×Ò Ñ*Õð �9‰9˜Ÿ™Ò%ØˆDŒLØˆDŒIØ�<Š<Ø×Ò Ñ"Õð 8<ˆ�	‰	�#�t—y‘y 4§9¡9¨q¡=Ð0²!Ð3Ñ4Ø9?ˆ�‰�C˜Ÿ™ T§Y¡Y°¡]Ð2²AÐ5Ñ6Ø�Š˜Ñ�Ø�Š�qÑ�Ø�	Š	�Q‰�	ô —J‘J˜tŸy™y¨4×+<Ñ+<¸d¿k¹kÐ*JÓKˆŒ	ð �<‰<˜$Ÿ-™-Ò'à—	‘	˜#˜~ §¡˜~ªqÐ0Ñ1Ø—‘˜C  4§<¡< ²Ð2Ñ3ðð ð �y‰y˜$Ÿ+™+Ð%Ð%rH   c                 ón   — |j                   d   dk(  r| j                  ||«      S | j                  ||«      S r  r  r…   s      r   r†   z%BatchRotatingKVCache.update_and_fetch¨  r  rH   rž  c                ó&  — |�V| j                   �t        d«      ‚t        j                  |«      }| xj                  |z  c_        | xj
                  |z  c_        |�7t        |«      dkD  r(t        j                  |«      | j
                  z   | _        y y y )Nz?Left padding can only be added to an empty BatchRotatingKVCacher   )r{   r]   r(   r3  r.  rN   rŒ  rØ  r¡  s       r   rM  zBatchRotatingKVCache.prepare­  s…   € ØÐ#Ø�y‰yÐ$Ü ØUóð ô Ÿ8™8 LÓ1ˆLØ×Ò Ñ-ÕØ�KŠK˜<Ñ'�KàÐ$¬¨]Ó);¸aÒ)?ÜŸH™H WÓ-°·±Ñ;ˆD�Mð *@Ð$rH   c                 ój  — | j                   �§t        j                  d| j                  | j                   z
  «      }t	        | j
                  |d d …d f   d¬«      | _        t	        | j                  |d d …d f   d¬«      | _        | xj                  |z  c_        | xj                  |z  c_        d | _         y y )Nr   rË   r�   )rØ  r(   rÜ  rN   r˜  r{   r|   r.  )rZ   r!  s     r   rP  zBatchRotatingKVCache.finalizeº  sŒ   € Ø�=‰=Ð$Ü—:‘:˜a §¡¨t¯}©}Ñ!<Ó=ˆDÜ$ T§Y¡Y°²Q¸°W±ÀAÔFˆDŒIÜ& t§{¡{°Dº¸D¸±MÈÔJˆDŒKØ×Ò Ñ%ÕØ�KŠK˜4Ñ�KØ ˆD�Mð %rH   c                 óö   — | j                   | j                  }}| j                  |j                  d   k  r,|dd | j                  …d d …f   |dd | j                  …d d …f   }}||| j                  | j
                  fS rì   )r{   r|   rÖ  r„   rN   r.  r¥  s      r   r#   zBatchRotatingKVCache.stateÃ  sq   € à�y‰y˜$Ÿ+™+ˆ1ˆØ�<‰<˜!Ÿ'™' !™*Ò$Ø�S˜.˜DŸL™L˜.ª!Ð+Ñ,¨a°°^°t·|±|°^ÂQÐ0FÑ.GˆqˆAØ�!�T—[‘[ $×"3Ñ"3Ð3Ð3rH   c                 ó:   — |\  | _         | _        | _        | _        y r>   ©r{   r|   rN   r.  r^   s     r   r#   zBatchRotatingKVCache.stateÊ  s   € àABÑ>ˆŒ	�4”; ¤¨TÕ->rH   c           	      óŒ   — t        t        t        | j                  | j                  | j
                  | j                  f«      «      S r>   )rÐ   rÑ   rÒ   r   rÖ  r  r×  rY   s    r   r$   zBatchRotatingKVCache.meta_stateÎ  s-   € ä”Sœ˜tŸ}™}¨d¯l©l¸D¿I¹IÀtÇ|Á|ÐTÓUÓVÐVrH   c                 óv   — t        t        |d d «      \  | _        | _        | _        t        |d   «      | _        y rÁ  )rÑ   rÔ   r   rÖ  r  r)  r×  r^   s     r   r$   zBatchRotatingKVCache.meta_stateÒ  s6   € ä14ÜØˆbˆqˆEó2
Ñ.ˆŒ�t”| T¤Yô ˜A˜a™D“zˆ�rH   c                 ó4   — | j                   | j                  k  S r>   )rÖ  r   rY   s    r   r@   z!BatchRotatingKVCache.is_trimmableÚ  s   € Ø�|‰|˜dŸm™mÑ+Ð+rH   c                 ó°   — t        | j                  |«      }| xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        |S r>   )r�   rÖ  r  rN   r‘   s     r   rK   zBatchRotatingKVCache.trimÝ  s@   € Ü�—‘˜aÓ ˆØ�Š˜Ñ�Ø�	Š	�Q‰�	Ø�Š�qÑ�ØˆrH   r¦   r§   r   c                 ó   — t        d«      ‚)Nz%BatchRotatingKVCache Quantization NYIrh   r©   s      r   rö   z!BatchRotatingKVCache.to_quantizedä  s   € Ü!Ð"IÓJÐJrH   rM   rP   rO   c                 ó¤  — | j                   }|xs | j                  }t        | j                  dz
  | j                  «      }t	        j
                  ||z   «      }|rt	        j
                  |||z   «      n|}|d d …d f   }|d    }||k\  }||||z   k  z  }| j                  | j                  z
  t        |dkD  «      z   x}	dkD  r||	z
  }|dk(  xr' | j                  xs | j                  | j                  k\  }
|
r|dz
  }||t	        j                  |d«      k\  z  }|
r8| j                  }|| j                  k\  rd}t	        j                  ||dz   d¬«      }|S )Nr
   r   )r
   rË   rã   r«   )r  r‚   )r.  r   r�   rÖ  r(   r   r  rÔ   r×  Úexpand_dimsr!  )rZ   rM   rP   rO   r.  rN   ÚrindsÚlindsr$  r  r×  r"  s               r   rš   zBatchRotatingKVCache.make_maskç  sG  € ð ×(Ñ(ˆØ!Ò2 T§]¡]ˆÜ�T—]‘] QÑ&¨¯©Ó5ˆÜ—	‘	˜& 1™*Ó%ˆÙ17”—	‘	˜& &¨1¡*Ô-¸UˆØ’a˜�g‘ˆØ�d‘ˆØ˜‰~ˆØ�˜ Ñ+Ñ+Ñ+ˆØŸ™ T§]¡]Ñ2´S¸¸Q¹³ZÑ?Ð?ˆIÀ1ÒDØ'¨)Ñ3ˆLà�q‘&ÒI˜dŸl™lÒH¨d¯i©i¸4¿=¹=Ñ.HˆÙØ'¨!Ñ+ˆLà�u¤§¡¨|¸YÓ GÑGÑHˆáØ—)‘)ˆCØ�d—m‘mÒ#Ø�Ü—7‘7˜4 s¨Q¡w°RÔ8ˆDàˆrH   c                 ó¤   — | j                   |   | _         | j                  |   | _        | j                  |   | _        | j                  |   | _        yr=  rå  )rZ   r@  s     r   rA  zBatchRotatingKVCache.filter  sG   € ð —I‘I˜mÑ,ˆŒ	Ø—k‘k -Ñ0ˆŒØ—k‘k -Ñ0ˆŒØ ×-Ñ-¨mÑ<ˆÕrH   c           	      óR  ‡‡— | j                   |j                   k7  s| j                  |j                  k7  r | j                  «        |j                  «        t        | j                  |j                  «      Št        | j                  j
                  d   |j                  j
                  d   «      Šˆˆfd„}t        t        j                  t         || «       ||«      fŽ «      \  | _        | _
        | _        | _        ‰| _        t        | j                  |j                  «      | _        y)rD  rË   c                 óˆ  •— ‰| j                   z
  }‰| j                  j                  d   z
  |z
  }| j                  | j                  }}|dk  r|dd |…d d …f   }|dd |…d d …f   }d}|dk7  s|dk7  r4dd||fdg}t	        j
                  ||«      }t	        j
                  ||«      }| j                  |z   }||| j                  |fS r°  r±  r³  s	          €€r   r²  z(BatchRotatingKVCache.extend.<locals>.pad  r·  rH   N)r×  r  r
  rŒ  r{   r„   rÑ   r(   rƒ   r5   r|   rN   r.  rÖ  r¸  s      @@r   rH  zBatchRotatingKVCache.extend  sØ   ù€ ð �L‰L˜EŸM™MÒ)¨d¯i©i¸5¿:¹:Ò.EØ× Ñ Ô"Ø×!Ñ!Ô#ä�d—i‘i §¡Ó,ˆÜ�t—y‘y—‘ qÑ)¨5¯:©:×+;Ñ+;¸AÑ+>Ó?ˆõ	0ô BEÜ�N‰NœC¡# d£)©S°«ZÐ!8Ð9óB
Ñ>ˆŒ	�4”; ¤¨TÔ->ð ˆŒ	Ü˜4Ÿ<™<¨¯©Ó7ˆ�rH   c                 óV  — t        | j                  «      }| j                  |   j                  «       }| j                  |   j                  «       }| j
                  ||dz    |_        | j                  ||dz    |_        | j                  |_        | j                  rut        j                  |j
                  | j                   d¬«      |_        t        j                  |j                  | j                   d¬«      |_        | j                  |_        t        j                  |j
                  d d …d d …||j                  …f   «      |_        t        j                  |j                  d d …d d …||j                  …f   «      |_        ||_        |j
                  j                  d   |_        |S )Nr
   rË   r�   )r   r   r.  r¬  rN   r{   r|   r  r×  r(   r!  rº  r„   )rZ   r"  r    r£  rN   s        r   rK  zBatchRotatingKVCache.extract-  s9  € Ü §¡Ó.ˆØ×#Ñ# CÑ(×-Ñ-Ó/ˆØ—‘˜SÑ!×&Ñ&Ó(ˆØ—Y‘Y˜s S¨1¡WÐ-ˆŒ
Ø—{‘{ 3¨¨q©Ð1ˆŒØ—Y‘YˆŒ
Ø�<Š<ÜŸ™ §¡¨d¯i©i¨Z¸aÔ@ˆEŒJÜŸ7™7 5§<¡<°$·)±)°À!ÔDˆEŒLØŸ™ˆEŒJÜ—]‘] 5§:¡:ªa²°G¸e¿j¹jÐ4HÐ.HÑ#IÓJˆŒ
Ü—}‘} U§\¡\²!²Q¸À%Ç*Á*Ð8LÐ2LÑ%MÓNˆŒØˆŒØ—Z‘Z×%Ñ% aÑ(ˆŒ
ØˆrH   c                 ó0  ‡— t        ˆfd„‰D «       «      st        d«      ‚‰D �cg c]  }|j                  ‘Œ }}‰D �cg c]  }|j                  «       ‘Œ }}t	        |«      }|D �cg c]  }||z
  ‘Œ	 }}t        ‰«      }t	        d„ ‰D «       «      }	t	        d„ ‰D «       «      }
t	        d„ ‰D «       «      }t        t        d„ ‰D «       «      «      }t        j                  ||	||
f|¬«      }t        j                  ||	||f|¬«      }t        t        |‰«      «      D ]ƒ  \  }\  }}|j                  €Œ|j                  |j                  «      |||dz   …d d …|||j                  z   …f<   |j                  |j                  «      |||dz   …d d …|||j                  z   …f<   Œ…  | ‰d	   j                   |«      }||_        ||_        t        j"                  |«      |_        |j$                  d
   |_        |j$                  d
   |_        |S c c}w c c}w c c}w )Nc              3   óV   •K  — | ]   }|j                   ‰d    j                   k(  –— Œ" y­wr…  )r   )rB   r*   rü   s     €r   rC   z-BatchRotatingKVCache.merge.<locals>.<genexpr>@  s%   øè ø€ ÐD¹V¸�1—:‘: ¨¡×!3Ñ!3Õ3¹Vùs   ƒ&)zEBatchRotatingKVCache can only merge caches with the same maximum sizec              3   óh   K  — | ]*  }|j                   €Œ|j                   j                  d   –— Œ, y ­wrJ  r½  rA   s     r   rC   z-BatchRotatingKVCache.merge.<locals>.<genexpr>J  r¾  r¿  c              3   óh   K  — | ]*  }|j                   €Œ|j                   j                  d   –— Œ, y ­wrÁ  r½  rA   s     r   rC   z-BatchRotatingKVCache.merge.<locals>.<genexpr>K  rÂ  r¿  c              3   óh   K  — | ]*  }|j                   €Œ|j                   j                  d   –— Œ, y ­wrÁ  rÄ  rA   s     r   rC   z-BatchRotatingKVCache.merge.<locals>.<genexpr>L  rÅ  r¿  c              3   ób   K  — | ]'  }|j                   €Œ|j                   j                  –— Œ) y ­wr>   rÇ  rA   s     r   rC   z-BatchRotatingKVCache.merge.<locals>.<genexpr>M  rÈ  rÉ  r®   r
   r   rË   )rE   r]   rN   rf   rŒ  r   rX  rY  r(   r°   rÊ  r5   r{   r
  r  r|   r   r3  r„   rÖ  )ro   rü   r*   Úoffsetsr/  rË  rœ  r£  rÃ   rÌ  rÍ  rÎ  rÏ  r{   r|   rÉ   rÐ  r    s    `                r   rú   zBatchRotatingKVCache.merge>  sì  ø€ äÓD¹VÓDÔDÜØWóð ñ &,Ó,¡V �1—8“8 VˆÐ,Ù%+Ó,¡V �1—6‘6•8 VˆÐ,Ü˜“\ˆ
Ù+2Ó3©7 a�: “>¨7ˆÐ3Ü�‹KˆÜÑF©ÓFÓFˆÜÑG©&ÓGÓGˆÜÑK©FÓKÓKˆÜ”$ÑJ©VÓJÓJÓKˆä�x‰x˜˜A˜z¨2Ð.°bÔ9ˆÜ—‘˜1˜a ¨RÐ0¸Ô;ˆÜ"¤3 w°Ó#7Ö8‰IˆA‰v��1Ø�v‰vˆ~ØØ12×1BÑ1BÀ1Ç6Á6Ó1JˆD��Q˜‘U�šA˜q 1 q§v¡v¡:˜~Ð-Ñ.Ø34×3DÑ3DÀQÇXÁXÓ3NˆF�1�q˜1‘u�9ša  Q¨¯©¡Z Ð/Ò0ð	 9ñ �F˜1‘I×&Ñ&¨Ó0ˆØˆŒ
ØˆŒÜ—x‘x Ó(ˆŒØ—Z‘Z ‘]ˆŒ
ØŸ
™
 1™ˆŒàˆùò3 -ùÚ,ùâ3s   ¥H	¾HÁ&Hc                 ó   — | j                   d u S r>   r�   rY   s    r   rl   zBatchRotatingKVCache.empty`  rž   rH   c                 óv   — | j                   €y| j                   j                  | j                  j                  z   S ry   r    rY   s    r   rj   zBatchRotatingKVCache.nbytesc  r¡   rH   r>   rÿ   rd   ) r'   rq   rr   rÁ   r   rÔ   r}   r  r
  r  r  r†   rM  rP  rs   r#   rt   r$   r@   rK   r¤   rö   r   r)  rš   rA  rH  rK  ru   rú   rl   rj   rX   rH   r   r&  r&  "  s2  „ Ø€Dð¨t°C©yó ó ò!ò%&òN9&òv1ð
 '+°DÈô <ò!ð ñ4ó ð4ð ‡\�\ñCó ðCð ñWó ðWð ×Ññ"ó ð"ò,òñK sð K°sð KÐCSó Kð OTñØðØ#+¨C¡=ðØGKóò:=ò8ò@ð" ñó ðòB!ð ñ5ó ñ5rH   r&  r>   rÓ  )&ÚcopyÚtypingr   r   r   r   Úmlx.coreÚcorer(   Úmlx.nnÚnnÚ	mlx.utilsr   r   r	   Úbaser   ÚModulerÔ   r   rÒ   r/   r;   r)  rG   rL   rT   rV   rw   r¤   r   r   r+  rb  rs  r˜  rù   r&  rX   rH   r   Ú<module>r     s{  ðó ß ,Ó ,å Ý ß <Ñ <å $ð
 "&ñ6Ø�9‰9ð6à˜#‘ð6ð 
ˆ#�Yó6ð8 TVñ ? ð ?¨T°#©Yð ?À$ÀsÈCÀxÁ.ó ?ó&ð40  c¡ð 0¨tó 0ð2˜T #™Yð 2°Cð 2¸DÀ¹Ió 2ð&
Ø
ð
Øð
Ø'+ð
Ø:BÀ3¹-ó
÷0ñ 0ôf35˜ô 35ôlZS�zô ZSôzR5ˆjô R5ôju5�jô u5ôpWB�*ô WBôtP5�Zô P5ôfV�
ô Vòrô@5�:ô @5ôFE5˜:õ E5rH   