
    +hi                     P   d 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 Z	d	 Z
 G d
 de      Z G d de      Z G d de      Z G d de      Z G d dee      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zy )!zThe internals for the unit of work system.

The session's flush() process passes objects to a contextual object
here, which assembles flush tasks based on mappers and their properties,
organizes them in order of dependency, and executes.

   
attributes)exc)util   )event)topologicalc                 h    t        j                  d| j                  j                  d|dd       y )N"zY" object is being merged into a Session along the backref cascade path for relationship "z"; in SQLAlchemy 2.0, this reverse cascade will not take place.  Set cascade_backrefs to False in either the relationship() or backref() function for the 2.0 behavior; or to set globally for the whole Session, set the future=True flags9r1)code)r   warn_deprecated_20class___name__)stateprops     L/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py_warn_for_cascade_backrefsr      s,     05||/D/Dd	L     c                 
   |j                   fd}fd}fd}t        j                  | d|d       t        j                  | d|dd       t        j                  | d	|dd       t        j                  | d
|dd       y)z\Establish event listeners on object attributes which handle
    cascade-on-set/append.

    c                    |y | j                   }|r|j                  r|j                  d       | j                  j                  j
                     }t        j                  |      }|j                  j                  rd|j                  r|j                  r|j                  k(  r=|j                  |      s,|j                  k7  rt        ||       |j                  |       |S )Nzcollection append)session_warn_on_events_flush_warningmanagermapper_propsr   instance_state_cascadesave_updatecascade_backrefsfuturekey_contains_stater   _save_or_update_stater   item	initiatorsessr   
item_stater#   s         r   appendz$track_cascade_events.<locals>.append+   s     <}}####$78==''..s3D#2248J ))**4;;imm+,,Z8)--'.z4@**:6r   c                    |y | j                   }| j                  j                  j                     }|r+|j                  r|j                  |j                  rdnd       ||t        j                  ur|t        j                  urr|j                  j                  r[t        j                  |      }|j                  j                  |      r*|r ||j                  v r|j                  |       y d|_        y y y y y y )Nzcollection removezrelated attribute deleteT)r   r   r   r   r   r   uselistr   	NEVER_SETPASSIVE_NO_RESULTr   delete_orphanr   
_is_orphan_newexpunge_orphaned_outside_of_sessionr&   s         r   removez$track_cascade_events.<locals>.removeG   s    <}}}}##**3/D((<< $/ J000J888++ $2248J{{%%j1J$))3LL& ?CJ; 2 , 9 1 r   c                    ||u r|S | j                   }|r\|j                  r|j                  d       | j                  j                  j
                     }|t        j                  |      }|j                  j                  rd|j                  r|j                  r|j                  k(  r=|j                  |      s,|j                  k7  rt        ||       |j                  |       ||t        j                   urw|t        j"                  ure|j                  j$                  rOt        j                  |      }||j&                  v r,|j                  j)                  |      r|j+                  |       |S )Nzrelated attribute set)r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r   r%   r.   r/   r0   r2   r1   r3   )	r   newvalueoldvaluer(   r)   r   newvalue_stateoldvalue_stater#   s	           r   set_z"track_cascade_events.<locals>.set_i   s6    xO}}####$;<==''..s3D#!+!:!:8!DMM--..t{{)--/ 00@imm+2>4H..~> $J$8$88J$@$@@MM// ",!:!:8!D!TYY.4;;3I3I"4 LL*r   append_wo_mutationT)rawr+   )r=   retvalr5   setN)r#   r   listen)
descriptorr   r+   r5   r;   r#   s        @r   track_cascade_eventsrB   $   sq    
 ((C8 CD(T 
LL16tD	LLXv4E	LLXv4E	LLUDd4@r   c                       e Zd Zd Zed        Zd Zd Zd Zd Z	e
j                  fdZd Zd	 Z	 	 	 	 	 ddZd Zd Zej&                  d        Zd Zd Zd Zd Zd Zy
)UOWTransactionc                    || _         i | _        t        j                  t              | _        t        j                  t              | _        i | _        i | _        t	               | _	        i | _
        t        j                  d       | _        y )Nc                  *    t               t               fS N)r?    r   r   <lambda>z)UOWTransaction.__init__.<locals>.<lambda>   s    CE35> r   )r   r   r   defaultdictr?   depsmapperspresort_actionspostsort_actionsdependenciesstatespost_update_states)selfr   s     r   __init__zUOWTransaction.__init__   sy      $$S)	
 '',
  "
 !#  E
  #'"2"23I"Jr   c                 ,    t        | j                        S rG   )boolrP   rR   s    r   has_workzUOWTransaction.has_work   s    DKK  r   c                     |j                   r"	 |j                  |t        j                         yy# t        j
                  $ r | j                  j                  |g       Y yw xY w)zZReturn ``True`` if the given state is expired and was deleted
        previously.
        TF)expired_load_expiredr   PASSIVE_OFForm_excObjectDeletedErrorr   _remove_newly_deletedrR   r   s     r   was_already_deletedz"UOWTransaction.was_already_deleted   sY     ==##E:+A+AB  -- 22E7;s    0 /A"!A"c                 F    || j                   v xr | j                   |   d   S )z[Return ``True`` if the given state is marked as deleted
        within this uowtransaction.    rP   r_   s     r   
is_deletedzUOWTransaction.is_deleted   s&     #=E(:1(==r   c                 l    || j                   v r| j                   |   S  |       x| j                   |<   }|S rG   r   )rR   r#   	callable_rets       r   memozUOWTransaction.memo   s7    $//!??3'')24DOOC 3Jr   c                 J    | j                   |   d   }|df| j                   |<   y)z;Remove pending actions for a state from the uowtransaction.rb   TNrc   )rR   r   isdeletes      r   remove_state_actionsz#UOWTransaction.remove_state_actions   s*     ;;u%a(&-Er   c                    d||f}|| j                   v r| j                   |   \  }}}|t         j                  z  s|t         j                  z  r|j                  |   j                  }|j	                  ||j
                  t         j                  t         j                  z  t         j                  z        }|r|j                  r|j                         }n|}|||f| j                   |<   |S |j                  |   j                  }|j	                  ||j
                  |t         j                  z  t         j                  z        }|r|j                  r|j                         }n|}|||f| j                   |<   |S )zOFacade to attributes.get_state_history(), including
        caching of results.history)r   SQL_OKr   implget_historydictr[   LOAD_AGAINST_COMMITTEDNO_RAISEuses_objectsas_state)	rR   r   r#   passivehashkeyrm   state_historycached_passivero   s	            r   get_attribute_historyz$UOWTransaction.get_attribute_history   sm    eS) doo%59__W5M2G]N
 #Z%6%66j///}}S)..**JJ** 778 ))* t00$+$4$4$6M$+M,3]G+L($ ! ==%**D &&

334%%&G 4,, ' 0 0 2 '(/'HDOOG$r   c                 "    |df| j                   v S )NT)rM   )rR   	processors     r   has_depzUOWTransaction.has_dep   s    4 D$8$888r   c                 \    ||f}|| j                   vrt        ||      | j                   |<   y y rG   )rM   
Preprocess)rR   r|   
fromparentr#   s       r   register_preprocessorz$UOWTransaction.register_preprocessor#  s6    *%d***(29j(ID  % +r   Nc           	         | j                   j                  |      sA|j                  s4|2t        j                  dt        j                  |      d|d|d       y|| j                  vre|j                  j                  }|| j                  vr| j                  |       | j                  |   j                  |       ||f| j                  |<   y|s|s|r|df| j                  |<   y)NzObject of type z not in session, z operation along 'z' will not proceedFT)r   r$   deletedr   warnorm_utilstate_class_strrP   r   r   rL   _per_mapper_flush_actionsadd)rR   r   rj   listonlycancel_delete	operationr   r   s           r   register_objectzUOWTransaction.register_object(  s     ||++E2 ==Y%:		  //6	4I
 #]]))FT\\)..v6LL $$U+"*H!5DKK  ]&.%6E"r   c                     |j                   j                  j                  }| j                  |   \  }}|j	                  |       |j                  |       y rG   )r   r   base_mapperrQ   r   update)rR   r   post_update_colsr   rP   colss         r   register_post_updatez#UOWTransaction.register_post_updateJ  sD    %%11..v6

5$%r   c                 P   t        | |j                        }t        | |j                        }| j                  j	                  ||f       |j
                  D ]  }|j                  |         |j                  D ],  }|j                  r|j                  }|j                  |        . y rG   )
SaveUpdateAllr   	DeleteAllrO   r   _dependency_processorsper_property_preprocessorsrelationshipsviewonly_dependency_processor)rR   r   savesdeletesdepr   s         r   r   z(UOWTransaction._per_mapper_flush_actionsP  s    dF$6$67D&"4"45ug./00 	1C**40	1 (( 	1D}},,C**40		1r   c                 .    t        j                  d       S )a  return a dynamic mapping of (Mapper, DependencyProcessor) to
        True or False, indicating if the DependencyProcessor operates
        on objects of that Mapper.

        The result is stored in the dictionary persistently once
        calculated.

        c                 v    | d   j                   j                  | d   j                        | d   j                  u S )Nrb   r   )r   getr#   r   )tups    r   rI   z0UOWTransaction._mapper_for_dep.<locals>.<lambda>i  s.    A))#a&**5QD r   )r   PopulateDictrV   s    r   _mapper_for_depzUOWTransaction._mapper_for_dep^  s       D
 	
r   c                 |    | j                   }|D cg c]   }||j                  j                  |f   s|" c}S c c}w )zmFilter the given list of InstanceStates to those relevant to the
        given DependencyProcessor.

        )r   r   r   )rR   r   rP   mapper_for_depss        r   filter_states_for_depz$UOWTransaction.filter_states_for_depl  s9    
 --!Ma^QYY5E5Es4K%LMMMs    99c              #      K   ||f}|j                   j                  D ]-  }| j                  |   D ]  }| j                  |   |k(  s|  / y wrG   )r   self_and_descendantsrL   rP   )rR   r   rj   r   checktupr   s         r   states_for_mapper_hierarchyz*UOWTransaction.states_for_mapper_hierarchyt  sY     h'((== 	 Ff-  ;;u%1K 	 s   AA	Ac                     	 d}t         j                  j                               D ]  }|j                         sd} |snBt	        j
                   j                  t         j                  j                                     x _        }|rt         fd|D              }t         j                        D ]  }d|v s/|d   j                  s |d   j                  s|j                  |      r j                  j                  |       R|d   |v rI j                  j                  |       ||d      D ]"  } j                  j                  ||d   f       $ |d   |v s j                  j                  |       ||d      D ]"  } j                  j                  |d   |f       $  t         j                  j                         D cg c]  }|j                  r| c}      j                  |      S c c}w )z}Generate the full, unsorted collection of PostSortRecs as
        well as dependency pairs for this UOWTransaction.

        TFc              3   V   K   | ]   }|t        |j                              f " y wrG   )r?   per_state_flush_actions).0recrR   s     r   	<genexpr>z3UOWTransaction._generate_actions.<locals>.<genexpr>  s+      BEc#55d;<=s   &)Nrb   r   )listrM   valuesexecuter	   find_cyclesrO   rN   cyclesrq   disabled
issupersetr5   r   r?   
difference)rR   rg   actionr   convertedger   as   `       r   _generate_actionsz UOWTransaction._generate_actions{  s    Ct33::<= >>$'C    +66tD$9$9$@$@$BC 
 	
f   IO G T../ >DLAw''Aw''((.%%,,T2!W&%%,,T2&tAw/ >))--sDGn=>!W&%%,,T2&tAw/ >))--tAwn=>>" --446I1ajjQI

*V
	Is   G: G:c                 v   | j                         }t        |d       }| j                  rYt        j                  | j
                  |      D ]5  }t        |      }|s|j                         }|j                  | |       |r%7 y t        j                  | j
                  |      D ]  }|j                  |         y )Nc                     | j                   S rG   )sort_key)r'   s    r   rI   z(UOWTransaction.execute.<locals>.<lambda>  s
    T]] r   )r#   )r   sortedr   r	   sort_as_subsetsrO   r?   popexecute_aggregatesortr   )rR   rN   subsetr;   nr   s         r   r   zUOWTransaction.execute  s    113!*
 ;;%55!!#3 4 6{
A''d3 	4 #''(9(9;KL "D!"r   c                 4   | j                   syt        | j                         }t        d | j                   j                         D              }|j                  |      }|r| j                  j                  |       |r| j                  j                  |       yy)zMark processed objects as clean / deleted after a successful
        flush().

        This method is called within the flush() method after the
        execute() method has succeeded and the transaction has been committed.

        Nc              3   2   K   | ]  \  }\  }}|s|  y wrG   rH   )r   r   rj   r   s       r   r   z8UOWTransaction.finalize_flush_changes.<locals>.<genexpr>  s       
+1*xhA
s   )rP   r?   itemsr   r   r^   _register_persistent)rR   rP   isdelothers       r   finalize_flush_changesz%UOWTransaction.finalize_flush_changes  s     {{T[[! 
/3{{/@/@/B
 
 !!%(LL..u5LL--e4 r   )FFFNN)r   
__module____qualname__rS   propertyrW   r`   rd   rh   rk   r   PASSIVE_NO_INITIALIZErz   r}   r   r   r   r   r   memoized_propertyr   r   r   r   r   r   rH   r   r   rD   rD      s    +KZ ! !
>. #-"B"B3j9J  D&1 

 
N 2h"65r   rD   c                       e Zd Zd Zy)IterateMappersMixinc                       j                   r3t         fd j                  j                  j                  D              S  j                  j
                  j                  S )Nc              3   X   K   | ]!  }j                   |j                  f   r| # y wrG   )r   dependency_processor)r   mrR   uows     r   r   z/IterateMappersMixin._mappers.<locals>.<genexpr>  s2      &&4+D+D'EF s   '*)r   iterr   parentr   r   rR   r   s   ``r   _mapperszIterateMappersMixin._mappers  sP    ?? 2299NN   ,,33HHHr   N)r   r   r   r   rH   r   r   r   r     s    Ir   r   c                       e Zd ZdZd Zd Zy)r   )r   r   	processedsetup_flush_actionsc                 L    || _         || _        t               | _        d| _        y NF)r   r   r?   r   r   )rR   r   r   s      r   rS   zPreprocess.__init__  s"    $8!$#( r   c                    t               }t               }| j                  |      D ]i  }|j                  |   j                  | j                        D ]<  }|j
                  |   \  }}|r|r|j                  |       ,|j                  |       > k |r7| j                  j                  ||       | j                  j                  |       |r7| j                  j                  ||       | j                  j                  |       |s|ri| j                  s\| j                  j                  ||d      s| j                  j                  ||d      r"| j                  j                  |       d| _        yyNTF)r?   r   rL   r   r   rP   r   r   presort_deletesr   presort_savesr   prop_has_changesper_property_flush_actions)rR   r   delete_statessave_statesr   r   rj   r   s           r   r   zPreprocess.execute  sD   emmC( 	/FV,77G /'*zz%'8$8%))%0#./	/ %%55c=INN!!-0%%33CENN!!+.K++)):: ,,==e ))DDSI+/(r   N)r   r   r   	__slots__rS   r   rH   r   r   r   r     s    I)!r   r   c                       e Zd ZdZd Zd Zy)PostSortRec)r   c                     | f|z   }||j                   v r|j                   |   S t        j                  |       x|j                   |<   }d|_        |S r   )rN   object__new__r   )clsr   argsr#   rg   s        r   r   zPostSortRec.__new__!  sV    ftm#&&&'',,.4nnS.AAC  % CLJr   c                 &    | j                  |       y rG   )r   )rR   r   recss      r   r   zPostSortRec.execute_aggregate*  s    Sr   N)r   r   r   r   r   r   rH   r   r   r   r     s    Ir   r   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)
ProcessAll)r   rj   r   r   c                     || _         d| j                   j                  |f| _        || _        || _        |j                  |j
                  j                     j                  |       y )Nr   )r   r   rj   r   rK   r   r   r   )rR   r   r   rj   r   s        r   rS   zProcessAll.__init__1  s_    $8!%%..

 !$%,,889== 	
r   c                     | j                  |      }| j                  r| j                  j                  ||       y | j                  j	                  ||       y rG   )	_elementsrj   r   process_deletesprocess_saves)rR   r   rP   s      r   r   zProcessAll.execute>  sC    $==%%55c6B%%33C@r   c                     t        g       S rG   )r   r   s     r   r   z"ProcessAll.per_state_flush_actionsE  s    
 Bxr   c                 h    | j                   j                  d| j                  d| j                  dS )N(z, isdelete=))	__class__r   r   rj   rV   s    r   __repr__zProcessAll.__repr__L  s)    NN##%%MM
 	
r   c              #      K   | j                  |      D ]?  }|j                  |   D ]+  }|j                  |   \  }}|| j                  k(  s%|r(| - A y wrG   )r   rL   rP   rj   )rR   r   r   r   rj   r   s         r   r   zProcessAll._elementsS  s\     mmC( 	 FV,  '*zz%'8$8t}},XK 	 s   AAA	AN)	r   r   r   r   rS   r   r   r  r   rH   r   r   r   r   .  s!    LI
A
 r   r   c                   F    e Zd ZdZd Z ej                  d      d        Zy)PostUpdateAll)r   rj   r   c                 H    || _         || _        d|j                  |f| _        y )Nr  )r   rj   	_sort_keyr   )rR   r   r   rj   s       r   rS   zPostUpdateAll.__init__^  s$     (&*:*:HEr   sqlalchemy.orm.persistencec                    t         j                  j                  }|j                  | j                     \  }}|D cg c]$  }|j
                  |   d   | j                  k(  s#|& }}|j                  | j                  |||       y c c}w Nrb   )r   	preloadedorm_persistencerQ   r   rP   rj   post_update)rR   r   persistencerP   r   r   s         r   r   zPostUpdateAll.executec  sr    nn44--dkk:#Iszz!}Q'74=='H!IIVS$? Js   $B BN)r   r   r   r   rS   r   preload_moduler   rH   r   r   r  r  [  s1    0IF
 T56@ 7@r   r  c                   R    e Zd ZdZd Z ej                  d      d        Zd Zd Z	y)r   r   r   c                 X    || _         d|j                  f| _        ||j                  u sJ y )Nr   r   r  r   r   rR   r   r   s      r   rS   zSaveUpdateAll.__init__o  s/    (&*:*:;+++++r   r	  c                     t         j                  j                  j                  | j                  |j                  | j                  dd      |       y r   )r   r  r  save_objr   r   r   s     r   r   zSaveUpdateAll.executet  s:    &&//KK++DKKF	
r   c              #     K   t        |j                  | j                  dd            }| j                  j                  }t	        ||      }|D ]/  }t        ||      }|j                  j                  ||f       | 1 |j                  | j                     D ]'  }|j                  ||      }|j                  ||d       ) y wr   )r   r   r   r   r   SaveUpdateStaterO   r   rK   r   r   )	rR   r   rP   r   
delete_allr   r   r   states_for_props	            r   r   z%SaveUpdateAll.per_state_flush_actions|  s     ++DKKF
 kk--sK0
 	E %S%0F  &*!56L	 88DKK( 	EC!77VDO''_eD	E   CCc                 N    | j                   j                  d| j                  dS Nr   r  r  r   r   rV   s    r   r  zSaveUpdateAll.__repr__      >>22DKK@@r   N
r   r   r   r   rS   r   r  r   r   r  rH   r   r   r   r   l  s:    &I,
 T56
 7
E"Ar   r   c                   R    e Zd ZdZd Z ej                  d      d        Zd Zd Z	y)r   r  c                 X    || _         d|j                  f| _        ||j                  u sJ y )Nr   r  r  s      r   rS   zDeleteAll.__init__  s/    $f&6&67+++++r   r	  c                     t         j                  j                  j                  | j                  |j                  | j                  dd      |       y r   )r   r  r  
delete_objr   r   r   s     r   r   zDeleteAll.execute  s:    &&11KK++DKKuE	
r   c              #     K   t        |j                  | j                  dd            }| j                  j                  }t	        ||      }|D ]/  }t        ||      }|j                  j                  ||f       | 1 |j                  | j                     D ]'  }|j                  ||      }|j                  ||d       ) y wr   )r   r   r   r   r   DeleteStaterO   r   rK   r   r   )	rR   r   rP   r   save_allr   r   r   r  s	            r   r   z!DeleteAll.per_state_flush_actions  s     ++DKKuE
 kk-- k2 	E !e,F  (F!34L	 88DKK( 	DC!77VDO''_dC	Dr  c                 N    | j                   j                  d| j                  dS r  r  rV   s    r   r  zDeleteAll.__repr__  r   r   Nr!  rH   r   r   r   r     s:    &I,
 T56
 7
D"Ar   r   c                   "    e Zd ZdZd Zd Zd Zy)ProcessState)r   rj   r   r   c                 T    || _         d|j                  f| _        || _        || _        y Nr+  )r   r   rj   r   )rR   r   r   rj   r   s        r   rS   zProcessState.__init__  s+    $8!')=)F)FG 
r   c                    | j                   }| j                  }| j                  }|D cg c].  }|j                   |u r|j                  |u r|j                  |u r|0 }}|j                  |       | j                  g|D cg c]  }|j                   c}z   }|r|j                  ||       y |j                  ||       y c c}w c c}w rG   )r  r   rj   difference_updater   r   r   )	rR   r   r   cls_r   rj   rour_recsrP   s	            r   r   zProcessState.execute_aggregate  s    ~~#88== 
{{d"&&*>>

h&	 
 
 	x(**( ;Q ;; 00f= ..sF;
 !<s   3B??Cc                     | j                   j                  d| j                  dt        j                  | j
                        d| j                  dS )Nr   z, z	, delete=r  )r  r   r   r   	state_strr   rj   rV   s    r   r  zProcessState.__repr__  s;    NN##%%tzz*MM	
 	
r   N)r   r   r   r   rS   r   r  rH   r   r   r+  r+    s    GI<$
r   r+  c                   L    e Zd ZdZd Z ej                  d      d        Zd Zy)r  r   r   r   c                     || _         |j                  j                  | _        d| j                  j                  f| _        y r-  r   r   r   r  r   rR   r   r   s      r   rS   zSaveUpdateState.__init__  s0    
ll..')>)>?r   r	  c                 j   t         j                  j                  }| j                  }| j                  }|D cg c]"  }|j                  |u s|j                  |u s!|$ }}|j                  |       |j                  || j                  g|D cg c]  }|j                   c}z   |       y c c}w c c}w rG   )r   r  r  r  r   r/  r  r   )rR   r   r   r  r0  r   r1  r2  s           r   r   z!SaveUpdateState.execute_aggregate  s    nn44~~
q{{d2qxx67IA
 
 	x(TZZLX#>AGG#>>	
	

 $?s   B+B+B+B0c                 t    | j                   j                  dt        j                  | j                        dS r  r  r   r   r4  r   rV   s    r   r  zSaveUpdateState.__repr__  +    NN##tzz*
 	
r   N	r   r   r   r   rS   r   r  r   r  rH   r   r   r  r    s4    -I@
 T56

 7


r   r  c                   L    e Zd ZdZd Z ej                  d      d        Zd Zy)r'  r6  c                     || _         |j                  j                  | _        d| j                  j                  f| _        y )Nr'  r8  r9  s      r   rS   zDeleteState.__init__  s0    
ll..&(=(=>r   r	  c                    t         j                  j                  }| j                  }| j                  }|D cg c]"  }|j                  |u s|j                  |u s!|$ }}|j                  |       | j                  g|D cg c]  }|j                   c}z   }|j                  ||D 	cg c]  }	|j                  |	   d   s|	 c}	|       y c c}w c c}w c c}	w r  )	r   r  r  r  r   r/  r   r%  rP   )
rR   r   r   r  r0  r   r1  r2  rP   r   s
             r   r   zDeleteState.execute_aggregate  s    nn44~~
q{{d2qxx67IA
 
 	x(**( ;Q ;;;1#**Q-*:Q;S	

 !<;s#   CCCC)C
C
c                 t    | j                   j                  dt        j                  | j                        dS r  r<  rV   s    r   r  zDeleteState.__repr__  r=  r   Nr>  rH   r   r   r'  r'    s3    -I?
 T56
 7

r   r'  N)__doc__ r   r   r\   r   r   r   r	   r   rB   r   rD   r   r   r   r   r  r   r   r+  r  r'  rH   r   r   <module>rE     s         	rAjD5V D5N
	I& 	I/$ /d&  * $k * Z@K @""AK "AJ"A "AJ!
; !
H
k 
8
+ 
r   