U
    ÌZj2¦ ã                   @   s  d 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 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mZ ddl'mZ( dd!l'm)Z) dd"l*m+Z+ dd#l*m,Z, dWd%d&„Z-ej.j/d$d$d'�G d(d)„ d)eƒƒZ0e&j1ej.j/d*d$d'�G d+d,„ d,eƒƒƒZ2e&j1ej.j/d*d-�G d.d/„ d/e2ƒƒƒZ3e&j1ej.j/d*d*d0�ej.j/d*d*d*d1�ej.j/d*d2�G d3d4„ d4eƒƒƒƒƒZ4G d5d6„ d6e5ƒZ6G d7d8„ d8eƒZ7e&j1ej8j/d*d2�G d9d:„ d:eƒƒƒZ9e&j1ej8j/d;d<�ej8j/dd<�G d=d>„ d>e7ƒƒƒƒZ:e&j1ej8j/d*d<�ej8j/d?d<�ej8j/d@d<�ej8j/dAd<�ej8j/dBd<�G dCdD„ dDe7ej;ƒƒƒƒƒƒƒZ<G dEdF„ dFe5ƒZ=G dGdH„ dHe7ƒZ>ej8j/dId<�G dJdK„ dKe>ƒƒZ?e&j1ej8j/dLd<�G dMdN„ dNe>ƒƒƒZ@e&j1ej8j/dOd<�ej8j/d$d<�G dPdQ„ dQe7ƒƒƒƒZAe&j1ej8j/dRd<�G dSdT„ dTe>ej;ƒƒƒZBdUdV„ ZCdS )XzWsqlalchemy.orm.interfaces.LoaderStrategy
   implementations, and related MapperOptions.é    )Úabsolute_importNé   )Ú
attributes)Úexc)Ú
interfaces)Úloading)Úpath_registry)Ú
properties)Úquery)Úrelationships)Ú
unitofwork)Úutil)Ú_DEFER_FOR_STATE)Ú_RAISE_FOR_STATE)Ú_SET_DEFERRED_EXPIRED)Ú_column_descriptions)ÚORMCompileState)ÚORMSelectCompileState)ÚQueryContext)ÚLoaderStrategy)ÚStrategizedProperty)Ú_state_session)ÚInstanceState)Ú	_none_set)Úaliasedé   )Úevent)Úinspect)Úlog)Úsql)Úvisitors)ÚLABEL_STYLE_TABLENAME_PLUS_COL)ÚSelectFc	                    s"  g }
|o| j ‰|r"| jr"|
 t¡ | j| jjkrV| jj| j \‰‰|
 ‡‡fdd„¡ |rf|
 tj¡ |rŽ| j	‰ ˆ rŽ| j
rŽ|
 ‡ ‡fdd„¡ |jD ]ˆ}| |j | j¡kr”|j | j¡s”tj|j| jf| ˆ|||oâ| jpâ| jtjk||||| pö| j | jdœ|	—Ž}|
D ]}||| ƒ �q
q”d S )Nc                    s   t j| |jˆ fˆŽS ©N)Úorm_utilZ_validator_eventsÚkey©ÚdescÚprop)ÚfnÚopts© ú\/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/orm/strategies.pyÚ<lambda>I   s     ÿÿz%_register_attribute.<locals>.<lambda>c                    s   t  | ˆ ˆ¡S r#   )r   Zbackref_listenersr&   )ÚbackrefÚuselistr+   r,   r-   W   s     ÿ)Zparent_tokenr/   Úcompare_functionÚ	useobjectZtrackparentÚtypecallableÚ	callable_Úactive_historyÚ
impl_classZsend_modified_eventsÚdoc)r/   Zsingle_parentÚappendÚsingle_parent_validatorr%   ÚparentZ
validatorsr   Ztrack_cascade_eventsZback_populatesZ_effective_sync_backrefZself_and_descendantsÚ_propsÚgetÚclass_managerZ_attr_has_implr   Zregister_attribute_implÚclass_Ú	directionr   Z	ONETOMANYZviewonlyr6   )r(   Úmapperr1   r0   r2   r3   Zproxy_propertyr4   r5   ÚkwZlisten_hooksÚmr'   Úhookr+   )r.   r)   r*   r/   r,   Ú_register_attribute2   sZ    


ÿ
ÿ
ÿþþ
ïîrC   )Ú
instrumentÚdeferredc                       s6   e Zd ZdZdZ‡ fdd„Zd
dd„Zdd	„ Z‡  ZS )ÚUninstrumentedColumnLoaderz¶Represent a non-instrumented MapperProperty.

    The polymorphic_on argument of mapper() often results in this,
    if the argument is against the with_polymorphic selectable.

    ©Úcolumnsc                    s    t t| ƒ ||¡ | jj| _d S r#   )ÚsuperrF   Ú__init__Úparent_propertyrH   ©Úselfr9   Ústrategy_key©Ú	__class__r+   r,   rJ   �   s    z#UninstrumentedColumnLoader.__init__Nc           	      K   s*   | j D ]}|r|j | }| ||¡ qd S r#   )rH   Ú_append_dedupe_col_collection)	rM   Úcompile_stateÚquery_entityÚpathÚloadoptÚadapterÚcolumn_collectionÚkwargsÚcr+   r+   r,   Úsetup_query”   s    


z&UninstrumentedColumnLoader.setup_queryc	           	      C   s   d S r#   r+   ©	rM   ÚcontextrS   rT   rU   r?   ÚresultrV   Ú
populatorsr+   r+   r,   Úcreate_row_processor£   s    z/UninstrumentedColumnLoader.create_row_processor)N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__rJ   rZ   r_   Ú__classcell__r+   r+   rO   r,   rF   …   s    ù
rF   Tc                       s>   e Zd ZdZdZ‡ fdd„Zddd„Zdd	„ Zd
d„ Z‡  Z	S )ÚColumnLoaderz8Provide loading behavior for a :class:`.ColumnProperty`.)rH   Úis_compositec                    s.   t t| ƒ ||¡ | jj| _t| jdƒ| _d S )NÚcomposite_class)rI   rf   rJ   rK   rH   Úhasattrrg   rL   rO   r+   r,   rJ   ¸   s    
zColumnLoader.__init__Fc	                 K   sj   | j D ]<}
|r6|r,| |
¡}
|
d kr6 d S n
|j |
 }
| |
|¡ q| j d }|r\|j | }||| j< d S ©Nr   )rH   Zadapt_check_presentrQ   rK   )rM   rR   rS   rT   rU   rV   rW   Úmemoized_populatorsZcheck_for_adaptrX   rY   Úfetchr+   r+   r,   rZ   ½   s    




zColumnLoader.setup_queryc                 C   s`   d| _ | jd j}| jjpD| jd jpD|jd k	oD|j |jd ¡| jk}t	| j|d|j
|d� d S )NTr   F)r1   r0   r4   )Úis_class_levelrH   ÚtyperK   r4   Úprimary_keyZversion_id_colÚ_columntopropertyr;   rC   Úcompare_values)rM   r?   Zcoltyper4   r+   r+   r,   Úinit_class_attributeÙ   s"    
ÿ
ÿû
ûz!ColumnLoader.init_class_attributec	                 C   sZ   | j D ]:}	|r|j |	 }	| |	d¡}
|
r|d  | j|
f¡  qVq|d  | jdf¡ d S )NFÚquickÚexpireT)rH   Ú_getterr7   r%   )rM   r\   rS   rT   rU   r?   r]   rV   r^   ÚcolÚgetterr+   r+   r,   r_   ï   s    

z!ColumnLoader.create_row_processor)F)
r`   ra   rb   rc   rd   rJ   rZ   rr   r_   re   r+   r+   rO   r,   rf   ±   s    ÷
rf   )Zquery_expressionc                       s4   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )	ÚExpressionColumnLoaderc                    s@   t t| ƒ ||¡ t ¡  d ¡‰ t‡ fdd„| jjD ƒƒ| _	d S )Nc                 3   s   | ]}|  ˆ ¡ V  qd S r#   )Úcompare©Ú.0rY   ©Únullr+   r,   Ú	<genexpr>  s    z2ExpressionColumnLoader.__init__.<locals>.<genexpr>)
rI   rx   rJ   r   r}   ÚlabelÚanyrK   rH   Ú_have_default_expressionrL   rO   r|   r,   rJ     s
    ÿzExpressionColumnLoader.__init__c                 K   s‚   d }	|r d|j kr |j d g}	n| jr.| jj}	|	d kr:d S |	D ]}
|rP|j|
 }
| |
|¡ q>|	d }|rt|j| }||| j< d S )NÚ
expressionr   )Ú
local_optsr�   rK   rH   rQ   )rM   rR   rS   rT   rU   rV   rW   rk   rX   rH   rY   rl   r+   r+   r,   rZ     s    

z"ExpressionColumnLoader.setup_queryc	                 C   sr   |rnd|j krn|j d g}	|	D ]:}
|r0|j|
 }
| |
d¡}|r|d  | j|f¡  qnq|d  | jdf¡ d S )Nr‚   Frs   rt   T)rƒ   rH   ru   r7   r%   )rM   r\   rS   rT   rU   r?   r]   rV   r^   rH   rv   rw   r+   r+   r,   r_   4  s    
z+ExpressionColumnLoader.create_row_processorc                 C   s(   d| _ t| j|d| jd jjdd� d S )NTFr   )r1   r0   Zaccepts_scalar_loader)rm   rC   rK   rH   rn   rq   ©rM   r?   r+   r+   r,   rr   N  s    ûz+ExpressionColumnLoader.init_class_attribute)r`   ra   rb   rJ   rZ   r_   rr   re   r+   r+   rO   r,   rx     s   rx   )rE   rD   )rE   rD   Ú	raiseload)Z
do_nothingc                       sN   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zdd
d„Zdd„ Z	dd„ Z
‡  ZS )ÚDeferredColumnLoaderzAProvide loading behavior for a deferred :class:`.ColumnProperty`.)rH   Úgroupr…   c                    sN   t t| ƒ ||¡ t| jdƒr&tdƒ‚| j dd¡| _| jj	| _	| jj
| _
d S )Nrh   z8Deferred loading for composite types not implemented yetr…   F)rI   r†   rJ   ri   rK   ÚNotImplementedErrorÚstrategy_optsr;   r…   rH   r‡   rL   rO   r+   r,   rJ   e  s    ÿ
zDeferredColumnLoader.__init__c	           
   
   C   sŽ   |j rB|jjjrB| j|jjjkrB| j d¡ ||||||||¡ nH| jsv| j	rX| jj
}	n| jj}	|d  | j|	f¡ n|d  | jdf¡ d S )N©)rE   F©rD   TÚnewrt   F)Úrefresh_stater
   Ú_compile_optionsZ_only_load_propsr%   rK   Ú_get_strategyr_   rm   r…   Z_raise_column_loaderZ_deferred_column_loaderr7   )
rM   r\   rS   rT   rU   r?   r]   rV   r^   Zset_deferred_for_local_stater+   r+   r,   r_   o  s4    ÿþýÿöÿÿz)DeferredColumnLoader.create_row_processorc                 C   s,   d| _ t| j|d| jd jj| jdd� d S )NTFr   )r1   r0   r3   Zload_on_unexpire)rm   rC   rK   rH   rn   rq   Ú_load_for_stater„   r+   r+   r,   rr   £  s    úz)DeferredColumnLoader.init_class_attributeNc	           
      K   s´   |j jr| jjs^|r2d|jkr2t| jƒ | jj	¡s^|rP| j
rP|j d| j
 d¡s^|r‚| j|kr‚| j d¡j|||||||f|	Ž n.| jr”t|| j< n| js¦t|| j< n
t|| j< d S )NZundefer_pkszundefer_group_%sFrŠ   )Úcompile_optionsZ_render_for_subqueryrK   Z_renders_in_subqueriesrƒ   ÚsetrH   Úintersectionr9   Z_should_undefer_in_wildcardr‡   r;   r%   r�   rZ   rm   r   r…   r   r   )
rM   rR   rS   rT   rU   rV   rW   rk   Úonly_load_propsr@   r+   r+   r,   rZ   ¯  sV    þýúù
ÿøóò ÿñííÿ÷
öz DeferredColumnLoader.setup_queryc                    sÎ   ˆj stjS |tj@ stjS ˆjj}ˆ jr@‡ fdd„|jD ƒ}nˆ j g}‡fdd„|D ƒ}t	ˆƒ}|d kr„t
 dt ˆ¡ˆ j f ¡‚ˆ jr˜ˆ  ˆ|d¡ tj|t |¡ t¡ˆj |ˆd�d krÈt
 ˆ¡‚tjS )Nc                    s4   g | ],}t |tƒrt |jtƒr|jˆ jkr|j‘qS r+   )Ú
isinstancer   Ústrategyr†   r‡   r%   )r{   Úp©rM   r+   r,   Ú
<listcomp>î  s
   
üz8DeferredColumnLoader._load_for_state.<locals>.<listcomp>c                    s   g | ]}|ˆ j kr|‘qS r+   )Z
unmodified)r{   Úk)Ústater+   r,   r™   ù  s     
 zfParent instance %s is not bound to a Session; deferred load operation of attribute '%s' cannot proceedÚraise)r”   r�   )r%   r   Ú
ATTR_EMPTYÚSQL_OKÚPASSIVE_NO_RESULTÚmanagerr?   r‡   Ziterate_propertiesr   Úorm_excÚDetachedInstanceErrorr$   Ú	state_strr…   Ú_invoke_raise_loadr   Zload_on_identr   ÚselectÚset_label_styler!   ZObjectDeletedErrorÚATTR_WAS_SET)rM   r›   ÚpassiveÚlocalparentZtoloadr‡   Úsessionr+   )rM   r›   r,   r�   ä  sD    

þþÿ
ÿù	÷ÿ
z$DeferredColumnLoader._load_for_statec                 C   s   t  d| f ¡‚d S )Nz+'%s' is not available due to raiseload=True©Úsa_excÚInvalidRequestError©rM   r›   r¨   Úlazyr+   r+   r,   r¤     s    ÿz'DeferredColumnLoader._invoke_raise_load)N)r`   ra   rb   rc   rd   rJ   r_   rr   rZ   r�   r¤   re   r+   r+   rO   r,   r†   Z  s   
4 ÷
52r†   c                   @   s(   e Zd ZdZddd„Zejfdd„ZdS )	ÚLoadDeferredColumnsz7serializable loader object used by DeferredColumnLoaderFc                 C   s   || _ || _d S r#   )r%   r…   )rM   r%   r…   r+   r+   r,   rJ     s    zLoadDeferredColumns.__init__c                 C   s>   | j }|jj}|j| }| jr$d}nd}| |¡}| ||¡S )N)©rE   Tr‹   )r…   T)r±   r‹   )r%   r    r?   r:   r…   r�   r�   )rM   r›   r¨   r%   r©   r(   rN   r–   r+   r+   r,   Ú__call__#  s    

zLoadDeferredColumns.__call__N)F)r`   ra   rb   rc   rJ   r   ÚPASSIVE_OFFr²   r+   r+   r+   r,   r°     s   
r°   c                       s$   e Zd ZdZdZ‡ fdd„Z‡  ZS )ÚAbstractRelationshipLoaderz0LoaderStratgies which deal with related objects.)r?   Útargetr/   Úentityc                    s>   t t| ƒ ||¡ | jj| _| jj| _| jj| _| jj| _d S r#   )rI   r´   rJ   rK   r?   r¶   rµ   r/   rL   rO   r+   r,   rJ   9  s
    


z#AbstractRelationshipLoader.__init__)r`   ra   rb   rc   rd   rJ   re   r+   r+   rO   r,   r´   4  s   r´   c                   @   s   e Zd ZdZdS )ÚDoNothingLoaderzßRelationship loader that makes no change to the object's state.

    Compared to NoLoader, this loader does not initialize the
    collection/attribute to empty/none; the usual default LazyLoader will
    take effect.

    N)r`   ra   rb   rc   r+   r+   r+   r,   r·   A  s   r·   Znoload)r¯   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚNoLoaderzYProvide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=None".

    r+   c                 C   s    d| _ t| j|d| jjd� d S )NT)r1   r2   )rm   rC   rK   Úcollection_classr„   r+   r+   r,   rr   X  s    üzNoLoader.init_class_attributec	           
         s$   ‡ fdd„}	|d   ˆ j|	f¡ d S )Nc                    s&   ˆ j rt | |ˆ j¡ n
d |ˆ j< d S r#   )r/   r   Úinit_state_collectionr%   ©r›   Údict_Úrowr˜   r+   r,   Úinvoke_no_loadm  s    z5NoLoader.create_row_processor.<locals>.invoke_no_loadrŒ   )r7   r%   )
rM   r\   rS   rT   rU   r?   r]   rV   r^   r¾   r+   r˜   r,   r_   b  s    zNoLoader.create_row_processorN)r`   ra   rb   rc   rd   rr   r_   r+   r+   r+   r,   r¸   M  s   
r¸   r¥   rœ   Úraise_on_sqlZbaked_selectc                       sp   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	ddd„Z
dd„ Ze d¡dd„ ƒZdd„ Z‡  ZS )Ú
LazyLoaderz|Provide loading behavior for a :class:`.RelationshipProperty`
    with "lazy=True", that is loads when first accessed.

    )Ú
_lazywhereÚ_rev_lazywhereZ_lazyload_reverse_optionÚ	_order_byÚuse_getÚis_aliased_classÚ_bind_to_colÚ_equated_columnsÚ_rev_bind_to_colÚ_rev_equated_columnsÚ_simple_lazy_clauseÚ_raise_alwaysÚ_raise_on_sqlc                    s<  t t| ƒ ||¡ | jd dk| _| jd dk| _t| jƒj| _| j	j
}| ¡ \| _| _| _|jdd�\| _| _| _| j	jr˜dd„ t | j	j¡D ƒ| _nd | _| j d| | j¡ | j oÞ| j oÞ| jjd	 j| jdd
| jjd�| _| j�r8t| jƒD ]4}|| jjkrô| jj| D ]}| j| | j|< �qqô| j d| ¡ d S )Nr¯   rœ   r¿   T)Zreverse_directionc                 S   s   g | ]}t  |d di¡‘qS )Ú
_orm_adaptT)Úsql_utilÚ_deep_annotate©r{   Úelemr+   r+   r,   r™   §  s   ÿz'LazyLoader.__init__.<locals>.<listcomp>z%s lazy loading clause %sr   F©Zuse_proxiesZcompare_keysÚequivalentsz4%s will use Session.get() to optimize instance loads)rI   rÀ   rJ   r‰   rË   rÌ   r   r¶   rÅ   rK   Ú_join_conditionZcreate_lazy_clauserÁ   rÆ   rÇ   rÂ   rÈ   rÉ   Úorder_byr   Úto_listrÃ   ÚloggerÚinfor/   Ú_get_clausery   r?   Ú_equivalent_columnsrÄ   Úlist)rM   r9   rN   Zjoin_conditionrv   rY   rO   r+   r,   rJ   ’  sP    ü
üþ

ÿüý ÿzLazyLoader.__init__c              	   C   sv   d| _ | jj}| jjr d}d}n4| jjtjk	s4| jsL|rBd}d}qTd}d}nd }}t| j|d| j	| jj
||d� d S )NTF)r1   r3   r2   r4   Ú_deferred_history)rm   rK   Ú_legacy_inactive_history_styler4   r>   r   Ú	MANYTOONErÄ   rC   r�   r¹   )rM   r?   rÝ   r4   rÜ   r+   r+   r,   rr   Ì  s2    ÿÿþùzLazyLoader.init_class_attributec                    sd   t  | jddi¡}|| j }‰ g ‰dd„ }t |i d|i¡ ‡ ‡fdd„}t |i d|i¡}|ˆfS )NrÍ   Tc                 S   s
   d| _ d S )NF)Úunique©Ú	bindparamr+   r+   r,   Úvisit_bindparamø  s    zFLazyLoader._memoized_attr__simple_lazy_clause.<locals>.visit_bindparamrá   c                    sF   | j ˆ kr$ˆ | jˆ | j  d f¡ n| jd krBˆ | jd | jf¡ d S r#   )Z_identifying_keyr7   r%   ÚcallableÚvaluerà   ©Zbind_to_colÚparamsr+   r,   râ   ý  s    
ýÿ
)rÎ   rÏ   rÁ   rÆ   r    ÚtraverseZcloned_traverse)rM   Z	lazywhereÚ	criterionrâ   r+   rå   r,   Ú"_memoized_attr__simple_lazy_clauseî  s     ÿ  ÿz-LazyLoader._memoized_attr__simple_lazy_clausec                 C   s²   | j \}}|d kr(t |dd„ |D ƒ¡S | jj}| ¡ }t |¡}|tj@ rV|tjN }i }|D ]J\}	}
}|
d k	r |r�|tj	@ r�| 
|||
|¡}n| |||
|¡}|||	< q^||fS )Nc                 S   s   g | ]\}}}|‘qS r+   r+   )r{   r%   Úidenträ   r+   r+   r,   r™     s     z4LazyLoader._generate_lazy_clause.<locals>.<listcomp>)rÊ   rÎ   Zadapt_criterion_to_nullrK   r9   Úobjr   Úinstance_dictZINIT_OKÚLOAD_AGAINST_COMMITTEDÚ#_get_committed_state_attr_by_columnÚ_get_state_attr_by_column)rM   r›   r¨   rè   Z
param_keysr?   Úor¼   ræ   r%   rê   rä   r+   r+   r,   Ú_generate_lazy_clause  s:    
 ÿ


   ÿ   ÿ
z LazyLoader._generate_lazy_clausec                 C   s   t  d| |f ¡‚d S )Nz&'%s' is not available due to lazy='%s'r«   r®   r+   r+   r,   r¤   /  s    
ÿzLazyLoader._invoke_raise_loadNr+   c           
      C   sŽ  |j s | jjs|jr|js tjS |j  }d }| jo>| p>|j }|tj	@ sN|r\|tj
@ sb|rbtjS | jrŽ|tj@ sŽ|r€|tj@ rŽ|  ||d¡ t|ƒ}|sÄ|tj@ rªtjS t dt |¡| j f ¡‚|�rz|  |||¡}tj|krètjS tj|krøtjS t |¡�rd S | j |jk�r(|tj@ �s(tjS |j| j|||d�}	|	d k	�r\|	tjk�rVd S |	S n|tj	@ �rt|tj@ �sztjS |  ||||||¡S )Nrœ   zbParent instance %s is not bound to a Session; lazy load operation of attribute '%s' cannot proceed)r¨   Zlazy_loaded_from) r%   rK   Zload_on_pendingZ_load_pendingZ
session_idr   r�   rÄ   Ú_extra_criteriarž   ZNON_PERSISTENT_OKrŸ   rË   ÚNO_RAISEZRELATED_OBJECT_OKr¤   r   r¡   r¢   r$   r£   Ú_get_ident_for_use_getZ	NEVER_SETr   Ú
issupersetÚdictÚDEFERRED_HISTORY_LOADr§   Z_identity_lookupr¶   ZPASSIVE_CLASS_MISMATCHÚ_emit_lazyload)
rM   r›   r¨   rU   Úextra_criteriaÚpendingÚprimary_key_identityrÄ   rª   Úinstancer+   r+   r,   r�   4  s–    þýûÿÿþüõô
þÿ  ÿ


ÿþü
ÿþúzLazyLoader._load_for_statec                    sD   ˆj j}ˆtj@ r|j‰n|j‰ˆj‰ ‡ ‡‡‡‡fdd„ˆjjD ƒS )Nc                    s"   g | ]}ˆˆˆ ˆj | ˆd �‘qS )©r¨   ©rÇ   ©r{   Úpk©r¼   Zget_attrr¨   rM   r›   r+   r,   r™   £  s   ÿz5LazyLoader._get_ident_for_use_get.<locals>.<listcomp>)r    r?   r   rí   rî   rï   rö   ro   )rM   rª   r›   r¨   Úinstance_mapperr+   r  r,   rô   ™  s    
þz!LazyLoader._get_ident_for_use_getzsqlalchemy.orm.strategy_optionsc                    sd  t jj‰ˆ j ¡ }tj|g|jtt	j
d�}tj}	|	d|dœ7 }	ˆ jjd k	r\| ˆ jˆ jj¡}|j }
|
sr|tj@ r‚t  ddi¡|_ˆ j}|js˜|rØ|jrØ|jˆ j }t|jƒ}|rÐ|jrÐd}|t ˆ j|¡f7 }||_n|jjˆ j }| jd|i7  _|�r2ˆ j �r |tj!@ �s ˆ  "||d¡ t#j$||||	d�S ˆ j%�rBˆ j%|_&‡ ‡fdd	„}| j'|ˆ jff7  _'ˆ  (||¡\}}d
|	i}ˆ j|j)k�rž|tj*@ �sžtj+S |
�r¾t  ,tj-| .¡ ¡�rÖd S nt  ,tj/| .¡ ¡�rÖd S ˆ j �rø|tj!@ �søˆ  "||d¡ |f|_0|j1|||d�}| 2¡  3¡  4¡ }ˆ j5�r,|S t6|ƒ}|�r\|dk�rTt  7dˆ j ¡ |d S d S d S )N)Ú_raw_columnsÚ_propagate_attrsÚ_label_stylerŽ   F)Z_invoke_all_eagersÚ_lazy_loaded_fromZ	autoflushÚ_current_pathr¿   )Úload_optionsc                    sR   ˆ j jD ]D}|jtjkr|jrt|jtƒsˆj	 
| jj|j ¡ |¡ | ¡ qd S r#   )rK   Z_reverse_propertyr>   r   rÞ   Z_use_getr•   r–   rÀ   ÚLoadZfor_existing_pathr‘   r  r9   ZlazyloadZprocess_compile_state)Úcompile_contextÚrev©rM   Zstrategy_optionsr+   r,   Ú_lazyload_reverseë  s     
ÿþ
ýÿÿüüz4LazyLoader._emit_lazyload.<locals>._lazyload_reverseZ_sa_orm_load_options)Úexecution_optionsr   zKMultiple rows returned with uselist=False for lazily-loaded attribute '%s' r   )8r   Z	preloadedZorm_strategy_optionsr¶   Ú__clause_element__r"   Ú_create_raw_selectr  r!   r   Údefault_compile_optionsr   Zdefault_load_optionsrK   Z	secondaryÚselect_fromr?   r%   r   ZNO_AUTOFLUSHZimmutabledictÚ_execution_optionsrÄ   r  rò   Z	load_pathÚtupler$   ÚLoaderCriteriaOptionÚ_with_optionsÚ_path_registryrŽ   rÌ   ró   r¤   r   Zload_on_pk_identityrÃ   Ú_order_by_clausesZ_with_context_optionsrñ   rö   r÷   r§   Zhas_intersectionr   ÚvaluesZ
_never_setZ_where_criteriaÚexecuterß   ZscalarsÚallr/   ÚlenÚwarn)rM   rª   r›   rû   r¨   rU   rù   ZclauseelementÚstmtr  rú   rÄ   Úeffective_pathr*   r  Zlazy_clauseræ   r  r]   Úlr+   r  r,   rø   ¨  s¦    

üþ ÿ

ÿ   ÿÿ ÿ
ÿþ  ÿ
þÿzLazyLoader._emit_lazyloadc	              
      s†   | j ‰ | jr|rV|jrVt |jtˆ | ||jr6| |¡nd ƒˆ ¡}	|d  | j |	f¡ n,|j	sb|j
r‚‡ fdd„}
|d  | j |
f¡ d S )NrŒ   c                    s   |   |ˆ ¡ d S r#   )Ú_resetr»   ©r%   r+   r,   Úreset_for_lazy_callableT  s    	z@LazyLoader.create_row_processor.<locals>.reset_for_lazy_callable)r%   rm   rò   r   Z"_instance_level_callable_processorr<   ÚLoadLazyAttributeÚ_generate_extra_criteriar7   Úpopulate_existingZalways_refresh)rM   r\   rS   rT   rU   r?   r]   rV   r^   Zset_lazy_callabler#  r+   r"  r,   r_   ,  s&    
ÿÿúôzLazyLoader.create_row_processor)Nr+   )r`   ra   rb   rc   rd   rJ   rr   ré   rñ   r¤   r�   rô   r   Zpreload_modulerø   r_   re   r+   r+   rO   r,   rÀ   v  s   :"! 
e
 rÀ   c                   @   s.   e Zd ZdZdd„ Zdd„ Zejfdd„ZdS )	r$  a¦  semi-serializable loader object used by LazyLoader

    Historically, this object would be carried along with instances that
    needed to run lazyloaders, so it had to be serializable to support
    cached instances.

    this is no longer a general requirement, and the case where this object
    is used is exactly the case where we can't really serialize easily,
    which is when extra criteria in the loader option is present.

    We can't reliably serialize that as it refers to mapped entities and
    AliasedClass objects that are local to the current process, which would
    need to be matched up on deserialize e.g. the sqlalchemy.ext.serializer
    approach.

    c                 C   s   || _ |j| _|| _|| _d S r#   ©r%   rN   rU   rù   )rM   r%   Zinitiating_strategyrU   rù   r+   r+   r,   rJ   t  s    zLoadLazyAttribute.__init__c                 C   s(   | j d k	rt d¡ | j| j| jddœS )NzvCan't reliably serialize a lazyload() option that contains additional criteria; please use eager loading for this caser+   r'  )rù   r   r  r%   rN   rU   r˜   r+   r+   r,   Ú__getstate__z  s    
ÿüzLoadLazyAttribute.__getstate__c                 C   s:   | j }|jj}|j| }|j| j }|j||| j| jd�S )N)rU   rù   )	r%   r    r?   r:   Z_strategiesrN   r�   rU   rù   )rM   r›   r¨   r%   r  r(   r–   r+   r+   r,   r²   ˆ  s    
üzLoadLazyAttribute.__call__N)	r`   ra   rb   rc   rJ   r(  r   r³   r²   r+   r+   r+   r,   r$  b  s   r$  c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )Ú
PostLoaderz;A relationship loader that emits a second SELECT statement.Nc                 C   sx   |j jptjj| }tj ||| j¡r*dS || j }|| j }| 	|j
d¡st|rd|jd |krtdS n| | j¡rtdS dS )NTÚloaderr   F)rR   Úcurrent_pathr$   ÚPathRegistryÚrootr   ÚPostLoadZpath_existsrK   Úcontainsr   ÚlengthÚcontains_mapperr?   )rM   r\   rT   Ú
join_depthr  Úpath_w_propZeffective_path_w_propr+   r+   r,   Ú_check_recursive_postload™  s$    þ  ÿ

z$PostLoader._check_recursive_postloadc	           	   
   C   s    | j  d¡ ||||||||¡S )N))r¯   Ú	immediate)rK   r�   r_   r[   r+   r+   r,   Ú#_immediateload_create_row_processor¯  s    ÿöz.PostLoader._immediateload_create_row_processor)N)r`   ra   rb   rc   r4  r6  r+   r+   r+   r,   r)  –  s   
r)  r5  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚImmediateLoaderr+   c                 C   s   | j  d¡ |¡ d S ©N©)r¯   r¥   ©rK   r�   rr   r„   r+   r+   r,   rr   Ì  s
    ÿþz$ImmediateLoader.init_class_attributec	           
         sL   ‡ ‡fdd„}	ˆ  ||¡r(tjtjB ‰ ntjtjB ‰ |d  ˆj|	f¡ d S )Nc                    s   |   ˆj¡ | |ˆ ¡ d S r#   )Úget_implr%   r;   r»   ©ÚflagsrM   r+   r,   Úload_immediateÜ  s    z<ImmediateLoader.create_row_processor.<locals>.load_immediateZdelayed)r4  r   ZPASSIVE_NO_FETCH_RELATEDró   r³   r7   r%   )
rM   r\   rS   rT   rU   r?   r]   rV   r^   r>  r+   r<  r,   r_   Ñ  s
    z$ImmediateLoader.create_row_processorN)r`   ra   rb   rd   rr   r_   r+   r+   r+   r,   r7  È  s   r7  Úsubqueryc                       sˆ   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚSubqueryLoader)r2  c                    s    t t| ƒ ||¡ | jj| _d S r#   )rI   r@  rJ   rK   r2  rL   rO   r+   r,   rJ   ð  s    zSubqueryLoader.__init__c                 C   s   | j  d¡ |¡ d S r8  r:  r„   r+   r+   r,   rr   ô  s
    ÿþz#SubqueryLoader.init_class_attributec                    sÀ   |}|j }t |d ¡}| j |¡rB| j|d krB| j| j ‰ }n||d  ‰ }|r–|j| jj| ‰t	|ƒt	ˆƒ }|ršˆt
j || d … ¡7 ‰n|‰|j}	‡ ‡fdd„|	D ƒ}
ˆ |
|ˆfS )Nr   r   c                    s&   g | ]}t ˆjd  jˆ j| jƒ‘qS ©r   )ÚgetattrrT   r¶   rp   r%   rz   ©Úleftmost_mapperZnew_subq_pathr+   r,   r™      s
   ü

þz0SubqueryLoader._get_leftmost.<locals>.<listcomp>)rT   r$   Z_class_to_mapperr9   ÚisarK   Ú	_entitiesÚentity_zeror  r  r   r,  ZcoerceÚlocal_columns)rM   Úorig_query_entity_indexÚ	subq_pathZcurrent_compile_stateÚis_rootZgiven_subq_pathZsubq_mapperZleftmost_propÚ
additionalZleftmost_colsÚleftmost_attrr+   rC  r,   Ú_get_leftmostù  s4    
ÿþÿþÿûzSubqueryLoader._get_leftmostc                 C   s2  |  ¡  d ¡}tj tj¡}|j |j¡ |}|js^d|_|j	j
|fdd„ t||d�D ƒžŽ  | dd„ |D ƒ| ¡ ¡}	|	|_|j}
|
dkr”d|_n:|
d krÎtdd	„ |	D ƒƒD ]}t|	ƒ |j¡s®d|_ qÎq®|jsÚd
|_|jdk�r|j�rt |	|j¡}|�r| |	| ¡ | t¡ ¡ }tj||dd�}|S )NFc                 S   s    h | ]}|d  dk	r|d  ’qS )r¶   Nr+   )r{   Zentr+   r+   r,   Ú	<setcomp>L  s   üz?SubqueryLoader._generate_from_original_query.<locals>.<setcomp>)rR   c                 S   s   g | ]}t j t jj|¡‘qS r+   )r   Z	coercionsÚexpectZrolesZColumnsClauseRole)r{   rð   r+   r+   r,   r™   c  s   ÿz@SubqueryLoader._generate_from_original_query.<locals>.<listcomp>Tc                 s   s   | ]}|j V  qd S r#   )Útablerz   r+   r+   r,   r~   r  s     z?SubqueryLoader._generate_from_original_query.<locals>.<genexpr>r+   ©Úuse_mapper_path)Z_cloneZ	correlater
   ÚQueryÚ__new__Ú__dict__ÚupdateZ	_from_objZ_enable_assertionsr  Znon_generativer   Z_adapt_col_listZ_get_current_adapterr  Údistinct_target_keyZ	_distinctr’   rõ   ro   Z_has_row_limiting_clauser  rÎ   Z expand_column_list_from_order_byZ_set_entitiesr¦   r!   r?  r$   ÚAliasedClass)rM   Úorig_compile_stateÚ
orig_queryrD  rM  Úleftmost_relationshipZorig_entityÚqÚq2Ztarget_colsrX  ÚtZto_addZembed_qÚ
left_aliasr+   r+   r,   Ú_generate_from_original_query*  s^    ÿ ÿþþþû ÿ  ÿz,SubqueryLoader._generate_from_original_queryc                    sÎ   g }t | ¡ ƒ}t|ƒD ]N\}\}}|dkrR||d  d j}| |¡rL|n|}	n|}	| |	|jf¡ qt|ƒdk rz|‰ n.t|d d ƒ}
|
j	r˜|
j
‰ ntj|
j
dd�‰ ˆjj}‡ ‡fdd„|D ƒ}||ˆ fS )	Nr   r   r   éÿÿÿÿTrR  c                    s    g | ]}t ˆ ˆjj| jƒ‘qS r+   )rB  r9   rp   r%   rz   ©Úparent_aliasrM   r+   r,   r™   ·  s   ÿz2SubqueryLoader._prep_for_joins.<locals>.<listcomp>)rÛ   ÚpairsÚ	enumerater?   rE  r7   r%   r  r   rÅ   r¶   r$   rY  rK   rH  )rM   r`  rJ  Úto_joinre  Úir?   r(   Zprev_mapperZ	to_appendrØ   Ú
local_colsÚ
local_attrr+   rc  r,   Ú_prep_for_joinsŽ  s,     ÿþzSubqueryLoader._prep_for_joinsc                 C   s0  t |ƒ}|dkr,t||d d ƒ |¡g}nê|dkrft||d d ƒ |¡t||d d ƒ |¡g}n°|dk�rdd„ |dd… D ƒ}g }|rØ| d¡}	t|	d |	d ƒ}
|rÂ|
 |d d ¡}
n
|
 |¡}
| |
¡ qŠt||d d ƒ |d j¡g| t||d d ƒ |¡g }|D ]}
| |
¡}�q|S )Nr   r   r   rb  c                 S   s:   g | ]2}t |d  ƒjs$t |d  ¡n|d  j|d f‘qS )r   r   )r   rÅ   r$   rY  r¶   )r{   Úitemr+   r+   r,   r™   Î  s   üÿüz/SubqueryLoader._apply_joins.<locals>.<listcomp>)r  rB  Úof_typeÚpopr7   r9   Újoin)rM   r]  rg  r`  rd  Úeffective_entityZltjÚmiddleÚinnerrl  Úattrr+   r+   r,   Ú_apply_joins½  sD    ÿÿþ

ù	

ÿÿÿþÿ
zSubqueryLoader._apply_joinsc           	      C   sB   |j }|r*|jr*|t | j| |¡¡f7 }| |¡}|j|Ž }|S r#   )r  rò   r$   r  r¶   r%  Z_with_current_pathÚoptions)	rM   r\   r]  rJ  Úrewritten_pathr[  rp  rU   Únew_optionsr+   r+   r,   Ú_setup_optionsò  s    
þÿ	

zSubqueryLoader._setup_optionsc                    s&   ˆ j jr"‡ fdd„}| |ˆ j ¡}|S )Nc                    s    |  j tt ˆ jj¡ƒ7  _ d S r#   ©Úeager_order_byr  r   rÖ   rK   rÕ   ©r
  r˜   r+   r,   Ú_setup_outermost_orderby  s    ÿzISubqueryLoader._setup_outermost_orderby.<locals>._setup_outermost_orderby)rK   rÕ   Ú_add_context_option)rM   r]  r|  r+   r˜   r,   r|    s     ÿz'SubqueryLoader._setup_outermost_orderbyc                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )zSubqueryLoader._SubqCollectionsz±Given a :class:`_query.Query` used to emit the "subquery load",
        provide a load interface that executes the query at the
        first moment a value is needed.

        ©rª   r  r  ræ   ÚsubqÚ_datac                 C   s4   |j | _ |j| _|j| _|jp i | _|| _d | _d S r#   r~  )rM   r\   r  r+   r+   r,   rJ   4  s    z(SubqueryLoader._SubqCollections.__init__c                 C   s    | j d kr|  ¡  | j  ||¡S r#   )r€  Ú_loadr;   )rM   r%   Údefaultr+   r+   r,   r;   >  s    
z#SubqueryLoader._SubqCollections.getc                 C   s„   t  t¡| _| j}|jd ks t‚| | j¡}| jj	r<| 
¡ }t| | j¡ƒ}t |dd„ ¡D ]"\}}| j|  dd„ |D ƒ¡ q\d S )Nc                 S   s   | dd … S )Nr   r+   ©Úxr+   r+   r,   r-   Q  ó    z7SubqueryLoader._SubqCollections._load.<locals>.<lambda>c                 s   s   | ]}|d  V  qdS )r   Nr+   ©r{   Zvvr+   r+   r,   r~   R  s     z8SubqueryLoader._SubqCollections._load.<locals>.<genexpr>)ÚcollectionsÚdefaultdictrÛ   r€  r  rª   ÚAssertionErrorZwith_sessionr  Z_populate_existingr&  ræ   Ú	itertoolsÚgroupbyÚextend)rM   r]  Úrowsrš   Úvr+   r+   r,   r�  C  s    z%SubqueryLoader._SubqCollections._loadc                 C   s   | j d kr|  ¡  d S r#   )r€  r�  )rM   r›   r¼   r½   r+   r+   r,   r*  T  s    
z&SubqueryLoader._SubqCollections.loaderN)	r`   ra   rb   rc   rd   rJ   r;   r�  r*  r+   r+   r+   r,   Ú_SubqCollections$  s   	
r�  c              	   C   sð  |j }|jjr|jjrd S |j |¡}d|_|| j }| |j	dd ¡}	|	d k	rT|	}
n| j
}
|jj dtjjtjjf¡\}}|tjjk}|| }|| }| |j	d¡sâ| jrÒ|jr¸|jjnd|j d | jkrâd S n| | j¡râd S |jj dtf|j¡}t |d¡}|j�r2|jjd k�r,t d	| |f ¡ |j}|j|d
d�}|   ||||¡\}}}}|  !||||||¡}t "|
¡}|j #dtf|d||fi¡|_| $d
¡}|  %||¡\}}}|j&|Ž }|  '|||||
¡}|  (||||||
|¡}|  )|¡}|S )NTÚpath_with_polymorphic)Zsubquery_pathsNr*  r   r   r[  ÚormzÙsubqueryloader for "%s" must invoke lambda callable at %r in order to produce a new query, decreasing the efficiency of caching for this statement.  Consider using selectinload() for more effective full-lambda cachingF)Úlegacy)*rR   r‘   Ú_enable_eagerloadsZ_for_refresh_staterF  ÚindexZloaders_require_bufferingrK   r;   r   r¶   r
   r  r$   r,  r-  r/  r2  r+  r0  r1  r?   r@  r   Z_get_plugin_class_for_pluginZ_is_lambda_elementr  r  r   r  Z	_resolvedZ_create_entities_collectionrN  ra  rT  ÚunionZ_set_enable_single_critrk  Zadd_columnsrt  rx  r|  )rM   r\   rS   rT   r¶   rU   rV   rR   rI  Úwith_poly_entityrp  rJ  rv  rK  r[  Zcompile_state_clsrZ  rD  rM  r\  r`  r]  rg  rj  rd  r+   r+   r,   Ú_setup_query_from_rowprocX  sÚ    	ÿþ
  ÿþÿ
ûùù ÿ ÿûÿ ÿ	üû
ú
  þÿ
 ÿ

    ÿù	
z(SubqueryLoader._setup_query_from_rowprocc	              
      s\  |j r|  ||||||ˆ |¡S |  ||| j¡r2d S t|jtƒsBd S | jj| j	 j
jsbt d|  ¡‚t|ƒdkr„t |j| j¡sšd S nt |d | j¡sšd S |  ||||d |ˆ ¡}	|	d kr¾d S |	jd ksÌt‚|| j }| jj}
| |jd¡}|d k�r|  ||	¡}| |jd|¡ ˆ �r*‡ fdd„|
D ƒ}
| j�rF|  ||||
|¡ n|  ||||
|¡ d S )NúJ'%s' does not support object population - eager loading cannot be applied.r   rb  r‡  c                    s   g | ]}ˆ j | ‘qS r+   rG   rz   ©rV   r+   r,   r™   =  s     z7SubqueryLoader.create_row_processor.<locals>.<listcomp>)r�   r6  r4  r2  r•   rR   r   r9   r<   r%   ÚimplÚsupports_populationr¬   r­   r  r$   Ú_entity_isarG  r—  rª   r‰  rK   rH  r;   r   r�  r’   r/   Ú_create_collection_loaderÚ_create_scalar_loader)rM   r\   rS   rT   rU   r?   r]   rV   r^   r  ri  r‡  r+   r™  r,   r_   ñ  sx    øÿÿ	ú	

    ÿ    ÿz#SubqueryLoader.create_row_processorc                    sp   |  |¡‰‡ ‡‡fdd„‰‡‡fdd„}|d  ˆjˆf¡ |d  ˆj|f¡ |jrl|d  ˆjˆ jf¡ d S )Nc                    s*   ˆ   ˆ|ƒd¡}|  ˆj¡ | ||¡ d S )Nr+   )r;   r;  r%   Úset_committed_value)r›   r¼   r½   Ú
collection©r‡  rM   Útuple_getterr+   r,   Úload_collection_from_subqM  s      ÿzKSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subqc                    s   ˆj |krˆ | ||ƒ d S r#   r"  r»   )r£  rM   r+   r,   Ú&load_collection_from_subq_existing_rowS  s    
zXSubqueryLoader._create_collection_loader.<locals>.load_collection_from_subq_existing_rowrŒ   ÚexistingÚeager©Z_tuple_getterr7   r%   Úinvoke_all_eagersr*  )rM   r\   r]   r‡  ri  r^   r¤  r+   )r‡  r£  rM   r¢  r,   r�  H  s    
ÿz(SubqueryLoader._create_collection_loaderc                    sp   |  |¡‰‡ ‡‡fdd„‰‡‡fdd„}|d  ˆjˆf¡ |d  ˆj|f¡ |jrl|d  ˆjˆ jf¡ d S )Nc                    sL   ˆ   ˆ|ƒd¡}t|ƒdkr*t dˆ ¡ |d }|  ˆj¡ | ||¡ d S )Nr#   r   úLMultiple rows returned with uselist=False for eagerly-loaded attribute '%s' r   )r;   r  r   r  r;  r%   rŸ  )r›   r¼   r½   r   Zscalarr¡  r+   r,   Úload_scalar_from_subqd  s    ÿÿzCSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subqc                    s   ˆj |krˆ | ||ƒ d S r#   r"  r»   )rª  rM   r+   r,   Ú"load_scalar_from_subq_existing_rowo  s    
zPSubqueryLoader._create_scalar_loader.<locals>.load_scalar_from_subq_existing_rowrŒ   r¥  r¦  r§  )rM   r\   r]   r‡  ri  r^   r«  r+   )r‡  rª  rM   r¢  r,   rž  _  s    
ÿz$SubqueryLoader._create_scalar_loader)r`   ra   rb   rd   rJ   rr   rN  ra  rk  rt  rx  r|  Úobjectr�  r—  r_   r�  rž  re   r+   r+   rO   r,   r@  ë  s   1d/5$4 Wr@  Zjoinedc                       sˆ   e Zd ZdZdZ‡ fdd„Zdd„ Zdd	d
„Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zd dd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )!ÚJoinedLoaderzcProvide loading behavior for a :class:`.RelationshipProperty`
    using joined eager loading.

    )r2  Ú_aliased_class_poolc                    s&   t t| ƒ ||¡ | jj| _g | _d S r#   )rI   r­  rJ   rK   r2  r®  rL   rO   r+   r,   rJ   †  s    
zJoinedLoader.__init__c                 C   s   | j  d¡ |¡ d S r8  r:  r„   r+   r+   r,   rr   ‹  s
    ÿþz!JoinedLoader.init_class_attributeNFc	                 K   s:  |j jsdS | jrd|_|| j }d}
|r:|  |||j¡nd}|dk	r`|  |||||¡\}}}n`| |jd¡sš| j	rŠ|j
d | j	kršdS n| | j¡ršdS |  ||||||||¡\}}}}d|_| |jdd¡}|dk	rät|ƒj}
nd}
|| j }tj|| j|||||
| j|d�	 |dk	�r6dt|jƒk�r6t d¡‚dS )	z@Add a left outer join to the statement that's being constructed.NTFr*  r   r�  )Úwith_polymorphicÚparentmapperÚchained_from_outerjoinz–Detected unaliased columns when generating joined load.  Make sure to use aliased=True or flat=True when using joined loading with with_polymorphic().)r‘   r“  r/   Úmulti_row_eager_loadersrK   Ú_init_user_defined_eager_procr   Ú$_setup_query_on_user_defined_adapterr/  r2  r0  r1  r?   Ú_generate_row_adapterZeager_adding_joinsr;   r   Zwith_polymorphic_mappersr¶   r   Z_setup_entity_queryr’   Úsecondary_columnsr¬   r­   )rM   rR   rS   rT   rU   rV   rW   r°  r±  rX   r¯  Úuser_defined_adapterÚclausesÚadd_to_collectionr–  r+   r+   r,   rZ   �  sš    
ý  ÿûûüýøû  ÿÿ
÷ÿÿzJoinedLoader.setup_queryc           
      C   sÐ   d|j krdS |jj}| |jdd¡}|dk	r2|S |j d }|dd … \}}|d k	r~t|tƒrj|j |¡}t	j
||jjd�}n@| |jd¡r®| |jd¡}	tj|	|jjd�}n|j |jd ¡}| |d|¡ |S )NZeager_from_aliasFÚ user_defined_eager_row_processoréþÿÿÿ)rÓ   r�  )rƒ   rT   r9   r;   r   r•   Ústrrµ   ÚaliasrÎ   ZColumnAdapterr?   rÚ   r/  r$   Ú
ORMAdapterZ_polymorphic_adaptersr’   )
rM   rU   rR   Ztarget_attributesrT   rV   r½  Zroot_mapperr(   r–  r+   r+   r,   r³    sR    
  ÿ

 ÿ ÿ ÿþ ÿýz*JoinedLoader._init_user_defined_eager_procc                 C   sV   |  |¡}|r.|r.| |¡}| |jd|¡ n|rF|}| |jd|¡ |j}|||fS )Nrº  )Z_get_entity_clausesÚwrapr’   r   Úprimary_columns)rM   r\   r¶   rT   rV   r·  r¹  r+   r+   r,   r´  8  s"    

ýýz1JoinedLoader._setup_query_on_user_defined_adapterc                 C   s°   t | jƒjrt | jƒj}nd }d| f}||jkr@d |j|< }n|j| d  |j|< }|t| jƒkr¦tj| j	|d k	r‚|j
dd�nd ddd�}t |ƒjj | j |¡ | j| S )NZjoinedloader_acr   r   T)Úflat)r½  rÁ  rS  )r   r¶   rÅ   Ú
selectabler   r  r®  r$   rY  r?   Z_anonymous_fromclauserY   r7   )rM   r\   Zalt_selectabler%   ÚidxÚto_adaptr+   r+   r,   Ú_gen_pooled_aliased_classR  s&    
ÿúz&JoinedLoader._gen_pooled_aliased_classc	                 C   sÎ   |  |jdd ¡}	|	r|	}
n
|  |¡}
t|
ƒjd| ftj|
| jjdddd�}|j	d k	sXt
‚|d k	rr|j  d| jj¡n| jj}|s‚d}|j | j||||||||r¤|jndf	¡ |j}| |jd|¡ ||||fS )	Nr�  Zjoinedloader_ormadapterTF)rÓ   Zadapt_requiredZallow_label_resolveZanonymize_labelsÚ	innerjoinr+   Úeager_row_processor)r;   r   rÅ  r   Z_memor$   r¾  r?   rÚ   Úaliased_classr‰  rƒ   rK   rÆ  Zcreate_eager_joinsr7   Ú_create_eager_joinrò   r¶  r’   )rM   rR   r¶   rT   rU   rV   rW   r°  r±  r–  rÄ  r¸  rÆ  r¹  r+   r+   r,   rµ  t  sN      ÿ
ù
ÿý÷ÿz"JoinedLoader._generate_row_adapterc
              	      s`  |d kr|j }
n|}
|jo|j}d }||jkr~|s~|jr~t |j|j¡}t|ƒdkr^t	 
d¡‚|r~|j|d  }|d | }}|d kr’||j }}|j ||¡}|�r
t|dd ƒrèt|jƒ |
 ˆ j¡rÌ|
nˆ j¡}t|jˆ jˆ jƒ}n ttjˆ j|jdd�ˆ jˆ jƒ}nˆ j}|jd k	�s t‚| �p@| �p@|dk�p@|jj}|	}|j dˆ j fd	¡}|�rz|t‡ fd
d„|D ƒƒ7 }|�rÀtj||j|| �p®|jj�p®|�o®t|tj ƒˆ jˆ j |d�}nˆ  !|||||¡}||j|< |j|_"|�s.t #ˆ jj$¡D ]4}|
j%j& '|¡�rø|�r|j(| }| )||j*¡ �qøˆ jj+�r\| j,t|j- .t/ 0ˆ jj+¡¡ƒ7  _,d S )Nr   z€Can't identify which query entity in which to joined eager load from.   Please use an exact match when specifying the join path.r   rÈ  TrR  ZunnestedÚadditional_entity_criteriar+   c                 3   s    | ]}|j r| ˆ j¡V  qd S r#   )Zpropagate_to_loadersZ_resolve_where_criteriar?   )r{   Zaer˜   r+   r,   r~   	  s   þz2JoinedLoader._create_eager_join.<locals>.<genexpr>©ÚisouterÚ
_left_memoÚ_right_memorò   )1r?   r²  Z_should_nest_selectableZeager_joinsZfrom_clausesrÎ   Z#find_left_clause_that_matches_givenrÂ  r  r¬   r­   Ú
setdefaultrB  r   rÈ  Z_entity_for_mapperrE  r9   r¶   r%   rK   r$   rY  r‰  rG  Zrepresents_outer_joinZglobal_attributesr;   r  Ú_ORMJoinr•   r   ZJoinÚ_splice_nested_inner_joinZstop_onZ_find_columnsZprimaryjoinZpersist_selectablerY   Zcontains_columnrH   rQ   rÀ  rÕ   rz  Ú_target_adapterZcopy_and_processr   rÖ   )rM   rR   rS   rT   rV   r°  r¸  rÆ  r±  rù   r©   Zshould_nest_selectableZquery_entity_keyZindexesZclauseZdefault_towrapZtowrapZefmÚonclauseZattach_on_outsideZextra_join_criteriarÊ  Ú	eagerjoinrv   r+   r˜   r,   rÉ  ±  sÔ    þÿþý ÿÿþ ÿ

ÿý  ÿû	ÿþü ÿþ
ÿ÷    ÿ
ÿ
 ÿ
ÿÿzJoinedLoader._create_eager_joinc           
   	   C   s<  |dkrt |tjƒszt‚n`t |tjjƒr>|  ||j||||¡S t |tjƒsz|d |krvtj||j	|d||d j
|d�S d S |  ||j||||j¡}|d krÔd}|  ||j||||j¡}|d krØ|dk	sÎtdƒ‚d S nd}|�r|jsö|jsö| |¡}	ntj|j||j|j|jd�}	ntj||j|j|j|jd�}	|j|	_|	S )	NFr»  rb  rË  z9assertion failed attempting to produce joined eager loadsT)rÌ  rÍ  )rÌ  rÎ  )r•   r$   rÐ  r‰  r   rÂ  ZFromGroupingrÑ  ÚelementrÈ  r?   ÚrightrÎ  ÚleftrÍ  rÌ  Z_splice_into_centerrÓ  rÒ  )
rM   rT   Zjoin_objr¸  rÓ  rù   ZsplicingZtarget_joinZright_splicerÔ  r+   r+   r,   rÑ  Q	  s†    úùúúÿþûûz&JoinedLoader._splice_nested_inner_joinc           	      C   s„   |j }|r|  |||j¡nd}|dk	rP|}|jrB|rB| |j¡}qj|jrj|j}n| |jd¡}|d krjdS | j ||¡r||S dS d S )NFrÇ  )rR   r³  r   Zcompound_eager_adapterr¿  r;   r?   Z_result_has_identity_key)	rM   r\   r]   rV   rT   rU   rR   r·  Ú	decoratorr+   r+   r,   Ú_create_eager_adapter§	  s4    ý  ÿû
ÿ ÿz"JoinedLoader._create_eager_adapterc	              
   C   sÀ   | j j| j jjs t d|  ¡‚| jr,d|_|| j	 }	|  
||||	|¡}
|
dk	rœ| j}t || j|||	| j |
¡}| jsŠ|  ||||¡ q¼|  ||||¡ n | j	 d¡ ||||||||¡ d S )Nr˜  TFr9  )r9   r<   r%   rš  r›  r¬   r­   r/   Zloaders_require_uniquingrK   rÙ  r   Z_instance_processorr?   r¶   rž  r�  r�   r_   )rM   r\   rS   rT   rU   r?   r]   rV   r^   Zour_pathZeager_adapterr%   Ú	_instancer+   r+   r,   r_   Ë	  s\    ÿÿ
    ÿú	   ÿÿöz!JoinedLoader.create_row_processorc                    sr   ‡ ‡‡fdd„}‡ ‡‡fdd„}‡ fdd„}|d   | j|f¡ |d   | j|f¡ ˆjrn|d	   | j|f¡ d S )
Nc                    sF   t  | |ˆ¡}t |d¡}|ˆj | ˆf< ˆ |ƒ}|d k	rB| |¡ d S ©NZappend_without_event©r   rº   r   ZUniqueAppenderr7   )r›   r¼   r½   r   Úresult_listÚinst©rÚ  r\   r%   r+   r,   Ú#load_collection_from_joined_new_row
  s     ÿzSJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_new_rowc                    sd   | ˆfˆj krˆj | ˆf }n(t  | |ˆ¡}t |d¡}|ˆj | ˆf< ˆ |ƒ}|d k	r`| |¡ d S rÛ  rÜ  )r›   r¼   r½   rÝ  r   rÞ  rß  r+   r,   Ú(load_collection_from_joined_existing_row
  s      ÿ ÿzXJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_existing_rowc                    s   ˆ |ƒ d S r#   r+   r»   ©rÚ  r+   r,   Ú load_collection_from_joined_exec&
  s    zPJoinedLoader._create_collection_loader.<locals>.load_collection_from_joined_execrŒ   r¥  r¦  ©r7   r%   r¨  )rM   r\   r%   rÚ  r^   rà  rá  rã  r+   rß  r,   r�  
  s    ÿÿÿz&JoinedLoader._create_collection_loaderc                    sp   ‡ ‡fdd„}‡ ‡‡fdd„}‡ fdd„}|d   ˆj|f¡ |d   ˆj|f¡ |jrl|d	   ˆj|f¡ d S )
Nc                    s   ˆ |ƒ|ˆ< d S r#   r+   r»   )rÚ  r%   r+   r,   Úload_scalar_from_joined_new_row5
  s    zKJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_new_rowc                    s8   ˆ |ƒ}ˆ|kr,||ˆ k	r4t  dˆ ¡ n||ˆ< d S )Nr©  )r   r  )r›   r¼   r½   r¥  ©rÚ  r%   rM   r+   r,   Ú$load_scalar_from_joined_existing_row:
  s    þÿ	zPJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_existing_rowc                    s   ˆ |ƒ d S r#   r+   r»   râ  r+   r,   Úload_scalar_from_joined_execM
  s    zHJoinedLoader._create_scalar_loader.<locals>.load_scalar_from_joined_execrŒ   r¥  r¦  rä  )rM   r\   r%   rÚ  r^   rå  rç  rè  r+   ræ  r,   rž  4
  s    ÿÿz"JoinedLoader._create_scalar_loader)NNF)F)r`   ra   rb   rc   rd   rJ   rr   rZ   r³  r´  rÅ  rµ  rÉ  rÑ  rÙ  r_   r�  rž  re   r+   r+   rO   r,   r­  {  s(      ÷
s5"= " ÿ
V$:/r­  Zselectinc                	       s|   e Zd ZdZe dddddddg¡Zd	Z‡ fd
d„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚSelectInLoader)r2  Ú	omit_joinÚ_parent_aliasÚ_query_infoÚ_fallback_query_infoZ	queryinfoÚload_only_childÚload_with_joinÚin_exprÚpk_colsÚzero_idxÚchild_lookup_colsiô  c                    s¸   t t| ƒ ||¡ | jj| _| jjtjk}| jjd k	rB| jj| _n<| j 	d¡}|r\|j
| _n"| jjd j|jdd| jjd�| _| jrª|rž|  ¡ | _|  ¡ | _q´|  ¡ | _n
|  ¡ | _d S )Nr9  r   TFrÒ   )rI   ré  rJ   rK   r2  r>   r   rÞ   rê  r�   rÄ   r9   rÙ   ry   rÂ   rÚ   Ú_init_for_omit_join_m2orì  Ú_init_for_joinrí  Ú_init_for_omit_join)rM   r9   rN   Zis_m2oÚ
lazyloaderrO   r+   r,   rJ   s
  s,    
ÿ
ü
zSelectInLoader.__init__c                    s‚   t ˆjjjƒ‰ ˆ  ‡ ‡fdd„tˆ ƒD ƒ¡ ‡ fdd„ˆjjD ƒ }}t|ƒdkrbt	j
|Ž }d}n|d }d}ˆ dd|||d ¡S )	Nc                 3   s0   | ](}ˆj j |d ¡D ]}|ˆ | fV  qqdS )r+   N)r9   rÚ   r;   )r{   rš   Úequiv©Úpk_to_fkrM   r+   r,   r~   •
  s    þz5SelectInLoader._init_for_omit_join.<locals>.<genexpr>c                    s   g | ]}|ˆ krˆ | ‘qS r+   r+   ©r{   rv   )rú  r+   r,   r™   ›
  s     z6SelectInLoader._init_for_omit_join.<locals>.<listcomp>r   Fr   T)rö   rK   rÔ   Zlocal_remote_pairsrW  rÛ   r9   ro   r  r   Útuple_Ú
query_info)rM   rñ  Zfk_colsrð  rò  r+   rù  r,   rö  ‘
  s    ÿþ
ÿ

z"SelectInLoader._init_for_omit_joinc                    sb   | j j}t|ƒdkr$tj|Ž }d}n|d }d}| j d¡‰ ‡ fdd„|D ƒ}|  dd||||¡S )Nr   Fr   Tr9  c                    s   g | ]}ˆ j | ‘qS r+   rþ   rÿ   ©r÷  r+   r,   r™   ±
  s     z:SelectInLoader._init_for_omit_join_m2o.<locals>.<listcomp>)r?   ro   r  r   rü  rK   r�   rý  )rM   rñ  rð  rò  Zlookup_colsr+   rþ  r,   rô  §
  s     
     ÿz&SelectInLoader._init_for_omit_join_m2oc                    sj   t | jjƒ| _t| jƒ‰ ‡ fdd„| jjD ƒ}t|ƒdkrJtj|Ž }d}n|d }d}|  	dd|||d ¡S )Nc                    s   g | ]}ˆ   |¡‘qS r+   ©Ú_adapt_elementrû  ©Zpa_inspr+   r,   r™   º
  s    z1SelectInLoader._init_for_join.<locals>.<listcomp>r   Fr   T)
r   r9   r=   rë  r   ro   r  r   rü  rý  )rM   rñ  rð  rò  r+   r  r,   rõ  ·
  s    

ÿ
zSelectInLoader._init_for_joinc                 C   s   | j  d¡ |¡ d S r8  r:  r„   r+   r+   r,   rr   Å
  s
    ÿþz#SelectInLoader.init_class_attributec	              
   C   sò   |j r|  ||||||||¡S |  ||| j¡r2d S | jj| j jjsRt	 
d|  ¡‚t|ƒdkrtt |j| j¡sŠd S nt |d | j¡sŠd S |jjp˜tjj| }	|| j }
|
 |jdd ¡}|d k	rÊt|ƒ}n| j}tj ||	| j| j| j||¡ d S )Nr˜  r   rb  r�  )r�   r6  r4  r2  r9   r<   r%   rš  r›  r¬   r­   r  r$   rœ  rG  rR   r+  r,  r-  rK   r;   r   r   r¶   r   r.  Zcallable_for_pathÚ_load_for_path)rM   r\   rS   rT   rU   r?   r]   rV   r^   Zselectin_pathr3  r–  rp  r+   r+   r,   r_   Ê
  sZ    ø
ÿÿ	þ
  ÿ
ùz#SelectInLoader.create_row_processorc                    sž  |rˆj |krd S ˆj}|jr¤t t¡}g }	ˆj‰|D ]l\‰}
ˆj‰t‡‡‡fdd„|j	D ƒƒ}t
j|krtˆj} q¤d |kr’||  ˆˆ|
f¡ q6|	 ˆˆ|
f¡ q6|js¸dd„ |D ƒ}|j}|j}|jsìˆjrì‡fdd„|D ƒ}ˆ |¡}tjd|žŽ }| ¡ }ˆ ¡ }tj||gttjdˆdœd	�}|j�s<| ˆ¡}n$| ˆj¡ tˆjˆjj ƒ  ˆ¡¡}| !| "t# $d
¡¡¡}ˆ j%j&}|ˆj }|ˆ j'k�rœ|j(}n&|j(}ˆ j'j(}‡ fdd„t)||ƒD ƒ}|�rè|j*�rè|t +ˆ| ,ˆ ¡¡f7 }|j-|Ž }| .d|i¡}ˆ j/�r|j0dd�}ˆjj1�rn|j�sTˆjj1}ˆj�rH‡fdd„|D ƒ}|j1|Ž }n‡fdd„}| 2|ˆj¡}|j�rŠˆ 3||	||ˆ ¡ nˆ 4|||ˆ ¡ d S )Nc                 3   s"   | ]}ˆ j ˆˆ|tjd �V  qdS )rý   N)rï   r   ZPASSIVE_NO_FETCH)r{   Zlk)r?   r›   Ú
state_dictr+   r,   r~     s   úüz0SelectInLoader._load_for_path.<locals>.<genexpr>c                 S   s$   g | ]\}}|j d  ||j|f‘qS )r   )r%   rö   )r{   r›   Ú	overwriter+   r+   r,   r™   ;  s   ÿz1SelectInLoader._load_for_path.<locals>.<listcomp>c                    s   g | ]}ˆ   |¡‘qS r+   rÿ  rû  ©rp  r+   r,   r™   K  s    r   r‘  )Zcompile_state_pluginZplugin_subject)r  r  rŽ   r  Úprimary_keysc                    s   g | ]\}}|  ˆ |¡‘qS r+   )Z'_adapt_cached_option_to_uncached_option)r{   Zorig_optZuncached_opt)r\   r+   r,   r™   �  s
   ý ÿr  T)r&  c                    s   g | ]}ˆ   |¡‘qS r+   rÿ  rÐ   r  r+   r,   r™   ¸  s   ÿc                    s    |  j tt ˆ jj¡ƒ7  _ d S r#   ry  r{  r˜   r+   r,   r|  ¿  s    ÿz?SelectInLoader._load_for_path.<locals>._setup_outermost_orderby)r   )5r%   rì  rî  r‡  rˆ  rÛ   r9   rö   r  ró  r   rŸ   rí  r7   rñ  rð  rï  rÅ   r   r$   ZBundler  r"   r  r!   r   r  r  rë  ro  rB  rK   rm  ÚfilterZin_r   rá   rR   Zselect_statementr
   r  Úziprò   r  r%  ru  Z_update_compile_optionsr&  r  rÕ   r}  Ú_load_via_childÚ_load_via_parent)rM   r\   rT   ZstatesÚ	load_onlyrp  rU   rý  Ú
our_statesÚnone_statesr  Zrelated_identrñ  rð  Z
bundle_entZ
bundle_sqlZ
entity_sqlr]  r[  r  rw  Zcached_optionsZuncached_optionsrz  r|  r+   )r\   rp  r?   rM   r›   r  r,   r    sÀ    
ù
ÿþ
ÿ
þü
ÿÿ

 ÿü	þÿ


þ ÿ    ÿzSelectInLoader._load_for_pathc                    sô   | j }t|ƒ}|rº|d| j… }|| jd … }dd„ |jj|d‡ fdd„|D ƒid� ¡ D ƒ}	|D ]T}
|	 |
d ¡}||
 D ]:\}}}|s”| j|kr”qz| | j¡ 	|||s¬|n|g¡ qzqbq|D ]0\}}}|sØ| j|krØq¾| | j¡ 	||d ¡ q¾d S )Nr   c                 S   s   i | ]\}}||“qS r+   r+   )r{   rš   rŽ  r+   r+   r,   Ú
<dictcomp>×  s   ÿ z2SelectInLoader._load_via_child.<locals>.<dictcomp>r  c                    s   g | ]}ˆ j r|d  n|‘qS rA  ©rò  )r{   r%   ©rý  r+   r,   r™   Ü  s   ÿz2SelectInLoader._load_via_child.<locals>.<listcomp>©ræ   )
r/   ÚsortedÚ
_chunksizerª   r  rß   r;   r%   r;  rŸ  )rM   r  r  rý  r]  r\   r/   Zour_keysÚchunkÚdatar%   Zrelated_objr›   r¼   r  r+   r  r,   r	  Ï  s:     
þÿþþý
zSelectInLoader._load_via_childc                    s"  | j }|rdnd }|�r|d| j… }|| jd … }‡ fdd„|D ƒ}t t¡}	t |jj|d|id� 	¡ dd„ ¡D ] \}
}|	|
  
d	d
„ |D ƒ¡ qt|D ]€\}}}}|s¶| j|kr¶qš|	 ||¡}|�s|�rt|ƒdkrèt d|  ¡ | | j¡ |||d ¡ qš| | j¡ |||¡ qšqd S )Nr+   r   c                    s&   g | ]\}}}}ˆ j r|d  n|‘qS rA  r  )r{   r%   r›   r  r  r  r+   r,   r™     s   
ÿz3SelectInLoader._load_via_parent.<locals>.<listcomp>r  r  c                 S   s   | d S rj   r+   rƒ  r+   r+   r,   r-     r…  z1SelectInLoader._load_via_parent.<locals>.<lambda>c                 s   s   | ]}|d  V  qdS )r   Nr+   r†  r+   r+   r,   r~     s     z2SelectInLoader._load_via_parent.<locals>.<genexpr>r   r©  )r/   r  r‡  rˆ  rÛ   rŠ  r‹  rª   r  rß   rŒ  r%   r;   r  r   r  r;  rŸ  )rM   r  rý  r]  r\   r/   Z_empty_resultr  r  r  rš   rŽ  r%   r›   r  r  r   r+   r  r,   r
  ý  sL    
þ
 ÿüþÿ  ÿ  ÿzSelectInLoader._load_via_parent)r`   ra   rb   rd   r‡  Ú
namedtuplerý  r  rJ   rö  rô  rõ  rr   r_   r  r	  r
  re   r+   r+   rO   r,   ré  Z
  s,   úþD B.ré  c                    sT   ‡fdd„‰ ‡ fdd„}‡ fdd„}t j| d|dddd	� t j| d
|dddd	� d S )Nc                    sT   |d k	rP|j ˆ j krP| t |¡¡}|rP||k	rPtjdt |¡| jˆ f dd�‚|S )NzsInstance %s is already associated with an instance of %s via its %s attribute, and is only allowed a single parent.Zbbf1)Úcode)	r%   Ú	hasparentr   Zinstance_stater¬   r­   r$   Zinstance_strr=   )r›   rä   ÚoldvalueÚ	initiatorr  )r(   r+   r,   Ú	_do_check-  s    ýûz*single_parent_validator.<locals>._do_checkc                    s   ˆ | |d |ƒS r#   r+   )r›   rä   r  ©r  r+   r,   r7   :  s    z'single_parent_validator.<locals>.appendc                    s   ˆ | |||ƒS r#   r+   )r›   rä   r  r  r  r+   r,   Úset_=  s    z%single_parent_validator.<locals>.set_r7   T)ÚrawÚretvalr4   r’   )r   Úlisten)r'   r(   r7   r  r+   )r  r(   r,   r8   ,  s         ÿr8   )NNNNFN)Drc   Ú
__future__r   r‡  rŠ  Ú r   r   r¡   r   r   r   r	   r
   r   r   r   r$   Úbaser   r   r   r\   r   r   r   r   r   r   rª   r   r›   r   r   r   r   r¬   r   r   r   rÎ   r    Zsql.selectabler!   r"   rC   ZColumnPropertyZstrategy_forrF   Zclass_loggerrf   rx   r†   r¬  r°   r´   ZRelationshipPropertyr·   r¸   ZMemoizedSlotsrÀ   r$  r)  r7  r@  r­  ré  r8   r+   r+   r+   r,   Ú<module>   sØ         ÷
S+UP  ÿ =
&    i42"          a   S