
    +h$              	          d dl mZ d dl m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  e
j                   d      ZdZdZ e
j                   d      Z e
j                   d      Z e
j                   d      Z e
j                   d      Z e
j                   d      Z e
j                   d      Zd Zd Z G d de      Z G d dee      Z G d d eddd g            Zd! Z  G d" d#e      Z! e!       Z" G d$ d%e      Z# G d& d'e	      Z$ e$       Z%d( Z& G d) d*e	      Z' e'       Z( e
jR                  d+      d,        Z* G d- d.e+      Z, G d/ d0e	e
jZ                        Z. G d1 d2e.      Z/y)3    )deque)
namedtupleN   )	operators)ExtendedInternalTraversal)InternalTraversal   )util)inspect)collections_abc)HasMemoized)py37skip_traverseFTno_cachecache_in_placecall_gen_cache_keystatic_cache_keypropagate_attrs	anon_namec                 x    |j                  dd      rt               }n
t               } |j                  | |fi |S )Nuse_proxiesF)getColIdentityComparatorStrategyTraversalComparatorStrategycompare)obj1obj2kwstrategys       L/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.pyr   r      s:    	vvmU#02.08D$-"--    c                     t        j                  |       D ]a  }t        |d      s|j                          t        j                  ||j                  d       t        j                  ||j                  d       c y )N_traverse_internals#_generated_copy_internals_traversal!_generated_get_children_traversal)r
   walk_subclasseshasattr_generate_cache_attrs_copy_internalsgenerate_dispatchr#   _get_children)target_hierarchyclss     r    _preconfigure_traversalsr.   #   sp    ##$45 3-.%%'--''5
 ++''3r!   c                   ~    e Zd ZdZeZdZdZ	 dZ	 dZ	e
d        Z ej                  d      d        Zd Ze
d	        Zy)
HasCacheKeyzMixin for objects which can produce a cache key.

    .. seealso::

        :class:`.CacheKey`

        :ref:`sql_caching`

    TN c                 &   | j                   j                  dd      }t        |      }|r3t        | dd      }|	 | j                  }t        j                  | |d      S | j                   j                  dd      }|a| j                   j                  dd      }|Ct        | _        |0| j                  r$t        j                  d| j                  z  d       t        S t        j                  | |d      S # t
        $ r t        | _        t        cY S w xY w)	zgenerate cache key dispatcher for a new class.

        This sets the _generated_cache_key_traversal attribute once called
        so should only be called once per class.

        inherit_cacheN_cache_key_traversal_generated_cache_key_traversalr#   a  Class %s will not make use of SQL compilation caching as it does not set the 'inherit_cache' attribute to ``True``.  This can have significant performance implications including some performance degradations in comparison to prior SQLAlchemy versions.  Set this attribute to True if this object can make use of the cache key generated by the superclass.  Alternatively, this attribute may be set to False which will disable this warning.cprf)code)__dict__r   boolgetattrr#   AttributeErrorNO_CACHEr5   _cache_key_traversal_visitorr*   _hierarchy_supports_cachingr
   warn__name__)r-   r3   inheritr4   s       r    r(   z!HasCacheKey._generate_cache_attrsb   s0    (($?}%#*30F#M #+$+.+B+B( 0AA)+K  $'<<#3#3&$  $+'*||'7'7)4($ (/9AC6%-;;			4 8;||	E "( $O/AA)+K S & $9AC6#O$s   C3 3DDsqlalchemy.sql.elementsc                    t        |       }| j                  }||v r||   |fS t        |j                        x||<   }|xj                  dz  c_        	 |j                  d   }|t        u r
d|t        <   y||f} || t              D ]  \  }}	}
|	|
t        u r'|	j                  }|t        u rd|t        <    y|||fz  }:|
t        u rIt        j                  j                  }t        |	|j                         r|	j#                  |      }	|||	fz  }|
t$        u r|||	j'                  ||      fz  }|	s|
t(        u r|||	fz  }|
t*        u r&|||	d   |	d   r|	d   j'                  ||      ndfz  }|
t,        j.                  u r3| j0                  r|| j2                  z  }|| j5                  |      z  }1|
t,        j6                  u s$|
t,        j8                  u s|
t,        j:                  u r0||t=        |	D cg c]  }|j'                  ||       c}      fz  }| |
||	| ||      z  } |S # t
        $ r |j                         }Y w xY wc c}w )aB  return an optional cache key.

        The cache key is a tuple which can contain any series of
        objects that are hashable and also identifies
        this object uniquely within the presence of a larger SQL expression
        or statement, for the purposes of caching the resulting query.

        The cache key should be based on the SQL compiled structure that would
        ultimately be produced.   That is, two structures that are composed in
        exactly the same way should produce the same cache key; any difference
        in the structures that would affect the SQL string or the type handlers
        should result in a different cache key.

        If a structure cannot produce a useful cache key, the NO_CACHE
        symbol should be added to the anon_map and the method should
        return None.

        r   r5   TNcompile_state_pluginplugin_subject)id	__class__strindexr8   KeyErrorr(   r<   r=   STATIC_CACHE_KEY_static_cache_key	ANON_NAMEr
   	preloadedsql_elements
isinstance_anonymous_label	apply_mapCALL_GEN_CACHE_KEY_gen_cache_keyCACHE_IN_PLACEPROPAGATE_ATTRSr   dp_annotations_key!_gen_static_annotations_cache_key_annotations_cache_key_gen_annotations_cache_keydp_clauseelement_listdp_clauseelement_tupledp_memoized_select_entitiestuple)selfanon_map
bindparamsidselfr-   id_
dispatcherresultattrnameobjmethsckelementselems                 r    rT   zHasCacheKey._gen_cache_key   s   * DnnXV$c** &)%88HVsNNaN	5&FGJ !!%HXs $..$
 E	Hc4  ++//Ch-1*#xo-FY&#~~::H!#x'@'@A!mmH5xo-F// **8Z@ F ~-8S/10$ 67  ##34   01@@ (* "&#  !2!E!EE  AA"d&A&AAF"d&E&Eh&OOF 1 G GG#4#K#KK,HHI $! 14!"(, %)$7$7*$M!"#  $$c4:# GE	L k  	5
 224J	5V!"s   H0 7I0IIc                 h    g }t               }| j                  ||      }t        |v ryt        ||      S )ap  return a cache key.

        The cache key is a tuple which can contain any series of
        objects that are hashable and also identifies
        this object uniquely within the presence of a larger SQL expression
        or statement, for the purposes of caching the resulting query.

        The cache key should be based on the SQL compiled structure that would
        ultimately be produced.   That is, two structures that are composed in
        exactly the same way should produce the same cache key; any difference
        in the structures that would affect the SQL string or the type handlers
        should result in a different cache key.

        The cache key returned by this method is an instance of
        :class:`.CacheKey`, which consists of a tuple representing the
        cache key, as well as a list of :class:`.BindParameter` objects
        which are extracted from the expression.   While two expressions
        that produce identical cache key tuples will themselves generate
        identical SQL strings, the list of :class:`.BindParameter` objects
        indicates the bound values which may have different values in
        each one; these bound parameters must be consulted in order to
        execute the statement with the correct parameters.

        a :class:`_expression.ClauseElement` structure that does not implement
        a :meth:`._gen_cache_key` method and does not implement a
        :attr:`.traverse_internals` attribute will not be cacheable; when
        such an element is embedded into a larger structure, this method
        will return None, indicating no cache key is available.

        Nr`   rT   r<   CacheKey)r_   ra   	_anon_mapkeys       r    _generate_cache_keyzHasCacheKey._generate_cache_key  s;    @ 
J	!!)Z8y C,,r!   c                 h    g }t               }|j                  ||      }t        |v ry t        ||      S Nrm   )r-   rg   ra   ro   rp   s        r    _generate_cache_key_for_objectz*HasCacheKey._generate_cache_key_for_objectA  s8    
J	  J7y C,,r!   )r@   
__module____qualname____doc__r<   r4   _is_has_cache_keyr>   r3   	__slots__classmethodr(   r
   preload_modulerT   rq   rt   r1   r!   r    r0   r0   3   s     $"& M( I: :x T23v 4vp'-R - -r!   r0   c                   0    e Zd Zej                  d        Zy)MemoizedHasCacheKeyc                 ,    t         j                  |       S rs   )r0   rq   r_   s    r    rq   z'MemoizedHasCacheKey._generate_cache_keyN  s    ..t44r!   N)r@   ru   rv   r   memoized_instancemethodrq   r1   r!   r    r}   r}   M  s    ((5 )5r!   r}   c                   V    e Zd ZdZd Zd Zd Zd Zed        Z	d Z
d Zd	 Zd
 Zd Zy)rn   zThe key used to identify a SQL statement construct in the
    SQL compilation cache.

    .. seealso::

        :ref:`sql_caching`

    c                      y)z7CacheKey itself is not hashable - hash the .key portionNr1   r   s    r    __hash__zCacheKey.__hash__]  s     r!   c                    | j                   |vrt        |      x|| j                   <   }n|| j                      }| j                  st        fdt	              D              }nt        fd| j                  D              }t        ||f      S )a  Generate an "offline string" form of this :class:`.CacheKey`

        The "offline string" is basically the string SQL for the
        statement plus a repr of the bound parameter values in series.
        Whereas the :class:`.CacheKey` object is dependent on in-memory
        identities in order to work as a cache key, the "offline" version
        is suitable for a cache that will work for other processes as well.

        The given ``statement_cache`` is a dictionary-like object where the
        string form of the statement itself will be cached.  This dictionary
        should be in a longer lived scope in order to reduce the time spent
        stringifying statements.


        c              3   (   K   | ]	  }|     y wrs   r1   ).0rp   
parameterss     r    	<genexpr>z-CacheKey.to_offline_string.<locals>.<genexpr>x  s     NC
3Ns   c              3   j   K   | ]*  }j                  |j                  |j                         , y wrs   )r   rp   value)r   	bindparamr   s     r    r   z-CacheKey.to_offline_string.<locals>.<genexpr>z  s,        y}}ioo> s   03)rp   rH   ra   r^   sortedrepr)r_   statement_cache	statementr   sql_strparam_tuples      `  r    to_offline_stringzCacheKey.to_offline_stringb  s      88?*25i.@ODHH%%dhh/GN6*;MNNK  !%  K
 Wk*++r!   c                 F    t        | j                  |j                  k(        S rs   )r9   rp   r_   others     r    __eq__zCacheKey.__eq__  s    DHH		)**r!   c                 6    | j                   |j                   k(   S rs   rp   r   s     r    __ne__zCacheKey.__ne__  s    HH		)**r!   c                 T    t        |g       }t        |g       }|j                  |      S rs   )rn   _diff)r-   leftrightck1ck2s        r    _diff_tupleszCacheKey._diff_tuples  s(    tR ub!yy~r!   c              #     K   | j                   }|j                   }g }d}	 ||}}|D ]  }||   }||   } t        t        j                  ||            D ]h  \  }\  }	}
||k  r|	|
k7  st	        |	t
              r#t	        |
t
              r|j                  |        n5ddj                  d |D              ||	|
fz   j |j                  d      }y w)Nr   zkey%s[%d]:  %s != %s c              3   &   K   | ]	  }d |z    yw)z[%d]Nr1   )r   rc   s     r    r   z,CacheKey._whats_different.<locals>.<genexpr>  s     #BSFSL#Bs   )	rp   	enumerater
   zip_longestrP   r^   appendjoinpop)r_   r   k1k2stackpickup_indexs1s2idxe1e2s              r    _whats_differentzCacheKey._whats_different  s     XXYYB WW "+4+;+;B+C!D Xb"%8!"e,B1FS)4GG#BE#BB	8    %yy}- s   A&C)A)Cc                 B    dj                  | j                  |            S )N, )r   r   r   s     r    r   zCacheKey._diff  s    yy..u566r!   c                 r   | j                   g}g }t               }d}|r|j                  d      }||u r |j                  d|dz  z  dz          |dz  }nt	        |t
              rR|s|j                  d|dz   dz  z  dz          n|dz  }t        |      |gz   |z   }|j                  d|dz  z  dz          njt	        |t              r/d	t        |      j                  d
t        t        |            d}nt        |      }|j                  d|dz  z  dz   |z   dz          |rddj                  |      dS )Nr   r    r	   z),r   z()(<z object at >z  r   zCacheKey(key=
))rp   objectr   r   rP   r^   listr0   typer@   hexrF   r   r   )r_   r   outputsentinelindentrk   repr_s          r    __str__zCacheKey.__str__  s/   
899Q<Dxsfqj1T9:!D%(MM36A:*:#;t"CDaKF J(3e;EMM3&1*#5"<=dK0T
++BtHE
 !JEsfqj1T9EADHI) , &*YYv%688r!   c                     ddl m}  |       }| j                  D ci c]  }|j                  |z  |j                   c}S c c}w )zused for testingr   )prefix_anon_map)compilerr   ra   rp   effective_value)r_   r   ro   bs       r    _generate_param_dictzCacheKey._generate_param_dict  s;     	.#%	>BooN	!1#4#44NNNs   !A c                     t        |j                  | j                        D ci c]  \  }}|j                  |j                   }}}|j	                  |      S c c}}w rs   )zipra   rp   r   params)r_   original_cache_keytarget_elementkv	translates         r    _apply_params_to_elementz!CacheKey._apply_params_to_element  s[     .994??K
1 EE177N
	 

 $$Y//
s   !AN)r@   ru   rv   rw   r   r   r   r   rz   r   r   r   r   r   r   r1   r!   r    rn   rn   S  sI    
,>++  
>79<O0r!   rn   rp   ra   c                 "    | j                         S rs   )_clone)elementr   s     r    r   r     s    >>r!   c                   *   e Zd ZexZZej                  Zej                  Z
ej                  Zej                  ZexZxZxZZeZeZeZeZd Zd Zd Zd Zd Zd Z d Z!d Z"d	 Z#d
 Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3y)	_CacheKeyc                 &    t        d |D              S )Nc              3   >   K   | ]  \  }}|j                   |f  y wrs   __code__r   fnc_keys      r    r   z7_CacheKey.visit_with_context_options.<locals>.<genexpr>  s     ?ib%bkk5)?   r^   r_   rf   rg   parentr`   ra   s         r    visit_with_context_optionsz$_CacheKey.visit_with_context_options  s     ?3???r!   c                 <    |t        |      j                  ||      fS rs   )r   rT   r   s         r    visit_inspectablez_CacheKey.visit_inspectable  s    '#,55h
KLLr!   c                     t        |      S rs   r   r   s         r    visit_string_listz_CacheKey.visit_string_list  s    Szr!   c                 P    |t        |t              r|j                  ||      fS |fS rs   rP   r0   rT   r   s         r    visit_multiz_CacheKey.visit_multi  s:    #{+ x4
 	
 	
 	
r!   c                 4    |t        fd|D              fS )Nc              3   f   K   | ](  }t        |t              r|j                        n| * y wrs   r   r   rk   r`   ra   s     r    r   z-_CacheKey.visit_multi_list.<locals>.<genexpr>  s<        dK0 ##Hj9s   .1r   r   s       ``r    visit_multi_listz_CacheKey.visit_multi_list
  s'       	 
 	
r!   c                 :    |sy|t        fd|D              fS )Nr1   c              3   H   K   | ]  }t        fd |D                yw)c              3   B   K   | ]  }|j                          y wrs   rT   r   s     r    r   zA_CacheKey.visit_has_cache_key_tuples.<locals>.<genexpr>.<genexpr>  s&       ''*=   Nr   )r   tup_elemr`   ra   s     r    r   z7_CacheKey.visit_has_cache_key_tuples.<locals>.<genexpr>  s-      
 	   (    "r   r   s       ``r    visit_has_cache_key_tuplesz$_CacheKey.visit_has_cache_key_tuples  s/      
 !$ 	
 		
r!   c                 :    |sy|t        fd|D              fS )Nr1   c              3   B   K   | ]  }|j                          y wrs   r   r   s     r    r   z5_CacheKey.visit_has_cache_key_list.<locals>.<genexpr>,  s     L$%%h
;Lr   r   r   s       ``r    visit_has_cache_key_listz"_CacheKey.visit_has_cache_key_list%  s&     LLL
 	
r!   c                 :    |sy|t        fd|D              fS )Nr1   c              3   Z   K   | ]"  }|j                   r|j                         $ y wrs   )rx   rT   r   s     r    r   z5_CacheKey.visit_executable_options.<locals>.<genexpr>6  s/      )) ##Hj9s   (+r   r   s       ``r    visit_executable_optionsz"_CacheKey.visit_executable_options/  s-       
 	
r!   c           	      d    | j                  ||D cg c]  }t        |       c}|||      S c c}w rs   )r   r   )r_   rf   rg   r   r`   ra   os          r    visit_inspectable_listz _CacheKey.visit_inspectable_list=  s4     ,,3/awqz/:
 	
/s   -
c                 ,    | j                  |||||      S rs   )r   r   s         r    visit_clauseelement_tuplesz$_CacheKey.visit_clauseelement_tuplesD  s"     ..c68Z
 	
r!   c           
      h    |sy|t        |D cg c]  }|j                  ||       c}      fS c c}w Nr1   r^   rT   )r_   rf   rg   r   r`   ra   rk   s          r    visit_fromclause_ordered_setz&_CacheKey.visit_fromclause_ordered_setK  s:     M4&&x<MN
 	
Ms   /
c                 |    |sy|D cg c]  }|j                  ||       }}|t        t        |            fS c c}w r  )rT   r^   r   )r_   rf   rg   r   r`   ra   rk   
cache_keyss           r    !visit_clauseelement_unordered_setz+_CacheKey.visit_clauseelement_unordered_setU  sU     BE
:>D*5

 
 z"
 	

s   9c                     ||j                   fS rs   )namer   s         r    visit_named_ddl_elementz!_CacheKey.visit_named_ddl_elementd  s     #((##r!   c                 x    |sy|t        |D cg c]  \  }}|j                  ||      |f c}}      fS c c}}w r  r  )r_   rf   rg   r   r`   ra   clausestrvals           r    visit_prefix_sequencez_CacheKey.visit_prefix_sequencei  sT       +.& **8Z@&I
 	
s   6c                 <    d|v t        fd|D              S )Nlegacyc              3   H  K   | ]  \  }}}}rt        |t              r|n|j                        rt        |t              r|n||j                        nd ||j                        nd t        t	        |      D cg c]	  }|||   f c}      f  y c c}w wrs   )rP   rH   rT   r^   r   )	r   targetonclausefrom_flagsrp   r`   ra   	is_legacys	         r    r   z3_CacheKey.visit_setup_join_tuple.<locals>.<genexpr>~  s      
 15% FC!8 **8Z@Hc!:  ' ,,XzB$ $$Xz:F5MBSU3Z(BC
 Cs   A?B"BB"r   )r_   rf   rg   r   r`   ra   r  s       ``@r    visit_setup_join_tuplez _CacheKey.visit_setup_join_tupley  s+     (	 
 58
 
 	
r!   c                     |sy|t        |j                         D cg c]  \  \  }}}|j                  ||      ||f c}}}      fS c c}}}w r  )r^   itemsrT   )	r_   rf   rg   r   r`   ra   r  dialect_nametexts	            r    visit_table_hint_listz_CacheKey.visit_table_hint_list  sl       9<		  5.	 --h
C$	
 	
s   "A
c           	      ^    |t        t        |      D cg c]	  }|||   f c}      fS c c}w rs   r^   r   r_   rf   rg   r   r`   ra   rp   s          r    visit_plain_dictz_CacheKey.visit_plain_dict  s,    %F3K HS#s3x HIJJ Hs   *
c                 B    |t        fdt              D              fS )Nc           
   3      K   | ]3  }|t        t        |         D cg c]  }||   |   f c}      f 5 y c c}w wrs   r!  )r   r  rp   rg   s      r    r   z2_CacheKey.visit_dialect_options.<locals>.<genexpr>  s^       ! ! (.c,.?'@ # !#l"3C"89s   A<Ar!  r   s     `   r    visit_dialect_optionsz_CacheKey.visit_dialect_options  s-       %+3K 
 	
r!   c                 J    |t        fdt              D              fS )Nc              3   L   K   | ]  }||   j                        f  y wrs   r   )r   rp   r`   ra   rg   s     r    r   z<_CacheKey.visit_string_clauseelement_dict.<locals>.<genexpr>  s/       c#h--h
CD   !$r!  r   s     ` ``r    visit_string_clauseelement_dictz)_CacheKey.visit_string_clauseelement_dict  s+      !#; 
 	
r!   c           
      v    |t        fdt        |      D cg c]	  }|||   f c}D              fS c c}w )Nc              3   p   K   | ]-  \  }}|t        |t              r|j                        n|f / y wrs   r   r   rp   r   r`   ra   s      r    r   z4_CacheKey.visit_string_multi_dict.<locals>.<genexpr>  sC       C !%5 ((:>	s   36r!  r"  s       `` r    visit_string_multi_dictz!_CacheKey.visit_string_multi_dict  sG       ?ESk"JsCS?"J 
 	
 #Ks   6c                 H    |t        fd|j                  D              fS )Nc              3   H   K   | ]  \  }}|j                          y wrs   r   )r   r   colr`   ra   s      r    r   zI_CacheKey.visit_fromclause_canonical_column_collection.<locals>.<genexpr>  s*      As ""8Z8r   )r^   _collectionr   s       ``r    ,visit_fromclause_canonical_column_collectionz6_CacheKey.visit_fromclause_canonical_column_collection  s+    
  !oo 
 	
r!   c                     d|t         <   yNTr1   r<   r   s         r    visit_unknown_structurez!_CacheKey.visit_unknown_structure  s     "r!   c                 4    |t        fd|D              fS )Nc              3      K   | ]9  \  }}t        |d       r|j                        n||j                        f ; yw__clause_element__Nr'   rT   r-  s      r    r   z5_CacheKey.visit_dml_ordered_values.<locals>.<genexpr>  sQ       C	 s$89 &&x<((:>	   ?Ar   r   s       ``r    visit_dml_ordered_valuesz"_CacheKey.visit_dml_ordered_values  s)       #& 
 	
r!   c                    t         r|t        fdD              fS D ch c]  }t        |d      s| }}|r
dt        <   y|j	                        }|t        fdt        |      D              fS c c}w )Nc              3      K   | ]9  }t        |d       r|j                        n||   j                        f ; ywr:  r<  r   r   r`   ra   rg   s     r    r   z-_CacheKey.visit_dml_values.<locals>.<genexpr>  sQ       	 #1&:; ((:>A--h
C	r=  r;  Tr1   c              3   L   K   | ]  }||   j                        f  y wrs   r   rA  s     r    r   z-_CacheKey.visit_dml_values.<locals>.<genexpr>  s/       A--h
CDr)  )r   r^   r'   r<   symmetric_differencer   )	r_   rf   rg   r   r`   ra   r   expr_values
str_valuess	     ` ``   r    visit_dml_valuesz_CacheKey.visit_dml_values  s       !   '*NWQ8L-M1NKN &*"$99#>J  #J/   Os
   A<A<c                     d|t         <   yr5  r6  r   s         r    visit_dml_multi_valuesz _CacheKey.visit_dml_multi_values  s     "r!   N)4r@   ru   rv   rS   visit_has_cache_keyvisit_clauseelementr   r[   visit_clauseelement_listrW   visit_annotations_keyr\   visit_clauseelement_tupler]   visit_memoized_select_entitiesrU   visit_stringvisit_booleanvisit_operatorvisit_plain_objvisit_statement_hint_listrK   
visit_typerM   visit_anon_namerV   visit_propagate_attrsr   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r#  r&  r*  r.  r3  r7  r>  rF  rH  r1   r!   r    r   r     s     1CB-0FF-@@ 1 H H55 # ,::L :: .!JO+@
M
	

 





$

 
.
(K
&	

 


  Dr!   r   c                       e Zd Zd ZddZy)HasCopyInternalsc                     t               rs   NotImplementedError)r_   r   s     r    r   zHasCopyInternals._clone%  s    !##r!   c                     	 | j                   }t        j                  | |d      D ])  \  }}}||v r| ||| |fi |}|t	        | ||       + y# t        $ r Y yw xY w)at  Reassign internal elements to be clones of themselves.

        Called during a copy-and-traverse operation on newly
        shallow-copied elements to create a deep copy.

        The given clone function should be used, which may be applying
        additional transformations to the element (i.e. replacement
        traversal, cloned traversal, annotations).

        Nr$   )r#   r;   r)   run_generated_dispatchsetattr)r_   
omit_attrsr   traverse_internalsrf   rg   rh   re   s           r    r)   z HasCopyInternals._copy_internals(  s    	!%!9!9
 $3#I#I$&K$
 		4Hc4 :%hc8R8%D(F3		4	  		s   A 	AAN)r1   )r@   ru   rv   r   r)   r1   r!   r    rX  rX  $  s    $4r!   rX  c                       e Zd ZdZefdZefdZefdZefdZefdZ	efdZ
efdZefd	Zd
 ZefdZefdZefdZefdZy)_CopyInternalszmGenerate a _copy_internals internal traversal dispatch for classes
    with a _traverse_internals collection.c                      ||fi |S rs   r1   r_   rf   r   r   cloner   s         r    rJ  z"_CopyInternals.visit_clauseelementJ  s     W###r!   c                 :    |D cg c]  } ||fi | c}S c c}w rs   r1   r_   rf   r   r   re  r   r  s          r    rK  z'_CopyInternals.visit_clauseelement_listO  "     3::f##:::   c           
      L    t        |D cg c]  } ||fi | c}      S c c}w rs   r   rg  s          r    rM  z(_CopyInternals.visit_clauseelement_tupleT  '     @feF)b)@AA@   !c           
      L    t        |D cg c]  } ||fi | c}      S c c}w rs   r   rg  s          r    r   z'_CopyInternals.visit_executable_optionsY  rk  rl  c                 :    |D ch c]  } ||fi | c}S c c}w rs   r1   rg  s          r    r
  z0_CopyInternals.visit_clauseelement_unordered_set^  rh  ri  c                 V    |D cg c]  }t        fd|D               c}S c c}w )Nc              3   0   K   | ]  } |fi   y wrs   r1   )r   r   re  r   s     r    r   z<_CopyInternals.visit_clauseelement_tuples.<locals>.<genexpr>g  s     =H%'B'=s   r   )r_   rf   r   r   re  r   rk   s       `` r    r  z)_CopyInternals.visit_clauseelement_tuplesc  s0    
  
 ===
 	
 
s   &c                 L    t        fd|j                         D              S )Nc              3   :   K   | ]  \  }}| |fi f  y wrs   r1   )r   rp   r   re  r   s      r    r   zA_CopyInternals.visit_string_clauseelement_dict.<locals>.<genexpr>n  s)      
*4#uS%$$%
s   )dictr  rd  s       ``r    r*  z._CopyInternals.visit_string_clauseelement_dictk  s%      
8?
 
 	
r!   c                 0    t        fd|D              S )Nc              3   v   K   | ]0  \  }}}}|	 |fi nd |	 |fi nd |	 |fi nd |f 2 y wrs   r1   )r   r  r  r  r  re  r   s        r    r   z8_CopyInternals.visit_setup_join_tuple.<locals>.<genexpr>u  sd      
 15% (.'9f##t)1)=h%"%4&+&7e"r"T	
s   69r   rd  s       ``r    r  z%_CopyInternals.visit_setup_join_tupler  s!      
 5<
 
 	
r!   c                 ,     | j                   |||fi |S rs   rM  )r_   rf   r   r   r   s        r    rN  z-_CopyInternals.visit_memoized_select_entities  s    -t--hN2NNr!   c           
      t    |D cg c]%  \  }}t        |d      r	 ||fi |n| ||fi |f' c}}S c c}}w Nr;  r'   r_   rf   r   r   re  r   rp   r   s           r    r>  z'_CopyInternals.visit_dml_ordered_values  sV     &
 U	 3 45 c R e"r"	
 	
 
s   *4c           
          |j                         D ci c]$  \  }}t        |d      r	 ||fi |n| ||fi |& c}}S c c}}w ry  )r  r'   r{  s           r    rF  z_CopyInternals.visit_dml_values  sX    
 &mmo	
 U %,C1E$Fc R CU!b!"
 	
 
s   )Ac           
      t    fd}|D cg c]  }|D cg c]
  } ||       c} c}}S c c}w c c}}w )Nc           
      P   t        | t        t        f      r%| D cg c]  }t        |d      r	 |fi n| c}S t        | t              rN| j                         D ci c]2  \  }}t        |d      r	 |fi n|t        |d      r	 |fi n|4 c}}S J c c}w c c}}w ry  )rP   r   r^   r'   rs  r  )rk   r   rp   re  r   s      r    copyz3_CopyInternals.visit_dml_multi_values.<locals>.copy  s    $u.
 "&	  u&:; %&2&  D$' '+jjl #U #3(<= c(R(  #5*>? e*r*"#  u+s   B 7B"r1   )	r_   rf   r   r   re  r   r  sequencesub_elements	       ``   r    rH  z%_CopyInternals.visit_dml_multi_values  s=    
	6 $
 3;;;T+;
 	
;
s   	4/44c                     |S rs   r1   rd  s         r    rV  z$_CopyInternals.visit_propagate_attrs  s	     r!   N)r@   ru   rv   rw   r   rJ  rK  rM  r   r
  r  r*  r  rN  r>  rF  rH  rV  r1   r!   r    rb  rb  F  s    . 06$ 06; 06B 06B 06; 06
 06
 06
O 06
 AG 
 06!
H 06r!   rb  c                     t        | d      r7t        | dd      s*| j                         } t        | d      rt        | dd      s*| S )Nr;  is_clause_elementF)r'   r:   r;  )r   s    r    _flatten_clauseelementr    sO    
'/
0$e: ,,. '/
0$e:
 Nr!   c                   j    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zy)_GetChildrenzqGenerate a _children_traversal internal traversal dispatch for classes
    with a _traverse_internals collection.c                      yr  r1   r_   r   r   s      r    rI  z _GetChildren.visit_has_cache_key  s     r!   c                     |fS rs   r1   r  s      r    rJ  z _GetChildren.visit_clauseelement  s
    zr!   c                     |S rs   r1   r  s      r    rK  z%_GetChildren.visit_clauseelement_list      r!   c                     |S rs   r1   r  s      r    rM  z&_GetChildren.visit_clauseelement_tuple  r  r!   c                 @    t         j                  j                  |      S rs   )	itertoolschainfrom_iterabler  s      r    r  z'_GetChildren.visit_clauseelement_tuples  s    ,,W55r!   c                      yr  r1   r  s      r    r3  z9_GetChildren.visit_fromclause_canonical_column_collection      r!   c                 "    |j                         S rs   )valuesr  s      r    r*  z,_GetChildren.visit_string_clauseelement_dict  s    ~~r!   c                     |S rs   r1   r  s      r    r  z)_GetChildren.visit_fromclause_ordered_set  r  r!   c                     |S rs   r1   r  s      r    r
  z._GetChildren.visit_clauseelement_unordered_set  r  r!   c              +      K   |D ]K  \  }}}}|| t        |t              st        |       |.t        |t              r?t        |       M y wrs   )rP   rH   r  )r_   r   r   r  r  r  r  s          r    r  z#_GetChildren.visit_setup_join_tuple  sX     07 	7,VXue fc*,V44#Jx,E,X66	7s   0AAAc                 (     | j                   |fi |S rs   rw  r  s      r    rN  z+_GetChildren.visit_memoized_select_entities  s    -t--g<<<r!   c              +   H   K   |D ]  \  }}t        |d      r| |  y wry  rz  )r_   r   r   r   r   s        r    r>  z%_GetChildren.visit_dml_ordered_values  s.      	DAqq./G	s    "c              +      K   |D ch c]  }t        |d      s| }}|j                  |      }t        |      D ]	  }||     |D ]  }| ||     y c c}w wry  )r'   rC  r   )r_   r   r   r   rD  rE  s         r    rF  z_GetChildren.visit_dml_values  su     ")NQWQ8L-MqNN 55g>

# 	A!*	 	AG!*	 Os   AAAAAc                      yr  r1   r  s      r    rH  z#_GetChildren.visit_dml_multi_values  r  r!   c                      yr  r1   r  s      r    rV  z"_GetChildren.visit_propagate_attrs  r  r!   N)r@   ru   rv   rw   rI  rJ  rK  rM  r  r3  r*  r  r
  r  rN  r>  rF  rH  rV  r1   r!   r    r  r    sR    .6 	7=r!   r  rB   c                     t        |t        j                  j                  j                        r|j                  |      }|S rs   )rP   r
   rN   rO   rQ   rR   )r   r  r`   r   s       r    _resolve_name_for_comparer    s/    $33DDE~~h'Kr!   c                       e Zd ZdZd Zd Zy)r`   aU  A map that creates new keys for missing key access.

    Produces an incrementing sequence given a series of unique keys.

    This is similar to the compiler prefix_anon_map class although simpler.

    Inlines the approach taken by :class:`sqlalchemy.util.PopulateDict` which
    is otherwise usually used for this type of operation.

    c                     d| _         y )Nr   )rI   r   s    r    __init__zanon_map.__init__+  s	    
r!   c                 d    t        | j                        x| |<   }| xj                  dz  c_        |S )Nr   )rH   rI   )r_   rp   vals      r    __missing__zanon_map.__missing__.  s*    djj/)S	C

a

r!   N)r@   ru   rv   rw   r  r  r1   r!   r    r`   r`     s    	r!   r`   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.y-).r   )r   cacher`   c                 @    t               | _        t               | _        y rs   )r   r   setr  r   s    r    r  z$TraversalComparatorStrategy.__init__7  s    W
U
r!   c                 *    t               t               fS rs   )r`   r   s    r    _memoized_attr_anon_mapz3TraversalComparatorStrategy._memoized_attr_anon_map;  s    
HJ''r!   c                 
   | j                   }| j                  }|j                  dd      }|j                  ||f       |rC|j	                         \  }}||u r||y||f|v r'|j                  ||f       |j                  }	|	|j                  k7  ryt        | d|	z  d       }
|
r |
||fi |}|t        u ry|t        u rd}t        j                  |j                  |j                  d      D ]  \  \  }}\  }}|s|dk(  s|dk(  r||k7  s||ur y||v r)| j                  |      } t        j                  |      |      } t        j                  |      |      }|| yw ||||||fi |}|t        u s y |rCy)	Ncompare_annotationsFz
compare_%sr1   NN	fillvalue_annotationsT)r   r  r   r   popleftadd__visit_name__r:   COMPARE_FAILEDSKIP_TRAVERSEr
   r   r#   dispatchoperator
attrgetter)r_   r   r   r   r   r  r  r   r   
visit_namerh   attributes_comparedleft_attrnameleft_visit_symright_attrnameright_visit_symr  
left_childright_child
comparisons                       r    r   z#TraversalComparatorStrategy.compare>  s   



 ff%:EBdD\"--/KD%u}%'IItUm$,,JU1114
!:DAD&*4&="&=#&.8 (M9 ')#
 !!(())&#! /1 +"n4&.8 "^3%_< "&99==8?X00?E
Ah11.A%H%".$ %!4UKKM
 / G#!A J r!   c                 J    | j                         } |j                  ||fi |S rs   )rG   r   )r_   r   r   r   
comparators        r    compare_innerz)TraversalComparatorStrategy.compare_inner  s(    ^^%
!z!!$333r!   c                     |j                  | j                  d   g       |j                  | j                  d   g       k7  rt        S y Nr   r   )rT   r`   r  r_   rf   left_parentr   right_parentr   r   s          r    rI  z/TraversalComparatorStrategy.visit_has_cache_key  sJ     t}}Q/48L8LMM!b9
 
 "!
r!   c                 f    | j                  |j                  dd       |j                  dd             S )NrE   )r  r   r  s          r    rV  z1TraversalComparatorStrategy.visit_propagate_attrs  s4     !!HH%t,eii8H$.O
 	
r!   c                     t        j                  ||d       D ]L  \  }}|j                  | j                  d   g       |j                  | j                  d   g       k7  sFt        c S  y Nr  r   r   )r
   r   rT   r`   r  	r_   rf   r  r   r  r   r   lrs	            r    r   z4TraversalComparatorStrategy.visit_has_cache_key_list  sg     $$T5DA 	&DAqa 0"59I9Ia ":  &%		&r!   c                 
   t        j                  ||d       D ]h  \  }}|j                  r|j                  | j                  d   g       n||j                  r|j                  | j                  d   g       n|k7  sbt
        c S  y r  )r
   r   rx   rT   r`   r  r  s	            r    r   z4TraversalComparatorStrategy.visit_executable_options  s     $$T5DA 
	&DAq &&   q!126 &&   q!126 &%
	&r!   c                 >    | j                   j                  ||f       y rs   )r   r   r  s          r    rJ  z/TraversalComparatorStrategy.visit_clauseelement  s     	

4-(r!   c                 ~    t        j                  ||d       D ]"  \  }}| j                  j                  ||f       $ y Nr  r
   r   r   r   )	r_   rf   r  r   r  r   r   lcolrcols	            r    r3  zHTraversalComparatorStrategy.visit_fromclause_canonical_column_collection  s<     **4$G 	,JD$JJtTl+	,r!   c                      y rs   r1   r  s          r    *visit_fromclause_derived_column_collectionzFTraversalComparatorStrategy.visit_fromclause_derived_column_collection  s     	r!   c                     t        j                  t        |      t        |      d       D ]5  \  }}||k7  rt        c S | j                  j                  ||   ||   f       7 y r  )r
   r   r   r  r   r   )	r_   rf   r  r   r  r   r   lstrrstrs	            r    r*  z;TraversalComparatorStrategy.visit_string_clauseelement_dict  s_     **4L&-4
 	9JD$ t|%%JJtDz5;78	9r!   c                     t        j                  ||d       D ]N  \  }}||t        c S t        j                  ||d       D ]"  \  }	}
| j                  j	                  |	|
f       $ P y r  r
   r   r  r   r   )r_   rf   r  r   r  r   r   ltuprtupr  r  s              r    r  z6TraversalComparatorStrategy.visit_clauseelement_tuples  sm     **4$G 	*JD$|t|%%((ttD *1

!!1a&)*		*r!   c                 ~    t        j                  ||d       D ]"  \  }}| j                  j                  ||f       $ y r  r  r  s	            r    rK  z4TraversalComparatorStrategy.visit_clauseelement_list  <     $$T5DA 	&DAqJJq!f%	&r!   c                 ~    t        j                  ||d       D ]"  \  }}| j                  j                  ||f       $ y r  r  r  s	            r    rM  z5TraversalComparatorStrategy.visit_clauseelement_tuple  r  r!   c                    ||d u S t               }|D ]H  }t        |      j                  |      D ])  } | j                  ||fi |s|j                  |        H J t	        |      t	        |      cxk(  xr t	        |      k(  S c S rs   )r  
differencer  r  len)r_   seq1seq2r   	completedr  other_clauses          r    _compare_unordered_sequencesz8TraversalComparatorStrategy._compare_unordered_sequences  s    <4<E	 	F #D	 4 4Y ? %4%%flAbAMM,/	
 9~T7c$i7777r!   c                 *     | j                   ||fi |S rs   )r  r  s          r    r
  z=TraversalComparatorStrategy.visit_clauseelement_unordered_set  s     1t00uCCCr!   c                 ~    t        j                  ||d       D ]"  \  }}| j                  j                  ||f       $ y r  r  r  s	            r    r  z8TraversalComparatorStrategy.visit_fromclause_ordered_set  r  r!   c                     ||k(  S rs   r1   r  s          r    rO  z(TraversalComparatorStrategy.visit_string       u}r!   c                     ||k(  S rs   r1   r  s          r    r   z-TraversalComparatorStrategy.visit_string_list  r  r!   c                 p    t        ||| j                  d   fi |t        ||| j                  d   fi |k(  S r  )r  r`   r  s          r    rU  z+TraversalComparatorStrategy.visit_anon_name	  sN     )t}}Q/
35
&%q!1
57

 	
r!   c                     ||k(  S rs   r1   r  s          r    rP  z)TraversalComparatorStrategy.visit_boolean  r  r!   c                     ||k(  S rs   r1   r  s          r    rQ  z*TraversalComparatorStrategy.visit_operator  r  r!   c                 $    |j                  |      S rs   )_compare_type_affinityr  s          r    rT  z&TraversalComparatorStrategy.visit_type  s     **511r!   c                     ||k(  S rs   r1   r  s          r    r#  z,TraversalComparatorStrategy.visit_plain_dict!  r  r!   c                     ||k(  S rs   r1   r  s          r    r&  z1TraversalComparatorStrategy.visit_dialect_options&  r  r!   c                 F    |r|r|j                   |j                   k(  S ||k(  S rs   )rY   r  s          r    rL  z1TraversalComparatorStrategy.visit_annotations_key+  s1     E22667
 5= r!   c                 L    t        d |D              t        d |D              k(  S )Nc              3   >   K   | ]  \  }}|j                   |f  y wrs   r   r   s      r    r   zITraversalComparatorStrategy.visit_with_context_options.<locals>.<genexpr>9  s     @ib%bkk5)@r   c              3   >   K   | ]  \  }}|j                   |f  y wrs   r   r   s      r    r   zITraversalComparatorStrategy.visit_with_context_options.<locals>.<genexpr>9  s$      J
%.RR[[% J
r   r   r  s          r    r   z6TraversalComparatorStrategy.visit_with_context_options6  s3     @4@@E J
27J
 E
 
 	
r!   c                     ||k(  S rs   r1   r  s          r    rR  z+TraversalComparatorStrategy.visit_plain_obj=  r  r!   c                 H    ||t         S |j                  |j                  k(  S rs   )r  r  r  s          r    r  z3TraversalComparatorStrategy.visit_named_ddl_elementB  s(     < %%yyEJJ&&r!   c                     t        j                  ||d      D ]5  \  \  }}\  }	}
||
k7  rt        c S | j                  j	                  ||	f       7 y Nr  r  r  )r_   rf   r  r   r  r   r   l_clausel_strr_clauser_strs              r    r  z1TraversalComparatorStrategy.visit_prefix_sequenceK  sZ     594D4D%<5
 	80Xu0% ~%%

!!8X"67	8r!   c                     t        j                  ||d      D ]s  \  \  }}}	}
\  }}}}|
|k7  rt        c S | j                  j	                  ||f       | j                  j	                  ||f       | j                  j	                  |	|f       u y )N)NNNNr  r  )r_   rf   r  r   r  r   r   l_target
l_onclausel_froml_flagsr_target
r_onclauser_fromr_flagss                  r    r  z2TraversalComparatorStrategy.visit_setup_join_tupleV  s     dE5MN	0 
3Xz673Xz67'!%%JJx23JJz:67JJvv./	0r!   c                 0     | j                   |||||fi |S rs   rw  r  s          r    rN  z:TraversalComparatorStrategy.visit_memoized_select_entitiesd  s,     .t--k4u
@B
 	
r!   c                 
   t        |d       }t        |d       }t        j                  ||d      D ]L  \  \  }	}
\  }}|
|k7  rt        c S ||	|
f   |||f   k7  rt        c S | j                  j                  |	|f       N y )Nc                 *    | d   j                   | d   fS r  fullnamerk   s    r    <lambda>zCTraversalComparatorStrategy.visit_table_hint_list.<locals>.<lambda>n  s    473C3CT!W2M r!   r   c                 *    | d   j                   | d   fS r  r  r  s    r    r  zCTraversalComparatorStrategy.visit_table_hint_list.<locals>.<lambda>p  s    T!W%5%5tAw$? r!   r  r  )r   r
   r   r  r   r   )r_   rf   r  r   r  r   r   	left_keys
right_keysltableldialectrtablerdialects                r    r  z1TraversalComparatorStrategy.visit_table_hint_listk  s     4%MN	?

 7;6F6Fz\7
 	42VX 2 8#%%vx()UFH3E-FF%%

!!66"23	4r!   c                     ||k(  S rs   r1   r  s          r    rS  z5TraversalComparatorStrategy.visit_statement_hint_list|  r  r!   c                     t               rs   rZ  r  s          r    r7  z3TraversalComparatorStrategy.visit_unknown_structure  s     "##r!   c                     t        j                  ||d      D ]'  \  \  }}\  }	}
 | j                  ||	fi |r!t        c S  y r  )r
   r   _compare_dml_values_or_cer  )r_   rf   r  r   r  r   r   lklvrkrvs              r    r>  z4TraversalComparatorStrategy.visit_dml_ordered_values  sQ    
 #'"2"2%<#
 	&HRhr2 2411"b?B?%%		&r!   c                     t        |d      }t        |d      }||k7  ry|r | j                  ||fi |sy|s||k7  ry | j                  ||fi |syy)Nr;  FT)r'   r  )r_   r   r"  r   lvcervces         r    r  z5TraversalComparatorStrategy._compare_dml_values_or_ce  sl    r/0r/04<,$,,R:r:"(###B1b1r!   c                 x   ||t        |      t        |      k7  rt        S t        |t        j                        r1t        ||      D ]!  \  }} | j                  ||fi |rt        c S  y t        |t        j                        rt        S t        rot        |j                         |j                               D ]C  \  \  }	}\  }
} | j                  |	|
fi |st        c S  | j                  ||fi |r=t        c S  y |D ]4  }	||	   }|	|vrt        c S ||	   } | j                  ||fi |r.t        c S  y rs   )	r  r  rP   r   Sequencer   r  r   r  )r_   rf   r  r   r  r   r   r   r"  r  r!  s              r    rF  z,TraversalComparatorStrategy.visit_dml_values  s<    <5=CIU,C!!dO445dE* *B5t55b"CC))* 778!!
 '*$**,&F *"R(2r5t55b"CC))5t55b"CC))	*  *"XU?))2Y5t55b"CC))*r!   c           	          t        j                  ||d       D ]X  \  }}||t        c S t        j                  ||d       D ],  \  }	}
 | j                  |||	||
fi |t        u s$t        c c S  Z y r  )r
   r   r  rF  )r_   rf   r  r   r  r   r   lseqrseqldrds              r    rH  z2TraversalComparatorStrategy.visit_dml_multi_values  s     **4$G 	*JD$|t|%%**4F *B)D)) +r<GI &&
 *)*		*r!   c                     |j                   |j                   u rTt        j                  |j                         r2 | j                  |j                  |j                  fi |rddgS t
        S dgS t
        S )Nr  clauses)r  r   is_associativer  r.  r  r_   r   r   r   s       r    compare_clauselistz.TraversalComparatorStrategy.compare_clauselist  sj    ==ENN*''64444LL%--35 '	22))"|#!!r!   c                    |j                   |j                   k(  rt        j                  |j                         r | j                  |j                  |j                  fi |r( | j                  |j
                  |j
                  fi |sP | j                  |j                  |j
                  fi |r, | j                  |j
                  |j                  fi |rg dS t        S ddgS t        S )N)r  negater   r   r  r3  )r  r   is_commutativer  r   r   r  r0  s       r    compare_binaryz*TraversalComparatorStrategy.compare_binary  s    ==ENN*''6&D&&tyy%**CC***4::u{{IbI&D&&tyy%++DD***4::uzzHRHBB))"H--!!r!   c                     |j                  dd      }|j                  dd      }|rg }nddg}|s|j                  d       |S )Ncompare_keysTcompare_valuescallabler   rp   )r   r   )r_   r   r   r   r7  r8  omits          r    compare_bindparamz-TraversalComparatorStrategy.compare_bindparam  sK    vvnd3 0$7D (DKKr!   N)/r@   ru   rv   ry   r  r  r   r  rI  rV  r   r   rJ  r3  r  r*  r  rK  rM  r  r
  r  rO  r   rU  rP  rQ  rT  r#  r&  rL  r   rR  r  r  r  rN  r  rS  r7  r>  r  rF  rH  r1  r5  r;  r1   r!   r    r   r   4  s    ,I(M^4"
&&)
,
9*&&
8D
&




2


	!

'	80
4"
$
	&*B* ""$r!   r   c                   (    e Zd Z	 ddZd Zd Zd Zy)r   c                     |f}|r||v r||   j                  |      }|D ]<  }|r|j                  |      rt        c S t        |      t        |      k(  s6t        c S  t        S )zCompare ColumnElements using proxies and equivalent collections.

        This is a comparison strategy specific to the ORM.
        )unionshares_lineager  hashr  )r_   r   r   r   equivalentsr   
to_compareoths           r    compare_column_elementz4ColIdentityComparatorStrategy.compare_column_element  sm     X
5K/$U+11*=J 	"Ct2237$$dtE{*$$		" "!r!   c                 *     | j                   ||fi |S rs   rD  r0  s       r    compare_columnz,ColIdentityComparatorStrategy.compare_column      *t**4="==r!   c                 *     | j                   ||fi |S rs   rF  r0  s       r    compare_labelz+ColIdentityComparatorStrategy.compare_label  rH  r!   c                 "    ||u rt         S t        S rs   )r  r  r0  s       r    compare_tablez+ColIdentityComparatorStrategy.compare_table  s     !%}A>Ar!   N)Tr1   )r@   ru   rv   rD  rG  rJ  rL  r1   r!   r    r   r      s    9;"(>>Br!   r   )0collectionsr   r   r  r  r   r   visitorsr   r   r
   
inspectionr   r   r   r   symbolr  r  COMPARE_SUCCEEDEDr<   rU   rS   rK   rV   rM   r   r.   r   r0   r}   rn   r   r   r=   rX  rb  r)   r  r  r+   r{   r  rs  r`   MemoizedSlotsr   r   r1   r!   r    <module>rS     s    "    / '    "  O, 4;;z"-. T[[!56 4;;12 $++/0DKK$	. W-& W-t5+{ 5H0z*ul&;< H0V|) |~	  ){ 4v 4Dx& xv !"D$ DN  ./ 0t *I"3T5G5G IXB$? Br!   