
    ^jv              ,          d dl Z d dlmZ d dlmZm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mZmZ dd	lmZmZmZmZmZmZmZmZ dd
lmZmZmZm Z  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl3mZ5  e+jl                  e7      Z8edddddddejr                  dddddddddddde:de:dz  de:dz  de:ez  dz  de:ez  dz  de:dz  de:dz  de;e:z  dz  de<de=de=e:z  dz  de=de>e:   e:z  dz  de>e:   e:z  dz  d e?d!e@e	   dz  d"e;e:e:f   dz  d#e:dz  d$ed   d%e:f(d&       ZAedddddddejr                  dddddddddd'dde:de:dz  de:dz  de:ez  dz  de:ez  dz  de:dz  de:dz  de;e:z  dz  de<de=de=e:z  dz  de=de>e:   e:z  dz  de>e:   e:z  dz  d e?d!e@e	   dz  d"e;e:e:f   dz  d#e:dz  d$ed'   d%e>e   f(d(       ZAedddddddejr                  dddddddddddde:de:dz  de:dz  de:ez  dz  de:ez  dz  de:dz  de:dz  de;e:z  dz  de<de=de=e:z  dz  de=de>e:   e:z  dz  de>e:   e:z  dz  d e?d!e@e	   dz  d"e;e:e:f   dz  d#e:dz  d$e=d%e:e>e   z  f(d)       ZAe,dddddddejr                  dddddddddddde:de:dz  de:dz  de:ez  dz  de:ez  dz  de:dz  de:dz  de;e:z  dz  de<de=de=e:z  dz  de=de>e:   e:z  dz  de>e:   e:z  dz  d e?d!e@e	   dz  d"e;e:e:f   dz  d#e:dz  d$e=d%e:e>e   z  f(d*       ZAd+e:d,e:d-e:de>e:   e:z  dz  de>e:   e:z  dz  de:de:d.eBdz  d%dfd/ZCe,ddddd0de:de:dz  de:dz  de:ez  dz  de:ez  dz  d%e>e&   fd1       ZDd-e:d2e:d%e=fd3ZEy)4    N)Path)Literaloverload)tqdm)
thread_map   )	constants)TreeCacheEntryread_tree_cachetree_cache_folder_for_local_dirwrite_tree_cache)CachedRepoTreeNotFoundErrorDryRunErrorGatedRepoErrorHfHubHTTPErrorIncompleteSnapshotErrorLocalEntryNotFoundErrorRepositoryNotFoundErrorRevisionNotFoundError)REGEX_COMMIT_HASHDryRunFileInfohf_hub_downloadrepo_folder_name)DatasetInfoHfApi
KernelInfo	ModelInfoRepoFile	SpaceInfo)OfflineModeIsEnabledfilter_repo_objectsloggingvalidate_hf_hub_args)XET_BYTES_BAR_FORMATXET_TRANSFER_BAR_FORMAT_finish_transfer_bar_set_aggregate_rate_postfix_update_transfer_bar)_create_progress_barF   )	repo_typerevision	cache_dir	local_dirlibrary_namelibrary_version
user_agentetag_timeoutforce_downloadtokenlocal_files_onlyallow_patternsignore_patternsmax_workers
tqdm_classheadersendpointdry_runrepo_idr+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   returnc                     y N r=   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   s                      m/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/huggingface_hub/_snapshot_download.pysnapshot_downloadrD   &   s    ,     Tc                     y r@   rA   rB   s                      rC   rD   rD   ?   s    , rE   c                     y r@   rA   rB   s                      rC   rD   rD   X   s    , "%rE   c                   	
!"#$% t         j                  t        t              j	                         j                               0t        t              j	                         j                               |t         j                  }dt         j                  vr(t        d dt        t         j                               t        j                  j                  t                     }t              n|}t        
      }d}d}|s	 |j                   |      }|rt/        d      |d"t1        j2                  |      r|"ndt        j                  j                  |d	|      }t        j                  j5                  |      r$t7        |      5 }|j9                         "ddd       "WUt        j                  j                  |d
"      }t        j                  j5                  |      rt;        |"||| ||       |S t              j=                         rlt?        jA                               rS"t;        |"t              || ||       tB        jE                  d d| d       t        j                               S |rtG        d      tI        |t(              rtG        d      |tI        |tJ        tL        f      s)tI        |t,              r|jN                  jP                  dk(  r|tG        d|jR                  jT                   d| d      ||jV                  J d       |jV                  "tY        |"      }||j[                   d"      D ci c]  }tI        |t\              r}|j                  t_        |j`                  |jb                  |jd                  |jd                  jf                  nd|jd                  |jd                  j`                  nd|jh                         }}stk        |"|       tm        to        |jq                         ||            }dts        |       d}rd|z   }t        j                  j                  |d
"      }|"k7  r|t        j                  j                  |d	|      }	 t        jt                  t        j                  jw                  |      d       t7        |d      5 }|jy                  "       ddd       g $|xs t|        }t        |tB        j                         d!d"d#d#d$dt        %	      %t        |tB        j                         d&d'd#d#d$dt        %	      # G #%fd(d)      !d*t        d+df!"	 $
fd,} t        | ||||-       t        %       %j                  d.       #j                  d/       rt        d0 $D              sJ $S (t        t        j                  j                              S |S # t         j"                  $ r  t         j$                  t         j&                  t(        f$ r}|}Y d}~d}~wt*        $ r  t,        $ r}|}Y d}~3d}~ww xY w# 1 sw Y   xY wc c}w # 1 sw Y   xY w# tz        $ r'}tB        jE                  d| d| d        Y d}~d}~ww xY w)1a  Download repo files.

    Download a whole snapshot of a repo's files at the specified revision. This is useful when you want all files from
    a repo because you don't know which ones you will need _a priori_. All files are nested in a folder to keep their
    path and filename relative to that folder. You can also filter which files to download by using `allow_patterns`
    and `ignore_patterns`.

    If `local_dir` is provided, the file structure from the repo will be replicated in this location. When using this
    option, the `cache_dir` will not be used, and a `.cache/huggingface/` folder will be created at the root of `local_dir`
    to store some metadata related to the downloaded files. While this mechanism is not as robust as the main
    cache system, it's optimized for regularly pulling the latest version of a repository.

    An alternative would be to clone the repo, but this requires git and git-lfs to be installed and properly
    configured. It is also not possible to filter which files to download when cloning a repository using git.

    Args:
        repo_id (`str`):
            A user or an organization name and a repo name separated by a `/`.
        repo_type (`str`, *optional*):
            Set to `"dataset"`, `"space"` or `"kernel"` if downloading from a dataset, space or kernel repo,
            `None` or `"model"` if downloading from a model. Default is `None`.
        revision (`str`, *optional*):
            An optional Git revision id, which can be a branch name, a tag, or a
            commit hash.
        cache_dir (`str`, `Path`, *optional*):
            Path to the folder where cached files are stored.
        local_dir (`str` or `Path`, *optional*):
            If provided, the downloaded files will be placed under this directory.
        library_name (`str`, *optional*):
            The name of the library to which the object corresponds.
        library_version (`str`, *optional*):
            The version of the library.
        user_agent (`str`, `dict`, *optional*):
            The user-agent info in the form of a dictionary or a string.
        etag_timeout (`float`, *optional*, defaults to `10`):
            When fetching ETag, how many seconds to wait for the server to send
            data before giving up, which is passed to `httpx.request`.
        force_download (`bool`, *optional*, defaults to `False`):
            Whether the file should be downloaded even if it already exists in the local cache.
        token (`str`, `bool`, *optional*):
            A token to be used for the download.
                - If `True`, the token is read from the HuggingFace config
                  folder.
                - If a string, it's used as the authentication token.
        headers (`dict`, *optional*):
            Additional headers to include in the request. Those headers take precedence over the others.
        endpoint (`str`, *optional*):
            The Hub endpoint to send the request to. Defaults to the value of `HF_ENDPOINT`.
        local_files_only (`bool`, *optional*, defaults to `False`):
            If `True`, do not download any files even if they are not in `cache_dir` or `local_dir`.
        allow_patterns (`list[str]` or `str`, *optional*):
            If provided, only files matching at least one pattern are downloaded.
        ignore_patterns (`list[str]` or `str`, *optional*):
            If provided, files matching any of the patterns are not downloaded.
        max_workers (`int`, *optional*):
            Number of concurrent threads to download files (1 thread = 1 file download).
            Defaults to 8.
        tqdm_class (`tqdm`, *optional*):
            If provided, overwrites the default behavior for the progress bar. Passed
            argument must inherit from `tqdm.auto.tqdm` or at least mimic its behavior.
            Note that the `tqdm_class` is not passed to each individual download.
            Defaults to the custom HF progress bar that can be disabled by setting
            `HF_HUB_DISABLE_PROGRESS_BARS` environment variable.
        dry_run (`bool`, *optional*, defaults to `False`):
            If `True`, perform a dry run without actually downloading the files. Returns a list of
            [`DryRunFileInfo`] objects containing information about what would be downloaded.

    Returns:
        `str` or list of [`DryRunFileInfo`]:
            - If `dry_run=False`: Local snapshot path.
            - If `dry_run=True`: A list of [`DryRunFileInfo`] objects containing download information.

    Raises:
        [`~utils.RepositoryNotFoundError`]
            If the repository to download from cannot be found. This may be because it doesn't exist
            or because it is set to `private` and you do not have access.
        [`~utils.RevisionNotFoundError`]
            If the revision to download from cannot be found.
        [`~errors.IncompleteSnapshotError`]
            If the Hub cannot be reached (offline, connection issue, or `local_files_only=True`) and the
            cached snapshot is missing some of the requested files.
        [`EnvironmentError`](https://docs.python.org/3/library/exceptions.html#EnvironmentError)
            If `token=True` and the token cannot be found.
        [`OSError`](https://docs.python.org/3/library/exceptions.html#OSError) if
            ETag cannot be determined.
        [`ValueError`](https://docs.python.org/3/library/exceptions.html#ValueError)
            If some parameter value is invalid.
    NmodelInvalid repo type: . Accepted repo types are: r=   r+   )r/   r0   r1   r;   r:   r4   )r=   r+   r,   zDry run cannot be performed as the repository cannot be accessed. Please check your internet connection or authentication token.refs	snapshots)tree_cache_foldercommit_hashbase_dirr6   r7   r=   r,   api_call_errorzReturning existing local_dir `z<` as remote repo cannot be accessed in `snapshot_download` ().zCannot find an appropriate cached snapshot folder for the specified revision on the local disk and outgoing traffic has been disabled. To enable repo look-ups and downloads online, pass 'local_files_only=False' as input.zCannot find an appropriate cached snapshot folder for the specified revision on the local disk and outgoing traffic has been disabled. To enable repo look-ups and downloads online, set 'HF_HUB_OFFLINE=0' as environment variable.i  zGot: : z
An error happened while trying to locate the files on the Hub, and we cannot find the appropriate snapshot folder for the specified revision on the local disk. Please check your internet connection and try again.z8Repo info returned from server must have a revision sha.T)r=   	recursiver,   r+   )sizeblob_id
lfs_sha256lfs_sizexet_hashitemsr6   r7   z	Fetching z filesz
[dry-run] )exist_okwz+Ignored error while writing commit hash to .z*huggingface_hub.snapshot_download.transferzDownloading bytesr   B)	cls	log_levelnamedesctotalinitialunit
unit_scale
bar_formatz!huggingface_hub.snapshot_downloadz$Reconstructing (incomplete total...)c                       e Zd ZdZ fdZd Zd ZddZddee	z  dz  ddf fd	Z
ddee	z  dz  ddffd
Zddededdf fdZddededdffdZy)*snapshot_download.<locals>._AggregatedTqdma  Fake tqdm object to aggregate progress into the parent snapshot progress bars.

        In practice, the `_AggregatedTqdm` object won't be displayed; it's just used to update
        the `reconstruct_progress` and `transfer_progress` bars from each thread/file download.
        c                     |j                  dd       }|@j                  xs d|z   _        j                  xs d|z   _        j                          |j                  dd      }|rj                  |       y y )Nre   r   rf   )popre   refreshupdate)selfargskwargsre   rf   reconstruct_progresstransfer_progresss        rC   __init__z3snapshot_download.<locals>._AggregatedTqdm.__init__  s    JJw-E .B.H.H.MAQV-V$*+<+B+B+Ga5*P!'$,,. jjA.G$++G4 rE   c                     | S r@   rA   rp   s    rC   	__enter__z4snapshot_download.<locals>._AggregatedTqdm.__enter__  s    KrE   c                      y r@   rA   )rp   exc_type	exc_value	tracebacks       rC   __exit__z3snapshot_download.<locals>._AggregatedTqdm.__exit__      rE   r>   Nc                      y r@   rA   rw   s    rC   closez0snapshot_download.<locals>._AggregatedTqdm.close  r~   rE   nc                 (    j                  |       y r@   )ro   )rp   r   rs   s     rC   ro   z1snapshot_download.<locals>._AggregatedTqdm.update  s     ''*rE   c                 8    t        t        |xs d             y )Nr   )r(   int)rp   r   rt   s     rC   update_transferz:snapshot_download.<locals>._AggregatedTqdm.update_transfer  s     !2CQK@rE   postfixrn   c                     t               y r@   r'   )rp   r   rn   rs   s      rC   set_postfix_strz:snapshot_download.<locals>._AggregatedTqdm.set_postfix_str  s    '(<=rE   c                     t               y r@   r   )rp   r   rn   rt   s      rC   set_transfer_postfix_strzCsnapshot_download.<locals>._AggregatedTqdm.set_transfer_postfix_str  s    '(9:rE   )r>   N)r   )F)__name__
__module____qualname____doc__ru   rx   r}   r   r   floatro   r   strboolr   r   )rs   rt   s   rC   _AggregatedTqdmrk     s    		5				+C%K$. 	+t 	+	AS5[4%7 	A 	A	>3 	> 	>$ 	>	;C 	;$ 	;SW 	;rE   r   	repo_filer>   c                 X    j                  t        f| 	
d       y )N)filenamer+   r,   r;   r-   r.   r/   r0   r1   r2   r3   r4   r:   r9   r<   )appendr   )r   r   r-   rP   r<   r;   r2   r3   r:   r/   r0   r.   r=   r+   resultsr4   r1   s    rC   _inner_hf_hub_downloadz1snapshot_download.<locals>._inner_hf_hub_download  sL    "#$!##) /%)-*!	
rE   )rd   r8   r9   zDownload completezReconstruction completec              3   <   K   | ]  }t        |t                y wr@   )
isinstancer   ).0rs     rC   	<genexpr>z$snapshot_download.<locals>.<genexpr>  s     BQ:a0Bs   )Hr	   HF_HUB_CACHEr   r   
expanduserresolveDEFAULT_REVISIONREPO_TYPES_WITH_KERNEL
ValueErrorospathjoinr   r   r   	repo_infohttpx
ProxyErrorConnectErrorTimeoutExceptionr    r   r   r   r   matchexistsopenread_raise_if_incomplete_snapshotis_diranyiterdirloggerwarningr   r   r   r   responsestatus_code	__class__r   shar   list_repo_treer   r
   rV   rW   lfssha256rZ   r   listr!   keyslenmakedirsdirnamewriteOSErrorhf_tqdmr)   getEffectiveLevelr%   r$   r   r&   set_descriptionallrealpath)&r=   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   storage_folderrO   apir   rR   errorref_pathfsnapshot_foldertree_entriesfiltered_repo_files	tqdm_descer   r   rP   rs   r   rt   s&   `` ````````     ```              @@@@@rC   rD   rD   q   s   ^ **	DO..088:;IY224<<>?	--		888!),GILlLlHmGno
 	
 WW\\)-=gYb-cdN GPF[7	Bao
!'C JNI'+N	gU]^I>  S!"
 ""8,"Kww||NFHEHww~~h'(^ +q"#&&(K+ "y'8 ggll>;TOww~~o. .&7 +,#1$3#%#1	 '&  YI!c)*;*;*=&>*1*;$/!$Y'5(7 '!)'5	 4YK?{  }K  |L  LN  O 9,,.//)5 
 (<=)> "	"
 )@.(QR~~6>;R;R;^;^be;e !  *0099:"^<L""
 "" ==$`&``$--K ##4kBL ''4R]ir's

 !X& FFNVV		+,55+<155<<$'(uu'8d 

 

 .\J##%)+	
 C 345V<I 9,	ggll>;LO ;77<<A	[KK1DAh$ %$%
 +-G &wJ -**,9 *
 0**,03'
(; (;Z
# 
$ 
 
 
,  *+%%&9:(()BCB'BBBB277##I.//c  	""E$:$:<PQ 	 #N$ 	 	 #N	B+ +V

B% % 	[NNH
RTUVTWWXYZZ	[sh   )X 3Y8BZ+A Z +Z
=Z ;Y5YY5(Y00Y58Z
ZZ 	[ [[rO   rP   rQ   rR   c                    t        | |      }|yt        |j                         ||      }	|	D 
cg c]  }
t        ||
      r|
 }}
|sydj	                  |dd       }t        |      dkD  r|dt        |      dz
   dz  }|d|j                  j                   d| d	}nd
}t        d| d| d| dt        |       d| d| d|      |c c}
w )a<  Raise [`IncompleteSnapshotError`] if the cached tree listing shows `base_dir` misses requested files.

    If the tree listing is not cached we cannot tell, so we do nothing and the caller keeps returning the
    folder as-is. Otherwise every expected file (after pattern filtering) must exist under `base_dir`.
    Nr[   z,    z, ... (z more)zThe Hub could not be reached (rT   rS   z7Outgoing traffic is disabled ('local_files_only=True').zThe cached snapshot for '' (revision 'z
', commit z) is incomplete: z file(s) are missing (z). zB Re-run the download with network access to complete the snapshot.)snapshot_path)	r   r!   r   _local_file_existsr   r   r   r   r   )rO   rP   rQ   r6   r7   r=   r,   rR   r   expectedr   missingsamplereasons                 rC   r   r     s     ##4kBL"!.RaH !)S0B8T0RtSGSYYwr{#F
7|aGCL1,-V44!1.2J2J2S2S1TTVWeVffhiJ
!
#G9M(:k]Zkw<..vhc& B$	$ 	
  Ts   CC)r+   r,   r-   r.   c                T   |t         j                  }t        t        |      j	                         j                               }|0t        t        |      j	                         j                               }|t         j                  }|t         j                  }|t         j                  vr(t        d| dt        t         j                               t        j                  j                  |t        | |            }|t        |      n|}t        j                   |      r|}n|t        j                  j                  |d|      }t        j                  j#                  |      st%        d|  d| d| d	| d
	      t'        |      5 }	|	j)                         }ddd       t+        |      }
|
t%        d|  d| d| d| d| d
      |
j-                         D cg c]2  \  }}t/        ||j0                  |j2                  |j4                        4 c}}S # 1 sw Y   xY wc c}}w )aD  Return the cached tree listing of a repo at a given revision, without any network call.

    The tree listing is the set of files (with their download metadata) of a repo at a commit. It is populated
    on disk as a side effect of [`snapshot_download`] (see the `trees/<commit_hash>.json` cache files) and is
    used to skip network calls on subsequent downloads. This function exposes that cache directly.

    If you need the current tree listing of a repo on the Hub, use [`list_repo_tree`] instead.

    Args:
        repo_id (`str`):
            A user or an organization name and a repo name separated by a `/`.
        repo_type (`str`, *optional*):
            Set to `"dataset"`, `"space"` or `"kernel"` if listing from a dataset, space or kernel repo,
            `None` or `"model"` if listing from a model. Default is `None`.
        revision (`str`, *optional*):
            An optional Git revision id, which can be a branch name, a tag, or a commit hash. Defaults to the
            default branch. Branch/tag names are resolved to a commit hash using the local cache (`refs/`).
        cache_dir (`str`, `Path`, *optional*):
            Path to the folder where cached files are stored. Defaults to the value of `HF_HUB_CACHE`.
        local_dir (`str` or `Path`, *optional*):
            If provided, read the tree listing cached by a `local_dir` download (from
            `local_dir/.cache/huggingface/`) instead of the main cache. Branch/tag revisions are still resolved
            to a commit hash using the main cache (`cache_dir`).

    Returns:
        `list[RepoFile]`: The list of [`RepoFile`] objects cached for this revision.

    Raises:
        [`~errors.CachedRepoTreeNotFoundError`]
            If no tree listing is cached for the requested revision (e.g. the repo was never downloaded at this revision).

    Example:
        ```py
        >>> from huggingface_hub import get_cached_repo_tree
        >>> files = get_cached_repo_tree("openai-community/gpt2")
        >>> [f.path for f in files]
        ['.gitattributes', 'config.json', 'model.safetensors', ...]
        ```
    NrJ   rK   rL   rM   z"No cached tree listing found for 'r   z', repo_type 'zH'): the revision is not a commit hash and no matching ref is cached in 'zQ'. Download the repo (e.g. with `snapshot_download`) to populate the cache first.z', commit 'z') in ')r   rV   oidxetHash)r	   r   r   r   r   r   r   REPO_TYPE_MODELr   r   r   r   r   r   r   r   r   isfiler   r   r   r   r\   r   rV   rW   rZ   )r=   r+   r,   r-   r.   r   rO   rP   r   r   r   r   entrys                rC   get_cached_repo_treer   A  s*   ` **	DO..088:;IY224<<>?	----		888!),GILlLlHmGno
 	
 WW\\)-=gYb-cdN GPF[7	Bao x(77<<Aww~~h'-4WI]8*Tbclbm nWWeVf gaa 
 (^ 	#q&&(K	# ##4kBL)0	xjP[\g[h i#G,=+> ?++
 	
 (--/D% 	dW 	# 	#s   H7H$H!r   c                    t        j                  j                  | g|j                  d       }t         j                  dk(  r^t        t         j                  j                  |            dkD  r3|j                  d      s"dt         j                  j                  |      z   }t         j                  j                  |      S )zCheck whether a repo file (path relative to `base_dir`, '/'-separated) exists on disk.

    On Windows, paths longer than 255 characters must be prefixed with `\\?\`, otherwise `os.path.isfile` reports an
    existing file as missing.
    /nt   z\\?\)	r   r   r   splitrc   r   abspath
startswithr   )rQ   r   	full_paths      rC   r   r     s     X8

38I	ww$3rwwy9:S@I]I]^gIh	 ::	77>>)$$rE   )Fr   pathlibr   typingr   r   r   	tqdm.autor   	base_tqdmtqdm.contrib.concurrentr    r	   _tree_cacher
   r   r   r   errorsr   r   r   r   r   r   r   r   file_downloadr   r   r   r   hf_apir   r   r   r   r   r   utilsr    r!   r"   r#   utils._xet_progress_reportingr$   r%   r&   r'   r(   
utils.tqdmr)   r   
get_loggerr   r   DEFAULT_ETAG_TIMEOUTr   dictr   r   r   r   typerD   	Exceptionr   r   r   rA   rE   rC   <module>r      s   	  $  ' .  k k	 	 	 ` _ R R [ [  - ' 
		H	% 
 !#'#'#"&$(#88 #"-1.2)-%)#) Tz Dj	
 TzD  TzD  * 4Z s
T!   #:  IOd* #Y_t+  !" Y$&#$ #s(^d"%& Dj'( U^)* 	+ 
0 
 !#'#'#"&$(#88 #"-1.2)-%)!) Tz Dj	
 TzD  TzD  * 4Z s
T!   #:  IOd* #Y_t+  !" Y$&#$ #s(^d"%& Dj'( T])* 
.+ 
0 
 !#'#'#"&$(#88 #"-1.2)-%))%% Tz% Dj	%
 TzD % TzD % *% 4Z% s
T!% % % #:% % IOd*% #Y_t+%  !%" Y$&#%$ #s(^d"%%& Dj'%( )%* 	4+% 
%0  !#'#'#"&$(#88 #"-1.2)-%))cc Tzc Dj	c
 TzD c TzD c *c 4Zc s
T!c c c #:c c IOd*c #Y_t+c  !c" Y$&#c$ #s(^d"%c& Dj'c( )c* 	4+c cL&& & 	&
 IOd*& #Y_t+& & & $& 
&R  !#'#']] Tz] Dj	]
 TzD ] TzD ] 
(^] ]@	% 	%C 	%D 	%rE   