o
    E6dR                     @  s  U d Z ddlm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ZddlmZ ddl	m Z  ddl	m!Z! e	j"se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) n$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) ed!e
d"Z,ed#e
d"Z-ed$e
d"Z.ed%d&d'Z/e0 Z1d(e2d)< e0dgZ3d(e2d*< dpd/d0Z4dqd4d5Z5e$ Z6d6e2d7< G d8d9 d9e'e-e.f Z7ed:e
d"Z8ed;e
d"Z9G d<d= d=ee, Z:G d>d? d?e:e, Z;G d@dA dAe&e:e, Z<drdBdCZ=e>Z?e=Z@G dDdE dEee, ZAG dFdG dGe%ZBG dHdI dIee-e.f ZCG dJdK dKee-e.f ZDeEZFe>ZGe(ZHG dLdM dMee, ZIdsdPdQZJdrdtdUdVZKdWdX ZLdYdZ ZMdud\d]ZNdrd^d_ZOdvdbdcZPG ddde dee	jQe-e.f ZRG dfdg dge!e/ ZSG dhdi die!ZTG djdk dkee, ZUG dldm dmeUe, ZVdndo ZWdS )wzCollection classes and helpers.    )annotationsN)Any)Callable)cast)Dict)	FrozenSet)Generic)Iterable)Iterator)List)Mapping)NoReturn)Optional)overload)Sequence)Set)Tuple)TypeVar)Union)
ValuesView   )HAS_CYEXTENSION)Literal)Protocol)immutabledict)IdentitySet)ReadOnlyContainer)ImmutableDictBase)
OrderedSet)unique_list_T)bound_KT_VT_T_coT)	covariantzFrozenSet[Any]	EMPTY_SETNONE_SETa	List[Any]breturnc                 C  sl   t | |}g }t| t|}}	 |D ]}||v r'|| ||}} n|| q|| 	 |S q)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*   overlapresultcurrentotherelement r7   sC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\sqlalchemy/util/_collections.pymerge_lists_w_orderingK   s   #


r9   dMapping[_KT, _VT]immutabledict[_KT, _VT]c                 C  s   | st S t| tr| S t| S N)
EMPTY_DICT
isinstancer   r:   r7   r7   r8   coerce_to_immutabledict   s
   
rA   zimmutabledict[Any, Any]r>   c                   @  sB   e Zd ZdZdddZdd	d
ZdddZdddZdddZdS )
FacadeDictz*A dictionary that is not publicly mutable.argsr   r+   FacadeDict[Any, Any]c                 G  s   t | }|S r=   )r   __new__)clsrC   newr7   r7   r8   rE      s   
zFacadeDict.__new__r   c                 C  s   t d)Nz\an immutabledict shouldn't need to be copied.  use dict(d) if you need a mutable dictionary.)NotImplementedErrorselfr7   r7   r8   copy   s   zFacadeDict.copyc                 C  s   t t| ffS r=   )rB   dictrI   r7   r7   r8   
__reduce__      zFacadeDict.__reduce__keyr"   valuer#   Nonec                 C  s   t | || dS )z,insert an item into the dictionary directly.N)rL   __setitem__rJ   rO   rP   r7   r7   r8   _insert_item      zFacadeDict._insert_itemstrc                 C  s   dt |  S )NzFacadeDict(%s))rL   __repr__rI   r7   r7   r8   rW      rN   zFacadeDict.__repr__N)rC   r   r+   rD   )r+   r   r+   r   rO   r"   rP   r#   r+   rQ   )r+   rV   )	__name__
__module____qualname____doc__rE   rK   rM   rT   rW   r7   r7   r7   r8   rB      s    



rB   _DT_Fc                      s  e Zd ZU dZdZded< dKddZdLd
dZdMddZdN fddZ	dOddZ
dPddZdQddZdRd d!ZdPd"d#ZdSd%d&ZdTd(d)ZdQd*d+ZdUd-d.ZdVd0d1ZdWd3d4ZedXd6d7ZedYd:d7Z	;dZd[d>d7ZdNd?d@Zd\dBdCZd]dEdFZdUdGdHZd^dIdJZ  ZS )_
Propertiesz8Provide a __getattr__/__setattr__ interface over a dict._dataDict[str, _T]rb   datac                 C  s   t | d| d S Nrb   object__setattr__)rJ   rd   r7   r7   r8   __init__      zProperties.__init__r+   intc                 C  
   t | jS r=   lenrb   rI   r7   r7   r8   __len__      
zProperties.__len__Iterator[_T]c                 C  s   t t| j S r=   )r.   listrb   valuesrI   r7   r7   r8   __iter__   rj   zProperties.__iter__	List[str]c                   s   t t dd | j D  S )Nc                 S  s   g | ]}t |qS r7   )rV   .0kr7   r7   r8   
<listcomp>   s    z&Properties.__dir__.<locals>.<listcomp>)dirsuperrb   keysrI   	__class__r7   r8   __dir__   s   zProperties.__dir__r5   Properties[_F]List[Union[_T, _F]]c                 C  s   t | t | S r=   )rr   )rJ   r5   r7   r7   r8   __add__      zProperties.__add__rO   rV   objr    rQ   c                 C     || j |< d S r=   ra   rJ   rO   r   r7   r7   r8   rR      rN   zProperties.__setitem__c                 C  s
   | j | S r=   ra   rJ   rO   r7   r7   r8   __getitem__   rp   zProperties.__getitem__c                 C     | j |= d S r=   ra   r   r7   r7   r8   __delitem__      zProperties.__delitem__c                 C  r   r=   ra   r   r7   r7   r8   rh      rN   zProperties.__setattr__Dict[str, Any]c                 C  s
   d| j iS re   ra   rI   r7   r7   r8   __getstate__   rp   zProperties.__getstate__statec                 C  s   t | d|d  d S re   rf   )rJ   r   r7   r7   r8   __setstate__   s   zProperties.__setstate__c                 C  s$   z| j | W S  ty   t|w r=   )rb   KeyErrorAttributeErrorr   r7   r7   r8   __getattr__   s
   zProperties.__getattr__boolc                 C  
   || j v S r=   ra   r   r7   r7   r8   __contains__   rp   zProperties.__contains__ReadOnlyProperties[_T]c                 C  rl   )z8Return an immutable proxy for this :class:`.Properties`.)ReadOnlyPropertiesrb   rI   r7   r7   r8   as_readonly   s   
zProperties.as_readonlyrP   c                 C  s   | j | d S r=   )rb   update)rJ   rP   r7   r7   r8   r      r   zProperties.updateOptional[_T]c                 C     d S r=   r7   r   r7   r7   r8   get      zProperties.getdefaultUnion[_DT, _T]c                 C  r   r=   r7   rJ   rO   r   r7   r7   r8   r      r   NOptional[Union[_DT, _T]]Optional[Union[_T, _DT]]c                 C  s   || v r| | S |S r=   r7   r   r7   r7   r8   r      s   c                 C  rl   r=   )rr   rb   rI   r7   r7   r8   r|      rp   zProperties.keysList[_T]c                 C     t | j S r=   )rr   rb   rs   rI   r7   r7   r8   rs      rN   zProperties.valuesList[Tuple[str, _T]]c                 C  r   r=   )rr   rb   itemsrI   r7   r7   r8   r      rN   zProperties.itemsc                 C  r   r=   ra   r   r7   r7   r8   has_key   rp   zProperties.has_keyc                 C  s   | j   d S r=   )rb   clearrI   r7   r7   r8   r     rN   zProperties.clear)rd   rc   r+   rk   r+   rq   )r+   ru   )r5   r   r+   r   )rO   rV   r   r    r+   rQ   )rO   rV   r+   r    )rO   rV   r+   rQ   )r+   r   )r   r   r+   rQ   )rO   rV   r+   r   )r+   r   )rP   rc   r+   rQ   )rO   rV   r+   r   )rO   rV   r   r   r+   r   r=   )rO   rV   r   r   r+   r   )r+   r   )r+   r   r+   rQ   )rZ   r[   r\   r]   	__slots____annotations__ri   ro   rt   r   r   rR   r   r   rh   r   r   r   r   r   r   r   r   r|   rs   r   r   r   __classcell__r7   r7   r}   r8   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.r7   c                 C  s   t | t  d S r=   )r`   ri   OrderedDictrI   r7   r7   r8   ri     rj   zOrderedProperties.__init__N)rZ   r[   r\   r]   r   ri   r7   r7   r7   r8   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.r7   N)rZ   r[   r\   r]   r   r7   r7   r7   r8   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 r7   r7   rv   r@   r7   r8   ry     s    z,_ordered_dictionary_sort.<locals>.<listcomp>)rO   N)sortedr   r   )r:   rO   r   r7   r@   r8   _ordered_dictionary_sort  s   r   c                   @  s8   e Zd ZddddZdd Zdd	 Zd
d Zdd ZdS )WeakSequencer7   _WeakSequence__elementsSequence[_T]c                   s0   t | fdd  | _ fdd|D | _d S )Nc                 S  s"   | }|d ur|j |  d S d S r=   )_storageremove)itemselfrefrJ   r7   r7   r8   _remove'  s   z&WeakSequence.__init__.<locals>._removec                   s   g | ]}t | qS r7   )weakrefref)rw   r6   r   r7   r8   ry   -  s    z)WeakSequence.__init__.<locals>.<listcomp>)r   r   r   r   )rJ   r   r7   r   r8   ri   $  s
   
zWeakSequence.__init__c                 C  s   | j t|| j d S r=   )r   r0   r   r   r   )rJ   r   r7   r7   r8   r0   1     zWeakSequence.appendc                 C  rl   r=   )rn   r   rI   r7   r7   r8   ro   4  rp   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=   r7   )rw   r   r7   r7   r8   	<genexpr>8  s    z(WeakSequence.__iter__.<locals>.<genexpr>c                 s  s    | ]}| V  qd S r=   r7   )rw   r   r7   r7   r8   r   9  s    )r   rI   r7   r7   r8   rt   7  s   zWeakSequence.__iter__c                 C  s.   z	| j | }W | S  ty   td| w )NzIndex %s out of range)r   r   
IndexError)rJ   indexr   r7   r7   r8   r   <  s   zWeakSequence.__getitem__N)r7   )r   r   )rZ   r[   r\   ri   r0   ro   rt   r   r7   r7   r7   r8   r   #  s    r   c                   @  s   e Zd ZddddZdS )OrderedIdentitySetNiterableOptional[Iterable[Any]]c                 C  s2   t |  t | _|r|D ]	}| | qd S d S r=   )r   ri   r   Z_membersadd)rJ   r   or7   r7   r8   ri   F  s   
zOrderedIdentitySet.__init__r=   )r   r   )rZ   r[   r\   ri   r7   r7   r7   r8   r   E  s    r   c                   @  $   e Zd ZdZdddZ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.

    creatorCallable[[_KT], _VT]c                 C  s
   || _ d S r=   r   )rJ   r   r7   r7   r8   ri   V  rp   zPopulateDict.__init__rO   r   r+   c                 C  s   |  | | |< }|S r=   r   rJ   rO   valr7   r7   r8   __missing__Y  s   zPopulateDict.__missing__N)r   r   rO   r   r+   r   rZ   r[   r\   r]   ri   r   r7   r7   r7   r8   r   N  s    
r   c                   @  r   )WeakPopulateDictzaLike PopulateDict, but assumes a self + a method and does not create
    a reference cycle.

    creator_methodtypes.MethodTypec                 C  s   |j | _|j}t|| _d S r=   )__func__r   __self__r   r   weakself)rJ   r   r   r7   r7   r8   ri   d  s   zWeakPopulateDict.__init__rO   r   r+   c                 C  s   |  |  | | |< }|S r=   )r   r   r   r7   r7   r8   r   i  s   zWeakPopulateDict.__missing__N)r   r   r   r   r7   r7   r7   r8   r   ^  s    
r   c                   @  sP   e Zd ZU dZdZded< ded< ded< 		ddddZdddZ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 (``==``).
    )rd   _data_appender_unique&Union[Iterable[_T], Set[_T], List[_T]]rd   zCallable[[_T], None]r   zDict[int, Literal[True]]r   NviaOptional[str]c                 C  s\   || _ i | _|rt||| _d S t|drtd|j| _d S t|dr,td|j| _d S d S )Nr0   r   r   zSet[_T])rd   r   getattrr   hasattrr   r0   r   )rJ   rd   r   r7   r7   r8   ri     s   

zUniqueAppender.__init__r   r    r+   rQ   c                 C  s.   t |}|| jvr| | d| j|< d S d S )NT)idr   r   )rJ   r   Zid_r7   r7   r8   r0     s
   

zUniqueAppender.appendrq   c                 C  rl   r=   )r.   rd   rI   r7   r7   r8   rt     rp   zUniqueAppender.__iter__r=   )rd   r   r   r   )r   r    r+   rQ   r   )	rZ   r[   r\   r]   r   r   ri   r0   rt   r7   r7   r7   r8   r   w  s   
 
r   argr   c                 C  s2   t | dkrt| d tjrt| d S td| S )Nr   r   r)   )rn   r?   typesGeneratorTyperr   r   )r   r7   r7   r8   coerce_generator_arg  s   
r   xr   Optional[List[Any]]c                 C  sB   | d u r|S t | tjrt | ttfr| gS t | tr| S t| S r=   )r?   collections_abcr	   rV   bytesrr   )r   r   r7   r7   r8   to_list  s   
r   c                 C  s   t | 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                 S  s   g | ]}|j r|qS r7   )__hash__)rw   ir7   r7   r8   ry     s    z$has_intersection.<locals>.<listcomp>)r   r-   )set_r   r7   r7   r8   has_intersection  s   r   c                 C  (   | d u rt  S t| t st t| S | S r=   )r,   r?   r   r   r7   r7   r8   to_set  
   
r   Set[Any]c                 C  r   r=   )
column_setr?   r   r   r7   r7   r8   to_column_set  r   r   c                 K  s*   |   } |r| | | jdi | | S )z5Copy the given dict and update with the given values.Nr7   )rK   r   )r:   _newkwr7   r7   r8   update_copy  s
   
r   Iterable[_T]rq   c                 c  s:    | 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.

    rt   N)r?   rV   r   flatten_iterator)r   elemr7   r7   r8   r     s   r   c                   @  s   e Zd ZU dZdZded< ded< ded< 			
	d2d3ddZdd Zed4ddZ	ed5ddZ		d6d7ddZ	d8ddZ
d9d d!Zd:d"d#Zd;d%d&Zd<d)d*Zd=d,d-Zed>d.d/Zd?d0d1ZdS )@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_alertrb   _counter_mutexrk   r   floatr   z.Optional[Callable[[LRUCache[_KT, _VT]], None]]r   d         ?NOptional[Callable[..., None]]c                 C  s,   || _ || _|| _d| _t | _i | _d S )Nr   )r   r   r   r   	threadingLockr   rb   )rJ   r   r   r   r7   r7   r8   ri     s   

zLRUCache.__init__c                 C  s   |  j d7  _ | j S )Nr   )r   rI   r7   r7   r8   _inc_counter  s   zLRUCache._inc_counterrO   r"   r+   Optional[_VT]c                 C  r   r=   r7   r   r7   r7   r8   r     r   zLRUCache.getr   Union[_VT, _T]c                 C  r   r=   r7   r   r7   r7   r8   r     r   Optional[Union[_VT, _T]]c                 C  s:   | j ||}||ur|d ur|  |d d< |d S |S N   r   r   )rb   r   r  )rJ   rO   r   r   r7   r7   r8   r     s
   r#   c                 C  s"   | j | }|  |d d< |d S r
  )rb   r  )rJ   rO   r   r7   r7   r8   r     s   
zLRUCache.__getitem__Iterator[_KT]c                 C  rl   r=   )r.   rb   rI   r7   r7   r8   rt   #  rp   zLRUCache.__iter__c                 C  rl   r=   rm   rI   r7   r7   r8   ro   &  rp   zLRUCache.__len__ValuesView[_VT]c                 C  s   t dd | j D S )Nc                 S  s   i | ]	\}}||d  qS )r   r7   )rw   rx   r   r7   r7   r8   
<dictcomp>*  s    z#LRUCache.values.<locals>.<dictcomp>)typingr   rb   r   rI   r7   r7   r8   rs   )  r   zLRUCache.valuesrP   rQ   c                 C  s"   |||   gf| j|< |   d S r=   )r  rb   _manage_sizerS   r7   r7   r8   rR   ,  s   zLRUCache.__setitem___LRUCache__vc                 C  r   r=   ra   )rJ   r  r7   r7   r8   r   0  r   zLRUCache.__delitem__c                 C  s   | j | j | j  S r=   )r   r   rI   r7   r7   r8   size_threshold3  rU   zLRUCache.size_thresholdc              	   C  s   | j dsd S z`t| j}t| | j| j| j  kra|r$d}| |  t| j	 t
ddd}|| jd  D ]}z| j|d = W q8 tyK   Y q8w t| | j| j| j  ksW | j   d S W | j   d S | j   w )NFr  T)rO   reverser   )r   acquirer   r   rn   r   r   r   rb   rs   operator
itemgetterr   release)rJ   r   Z
by_counterr   r7   r7   r8   r  7  s.   

zLRUCache._manage_size)r  r  N)r   rk   r   r   r   r  )rO   r"   r+   r  )rO   r"   r   r  r+   r  r=   )rO   r"   r   r	  r+   r	  )rO   r"   r+   r#   )r+   r  r   )r+   r  rY   )r  r"   r+   rQ   )r+   r   r   )rZ   r[   r\   r]   r   r   ri   r  r   r   r   rt   ro   rs   rR   r   propertyr  r  r7   r7   r7   r8   r     s4   
 		






r   c                   @     e Zd ZdddZdS )_CreateFuncTyper+   r$   c                 C  r   r=   r7   rI   r7   r7   r8   __call__P     z_CreateFuncType.__call__N)r+   r$   rZ   r[   r\   r  r7   r7   r7   r8   r  O      r  c                   @  r  )_ScopeFuncTyper+   r   c                 C  r   r=   r7   rI   r7   r7   r8   r  U  r  z_ScopeFuncType.__call__NrX   r  r7   r7   r7   r8   r  T  r  r  c                   @  s`   e Zd ZU dZdZded< ded< ded< dddZdddZdddZdddZ	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]Callable[[], Any]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!  )rJ   r"  r#  r7   r7   r8   ri   n  s   
zScopedRegistry.__init__r+   r    c                 C  s:   |   }z| j| W S  ty   | j||   Y S w r=   )r#  r$  r   
setdefaultr"  r   r7   r7   r8   r    s   zScopedRegistry.__call__r   c                 C  s   |   | jv S )z9Return True if an object is present in the current scope.)r#  r$  rI   r7   r7   r8   has  s   zScopedRegistry.hasr   rQ   c                 C  s   || j |  < dS )z$Set the value for the current scope.N)r$  r#  rJ   r   r7   r7   r8   r,     s   zScopedRegistry.setc                 C  s(   z	| j |  = W dS  ty   Y dS w )z Clear the current scope, if any.N)r$  r#  r   rI   r7   r7   r8   r     s
   zScopedRegistry.clearN)r"  r%  r#  r&  r+   r    r+   r   r   r    r+   rQ   r   )rZ   r[   r\   r]   r   r   ri   r  r(  r,   r   r7   r7   r7   r8   r   Y  s   
 



r   c                   @  sB   e Zd ZdZdddZddd	ZdddZdddZ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$  )rJ   r"  r7   r7   r8   ri     s   zThreadLocalRegistry.__init__r+   r    c                 C  s2   z| j jW S  ty   |   }| j _| Y S w r=   )r$  rP   r   r"  )rJ   r   r7   r7   r8   r    s   
zThreadLocalRegistry.__call__r   c                 C  s   t | jdS )NrP   )r   r$  rI   r7   r7   r8   r(    r   zThreadLocalRegistry.hasr   rQ   c                 C  s   || j _d S r=   )r$  rP   r)  r7   r7   r8   r,     r   zThreadLocalRegistry.setc                 C  s"   z| j `W d S  ty   Y d S w r=   )r$  rP   r   rI   r7   r7   r8   r     s
   zThreadLocalRegistry.clearN)r"  r%  r*  r+  r,  r   )	rZ   r[   r\   r]   ri   r  r(  r,   r   r7   r7   r7   r8   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   TFr7   )sequencetargetcr   r7   r7   r8   	has_dupes  s   
r2  )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   r   r+   rq   )Xr]   
__future__r   collections.abcabcr   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   TYPE_CHECKINGZ_py_collectionsr   r   r   r   r   r   Z$sqlalchemy.cyextension.immutabledictZ"sqlalchemy.cyextension.collectionsr    r"   r#   r$   	frozensetr&   r   r'   r9   rA   r>   rB   r^   r_   r`   r   r   r   rL   r   Zsort_dictionaryr   r   r   r   r,   r   Zcolumn_dictZordered_column_setr   r   r   r   r   r   r   r   MutableMappingr   r  r  r   r-  r2  r7   r7   r7   r8   <module>   s   


8	Y

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

k@