a
    ~gnN                     @  sH  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mZ ddlmZ ddlm	Z	 ddlm
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl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  ej!shesddl"m#Z# ddl"m$Z$ ddl"m%Z% dd l"m&Z& dd!l"m'Z' dd"l"m(Z( nHddl)m%Z% dd l)m&Z& ddl)m#Z# ddl*m$Z$ dd!l*m'Z' dd"l*m(Z( ed#ed$Z+ed%ed$Z,ed&ed$Z-ed'd(d)Z.e/ Z0d*e1d+< e/dgZ2d*e1d,< d-d-d-d.d/d0Z3d1d2d3d4d5Z4e# Z5d6e1d7< G d8d9 d9e&e,e-f Z6ed:ed$Z7ed;ed$Z8G d<d= d=ee+ Z9G d>d? d?e9e+ Z:G d@dA dAe%e9e+ Z;dtdBdCZ<e=Z>e<Z?G dDdE dEee+ Z@G dFdG dGe$ZAG dHdI dIee,e-f ZBG dJdK dKee,e-f ZCeDZEe=ZFe'ZGG dLdM dMee+ ZHdNd-dOdPdQZIdudNdRd-dSdTdUZJdVdWdXdYdZd[ZKd\d] ZLdNd^d_d`daZMdvdbdcZNddded_dfdgZOG dhdi diejPe,e-f ZQG djdk dke e. ZRG dldm dme ZSG dndo doee+ ZTG dpdq dqeTe+ ZUdrds ZVdS )wzCollection classes and helpers.    )annotationsN)Any)Callable)cast)	Container)Dict)	FrozenSet)Generic)Iterable)Iterator)List)Mapping)NoReturn)Optional)overload)Sequence)Set)Tuple)TypeVar)Union)
ValuesView   )HAS_CYEXTENSION)is_non_string_iterable)Literal)Protocol)immutabledict)IdentitySet)ReadOnlyContainer)ImmutableDictBase)
OrderedSet)unique_list_T)bound_KT_VT_T_coT)	covariantzFrozenSet[Any]	EMPTY_SETNONE_SET	List[Any])abreturnc                 C  sj   t | |}g }t| t| }}|D ].}||v rL|| || }} q$|| q(|| qfq$|S )af  merge two lists, maintaining ordering as much as possible.

    this is to reconcile vars(cls) with cls.__annotations__.

    Example::

        >>> a = ["__tablename__", "id", "x", "created_at"]
        >>> b = ["id", "name", "data", "y", "created_at"]
        >>> merge_lists_w_ordering(a, b)
        ['__tablename__', 'id', 'name', 'data', 'y', 'x', 'created_at']

    This is not necessarily the ordering that things had on the class,
    in this case the class is::

        class User(Base):
            __tablename__ = "users"

            id: Mapped[int] = mapped_column(primary_key=True)
            name: Mapped[str]
            data: Mapped[Optional[str]]
            x = Column(Integer)
            y: Mapped[int]
            created_at: Mapped[datetime.datetime] = mapped_column()

    But things are *mostly* ordered.

    The algorithm could also be done by creating a partial ordering for
    all items in both lists and then using topological_sort(), but that
    is too much overhead.

    Background on how I came up with this is at:
    https://gist.github.com/zzzeek/89de958cf0803d148e74861bd682ebae

    )setintersectioniterdiscardappendextend)r+   r,   Zoverlapresultcurrentotherelement r8   a/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/util/_collections.pymerge_lists_w_orderingL   s    #


r:   zMapping[_KT, _VT]zimmutabledict[_KT, _VT])dr-   c                 C  s"   | st S t| tr| S t| S d S N)
EMPTY_DICT
isinstancer   r;   r8   r8   r9   coerce_to_immutabledict   s
    
r@   zimmutabledict[Any, Any]r=   c                   @  s\   e Zd ZdZdddddZddd	d
ZddddZddddddZddddZdS )
FacadeDictz*A dictionary that is not publicly mutable.r   zFacadeDict[Any, Any])argsr-   c                 G  s   t | }|S r<   )r   __new__)clsrB   newr8   r8   r9   rC      s    
zFacadeDict.__new__r   r-   c                 C  s   t dd S )Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)NotImplementedErrorselfr8   r8   r9   copy   s    zFacadeDict.copyc                 C  s   t t| ffS r<   )rA   dictrH   r8   r8   r9   
__reduce__   s    zFacadeDict.__reduce__r$   r%   Nonekeyvaluer-   c                 C  s   t | || dS )z,insert an item into the dictionary directly.N)rK   __setitem__rI   rO   rP   r8   r8   r9   _insert_item   s    zFacadeDict._insert_itemstrc                 C  s   dt |  S )NzFacadeDict(%s))rK   __repr__rH   r8   r8   r9   rU      s    zFacadeDict.__repr__N)	__name__
__module____qualname____doc__rC   rJ   rL   rS   rU   r8   r8   r8   r9   rA      s   rA   _DT_Fc                      s  e Zd ZU dZdZded< ddddZdd	d
dZdd	ddZdd	 fddZ	dddddZ
ddddddZdddddZdddd d!Zddddd"d#Zd$d	d%d&Zd$dd'd(d)Zdddd*d+Zdd,dd-d.Zd/d	d0d1Zddd2d3d4Zedd5dd6d7Zedd8d8d9d:d7ZdKdd<d=d9d>d7Zdd	d?d@ZdAd	dBdCZdDd	dEdFZdd,ddGdHZdd	dIdJZ  ZS )L
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict._datazDict[str, _T]r^   )datac                 C  s   t | d| d S Nr^   object__setattr__)rI   r_   r8   r8   r9   __init__   s    zProperties.__init__intrF   c                 C  s
   t | jS r<   lenr^   rH   r8   r8   r9   __len__   s    zProperties.__len__Iterator[_T]c                 C  s   t t| j S r<   )r0   listr^   valuesrH   r8   r8   r9   __iter__   s    zProperties.__iter__z	List[str]c                   s   t t dd | j D  S )Nc                 S  s   g | ]}t |qS r8   )rT   .0kr8   r8   r9   
<listcomp>       z&Properties.__dir__.<locals>.<listcomp>)dirsuperr^   keysrH   	__class__r8   r9   __dir__   s    zProperties.__dir__zProperties[_F]zList[Union[_T, _F]])r6   r-   c                 C  s   t | t | S r<   )rj   )rI   r6   r8   r8   r9   __add__   s    zProperties.__add__rT   r"   rM   )rO   objr-   c                 C  s   || j |< d S r<   r]   rI   rO   ry   r8   r8   r9   rQ      s    zProperties.__setitem__rO   r-   c                 C  s
   | j | S r<   r]   rI   rO   r8   r8   r9   __getitem__   s    zProperties.__getitem__c                 C  s   | j |= d S r<   r]   r|   r8   r8   r9   __delitem__   s    zProperties.__delitem__c                 C  s   || j |< d S r<   r]   rz   r8   r8   r9   rc      s    zProperties.__setattr__zDict[str, Any]c                 C  s
   d| j iS r`   r]   rH   r8   r8   r9   __getstate__   s    zProperties.__getstate__)stater-   c                 C  s   t | d|d  d S r`   ra   )rI   r   r8   r8   r9   __setstate__   s    zProperties.__setstate__c                 C  s,   z| j | W S  ty&   t|Y n0 d S r<   )r^   KeyErrorAttributeErrorr|   r8   r8   r9   __getattr__   s    zProperties.__getattr__boolc                 C  s
   || j v S r<   r]   r|   r8   r8   r9   __contains__   s    zProperties.__contains__zReadOnlyProperties[_T]c                 C  s
   t | jS )z8Return an immutable proxy for this :class:`.Properties`.)ReadOnlyPropertiesr^   rH   r8   r8   r9   as_readonly   s    zProperties.as_readonly)rP   r-   c                 C  s   | j | d S r<   )r^   update)rI   rP   r8   r8   r9   r      s    zProperties.updatezOptional[_T]c                 C  s   d S r<   r8   r|   r8   r8   r9   get   s    zProperties.getzUnion[_DT, _T]rO   defaultr-   c                 C  s   d S r<   r8   rI   rO   r   r8   r8   r9   r      s    NzOptional[Union[_DT, _T]]zOptional[Union[_T, _DT]]c                 C  s   || v r| | S |S d S r<   r8   r   r8   r8   r9   r      s    c                 C  s
   t | jS r<   )rj   r^   rH   r8   r8   r9   rt      s    zProperties.keysList[_T]c                 C  s   t | j S r<   )rj   r^   rk   rH   r8   r8   r9   rk      s    zProperties.valueszList[Tuple[str, _T]]c                 C  s   t | j S r<   )rj   r^   itemsrH   r8   r8   r9   r      s    zProperties.itemsc                 C  s
   || j v S r<   r]   r|   r8   r8   r9   has_key   s    zProperties.has_keyc                 C  s   | j   d S r<   )r^   clearrH   r8   r8   r9   r      s    zProperties.clear)N)rV   rW   rX   rY   	__slots____annotations__rd   rh   rl   rw   rx   rQ   r}   r~   rc   r   r   r   r   r   r   r   r   rt   rk   r   r   r   __classcell__r8   r8   ru   r9   r\      s:   
 r\   c                   @  s   e Zd ZdZdZdd ZdS )OrderedPropertieszUProvide a __getattr__/__setattr__ interface with an OrderedDict
    as backing store.r8   c                 C  s   t | t  d S r<   )r\   rd   OrderedDictrH   r8   r8   r9   rd   
  s    zOrderedProperties.__init__N)rV   rW   rX   rY   r   rd   r8   r8   r8   r9   r     s   r   c                   @  s   e Zd ZdZdZdS )r   zDProvide immutable dict/object attribute to an underlying dictionary.r8   N)rV   rW   rX   rY   r   r8   r8   r8   r9   r     s   r   c                   s0    fddt  |dD }    | dS )zSort an OrderedDict in-place.c                   s   g | ]}| | fqS r8   r8   rm   r?   r8   r9   rp     rq   z,_ordered_dictionary_sort.<locals>.<listcomp>)rO   N)sortedr   r   )r;   rO   r   r8   r?   r9   _ordered_dictionary_sort  s    r   c                   @  s<   e Zd ZdddddZdd Zdd	 Zd
d Zdd ZdS )WeakSequencer8   zSequence[_T])_WeakSequence__elementsc                   s0   t | fdd  | _ fdd|D | _d S )Nc                 S  s   | }|d ur|j |  d S r<   )_storageremove)itemselfrefrI   r8   r8   r9   _remove&  s    z&WeakSequence.__init__.<locals>._removec                   s   g | ]}t | qS r8   )weakrefref)rn   r7   r   r8   r9   rp   ,  s   z)WeakSequence.__init__.<locals>.<listcomp>)r   r   r   r   )rI   r   r8   r   r9   rd   #  s
    
zWeakSequence.__init__c                 C  s   | j t|| j d S r<   )r   r2   r   r   r   )rI   r   r8   r8   r9   r2   0  s    zWeakSequence.appendc                 C  s
   t | jS r<   )rg   r   rH   r8   r8   r9   rh   3  s    zWeakSequence.__len__c                 C  s   dd dd | j D D S )Nc                 s  s   | ]}|d ur|V  qd S r<   r8   )rn   ry   r8   r8   r9   	<genexpr>7  s   z(WeakSequence.__iter__.<locals>.<genexpr>c                 s  s   | ]}| V  qd S r<   r8   )rn   r   r8   r8   r9   r   8  rq   )r   rH   r8   r8   r9   rl   6  s    zWeakSequence.__iter__c                 C  s8   z| j | }W n ty,   td| Y n0 | S d S )NzIndex %s out of range)r   r   
IndexError)rI   indexry   r8   r8   r9   r}   ;  s
    zWeakSequence.__getitem__N)r8   )rV   rW   rX   rd   r2   rh   rl   r}   r8   r8   r8   r9   r   "  s
   r   c                   @  s   e Zd ZdddddZdS )OrderedIdentitySetNzOptional[Iterable[Any]])iterablec                 C  s.   t |  t | _|r*|D ]}| | qd S r<   )r   rd   r   Z_membersadd)rI   r   or8   r8   r9   rd   E  s
    
zOrderedIdentitySet.__init__)N)rV   rW   rX   rd   r8   r8   r8   r9   r   D  s   r   c                   @  s.   e Zd ZdZddddZddddd	Zd
S )PopulateDictzA dict which populates missing values via a creation function.

    Note the creation function takes a key, unlike
    collections.defaultdict.

    zCallable[[_KT], _VT]creatorc                 C  s
   || _ d S r<   r   )rI   r   r8   r8   r9   rd   U  s    zPopulateDict.__init__r   r{   c                 C  s   |  | | |< }|S r<   r   rI   rO   valr8   r8   r9   __missing__X  s    zPopulateDict.__missing__NrV   rW   rX   rY   rd   r   r8   r8   r8   r9   r   M  s   r   c                   @  s.   e Zd ZdZddddZddddd	Zd
S )WeakPopulateDictzaLike PopulateDict, but assumes a self + a method and does not create
    a reference cycle.

    ztypes.MethodType)creator_methodc                 C  s   |j | _|j}t|| _d S r<   )__func__r   __self__r   r   weakself)rI   r   r   r8   r8   r9   rd   c  s    zWeakPopulateDict.__init__r   r{   c                 C  s   |  |  | | |< }|S r<   )r   r   r   r8   r8   r9   r   h  s    zWeakPopulateDict.__missing__Nr   r8   r8   r8   r9   r   ]  s   r   c                   @  s^   e Zd ZU dZdZded< ded< ded< ddd
dddZdddddZddddZd	S )UniqueAppenderzAppends items to a collection ensuring uniqueness.

    Additional appends() of the same object are ignored.  Membership is
    determined by identity (``is a``) not equality (``==``).
    )r_   _data_appender_uniquez&Union[Iterable[_T], Set[_T], List[_T]]r_   zCallable[[_T], None]r   zDict[int, Literal[True]]r   NzOptional[str])r_   viac                 C  sT   || _ i | _|rt||| _n2t|dr8td|j| _nt|drPtd|j| _d S )Nr2   r   r   zSet[_T])r_   r   getattrr   hasattrr   r2   r   )rI   r_   r   r8   r8   r9   rd     s    

zUniqueAppender.__init__r"   rM   )r   r-   c                 C  s*   t |}|| jvr&| | d| j|< d S )NT)idr   r   )rI   r   Zid_r8   r8   r9   r2     s    

zUniqueAppender.appendri   rF   c                 C  s
   t | jS r<   )r0   r_   rH   r8   r8   r9   rl     s    zUniqueAppender.__iter__)N)	rV   rW   rX   rY   r   r   rd   r2   rl   r8   r8   r8   r9   r   v  s   
 r   r   )argr-   c                 C  s6   t | dkr(t| d tjr(t| d S td| S d S )Nr   r   r*   )rg   r>   typesGeneratorTyperj   r   )r   r8   r8   r9   coerce_generator_arg  s    r   zOptional[List[Any]])xr   r-   c                 C  s4   | d u r|S t | s| gS t| tr(| S t| S d S r<   )r   r>   rj   )r   r   r8   r8   r9   to_list  s    
r   zContainer[Any]zIterable[Any]r   )set_r   r-   c                   s   t  fdd|D S )zreturn True if any items of set\_ are present in iterable.

    Goes through special effort to ensure __hash__ is not called
    on items in iterable that don't support it.

    c                 3  s   | ]}|j r| v V  qd S r<   )__hash__)rn   ir   r8   r9   r     rq   z#has_intersection.<locals>.<genexpr>)any)r   r   r8   r   r9   has_intersection  s    r   c                 C  s,   | d u rt  S t| t s$t t| S | S d S r<   )r.   r>   r   r   r8   r8   r9   to_set  s
    
r   zSet[Any])r   r-   c                 C  s,   | d u rt  S t| t s$t t| S | S d S r<   )
column_setr>   r   r   r8   r8   r9   to_column_set  s
    
r   c                 K  s*   |   } |r| | | jf i | | S )z5Copy the given dict and update with the given values.)rJ   r   )r;   _newkwr8   r8   r9   update_copy  s
    
r   zIterable[_T]ri   c                 c  s8   | D ].}t |ts,t|dr,t|E dH  q|V  qdS )zGiven an iterator of which further sub-elements may also be
    iterators, flatten the sub-elements into a single iterator.

    rl   N)r>   rT   r   flatten_iterator)r   elemr8   r8   r9   r     s    r   c                   @  s  e Zd ZU dZdZded< ded< ded< d3ddddddZdd ZedddddZ	eddddddZ	d4ddddddZ	dddddZ
dd d!d"Zdd d#d$Zd%d d&d'Zddd(d)d*d+Zdd(d,d-d.Zedd d/d0Zd(d d1d2ZdS )5LRUCachezDictionary with 'squishy' removal of least
    recently used items.

    Note that either get() or [] should be used here, but
    generally its not safe to do an "in" check first as the dictionary
    can change subsequent to that call.

    )capacity	threshold
size_alertr^   _counter_mutexre   r   floatr   z.Optional[Callable[[LRUCache[_KT, _VT]], None]]r   d         ?NzOptional[Callable[..., None]])r   r   r   c                 C  s,   || _ || _|| _d| _t | _i | _d S )Nr   )r   r   r   r   	threadingLockr   r^   )rI   r   r   r   r8   r8   r9   rd     s    
zLRUCache.__init__c                 C  s   |  j d7  _ | j S )Nr   )r   rH   r8   r8   r9   _inc_counter  s    zLRUCache._inc_counterr$   zOptional[_VT]r{   c                 C  s   d S r<   r8   r|   r8   r8   r9   r     s    zLRUCache.getzUnion[_VT, _T]r   c                 C  s   d S r<   r8   r   r8   r8   r9   r     s    zOptional[Union[_VT, _T]]c                 C  s4   | j |}|d ur,|  |d d< |d S |S d S N   r   r   )r^   r   r   )rI   rO   r   r   r8   r8   r9   r     s
    r%   c                 C  s"   | j | }|  |d d< |d S r   )r^   r   )rI   rO   r   r8   r8   r9   r}     s    
zLRUCache.__getitem__zIterator[_KT]rF   c                 C  s
   t | jS r<   )r0   r^   rH   r8   r8   r9   rl     s    zLRUCache.__iter__c                 C  s
   t | jS r<   rf   rH   r8   r8   r9   rh      s    zLRUCache.__len__zValuesView[_VT]c                 C  s   t dd | j D S )Nc                 S  s   i | ]\}}||d  qS )r   r8   )rn   ro   r   r8   r8   r9   
<dictcomp>$  rq   z#LRUCache.values.<locals>.<dictcomp>)typingr   r^   r   rH   r8   r8   r9   rk   #  s    zLRUCache.valuesrM   rN   c                 C  s"   |||   gf| j|< |   d S r<   )r   r^   _manage_sizerR   r8   r8   r9   rQ   &  s    zLRUCache.__setitem__)_LRUCache__vr-   c                 C  s   | j |= d S r<   r]   )rI   r   r8   r8   r9   r~   *  s    zLRUCache.__delitem__c                 C  s   | j | j | j  S r<   )r   r   rH   r8   r8   r9   size_threshold-  s    zLRUCache.size_thresholdc              	   C  s   | j dsd S zt| j}t| | j| j| j  kr|rHd}| |  t| j	 t
ddd}|| jd  D ],}z| j|d = W qp ty   Y qpY qp0 qpqW | j   n| j   0 d S )NFr   T)rO   reverser   )r   acquirer   r   rg   r   r   r   r^   rk   operator
itemgetterr   release)rI   r   Z
by_counterr   r8   r8   r9   r   1  s&    

zLRUCache._manage_size)r   r   N)N)rV   rW   rX   rY   r   r   rd   r   r   r   r}   rl   rh   rk   rQ   r~   propertyr   r   r8   r8   r8   r9   r     s2   
		    
r   c                   @  s   e Zd ZddddZdS )_CreateFuncTyper&   rF   c                 C  s   d S r<   r8   rH   r8   r8   r9   __call__J  rq   z_CreateFuncType.__call__NrV   rW   rX   r   r8   r8   r8   r9   r   I  s   r   c                   @  s   e Zd ZddddZdS )_ScopeFuncTyper   rF   c                 C  s   d S r<   r8   rH   r8   r8   r9   r   N  rq   z_ScopeFuncType.__call__Nr   r8   r8   r8   r9   r   M  s   r   c                   @  sx   e Zd ZU dZdZded< ded< ded< d	d
dddZddddZddddZdddddZ	ddddZ
dS )ScopedRegistrya  A Registry that can store one or multiple instances of a single
    class on the basis of a "scope" function.

    The object implements ``__call__`` as the "getter", so by
    calling ``myregistry()`` the contained object is returned
    for the current scope.

    :param createfunc:
      a callable that returns a new object to be placed in the registry

    :param scopefunc:
      a callable that will return a key to store/retrieve an object.
    
createfunc	scopefuncregistryz_CreateFuncType[_T]r   r   r   r   r   Callable[[], _T]zCallable[[], Any])r   r   c                 C  s   || _ || _i | _dS )aV  Construct a new :class:`.ScopedRegistry`.

        :param createfunc:  A creation function that will generate
          a new value for the current scope, if none is present.

        :param scopefunc:  A function that returns a hashable
          token representing the current scope (such as, current
          thread identifier).

        Nr   )rI   r   r   r8   r8   r9   rd   f  s    zScopedRegistry.__init__r"   rF   c                 C  s>   |   }z| j| W S  ty8   | j||   Y S 0 d S r<   )r   r   r   
setdefaultr   r|   r8   r8   r9   r   w  s
    zScopedRegistry.__call__r   c                 C  s   |   | jv S )z9Return True if an object is present in the current scope.)r   r   rH   r8   r8   r9   has~  s    zScopedRegistry.hasrM   ry   r-   c                 C  s   || j |  < dS )z$Set the value for the current scope.N)r   r   rI   ry   r8   r8   r9   r.     s    zScopedRegistry.setc                 C  s(   z| j |  = W n ty"   Y n0 dS )z Clear the current scope, if any.N)r   r   r   rH   r8   r8   r9   r     s    zScopedRegistry.clearN)rV   rW   rX   rY   r   r   rd   r   r   r.   r   r8   r8   r8   r9   r   Q  s   
r   c                   @  sX   e Zd ZdZddddZdddd	Zd
dddZdddddZddddZdS )ThreadLocalRegistryz\A :class:`.ScopedRegistry` that uses a ``threading.local()``
    variable for storage.

    r   )r   c                 C  s   || _ t | _d S r<   )r   r   localr   )rI   r   r8   r8   r9   rd     s    zThreadLocalRegistry.__init__r"   rF   c                 C  s6   z
| j jW S  ty0   |   }| j _| Y S 0 d S r<   )r   rP   r   r   )rI   r   r8   r8   r9   r     s
    
zThreadLocalRegistry.__call__r   c                 C  s   t | jdS )NrP   )r   r   rH   r8   r8   r9   r     s    zThreadLocalRegistry.hasrM   r   c                 C  s   || j _d S r<   )r   rP   r   r8   r8   r9   r.     s    zThreadLocalRegistry.setc                 C  s"   z
| j `W n ty   Y n0 d S r<   )r   rP   r   rH   r8   r8   r9   r     s    
zThreadLocalRegistry.clearN)	rV   rW   rX   rY   rd   r   r   r.   r   r8   r8   r8   r9   r     s   r   c                 C  s0   d}| D ]"}||u r|d7 }|dkr dS qdS )zrGiven a sequence and search object, return True if there's more
    than one, False if zero or one of them.


    r   r   TFr8   )sequencetargetcr   r8   r8   r9   	has_dupes  s    
r   )N)N)N)WrY   
__future__r   r   r   r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_has_cyr   r   r   r   TYPE_CHECKINGZ_py_collectionsr   r   r   r   r    r!   Z$sqlalchemy.cyextension.immutabledictZ"sqlalchemy.cyextension.collectionsr"   r$   r%   r&   	frozensetr(   r   r)   r:   r@   r=   rA   rZ   r[   r\   r   r   r   rK   r   sort_dictionaryr   r   r   r   r.   r   column_dictordered_column_setr   r   r   r   r   r   r   r   MutableMappingr   r   r   r   r   r   r8   r8   r8   r9   <module>	   s   8	W


"	%
		

i@