
    Bj\              	          d dl Z d dlmZ d dlmZmZ d dlZd dlmZ d dl	m
Z
 d dlmZmZ ddl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 ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$ erd dl%m&Z& ddl'm(Z( d dl)m*Z* ej+        Z+dedede,fdZ-de.e         dede,fdZ/dej0        ddddfdZ1dej0        de,fdZ2de,dej3        fd Z4de,dej5        fd!Z6 e*d"d#$          d%e,d&e,ddfd'            Z7e7j8        d%e,d&e,ddfd(            Z9 eej:        j;        j<        j=                    e*d)d#$          d%e,d&e,ddfd*            Z>e>j8        d%e,d&e,ddfd+            Z9 eej:        j;        j?        j=                    e*d,d#$          d-e,d.e,ddfd/            Z@e@j8        d-e,d.e,ddfd0            Z9 eej:        j;        j@        j=                    e*d1d#$          d-e,d.e,ddfd2            ZAeAj8        d-e,d.e,ddfd3            Z9 eej:        j;        jA        j=                    e*d4d#$          d-e,ddfd5            ZBeBj8        d-e,ddfd6            Z9 eej:        j;        jB        j=                    e*d7d#$          d8eCd9e,ddfd:            ZDeDj8        d8eCd9e,ddfd;            Z9 eej:        j;        jD        j=                    e*d<d#$          d.e,ddfd=            ZEeEj8        d.e,ddfd>            Z9 eej:        j;        jE        j=                    e*d?d#$          d@e,dAe,ddfdB            ZFeFj8        d-e,d.e,ddfdC            Z9 eej:        j;        jF        j=                    e*dDd#$          dEe,dFe,dGej+        ddfdH            ZGeGj8        dEe,dFe,dGej+        ddfdI            Z9 eej:        j;        jG        j=                    e*dJd#$          dKej+        d.e,ddfdL            ZHeHj8        dKej+        d.e,ddfdM            Z9 eej:        j;        jH        j=                    G dN dO          ZI G dP dQe"          ZJ G dR dSeJ          ZK G dT dUeK          ZL G dV dWe          ZMdS )X    N)Callable)AnyOptional)ConstDictVariable)TupleVariable)has_side_effectProxy   )graph_break_hints)create_call_function)TYPE_CHECKINGunimplemented)CURRENT_STREAM_INDEXget_external_object_by_indexregister_graph_created_objectregister_user_objectreset_user_object_trackingCurrentStreamSource   )VariableTrackerConstantVariable)FxTracebackAnnotateVariable)LazyVariableTracker)InstructionTranslator)	PyCodegen)	custom_opargskwargsreturnc            	          t          j        | i |}t          |t                              t          g           t          i                               S N)torchEventr   EventVariable make_construct_in_graph_event_fnr   r   )r   r    events      b/var/www/html/Carbon-Document/venv/lib/python3.11/site-packages/torch/_dynamo/variables/streams.py	new_eventr*   &   sT    K(((E(66"044	
 	
      c            	          t          j        | i |}t          |t                              t          g           t          i                               S r#   )r$   Streamr   StreamVariable!make_construct_in_graph_stream_fnr   r   )r   r    streams      r)   
new_streamr1   0   sT    \4*6**F(88"044	
 	
  r+   devicecgr   c                                          fd            t          |                                          t          dd                     d S )Nc                  X                          t          j        j        j        d          S Nstash_graph_created_objectload_import_fromr$   _dynamograph_bytecode_inputs__name__)r3   s   r)   <lambda>z)_codegen_current_stream.<locals>.<lambda><   s%    ##M/8(
 
 r+   r   F)add_push_nullr   extend_outputr   )r2   r3   s    `r)   _codegen_current_streamr@   :   so    	
 	
 	
 	
   B6""###)!U3344444r+   c                 h     t           j                                       }t          | fd          S )Nc                 $    t          |          S r#   )r@   )_r3   r2   s     r)   r=   z$get_current_stream.<locals>.<lambda>H   s    5fbAA r+   )r$   acceleratorcurrent_streamr   )r2   r0   s   ` r)   get_current_streamrF   E   s:    --f55F(AAAA  r+   indexc                 r    t          |           }t          |t          j                  sJ d|              |S )Nz3Fork/join stream expected a stream object at index )r   
isinstancer$   r-   )rG   r0   s     r)   _get_stream_by_indexrJ   L   sG    )%00Ffel++  EeEE + Mr+   c                 r    t          |           }t          |t          j                  sJ d|              |S )Nz4Record/wait event expected an event object at index )r   rI   r$   r%   )rG   r(   s     r)   _get_event_by_indexrL   T   sG    (//EeU[))  FuFF ) Lr+   zstreams::fork )mutates_args
from_indexto_indexc                 ^    t           j                            t          |                     d S r#   r$   rD   
set_streamrJ   rO   rP   s     r)   fork_streamrU   \   s*    
 
  !5h!?!?@@@@@r+   c                     d S r#   rM   rT   s     r)   rC   rC   d   	    
 	Dr+   zstreams::joinc                 ^    t           j                            t          |                     d S r#   rR   rT   s     r)   join_streamrY   o   s(    	  !5h!?!?@@@@@r+   c                     d S r#   rM   rT   s     r)   rC   rC   t   rW   r+   zstreams::record_eventevent_indexstream_indexc                 l    t          |           }t          |          }|                    |           d S r#   )rL   rJ   recordr[   r\   r(   r0   s       r)   record_eventr`      s4    ,,E!,//F	LLr+   c                     d S r#   rM   r[   r\   s     r)   rC   rC      rW   r+   zstreams::wait_eventc                 l    t          |           }t          |          }|                    |           d S r#   )rL   rJ   waitr_   s       r)   
wait_eventre      s4    ,,E!,//F	JJvr+   c                     d S r#   rM   rb   s     r)   rC   rC      rW   r+   zstreams::synchronize_eventc                 L    t          |           }|                                 d S r#   )rL   synchronize)r[   r(   s     r)   synchronize_eventri      s'    ,,E	r+   c                     d S r#   rM   )r[   s    r)   rC   rC          Dr+   zstreams::synchronize_devicedevice_typedevice_indexc                 j    t           j                            t          j        | |                     d S r#   )r$   rD   rh   r2   rl   rm   s     r)   synchronize_devicerp      s+    	!!%,{L"I"IJJJJJr+   c                     d S r#   rM   ro   s     r)   rC   rC      rk   r+   zstreams::synchronize_streamc                 L    t          |           }|                                 d S r#   )rJ   rh   )r\   r0   s     r)   synchronize_streamrs      s'    !,//F
r+   c                     d S r#   rM   )r\   s    r)   rC   rC      rk   r+   zstreams::wait_streamwaiting_stream_indexwaited_on_stream_indexc                 l    t          |           }t          |          }|                    |           d S r#   )rJ   wait_stream)ru   rv   waiting	waited_ons       r)   rx   rx      s8    "#788G$%;<<I	"""""r+   c                     d S r#   rM   rb   s     r)   rC   rC      rW   r+   zstreams::sync_deallocwait_event_indexsrc_stream_index
to_deallocc                 Z    t           j        j        j                            | |           dS )a  An op which waits on an event and moves the last usage of to_dealloc
    after the wait, so that after the sync occurs, the deallocation or
    subsequent reuse of the tensor's memory will be guaranteed to happen
    after a side stream is finished using it.
    See https://docs.pytorch.org/docs/stable/generated/torch.Tensor.record_stream.html#torch.Tensor.record_stream
    for more detailsN)r$   opsstreamsre   defaultr|   r}   r~   s      r)   sync_deallocr      s*     
I (()9;KLLLLLr+   c                     d S r#   rM   r   s      r)   rC   rC      s	     	Dr+   zstreams::record_streamtensorc                 J    |                      t          |                     d S r#   )record_streamrJ   r   r\   s     r)   r   r      s%    
-l;;<<<<<r+   c                     d S r#   rM   r   s     r)   rC   rC      rW   r+   c                   d    e Zd ZdZddZddZddZdd	ej        dz  ddfd
Z	de
fdZdefdZdS )SymbolicStreamStatez)Track the currently entered stream if anyr!   Nc                    ddl m} g }t          j                                        rt                       t          j                                        } ||j                  }t          ||          }|t          k    sJ dt           d|             t          j        ||          }||_        |g}t          j        |          | _        d S )Nr
   r   z+Current stream must be registered at index z, got )source)r   r   r$   rD   is_availabler   rE   r2   r   r   r   createuser_object_indexcollectionsdequecur_stream_stack)selfr   	cur_stackr0   r   rG   
stream_vars          r)   __init__zSymbolicStreamState.__init__
  s    000000*,	))++ 	%&(((&5577F((77F
 )88E0000>R    100 -3F6JJJJ ,1J(#ICNCTD
 D
r+   r0   r.   c                 :    | j                             |           d S r#   )r   appendr   r0   s     r)   enter_streamz SymbolicStreamState.enter_stream&  s    $$V,,,,,r+   c                 8    | j                                          d S r#   )r   popr   s    r)   exit_streamzSymbolicStreamState.exit_stream)  s    !!#####r+   r2   c                 l    |&t          | j                  D ]}|j        |k    r|c S | j        d         S )N)reversedr   r2   )r   r2   r0   s      r)   
cur_streamzSymbolicStreamState.cur_stream,  sM    "4#899 " "=F**!MMM + $R((r+   c                 2    t          | j                  dk    S )Nr   )lenr   r   s    r)   in_stream_contextz%SymbolicStreamState.in_stream_context4  s    4())A--r+   c                     | j         d         }t          |t                    r5|                                s!t	          |                                          S t	          |j                  S )zOGet a Python object id for the current stream without realizing lazy variables.r   )r   rI   r   is_realizedid
peek_valuevaluer   s     r)   cur_stream_idz!SymbolicStreamState.cur_stream_id7  s_    &r*f122 	+6;M;M;O;O 	+f''))***&,r+   )r!   N)r0   r.   r!   Nr#   )r<   
__module____qualname____doc__r   r   r   r$   r2   r   boolr   intr   rM   r+   r)   r   r     s        33
 
 
 
8- - - -$ $ $ $) )!4 )@P ) ) ) ).4 . . . . s            r+   r   c            	            e Zd ZdZedddddeeef         dd fd            Zd	e	d         dedd
f fdZ
dddedef fdZdddedef fdZdefdZdefdZddZ xZS )StreamContextVariablez(This represents torch.cuda.StreamContexttxr   stream_to_enterr.   r    r!   c                     t          |fi |S r#   )r   )r   r   r    s      r)   r   zStreamContextVariable.createB  s&     %
 

 
 	
r+   r0   Nc                     || _          t                      j        dd|                                 j        id d| d S )Nr0   )target_valuesinitial_valuesrM   )r0   superr   
get_streamr   )r   r0   r    	__class__s      r)   r   zStreamContextVariable.__init__M  s[     	
#T__%6%6%HI	
 	
 	
 	
 	
 	
 	
r+   r   c                     |j                             |                                            t                                          |          S r#   )symbolic_stream_stater   r   r   enterr   r   r   r   s      r)   r   zStreamContextVariable.enterU  s<    
 	 --doo.?.?@@@ww}}R   r+   c                 j    |j                                           t                      j        |g|R  S r#   )r   r   r   exitr   s      r)   r   zStreamContextVariable.exit]  s8    
 	 ,,...uww|B&&&&&r+   c                 $    t           j        j        S r#   )r$   cudaStreamContextr   s    r)   python_typez!StreamContextVariable.python_typee  s    z''r+   c                     dS )NTrM   r   s    r)   supports_graph_breaksz+StreamContextVariable.supports_graph_breaksh  s    tr+   c                 2    | j         s
J d            | j         S )Nz,Stream context should have a separate stream)r0   r   s    r)   r   z StreamContextVariable.get_streamk  s     {JJJJJ{{r+   r!   r.   )r<   r   r   r   staticmethoddictstrr   r   r   r   r   r   r   typer   r   r   r   __classcell__r   s   @r)   r   r   ?  s^       22
#
)
 sCx.
 
!	
 
 
 \

x(89 
S 
T 
 
 
 
 
 
!)!2A!	! ! ! ! ! !')'2A'	' ' ' ' ' '(T ( ( ( (t           r+   r   c                       e Zd ZdZej        Z	 ddedej        dedz  de	ddf
 fdZ
defd	Zdefd
Zdddedee         deeef         def
 fdZdefdZdefdZdefdZddZddZedededeedgdf         fd            Z xZS )r.   z1Represents the device-agnostic torch.Stream classNproxyr   r   r    r!   c                     |&d|j         j        v r|j         j        d         |k    sJ || _        || _        |j        | _        || _         t                      j        di | d S )Nexample_valuer#   )nodemetar   r   r2   r   r   r   r   r   r   r   r    r   s        r)   r   zStreamVariable.__init__u  su     EJO!C!C:??3u<<<<

l!2(((((((r+   c                     t           j        S r#   )r$   r-   r   s    r)   r   zStreamVariable.python_type  s
    |r+   c                     | j         S r#   r   r   s    r)   get_real_python_backed_valuez+StreamVariable.get_real_python_backed_value  
    zr+   r   r   namer   c                    t          | j        |          sJ d|             ddlm}m} ddlm} |dk    rp|d         }t          |t                    sJ |j	        
                    dt          j        j        j        |j        | j        fi            t!          j        d           S |d	k    rp|d         }	t          |	t$                    sJ |j	        
                    dt          j        j        j        | j        |	j        fi            t!          j        d           S |d
k    rK|j	        
                    dt          j        j        j        | j        fi            t!          j        d           S |dk    r3 |t           | |j	        j
        d|g || g|z   |          R            S |dk    r(ddlm}
 |j	                            t/          | j                             |r2t          |d         t                    r|d         }|j        }|j        }n\| j                                        }t3          |t                              t7          g           t9          i                               }|j	        
                    dt          j        j        j        || j        fi             |
||j	        
                    dt:          |fi                     S ||v rt=          |          dk    r|sddlm }m!} | j"        r( || j"        #                    |j$                             |d         }t          |t$                    stK          j&        |tN                    S |j"        r1| j"        J  || j"        #                    |j$                             tK          j&        | ||         | j        |j                            S tQ                      )                    ||||          S )Nzno stream method found named r
   )cmp_name_to_op_mappingproxy_args_kwargsr   wrap_fx_proxy_clsre   r   call_functionrx   rh   querycall_method
target_clsr   r   r`   )wrap_fx_proxy)r   r   GuardBuilderinstall_guard)*hasattrr   utilsr   r   builderr   rI   r&   outputcreate_proxyr$   r   r   re   r   r   r   r.   rx   rs   r   'check_event_record_after_input_mutationr   r`   r   r'   r   r   r   r   guardsr   r   r   
make_guardEQUALS_MATCHr   buildNotImplementedr   r   )r   r   r   r   r    r   r   r   	event_argother_streamr   	event_varr(   r[   r   r   otherr   s                    r)   r   zStreamVariable.call_method  sW    tz4((PP*P$*P*PPP(EEEEEEEE......<QIi77777I""	!,,d.DE	   $*4000]""7LlN;;;;;I""	!-')GH	   $*4000]""I""	!4')	   $*4000W__$$+,bi,!4*;*;TFTM6*R*R      ^##......I==bnnMMM 
47M::  G	!'9
//11;!BB%b))+<R+@+@   I""	!.d45	   !=i,,#0 N	     +++D		Qv<<<<<<<<{ Qdk44\5NOOPPP GEe^44 A&,R@@@| Q{...dk44\5NOOPPP"(,&t,TZEE  
 ww""2tT6:::r+   c                     | j         S r#   r   r   s    r)   as_proxyzStreamVariable.as_proxy  r   r+   c                     dS )Nztorch._CrM   r   s    r)   module_namezStreamVariable.module_name  s    zr+   c                     dS )Nr-   rM   r   s    r)   fn_namezStreamVariable.fn_name  s    xr+   codegenr   c                    | j         rJ | j        j                    fd                                                   | j                                                 t          dd                     d S d| j         }j        j	        
                    || j                  }                                        |d                     d S )Nc                  X                          t          j        j        j        d          S )Nr   r8   r  s   r)   r=   z,StreamVariable.reconstruct.<locals>.<lambda>  s%    00M7@2  r+   r   F_stream_Tadd)r   r   r>   append_outputcreate_load_constr?   r   r2   r   r   install_global_by_idr   create_load_globalr   r  prefixr   s    `  r)   reconstructzStreamVariable.reconstruct  s     ;!-!!      !!'";";D<R"S"STTT!!"6q%"@"@AAAAA .--F:$99&$*MMD!!'"<"<Tt"<"L"LMMMMMr+   c                     | S r#   rM   r   s    r)   r   zStreamVariable.get_stream  s    r+   c                 .     dt           dddd f fd}|S )NrG   r  r   r!   c                 "                        fd                                fd                                                       t          dd                                         t          dd                     d S )Nc                  X                          t          j        j        j        d          S r6   r8   r  s   r)   r=   zNStreamVariable.make_construct_in_graph_stream_fn.<locals>.fn.<locals>.<lambda>  %    00M7@0  r+   c                  X                          t          j        j        j        d          S )Nbuild_streamr9   r$   r:   r   r<   r  s   r)   r=   zNStreamVariable.make_construct_in_graph_stream_fn.<locals>.fn.<locals>.<lambda>  s$    00M'0.  r+   r
   Fr   r>   r?   r   rG   r  r   r    s    `r)   fnz<StreamVariable.make_construct_in_graph_stream_fn.<locals>.fn      !!      !!     
 GDMMMGFOOO!!"6q%"@"@AAA!!"6q%"@"@AAAAAr+   r   r   r    r  s   `` r)   r/   z0StreamVariable.make_construct_in_graph_stream_fn  M    	Bc 	BK 	BD 	B 	B 	B 	B 	B 	B 	B" 	r+   r#   r  r   r!   Nr   )r<   r   r   r   r$   r-   _cpython_typer	   r   r   r   r   r   objectr   r   listr   r   r   r   r   r  r  r   r   r   r   r   r/   r   r   s   @r)   r.   r.   p  s       ;;LM )-	) )) |) :	)
 ) 
) ) ) ) ) )&T    f    c;#c; c; ?#	c;
 S/)*c; 
c; c; c; c; c; c;J%    S        N N N N&    %6	3$d*	+   \    r+   r.   c                   T     e Zd ZdZej        j        ZdefdZ	ddde
ddf fdZ xZS )	CudaStreamVariablezMRepresents torch.cuda.Stream, preserving device-specific type and attributes.r!   c                 $    t           j        j        S r#   )r$   r   r-   r   s    r)   r   zCudaStreamVariable.python_type/  s    z  r+   r   r   r   r   c                    ddl m} |dk    rddlm}m} | j        r( || j                            |j                             t          | j	        d          r |j
        | j	        j                  S t          | j	        d          r |j
        | j	        j                  S t                                          ||          S )Nr   r   cuda_streamr
   r   native_handle) r   r   r   r   r   r   r   r   r   r   r(  r)  r   var_getattr)r   r   r   r   r   r   r   s         r)   r+  zCudaStreamVariable.var_getattr2  s    &&&&&&=  <<<<<<<<{ Qdk44\5NOOPPPtz=11 G.'.tz/EFFFtz?33 I.'.tz/GHHHww""2t,,,r+   )r<   r   r   r   r$   r   r-   r!  r   r   r   r+  r   r   s   @r)   r%  r%  *  s        WWJ%M!T ! ! ! !-5 -S -EV - - - - - - - - - -r+   r%  c                   4    e Zd Zdedej        dedz  deddf
 fdZde	fdZ
defd	Zd
ddedee         deeef         def
dZdefdZed
ddee         deeef         dedef         fd            Zedededeedgdf         fd            ZddZ xZS )r&   r   r   r   Nr    r!   c                     |&d|j         j        v r|j         j        d         |k    sJ  t                      j        di | || _        || _        || _        d S )Nr   rM   )r   r   r   r   r   r   r   r   s        r)   r   zEventVariable.__init__E  sl     EJO!C!C:??3u<<<<""6"""

!2r+   c                     t           j        S r#   )r$   r%   r   s    r)   r   zEventVariable.python_typeS  s
    {r+   c                     | j         S r#   r   r   s    r)   r   z*EventVariable.get_real_python_backed_valueV  r   r+   r   r   r   r   c                    ddl m} ddlm} |dk    rkt                              |||          \  }}|j                            dt          j	        j
        j        | j        |fi            t          j        d           S |dk    rt                              |||          \  }	}|j                            t!          |	j                             |j                            dt          j	        j
        j        | j        |fi            t          j        d           S |dk    rK|j                            dt          j	        j
        j        | j        fi            t          j        d           S |d	k    r3 |t          | |j        j        d
|g || g|z   |          R            S t)          | j                  j         dt)          | j                  j         d| }
t/          dt1          |          d|
 dg t2          j                   d S )Nr
   )r   r   r   rd   r   r^   rh   r   r   r   .zUnsupported event methodz#Dynamo doesn't support tracing the zC method. We currently support wait, record, synchronize, and query.)gb_typecontextexplanationhints)r   r   r   r   r&   _get_stream_argr   r   r$   r   r   re   r   r   r   r   r   r   r`   ri   r   r   r   r   r   r   SUPPORTABLE)r   r   r   r   r    r   r   rC   r\   
stream_argmethod_names              r)   r   zEventVariable.call_methodY  sx    	.-----......6>>+;;BfMMOA|I""	!,*     $*4000X'4'D'DRv'V'V$JI==bAQ>R>RSSSI""	!.*     $*4000]""I""	!3')	   $*4000W__$$+,bi,!4*;*;TFTM6*R*R      
##.WWdj1A1A1NWWQUWW  2D		N+ N N N&2     r+   c                     | j         S r#   r   r   s    r)   r   zEventVariable.as_proxy  r   r+   r.   c                     d}|r	|d         }n|r|                     d          }|s"| j                                        }||j        fS ||j        fS )a;  Returns (stream_variable, stream_index_for_op).

        The ambient current stream is registered at index 0 in the external
        object registry.  The inductor wrapper updates index 0 at runtime so
        that cudagraph capture sees the capture stream, not the stale
        trace-time default stream.
        Nr   r0   )getr   r   r   )r   r   r    r8  r   s        r)   r6  zEventVariable._get_stream_arg  sm     
 	.aJJ 	.H--J 	<1<<>>Jz;;;:777r+   r   c                 .     dt           dddd f fd}|S )NrG   r  r   r!   c                 "                        fd                                fd                                                       t          dd                                         t          dd                     d S )Nc                  X                          t          j        j        j        d          S r6   r8   r  s   r)   r=   zLEventVariable.make_construct_in_graph_event_fn.<locals>.fn.<locals>.<lambda>  r  r+   c                  X                          t          j        j        j        d          S )Nbuild_eventr  r  s   r)   r=   zLEventVariable.make_construct_in_graph_event_fn.<locals>.fn.<locals>.<lambda>  s$    00M'0-  r+   r
   Fr   r  r  s    `r)   r  z:EventVariable.make_construct_in_graph_event_fn.<locals>.fn  r  r+   r  r  s   `` r)   r'   z.EventVariable.make_construct_in_graph_event_fn  r  r+   r  c                     | j         rJ d}|j        j                            || j                  }|                    |                    |d                     d S )N_eventTr  )r   r   r   r  r   r
  r  r  s       r)   r  zEventVariable.reconstruct  s_     ;z 55fdjIIg8848HHIIIIIr+   r   )r<   r   r   r	   r$   r%   r   r   r   r   r   r"  r   r   r#  r   r   r   r   r   tupler6  r   r   r   r'   r  r   r   s   @r)   r&   r&   D  s       33 {3 :	3
 3 
3 3 3 3 3 3T    f    ?#? ? ?#	?
 S/)*? 
? ? ? ?B%     8#8?#8 S/)*8 
$	%	8 8 8 \80 %6	3$d*	+   \,J J J J J J J Jr+   r&   )Nr   collections.abcr   typingr   r   r$   torch._dynamo.variables.dictsr   torch._dynamo.variables.listsr   torch.fxr   r	   r*  r   bytecode_transformationr   excr   r   r;   r   r   r   r   r   r   r   baser   constantr   ctx_managerr   lazyr   torch._dynamo.symbolic_convertr   r  r   torch._library.custom_opsr   Tensorr   r*   rD  r1   r2   r@   rF   r-   rJ   r%   rL   rU   register_fakerC   r   r   forkr   rY   joinr`   re   ri   r   rp   rs   rx   r   r   r   r   r.   r%  r&   rM   r+   r)   <module>rV     s	       $ $ $ $ $ $                  ; ; ; ; ; ; 7 7 7 7 7 7 + + + + + + + +             : : : : : : . . . . . . . .              ) ( ( ( ( ( ! ! ! ! ! ! & & & & & & 4 4 4 4 4 4 % % % % % %  $DDDDDD###### / / / / / / 
S C C    eCj C C    5EL 5k 5d 5 5 5 5u|          s u{     ?,,,AAA 
A A A -,A 			 
	 	 	 	 	!&. / / / ?,,,AC A3 A4 A A A -,A 			 
	 	 	 	 	!&. / / / "444c      54 			 
	 	 	 	 	!.6 7 7 7  r222C s t    32 			 
	 	 	 	 	!,4 5 5 5 'b9993 4    :9
  	3 	4 	 	 	 ! 	 	!3; < < < (r:::KC Ks Kt K K K ;:K !	3 	c 	d 	 	 	 "!	 	!4< = = = (r:::S T    ;:
 !	C 	D 	 	 	 "!	 	!4< = = = !333#c #3 #4 # # # 43# 			 
	 	 	 	 	!-5 6 6 6 "444	M	M-0	M>Cl	M		M 	M 	M 54	M 			 	 
		 	 	 	 	!.6 7 7 7 #"555=%, =c =d = = = 65= 	L		 
	 	 	 	 	!/7 8 8 85  5  5  5  5  5  5  5 p. . . . .7 . . .bw w w w w* w w wt- - - - - - - -4PJ PJ PJ PJ PJO PJ PJ PJ PJ PJr+   