Ë
    Q^(hu  ã                   óF   — d Z ddlZddlZddlmZ ddlmZ  G d„ de«      Zy)zGit LFS related utilitiesé    N)ÚAbstractContextManager)ÚBinaryIOc                   ó|   — e Zd ZdZdededefd„Zd„ Zd„ Zddefd	„Z	d
efd„Z
ej                  fdeded
efd„Zd„ Zy)ÚSliceFileObja¥  
    Utility context manager to read a *slice* of a seekable file-like object as a seekable, file-like object.

    This is NOT thread safe

    Inspired by stackoverflow.com/a/29838711/593036

    Credits to @julien-c

    Args:
        fileobj (`BinaryIO`):
            A file-like object to slice. MUST implement `tell()` and `seek()` (and `read()` of course).
            `fileobj` will be reset to its original position when exiting the context manager.
        seek_from (`int`):
            The start of the slice (offset from position 0 in bytes).
        read_limit (`int`):
            The maximum number of bytes to read from the slice.

    Attributes:
        previous_position (`int`):
            The previous position

    Examples:

    Reading 200 bytes with an offset of 128 bytes from a file (ie bytes 128 to 327):
    ```python
    >>> with open("path/to/file", "rb") as file:
    ...     with SliceFileObj(file, seek_from=128, read_limit=200) as fslice:
    ...         fslice.read(...)
    ```

    Reading a file in chunks of 512 bytes
    ```python
    >>> import os
    >>> chunk_size = 512
    >>> file_size = os.getsize("path/to/file")
    >>> with open("path/to/file", "rb") as file:
    ...     for chunk_idx in range(ceil(file_size / chunk_size)):
    ...         with SliceFileObj(file, seek_from=chunk_idx * chunk_size, read_limit=chunk_size) as fslice:
    ...             chunk = fslice.read(...)

    ```
    ÚfileobjÚ	seek_fromÚ
read_limitc                 ó.   — || _         || _        || _        y ©N)r   r   r	   )Úselfr   r   r	   s       úX/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/huggingface_hub/utils/_lfs.pyÚ__init__zSliceFileObj.__init__D   s   € ØˆŒØ"ˆŒØ$ˆ�ó    c                 óP  — | j                   j                  «       | _        | j                   j                  dt        j
                  «      }t        | j                  || j                  z
  «      | _	        | j                   j                  | j                  t        j                  «       | S )Nr   )r   ÚtellÚ_previous_positionÚseekÚosÚSEEK_ENDÚminr	   r   Ú_lenÚioÚSEEK_SET)r   Úend_of_streams     r   Ú	__enter__zSliceFileObj.__enter__I   sm   € Ø"&§,¡,×"3Ñ"3Ó"5ˆÔØŸ™×)Ñ)¨!¬R¯[©[Ó9ˆÜ˜Ÿ™¨¸¿¹Ñ)GÓHˆŒ	à�‰×Ñ˜$Ÿ.™.¬"¯+©+Ô6Øˆr   c                 ól   — | j                   j                  | j                  t        j                  «       y r   )r   r   r   r   r   )r   Úexc_typeÚ	exc_valueÚ	tracebacks       r   Ú__exit__zSliceFileObj.__exit__Q   s    € Ø�‰×Ñ˜$×1Ñ1´2·;±;Õ?r   Únc                 óÈ   — | j                  «       }|| j                  k\  ry| j                  |z
  }| j                  j                  |dk  r|«      }|S t	        ||«      «      }|S )Nr   r   )r   r   r   Úreadr   )r   r!   ÚposÚremaining_amountÚdatas        r   r#   zSliceFileObj.readT   sc   € Ø�i‰i‹kˆØ�$—)‘)ÒØØŸ9™9 s™?ÐØ�|‰|× Ñ °Q¸²UÐ!1ÓYˆØˆô ADÀAÐGWÓ@XÓYˆØˆr   Úreturnc                 óP   — | j                   j                  «       | j                  z
  S r   )r   r   r   ©r   s    r   r   zSliceFileObj.tell\   s   € Ø�|‰|× Ñ Ó" T§^¡^Ñ3Ð3r   ÚoffsetÚwhencec                 ó  — | j                   }|| j                  z   }|t        j                  t        j                  fv rD|t        j                  k(  r||z   n||z   }t        |t        ||«      «      }t        j                  }nY|t        j                  k(  r7| j                  j                  «       }t        ||z
  t        |||z
  «      «      }nt        d|› d�«      ‚| j                  j                  ||«      | j                   z
  S )Nzwhence value z is not supported)r   r   r   r   r   Úmaxr   ÚSEEK_CURr   r   Ú
ValueErrorr   )r   r*   r+   ÚstartÚendÚcur_poss         r   r   zSliceFileObj.seek_   sÒ   € Ø—‘ˆØ�d—i‘iÑˆØ”b—k‘k¤2§;¡;Ð/Ñ/Ø'-´·±Ò'<�U˜V’^À#ÈÁ,ˆFÜ˜¤ F¨CÓ 0Ó1ˆFÜ—[‘[‰FØ”r—{‘{Ò"Ø—l‘l×'Ñ'Ó)ˆGÜ˜ ™¬#¨f°c¸G±mÓ*DÓE‰Fä˜}¨V¨HÐ4EÐFÓGÐGØ�|‰|× Ñ  ¨Ó0°4·>±>ÑAÐAr   c              #   ó4   K  — | j                  d¬«      –— y ­w)Ni  @ )r!   )r#   r)   s    r   Ú__iter__zSliceFileObj.__iter__m   s   è ø€ Ø�i‰i˜/ˆiÓ*Ó*ùs   ‚N)éÿÿÿÿ)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   r    r#   r   r   r   r   r4   © r   r   r   r      sq   „ ñ*ðX% ð %°Sð %Àcó %ò
ò@ñ�có ð4�có 4ð /1¯k©kñ B˜3ð B¨ð B¸có Bó+r   r   )r9   r   r   Ú
contextlibr   Útypingr   r   r;   r   r   ú<module>r>      s%   ðñ  ã 	Û 	Ý -Ý ôW+Ð)õ W+r   