
    9j\              	       
   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jV                  Z+dedede,fdZ-de.e   dede,fdZ/dej`                  ddddfdZ1dej`                  de,fdZ2de,dejf                  fd Z4de,dejj                  fd!Z6 e*d"d#$      d%e,d&e,ddfd'       Z7e7jp                  d%e,d&e,ddfd(       Z9 eejt                  jv                  jx                  jz                          e*d)d#$      d%e,d&e,ddfd*       Z>e>jp                  d%e,d&e,ddfd+       Z9 eejt                  jv                  j~                  jz                          e*d,d#$      d-e,d.e,ddfd/       Z@e@jp                  d-e,d.e,ddfd0       Z9 eejt                  jv                  j                  jz                          e*d1d#$      d-e,d.e,ddfd2       ZAeAjp                  d-e,d.e,ddfd3       Z9 eejt                  jv                  j                  jz                          e*d4d#$      d-e,ddfd5       ZBeBjp                  d-e,ddfd6       Z9 eejt                  jv                  j                  jz                          e*d7d#$      d8eCd9e,ddfd:       ZDeDjp                  d8eCd9e,ddfd;       Z9 eejt                  jv                  j                  jz                          e*d<d#$      d.e,ddfd=       ZEeEjp                  d.e,ddfd>       Z9 eejt                  jv                  j                  jz                          e*d?d#$      d@e,dAe,ddfdB       ZFeFjp                  d-e,d.e,ddfdC       Z9 eejt                  jv                  j                  jz                          e*dDd#$      dEe,dFe,dGejV                  ddfdH       ZGeGjp                  dEe,dFe,dGejV                  ddfdI       Z9 eejt                  jv                  j                  jz                          e*dJd#$      dKejV                  d.e,ddfdL       ZHeHjp                  dKejV                  d.e,ddfdM       Z9 eejt                  jv                  j                  jz                          G dN dO      ZI G dP dQe"      ZJ G dR dSeJ      ZK G dT dUeK      ZL G dV dWe      ZMy)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        j	                  t        g       t        i                   S N)torchEventr   EventVariable make_construct_in_graph_event_fnr   r   )r   r    events      _/media/conek/DATA/Code/OCR/venv/lib/python3.12/site-packages/torch/_dynamo/variables/streams.py	new_eventr*   &   sC    KK((E(66"04	
     c            	          t        j                  | i |}t        |t        j	                  t        g       t        i                   S r#   )r$   Streamr   StreamVariable!make_construct_in_graph_stream_fnr   r   )r   r    streams      r)   
new_streamr1   0   sC    \\4*6*F(88"04	
 r+   devicecgr   c                     j                  fd        t        |              j                  t        dd             y )Nc                  l     j                  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(    ##MM//88(
 r+   r   F)add_push_nullr   extend_outputr   )r2   r3   s    `r)   _codegen_current_streamr@   :   s<    	
 6"#)!U34r+   c                 `     t         j                  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 r+   )r$   acceleratorcurrent_streamr   )r2   r0   s   ` r)   get_current_streamrF   E   s,    --f5F(A r+   indexc                 d    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   s8    )%0Ffell+ 
=eWE+ Mr+   c                 d    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   s8    (/EeU[[) 
>ugF) Lr+   zstreams::fork )mutates_args
from_indexto_indexc                 T    t         j                  j                  t        |             y r#   r$   rD   
set_streamrJ   rO   rP   s     r)   fork_streamrU   \   s    
 
  !5h!?@r+   c                      y r#   rM   rT   s     r)   rC   rC   d       
 	r+   zstreams::joinc                 T    t         j                  j                  t        |             y r#   rR   rT   s     r)   join_streamrY   o   s    	  !5h!?@r+   c                      y r#   rM   rT   s     r)   rC   rC   t   rW   r+   zstreams::record_eventevent_indexstream_indexc                 R    t        |       }t        |      }|j                  |       y r#   )rL   rJ   recordr[   r\   r(   r0   s       r)   record_eventr`      s"    ,E!,/F	LLr+   c                      y r#   rM   r[   r\   s     r)   rC   rC      rW   r+   zstreams::wait_eventc                 R    t        |       }t        |      }|j                  |       y r#   )rL   rJ   waitr_   s       r)   
wait_eventre      s"    ,E!,/F	JJvr+   c                      y r#   rM   rb   s     r)   rC   rC      rW   r+   zstreams::synchronize_eventc                 :    t        |       }|j                          y r#   )rL   synchronize)r[   r(   s     r)   synchronize_eventri      s    ,E	r+   c                      y r#   rM   )r[   s    r)   rC   rC          r+   zstreams::synchronize_devicedevice_typedevice_indexc                 j    t         j                  j                  t        j                  | |             y r#   )r$   rD   rh   r2   rl   rm   s     r)   synchronize_devicerp      s!    	!!%,,{L"IJr+   c                      y r#   rM   ro   s     r)   rC   rC      rk   r+   zstreams::synchronize_streamc                 :    t        |       }|j                          y r#   )rJ   rh   )r\   r0   s     r)   synchronize_streamrs      s    !,/F
r+   c                      y r#   rM   )r\   s    r)   rC   rC      rk   r+   zstreams::wait_streamwaiting_stream_indexwaited_on_stream_indexc                 R    t        |       }t        |      }|j                  |       y r#   )rJ   wait_stream)ru   rv   waiting	waited_ons       r)   rx   rx      s&    "#78G$%;<I	"r+   c                      y r#   rM   rb   s     r)   rC   rC      rW   r+   zstreams::sync_deallocwait_event_indexsrc_stream_index
to_deallocc                 l    t         j                  j                  j                  j	                  | |       y)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&     
II  (()9;KLr+   c                      y r#   rM   r   s      r)   rC   rC      s     	r+   zstreams::record_streamtensorc                 8    | j                  t        |             y r#   )record_streamrJ   r   r\   s     r)   r   r      s    
-l;<r+   c                      y r#   rM   r   s     r)   rC   rC      rW   r+   c                   l    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y)SymbolicStreamStatez)Track the currently entered stream if anyr!   Nc                    ddl m} g }t        j                  j	                         rt                t        j                  j                         } ||j                        }t        ||      }|t        k(  sJ dt         d|        t        j                  ||      }||_        |g}t        j                  |      | _        y )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*,	))+&(&&557F(7F
 )8E00 =>R=S Tg0 -33F6JJ ,1J(#ICNCTCTD
r+   r.   c                 :    | j                   j                  |       y r#   )r   appendr   r0   s     r)   enter_streamz SymbolicStreamState.enter_stream&  s    $$V,r+   c                 8    | j                   j                          y r#   )r   popr   s    r)   exit_streamzSymbolicStreamState.exit_stream)  s    !!#r+   r2   c                 ~    |-t        | j                        D ]  }|j                  |k(  s|c S  | j                  d   S )N)reversedr   r2   )r   r2   r0   s      r)   
cur_streamzSymbolicStreamState.cur_stream,  sF    "4#8#89 "==F*!M" $$R((r+   c                 2    t        | j                        dkD  S )Nr   )lenr   r   s    r)   in_stream_contextz%SymbolicStreamState.in_stream_context4  s    4(()A--r+   c                     | j                   d   }t        |t              r)|j                         st	        |j                               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  sK    &&r*f126;M;M;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     sI    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                 l    || _         t        |   dd| j                         j                  id d| y )Nr0   )target_valuesinitial_valuesrM   )r0   superr   
get_streamr   )r   r0   r    	__class__s      r)   r   zStreamContextVariable.__init__M  s>     	
#T__%6%H%HI	
 	
r+   r   c                 t    |j                   j                  | j                                t        |   |      S r#   )symbolic_stream_stater   r   r   enterr   r   r   r   s      r)   r   zStreamContextVariable.enterU  s/    
 	  --doo.?@w}R  r+   c                 X    |j                   j                          t        |   |g| S r#   )r   r   r   exitr   s      r)   r   zStreamContextVariable.exit]  s+    
 	  ,,.w|B&&&r+   c                 6    t         j                  j                  S r#   )r$   cudaStreamContextr   s    r)   python_typez!StreamContextVariable.python_typee  s    zz'''r+   c                      y)NTrM   r   s    r)   supports_graph_breaksz+StreamContextVariable.supports_graph_breaksh  s    r+   c                 @    | 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{{{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
#
)
 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                     |6d|j                   j                  v r|j                   j                  d   |k(  sJ || _        || _        |j                  | _        || _        t        |   di | y )Nexample_valuer#   )nodemetar   r   r2   r   r   r   r   r   r   r   r    r   s        r)   r   zStreamVariable.__init__u  sf     EJJOO!C::???3u<<<

ll!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      zzr+   r   r   namer   c                 6   t        | j                  |      s
J d|        ddlm}m} ddlm} |dk(  r|d   }t        |t              sJ |j                  j                  dt        j                  j                  j                  |j                  | j                  fi        t!        j"                  d       S |d	k(  r|d   }	t        |	t$              sJ |j                  j                  dt        j                  j                  j&                  | j                  |	j                  fi        t!        j"                  d       S |d
k(  r`|j                  j                  dt        j                  j                  j(                  | j                  fi        t!        j"                  d       S |dk(  r6 |t         | |j                  j                  d|g || g|z   |             S |dk(  r*ddlm}
 |j                  j-                  t/        | j                               |r1t        |d   t              r|d   }|j                  }|j                  }nL| j                  j1                         }t3        |t        j5                  t7        g       t9        i                   }|j                  j                  dt        j                  j                  j0                  || j                  fi         |
||j                  j                  dt:        |fi             S ||v rt=        |      dk(  r|sddlm }m!} | jD                  r+ || jD                  jG                  |jH                               |d   }t        |t$              stK        jL                  |tN              S |jD                  r9| jD                  J  || jD                  jG                  |jH                               tK        jL                  | ||   | j                  |j                              S tP        |   ||||      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  s    tzz4(P,I$*PP(E.<QIi777II""		!!,,,,d.D.DE	 $**400]"7LlN;;;II""		!!--'')G)GH	 $**400]"II""		!!44'')	 $**400W_$+,bii,,!4*;TFTM6*R  ^#.II==bnM
47M: G	!'99

//1;!BB%b)+<R+@ II""		!!..d445	 !ii,,#0 N	  ++D	Qv<{{dkk44\5N5NOP GEe^4&,,R@@||{{...dkk44\5N5NOP"((,&t,TZZE 
 w"2tT6::r+   c                     | j                   S r#   r   r   s    r)   as_proxyzStreamVariable.as_proxy  r   r+   c                      y)Nztorch._CrM   r   s    r)   module_namezStreamVariable.module_name  s    r+   c                      y)Nr-   rM   r   s    r)   fn_namezStreamVariable.fn_name  s    r+   r   c                    | j                   rJ | j                  Zj                  fd       j                  j	                  | j                               j                  t        dd             y d| j                   }j                  j                  j                  || j                        }j                  j                  |d             y )Nc                  l     j                  t        j                  j                  j                  d      S )Nr   r8   codegens   r)   r=   z,StreamVariable.reconstruct.<locals>.<lambda>  s(    00MM7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<R"ST!!"6q%"@A  }-F::$$99&$**MD!!'"<"<Tt"<"L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                     j                  fd       j                  fd                       j                  t        dd             j                  t        dd             y )Nc                  l     j                  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MM77@@0 r+   c                  l     j                  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MM''00. r+   r
   Fr   r>   r?   r   rG   r  r   r    s    `r)   fnz<StreamVariable.make_construct_in_graph_stream_fn.<locals>.fn  g    !! !!
 DMFO!!"6q%"@A!!"6q%"@Ar+   r   r   r    r  s   `` r)   r/   z0StreamVariable.make_construct_in_graph_stream_fn  (    	Bc 	BK 	BD 	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   ;LLM )-	)) ||) :	)
 ) 
)&T f c;#c; c; ?#	c;
 S/)*c; 
c;J% S  N& %6	3$d*	+ r+   r.   c                   h     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                 6    t         j                  j                  S r#   )r$   r   r-   r   s    r)   r   zCudaStreamVariable.python_type/  s    zz   r+   r   r   r   r   c                    ddl m} |dk(  rddlm}m} | j
                  r+ || j
                  j                  |j                               t        | j                  d      r& |j                  | j                  j                        S t        | j                  d      r& |j                  | j                  j                        S t        | 9  ||      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    &= <{{dkk44\5N5NOPtzz=1.'..tzz/E/EFFtzz?3.'..tzz/G/GHHw"2t,,r+   )r<   r   r   r   r$   r   r-   r!  r   r   r   r+  r   r   s   @r)   r%  r%  *  sB    WJJ%%M!T !-5 -S -EV - -r+   r%  c                       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                     |6d|j                   j                  v r|j                   j                  d   |k(  sJ t        |   di | || _        || _        || _        y )Nr   rM   )r   r   r   r   r   r   r   r   s        r)   r   zEventVariable.__init__E  s[     EJJOO!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(  r{t        j                  |||      \  }}|j                  j                  dt        j                  j                  j                  | j                  |fi        t        j                  d       S |dk(  rt        j                  |||      \  }	}|j                  j                  t!        |	j"                               |j                  j                  dt        j                  j                  j$                  | j                  |fi        t        j                  d       S |dk(  r`|j                  j                  dt        j                  j                  j&                  | j                  fi        t        j                  d       S |d	k(  r6 |t        | |j                  j                  d
|g || g|z   |             S t)        | j"                        j*                   dt)        | j"                        j,                   d| }
t/        dt1        |      d|
 dg t2        j4                         y )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  s    	..6>+;;BfMOA|II""		!!,,**   $**400X'4'D'DRv'V$JII==bAQAQ>RSII""		!!..**   $**400]"II""		!!33'')	 $**400W_$+,bii,,!4*;TFTM6*R  

#../qdjj1A1N1N0OqQUPVW  2D	A+ OM N&22r+   c                     | j                   S r#   r   r   s    r)   r   zEventVariable.as_proxy  r   r+   r.   c                     d}|r|d   }n|r|j                  d      }|s(| j                  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  s_     
aJH-J11<<>Jz;;;;:7777r+   r   c                 ,     dt         dddd f fd}|S )NrG   r  r   r!   c                     j                  fd       j                  fd                       j                  t        dd             j                  t        dd             y )Nc                  l     j                  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                  l     j                  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MM''0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+   c                     | j                   rJ d}|j                  j                  j                  || j                        }|j                  |j                  |d             y )N_eventTr  )r   r   r   r  r   r
  r  r  s       r)   r  zEventVariable.reconstruct  sS     ;;zz  55fdjjIg8848H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T f ?#? ? ?#	?
 S/)*? 
?B%  8#8?#8 S/)*8 
$	%	8 80 %6	3$d*	+ ,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 +   : .  ) ! & 4 % D# / 
S C C eCj C C 5ELL 5k 5d 5u||    s u{{  ?,AAA 
A -A 			 
	 	 		!!&&.. / ?,AC A3 A4 A -A 			 
	 	 		!!&&.. / "4c    5 			 
	 	 		!!..66 7  r2C s t  3 			 
	 	 		!!,,44 5 'b93 4  :
   	3 	4 	 !	 		!!33;; < (r:KC Ks Kt K ;K !!	3 	c 	d 	 "	 		!!44<< = (r:S T  ;
 !!	C 	D 	 "	 		!!44<< = !3#c #3 #4 # 4# 			 
	 	 		!!--55 6 "4	M	M-0	M>Cll	M		M 5	M 			 	 
		 	 		!!..66 7 #"5=%,, =c =d = 6= 	LL		 
	 	 		!!//77 85  5 p.7 .bw* wt- -4PJO PJr+   