
    \jc                       U d Z 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m	Z	m
Z
mZmZ ddlmZ ddlmZmZmZmZmZmZmZ ddlmZ dd	lmZmZ eeej:                  e   f   Z ed
e      Z	  eded      Z 	  ede      Z!	 ejD                  ejF                  fD  cg c]  } | r| ejD                  k7  r	 ee|        c} Z$	 i Z%de&d<   	 d0dZ'	 d1	 	 	 	 	 	 	 d2dZ(	 d1	 	 	 	 	 	 	 d3dZ)	 	 	 	 d4dZ*d5dZ+ ed      d6d       Z,	 	 d6	 	 	 	 	 	 	 d7dZ-	 	 	 	 	 	 	 	 	 	 	 	 d8dZ.	 	 d6	 	 	 	 	 	 	 d9dZ/	 	 	 	 	 	 	 	 	 	 	 	 d:dZ0d;dZ1d<dZ2 ed      	 	 	 	 	 	 d=d        Z3	 d1	 	 	 	 	 d>d!Z4 ed"      	 d1	 	 	 	 	 d?d#       Z5	 d1	 	 	 	 	 	 	 d@d$Z6 G d% d&e7      Z8 G d' d(e7      Z9 ed)       G d* d+ee!                Z: G d, d-e;      Z< G d. d/e;      Z=yc c} w )AzC
This module provides utility methods for dealing with path-specs.
    )annotationsN)
CollectionIterableIteratorSequence)	dataclass)AnyCallableGenericOptionalTypeVarUnioncast   )Pattern)AnyStr
deprecatedTPattern)boundTPattern_coT)r   	covariantTStrPathz1dict[str, Callable[[Union[str, bytes]], Pattern]]_registered_patternsc                b    t        |       }| j                         r|t        j                  z  }|S )a4  
	Appends the path separator to the path if the path is a directory. This can be
	used to aid in distinguishing between directories and files on the file-system
	by relying on the presence of a trailing path separator.

	*path* (:class:`pathlib.Path`) is the path to use.

	Returns the path (:class:`str`).
	)stris_dirossep)pathstr_paths     7/root/env/lib/python3.12/site-packages/pathspec/util.pyappend_dir_sepr"   G   s)     IKKM
bff(    c                    |r9| D ]3  \  }}|j                   |j                  |      %|j                   |fc S  yd}d}| D ]2  \  }}|j                   |j                  |      %|j                   }|}4 ||fS )a  
	Check the file against the patterns.

	*patterns* (:class:`~collections.abc.Iterable`) yields each indexed pattern
	(:class:`tuple`) which contains the pattern index (:class:`int`) and actua
	pattern (:class:`.Pattern`).

	*file* (:class:`str`) is the normalized file path to be matched against
	*patterns*.

	*is_reversed* (:class:`bool` or :data:`None`) is whether the order of the
	patterns has been reversed. Default is :data:`None` for :data:`False`.
	Reversing the order of the patterns is an optimization.

	Returns a :class:`tuple` containing whether to include *file* (:class:`bool`
	or :data:`None`), and the index of the last matched pattern (:class:`int` or
	:data:`None`).
	NNNinclude
match_file)patternsfileis_reversedindexpatternout_include	out_indexs          r!   check_match_filer0   X   s    .  ! "neWoo!g&8&8&>&J??E!!" 
 !%+!)  neWoo!g&8&8&>&J//KI
 
i	r#   c                X   t        |t              r|n
t        |      }i }| D ]  }|j                  |j	                  |      }|j                  rO|D ]I  }||v r4|r||   j
                  j                  |       (|||   j
                  d<   ;t        |g      ||<   K ||D ]  }||=   |S )a  
	Matches the files to the patterns, and returns which patterns matched the
	files.

	*patterns* (:class:`~collections.abc.Iterable` of :class:`.Pattern`) contains
	the patterns to use.

	*files* (:class:`~collections.abc.Iterable` of :class:`str`) contains the
	normalized file paths to be matched against *patterns*.

	*all_matches* (:class:`bool` or :data:`None`) is whether to return all matches
	patterns (:data:`True`), or only the last matched pattern (:data:`False`).
	Default is :data:`None` for :data:`False`.

	Returns the matched files (:class:`dict`) which maps each matched file
	(:class:`str`) to the patterns that matched in order (:class:`.MatchDetail`).
	r   )
isinstancer   listr'   matchr)   appendMatchDetail)	r)   filesall_matches	all_filesreturn_filesr-   result_filesresult_filer*   s	            r!   detailed_match_filesr=      s    , !
3Ue(* W__ --	*<oo# 9|#	K ))009/6|K ))!,"-wi"8l;9  	d	#( 	r#   c                f    t        |       D cg c]  \  }}|j                  ||f c}}S c c}}w )a&  
	Filters out null-patterns.

	*patterns* (:class:`~collections.abc.Iterable` of :class:`.Pattern`) contains
	the patterns.

	Returns a :class:`list` containing each indexed pattern (:class:`tuple`) which
	contains the pattern index (:class:`int`) and the actual pattern
	(:class:`.Pattern`).
	)	enumerater'   )r)   __index__pats      r!   _filter_check_patternsrB      s<     "(+	gu
]] E	  	s   -c                T    t        | t              xr t        | t        t        f       S )z
	Check whether the value is an iterable (excludes strings).

	*value* is the value to check,

	Returns whether *value* is an iterable (:class:`bool`).
	)r2   r   r   bytes)values    r!   _is_iterablerF      s$     	5(#KJusEl,K(KKr#   zGpathspec.util.iter_tree() is deprecated. Use iter_tree_files() instead.c                    t        | ||      S )z`
	.. version-deprecated:: 0.10.0
		This is an alias for the :func:`.iter_tree_files` function.
	)on_errorfollow_links)iter_tree_filesrootrH   rI   s      r!   	iter_treerM      s     	xlKKr#   c              #     K   |t        |      st        d|d      |d}t        t        j                  j                  |       di ||      E d{    y7 w)a  
	Walks the specified directory for all files and directories.

	*root* (:class:`str` or :class:`os.PathLike`) is the root directory to search.

	*on_error* (:class:`~collections.abc.Callable` or :data:`None`) optionally is
	the error handler for file-system exceptions. It will be called with the
	exception (:exc:`OSError`). Reraise the exception to abort the walk. Default
	is :data:`None` to ignore file-system exceptions.

	*follow_links* (:class:`bool` or :data:`None`) optionally is whether to walk
	symbolic links that resolve to directories. Default is :data:`None` for
	:data:`True`.

	Raises :exc:`.RecursionError` if recursion is detected.

	Returns an :class:`~collections.abc.Iterator` yielding each file or directory
	entry (:class:`.TreeEntry`) relative to *root*.
	N	on_error: is not callable.T )callable	TypeError_iter_tree_entries_nextr   r   abspathrK   s      r!   iter_tree_entriesrV      sX     0 (!3Ih\):;<<,#BGGOOD$92r8\ZZZ   AAAAc           	   #  x  K   t         j                  j                  | |      }t         j                  j                  |      }||vr|||<   nt	        |||   |      t        j
                  |      5 }|D ]  }t         j                  j                  ||j                        }		 |j                  d      }
|j                         r	 |j                         }n|
}|j                  |      r2t        |j                  |	|
|       t        | |	|||      E d{    |j                         s|j                         st        |j                  |	|
|        	 ddd       ||= y# t        $ r}| ||       Y d}~d}~ww xY w# t        $ r}| ||       Y d}~,d}~ww xY w7 # 1 sw Y   ||= yxY ww)ap  
	Scan the directory for all descendant files.

	*root_full* (:class:`str`) the absolute path to the root directory.

	*dir_rel* (:class:`str`) the path to the directory to scan relative to
	*root_full*.

	*memo* (:class:`dict`) keeps track of ancestor directories encountered. Maps
	each ancestor real path (:class:`str`) to relative path (:class:`str`).

	*on_error* (:class:`~collections.abc.Callable` or :data:`None`) optionally is
	the error handler for file-system exceptions.

	*follow_links* (:class:`bool`) is whether to walk symbolic links that resolve
	to directories.

	Yields each entry (:class:`.TreeEntry`).
		real_path
first_pathsecond_pathFfollow_symlinksN)r   r   joinrealpathRecursionErrorscandirnamestatOSError
is_symlinkr   	TreeEntryrT   is_file)	root_fulldir_relmemorH   rI   dir_fulldir_real	scan_iternode_entnode_rel
node_lstate	node_stats                r!   rT   rT      s    4 GGLLG,GGX& D$x.d8nRYZZjj !Di Dhggll7HMM28u5J Y Ioolo3 HMM8Z
CC&y(D(LYYYh113
HMM8Z
CC?D!DP 
(^A  a[  qk Z;!DP 
(^s   A0F:20F+#E'5F+FAF+F)%F+>F+F:'	F0
F :F+ FF+	F&
F!F+!F&&F++F70
F:c              #     K   |t        |      st        d|d      |d}t        t        j                  j                  |       di ||      E d{    y7 w)a  
	Walks the specified directory for all files.

	*root* (:class:`str` or :class:`os.PathLike`) is the root directory to search
	for files.

	*on_error* (:class:`~collections.abc.Callable` or :data:`None`) optionally is
	the error handler for file-system exceptions. It will be called with the
	exception (:exc:`OSError`). Reraise the exception to abort the walk. Default
	is :data:`None` to ignore file-system exceptions.

	*follow_links* (:class:`bool` or :data:`None`) optionally is whether to walk
	symbolic links that resolve to directories. Default is :data:`None` for
	:data:`True`.

	Raises :exc:`.RecursionError` if recursion is detected.

	Returns an :class:`~collections.abc.Iterator` yielding the path to each file
	(:class:`str`) relative to *root*.
	NrO   rP   TrQ   )rR   rS   _iter_tree_files_nextr   r   rU   rK   s      r!   rJ   rJ   M  sX     2 (!3Ih\):;<<,!"''//$"7R<XXXrW   c           	   #  6  K   t         j                  j                  | |      }t         j                  j                  |      }||vr|||<   nt	        |||   |      t        j
                  |      5 }|D ]  }t         j                  j                  ||j                        }	|j                  |      rt        | |	|||      E d{    W|j                         r|	 l|ro|j                         s|	  	 ddd       ||= y7 A# 1 sw Y   ||= yxY ww)am  
	Scan the directory for all descendant files.

	*root_full* (:class:`str`) the absolute path to the root directory.

	*dir_rel* (:class:`str`) the path to the directory to scan relative to
	*root_full*.

	*memo* (:class:`dict`) keeps track of ancestor directories encountered. Maps
	each ancestor real path (:class:`str`) to relative path (:class:`str`).

	*on_error* (:class:`~collections.abc.Callable` or :data:`None`) optionally is
	the error handler for file-system exceptions.

	*follow_links* (:class:`bool`) is whether to walk symbolic links that resolve
	to directories.

	Yields each file path (:class:`str`).
	rY   r]   N)r   r   r_   r`   ra   rb   rc   r   ru   rh   rf   )
ri   rj   rk   rH   rI   rl   rm   rn   ro   rp   s
             r!   ru   ru   o  s     4 GGLLG,GGX& D$x.d8nRYZZjj i hggll7HMM28oolo3 %Y$,WWW
NX002
N. 
(^ X. 
(^s=   A0D2AD
DD
$D
5D
<DD

D
Dc                    t         |    S )z
	Looks up a registered pattern factory by name.

	*name* (:class:`str`) is the name of the pattern factory.

	Returns the registered pattern factory (:class:`~collections.abc.Callable`).
	If no pattern factory is registered, raises :exc:`KeyError`.
	)r   )rc   s    r!   lookup_patternrx     s     	T""r#   c                n    d}| D ]-  }|j                   |j                  |      "|j                   }/ |S )a&  
	Matches the file to the patterns.

	*patterns* (:class:`~collections.abc.Iterable` of :class:`.Pattern`) contains
	the patterns to use.

	*file* (:class:`str`) is the normalized file path to be matched against
	*patterns*.

	Returns :data:`True` if *file* matched; otherwise, :data:`False`.
	Fr&   )r)   r*   matchedr-   s       r!   r(   r(     sB      W__ W%7%7%=%I__7 	r#   z[pathspec.util.match_files() is deprecated. Use match_file() with a loop for better results.c                    | D cg c]  }|j                   | }}t               }|D ]   }t        ||      s|j                  |       " |S c c}w )a  
	.. version-deprecated:: 0.10.0
		This function is no longer used. Use the :func:`.match_file` function with a
		loop for better results.

	Matches the files to the patterns.

	*patterns* (:class:`~collections.abc.Iterable` of :class:`.Pattern`) contains
	the patterns to use.

	*files* (:class:`~collections.abc.Iterable` of :class:`str`) contains the
	normalized file paths to be matched against *patterns*.

	Returns the matched files (:class:`set` of :class:`str`).
	)r'   setr(   add)r)   r7   rA   use_patternsr:   r*   s         r!   match_filesr     s\    . %-J50IJJ Td#D 	 Ks
   AAc                    |t         }|J |       t        j                  |       }|D ]"  }|j                  |t        j
                        }$ |j                  d      r|dd }|S |j                  d      r|dd }|S )a  
	Normalizes the file path to use the POSIX path separator (i.e., ``"/"``), and
	make the paths relative (remove leading ``"/"``).

	*file* (:class:`str` or :class:`os.PathLike`) is the file path.

	*separators* (:class:`~collections.abc.Collection` of :class:`str`; or
	:data:`None`) optionally contains the path separators to normalize. This does
	not need to include the POSIX path separator (``"/"``), but including it will
	not affect the results. Default is ``None`` for :data:`.NORMALIZE_PATH_SEPS`.
	To prevent normalization, pass an empty container (e.g., an empty tuple
	``()``).

	Returns the normalized file path (:class:`str`).
	N/r   z./   )NORMALIZE_PATH_SEPSr   fspathreplace	posixpathr   
startswith)r*   
separators	norm_filer   s       r!   normalize_filer     s    ( "**
* ))D/ 4SY]]3)4 m) 		 4 m)r#   zcpathspec.util.normalize_files() is deprecated. Use normalize_file() with a loop for better results.c                p    i }| D ].  }t        ||      }||v r||   j                  |       )|g||<   0 |S )a  
	.. version-deprecated:: 0.10.0
		This function is no longer used. Use the :func:`.normalize_file` function
		with a loop for better results.

	Normalizes the file paths to use the POSIX path separator.

	*files* (:class:`~collections.abc.Iterable` of :class:`str` or
	:class:`os.PathLike`) contains the file paths to be normalized.

	*separators* (:class:`~collections.abc.Collection` of :class:`str`; or
	:data:`None`) optionally contains the path separators to normalize. See
	:func:`.normalize_file` for more information.

	Returns a :class:`dict` mapping each normalized file path (:class:`str`) to
	the original file paths (:class:`list` of :class:`str` or
	:class:`os.PathLike`).
	)r   )r   r5   )r7   r   
norm_filesr   r   s        r!   normalize_filesr     sS    4 )+ "TTj9)*i% 6:i" 	r#   c                    t        | t              st        d| d      t        |      st        d|d      | t        v r|st        | t        |          |t        | <   y)aE  
	Registers the specified pattern factory.

	*name* (:class:`str`) is the name to register the pattern factory under.

	*pattern_factory* (:class:`~collections.abc.Callable`) is used to compile
	patterns. It must accept an uncompiled pattern (:class:`str`) and return the
	compiled pattern (:class:`.Pattern`).

	*override* (:class:`bool` or :data:`None`) optionally is whether to allow
	overriding an already registered pattern under the same name (:data:`True`),
	instead of raising an :exc:`.AlreadyRegisteredError` (:data:`False`). Default
	is :data:`None` for :data:`False`.
	zname=z is not a string.zpattern_factory=rP   N)r2   r   rS   rR   r   AlreadyRegisteredError)rc   pattern_factoryoverrides      r!   register_patternr   =  sk    & 	4UTI./00!%_((9:;;  t%9$%?@@-dr#   c                  f     e Zd ZdZ	 	 	 	 	 	 d fdZedd       Zedd       Zedd       Z xZ	S )	r   z|
	The :exc:`AlreadyRegisteredError` exception is raised when a pattern factory
	is registered under a name already in use.
	c                &    t         |   ||       y)z
		Initializes the :exc:`AlreadyRegisteredError` instance.

		*name* (:class:`str`) is the name of the registered pattern.

		*pattern_factory* (:class:`~collections.abc.Callable`) is the registered
		pattern factory.
		Nsuper__init__)selfrc   r   	__class__s      r!   r   zAlreadyRegisteredError.__init__b  s     '4)r#   c                :    | j                   d| j                  dS )4
		*message* (:class:`str`) is the error message.
		z+ is already registered for pattern factory=.)rc   r   r   s    r!   messagezAlreadyRegisteredError.messageq  s(     ii]=
Q r#   c                     | j                   d   S )zB
		*name* (:class:`str`) is the name of the registered pattern.
		r   argsr   s    r!   rc   zAlreadyRegisteredError.name{  s    
 
1r#   c                     | j                   d   S )za
		*pattern_factory* (:class:`~collections.abc.Callable`) is the registered
		pattern factory.
		r   r   r   s    r!   r   z&AlreadyRegisteredError.pattern_factory       
1r#   )rc   r   r   &Callable[[Union[str, bytes]], Pattern]returnNoner   r   )r   r   )
__name__
__module____qualname____doc__r   propertyr   rc   r   __classcell__r   s   @r!   r   r   \  se    
** :* 	*      r#   r   c                  |     e Zd ZdZ	 	 	 	 	 	 	 	 d fdZedd       Zedd       Zedd       Zedd       Z	 xZ
S )	ra   zM
	The :exc:`RecursionError` exception is raised when recursion is detected.
	c                (    t         |   |||       y)a'  
		Initializes the :exc:`RecursionError` instance.

		*real_path* (:class:`str`) is the real path that recursion was encountered
		on.

		*first_path* (:class:`str`) is the first path encountered for *real_path*.

		*second_path* (:class:`str`) is the second path encountered for *real_path*.
		Nr   )r   rZ   r[   r\   r   s       r!   r   zRecursionError.__init__  s      '9j+6r#   c                     | j                   d   S )zx
		*first_path* (:class:`str`) is the first path encountered for
		:attr:`self.real_path <RecursionError.real_path>`.
		r   r   r   s    r!   r[   zRecursionError.first_path  r   r#   c                V    d| j                   d| j                  d| j                  dS )r   z
Real path z was encountered at z
 and then r   rY   r   s    r!   r   zRecursionError.message  s:     !!5doo5H I"!%r#   c                     | j                   d   S )zV
		*real_path* (:class:`str`) is the real path that recursion was
		encountered on.
		r   r   r   s    r!   rZ   zRecursionError.real_path  r   r#   c                     | j                   d   S )zz
		*second_path* (:class:`str`) is the second path encountered for
		:attr:`self.real_path <RecursionError.real_path>`.
		r   r   r   s    r!   r\   zRecursionError.second_path  r   r#   )rZ   r   r[   r   r\   r   r   r   r   )r   r   r   r   r   r   r[   r   rZ   r\   r   r   s   @r!   ra   ra     s    77 7 	7
 7$        r#   ra   )frozenc                  8    e Zd ZU dZdZded<   	 ded<   	 ded<   y	)
CheckResultze
	The :class:`CheckResult` class contains information about the file and which
	pattern matched it.
	)r*   r'   r,   r   r*   Optional[bool]r'   zOptional[int]r,   N)r   r   r   r   	__slots____annotations__ r#   r!   r   r     s4      
 	r#   r   c                      e Zd ZdZdZddZy)r6   z>
	The :class:`.MatchDetail` class contains information about
	r)   c                    || _         y)z
		Initialize the :class:`.MatchDetail` instance.

		*patterns* (:class:`~collections.abc.Sequence` of :class:`.Pattern`)
		contains the patterns that matched the file in the order they were encountered.
		Nr   )r   r)   s     r!   r   zMatchDetail.__init__  s     $-r#   N)r)   zSequence[Pattern]r   r   )r   r   r   r   r   r   r   r#   r!   r6   r6     s    
 r#   r6   c                  V    e Zd ZdZdZ	 	 	 	 	 	 	 	 	 	 d	dZd
ddZd
ddZddZd
ddZ	y)rg   zP
	The :class:`TreeEntry` class contains information about a file-system entry.
	_lstatrc   r   _statc                B    || _         	 || _        	 || _        	 || _        y)aM  
		Initialize the :class:`TreeEntry` instance.

		*name* (:class:`str`) is the base name of the entry.

		*path* (:class:`str`) is the relative path of the entry.

		*lstat* (:class:`os.stat_result`) is the stat result of the direct entry.

		*stat* (:class:`os.stat_result`) is the stat result of the entry,
		potentially linked.
		Nr   )r   rc   r   lstatrd   s        r!   r   zTreeEntry.__init__  s:    ( !&$+ $) $)  $$*r#   Nc                |    |d}|r| j                   n| j                  }t        j                  |j                        S )a<  
		Get whether the entry is a directory.

		*follow_links* (:class:`bool` or :data:`None`) is whether to follow symbolic
		links. If this is :data:`True`, a symlink to a directory will result in
		:data:`True`. Default is :data:`None` for :data:`True`.

		Returns whether the entry is a directory (:class:`bool`).
		T)r   r   rd   S_ISDIRst_moder   rI   rs   s      r!   r   zTreeEntry.is_dir-  5     <(djjdkk)	i''	((r#   c                |    |d}|r| j                   n| j                  }t        j                  |j                        S )aE  
		Get whether the entry is a regular file.

		*follow_links* (:class:`bool` or :data:`None`) is whether to follow symbolic
		links. If this is :data:`True`, a symlink to a regular file will result in
		:data:`True`. Default is :data:`None` for :data:`True`.

		Returns whether the entry is a regular file (:class:`bool`).
		T)r   r   rd   S_ISREGr   r   s      r!   rh   zTreeEntry.is_file=  r   r#   c                T    t        j                  | j                  j                        S )zC
		Returns whether the entry is a symbolic link (:class:`bool`).
		)rd   S_ISLNKr   r   r   s    r!   rf   zTreeEntry.is_symlinkM  s     
dkk))	**r#   c                >    |d}|r| j                   S | j                  S )a9  
		Get the cached stat result for the entry.

		*follow_links* (:class:`bool` or :data:`None`) is whether to follow symbolic
		links. If this is :data:`True`, the stat result of the linked file will be
		returned. Default is :data:`None` for :data:`True`.

		Returns that stat result (:class:`os.stat_result`).
		T)r   r   )r   rI   s     r!   rd   zTreeEntry.statS  s$     <#44r#   )
rc   r   r   r   r   os.stat_resultrd   r   r   r   N)rI   r   r   bool)r   r   )rI   r   r   r   )
r   r   r   r   r   r   r   rh   rf   rd   r   r#   r!   rg   rg     sX    
 1&& 	& 
	&
 	& &P) ) +5r#   rg   )r   zpathlib.Pathr   r   r   )r)   zIterable[tuple[int, Pattern]]r*   r   r+   r   r   z$tuple[Optional[bool], Optional[int]])r)   Iterable[Pattern]r7   Iterable[str]r8   r   r   zdict[str, MatchDetail])r)   r   r   zlist[tuple[int, Pattern]])rE   r	   r   r   r%   )rL   StrPathrH   #Optional[Callable[[OSError], None]]rI   r   r   Iterator['TreeEntry'])ri   r   rj   r   rk   dict[str, str]rH   r   rI   r   r   r   )rL   r   rH   r   rI   r   r   Iterator[str])ri   r   rj   r   rk   r   rH   r   rI   r   r   r   )rc   r   r   zCallable[[AnyStr], Pattern])r)   r   r*   r   r   r   )r)   r   r7   r   r   zset[str])r*   r   r   Optional[Collection[str]]r   r   )r7   zIterable[StrPath]r   r   r   zdict[str, list[StrPath]])rc   r   r   z<Union[Callable[[Union[str, bytes]], Pattern], type[Pattern]]r   r   r   r   )>r   
__future__r   r   os.pathpathlibr   rd   collections.abcr   r   r   r   dataclassesr   typingr	   r
   r   r   r   r   r   r-   r   _typingr   r   r   PathLiker   r   r   r   r   altsepr   r   r   r"   r0   r=   rB   rF   rM   rV   rT   rJ   ru   rx   r(   r   r   r   r   	Exceptionr   ra   r   objectr6   rg   )__seps   0r!   <module>r      s   # 	     
  
 R[[%%
&:W-
 m7dC
 :W- vvryy!
	ey}}$ c5 
 KM G L(  $) () 
)  )  *	) ^  $,,, , 	,^(L JLL 26 $[[.[ [ 	[BLL
L L /	L
 L Lb 26 $YY.Y Y 	YD;;
; ; /	;
 ; ;|	#(  	> *.''&' 	'T  *.& 	H !.
.N. . 
	.>,Y ,^7Y 7t $'(#  >& 0c5 c5Ss    !G