§
    ìXÊj’]  ã                   ó8  — d Z ddlZddlZddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ d	d
lmZ  ej        e¦  «        Z ej        d¦  «        Z ej        dd                      eej        ¦  «        ¦  «        › d�¦  «        ZdZdZdZdZdZdZ  ej         ej!        e¦  «        › d�¦  «        Z"de#e	z  de	fd„Z$de#e	z  de#de	fd„Z%de#e	z  de#de	fd„Z&de	de'fd„Z(de	de'fd„Z)de	d e*dz  de'fd!„Z+de#e	z  de'fd"„Z,d#e	de'fd$„Z-de#e	z  de'fd%„Z.de#e	z  de#de	dz  fd&„Z/de#e	z  de*fd'„Z0de#e	z  de*fd(„Z1de	de#e	z  ddfd)„Z2d*e	d+e	de#e	z  ddfd,„Z3de#e	z  de	fd-„Z4d*e#e	z  de#e	z  de#dz  fd.„Z5d/d0œd*e#e	z  de#e	z  d1e'de	dz  fd2„Z6d*e#e	z  de#e	z  de	dz  fd3„Z7de	de	fd4„Z8de	de	fd5„Z9ede	ded6         fd7„¦   «         Z:d8e	d9e#ddfd:„Z;d*e	de	de	fd;„Z<de'fd<„Z=d*e#de#de#e	z  d e*dz  de'f
d=„Z>de#de#e	z  d e*dz  de'fd>„Z?d/d?œd*e#de#de#e	z  d e*dz  d@e'de'fdA„Z@de	de#e	z  deAe	         dz  fdB„ZBde	dCeAe	         de#e	z  de*fdD„ZCde#e	z  deAe	         fdE„ZDde#e	z  deEe	e*f         fdF„ZFd8e	dGeAe	         de#e	z  ddfdH„ZGde	de#e	z  de*fdI„ZHdS )Jaj  Cache-wide shared blob store, deduplicating Xet files across cached repos.

Store entries at `<cache_dir>/blobs/<2-hex-prefix>/<xet_hash>` are regular files.
Per-repo `blobs/<etag>` entries are relative symlinks to them. A companion
`<xet_hash>.refs` manifest lists those symlinks so cache deletion only needs to inspect
the blobs it touches instead of scanning the entire store.

The manifest is a hint, not trusted metadata: every entry is validated against the
filesystem before use, and any missing or unreadable manifest makes garbage collection
leak the shared blob rather than risk deleting referenced content.
é    N)Úcontextmanager)ÚPath)Ú	Generator)ÚFileLockÚSoftFileLocké   )Ú	constantsé   )Úloggingz[0-9a-f]{64}z(?:ú|z)--.+Úblobsz.huggingface-shared-blobsÚ1z.refsz.locké
   z\.[0-9a-f]{8}\.tmpÚ	cache_dirÚreturnc                 ó0   — t          | ¦  «        t          z  S )zBReturn the path of the shared blob store inside a cache directory.)r   ÚSHARED_BLOBS_DIR_NAME)r   s    úTC:\Projects\Historical\venv\Lib\site-packages\huggingface_hub/utils/_shared_blobs.pyÚshared_blobs_dirr   7   s   € å�	‰?Œ?Õ2Ñ2Ð2ó    Úxet_hashc                 ó–   — t                                |¦  «        €t          d|› d�¦  «        ‚t          | ¦  «        |dd…         z  |z  S )zuReturn the store path for a given Xet file hash.

    Raises `ValueError` if `xet_hash` is not a valid Xet hash.
    NzInvalid Xet file hash: 'ú'.r   )Ú_XET_HASH_REGEXÚ	fullmatchÚ
ValueErrorr   ©r   r   s     r   Úshared_blob_pathr   <   sR   € õ
 × Ò  Ñ*Ô*Ð2ÝÐ@°HÐ@Ð@Ð@ÑAÔAÐAÝ˜IÑ&Ô&¨°"°1°"¬Ñ5¸Ñ@Ð@r   c                 óZ   — t          | |¦  «                             |› t          › �¦  «        S )z=Return the reference manifest path for a given Xet file hash.)r   Ú	with_nameÚ_MANIFEST_SUFFIXr   s     r   Úshared_blob_manifest_pathr"   F   s,   € å˜I xÑ0Ô0×:Ò:¸hÐ;ZÕHXÐ;ZÐ;ZÑ[Ô[Ð[r   Úpathc                 ó|   — 	 t          j        |                      ¦   «         j        ¦  «        S # t          $ r Y dS w xY w©NF)ÚstatÚS_ISREGÚlstatÚst_modeÚOSError©r#   s    r   Ú_is_regular_filer,   K   óD   € ðÝŒ|˜DŸJšJ™LœLÔ0Ñ1Ô1Ð1øÝð ð ð Øˆuˆuðøøøó   ‚*- ­
;º;c                 ó|   — 	 t          j        |                      ¦   «         j        ¦  «        S # t          $ r Y dS w xY wr%   )r&   ÚS_ISDIRr(   r)   r*   r+   s    r   Ú_is_directoryr1   S   r-   r.   Ú
store_pathÚexpected_sizec           	      ó|  — |€dS 	 |                       ¦   «         }n# t          $ r Y dS w xY wt          j        |j        ¦  «        sdS |j        |k    r+t                               d| › d|j        › d|› d�¦  «         dS t          j	        | t          j
        ¦  «        s t                               d| › d�¦  «         dS dS )	zPReturn whether `store_path` is a regular, readable payload of the expected size.NFzShared blob 'z' has an unexpected size (z instead of z). Not using it.z ' is not readable. Not using it.T)r(   r*   r&   r'   r)   Úst_sizeÚloggerÚwarningÚosÚaccessÚR_OK)r2   r3   Ú
store_stats      r   Ú_is_usable_store_entryr<   [   sü   € àÐàˆuðØ×%Ò%Ñ'Ô'ˆ
ˆ
øÝð ð ð ØˆuˆuðøøøåŒ<˜
Ô*Ñ+Ô+ð ØˆuØÔ˜]Ò*Ð*Ý�Šð˜Jð ð À*ÔBTð ð Ðboð ð ð ñ	
ô 	
ð 	
ð ˆuÝŒ9�Z¥¤Ñ)Ô)ð Ý�ŠÐS zÐSÐSÐSÑTÔTÐTØˆuØˆ4s   † ›
)¨)c                 óØ   — t          | ¦  «        }|t          z  }t          |¦  «        rt          |¦  «        sdS 	 |                     ¦   «         t
          › d�k    S # t          $ r Y dS w xY w)z?Return whether `path` is an owned, supported shared blob store.Fú
)r   ÚSHARED_BLOBS_MARKER_NAMEr1   r,   Ú	read_textÚSHARED_BLOBS_LAYOUT_VERSIONr*   )r#   Ú	store_dirÚmarker_paths      r   Úis_shared_blobs_dirrD   r   s…   € å�T‘
”
€IØÕ6Ñ6€KÝ˜Ñ#Ô#ð Õ+;¸KÑ+HÔ+Hð ØˆuðØ×$Ò$Ñ&Ô&Õ-HÐ*LÐ*LÐ*LÒLÐLøÝð ð ð Øˆuˆuðøøøs   »A Á
A)Á(A)rB   c                 óÆ  — t           › d�}t          |                      ¦   «         ¦  «        }|D ]w}t                               |j        ¦  «        �t          |¦  «        s dS 	 |                     |                     ¦   «         ¦  «        s dS Œ_# t          t          f$ r Y  dS w xY w|D ]}|                     d¬¦  «         Œt          |                      ¦   «         ¦  «         S )z–Remove leftover marker temporaries.

    Returns whether the directory is empty afterwards, i.e. safe to mark. Any foreign content returns False.
    r>   NFT©Ú
missing_ok)rA   ÚlistÚiterdirÚ_MARKER_TMP_REGEXr   Únamer,   Ú
startswithr@   r*   ÚUnicodeErrorÚunlinkÚany)rB   Úexpected_contentÚentriesÚentrys       r   Ú_cleanup_abandoned_marker_tempsrS   ~   s  € õ
 6Ð9Ð9Ð9ÐÝ�9×$Ò$Ñ&Ô&Ñ'Ô'€GØð ð ˆÝ×&Ò& u¤zÑ2Ô2Ð:ÕBRÐSXÑBYÔBYÐ:Ø�5�5ð	Ø#×.Ò.¨u¯ªÑ/@Ô/@ÑAÔAð Ø�u�uðøå�Ð&ð 	ð 	ð 	Ø�5�5�5ð	øøøàð &ð &ˆØ�Š ˆÑ%Ô%Ð%Ð%Ý�9×$Ò$Ñ&Ô&Ñ'Ô'Ð'Ð's   Á"'BÂB#Â"B#c                 ó   — t          | ¦  «        }|t          z  }	 |                     d¬¦  «         t          |¦  «        rdS t	          |¦  «        rt          |¦  «        s t                               d|› d�¦  «         dS t          || ¦  «         | 	                    |j
        › dt          j        d¦  «        › d�¦  «        }	 |                     t          › d	�¦  «         |                     t!          | ¦  «        ¦  «         t#          j        ||¦  «         |                     d¬
¦  «         n# |                     d¬
¦  «         w xY wt          |¦  «        S # t(          $ r+}t                               d|› d|› �¦  «         Y d}~dS d}~ww xY w)zJCreate and mark the shared store, refusing to adopt an unmarked directory.T©Úexist_okz0Refusing to use unmarked shared blob directory 'r   Fú.é   ú.tmpr>   rF   z,Could not initialize shared blob directory 'ú': N)r   r?   ÚmkdirrD   r1   rS   r6   ÚdebugÚ_repair_shared_directory_moder    rK   ÚsecretsÚ	token_hexÚ
write_textrA   ÚchmodÚ_shared_blob_moder8   ÚreplacerN   r*   )r   rB   rC   Ú
tmp_markerÚes        r   Ú_ensure_shared_blobs_dirrf   ’   sµ  € å  Ñ+Ô+€IØÕ6Ñ6€KðØ�Š ˆÑ&Ô&Ð&Ý˜yÑ)Ô)ð 	Ø�4Ý˜YÑ'Ô'ð 	Õ/NÈyÑ/YÔ/Yð 	Ý�LŠLÐYÈIÐYÐYÐYÑZÔZÐZØ�5Ý% i°Ñ;Ô;Ð;à ×*Ò*¨kÔ.>Ð+[Ð+[ÅÔARÐSTÑAUÔAUÐ+[Ð+[Ð+[Ñ\Ô\ˆ
ð	/Ø×!Ò!Õ%@Ð"DÐ"DÐ"DÑEÔEÐEØ×ÒÕ.¨yÑ9Ô9Ñ:Ô:Ð:ÝŒJ�z ;Ñ/Ô/Ð/à×Ò¨ÐÑ.Ô.Ð.Ð.øˆJ×Ò¨ÐÑ.Ô.Ð.Ð.øøøÝ" 9Ñ-Ô-Ð-øÝð ð ð Ý�ŠÐUÀIÐUÐUÐRSÐUÐUÑVÔVÐVØˆuˆuˆuˆuˆuøøøøðøøøs=   ›%E Á<E Â AE ÃAD. ÄE Ä.EÅE Å
FÅ" FÆFc                 óä  — t          | ¦  «        sd S t          | |¦  «        j        }	 |                     d¬¦  «         n8# t          $ r+}t
                               d|› d|› �¦  «         Y d }~d S d }~ww xY wt          |¦  «        s t
                               d|› d�¦  «         d S 	 t          || ¦  «         n8# t          $ r+}t
                               d|› d|› �¦  «         Y d }~d S d }~ww xY w|S )NTrU   z/Could not create shared blob prefix directory 'rZ   z2Refusing to use non-directory shared blob prefix 'r   z1Could not set shared blob prefix permissions on ')	rf   r   Úparentr[   r*   r6   r\   r1   r]   )r   r   Ú
prefix_dirre   s       r   Ú_ensure_prefix_dirrj   ¬   s=  € Ý# IÑ.Ô.ð ØˆtÝ! )¨XÑ6Ô6Ô=€JðØ×Ò $ÐÑ'Ô'Ð'Ð'øÝð ð ð Ý�ŠÐYÀzÐYÐYÐVWÐYÐYÑZÔZÐZØˆtˆtˆtˆtˆtøøøøðøøøõ ˜Ñ$Ô$ð Ý�ŠÐXÈ*ÐXÐXÐXÑYÔYÐYØˆtðÝ% j°)Ñ<Ô<Ð<Ð<øÝð ð ð Ý�ŠÐ[ÈÐ[Ð[ÐXYÐ[Ð[Ñ\Ô\Ð\Øˆtˆtˆtˆtˆtøøøøðøøøð Ðs-   ¨? ¿
A4Á	 A/Á/A4Â'B8 Â8
C-Ã C(Ã(C-c                 ó  — t           j        dk    rdS 	 t          j        t	          | ¦  «                             ¦   «         j        ¦  «        }n# t          $ r Y dS w xY wd|t          j        z  rdndz  |t          j        z  rdndz  S )zLReturn a read-only mode accessible to users who can traverse the cache root.Únté¶  é   é    r   rX   )	r8   rK   r&   ÚS_IMODEr   r)   r*   ÚS_IXGRPÚS_IXOTH©r   Ú
cache_modes     r   rb   rb   À   s’   € å	„w�$‚€àˆuðÝ”\¥$ y¡/¤/×"6Ò"6Ñ"8Ô"8Ô"@ÑAÔAˆ
ˆ
øÝð ð ð Øˆuˆuðøøøà˜Z­$¬,Ñ6Ð=�E�E¸AÑ>È:ÕX\ÔXdÑKdÐBkÀ%À%ÐjkÑlÐls   ”8A Á
AÁAc                 óÖ   — 	 t          j        t          | ¦  «                              ¦   «         j        ¦  «        }n# t          $ r Y dS w xY w|dt           j        z  t           j        z  z  S )zQMirror cache-root access and inheritance bits on newly created store directories.iÀ  iÿ  )r&   rp   r   r)   r*   ÚS_ISGIDÚS_ISVTXrs   s     r   Ú_shared_directory_moderx   Ì   sh   € ðÝ”\¥$ y¡/¤/×"6Ò"6Ñ"8Ô"8Ô"@ÑAÔAˆ
ˆ
øÝð ð ð Øˆuˆuðøøøà˜¥¤Ñ-µ´Ñ<Ñ=Ð=s   ‚8; »
A	ÁA	c                 ó°   — t          |¦  «        }t          j        |                      ¦   «         j        ¦  «        |k    r|                      |¦  «         d S d S ©N)rx   r&   rp   r(   r)   ra   )r#   r   Úexpected_modes      r   r]   r]   Õ   sO   € Ý*¨9Ñ5Ô5€MÝ„|�D—J’J‘L”LÔ(Ñ)Ô)¨]Ò:Ð:Ø�
Š
�=Ñ!Ô!Ð!Ð!Ð!ð ;Ð:r   Ú	blob_pathri   c                 ó   — t          |¦  «        }t          j        | |¦  «         t          j        dk    st	          t          d¦  «        sdS |                     ¦   «         j        }|                      ¦   «         j        |k    rdS 	 t          j        | d|¦  «         dS # t          $ r& |t
          j	        z  r|t
          j
        z  s‚ Y dS Y dS w xY w)zKMake a payload immutable and readable according to the shared cache policy.rl   ÚchownNéÿÿÿÿ)rb   r8   ra   rK   Úhasattrr&   Úst_gidr~   r*   ÚS_IRGRPÚS_IROTH)r|   ri   r   Ú	blob_modeÚ
target_gids        r   Ú _prepare_shared_blob_permissionsr†   Û   sæ   € å! )Ñ,Ô,€IÝ„HˆY˜	Ñ"Ô"Ð"Ý	„w�$‚€�g¥b¨'Ñ2Ô2€ØˆØ—’Ñ"Ô"Ô)€JØ‡~‚~ÑÔÔ *Ò,Ð,ØˆðÝ
Œ�˜B 
Ñ+Ô+Ð+Ð+Ð+øÝð ð ð à•t”|Ñ#ð 	¨I½¼Ñ,Dð 	Øð	ð 	ð 	ð 	ð 	ð 	ðøøøs   ÂB Â)CÃCc                 ó  — t          j        | ¦  «        }|dd…                              ¦   «         dk    rd|dd…         › �}n|                     d¦  «        r
|dd…         }t	          t           j                             |¦  «        ¦  «        S )zCReturn an absolute path without the Windows extended-length prefix.Né   z\\?\unc\z\\z\\?\rX   )r8   ÚfspathÚlowerrL   r   r#   Úabspath)r#   Úpath_strs     r   Ú_path_for_comparisonr�   ì   s„   € åŒy˜‰Œ€HØ���„|×ÒÑÔ˜~Ò-Ð-Ø(˜( 1 2 2œ,Ð(Ð(ˆˆØ	×	Ò	˜YÑ	'Ô	'ð  Ø˜A˜B˜B”<ˆÝ•”—’ Ñ)Ô)Ñ*Ô*Ð*r   c                 óˆ  — t          | ¦  «        } t          |¦  «        }	 |                      |¦  «        }n# t          $ r Y d S w xY wt          |j        ¦  «        dk    sCt
                               |j        d         ¦  «        �|j        d         dk    s|j        d         sd S |                     ¦   «         }d|v sd|v rd n|S )Né   r   r
   r   r   r>   ú)r�   Úrelative_tor   ÚlenÚpartsÚ_REPO_DIR_REGEXr   Úas_posix)r|   r   Úrelative_pathÚrelative_strs       r   Ú_relative_blob_pathr˜   ö   så   € Ý$ YÑ/Ô/€IÝ$ YÑ/Ô/€IðØ!×-Ò-¨iÑ8Ô8ˆˆøÝð ð ð Øˆtˆtðøøøõ 	ˆMÔÑ Ô  AÒ%Ð%Ý×$Ò$ ]Ô%8¸Ô%;Ñ<Ô<ÐDØÔ˜qÔ! WÒ,Ð,ØÔ" 1Ô%ð -ð ˆtØ ×)Ò)Ñ+Ô+€LØ˜<Ð'Ð'¨4°<Ð+?Ð+?ˆ4ˆ4À\ÐQs    6 ¶
AÁAF©Úraise_on_io_errorrš   c                ó  — t          | ¦  «        } t          | |¦  «        €dS 	 t          j        |                      ¦   «         j        ¦  «        sdS t          t          j        | ¦  «        ¦  «        }n # t          $ r Y dS t          $ r |r‚ Y dS w xY wt          | ¦  «        }|                     ¦   «         r|n	|j        |z  }t          |¦  «        }t          t          |¦  «        ¦  «        }	 |                     |¦  «        }n# t          $ r Y dS w xY wt!          |j        ¦  «        dk    sIt$                               |j        d         ¦  «        �$|j        d         |j        d         dd…         k    rdS t          |¦  «        |z  S )zMReturn the canonical store target if `blob_path` is a managed shared symlink.Nr   r
   r   )r   r˜   r&   ÚS_ISLNKr(   r)   r8   ÚreadlinkÚFileNotFoundErrorr*   r�   Úis_absoluterh   r   r‘   r   r’   r“   r   r   )r|   r   rš   Úlink_targetÚcomparable_blob_pathÚtargetrB   Úrelative_targets           r   Ú_shared_blob_targetr¤     s¯  € õ �Y‘”€IÝ˜9 iÑ0Ô0Ð8Øˆtð	ÝŒ|˜IŸOšOÑ-Ô-Ô5Ñ6Ô6ð 	Ø�4Ý�2œ; yÑ1Ô1Ñ2Ô2ˆˆøÝð ð ð ØˆtˆtÝð ð ð Øð 	ØØˆtˆtðøøøõ
 0°	Ñ:Ô:ÐØ'×3Ò3Ñ5Ô5Ðdˆ[ˆ[Ð;OÔ;VÐYdÑ;d€FÝ! &Ñ)Ô)€FÝ$Õ%5°iÑ%@Ô%@ÑAÔA€IðØ ×,Ò,¨YÑ7Ô7ˆˆøÝð ð ð Øˆtˆtðøøøõ 	ˆOÔ!Ñ"Ô" aÒ'Ð'Ý×$Ò$ _Ô%:¸1Ô%=Ñ>Ô>ÐFØÔ  Ô# Ô'<¸QÔ'?ÀÀÀÔ'CÒCÐCàˆtÝ˜IÑ&Ô&¨Ñ8Ð8s/   £+A2 Á!A2 Á2
BÁ?BÂBÃ-D Ä
DÄDc                 óL   — t          | |¦  «        }|�t          |¦  «        r|ndS )z›Return the canonical store target if `blob_path` is a valid shared symlink.

    Callers check `is_shared_blobs_dir` once before resolving many blobs.
    N)r¤   r,   )r|   r   r¢   s      r   Úshared_blob_targetr¦   +  s0   € õ
 ! ¨IÑ6Ô6€FØÐ'Õ,<¸VÑ,DÔ,DÐ'ˆ6ˆ6È$ÐNr   c                 óH   — |                       | j        › t          › �¦  «        S rz   )r    rK   r!   ©r2   s    r   Ú_manifest_path_for_store_pathr©   4  s$   € Ø×Ò :¤?Ð FÕ4DÐ FÐ FÑGÔGÐGr   c                 óH   — |                       | j        › t          › �¦  «        S rz   )r    rK   Ú_LOCK_SUFFIXr¨   s    r   Ú_lock_path_for_store_pathr¬   8  s#   € Ø×Ò :¤?Ð BµLÐ BÐ BÑCÔCÐCr   )NNNc              #   ó–  K  — t          | ¦  «        }t          j        t          j        z  }t	          t          d¦  «        r|t          j        z  }t          j        ||d¦  «        }	 t          j        t          j	        |¦  «        j
        ¦  «        st          d|› d�¦  «        ‚t	          t          d¦  «        r'	 t          j        |d¦  «         n# t          $ r Y nw xY wt          j        |¦  «         n# t          j        |¦  «         w xY wt          |d¬¦  «        }	 |                     ¦   «          n?# t           $ r2 t#          |› d�d¬¦  «        }|                     t$          ¬¦  «         Y nw xY w	 d	V — 	 |                     ¦   «          d	S # t          $ r Y d	S w xY w# 	 |                     ¦   «          w # t          $ r Y w w xY wxY w)
zBLock publication, reference creation, and GC for one content hash.Ú
O_NOFOLLOWrm   z)Shared blob lock is not a regular file: 'r   Úfchmod)Úmodez.soft)ÚtimeoutN)r¬   r8   ÚO_WRONLYÚO_CREATr€   r®   Úopenr&   r'   Úfstatr)   r*   r¯   Úcloser   ÚacquireÚNotImplementedErrorr   Ú_SOFT_LOCK_TIMEOUTÚrelease)r2   Ú	lock_pathÚflagsÚfdÚlocks        r   Ú_shared_blob_lockr¿   <  s÷  è è € õ *¨*Ñ5Ô5€Iõ ŒK�"œ*Ñ$€EÝ�r�<Ñ Ô ð Ø•”ÑˆÝ	Œ�˜E 5Ñ	)Ô	)€Bð	ÝŒ|�BœH R™LœLÔ0Ñ1Ô1ð 	UÝÐSÀiÐSÐSÐSÑTÔTÐTÝ•2�xÑ Ô ð 	ðÝ”	˜"˜eÑ$Ô$Ð$Ð$øÝð ð ð Ø�ðøøøõ 	Œ�‰Œˆˆø�Œ�‰ŒˆˆøøøÝ�I EÐ*Ñ*Ô*€Dð1Ø�Š‰ŒˆˆøÝð 1ð 1ð 1å˜yÐ/Ð/Ð/°eÐ<Ñ<Ô<ˆØ�ŠÕ/ˆÑ0Ô0Ð0Ð0Ð0ð1øøøðØˆˆˆð	Ø�LŠL‰NŒNˆNˆNˆNøÝð 	ð 	ð 	ØˆDˆDð	øøøøð	Ø�LŠL‰NŒNˆNˆNøÝð 	ð 	ð 	ØˆDð	øøøøøøs…   Á&AC5 Â:C ÃC5 Ã
CÃC5 ÃCÃC5 Ã5DÄ D5 Ä59E1Å0E1Å5F! Å:F Æ
FÆFÆ!GÆ#F8Æ7GÆ8
GÇGÇGÇGÚmanifest_pathÚrelative_blob_pathc                 óÞ  — t           j        t           j        z  t           j        z  }t	          t           d¦  «        r|t           j        z  }t          j        | |d¦  «        }	 t          j        t          j	        |¦  «        j
        ¦  «        st          d| › d�¦  «        ‚t	          t           d¦  «        r'	 t          j        |d¦  «         n# t          $ r Y nw xY w|› d�                     ¦   «         }t          j        ||¦  «        t          |¦  «        k    rt          d| › d�¦  «        ‚t          j        |¦  «         t          j        |¦  «         dS # t          j        |¦  «         w xY w)	zBAppend and flush one reference before its symlink is made visible.r®   rm   z-Shared blob manifest is not a regular file: 'r   r¯   r>   z*Could not append a complete reference to 'N)r8   r²   ÚO_APPENDr³   r€   r®   r´   r&   r'   rµ   r)   r*   r¯   ÚencodeÚwriter’   Úfsyncr¶   )rÀ   rÁ   r¼   r½   Úlines        r   Ú_append_manifest_referencerÈ   `  sR  € åŒK�"œ+Ñ%­¬
Ñ2€EÝ�r�<Ñ Ô ð Ø•”ÑˆÝ	Œ�  uÑ	-Ô	-€BðÝŒ|�BœH R™LœLÔ0Ñ1Ô1ð 	]ÝÐ[È-Ð[Ð[Ð[Ñ\Ô\Ð\Ý•2�xÑ Ô ð 	ðÝ”	˜"˜eÑ$Ô$Ð$Ð$øÝð ð ð Ø�ðøøøà$Ð(Ð(Ð(×/Ò/Ñ1Ô1ˆÝŒ8�B˜ÑÔ¥ T¡¤Ò*Ð*ÝÐXÀ}ÐXÐXÐXÑYÔYÐYÝ
Œ�‰Œˆå
Œ�‰Œˆˆˆø�Œ�‰Œˆˆøøøs2   Á"AE Â6C ÃE Ã
CÃE ÃCÃA'E ÅE,c                 ó  — |                       d| j        › dt          j        d¦  «        › d�¦  «        }t          j                             t          |¦  «        t          | ¦  «        j        ¬¦  «        }t	          j	        ||¦  «         |S )NrW   rX   z.shared)Ústart)
r    rK   r^   r_   r8   r#   Úrelpathr�   rh   Úsymlink)r|   r2   Útmp_linkr£   s       r   Ú_make_temporary_symlinkrÎ   v  sz   € Ø×"Ò"Ð#U y¤~Ð#UÐ#U½Ô8IÈ!Ñ8LÔ8LÐ#UÐ#UÐ#UÑVÔV€HÝ”g—o’oÕ&:¸:Ñ&FÔ&FÕNbÐclÑNmÔNmÔNt�oÑuÔu€OÝ„Jˆ Ñ)Ô)Ð)Ø€Or   c                  ó6   — t           j         ot           j         S )z1Return whether the shared blob store may be used.)r	   ÚHF_HUB_DISABLE_SHARED_BLOBSÚHF_HUB_DISABLE_XET© r   r   Úshared_blobs_enabledrÓ   }  s   € åÔ4Ð4ÐY½YÔ=YÐ9YÐYr   c                 óp  — t                                |¦  «        �t          t          |¦  «        ¦  «        sdS t	          ||¦  «        }t          | |¦  «        }|€dS d}	 t          |¦  «        5  t          ||¦  «        s(	 ddd¦  «         |�|                     d¬¦  «         dS dS t          t          | ¦  «        |¦  «        }t          t          |¦  «        |¦  «         t          j        || ¦  «         ddd¦  «         n# 1 swxY w Y   nR# t          $ rE}t                                d| › d|› �¦  «         Y d}~|�|                     d¬¦  «         dS dS d}~ww xY w|�|                     d¬¦  «         n# |�|                     d¬¦  «         w w xY wt                                d| › d�¦  «         dS )	zîMaterialize `blobs/<etag>` as a symlink to an existing store entry, if any.

    The reference manifest is flushed before the symlink becomes visible. Failures are
    best-effort misses and leave the regular download path untouched.
    NFTrF   zCould not symlink 'z' from shared blob store: úBlob 'z5' reused from shared blob store (no download needed).)r   r   rD   r   r   r˜   r¿   r<   rN   rÎ   r   rÈ   r©   r8   rc   r*   r6   r\   )r|   r   r   r3   r2   rÁ   rÍ   re   s           r   Útry_link_from_shared_storerÖ   ‚  sM  € õ × Ò  Ñ*Ô*Ð2Õ:MÕN^Ð_hÑNiÔNiÑ:jÔ:jÐ2ØˆuÝ! )¨XÑ6Ô6€JÝ,¨Y¸	ÑBÔBÐØÐ!Øˆuà €Hð-Ý˜zÑ*Ô*ð 	,ð 	,Ý)¨*°mÑDÔDð Øð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð ÐØ�OŠO tˆOÑ,Ô,Ð,Ð,Ð,ð  Ðõ /­t°I©¬À
ÑKÔKˆHÝ&Õ'DÀZÑ'PÔ'PÐRdÑeÔeÐeÝŒJ�x Ñ+Ô+Ð+ð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,øøõ ð ð ð Ý�ŠÐS¨9ÐSÐSÐPQÐSÐSÑTÔTÐTØˆuˆuˆuàÐØ�OŠO tˆOÑ,Ô,Ð,Ð,Ð,ð  Ðøøøøð	øøøð ÐØ�OŠO tˆOÑ,Ô,Ð,øøð ÐØ�OŠO tˆOÑ,Ô,Ð,Ð,ð  øøøõ ‡L‚LÐZ˜)ÐZÐZÐZÑ[Ô[Ð[Øˆ4sa   Á D Á/DÂD Â(ADÃ7D ÄDÄD Ä
DÄD ÄE: Ä
EÄ EÄ9E: ÅEÅE: Å:Fc                 óÊ   — t          ¦   «         r6t                               | ¦  «        �t          t	          |¦  «        ¦  «        sdS t          t          || ¦  «        |¦  «        S )zGReturn whether a usable store entry exists, without touching the cache.NF)rÓ   r   r   rD   r   r<   r   )r   r   r3   s      r   Úhas_shared_blobrØ   ¥  sa   € õ !Ñ"Ô"ðå×$Ò$ XÑ.Ô.Ð6Ý"Õ#3°IÑ#>Ô#>Ñ?Ô?ð 7ð ˆuÝ!Õ"2°9¸hÑ"GÔ"GÈÑWÔWÐWr   )Úreplace_existingrÙ   c                 óø  — |�t                                |¦  «        €dS t          ||¦  «        }t          | |¦  «        }|�|€dS t	          | ¦  «        }t          ||¦  «        }t          |¦  «        }	d}
d}	 t          |¦  «        5  t          ||¦  «        }
| ot          ||¦  «        }t          |	|¦  «         |s(t          |||¦  «         t          j        ||¦  «         d}	 t          j        |
|¦  «         n(# t          $ r |rt          j        ||¦  «         d}‚ w xY w	 ddd¦  «         n# 1 swxY w Y   nh# t          $ r[}t"                               d| › d|› �¦  «         |rt          d| › d�¦  «        |‚Y d}~|
�|
                     d¬¦  «         dS dS d}~ww xY w|
�|
                     d¬¦  «         n# |
�|
                     d¬¦  «         w w xY wt"                               d	| › d
�¦  «         dS )zïMove a fresh Xet download into the store and replace its repo blob with a symlink.

    Best-effort: on failure the repo blob remains (or is restored as) a regular local
    file. Returns whether the repo blob was successfully shared.
    NFTzCould not publish 'z' to shared blob store: zCould not restore repo blob 'z' after shared-store failurerF   rÕ   z!' published to shared blob store.)r   r   rj   r˜   r   r   r©   r¿   rÎ   r<   rÈ   r†   r8   rc   r*   ÚshutilÚcopyfiler6   r\   rN   )r|   r   r   r3   rÙ   ri   rÁ   Úblob_path_objr2   rÀ   rÍ   Ú
blob_movedÚstore_is_usablere   s                 r   Úpublish_blob_to_shared_storerà   °  s·  € ð Ð¥× 9Ò 9¸(Ñ CÔ CÐ KØˆuÝ# I¨xÑ8Ô8€JÝ,¨Y¸	ÑBÔBÐØÐÐ/Ð7Øˆuå˜‘O”O€MÝ! )¨XÑ6Ô6€JÝ1°*Ñ=Ô=€MØ €HØ€Jð-Ý˜zÑ*Ô*ð 	ð 	Ý.¨}¸jÑIÔIˆHØ"2Ð2ÐhÕ7MÈjÐZgÑ7hÔ7hˆOÝ& }Ð6HÑIÔIÐIØ"ð "Ý0°À
ÈIÑVÔVÐVÝ”
˜=¨*Ñ5Ô5Ð5Ø!�
ðÝ”
˜8 ]Ñ3Ô3Ð3Ð3øÝð ð ð Øð 'Ý”O J°Ñ>Ô>Ð>Ø!&�JØð	øøøð 4ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øøõ ð ð ð Ý�ŠÐQ¨9ÐQÐQÈaÐQÐQÑRÔRÐRØð 	jÝÐa¸)ÐaÐaÐaÑbÔbÐhiÐiØˆuˆuˆuàÐØ�OŠO tˆOÑ,Ô,Ð,Ð,Ð,ð  Ðøøøøðøøøð ÐØ�OŠO tˆOÑ,Ô,Ð,øøð ÐØ�OŠO tˆOÑ,Ô,Ð,Ð,ð  øøøõ ‡L‚LÐF˜)ÐFÐFÐFÑGÔGÐGØˆ4sm   Á8D= ÂAD1Ã&C<Ã;D1Ã<%D!Ä!D1Ä%D= Ä1D5Ä5D= Ä8D5Ä9D= Ä<F> Ä=
F"Å6FÅ=F> ÆF"Æ"F> Æ>Gc                 óL  — t          | ¦  «        }t          |¦  «        sd S 	 |                     ¦   «                              ¦   «         }n# t          t
          f$ r Y d S w xY wt          ¦   «         }t          t          j	         
                    |¦  «        ¦  «        }|D ]†}t          |¦  «        }|                     ¦   «         s	d|j        v rŒ/||z  }t          ||¦  «        €ŒE	 t          ||d¬¦  «        }n# t          $ r Y  d S w xY w|| k    r|                     |¦  «         Œ‡|S )Nz..Tr™   )r©   r,   r@   Ú
splitlinesr*   rM   Úsetr   r8   r#   r‹   rŸ   r“   r˜   r¤   Úadd)	r2   r   rÀ   ÚlinesÚ
referencesrÇ   r–   Ú	candidater¢   s	            r   Ú_read_valid_manifest_referencesrè   ç  sT  € Ý1°*Ñ=Ô=€MÝ˜MÑ*Ô*ð ØˆtðØ×'Ò'Ñ)Ô)×4Ò4Ñ6Ô6ˆˆøÝ•\Ð"ð ð ð Øˆtˆtðøøøõ  ™EœE€JÝ•R”W—_’_ YÑ/Ô/Ñ0Ô0€IØð &ð &ˆÝ˜T™
œ
ˆØ×$Ò$Ñ&Ô&ð 	¨$°-Ô2EÐ*EÐ*EØØ Ñ-ˆ	Ý˜y¨)Ñ4Ô4Ð<Øð	Ý(¨°IÐQUÐVÑVÔVˆFˆFøÝð 	ð 	ð 	Ø�4�4�4ð	øøøà�ZÒÐØ�NŠN˜9Ñ%Ô%Ð%øØÐs#   ¢&A	 Á	AÁAÃ#C6Ã6
DÄDÚblob_paths_to_deletec                óÐ   — t          | |¦  «        }|�|r|                     |¦  «        sdS 	 t          | ¦  «        r|                      ¦   «         j        ndS # t
          $ r Y dS w xY w)zHPredict bytes freed if all known references are part of a deletion plan.Nr   )rè   Úissubsetr,   r(   r5   r*   )r2   ré   r   ræ   s       r   Úexpected_shared_blob_freed_sizerì     s…   € õ 1°¸YÑGÔG€JØÐ Ð°:×3FÒ3FÐG[Ñ3\Ô3\ÐØˆqðÝ-=¸jÑ-IÔ-IÐPˆz×ÒÑ!Ô!Ô)Ð)ÈqÐPøÝð ð ð Øˆqˆqðøøøs   ­)A Á
A%Á$A%c                 óv  — t          | ¦  «        }t          |¦  «        st          ¦   «         S t          ¦   «         }	 t          |                     ¦   «         ¦  «        }n# t
          $ r |cY S w xY w|D ]Æ}t          j        d|j        ¦  «        �t          |¦  «        sŒ,	 t          |                     ¦   «         ¦  «        }n# t
          $ r Y Œ[w xY w|D ]d}t                               |j        ¦  «        �C|j                             |j        ¦  «        r$t          |¦  «        r|                     |¦  «         ŒeŒÇ|S )zBReturn all valid canonical payload paths in a marked shared store.z[0-9a-f]{2})r   rD   rã   rH   rI   r*   Úrer   rK   r1   r   rL   r,   rä   )r   rB   ÚpathsÚprefix_dirsri   rQ   rR   s          r   Úshared_store_blob_pathsrñ     s[  € å  Ñ+Ô+€IÝ˜yÑ)Ô)ð Ý‰uŒuˆÝ‘u”u€EðÝ˜9×,Ò,Ñ.Ô.Ñ/Ô/ˆˆøÝð ð ð Øˆˆˆðøøøà!ð !ð !ˆ
ÝŒ<˜¨
¬Ñ8Ô8Ð@ÍÐV`ÑHaÔHaÐ@Øð	Ý˜:×-Ò-Ñ/Ô/Ñ0Ô0ˆGˆGøÝð 	ð 	ð 	ØˆHð	øøøàð 	!ð 	!ˆEå×)Ò)¨%¬*Ñ5Ô5ÐAØ”J×)Ò)¨*¬/Ñ:Ô:ð Bå$ UÑ+Ô+ð Bð —	’	˜%Ñ Ô Ð øð	!ð €Ls#   ¼!A ÁA-Á,A-Â!CÃ
CÃCc                 ó²   — i }t          | ¦  «        D ]D}t          || ¦  «        }|�0|s.	 |                     ¦   «         j        ||<   Œ4# t          $ r Y Œ@w xY wŒE|S )z»Return store payloads without any valid manifest reference, with their sizes.

    Payloads with a missing or unreadable manifest are not listed, consistent with `sweep_shared_blob`.
    )rñ   rè   r(   r5   r*   )r   Úunreferencedr2   ræ   s       r   Úunreferenced_shared_blobsrô   *  s‚   € ð
 %'€LÝ-¨iÑ8Ô8ð ð ˆ
Ý4°ZÀÑKÔKˆ
ØÐ!¨*Ð!ðØ+5×+;Ò+;Ñ+=Ô+=Ô+E�˜ZÑ(Ð(øÝð ð ð Ø�ðøøøøàÐs   ©AÁ
AÁAræ   c                 ó¨  ‡— |                       | j        › dt          j        d¦  «        › d�¦  «        }t	          t
          j                             ‰¦  «        ¦  «        Š	 d                     ˆfd„t          |¦  «        D ¦   «         ¦  «        }| 
                    |¦  «         |                     d¦  «         |                     d¦  «        5 }t          j        |                     ¦   «         ¦  «         d d d ¦  «         n# 1 swxY w Y   t          j        || ¦  «         |                     d¬	¦  «         d S # |                     d¬	¦  «         w xY w)
NrW   rX   rY   Ú c              3   ól   •K  — | ].}|                      ‰¦  «                             ¦   «         › d �V — Œ/dS )r>   N)r‘   r•   )Ú.0r#   r   s     €r   ú	<genexpr>z$_rewrite_manifest.<locals>.<genexpr>>  sF   øè è € ÐgÐgÈD˜T×-Ò-¨iÑ8Ô8×AÒAÑCÔCÐGÐGÐGÐgÐgÐgÐgÐgÐgr   rm   ÚrbTrF   )r    rK   r^   r_   r   r8   r#   r‹   ÚjoinÚsortedr`   ra   r´   rÆ   Úfilenorc   rN   )rÀ   ræ   r   Útmp_pathÚcontentÚfiles     `   r   Ú_rewrite_manifestr  :  sn  ø€ Ø×&Ò&¨-Ô*<Ð'YÐ'Y½wÔ?PÐQRÑ?SÔ?SÐ'YÐ'YÐ'YÑZÔZ€HÝ•R”W—_’_ YÑ/Ô/Ñ0Ô0€Ið)Ø—'’'ÐgÐgÐgÐgÕTZÐ[eÑTfÔTfÐgÑgÔgÑgÔgˆØ×Ò˜GÑ$Ô$Ð$Ø�Š�uÑÔÐØ�]Š]˜4Ñ Ô ð 	$ DÝŒH�T—[’[‘]”]Ñ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$å
Œ
�8˜]Ñ+Ô+Ð+à�Š 4ˆÑ(Ô(Ð(Ð(Ð(øˆ�Š 4ˆÑ(Ô(Ð(Ð(øøøs1   Á!A-D9 Ã'DÃ5D9 ÄDÄD9 ÄDÄ	D9 Ä9Ec                óf  — t          t          j                             | ¦  «        ¦  «        } t          t          j                             |¦  «        ¦  «        }t          t          j                             t	          |¦  «        ¦  «        ¦  «        }	 |                      |¦  «        }n# t          $ r Y dS w xY wt          |¦  «        rTt          |j	        ¦  «        dk    s<t                               | j        ¦  «        �| j        j        | j        dd…         k    rdS 	 t          | ¦  «        5  t          | |¦  «        }|€	 ddd¦  «         dS t!          | ¦  «        }|rt#          |||¦  «         	 ddd¦  «         dS t%          | ¦  «        s	 ddd¦  «         dS |                      ¦   «         j        }|                      ¦   «          |                     d¬¦  «         |cddd¦  «         S # 1 swxY w Y   dS # t,          $ r+}t.                               d| › d|› �¦  «         Y d}~dS d}~ww xY w)zÍCollect one shared blob if its manifest has no remaining valid references.

    Missing, invalid, or unreadable metadata is never grounds for deletion. Returns the
    number of payload bytes removed.
    r   r   NTrF   zCould not collect shared blob 'rZ   )r   r8   r#   r‹   r   r‘   r   rD   r’   r“   r   r   rK   rh   r¿   rè   r©   r  r,   r(   r5   rN   r*   r6   r\   )r2   r   Úexpected_store_dirÚrelative_store_pathræ   rÀ   Úsizere   s           r   Úsweep_shared_blobr  H  sÚ  € õ •b”g—o’o jÑ1Ô1Ñ2Ô2€JÝ•R”W—_’_ YÑ/Ô/Ñ0Ô0€IÝ�bœgŸošoÕ.>¸yÑ.IÔ.IÑJÔJÑKÔKÐðØ(×4Ò4Ð5GÑHÔHÐÐøÝð ð ð Øˆqˆqðøøøõ  Ð 2Ñ3Ô3ðåÐ"Ô(Ñ)Ô)¨QÒ.Ð.Ý×$Ò$ Z¤_Ñ5Ô5Ð=ØÔÔ! Z¤_°R°a°RÔ%8Ò8Ð8àˆqðÝ˜zÑ*Ô*ð 	ð 	Ý8¸ÀYÑOÔOˆJØÐ!Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	õ :¸*ÑEÔEˆMØð Ý! -°¸YÑGÔGÐGØð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	õ $ JÑ/Ô/ð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ×#Ò#Ñ%Ô%Ô-ˆDØ×ÒÑÔÐØ× Ò ¨DÐ Ñ1Ô1Ð1Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øõ ð ð ð Ý�ŠÐI°zÐIÐIÀaÐIÐIÑJÔJÐJØˆqˆqˆqˆqˆqøøøøðøøøss   ÂB) Â)
B7Â6B7Ä G; Ä/G.ÅG; Å#G.Å3G; Æ G.ÆG; ÆAG.Ç!G; Ç.G2Ç2G; Ç5G2Ç6G; Ç;
H0È H+È+H0)IÚ__doc__r8   rî   r^   rÛ   r&   Ú
contextlibr   Úpathlibr   Útypingr   Úfilelockr   r   rö   r	   r   Ú
get_loggerÚ__name__r6   Úcompiler   rû   rü   ÚREPO_TYPES_MAPPINGr”   r   r?   rA   r!   r«   r¹   ÚescaperJ   Ústrr   r   r"   Úboolr,   r1   Úintr<   rD   rS   rf   rj   rb   rx   r]   r†   r�   r˜   r¤   r¦   r©   r¬   r¿   rÈ   rÎ   rÓ   rÖ   rØ   rà   rã   rè   rì   rñ   Údictrô   r  r  rÒ   r   r   ú<module>r     sÀ  ðð
ð 
ð 
€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð 
ˆÔ	˜HÑ	%Ô	%€à�"”*˜_Ñ-Ô-€Ø�"”*ÐY C§H¢H¨V¨V°IÔ4PÑ-QÔ-QÑ$RÔ$RÐYÐYÐYÑZÔZ€àÐ Ø6Ð Ø!Ð ØÐ Ø€ØÐ Ø�B”J 9 2¤9Ð-EÑ#FÔ#FÐ\Ð\Ð\Ñ]Ô]Ð ð3  d¡
ð 3¨tð 3ð 3ð 3ð 3ð
A  d¡
ð A°cð A¸dð Að Að Að Að\¨¨t©ð \¸sð \Àtð \ð \ð \ð \ð
˜4ð  Dð ð ð ð ð˜ð  ð ð ð ð ð tð ¸CÀ$¹Jð È4ð ð ð ð ð.	˜c D™jð 	¨Tð 	ð 	ð 	ð 	ð(¨tð (¸ð (ð (ð (ð (ð(¨¨d©
ð °tð ð ð ð ð4 #¨¡*ð ¸ð ÀÀtÁð ð ð ð ð(	m  t¡ð 	m°ð 	mð 	mð 	mð 	mð> c¨D¡jð >°Sð >ð >ð >ð >ð"¨ð "¸¸t¹ð "Èð "ð "ð "ð "ð°ð À$ð ÐSVÐY]ÑS]ð Ðbfð ð ð ð ð"+˜s T™zð +¨dð +ð +ð +ð +ðR 3¨¡:ð R¸#À¹*ð RÈÈtÉð Rð Rð Rð Rð& PUð 9ð  9ð  9Ø�T‰zð 9Ø&)¨D¡jð 9ØHLð 9à	ˆD�[ð 9ð  9ð  9ð  9ðFO #¨¡*ð O¸¸t¹ð OÈÈtÉð Oð Oð Oð OðH¨dð H°tð Hð Hð Hð HðD¨$ð D°4ð Dð Dð Dð Dð ð  $ð  ¨9Ð5EÔ+Fð  ð  ð  ñ „ð ðF¨dð Èð ÐPTð ð ð ð ð, tð ¸ð À$ð ð ð ð ðZ˜dð Zð Zð Zð Zð
 Øð Ø!$ð Ø14°t±ð ØLOÐRVÉJð à	ð ð  ð  ð  ðFX ð X°°t±ð XÈCÐRVÉJð XÐ[_ð Xð Xð Xð Xð" #ð4ð 4ð 4àð4ð ð4ð �T‰zð	4ð
 ˜‘:ð4ð ð4ð 
ð4ð 4ð 4ð 4ðn°ð ÀÀtÁð ÐPSÐTXÔPYÐ\`ÑP`ð ð ð ð ð6
Øð
Ø/2°4¬yð
ØEHÈ4ÁZð
àð
ð 
ð 
ð 
ð s¨T¡zð °c¸$´ið ð ð ð ð6¨¨t©ð ¸¸TÀ3¸Y¼ð ð ð ð ð ) Tð )°s¸4´yð )ÈSÐSWÉZð )Ð\`ð )ð )ð )ð )ð& $ð &°c¸D±jð &ÀSð &ð &ð &ð &ð &ð &r   