
    ̒gemp              	         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
mZ d dlmZ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 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e*d<   d'd(d&Z+ee e$e!e#e"e%e&e(f	D ]Z, e+e,           dS ))    )annotationsN)FutureThreadPoolExecutor)TYPE_CHECKINGAnyCallableClassVarGeneric
NamedTupleOrderedDictTypeVar)	ParamSpecPTfsspecc                  2    e Zd ZU dZdZded<   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                0    || _         || _        || _        d S N)r   r   r   )selfr   r   r   s       .lib/python3.11/site-packages/fsspec/caching.py__init__zBaseCache.__init__9   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._fetch>   sF    =E<9DDI$3||E4(((r#   Nr   r   r   r   r   r   r   r   r$   r%   r&   r%   r   r'   )__name__
__module____qualname____doc__r   __annotations__r"   r+    r#   r!   r   r   '   s[           !D       
) ) ) ) ) )r#   r   c                  N     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 )!	MMapCachezmemory-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
    mmapNr   r   r   r   r   location
str | Noneblocksset[int] | Noner   r   c                    t                                          |||           |t                      n|| _        || _        |                                 | _        d S r   )superr"   setr9   r7   	_makefilecache)r    r   r   r   r7   r9   	__class__s         r!   r"   zMMapCache.__init__S   sP     	GT222%~ceee6 ^^%%


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rb+)r6   tempfiler   	bytearrayr7   ospathexistsTemporaryFiler=   r9   openseekwriteflushfileno)r    r6   rE   fds       r!   r>   zMMapCache._makefile`   s    9>>;; = t}(E(E }$++--!ee$-//GGDIM"""HHTNNNHHJJJJdmU++Btydi000r#   r$   r%   endr'   c                B    t                               d| d|            |d}| j        }| j        k    s||k    rdS | j        z  }| j        z  } fdt	          ||dz             D             }|r|                    d          }| j        z  }t          | j        z    j                  }t                               d| d| d|                                 ||           j        ||<    j	        
                    |           | j        ||         S )	NzMMap cache fetching -r   r#   c                &    g | ]}|j         v|S r3   )r9   ).0ir    s     r!   
<listcomp>z$MMapCache._fetch.<locals>.<listcomp>   s%    UUUa@T@T@T@T@Tr#   rC   zMMap get block #z ()loggerdebugr   r   rangepopminr   r?   r9   add)	r    r$   rQ   start_block	end_blockneedrV   sstartsends	   `        r!   r+   zMMapCache._fetchv   sL   9E99C99:::=E;)CDI#3t~-4>)	UUUU5i!m<<UUU 	 A'Fv.	::DLL@A@@@@$@@AAA&*ll64&@&@DJvd{#KOOA  	 z%)$$r#   dict[str, Any]c                >    | j                                         }|d= |S )Nr?   )__dict__copyr    states     r!   __getstate__zMMapCache.__getstate__   s!    ""$$'Nr#   rh   c                l    | j                             |           |                                 | _        d S r   )re   updater>   r?   rg   s     r!   __setstate__zMMapCache.__setstate__   s-    U###^^%%


r#   )NN)r   r   r   r   r   r   r7   r8   r9   r:   r   r   )r   rA   r$   r%   rQ   r%   r   r'   r   rc   rh   rc   r   r   )r.   r/   r0   r1   r   r"   r>   r+   ri   rl   __classcell__r@   s   @r!   r5   r5   H   s          D  $"&& & & & & & &1 1 1 1,% % % %.   & & & & & & & &r#   r5   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   )r<   r"   r?   r$   rQ   r    r   r   r   r@   s       r!   r"   zReadAheadCache.__init__   s8    GT222

r#   r$   r%   rQ   r'   c                J   |d}||| j         k    r| j         }|| j         k    s||k    rdS ||z
  }|| j        k    r*|| j        k    r| j        || j        z
  || j        z
           S | j        |cxk    r| j        k     r4n n1| j        || j        z
  d          }|t	          |          z  }| j        }nd}t          | j         || j        z             }|                     ||          | _        || _        | j        t	          | j                  z   | _        || j        d |         z   S r)   )r   r$   rQ   r?   lenr\   r   r   )r    r$   rQ   lparts        r!   r+   zReadAheadCache._fetch   s9   =E;#	//)CDI#3%KDJ3$(??:edj033CCDDZ5++++48+++++:edj0223DTNAHEE D$)S4>122\\%--

:DJ/dj!n$$r#   r,   rm   r.   r/   r0   r1   r   r"   r+   rp   rq   s   @r!   rs   rs      sb          D     % % % % % % % %r#   rs   c                  0     e Zd ZdZdZd fd
ZddZ xZS )FirstChunkCachezCaches 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                \    t                                          |||           d | _        d S r   )r<   r"   r?   rv   s       r!   r"   zFirstChunkCache.__init__   s*    GT222#'


r#   r$   r%   rQ   r'   c                   |pd}|p| j         }|| j        k     r| j        _|| j        k    r4|                     d|          }|d | j                 | _        ||d          S |                     d| j                  | _        | j        ||         }|| j        k    r||                     | j        |          z  }|S |                     ||          S Nr   )r   r   r?   r   )r    r$   rQ   datarz   s        r!   r+   zFirstChunkCache._fetch   s    
TY4>!!z!''<<3//D!%&6&6!7DJ<'!\\!T^<<
:eCi(DT^##T^S999K<<s+++r#   r,   rm   r{   rq   s   @r!   r}   r}      sb          D( ( ( ( ( (, , , , , , , ,r#   r}   c                  f     e Zd ZdZdZ	 dd fdZd 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 r   )
r<   r"   mathceilnblocksr   	functools	lru_cache_fetch_block_fetch_block_cachedr    r   r   r   r   r@   s        r!   r"   zBlockCache.__init__   sd     	GT222y	!122"#A9#6y#A#A$BS#T#T   r#   strc                8    d| j          d| j         d| j         dS )Nz<BlockCache blocksize=, size=
, nblocks=>r   r   r   r    s    r!   __repr__zBlockCache.__repr__  s=    9T^ 9 9I9 9)-9 9 9	
r#   c                4    | j                                         S z
        The statistics on the block cache.

        Returns
        -------
        NamedTuple
            Returned directly from the LRU Cache used internally.
        r   
cache_infor   s    r!   r   zBlockCache.cache_info	       '22444r#   rc   c                    | j         }|d= |S )Nr   re   rg   s     r!   ri   zBlockCache.__getstate__  s    '(r#   rh   c                    | j                             |            t          j        |d                   | j                  | _        d S )Nr   )re   rk   r   r   r   r   rg   s     r!   rl   zBlockCache.__setstate__  sH    U####J9#6u[7I#J#J$
 $
   r#   r$   r%   rQ   r'   c                    |d}|| j         }|| j         k    s||k    rdS || j        z  }|| j        z  }t          ||dz             D ]}|                     |           |                     ||||          S )Nr   r#   rC   start_block_numberend_block_number)r   r   rZ   r   _read_cache)r    r$   rQ   r   r   block_numbers         r!   r+   zBlockCache._fetch  s    =E;)CDI#3 #dn4$.0 ""46F6JKK 	3 	3L$$\22221-	   
 
 	
r#   r   c                    || j         k    rt          d| d| j          d          || j        z  }|| j        z   }t                              d|           t                                          ||          }|S )=
        Fetch the block of data for `block_number`.
        'block_number=(' is greater than the number of blocks ()zBlockCache fetching block %dr   
ValueErrorr   rX   infor<   r+   )r    r   r$   rQ   block_contentsr@   s        r!   r   zBlockCache._fetch_block6  s     $,&&9 9 9)-9 9 9  
 t~-dn$2LAAAs33r#   r   r   c                   || j         z  }|| j         z  }||k    r|                     |          }|||         S g }|                    |                     |          |d                    t          |dz   |          D ]*}	|                    |                     |	                     +|                    |                     |          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.
        NrC   r#   r   r   appendrZ   join
r    r$   rQ   r   r   	start_posend_posblockoutr   s
             r!   r   zBlockCache._read_cacheF  s     DN*	&!111334FGGE7*++ CJJt//0BCCIJJOPPP
 !&&81&<>N O O C C

433LAABBBB JJt//0@AA(7(KLLL88C== r#   r   
r   r   r   r   r   r   r   r   r   r   r   r   rn   ro   rm   )r   r   r   r'   
r$   r   rQ   r   r   r   r   r   r   r'   )r.   r/   r0   r1   r   r"   r   r   ri   rl   r+   r   r   rp   rq   s   @r!   r   r      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#   )r<   r"   r?   r$   rQ   r   )r    r   r   r   r   r@   s        r!   r"   zBytesCache.__init__z  sA     	GT222
!%
#			r#   r$   r%   rQ   c                $   |d}|| j         }|| j         k    s||k    rdS | j        <|| j        k    r1| j        *|| j        k     r|| j        z
  }| j        |||z   |z
           S | j        rt          | j         || j        z             }n|}||k    s|| j         k    rdS | j        || j        k     r6| j        || j        k    r$|                     ||          | _        || _        n| j        J | j        J || j        k     ro| j        | j        |z
  | j        k    r#|                     ||          | _        || _        n|                     || j                  }|| _        || j        z   | _        n| j        ||| j        k    rq| j        | j         k    rn`|| j        z
  | j        k    r#|                     ||          | _        || _        n*|                     | 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 )Nr   r#   rC   )	r   r$   rQ   r?   r   r\   r   rx   r   )r    r$   rQ   offsetbendnewr   nums           r!   r+   zBytesCache._fetch  s    =E;)CDI#3J"##$dh TZ'F:fv|e';;<<> 	ty#"677DDD5==EDI--3J%$*"4"4Hdh eT22DJDJJ:)))8'''tz!!8#tx#~'F'F!%eT!:!:DJ!&DJJ,,udj99C!&DJ!$tz!1DJJ%$//8di''48^dn44!%eT!:!:DJ!&DJJ,,tx66C!%c!1DJ:DJ/#j&3,"6679 	@8dj(dnq.@ACQww

dns22

!Z(<(>(>?

r#   c                *    t          | j                  S r   )rx   r?   r   s    r!   __len__zBytesCache.__len__  s    4:r#   )T)
r   r   r   r   r   r   r   r   r   r   rm   )r   r   )
r.   r/   r0   r1   r   r2   r"   r+   r   rp   rq   s   @r!   r   r   k  s         
 
 "D!!!! IM      ? ? ? ?B       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                                          |||           ||                     d| j                  }|| _        d S r   )r<   r"   r   r   r   )r    r   r   r   r   r@   s        r!   r"   zAllBytes.__init__  sF     	GT222<<<49--D			r#   r$   r&   r'   c                     | j         ||         S r   )r   r*   s      r!   r+   zAllBytes._fetch  s    yt$$r#   )NNNN)
r   r%   r   r   r   r%   r   r   r   r   r-   	r.   r/   r0   r1   r   r2   r"   r+   rp   rq   s   @r!   r   r     s}         ++D !%"&!
 
 
 
 
 
 
% % % % % % % %r#   r   c                  F     e Zd ZU dZdZded<   i df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   Tr   r   r   r   r   r   dict[tuple[int, int], bytes]strictr   _r   c                `   t                                          |||           || _        |rt          |                                          }|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 || _	        d S )Nr   rC   )
r<   r"   r   sortedkeysr[   r   dictzipr   )r    r   r   r   r   r   r   old_offsetsoffsetsr9   r$   r&   start0stop0r@   s                 r!   r"   zKnownPartsOfAFile.__init__  s4    	GT222  	 --K"1~&Ghh{1~../F*122 ; ;t 'E>>#)4.GBK2JJJ$((E4="9"99JJJJNNE4=111MM$((E4="9"9::::S&1122DIIIDIIIr#   r$   r%   r&   r   r'   c                   |d}|| j         }d}| j                                        D ]g\  \  }}}||cxk    r|k     rRn ||z
  }||||z   |z
           }| j        r||cxk    r|k    r"n n|d||z
  t	          |          z
  z  z  }|c S |} nh| j        t          d||f d          t          j        d||f d           t          
                    d| d|            |t                                          ||          z   S )	Nr   r#       z&Read is outside the known file parts: z. z%. IO/caching performance may be poor!z!KnownPartsOfAFile cache fetching rS   )r   r   itemsr   rx   r   r   warningswarnrX   rY   r<   r+   )	r    r$   r&   r   loc0loc1r   offr@   s	           r!   r+   zKnownPartsOfAFile._fetch  s   =E<9D"&)//"3"3 	 	LT4$ u####t#####dl3te!334{ dd&:&:&:&:d&:&:&:&:&:
 7dUlSXX&=>>CJJJ
 !EE $( <WudmWWWXXX 	3eT] 3 3 3	
 	
 	
 	GGGGGHHHUWW^^E40000r#   )r   r   r   r   r   r   r   r   r   r   r   r   r-   r   rq   s   @r!   r   r     s          , "D!!!! .0      <(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/   r0   r2   r3   r#   r!   	CacheInfor   F  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__L  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 rC   Flast)	TypeErrorr   r   r   move_to_endr   r   r   rx   r   popitem)r    r  r  results       r!   __call__zUpdatableLRU.__call__T  s    	PNv{{}}NNOOOZ 	) 	)t{""''---

a

{4(		) 	) 	) 	) 	) 	) 	) 	)"	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) T,V,,Z 	0 	0 &DKLLALL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 r   )r   r   )r    r  s     r!   is_key_cachedzUpdatableLRU.is_key_cachedg  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   rx   r   r
  )r    r  r  s      r!   add_keyzUpdatableLRU.add_keyk  s    Z 	0 	0 &DK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   rx   r   r   r   r   s    r!   r   zUpdatableLRU.cache_infoq  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/   r0   r1   r   r   r"   r  r  r  r   r3   r#   r!   r   r   ?  s             J   & & & & &   &' ' ' '0 0 0 0     r#   r   c                  v     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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 )NrC   max_workers)r<   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     	GT222y	!122"#/0A9#M#M  2q A A A6:'37"+."2"2r#   r   c                8    d| j          d| j         d| j         dS )Nz <BackgroundBlockCache blocksize=r   r   r   r   r   s    r!   r   zBackgroundBlockCache.__repr__  s=    9t~ 9 9I9 9)-9 9 9	
r#   r   c                4    | j                                         S r   r   r   s    r!   r   zBackgroundBlockCache.cache_info  r   r#   rc   c                2    | j         }|d= |d= |d= |d= |d= |S )Nr   r  r  r  r  r   rg   s     r!   ri   z!BackgroundBlockCache.__getstate__  s:    '($%.//"&'r#   c                    | j                             |           t          | j        |d                   | _        t          d          | _        d | _        d | _        t          j
                    | _        d S )Nr   rC   r  )re   rk   r   r   r   r   r  r  r  r   r   r  rg   s     r!   rl   z!BackgroundBlockCache.__setstate__  sk    U####/0A5CU#V#V  2q A A A*.'!"+."2"2r#   r$   r%   rQ   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.rC   asyncr   )r   r   r  r  r  donerX   r   r   r  r  r   rZ   r   r  r  submitr   r   )
r    r$   rQ   r   r   fetch_future_block_numberfetch_future	must_joinr   end_block_plus_1s
             r!   r+   zBackgroundBlockCache._fetch  s,   =E;)CDI#3 #dn4$.0$(!$ 	2 	2!-6BBB%**,, 2KK UVVV,44*1133T5T   7;D3)-D&& !%*:, , , ,+, , , ,! !I
 ! 2 594S1'+'9 ;?7-1*7	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2< #KKBCCC$,,##%%'@  
 ""46F6JKK 	3 	3L$$\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_infoc                    || j         k    rt          d| d| j          d          || j        z  }|| j        z   }t                              d||           t                                          ||          }|S )r   r   r   r   z!BlockCache fetching block (%s) %dr   )r    r   r*  r$   rQ   r   r@   s         r!   r   z!BackgroundBlockCache._fetch_block  s     $,&&9 9 9)-9 9 9  
 t~-dn$7<PPPs33r#   r   r   c                   || j         z  }|| j         z  }||k    r|                     |          }|||         S g }|                    |                     |          |d                    t          |dz   |          D ]*}	|                    |                     |	                     +|                    |                     |          d|                    d                    |          S r   r   r   s
             r!   r   z BackgroundBlockCache._read_cache"  s     DN*	&!111,,-?@@E7*++ CJJt//0BCCIJJOPPP
 !&&81&<>N O O C C

433LAABBBB JJt//0@AA(7(KLLL88C== r#   r   r   r   r  rn   )r   r   rm   )r)  )r   r   r*  r   r   r'   r   )r.   r/   r0   r1   r   r2   r"   r   r   ri   rl   r+   r   r   rp   rq   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   r-  r   )r.  r0  r   s      r!   register_cacher2  M  sL     8D Wtv~~UDUUvd|UUVVVF4LLLr#   )F)r.  r/  r0  r   r   r   )-
__future__r   r   r   loggingr   rG   r   r   concurrent.futuresr   r   typingr   r   r   r	   r
   r   r   r   r6   typing_extensionsr   r   r   	getLoggerrX   r   r'   r   r   r5   rs   r}   r   r   r   r   r   r  r-  r2   r2  cr3   r#   r!   <module>r:     s   " " " " " " "           				      9 9 9 9 9 9 9 9	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	  KKK++++++	#AAAGCLL 
	8	$	$
C:u$
%) ) ) ) ) ) ) )BN& N& N& N& N&	 N& N& N&b'% '% '% '% '%Y '% '% '%T, , , , ,i , , ,>F! F! F! F! F! F! F! F!RZ Z Z Z Z Z Z Zz% % % % %y % % %*_1 _1 _1 _1 _1	 _1 _1 _1D9 9 9 9 971a4= 9 9 9xI! I! I! I! I!9 I! I! I!\ 	)-        ( 

  A N1 r#   