§
    g˜ºhö…  ã            	      óÒ  — U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZm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 erd dlZd dlmZ  ed	¦  «        Zn ed	¦  «        Z ed
¦  «        Z ej        d¦  «        Zee e ge!f         Z"ee#e e f         ge!f         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, G d„ deeef         ¦  «        Z- G d„ de%¦  «        Z.de%iZ/d e0d!<   d*d+d)„Z1e%e&e*e'e)e(e+e,e.f	D ]Z2 e1e2¦  «         ŒdS ),é    )ÚannotationsN)ÚOrderedDict)ÚFutureÚThreadPoolExecutor)Úgroupby)Ú
itemgetter)ÚTYPE_CHECKINGÚAnyÚCallableÚClassVarÚGenericÚ
NamedTupleÚTypeVar)Ú	ParamSpecÚPÚTÚfsspecc                  óJ   — e Zd ZU dZdZded<   dd„Zdd„Zdd„Zdd„Z	dd„Z
dS )Ú	BaseCacheag  Pass-though cache: doesn't keep anything, calls every time

    Acts as base class for other cachers

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    ÚnoneúClassVar[str]ÚnameÚ	blocksizeÚintÚfetcherÚFetcherÚsizeÚreturnÚNonec                óh   — || _         d| _        || _        || _        d| _        d| _        d| _        d S ©Nr   )r   Únblocksr   r   Ú	hit_countÚ
miss_countÚtotal_requested_bytes)Úselfr   r   r   s       úV/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/fsspec/caching.pyÚ__init__zBaseCache.__init__<   s:   € Ø"ˆŒØˆŒØˆŒØˆŒ	ØˆŒØˆŒà%&ˆÔ"Ð"Ð"ó    Ústartú
int | NoneÚstopÚbytesc                ón   — |€d}|€| j         }|| j         k    s||k    rdS |                      ||¦  «        S )Nr   r)   )r   r   ©r&   r*   r,   s      r'   Ú_fetchzBaseCache._fetchF   sF   € Øˆ=ØˆEØˆ<Ø”9ˆDØ�D”IÒÐ ¨$¢ Ø�3Ø�|Š|˜E 4Ñ(Ô(Ð(r)   c                ó0   — d| _         d| _        d| _        dS )zAReset hit and miss counts for a more ganular report e.g. by file.r   N)r#   r$   r%   ©r&   s    r'   Ú_reset_statszBaseCache._reset_statsO   s   € àˆŒØˆŒØ%&ˆÔ"Ð"Ð"r)   Ústrc           	     óx   — | j         dk    r| j        dk    rdS d| j        › d| j         › d| j        › d| j        › d�	S )z2Return a formatted string of the cache statistics.r   Ú z , z: z hits, z	 misses, z total requested bytes)r#   r$   r   r%   r2   s    r'   Ú
_log_statszBaseCache._log_statsU   st   € àŒ>˜QÒÐ 4¤?°aÒ#7Ð#7à�2ð F�T”Yð  Fð  F $¤.ð  Fð  F¸¼ð  Fð  FÐSWÔSmð  Fð  Fð  Fð  	Fr)   c                ó‚   — d| j         j        › d| j        › d| j        › d| j        › d| j        › d| j        › d| j        › d�S )	Nz

        <z:
            block size  :   z
            block count :   z
            file size   :   z
            cache hits  :   z
            cache misses:   z$
            total requested bytes: z
>
        )Ú	__class__Ú__name__r   r"   r   r#   r$   r%   r2   s    r'   Ú__repr__zBaseCache.__repr__\   sˆ   € ðØ
Œ.Ô
!ðð à!œ^ðð ð "œ\ðð ð "œYð	ð ð
 "œ^ðð ð "œ_ðð ð %)Ô$>ðð ð ð 	r)   N©r   r   r   r   r   r   r   r   ©r*   r+   r,   r+   r   r-   ©r   r   )r   r4   )r:   Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r(   r0   r3   r7   r;   © r)   r'   r   r   *   s›   € € € € € € ðð ð !€DÐ Ð Ð Ñ ð'ð 'ð 'ð 'ð)ð )ð )ð )ð'ð 'ð 'ð 'ðFð Fð Fð Fð
ð 
ð 
ð 
ð 
ð 
r)   r   c                  óP   ‡ — e Zd ZdZdZ	 	 	 ddˆ fd„Zdd„Zd d„Zd!d„Zd"d„Z	ˆ xZ
S )#Ú	MMapCacheaæ  memory-mapped sparse file cache

    Opens temporary file, which is filled blocks-wise when data is requested.
    Ensure there is enough disc space in the temporary location.

    This cache method might only work on posix

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: Fetcher
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    location: str
        Where to create the temporary file. If None, a temporary file is
        created using tempfile.TemporaryFile().
    blocks: set[int]
        Set of block numbers that have already been fetched. If None, an empty
        set is created.
    multi_fetcher: MultiFetcher
        Function of the form f([(start, end)]) which gets bytes from remote
        as specified. This function is used to fetch multiple blocks at once.
        If not specified, the fetcher function is used instead.
    ÚmmapNr   r   r   r   r   Úlocationú
str | NoneÚblocksúset[int] | NoneÚmulti_fetcherúMultiFetcher | Noner   r   c                óÊ   •— t          ¦   «                              |||¦  «         |€t          ¦   «         n|| _        || _        || _        |                      ¦   «         | _        d S ©N)Úsuperr(   ÚsetrI   rG   rK   Ú	_makefileÚcache)r&   r   r   r   rG   rI   rK   r9   s          €r'   r(   zMMapCache.__init__ˆ   sX   ø€ õ 	‰Œ×Ò˜ G¨TÑ2Ô2Ð2Ø%˜~•c‘e”e�e°6ˆŒØ ˆŒØ*ˆÔØ—^’^Ñ%Ô%ˆŒ
ˆ
ˆ
r)   úmmap.mmap | bytearrayc                ó*  — dd l }dd l}| j        dk    rt          ¦   «         S | j        �$t
          j                             | j        ¦  «        s‹| j        €(|                     ¦   «         }t          ¦   «         | _
        nt          | j        d¦  «        }|                     | j        dz
  ¦  «         |                     d¦  «         |                     ¦   «          nt          | j        d¦  «        } |j         |                     ¦   «         | j        ¦  «        S )Nr   zwb+é   ó   1zr+b)rF   Útempfiler   Ú	bytearrayrG   ÚosÚpathÚexistsÚTemporaryFilerP   rI   ÚopenÚseekÚwriteÚflushÚfileno)r&   rF   rW   Úfds       r'   rQ   zMMapCache._makefile—   sä   € ØˆˆˆØˆˆˆàŒ9˜Š>ˆ>Ý‘;”;Ðð Œ=Ð ­¬¯ª°t´}Ñ(EÔ(EÐ ØŒ}Ð$Ø×+Ò+Ñ-Ô-�Ý!™eœe�”�å˜$œ-¨Ñ/Ô/�Ø�GŠG�D”I ‘MÑ"Ô"Ð"Ø�HŠH�T‰NŒNˆNØ�HŠH‰JŒJˆJˆJå�d”m UÑ+Ô+ˆBàˆtŒy˜Ÿš™œ d¤iÑ0Ô0Ð0r)   r*   r+   Úendr-   c                óX  ‡ — t                                d|› d|› �¦  «         |€d}|€‰ j        }|‰ j        k    s||k    rdS |‰ j        z  }|‰ j        z  }t	          ||dz   ¦  «        }ˆ fd„|D ¦   «         }‰ xj        t          ˆ fd„|D ¦   «         ¦  «        z  c_        g }t          t          |¦  «        d„ ¬	¦  «        D ]þ\  }}	t          t          t          d¦  «        |	¦  «        ¦  «        }	|	d         ‰ j        z  }
t          |	d
         ‰ j        z  ‰ j        z   ‰ j        ¦  «        }‰ xj        ||
z
  z  c_        t                                d|	d         › d|	d
         › d|
› d|› d�	¦  «         |                     |
|f¦  «         ‰ j                             |	¦  «         ‰ xj        t%          |	¦  «        z  c_        Œÿ|s‰ j        ||…         S ‰ j        r}t                                d|› �¦  «         t          ‰                      |¦  «        ¦  «        D ]<\  }}||         \  }
}t                                d|
› d|› �¦  «         |‰ j        |
|…<   Œ=nH|D ]E\  }
}t                                d|
› d|› �¦  «         ‰                      |
|¦  «        ‰ j        |
|…<   ŒF‰ j        ||…         S )NzMMap cache fetching ú-r   r)   rU   c              3  ó.   •K  — | ]}|‰j         v¯|V — Œd S rN   ©rI   ©Ú.0Úir&   s     €r'   ú	<genexpr>z#MMapCache._fetch.<locals>.<genexpr>¹   s/   øè è € Ð?Ð?�a¨!°4´;Ð*>Ð*>�Ð*>Ð*>Ð*>Ð*>Ð?Ð?r)   c              3  ó.   •K  — | ]}|‰j         v ¯d V — ŒdS )rU   Nrg   rh   s     €r'   rk   z#MMapCache._fetch.<locals>.<genexpr>»   s/   øè è € ÐIÐI A¸¸T¼[Ð8HÐ8H˜aÐ8HÐ8HÐ8HÐ8HÐIÐIr)   c                ó$   — | d         | d         z
  S )Nr   rU   rC   )Úxs    r'   ú<lambda>z"MMapCache._fetch.<locals>.<lambda>Ç   s   € ÀÀ1ÄÈÈ!ÌÁ€ r)   )ÚkeyéÿÿÿÿzMMap get blocks z (ú)zMMap copy block (zMMap get block ()ÚloggerÚdebugr   r   Úranger#   Úsumr   Ú	enumerateÚtupleÚmapr   Úminr%   ÚappendrI   Úupdater$   ÚlenrR   rK   r   )r&   r*   rc   Ústart_blockÚ	end_blockÚblock_rangeÚneedÚrangesÚ_Ú_blocksÚsstartÚsendÚidxÚrs   `             r'   r0   zMMapCache._fetch­   s  ø€ Ý�ŠÐ9¨EÐ9Ð9°CÐ9Ð9Ñ:Ô:Ð:Øˆ=ØˆEØˆ;Ø”)ˆCØ�D”IÒÐ ¨#¢ Ø�3Ø˜tœ~Ñ-ˆØ˜4œ>Ñ)ˆ	Ý˜K¨°Q©Ñ7Ô7ˆà?Ð?Ð?Ð?˜;Ð?Ñ?Ô?ˆàˆŒ�#ÐIÐIÐIÐI¨ÐIÑIÔIÑIÔIÑIˆŒàˆõ "¥)¨D¡/¤/Ð7LÐ7LÐMÑMÔMð 	,ð 	,‰JˆAˆwå�C¥
¨1¡¤¨wÑ7Ô7Ñ8Ô8ˆGà˜Q”Z $¤.Ñ0ˆFå�w˜r”{ T¤^Ñ3°d´nÑDÀdÄiÑPÔPˆDð Ð&Ô&¨$°©-Ñ7Ð&Ô&Ý�LŠLØO 7¨1¤:ÐOÐO°¸´ÐOÐO¸vÐOÐOÈÐOÐOÐOñô ð ð �MŠM˜6 4˜.Ñ)Ô)Ð)ð ŒK×Ò˜wÑ'Ô'Ð'àˆOŒO�s 7™|œ|Ñ+ˆOŒOˆOàð 	)Ø”:˜e C˜iÔ(Ð(àÔð 		EÝ�LŠLÐ4¨FÐ4Ð4Ñ5Ô5Ð5Ý# D×$6Ò$6°vÑ$>Ô$>Ñ?Ô?ð ,ð ,‘��QØ!'¨¤‘�˜Ý—’Ð@°Ð@Ð@¸$Ð@Ð@ÑAÔAÐAØ*+�”
˜6 $˜;Ñ'Ð'ð,ð
 !'ð Eð E‘�˜Ý—’Ð?°Ð?Ð?¸Ð?Ð?Ñ@Ô@Ð@Ø*.¯,ª,°v¸tÑ*DÔ*D�”
˜6 $˜;Ñ'Ð'àŒz˜% ˜)Ô$Ð$r)   údict[str, Any]c                ó>   — | j                              ¦   «         }|d= |S )NrR   )Ú__dict__Úcopy©r&   Ústates     r'   Ú__getstate__zMMapCache.__getstate__ë   s!   € Ø”×"Ò"Ñ$Ô$ˆà�'ˆNØˆr)   rŽ   c                ól   — | j                              |¦  «         |                      ¦   «         | _        d S rN   )r‹   r|   rQ   rR   r�   s     r'   Ú__setstate__zMMapCache.__setstate__ñ   s-   € àŒ×Ò˜UÑ#Ô#Ð#Ø—^’^Ñ%Ô%ˆŒ
ˆ
ˆ
r)   )NNN)r   r   r   r   r   r   rG   rH   rI   rJ   rK   rL   r   r   )r   rS   ©r*   r+   rc   r+   r   r-   ©r   r‰   ©rŽ   r‰   r   r   )r:   r?   r@   rA   r   r(   rQ   r0   r�   r‘   Ú__classcell__©r9   s   @r'   rE   rE   i   s¯   ø€ € € € € ðð ð8 €Dð  $Ø"&Ø-1ð&ð &ð &ð &ð &ð &ð &ð1ð 1ð 1ð 1ð,<%ð <%ð <%ð <%ð|ð ð ð ð&ð &ð &ð &ð &ð &ð &ð &r)   rE   c                  ó0   ‡ — e Zd ZdZdZdˆ fd
„Zdd„Zˆ xZS )ÚReadAheadCachea!  Cache which reads only when we get beyond a block of data

    This is a much simpler version of BytesCache, and does not attempt to
    fill holes in the cache or keep fragments alive. It is best suited to
    many small reads in a sequential order (e.g., reading lines from a file).
    Ú	readaheadr   r   r   r   r   r   r   c                óx   •— t          ¦   «                              |||¦  «         d| _        d| _        d| _        d S )Nr)   r   )rO   r(   rR   r*   rc   ©r&   r   r   r   r9   s       €r'   r(   zReadAheadCache.__init__  s8   ø€ Ý‰Œ×Ò˜ G¨TÑ2Ô2Ð2ØˆŒ
ØˆŒ
ØˆŒˆˆr)   r*   r+   rc   r-   c                óÐ  — |€d}|�|| j         k    r| j         }|| j         k    s||k    rdS ||z
  }|| j        k    r:|| j        k    r/| xj        dz  c_        | j        || j        z
  || j        z
  …         S | j        |cxk    r| j        k     rDn nA| xj        dz  c_        | j        || j        z
  d …         }|t          |¦  «        z  }| j        }n| xj        dz  c_        d}t          | j         || j        z   ¦  «        }| xj	        ||z
  z  c_	        |  
                    ||¦  «        | _        || _        | j        t          | j        ¦  «        z   | _        || j        d |…         z   S ©Nr   r)   rU   )r   r*   rc   r#   rR   r$   r}   rz   r   r%   r   )r&   r*   rc   ÚlÚparts        r'   r0   zReadAheadCache._fetch  s�  € Øˆ=ØˆEØˆ;˜# ¤	š/˜/Ø”)ˆCØ�D”IÒÐ ¨#¢ Ø�3Ø�%‰KˆØ�D”JÒÐ 3¨$¬(¢? ?àˆNŒN˜aÑˆNŒNØ”:˜e d¤jÑ0°3¸¼Ñ3CÐCÔDÐDØŒZ˜5Ð+Ð+Ò+Ð+ 4¤8Ò+Ð+Ð+Ð+Ð+àˆOŒO˜qÑ ˆOŒOØ”:˜e d¤jÑ0Ð2Ð2Ô3ˆDØ•�T‘”‰NˆAØ”HˆEˆEð ˆOŒO˜qÑ ˆOŒOØˆDÝ�$”)˜S 4¤>Ñ1Ñ2Ô2ˆØÐ"Ô" c¨E¡kÑ1Ð"Ô"Ø—\’\ %¨Ñ-Ô-ˆŒ
ØˆŒ
Ø”:¥ D¤J¡¤Ñ/ˆŒØ�d”j  ! ”nÑ$Ð$r)   r<   r’   ©r:   r?   r@   rA   r   r(   r0   r•   r–   s   @r'   r˜   r˜   ÷   sb   ø€ € € € € ðð ð €Dðð ð ð ð ð ð%ð %ð %ð %ð %ð %ð %ð %r)   r˜   c                  ó0   ‡ — e Zd ZdZdZdˆ fd
„Zdd„Zˆ xZS )ÚFirstChunkCachez›Caches the first block of a file only

    This may be useful for file types where the metadata is stored in the header,
    but is randomly accessed.
    Úfirstr   r   r   r   r   r   r   c                ól   •— ||k    r|}t          ¦   «                              |||¦  «         d | _        d S rN   )rO   r(   rR   r›   s       €r'   r(   zFirstChunkCache.__init__.  s:   ø€ Ø�tÒÐàˆIÝ‰Œ×Ò˜ G¨TÑ2Ô2Ð2Ø#'ˆŒ
ˆ
ˆ
r)   r*   r+   rc   r-   c                ó  — |pd}|| j         k    rt                               d¦  «         dS t          || j         ¦  «        }|| j        k     rý| j        €”| xj        dz  c_        || j        k    rD| xj        |z  c_        |                      d|¦  «        }|d | j        …         | _        ||d …         S |                      d| j        ¦  «        | _        | xj        | j        z  c_        | j        ||…         }|| j        k    r6| xj        || j        z
  z  c_        ||                      | j        |¦  «        z  }| xj	        dz  c_	        |S | xj        dz  c_        | xj        ||z
  z  c_        |                      ||¦  «        S )Nr   z,FirstChunkCache: requested start > file sizer)   rU   )
r   rs   rt   rz   r   rR   r$   r%   r   r#   )r&   r*   rc   ÚdatarŸ   s        r'   r0   zFirstChunkCache._fetch5  sŒ  € Ø�
˜ˆØ�4”9ÒÐÝ�LŠLÐGÑHÔHÐHØ�3å�#�t”yÑ!Ô!ˆà�4”>Ò!Ð!ØŒzÐ!Ø�” 1Ñ$�”Ø˜œÒ'Ð'ØÐ.Ô.°#Ñ5Ð.Ô.ØŸ<š<¨¨3Ñ/Ô/�DØ!%Ð&6¨¬Ð&6Ô!7�D”JØ   œ<Ð'Ø!Ÿ\š\¨!¨T¬^Ñ<Ô<�”
ØÐ*Ô*¨d¬nÑ<Ð*Ô*Ø”:˜e C˜iÔ(ˆDØ�T”^Ò#Ð#ØÐ*Ô*¨c°D´NÑ.BÑBÐ*Ô*Ø˜Ÿš T¤^°SÑ9Ô9Ñ9�ØˆNŒN˜aÑˆNŒNØˆKàˆOŒO˜qÑ ˆOŒOØÐ&Ô&¨#°©+Ñ5Ð&Ô&Ø—<’<  sÑ+Ô+Ð+r)   r<   r’   r    r–   s   @r'   r¢   r¢   %  sb   ø€ € € € € ðð ð €Dð(ð (ð (ð (ð (ð (ð,ð ,ð ,ð ,ð ,ð ,ð ,ð ,r)   r¢   c                  ó^   ‡ — e Zd ZdZdZ	 ddˆ fd„Zd„ Zdd„Zdd„Zd d„Z	d!ˆ fd„Z
d"d„Zˆ xZS )#Ú
BlockCacheaè  
    Cache holding memory as a set of blocks.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    Ú
blockcacheé    r   r   r   r   r   Ú	maxblocksr   r   c                óâ   •— t          ¦   «                              |||¦  «         t          j        ||z  ¦  «        | _        || _         t          j        |¦  «        | j        ¦  «        | _	        d S rN   )
rO   r(   ÚmathÚceilr"   r«   Ú	functoolsÚ	lru_cacheÚ_fetch_blockÚ_fetch_block_cached©r&   r   r   r   r«   r9   s        €r'   r(   zBlockCache.__init__l  sd   ø€ õ 	‰Œ×Ò˜ G¨TÑ2Ô2Ð2Ý”y ¨	Ñ!1Ñ2Ô2ˆŒØ"ˆŒØ#A¥9Ô#6°yÑ#AÔ#AÀ$ÔBSÑ#TÔ#TˆÔ Ð Ð r)   c                ó4   — | j                              ¦   «         S ©zª
        The statistics on the block cache.

        Returns
        -------
        NamedTuple
            Returned directly from the LRU Cache used internally.
        ©r²   Ú
cache_infor2   s    r'   r·   zBlockCache.cache_infot  ó   € ð Ô'×2Ò2Ñ4Ô4Ð4r)   r‰   c                ó   — | j         }|d= |S )Nr²   ©r‹   r�   s     r'   r�   zBlockCache.__getstate__  s   € Ø”ˆØÐ'Ð(Øˆr)   rŽ   c                ó”   — | j                              |¦  «          t          j        |d         ¦  «        | j        ¦  «        | _        d S )Nr«   )r‹   r|   r¯   r°   r±   r²   r�   s     r'   r‘   zBlockCache.__setstate__„  sH   € ØŒ×Ò˜UÑ#Ô#Ð#Ø#J¥9Ô#6°u¸[Ô7IÑ#JÔ#JØÔñ$
ô $
ˆÔ Ð Ð r)   r*   r+   rc   r-   c                óò   — |€d}|€| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }t          ||dz   ¦  «        D ]}|                      |¦  «         Œ|                      ||||¬¦  «        S )Nr   r)   rU   ©Ústart_block_numberÚend_block_number)r   r   ru   r²   Ú_read_cache)r&   r*   rc   r¾   r¿   Úblock_numbers         r'   r0   zBlockCache._fetchŠ  s°   € Øˆ=ØˆEØˆ;Ø”)ˆCØ�D”IÒÐ ¨#¢ Ø�3ð # d¤nÑ4ÐØ $¤.Ñ0Ðõ "Ð"4Ð6FÈÑ6JÑKÔKð 	3ð 	3ˆLØ×$Ò$ \Ñ2Ô2Ð2Ð2à×ÒØØØ1Ø-ð	  ñ 
ô 
ð 	
r)   rÁ   c                ó<  •— || j         k    rt          d|› d| j         › d�¦  «        ‚|| j        z  }|| j        z   }| xj        ||z
  z  c_        | xj        dz  c_        t
                               d|¦  «         t          ¦   «                              ||¦  «        }|S )ú=
        Fetch the block of data for `block_number`.
        ú'block_number=ú(' is greater than the number of blocks (rr   rU   zBlockCache fetching block %d)	r"   Ú
ValueErrorr   r%   r$   rs   ÚinforO   r0   )r&   rÁ   r*   rc   Úblock_contentsr9   s        €r'   r±   zBlockCache._fetch_block¡  s½   ø€ ð ˜$œ,Ò&Ð&Ýð9 ð 9ð 9Ø)-¬ð9ð 9ð 9ñô ð ð
 ˜tœ~Ñ-ˆØ�d”nÑ$ˆØÐ"Ô" c¨E¡kÑ1Ð"Ô"ØˆŒ˜1ÑˆŒÝ�ŠÐ2°LÑAÔAÐAÝ™œŸš¨¨sÑ3Ô3ˆØÐr)   r¾   r¿   c           	     óÌ  — || j         z  }|| j         z  }| xj        dz  c_        ||k    r|                      |¦  «        }|||…         S |                      |¦  «        |d…         g}|                     t	          | j        t          |dz   |¦  «        ¦  «        ¦  «         |                     |                      |¦  «        d|…         ¦  «         d                     |¦  «        S ©zú
        Read from our block cache.

        Parameters
        ----------
        start, end : int
            The start and end byte positions.
        start_block_number, end_block_number : int
            The start and end block numbers.
        rU   Nr)   ©r   r#   r²   Úextendry   ru   r{   Újoin©	r&   r*   rc   r¾   r¿   Ú	start_posÚend_posÚblockÚouts	            r'   rÀ   zBlockCache._read_cache³  sù   € ð ˜DœNÑ*ˆ	Ø˜œÑ&ˆàˆŒ˜!ÑˆŒØÐ!1Ò1Ð1Ø×3Ò3Ð4FÑGÔGˆEØ˜ 7Ð*Ô+Ð+ð ×+Ò+Ð,>Ñ?Ô?À	À
À
ÔKÐLˆCð
 �JŠJÝØÔ,ÝÐ,¨qÑ0Ð2BÑCÔCñô ñô ð ð �JŠJ�t×/Ò/Ð0@ÑAÔAÀ(À7À(ÔKÑLÔLÐLà—8’8˜C‘=”=Ð r)   ©rª   ©
r   r   r   r   r   r   r«   r   r   r   r“   r”   r’   )rÁ   r   r   r-   ©
r*   r   rc   r   r¾   r   r¿   r   r   r-   )r:   r?   r@   rA   r   r(   r·   r�   r‘   r0   r±   rÀ   r•   r–   s   @r'   r¨   r¨   S  sÞ   ø€ € € € € ðð ð, €Dð MOðUð Uð Uð Uð Uð Uð Uð	5ð 	5ð 	5ðð ð ð ð

ð 
ð 
ð 
ð
ð 
ð 
ð 
ð.ð ð ð ð ð ð$&!ð &!ð &!ð &!ð &!ð &!ð &!ð &!r)   r¨   c                  óH   ‡ — e Zd ZU dZdZded<   	 ddˆ fd„Zdd„Zdd„Zˆ xZ	S )Ú
BytesCacheaK  Cache which holds data in a in-memory bytes object

    Implements read-ahead by the block size, for semi-random reads progressing
    through the file.

    Parameters
    ----------
    trim: bool
        As we read more data, whether to discard the start of the buffer when
        we are more than a blocksize ahead of it.
    r-   r   r   Tr   r   r   r   r   ÚtrimÚboolr   r   c                ó†   •— t          ¦   «                              |||¦  «         d| _        d | _        d | _        || _        d S )Nr)   )rO   r(   rR   r*   rc   rØ   )r&   r   r   r   rØ   r9   s        €r'   r(   zBytesCache.__init__ë  sA   ø€ õ 	‰Œ×Ò˜ G¨TÑ2Ô2Ð2ØˆŒ
Ø!%ˆŒ
Ø#ˆŒØˆŒ	ˆ	ˆ	r)   r*   r+   rc   c                óV  — |€d}|€| j         }|| j         k    s||k    rdS | j        �L|| j        k    rA| j        �:|| j        k     r/|| j        z
  }| xj        dz  c_        | j        |||z   |z
  …         S | j        rt          | j         || j        z   ¦  «        }n|}||k    s|| j         k    rdS | j        �|| j        k     rY| j        �|| j        k    rG| xj        ||z
  z  c_        | xj        dz  c_        |  	                    ||¦  «        | _        || _        �nu| j        €J ‚| j        €J ‚| xj        dz  c_        || j        k     rš| j        �| j        |z
  | j        k    r6| xj        ||z
  z  c_        |  	                    ||¦  «        | _        || _        nø| xj        | j        |z
  z  c_        |  	                    || j        ¦  «        }|| _        || j        z   | _        n®| j        �§|| j        k    rœ| j        | j         k    rn‹|| j        z
  | j        k    r6| xj        ||z
  z  c_        |  	                    ||¦  «        | _        || _        nB| xj        || j        z
  z  c_        |  	                    | j        |¦  «        }| j        |z   | _        | j        t          | j        ¦  «        z   | _        || j        z
  }| j        |||z   |z
  …         }| j        rT| j        | j        z
  | j        dz   z  }|dk    r4| xj        | j        |z  z  c_        | j        | j        |z  d …         | _        |S r�   )r   r*   rc   r#   rR   r   rz   r%   r$   r   r}   rØ   )r&   r*   rc   ÚoffsetÚbendÚnewrÒ   Únums           r'   r0   zBytesCache._fetchô  sa  € ð ˆ=ØˆEØˆ;Ø”)ˆCØ�D”IÒÐ ¨#¢ Ø�3àŒJÐ"Ø˜œÒ#Ð#Ø”Ð$Ø�d”h’�ð ˜TœZÑ'ˆFØˆNŒN˜aÑˆNŒNØ”:˜f v°¡|°eÑ';Ð;Ô<Ð<àŒ>ð 	Ý�t”y #¨¬Ñ"6Ñ7Ô7ˆDˆDàˆDà�5Š=ˆ=˜E D¤IÒ-Ð-Ø�3àŒJÐ %¨$¬*Ò"4Ð"4ØŒHÐ  d¤h¢ ð Ð&Ô&¨$°©,Ñ6Ð&Ô&ØˆOŒO˜qÑ ˆOŒOØŸš e¨TÑ2Ô2ˆDŒJØˆDŒJ‰Jà”:Ð)Ð)Ð)Ø”8Ð'Ð'Ð'ØˆOŒO˜qÑ ˆOŒOà�t”zÒ!Ð!Ø”8Ð# t¤x°#¡~¸¼Ò'FÐ'FØÐ.Ô.°$¸±,Ñ>Ð.Ô.Ø!%§¢¨e°TÑ!:Ô!:�D”JØ!&�D”J�JàÐ.Ô.°$´*¸uÑ2DÑDÐ.Ô.ØŸ,š, u¨d¬jÑ9Ô9�CØ!&�D”JØ!$ t¤zÑ!1�D”J�JØ”Ð%¨$°´ª/¨/Ø”8˜dœiÒ'Ð'ØØ˜4œ8‘^ d¤nÒ4Ð4ØÐ.Ô.°$¸±,Ñ>Ð.Ô.Ø!%§¢¨e°TÑ!:Ô!:�D”JØ!&�D”J�JàÐ.Ô.°$¸¼±/ÑAÐ.Ô.ØŸ,š, t¤x°Ñ6Ô6�CØ!%¤¨cÑ!1�D”Jà”:¥ D¤J¡¤Ñ/ˆŒØ˜œÑ#ˆØŒj˜ &¨3¡,°Ñ"6Ð6Ô7ˆØŒ9ð 	@Ø”8˜dœjÑ(¨d¬n¸qÑ.@ÑAˆCØ�QŠwˆwØ�
”
˜dœn¨sÑ2Ñ2�
”
Ø!œZ¨¬¸Ñ(<Ð(>Ð(>Ô?�”
Øˆ
r)   c                ó*   — t          | j        ¦  «        S rN   )r}   rR   r2   s    r'   Ú__len__zBytesCache.__len__=  s   € Ý�4”:‰ŒÐr)   )T)
r   r   r   r   r   r   rØ   rÙ   r   r   r’   )r   r   )
r:   r?   r@   rA   r   rB   r(   r0   rá   r•   r–   s   @r'   r×   r×   Ü  s•   ø€ € € € € € ð
ð 
ð "€DÐ!Ð!Ð!Ñ!ð IMðð ð ð ð ð ð ðGð Gð Gð GðRð ð ð ð ð ð ð r)   r×   c                  óF   ‡ — e Zd ZU dZdZded<   	 	 	 	 ddˆ fd„Zdd„Zˆ xZS )ÚAllBytesz!Cache entire contents of the fileÚallr   r   Nr   r+   r   úFetcher | Noner   r¦   úbytes | Noner   r   c                óà   •— t          ¦   «                              |||¦  «         |€@| xj        dz  c_        | xj        | j        z  c_        |                      d| j        ¦  «        }|| _        d S )NrU   r   )rO   r(   r$   r%   r   r   r¦   )r&   r   r   r   r¦   r9   s        €r'   r(   zAllBytes.__init__F  sl   ø€ õ 	‰Œ×Ò˜ G¨TÑ2Ô2Ð2Øˆ<ØˆOŒO˜qÑ ˆOŒOØÐ&Ô&¨$¬)Ñ3Ð&Ô&Ø—<’<  4¤9Ñ-Ô-ˆDØˆŒ	ˆ	ˆ	r)   r*   r,   r-   c                ó@   — | xj         dz  c_         | j        ||…         S )NrU   )r#   r¦   r/   s      r'   r0   zAllBytes._fetchT  s#   € ØˆŒ˜!ÑˆŒØŒy˜˜t˜Ô$Ð$r)   )NNNN)
r   r+   r   rå   r   r+   r¦   ræ   r   r   r=   ©	r:   r?   r@   rA   r   rB   r(   r0   r•   r–   s   @r'   rã   rã   A  s}   ø€ € € € € € Ø+Ð+à€DÐÐÐÑð !%Ø"&ØØ!ðð ð ð ð ð ð ð%ð %ð %ð %ð %ð %ð %ð %r)   rã   c                  óF   ‡ — e Zd ZU dZdZded<   	 	 ddˆ fd„Zdˆ fd„Zˆ xZS )ÚKnownPartsOfAFilea½  
    Cache holding known file parts.

    Parameters
    ----------
    blocksize: int
        How far to read ahead in numbers of bytes
    fetcher: func
        Function of the form f(start, end) which gets bytes from remote as
        specified
    size: int
        How big this file is
    data: dict
        A dictionary mapping explicit `(start, stop)` file-offset tuples
        with known bytes.
    strict: bool, default True
        Whether to fetch reads that go beyond a known byte-range boundary.
        If `False`, any read that ends outside a known part will be zero
        padded. Note that zero padding will not be used for reads that
        begin outside a known byte-range.
    Úpartsr   r   NTr   r   r   r   r   r¦   ú#dict[tuple[int, int], bytes] | NoneÚstrictrÙ   rƒ   r
   c                ó`  •— t          ¦   «                              |||¦  «         || _        |rùt          |                     ¦   «         ¦  «        }|d         g}|                     |d         ¦  «        g}	|dd …         D ]„\  }
}|d         \  }}|
|k    r-||f|d<   |	dxx         |                     |
|f¦  «        z  cc<   ŒC|                     |
|f¦  «         |	                     |                     |
|f¦  «        ¦  «         Œ…t          t          ||	¦  «        ¦  «        | _	        d S i | _	        d S )Nr   rU   rq   )
rO   r(   rî   ÚsortedÚkeysÚpopr{   ÚdictÚzipr¦   )r&   r   r   r   r¦   rî   rƒ   Úold_offsetsÚoffsetsrI   r*   r,   Ústart0Ústop0r9   s                 €r'   r(   zKnownPartsOfAFile.__init__r  s4  ø€ õ 	‰Œ×Ò˜ G¨TÑ2Ô2Ð2ØˆŒð ð 	Ý  §¢¡¤Ñ-Ô-ˆKØ" 1”~Ð&ˆGØ—h’h˜{¨1œ~Ñ.Ô.Ð/ˆFØ*¨1¨2¨2œð ;ð ;‘��tØ '¨¤‘�˜Ø˜E’>�>Ø#)¨4 .�G˜B‘KØ˜2�J�J”J $§(¢(¨E°4¨=Ñ"9Ô"9Ñ9�J�J‘J�Jà—N’N E¨4 =Ñ1Ô1Ð1Ø—M’M $§(¢(¨E°4¨=Ñ"9Ô"9Ñ:Ô:Ð:Ð:å�S ¨&Ñ1Ô1Ñ2Ô2ˆDŒIˆIˆIàˆDŒIˆIˆIr)   r*   r+   r,   r   r-   c                ó€  •— |€d}|€| j         }d}| j                             ¦   «         D ]w\  \  }}}||cxk    r|k     rbn Œ||z
  }||||z   |z
  …         }| j        r||cxk    r|k    r2n n/|d||z
  t	          |¦  «        z
  z  z  }| xj        dz  c_        |c S |} nŒx| j        €t          d||f› d�¦  «        ‚t          j	        d||f› d�¦  «         t                               d|› d	|› �¦  «         | xj        ||z
  z  c_        | xj        dz  c_        |t          ¦   «                              ||¦  «        z   S )
Nr   r)   ó    rU   z&Read is outside the known file parts: z. z%. IO/caching performance may be poor!z!KnownPartsOfAFile cache fetching re   )r   r¦   Úitemsrî   r}   r#   r   rÆ   ÚwarningsÚwarnrs   rt   r%   r$   rO   r0   )	r&   r*   r,   rÒ   Úloc0Úloc1r¦   Úoffr9   s	           €r'   r0   zKnownPartsOfAFile._fetch�  s¾  ø€ Øˆ=ØˆEØˆ<Ø”9ˆDàˆØ"&¤)§/¢/Ñ"3Ô"3ð 	ð 	Ñ‰LˆT�4˜$ð �uÐ#Ð#Ò#Ð#˜tÒ#Ð#Ð#Ð#Ð#Ø˜d‘l�Ø˜3  t¡¨eÑ!3Ð3Ô4�Ø”{ð  d¨dÐ&:Ð&:Ò&:Ð&:°dÒ&:Ð&:Ð&:Ð&:Ð&:ð
 ˜7 d¨U¡lµS¸±X´XÑ&=Ñ>Ñ>�CØ�N”N aÑ'�N”NØ�J�J�Jð
 !�EØ�Eð! $ð* Œ<ÐåÐWÀuÈdÀmÐWÐWÐWÑXÔXÐXõ 	Œð3°e¸T°]ð 3ð 3ð 3ñ	
ô 	
ð 	
õ 	�ŠÐG¸ÐGÐGÀÐGÐGÑHÔHÐHØÐ"Ô" d¨U¡lÑ2Ð"Ô"ØˆŒ˜1ÑˆŒØ•U‘W”W—^’^ E¨4Ñ0Ô0Ñ0Ð0r)   )NT)r   r   r   r   r   r   r¦   rí   rî   rÙ   rƒ   r
   r=   ré   r–   s   @r'   rë   rë   Y  s‡   ø€ € € € € € ðð ð, "€DÐ!Ð!Ð!Ñ!ð 59Øðð ð ð ð ð ð ð<+1ð +1ð +1ð +1ð +1ð +1ð +1ð +1ð +1ð +1r)   rë   c                  óX   — e Zd ZdZ G d„ de¦  «        Zddd„Zdd„Zdd„Zdd„Z	dd„Z
dS ) ÚUpdatableLRUzg
    Custom implementation of LRU cache that allows updating keys

    Used by BackgroudBlockCache
    c                  ó8   — e Zd ZU ded<   ded<   ded<   ded<   dS )úUpdatableLRU.CacheInfor   ÚhitsÚmissesÚmaxsizeÚcurrsizeN)r:   r?   r@   rB   rC   r)   r'   Ú	CacheInfor  Å  s4   € € € € € € Øˆ	ˆ	‰	Øˆˆ‰Øˆˆ‰Øˆˆ‰ˆˆr)   r	  é€   ÚfuncúCallable[P, T]Úmax_sizer   r   r   c                óž   — t          j        ¦   «         | _        || _        || _        d| _        d| _        t          j        ¦   «         | _	        d S r!   )
Úcollectionsr   Ú_cacheÚ_funcÚ	_max_sizeÚ_hitsÚ_missesÚ	threadingÚLockÚ_lock)r&   r  r  s      r'   r(   zUpdatableLRU.__init__Ë  sA   € Ý+6Ô+BÑ+DÔ+DˆŒØˆŒ
Ø!ˆŒØˆŒ
ØˆŒÝ”^Ñ%Ô%ˆŒ
ˆ
ˆ
r)   ÚargsúP.argsÚkwargsúP.kwargsr   c                ó&  — |r$t          d|                     ¦   «         › �¦  «        ‚| j        5  || j        v rC| j                             |¦  «         | xj        dz  c_        | j        |         cd d d ¦  «         S 	 d d d ¦  «         n# 1 swxY w Y    | j        |i |¤Ž}| j        5  || j        |<   | xj        dz  c_        t          | j        ¦  «        | j	        k    r| j         
                    d¬¦  «         d d d ¦  «         n# 1 swxY w Y   |S )Nz Got unexpected keyword argument rU   F©Úlast)Ú	TypeErrorrñ   r  r  Úmove_to_endr  r  r  r}   r  Úpopitem)r&   r  r  Úresults       r'   Ú__call__zUpdatableLRU.__call__Ó  s¶  € Øð 	PÝÐN¸v¿{º{¹}¼}ÐNÐNÑOÔOÐOØŒZð 	)ð 	)Ø�t”{Ð"Ð"Ø”×'Ò'¨Ñ-Ô-Ð-Ø�
”
˜a‘�
”
Ø”{ 4Ô(ð		)ð 	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)Ø"ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð �”˜TÐ, VÐ,Ð,ˆàŒZð 	0ð 	0Ø &ˆDŒK˜ÑØˆLŒL˜AÑˆLŒLÝ�4”;ÑÔ $¤.Ò0Ð0Ø”×#Ò#¨Ð#Ñ/Ô/Ð/ð		0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð ˆs%   ®A BÂBÂBÂ'ADÄD
ÄD
r
   rÙ   c                óV   — | j         5  || j        v cd d d ¦  «         S # 1 swxY w Y   d S rN   )r  r  )r&   r  s     r'   Úis_key_cachedzUpdatableLRU.is_key_cachedæ  sx   € ØŒZð 	'ð 	'Ø˜4œ;Ð&ð	'ð 	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð 	'ð 	's   ˆ	ž"¥"r"  c                óÊ   — | j         5  || j        |<   t          | j        ¦  «        | j        k    r| j                             d¬¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )NFr  )r  r  r}   r  r!  )r&   r"  r  s      r'   Úadd_keyzUpdatableLRU.add_keyê  sª   € ØŒZð 	0ð 	0Ø &ˆDŒK˜ÑÝ�4”;ÑÔ $¤.Ò0Ð0Ø”×#Ò#¨Ð#Ñ/Ô/Ð/ð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð 	0ð 	0s   ˆAAÁAÁAr  c                ó¸   — | j         5  |                      | j        t          | j        ¦  «        | j        | j        ¬¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )N)r  r  r  r  )r  r	  r  r}   r  r  r  r2   s    r'   r·   zUpdatableLRU.cache_infoð  s    € ØŒZð 	ð 	Ø—>’>ØœÝ˜Tœ[Ñ)Ô)Ø”ZØ”|ð	 "ñ ô ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ˆ:AÁAÁAN)r
  )r  r  r  r   r   r   )r  r  r  r  r   r   )r  r
   r   rÙ   )r"  r   r  r
   r   r   ©r   r  )r:   r?   r@   rA   r   r	  r(   r#  r%  r'  r·   rC   r)   r'   r  r  ¾  s±   € € € € € ðð ðð ð ð ð �Jñ ô ð ð&ð &ð &ð &ð &ðð ð ð ð&'ð 'ð 'ð 'ð0ð 0ð 0ð 0ðð ð ð ð ð r)   r  c                  ón   ‡ — e Zd ZU dZdZded<   	 d!d"ˆ fd„Zd#d„Zd$d„Zd%d„Z	d&d„Z
d'd(ˆ fd„Zd)d „Zˆ xZS )*ÚBackgroundBlockCacheaƒ  
    Cache holding memory as a set of blocks with pre-loading of
    the next block in the background.

    Requests are only ever made ``blocksize`` at a time, and are
    stored in an LRU cache. The least recently accessed block is
    discarded when more than ``maxblocks`` are stored. If the
    next block is not in cache, it is loaded in a separate thread
    in non-blocking way.

    Parameters
    ----------
    blocksize : int
        The number of bytes to store in each block.
        Requests are only ever made for ``blocksize``, so this
        should balance the overhead of making a request against
        the granularity of the blocks.
    fetcher : Callable
    size : int
        The total size of the file being cached.
    maxblocks : int
        The maximum number of blocks to cache for. The maximum memory
        use for this cache is then ``blocksize * maxblocks``.
    Ú
backgroundr   r   rª   r   r   r   r   r   r«   r   r   c                ó>  •— t          ¦   «                              |||¦  «         t          j        ||z  ¦  «        | _        || _        t          | j        |¦  «        | _        t          d¬¦  «        | _
        d | _        d | _        t          j        ¦   «         | _        d S )NrU   ©Úmax_workers)rO   r(   r­   r®   r"   r«   r  r±   r²   r   Ú_thread_executorÚ_fetch_future_block_numberÚ_fetch_futurer  r  Ú_fetch_future_lockr³   s        €r'   r(   zBackgroundBlockCache.__init__  sŒ   ø€ õ 	‰Œ×Ò˜ G¨TÑ2Ô2Ð2Ý”y ¨	Ñ!1Ñ2Ô2ˆŒØ"ˆŒÝ#/°Ô0AÀ9Ñ#MÔ#MˆÔ å 2¸qÐ AÑ AÔ AˆÔØ6:ˆÔ'Ø37ˆÔÝ"+¤.Ñ"2Ô"2ˆÔÐÐr)   r  c                ó4   — | j                              ¦   «         S rµ   r¶   r2   s    r'   r·   zBackgroundBlockCache.cache_info#  r¸   r)   r‰   c                ó2   — | j         }|d= |d= |d= |d= |d= |S )Nr²   r0  r1  r2  r3  rº   r�   s     r'   r�   z!BackgroundBlockCache.__getstate__.  s:   € Ø”ˆØÐ'Ð(ØÐ$Ð%ØÐ.Ð/Ø�/Ð"ØÐ&Ð'Øˆr)   c                óð   — | j                              |¦  «         t          | j        |d         ¦  «        | _        t          d¬¦  «        | _        d | _        d | _        t          j
        ¦   «         | _        d S )Nr«   rU   r.  )r‹   r|   r  r±   r²   r   r0  r1  r2  r  r  r3  r�   s     r'   r‘   z!BackgroundBlockCache.__setstate__7  sk   € ØŒ×Ò˜UÑ#Ô#Ð#Ý#/°Ô0AÀ5ÈÔCUÑ#VÔ#VˆÔ Ý 2¸qÐ AÑ AÔ AˆÔØ*.ˆÔ'Ø!ˆÔÝ"+¤.Ñ"2Ô"2ˆÔÐÐr)   r*   r+   rc   r-   c                óV  — |€d}|€| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }d }d }| j        5  | j        �Â| j        €J ‚| j                             ¦   «         r`t                               d¦  «         | j         	                    | j         
                    ¦   «         | j        ¦  «         d | _        d | _        n@t          || j        cxk    o|k    nc ¦  «        }|r| j        }| j        }d | _        d | _        d d d ¦  «         n# 1 swxY w Y   |�Gt                               d¦  «         | j         	                    | 
                    ¦   «         |¦  «         t          ||dz   ¦  «        D ]}|                      |¦  «         Œ|dz   }	| j        5  | j        €R|	| j        k    rG| j                             |	¦  «        s-|	| _        | j                             | j        |	d¦  «        | _        d d d ¦  «         n# 1 swxY w Y   |                      ||||¬¦  «        S )Nr   r)   z3BlockCache joined background fetch without waiting.z(BlockCache waiting for background fetch.rU   Úasyncr½   )r   r   r3  r2  r1  Údoners   rÇ   r²   r'  r"  rÙ   ru   r"   r%  r0  Úsubmitr±   rÀ   )
r&   r*   rc   r¾   r¿   Úfetch_future_block_numberÚfetch_futureÚ	must_joinrÁ   Úend_block_plus_1s
             r'   r0   zBackgroundBlockCache._fetch?  s,  € Øˆ=ØˆEØˆ;Ø”)ˆCØ�D”IÒÐ ¨#¢ Ø�3ð # d¤nÑ4ÐØ $¤.Ñ0Ðà$(Ð!ØˆØÔ$ð 	2ð 	2àÔ!Ð-ØÔ6ÐBÐBÐBØÔ%×*Ò*Ñ,Ô,ð 2Ý—K’KÐ UÑVÔVÐVØÔ,×4Ò4ØÔ*×1Ò1Ñ3Ô3°TÔ5Tñô ð ð 7;�DÔ3Ø)-�DÔ&Ð&õ !%Ø*ØÔ:ð,ð ,ò ,ð ,à+ò,ð ,ð ,ð ,ñ!ô !�Ið
 !ð 2ð 59Ô4SÐ1Ø'+Ô'9˜ð ;?˜Ô7Ø-1˜Ô*ð7	2ð 	2ð 	2ñ 	2ô 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2øøøð 	2ð 	2ð 	2ð 	2ð< Ð#Ý�KŠKÐBÑCÔCÐCàÔ$×,Ò,Ø×#Ò#Ñ%Ô%Ð'@ñô ð õ
 "Ð"4Ð6FÈÑ6JÑKÔKð 	3ð 	3ˆLØ×$Ò$ \Ñ2Ô2Ð2Ð2ð ,¨aÑ/ÐØÔ$ð 		ð 		àÔ"Ð*Ø$¨¬Ò4Ð4ØÔ0×>Ò>Ð?OÑPÔPð 5ð 3C�Ô/Ø%)Ô%:×%AÒ%AØÔ%Ð'7¸ñ&ô &�Ô"ð		ð 		ð 		ñ 		ô 		ð 		ð 		ð 		ð 		ð 		ð 		øøøð 		ð 		ð 		ð 		ð ×ÒØØØ1Ø-ð	  ñ 
ô 
ð 	
s&   Á C
DÄDÄDÆ!AHÈHÈHÚsyncrÁ   Úlog_infor4   c                ó>  •— || j         k    rt          d|› d| j         › d�¦  «        ‚|| j        z  }|| j        z   }t                               d||¦  «         | xj        ||z
  z  c_        | xj        dz  c_        t          ¦   «                              ||¦  «        }|S )rÃ   rÄ   rÅ   rr   z!BlockCache fetching block (%s) %drU   )	r"   rÆ   r   rs   rÇ   r%   r$   rO   r0   )r&   rÁ   r@  r*   rc   rÈ   r9   s         €r'   r±   z!BackgroundBlockCache._fetch_block‹  s¿   ø€ ð ˜$œ,Ò&Ð&Ýð9 ð 9ð 9Ø)-¬ð9ð 9ð 9ñô ð ð
 ˜tœ~Ñ-ˆØ�d”nÑ$ˆÝ�ŠÐ7¸À<ÑPÔPÐPØÐ"Ô" c¨E¡kÑ1Ð"Ô"ØˆŒ˜1ÑˆŒÝ™œŸš¨¨sÑ3Ô3ˆØÐr)   r¾   r¿   c           	     óÌ  — || j         z  }|| j         z  }| xj        dz  c_        ||k    r|                      |¦  «        }|||…         S |                      |¦  «        |d…         g}|                     t	          | j        t          |dz   |¦  «        ¦  «        ¦  «         |                     |                      |¦  «        d|…         ¦  «         d                     |¦  «        S rÊ   rË   rÎ   s	            r'   rÀ   z BackgroundBlockCache._read_cache�  sû   € ð ˜DœNÑ*ˆ	Ø˜œÑ&ˆð 	ˆŒ˜!ÑˆŒàÐ!1Ò1Ð1Ø×,Ò,Ð-?Ñ@Ô@ˆEØ˜ 7Ð*Ô+Ð+ð ×+Ò+Ð,>Ñ?Ô?À	À
À
ÔKÐLˆCð
 �JŠJÝØÔ,ÝÐ,¨qÑ0Ð2BÑCÔCñô ñô ð ð �JŠJ�t×/Ò/Ð0@ÑAÔAÀ(À7À(ÔKÑLÔLÐLà—8’8˜C‘=”=Ð r)   rÓ   rÔ   r)  r“   r>   r’   )r?  )rÁ   r   r@  r4   r   r-   rÕ   )r:   r?   r@   rA   r   rB   r(   r·   r�   r‘   r0   r±   rÀ   r•   r–   s   @r'   r+  r+  ú  sô   ø€ € € € € € ðð ð2 '€DÐ&Ð&Ð&Ñ&ð MOð3ð 3ð 3ð 3ð 3ð 3ð 3ð	5ð 	5ð 	5ð 	5ðð ð ð ð3ð 3ð 3ð 3ðJ
ð J
ð J
ð J
ðXð ð ð ð ð ð ð$(!ð (!ð (!ð (!ð (!ð (!ð (!ð (!r)   r+  z!dict[str | None, type[BaseCache]]ÚcachesFÚclsútype[BaseCache]ÚclobberrÙ   r   r   c                ó~   — | j         }|s)|t          v r t          d|›dt          |         › �¦  «        ‚| t          |<   dS )zÝ'Register' cache implementation.

    Parameters
    ----------
    clobber: bool, optional
        If set to True (default is False) - allow to overwrite existing
        entry.

    Raises
    ------
    ValueError
    zCache with name z is already known: N)r   rC  rÆ   )rD  rF  r   s      r'   Úregister_cacherH  Î  sL   € ð Œ8€DØð W�t�v�~�~ÝÐU¨DÐUÐUÅvÈdÄ|ÐUÐUÑVÔVÐVØ…Fˆ4�L€L€Lr)   )F)rD  rE  rF  rÙ   r   r   )3Ú
__future__r   r  r¯   Úloggingr­   rY   r  rü   r   Úconcurrent.futuresr   r   Ú	itertoolsr   Úoperatorr   Útypingr	   r
   r   r   r   r   r   rF   Útyping_extensionsr   r   r   Ú	getLoggerrs   r   r-   r   ÚlistÚMultiFetcherr   rE   r˜   r¢   r¨   r×   rã   rë   r  r+  rC  rB   rH  ÚcrC   r)   r'   ú<module>rT     sü  ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ø€K€K€Kà+Ð+Ð+Ð+Ð+Ð+àˆ	�#‰Œ€A€Aàˆ�‰Œ€Aà€GˆC�L„L€ð 
ˆÔ	˜8Ñ	$Ô	$€à
�C˜�:˜uÐ$Ô
%€Ø˜˜c 3˜hœÐ(¨%Ð/Ô0€ð<ð <ð <ð <ð <ñ <ô <ð <ð~K&ð K&ð K&ð K&ð K&�	ñ K&ô K&ð K&ð\+%ð +%ð +%ð +%ð +%�Yñ +%ô +%ð +%ð\+,ð +,ð +,ð +,ð +,�iñ +,ô +,ð +,ð\F!ð F!ð F!ð F!ð F!�ñ F!ô F!ð F!ðRbð bð bð bð b�ñ bô bð bðJ%ð %ð %ð %ð %ˆyñ %ô %ð %ð0b1ð b1ð b1ð b1ð b1˜	ñ b1ô b1ð b1ðJ9ð 9ð 9ð 9ð 9�7˜1˜a˜4”=ñ 9ô 9ð 9ðxK!ð K!ð K!ð K!ð K!˜9ñ K!ô K!ð K!ð` 	ˆ)ð-€ð ð ð ñ ðð ð ð ð ð( ØØØØØØØØð

ð ð €Að €N�1ÑÔÐÐðð r)   