
    BjSy                     v   d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlm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e(e         ddfdZ)	 d-dedef         de*de+e,ef         dz  de-e(e         e(e         f         fdZ.dededdfdZ/ ej0        d            G d! d"                      Z1ej0         G d# d$                      Z2d%ee         d&ee         d'eeege3f         de(e         fd(Z4d)e-edf         de(e         fd*Z5 G d+ d,          Z6dS ).a  
This module provides functionality for resuming Python execution at specific points in code,
primarily used by PyTorch Dynamo for control flow handling and optimization. It implements
bytecode transformation and execution state management to enable:

- Resuming execution at arbitrary points in Python bytecode
- Managing context managers and their state across execution boundaries
- Transforming and generating new code objects with preserved execution state
- Supporting Python 3.11+ exception handling and block management
- Restoring torch function mode stacks and other execution context

The module is critical for PyTorch Dynamo's ability to optimize code while preserving
Python semantics and execution state.
    N)CallableIterable)AbstractContextManager)Anycast   )add_push_nullbytecode_from_templatecreate_binary_subscrcreate_call_functioncreate_call_function_excreate_instructioncreate_jump_absolutecreate_load_constInstructionoverwrite_instructiontransform_code_object	unique_id)ExactWeakKeyDictionary                @         i   torch_dynamo_resume_in__is_tracing_resume_prologueinstsreturnc                     t           j        dk    rX|                     t          d                     t           j        dk     r(|                     t          dd                     d S d S d S )N      	PUSH_NULL)r$      SWAPr   arg)sysversion_infoappendr   )r    s    a/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/torch/_dynamo/resume_execution.py_initial_push_nullr/   ;   sm    
7""'44555g%%LL+F:::;;;;; #"%%    template.stack_indexvarname_mapc                    t          | |          }|                    t          d                     |D ]}|j        r|j        xj        |z  c_        t          d t          |          D             d          \  }}||J t          |t          d          g           ||dz            j        dk    sJ t          ||dz            t          d          g           |d |dz            ||dz   d          fS )Nr3   POP_TOPc              3   L   K   | ]\  }}|j         d v r|j        dk    ||fV   dS )	LOAD_FASTLOAD_FAST_BORROWdummyNopnameargval).0iinsts      r.   	<genexpr>z5_bytecode_from_template_with_split.<locals>.<genexpr>R   sS       	
 	
4{???w&& I '&&&		
 	
r0   )NNNOPr   )	r
   r-   r   exn_tab_entrydepthnext	enumerater   r=   )r1   r2   r3   template_coderA   	dummy_idx
dummy_insts          r.   "_bytecode_from_template_with_splitrK   C   s@   
 +8MMMM+I66777  4 4 	4$$3$$ !	
 	
$]33	
 	
 	
 	 Iz  Z%;%;; *'9%'@'@&ABBB Q'.);;;;-	A69KE9R9R8STTT9q=)=Q+IIIr0   r;   stack_var_namec                 L    	 |  d S #  t                               |            xY wN)$__import_torch_dot__dynamo_dot_utilsset_torch_function_mode_stack)r;   rL   s     r.   _try_except_tf_mode_templaterQ   f   s9    
,JJ	
 	
 	
 	s    #T)frozenc            	          e Zd ZU eed<   dZeedf         dz  ed<   dee	ef         de
e         de
e         fdZdee	ef         de
e         de
e         fd	Zdee	ef         de
e         dee
e         edz  f         fd
ZdS )ReenterWithr2   N.target_valuescode_optionscleanupr!   c                 x    ddl m} t          t          | j        d |            i          \  }}||z   |dd<   |S )z
        Codegen based off of:
        try:
            (rest)
        except:
            (restore previous tf mode stack)
            raise
        r   )get_prev_stack_var_namerL   r5   N)variables.torch_functionrY   rK   rQ   r2   )selfrV   rW   rY   setup_try_exceptepilogues         r.   try_except_torch_function_modez*ReenterWith.try_except_torch_function_modey   sf     	FEEEEE%G()+B+B+D+DE&
 &
 &
"(
 '
r0   c                    g }| j         rd | j         D             }t          d| j                   }||d         vr|dxx         |fz  cc<   dD ]}||d         vr|dxx         |fz  cc<   g }t          |           |                    g |t          t          |          d          t          d|                     d	t          t                   d
t          ddfd}t          || j        d	|i          \  }}	|	|z   |dd<   ||z   S )z
        Codegen based off of:
        load args
        enter context
        try:
            (rest)
        finally:
            exit context
        c                 ,    g | ]}t          |          S  r   r?   vals     r.   
<listcomp>z+ReenterWith.try_finally.<locals>.<listcomp>   !    NNNC*3//NNNr0   ___context_manager_co_varnames	__enter____exit__co_namesF
STORE_FASTr>   ctxr;   r!   Nc                     |                                   	 | |                     d d d            d S # |                     d d d            w xY wrN   ri   ro   r;   s     r.   	_templatez*ReenterWith.try_finally.<locals>._template   sQ    MMOOO/T4.....T4....s	   1 A
r5   )rU   r   r2   r/   extendr   lenr   r   r   rK   )
r[   rV   rW   	load_argsctx_namename
create_ctxrr   setup_try_finallyr]   s
             r.   try_finallyzReenterWith.try_finally   s    	 	ONN4;MNNNIE43CEEFF<666'''H;6'''- 	4 	4D<
333Z(((TG3((((*
:&&&%c)nne<< #<AAA	
 	
 	
	/1#6 	/s 	/t 	/ 	/ 	/ 	/ 'It'eX5F'
 '
 '
#8 '
---r0   c                 D   g }| j         rd | j         D             }g }t          j        dk     rt          |           |                    g |t          t          |          d                     dt          t                   dt          ddfd}t          || j
                  \  }}||z   |dd<   t          d	 |D             d          }|J t          |t          d
          g           d |D             }	t          |	d          }
t          |	d          J ||z   |
fS )zR
        Codegen based off of:
        with ctx(args):
            (rest)
        c                 ,    g | ]}t          |          S ra   rb   rc   s     r.   re   z(ReenterWith.__call__.<locals>.<listcomp>   rf   r0   )r$      Fro   r;   r!   Nc                 @    | 5  | d d d            d S # 1 swxY w Y   d S rN   ra   rq   s     r.   rr   z'ReenterWith.__call__.<locals>._template   sq                       s   c              3   B   K   | ]}|j         d v r|j        dk    |V  dS )r8   ro   Nr<   r?   rA   s     r.   rB   z'ReenterWith.__call__.<locals>.<genexpr>   sK        ;"CCCK5((  )(((	 r0   rC   c              3   0   K   | ]}|j         d k    |V  dS )PUSH_EXC_INFON)r=   r   s     r.   rB   z'ReenterWith.__call__.<locals>.<genexpr>   s7       
 
)G)GD)G)G)G)G
 
r0   )rU   r+   r,   r/   rs   r   rt   r   r   rK   r2   rF   r   r   )r[   rV   rW   ru   rx   rr   
setup_withr]   load_fast_ctx_instpush_exc_info_genpush_exc_info_insts              r.   __call__zReenterWith.__call__   s    	 	ONN4;MNNNI(*
g%%z***%c)nne<<	
 	
 	
	1#6 	s 	t 	 	 	 	  Bt' 
  

H '
! &   
 
 "---03Ee3L3L2MNNN
 
%
 
 
 ""3T::%t,,444J&(:::r0   )__name__
__module____qualname__int__annotations__rU   tupler   dictstrlistr   r^   rz   r   ra   r0   r.   rT   rT   t   s	        ,0M5c?T)000  cN 59+5F 	k	       0-. cN-.59+5F-.	k	-. -. -. -.^7; cN7;59+5F7;	tK +"44	57; 7; 7; 7; 7; 7;r0   rT   c                       e Zd ZU ej        ed<    ej        e          Z	ee
         ed<    ej        e          Zee         ed<    ej        e          Zeeeef         eeef         f         ed<   dS )ResumeFunctionMetadatacode)default_factoryinstructions prefix_block_target_offset_remapblock_target_offset_remapN)r   r   r   typesCodeTyper   dataclassesfieldr   r   r   r   r   r   r   r   ra   r0   r.   r   r      s         
.&7k&7&M&M&ML${#MMM 3D+2C3 3 3$d3i   
 	$/// tE#s(OT#s(^$CD     r0   r   l1l2condc                     t          |          }g }	 t          |          }| D ]2} |||          r$|                    |           t          |          }3n# t          $ r Y nw xY w|S )z
    Two-pointer conditional filter.
    e.g. _filter_iter(insts, sorted_offsets, lambda i, o: i.offset == o)
    returns the instructions with offsets in sorted_offsets
    )iterrF   r-   StopIteration)r   r   r   itrescurrd   s          r.   _filter_iterr     s     
bBC2hh 	 	CtC~~ 

32hh	    Js   AA 
A%$A%tupc                     g }t          |           |                    d | D                        |                    t          t          |           d                     |S )Nc              3   4   K   | ]}t          |          V  d S rN   rb   rc   s     r.   rB   z'_load_tuple_and_call.<locals>.<genexpr>&  s+      77C"3''777777r0   F)r/   rs   r   rt   )r   r    s     r.   _load_tuple_and_callr   #  s^    !Eu	LL773777777	LL%c#hh66777Lr0   c            !       <   e Zd Z e            Z e            Zedej        de	de	de
dej        f
d            Zedej        de	de	de	dee	d	f         d
e	deed	f         deed	f         deed	f         dedeee	ee
d	f         f         d	f         deeeee
d	f         f         d	f         dee	d	f         deej                 dedej        f d            Zedeee
f         dee         fd            Zedej        de	de	de	dee	d	f         de
dej        fd            ZdS )ContinueExecutionCacher   linenoinit_offsetkeyr!   c                     || j         vr
i | j         |<   t          |          }|| j         |         vr | j        |||g|R  | j         |         |<   | j         |         |         S rN   )cacher   generate)clsr   r   r   r   s        r.   lookupzContinueExecutionCache.lookup/  sq     sy   CIdOCjjcio%%#/3<fk#PC#P#P#PCIdOC ys##r0   resume_offsetsetup_fn_target_offsets.nstackargnamesargnames_null	setup_fnshandle_inactive_ctxstack_ctx_varsargnames_ctx_vars
null_idxesnested_code_objspop_nested_resume_resultc                 
   	
 J |j         t          t          z  t          z  t          z  z  rJ |j         t
          z  sJ |t          j        v r#                     ||	
          S t          j
        dk    t          |          dt          t                   dt          t          t           f         dd f 
	fd}t#          ||          \  }}t          j        |<   |S )Nr#   r   rV   r!   c           
      >   t          j        |           "_        ddgd t          $          D             z                      fdD                        t          |d         pg           t          |d         pg           z   }t          t          |                    }t           d|d          d	! |d<    rk|d
                             dd          }t          |          dk    r|d         |d
<   n/t          |          dk    sJ |\  }}| dt           d| d	! |d
<   !|d<   d|d<   ||d<   t                    |d<   d|d<   d|d<   t          fdD             z   fd|d         D             z   t          gz             |d<   |d         t          t          z   z  |d<   t          'fd| D                       }g } rW|r1|                    t          dt          |                               |                    t          dd                     |                    t          dd          t          d t                    g           g }d! )D             }	(fd"t!          )          D             }
d# | D             }i }d}d}t#          *          }t          $t          %          z             D ]}|t          %          k     r4%|         |k    r(|                    t          d$                     |dz  }nZ|                    t          d%d&|                      r,||v r(|                    t%          ||                              |dz  }||	v rw|	                    |          } |||          \  }}|                    |            r<|
                    |          }||         }"j                            |           |||<   ! r&t+          t-          "j                            "_        |	rJ rrD ]o\  }}|                    t          d%|                     |                    t%          |                     |                    t          d |                     prPt.          j        d'k    sJ D ];}|vsJ |                    t          d$          t          d |          g           <#r|                    g t3          t          d%d          t          dd(          t5                      g          t          d%d          t          dd(          t          d)          t          d%d          t          d%d          t          d*d          t          d%d          t          dd(          t5                      t          d+d          t          d%d          t          dd(          t          d)          t          d,d          t          d,d          t          dd-          t          d t                    t7          d-d-                     &r"|                    t          d.                     n:|                    t          dd-          t          d t                    g           |                    t9          |                     | D ]2}|j        |j        k    r nd |_        t.          j        d/k    rd |_        3|r=|                    |           |                                         |                     |r: sJ | D ]3}|j!        r*|j!        j"        |v r||j!        j"                 |j!        _"        4|| z   | d d <   d S )0N__nested_resume_fns__nested_frame_valuesc                     g | ]}d | S )___stackra   )r?   r@   s     r.   re   zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>t  s    ;;;^^^;;;r0   c              3   $   K   | ]
}|v|V  d S rN   ra   r?   vargss     r.   rB   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>u  s'      ==aq}}}}}}==r0   co_cellvarsco_freevars_co_name_at_co_qualname.r   )maxsplitr   co_firstlinenora   co_argcountr   co_posonlyargcountco_kwonlyargcountc                     g | ]}|v|	S ra   ra   r   s     r.   re   zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>  s    ===q}}1}}}r0   c                     g | ]}|v|	S ra   ra   r   s     r.   re   zCContinueExecutionCache.generate.<locals>.update.<locals>.<listcomp>  s    KKKQd]]1]]]r0   rh   co_flagsc              3   2   K   | ]}|j         k    |V  d S rN   offset)r?   r@   r   s     r.   rB   zBContinueExecutionCache.generate.<locals>.update.<locals>.<genexpr>  s/      OOQX5N5N!5N5N5N5NOOr0   COPY_FREE_VARSr)   RESUME
LOAD_CONSTTrn   rm   c                     i | ]
}|j         |S ra   r2   )r?   fns     r.   
<dictcomp>zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>  s    <<<BR^R<<<r0   c                 2    i | ]\  }}|j         |         S ra   r   )r?   r@   r   r   s      r.   r   zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>  s7     # # #Ar  7 :# # #r0   c                     i | ]
}|j         |S ra   r   r   s     r.   r   zCContinueExecutionCache.generate.<locals>.update.<locals>.<dictcomp>  s    IIIDdk4IIIr0   r&   r9   r   )r$      DELETE_SUBSCR
BUILD_LISTLIST_EXTENDDELETE_FASTFr6   r#   )#copydeepcopyr   rangers   r   sortedTORCH_DYNAMO_RESUME_IN_PREFIXrsplitrt   "IS_TRACING_RESUME_PROLOGUE_VARNAME
CO_VARARGSCO_VARKEYWORDSrF   r-   r   rG   r   r   popr   r   reversedr+   r,   r	   r   r   r   r   starts_line	positionsunreachable_codesrD   target)+r   rV   freevarsqualified_pathmodule_namer   r   prefixrW   hookshook_target_offsetsoffset_to_instold_hook_target_remapstack_inull_istack_ctx_vars_dr@   hook
hook_insts
exn_targethook_target_offsetold_hook_targetrw   valsr   rA   r   r   r   r   r   r   is_py311_plusr   metar   r   r   r   r   r   r   r   s+                             @r.   updatez/ContinueExecutionCache.generate.<locals>.updaten  s	    !%l ; ;D)+BCD;;U6]];;;;DKK====8======\-8>B??%]+1rC C H VH--..H0XX<	3JXXPVXX #  	!-m!<!C!CCRS!C!T!T~&&!++2>y2IL//~..!3333+9(K&^^)F^^^^V\^^ !/ .4L)**,L'*2L'*-d))L'12L-.01L,-*/====m===>KKKKl=9KKKL 667+ +L' (4J'?^+C (L$ OOOO\OOOOOFF C MM*+;XOOO   0qAAABBB
 MM&|DAAA&$-O     *,G<<)<<<E# # # #&y11# # # JILIIIN %'!GF#N336C
OO344 L LC
OO++
60Ba0G0GMM"4["A"ABBBaKFFMM*;?S'?S?STTT   + Ww:J/J/J &:;KG;T&U&UVVVqLG:: 99Q<<D-1T,-H-H*J
MM*---$ L-@-D-DQ-G-G**89K*L=DDEWXXXAK-o>  9=TBCC9 95 9 # Q"3 Q QJD$MM"4["N"N"NOOOMM"6t"<"<===MM"4\$"O"O"OPPPP  	'72222&  AD====MM.{;;.|AFFF      >.& 2$/8M!" !" !" !3< K K K 4 6 6 . +;?TUUU. +<CCC. +?;;.  +;?TUUU!." +;?VWWW#.$ +<Q???%.( +;?VWWW).* +<CCC+., -..-.8 +=a@@@9.< +;?VWWW=.> +<CCC?.@ +?;;A.D +=AVWWWE.F +)2I  G.P +<FFFQ.R +(1S  S.Z 1>>[.0 0 0b , AMM"4Y"?"?@@@ *<FFF*(1S     MM.v66777
 % * *;&-//E#' #w..%)DN Cg&&&c33LAABBB % 
$$$}(  D* .59NNN4I .55*1
 %|3LOOOr0   )r   CO_GENERATORCO_COROUTINECO_ITERABLE_COROUTINECO_ASYNC_GENERATORCO_OPTIMIZEDr   generated_code_metadata&generate_based_on_original_code_objectr+   r,   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  new_coder   r  r  s   ` ` ````````````   @@r.   r   zContinueExecutionCache.generate:  s   0 (((Ml*-BBEWWY	
 	
 
 }|++++)AAA=='#! (  $ (G3%d++_	4{+_	4;?S>_	4_	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4 _	4B ,D&99!CG6x@r0   rV   c                 B    t          d          t          dd          gS )zACodegen a `raise None` to make analysis work for unreachable codeNRAISE_VARARGSr   r)   )r   r   )rV   s    r.   r   z(ContinueExecutionCache.unreachable_codesS  s)     d##A666
 	
r0   r   c                    t           j                 dt          dt          ffd} ||          } ||          }	|	dk    s
J d            t          j        dk    rz||	fj        vrQi xj        <   dt          t                   dt          t          t          f         dd	ffd
}
t          |
           t          fdD                       t          j        j        |||	g|R  S )a>  
        This handles the case of generating a resume into code generated
        to resume something else.  We want to always generate starting
        from the original code object so that if control flow paths
        converge we only generated 1 resume function (rather than 2^n
        resume functions).
        
cur_offsetr!   c                      ddt           t                   dt          t          t          f         dd f fd}t          |           S )Nr   r   rV   r!   c           	      @   fd| D             \  t          fdt          t          |           t          j                            D                       }|sd S t	          |          dk    sJ |d         }j        |j        k    sJ |j        J |j        d S )Nc              3   2   K   | ]}|j         k    |V  d S rN   r   )r?   r@   r  s     r.   rB   zContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>x  s/      OO1J8N8NQ8N8N8N8NOOr0   c              3   *   K   | ]\  }}|u 	|V  d S rN   ra   )r?   i1i2r   s      r.   rB   zContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transform.<locals>.<genexpr>z  s=       ) )B V||	  $|||) )r0   r   r   )r   zipr   r   rt   opcoder   )r   rV   new_target_tuple
new_targetr   r  r  orig_offsets       @r.   find_orig_offset_transformz{ContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offset.<locals>.find_orig_offset_transformt  s     POOOOOO	#( ) ) ) )"% ..9J0K0K# #) ) ) $ $  (  F+,,1111-a0
}
(99999!(444(/r0   )r   r   r   r   r   r   )r  r%  r$  r   r  s   ` @r.   find_orig_offsetzWContinueExecutionCache.generate_based_on_original_code_object.<locals>.find_orig_offsetq  sp    K0";/0?CCH~00 0 0 0 0 0 0 06 "$(BCCCr0   r   z>resume instruction not found in original code - this is a bug.r#   r   rV   Nc           
        
 g }| D ]I}t          |          t          j                  k    r n!|j        dk    r|                    |           Jt	          |j                  D ]"\  }}|t          t          |j                  <   #|r t          t          |d         j                  nd
t          
fdD                       }t          | |d           }t          t          t	          t          |           t          j                            t          |          d                     }t	          ||          D ]\  }}	|d         j        |	j        <   d S )Nr   r   c              3   (   K   | ]}|k    |V  d S rN   ra   )r?   ncur_start_offsets     r.   rB   zmContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<genexpr>  s7       . .aBR>R>R>R>R>R>R. .r0   c                     | j         |k    S rN   r   )rA   os     r.   <lambda>zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    WXHX r0   c                     | d         |u S )Nr   ra   )v1v2s     r.   r-  zlContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets.<locals>.<lambda>  s    2a5B; r0   r   )rt   r   r=   r-   r   r   r   r   r   r   r   r   )r   rV   prefix_blocksrA   r,  cur_inst_offsetstargetsorig_targetsorigr   r*  r   r  r   s             @r.   remap_block_offsetszZContinueExecutionCache.generate_based_on_original_code_object.<locals>.remap_block_offsets  s    8:M , 
7 
7
 }-- A2 2   "E;/99)00666 $'%t'L$ $ N Na MN1$sDK2H2HII @MTS-"3":;;;RT % (. . . . .#:. . . ( ($ +$&68X8X G $,$ 6 6AR8S8STT$W--66 $ $L &)w%?%? O O	c@DQ1#*==O Or0   c              3   >   K   | ]}j                  |         V  d S rN   )r   )r?   r)  r  
offset_keys     r.   rB   zPContinueExecutionCache.generate_based_on_original_code_object.<locals>.<genexpr>  sD       , , .z:1=, , , , , ,r0   )r   r  r   r+   r,   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r&  orig_init_offsetorig_resume_offsetr6  r   r  r8  s    `   `     @@@r.   r  z=ContinueExecutionCache.generate_based_on_original_code_object[  s   $ (>'U(
	 	 	 	 	 	 	 	 	B ,+K88 .-m<<!B&&&L '&& w&&
 +,>?J !??? )D,J-
1O"&{"31OCGS>1O1O 1O 1O 1O 1O 1O 1O 1Of &d,?@@@ ', , , , , ,0, , , ' '# &,I#
 
 
 
 	
r0   N)r   r   r   r   r   r  classmethodr   r   r   r   r   r   r   rT   boolr   staticmethodr   r   r   r   r  ra   r0   r.   r   r   +  ss       ""$$E4466$>$+.$=@$HK$	$ $ $ [$ VnV V 	V
 V "'sCxV V S/V S#XV c)*V "V eCsCx$893>?V !sE#s(O';!<c!ABV #s(OV"  /#V* #'+V, 
-V V V [Vp 
S#X 
4;L 
 
 
 \
 R
nR
 R
 	R

 R
 "'sCxR
 R
 
R
 R
 R
 [R
 R
 R
r0   r   rN   )7__doc__r   r   r+   r   collections.abcr   r   
contextlibr   typingr   r   bytecode_transformationr	   r
   r   r   r   r   r   r   r   r   r   r   utilsr   r  CO_NEWLOCALSr   r   	CO_NESTEDr  	CO_NOFREEr  r  r  r   r   r   r/   r   r   r   r   rK   rQ   	dataclassrT   r   r<  r   r   r   ra   r0   r.   <module>rH     sg         



  . . . . . . . . - - - - - -                                    * ) ) ) ) ) 
		   !9 %C "<d;/ <D < < < < *. J  JsCx  J J c3h$& J 4d;//0	 J  J  J  JF S T     d###B; B; B; B; B; B; B; $#B;J        " C:t#
$ 
#Y	   .eCHo ${2C    C
 C
 C
 C
 C
 C
 C
 C
 C
 C
r0   