
    3j'                        S r SSKrSSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
Jr  SSKJrJr  SSKrSSKJr  SSKJrJrJr  SS	KJrJrJrJrJrJrJr  SS
KJ r J!r!  SSK"J#r#  SSK$J%r%J&r&J'r'J(r(J)r)J*r*J+r+  SSK,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;  SSK<J=r=J>r>J?r?  SSK@JArA  SSKBJCrC  SSKDJErE  \(       a  SSKFJGrG  SSKHJIrI  SSKJJKrK  SSS\R                  R                  S\\?   S\N\O\?4   SS4
S jrP\
S\OS\SSS\R                  R                  S\4
S j5       rQS\S-  S\R                  R                  SS4S  jrR " S! S"\?5      rS " S# S$\E5      rT " S% S&\T5      rU " S' S(\T5      rVg))aQ  
This module implements variable tracking for PyTorch nn.Module instances during Dynamo tracing.

It provides specialized handling for different types of nn.Module instances through several key classes:

- NNModuleVariable: Handles instance-specific module tracing, specializing on module id() and placing
  parameters directly on the torch.fx.GraphModule. This creates one graph per module instance.

- UnspecializedNNModuleVariable: Provides class-level module tracing, treating nn.Modules like other
  user-defined objects and passing parameters as inputs to the FX graph. This creates one graph per
  module class.

- UnspecializedBuiltinNNModuleVariable: Specifically handles built-in PyTorch modules (e.g. nn.Linear)
  with appropriate optimizations.

- FSDPManagedNNModuleVariable: Special handling for FSDP-wrapped modules with modified guarding behavior
  and parameter handling.

The module integrates with Dynamo's broader tracing functionality to handle module method calls,
parameter access, hooks, and other nn.Module behaviors while maintaining proper scoping and guarding
of module state.
    N)IterableSequence)contextmanagernullcontext)AnyTYPE_CHECKING)Source   )graph_break_hintstrace_rules	variables)handle_observed_exceptionObservedAttributeErrorraise_observed_exceptionraise_type_errorunimplementedUnspecializeRestartAnalysisUnsupported)GuardBuilderinstall_guard)GenerationTracker)
AttrSourceConstDictKeySourceDictGetItemSourceFSDPNNModuleSourceGetItemSourceNNModuleSourceUnspecializedNNModuleSource)"enumerate_items_with_dict_positionget_custom_getattrget_fake_valueis_lazy_moduleis_namedtupleis_safe_constantistensoristypennmodule_has_hooksobject_has_getattributeproxy_args_kwargsraise_args_mismatchset_example_valueunpatched_nn_module_callunpatched_nn_module_call_impl   )typestrValueMutationNewVariableTracker)invoke_and_store_as_constant)LazyVariableTracker)UserDefinedObjectVariable)InstructionTranslatorConstantVariable)DunderDictVariabletxr5   modargskwargsreturnc                 r  ^ ^ [        US5      (       ay  S[        S[        4UU 4S jjm[        X#5      u  pEU Vs/ s H  nT" U5      PM     nnUR                  5        VV	s0 s H  u  pUT" U	5      _M     n
nn	 UR	                  XU
5        ggs  snf s  sn	nf ! [
         a    [        [
        T S/S9   gf = f)aj  
Fairly coupled helper used by NNModuleVariable and UnspecializedNNModuleVariable.

Used to cause lazy module to be initialized (and delete its init hook) before tracing. Especially
useful now that 'allowed' modules graph-break on hooks, calling this first ensures there is no hook
by the time we trace __call__ and thus no graph-break for lazy allowed modules.
_initialize_hookxr=   c                   > [        U 5      (       a  [        U 5      " U4S jU  5       6 $ [        U [        5      (       a,  U R	                  5        VVs0 s H  u  pUT" U5      _M     snn$ [        U [
        [        [        45      (       a  [        U 5      " U4S jU  5       5      $ [        U [        R                  R                  5      (       a  [        U R                  T5      $ U $ s  snnf )Nc              3   4   >#    U  H  nT" U5      v   M     g 7fN .0elemconvert_to_fakes     [/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_dynamo/variables/nn_module.py	<genexpr>Binitialize_lazy_module.<locals>.convert_to_fake.<locals>.<genexpr>h   s      E14!6!61   c              3   4   >#    U  H  nT" U5      v   M     g 7frC   rD   rE   s     rI   rJ   rK   l   s     Ct44rL   )r#   type
isinstancedictitemslisttuplesettorchfxProxyr!   node)r@   kvrH   r9   s      rI   rH   /initialize_lazy_module.<locals>.convert_to_fakef   s    QAw E1 EFFAt$$:;'')D)$!?1--)DDAeS122AwCCCCAuxx~~..%affb11 Es   C'z0AttributeError during lazy module initializationr;   N)hasattrr   r)   rQ   _infer_parametersAttributeErrorr   )r9   r:   r;   r<   
proxy_argsproxy_kwargsarg	fake_argsrY   rZ   fake_kwargsrH   s   `          @rI   initialize_lazy_modulere   W   s     s&''
	s 
	s 
	 
	 $5T#B 
5?@Zc_S)Z	@9E9K9K9MN9Mq/!,,9MN	!!#+>% ( AN  	$HI	s   B!B:B B65B6
module_keysourcec              #   J  #    UR                   n[        R                  " SSU5      nUR                  R	                  US5      nUS:  a  U  SU 3OU n  XCR
                  4UR                  U '   US-   UR                  U'   S v   UR                  U 	 g ! UR                  U 	 f = f7f)Nz9\._(?:modules|parameters|buffers)\[(['\"])([^'\"\]]+)\1\]z.\2r   @r.   )nameresub	num_callsget	__class__nn_module_stack)rf   rg   r9   r:   fully_qualified_namerm   s         rI   record_nn_module_stackrr      s      ";;66D
   !5q9I09AJ<q,:J+*>)N:&-6])*z*Bz*s   AB#0B B#B  B#c           	         U (       a  SUR                   ;   a  [        UR                   S   5      (       al  UR                   S   n[        U S5      n[        U5      [        R
                  L a  [        US5      n[        UR                  [        R                  5      5        g [        U R                  [        R                  " [        R                  SS95      5        g g )Nforward__func__attr)__dict__callabler   rN   types
MethodTyper   
make_guardr   CLOSURE_MATCH	functoolspartialNOT_PRESENT_IN_GENERIC_DICT)rg   r:   fwdforward_sources       rI   &guard_to_detect_forward_monkeypatchingr      s      $#,,y2I)J)J,,y)C'	:NCyE,,,!+NJ!G.33L4N4NOP !!%%$@@y     c                   h  ^  \ rS rSrSSSS1\R
                  krS\S\S\R                  R                  S\SS4
U 4S	 jjrS(S jrS\4S jrS\SS4S jrS\4S jrS\4S jrS
SS\4S jrS
SS\S\R                  R                  S\S\SS4S jrS
SS\\   4S jrS
SS\SS4S jrS
SS\4S jrS)S jrS\R                  R                  S
SS\S\S\S-  4
S jrS
SS\S\4U 4S  jjrS
SS!\\   S\\\4   S\4S" jr       S*S# jr! S+S
SS\S!\\   S\\\4   S$\S\4U 4S% jjjr"S,S& jr#S'r$U =r%$ )-NNModuleVariable   module_typerf   valuenn_module_stack_sourcer<   r=   Nc                    > [         TU ]  " S0 UD6  Xl        X l        X0l        U R
                  U l        U R
                  U l        g )NrD   )super__init__r   rf   r   rg   r   )selfr   rf   r   r<   ro   s        rI   r   NNModuleVariable.__init__   s>     	"6"&$
 #kk&*kk#r   r9   r5   c                     [        U S5      (       d$  [        R                  R                  X5      U l        U R                  $ )Ndict_vt)r]   r   r8   creater   )r   r9   s     rI   get_dict_vtNNModuleVariable.get_dict_vt   s1    tY''$77>>rHDL||r   c                 V    U R                   =(       d    U R                  nU(       d   eU$ rC   r   rg   r   ress     rI   get_nn_module_stack_source+NNModuleVariable.get_nn_module_stack_source   "    ))8T[[
s
r   rg   c                     Xl         g rC   r   r   rg   s     rI   set_nn_module_stack_source+NNModuleVariable.set_nn_module_stack_source       &,#r   c                     U R                   $ rC   )r   r   s    rI   python_typeNNModuleVariable.python_type   s    r   c                     U R                   $ rC   )r   r   s    rI   get_real_python_backed_value-NNModuleVariable.get_real_python_backed_value   s    zzr   c                     SSK Jn  UR                  R                  U R                  5      nUR
                  " [        U5      5      $ )a1  nb_bool for nn.Module.

nn.Module itself has no __bool__ or __len__, so bare modules are always
truthy.  Subclasses like ModuleList/ModuleDict define __len__, so
bool(module) calls PyObject_IsTrue which falls through nb_bool (NULL)
to sq_length/mp_length.  We evaluate on the real module to capture this.
r.   r6   )constantr7   outputget_submodulerf   r   bool)r   r9   r7   r:   s       rI   	bool_implNNModuleVariable.bool_impl   s4     	/ii%%doo6&&tCy11r   submod	key_extraoptionsc                     g rC   rD   )r   r9   rg   r   r   r   s         rI   _wrap_submodule NNModuleVariable._wrap_submodule   s     	r   c                 T   UR                   R                  U R                  5      n/ n[        U[        R
                  R                  5      (       a  UR                  5        Ho  u  pE[        R                  " X5      nUR                   R                  UU R                  U[        [        U R                  U5      5      S9  UR                  U5        Mq     U$ [        U[        R
                  R                  [        R
                  R                   [        R
                  R"                  45      (       d   [%        U5      5       e['        U5       HW  u  puUR                  UR                   R                  UU R                  U[        [        U R                  U5      5      S95        MY     U$ Nrg   )r   r   rf   rO   rU   nn
ModuleDictrQ   r1   buildregister_attr_or_moduler   r   rg   append
ModuleListParameterList
Sequentialr/   	enumerate)r   r9   baseresultrj   r   name_varidxs           rI   unpack_var_sequence$NNModuleVariable.unpack_var_sequence   sM   yy&&t7(*dEHH//00 $

*00:		11OO)-T*JK	 2  h' !- M588&&(>(>@S@ST
 
 	4=	 
 %T?KCMM		11OO)-S*IJ	 2  + r   rj   r7   c           	         UR                   R                  U R                  5      n[        X25      n[	        U R
                  R                  [        R                  " [        R                  US95      5        [        R                  " X5      $ )Nrv   )r   r   rf   r]   r   rg   r|   r~   r   r   HASATTRr1   r   )r   r9   rj   r:   r   s        rI   call_obj_hasattr!NNModuleVariable.call_obj_hasattr  sg     ii%%doo6#KK""9#4#4\5I5IPT#UV	
 $$R00r   c                 f    UR                   R                  U R                  5      n[        USS5      $ )NtrainingF)r   r   rf   getattrr   r9   r:   s      rI   is_trainingNNModuleVariable.is_training   s)    ii%%doo6sJ..r   c                     UR                   R                  U R                  5      n[        R                  " U5        UR
                  R                  S:w  a  [        R                  " [        U5      5        [        e)zIRestart analysis treating this module as an UnspecializedNNModuleVariabler   )
r   r   rf   r   tagf_codeco_namemark_class_dynamicrN   r   r   s      rI   convert_to_unspecialized)NNModuleVariable.convert_to_unspecialized$  sT    ii%%doo6c" 99
*00c;))r   r   
obj_sourcec                    [        U5      (       a{  [        R                  " [        U5      S5      nU(       a  [	        US5      OSn [
        R                  " UU US9R                  U[
        R                  R                  U5      /0 5      $ [!        US
S9nUc  g[#        U[$        R&                  5      (       d#  [        SSU  SU 3SS/[        R                  QS	9  S[	        US5      0n[
        R                  " Xp40 UD6R                  U[(        R*                  " X#5      /0 5      $ ! [         a    [        U5         N[         a&    [        SSU  SU 3SS/[        R                  QS	9   Nf = f)zDCheck for a __getattr__ and handle it specially if it is implemented__getattribute__Nr   z5Custom __getattribute__ in nn.Module attribute accessvar_getattr  zXDynamo could not trace through the custom `__getattribute__` method on this `nn.Module`.z[Simplify your `__getattribute__` implementation, or replace it with a targeted `@property`.gb_typecontextexplanationhintsT)ignore_nn_module_getattrz6torch.nn.Module with a non-function custom __getattr__zDynamo detected a nn.Module object with a custom `__getattr__` method, but this method is not a standard Python function (e.g., it might be implemented in C/C++). Dynamo cannot currently trace into such non-standard `__getattr__` methods.zAvoid using objects with non-standard __getattr__ methods within the compiled region. If possible, implement __getattr__ as a standard Python function.rg   __getattr__)r(   inspectgetattr_staticrN   r   r   UserMethodVariablecall_functionr7   r   r   r   r   r   r   SUPPORTABLEr    rO   rz   FunctionTyper1   r   )	r   r   r9   rj   r   getattribute_fn
new_source
getattr_fnr   s	            rI   _custom_getattr_fallback)NNModuleVariable._custom_getattr_fallback.  s    #4((%44T$ZASTO>H
:'9:d  33#%  -Y%?%?%F%Ft%L$MrR	S( (tL
*e&8&899P&tfAdV4-A '22	$ Z
MBC++JHHVV&&r012
 	
Q * .)"- S*4&$8!EE +66
s   AD' 'E->,E-,E-c                   > U R                   =(       a    [        U R                   U5      nUR                  R                  U R                  5      n[
        R                  US5      nSn[        5       n[        R                  " UR                  5       H,  nUR                  UR                  R                  5       5        M.     U R                   (       d"  [        SSU  SU 3S/ [        R                   QS9  US:X  a  U R#                  U5      $ S n	X%;   a  XR   n	OcSU;   a  X%S   ;   a  X';  a	  US   U   n	OGS	U;   a  X%S	   ;   a	  US	   U   n	O0S
U;   a  X%S
   ;   a	  US
   U   n	O [        R$                  " XB5      n	SnUS:X  a  [1        U R                   U5        US:X  a&  U(       d  [2        R4                  " XR                  US9$ U(       af  [2        R4                  " X[7        U5      5      n[9        U[:        [<        45      (       a)  UR?                  [        U RA                  5       U5      5        U$ [C        U	[D        5      (       am  U R                   (       a,  [        [        U R                   S5      U5      n[        US5      n[F        RH                  " U	RJ                  US9RM                  X/0 5      $ [C        U	[N        5      (       a=  [F        RP                  " U	RR                  [F        RT                  " [-        U5      5      US9$ [C        U	[V        5      (       a$  [F        RH                  " U	RY                  U5      US9$ [C        U	[Z        R\                  5      (       a  [F        RP                  " XUS9$ [_        U	5      (       d  [a        U	5      (       a   [2        R4                  " X[7        U5      5      $ [        SS[c        U5       SU S[c        U	5       3S[c        U	5       S3SU S[c        U	5       S[c        U5       S3S/[        Rd                  QS9  [f        TU ]  X5      $ ! [&         aO    U R)                  XAX R                   S9n
U
b  U
s $ [+        [&        US[-        U5      R.                   SU S3/S9   GNf = f)Nrx   Tzgetattr with no sourcer   r   zDynamo does not know how to access an attribute on an `nn.Module` instance that lacks a source. This is usually an internal error in Dynamo.r   _modules_parameters_buffersF)r   r9   rj   r   '' object has no attribute 'r\   rt   ro   r   fgetz$Unsupported nn.Module attribute typeznn.Module subclass: z, name: z, attribute type: z>Dynamo does not support tracing nn.Module attributes of type ``zRefactor your code so that `z	` (type `z`) is not an attribute of `zqCurrently supported attribute types are methods, classmethods, staticmethods, properties, constants, and tensors.)5rg   r   r   r   rf   objectr   rT   r   getmroro   updaterx   keysr   r   
DYNAMO_BUGr   r   r_   r   r   rN   __name__r   r1   r   r   rO   r   UnspecializedNNModuleVariabler   r   r&   propertyr   UserFunctionVariabler   r   classmethodr   ru   r4   staticmethod__get__rz   r   r$   r%   r/   r   r   var_getattr)r   r9   rj   rg   r   	base_dictobject_memberall_class_attribute_namesr@   subobjr   outro   s               rI   r  NNModuleVariable.var_getattrm  s9   >DKK!>yy&&t7 ++D*=	$'E!/A%,,QZZ__->? 0 {{0&tfAdV47 6)445 :##B''_F)#*--5z*40Fi'Dm4L,L}-d3F9$:1F)Fz*40F //; % 924;;E;}"((^^FKK!''N64JKC# 02OPQQ ..t>>@$G J fh'';;'
4;;(LdSF'7F 55KK!  -Hb12 ,, 33OO77T
C! 
 -- 55NN4(!   2 233 33FPP!&))Xf-=-=&,,R9OPPB274=/$Oabijpbqars"`ahioap`qqr s6tfIgfoEVVqryz~r  rA  AB  C> +66		
 w"2,,Q " 664KK 7  %!M("d4j1122MdVSTUVs   #P" ")Q;*Q;:Q;r;   c                 <   UR                   R                  U R                  5      n[        U R                  U R	                  5       X5         [        U5      n[        U[        R                  R                  5      (       Ga"  UR                  R                  [        R                  R                  R                  L a  [        U5      (       a  U R                  U5        U(       a   S5       eU(       a  [        USS[        U5       S35        Uu  nUR                   R#                  5        Hj  u  pxUR%                  UR                   R'                  UU R                  U[)        [+        U R,                  U5      5      S9U/0 5        UR/                  5       nMl     UsS S S 5        $ U(       a*  UR0                  b  UR0                  U l        [5        XX#5        UR                   R7                  5       (       a  UR8                  R;                  S5      (       av  UR8                  S:w  af  [        USSS	9(       a  U R                  U5        S
SKJn	  U	" UUR                   R@                  " SU R                  /[C        X#5      Q76 S9sS S S 5        $ [        U[        RD                  RF                  5      (       a#  UR                  n
[+        U R,                  S5      nO"URH                  n
[+        U R,                  S5      n[K        U
[L        RN                  5      (       a(  U
RP                  n
[+        US5      nU /[S        U5      -   nO![K        U
[L        RT                  5      (       d   eURW                  [X        RZ                  " XS9UU5      sS S S 5        $ ! , (       d  f       g = f)Nz3Expected lazy sequential isn't a valid combination?ztorch.nn.Module.Sequentialz0 kwargs kwargsr   )z	torch.nn.z	torch.ao.ztorch.nn.utils.parametrizeT)check_forward_hookscheck_backward_hooksr.   wrap_fx_proxycall_moduler9   proxyrt   
_call_implru   ).r   r   rf   rr   r   r"   rO   rU   r   r   ro   rt   r'   r   r*   lenr   rQ   r   r   r   r   rg   popcls_to_becomer   re   is_root_tracer
__module__
startswithbuilderr  create_proxyr)   rV   GraphModuler  r&   rz   r{   ru   rR   r   inline_user_function_returnr   r   )r   r9   r;   r<   r:   is_lazyrb   
child_namer   r  fn	fn_sources               rI   r   NNModuleVariable.call_function  s    ii%%doo6#OOT<<>
 %S)G3 3 344MM))UXX-@-@-H-HH%c** 11"5 # I{ '4"v;-w/	 *-,,*<*<*>&J$$		99" OO&#1*T[[*2U#V	 :  	 &&(C +? O
 
R $$0'*'8'8D$
 'r= 		((**NN--.HIINN&BB%T 11"52$))00% +48O
 
` c588#7#788 B *4;;	 BIB *4;; EI"e..//B *9j AI 6DJ.D!"e&8&8999955222H
 
 
s   EN#CN	C:N
Nc                 n   SSK Jn  SSKJn  UR                  R                  U R                  5      n[        R                  R                  R                  [        R                  R                  R                  [        R                  R                  R                  [        R                  R                  R                  [        R                  R                  R                  4n[        U5      R                  U;  a  UR!                  5       (       a)  [#        UR%                  5       [&        [(        45      (       d  [+        SSU  SU 3SU S3S	/S
9  UR                  R,                  n[#        U[.        R0                  5      (       d   e[3        [3        U R4                  S5      S5      nUR7                  [8        R:                  " XxS9X/0 5      $ [#        X#5      (       Ga*  UR                  R<                  (       a  / n	[?        [A        [C        U5      5      5      UR%                  5          n
[E        XRR%                  5          5       HR  u  pX   n[G        [I        U R4                  U5      5      nU	RK                  UR                  RM                  UUUS95        MT     XRR%                  5          nUR                  RM                  UU  S3[G        [I        U R4                  UR%                  5       5      5      S9nU$ U RO                  U5        Sn[#        X$5      (       a  URQ                  UR                  5      nO8UR!                  5       (       a  UR%                  5       nO[+        SSU  SU 3S/ S
9  UU   nUR                  RM                  UU R                  U[G        [I        U R4                  U5      5      S9$ )Nr.   )SliceVariable)SymNodeVariablez6Invalid or non-const argument in nn.Module __getitem__zmp_subscript_impl: r   zFDynamo does not support calling method `__getitem__` of ``nn.Module`` z+ with a non-constant or non-(str, int) key.z9Use constant arguments of type str or int for __getitem__r   __getitem__ru   r   z.__getitem__(slice)r   z.Unsupported key type for nn.Module.__getitem__zEDynamo does not support getitem on `nn.Module` with non-constant key.))listsr%  tensorr&  r   r   rf   rU   r   r   r'  r   ParameterDictr   r   rN   is_python_constantrO   as_python_constantstrintr   ru   rz   r   r   rg   r  r   r   exportrR   ranger  r   r   r   r   r   r   evaluate_expr)r   r9   keyr%  r&  modulebuiltin_supportedr!  srcr   r   r   r   rY   
new_modulenew_module_variable	key_values                    rI   mp_subscript_impl"NNModuleVariable.mp_subscript_implO  s0    	)+((9 HH++HH++HH""..HH""..HH++
 <##+<<&&((s557#sDDT1$q>!==CHDo!qVW ##,,Bb%"4"45555Z]CZPC11..r>  c)) yyE#f+./0F0F0HI#,V4J4J4L-M#NKC	A(t{{A)FGCMM		99"#& :  $O $$:$:$<=
&(ii&G&Gf/0)%dkk33I3I3KL 'H '# +* --b1	c++))"))4I##%%..0IH-dV1SE:5 	"yy00OO!-Y"GH	 1 
 	
r   r   c                   >^ ^^^^^^^^^^ SSK JmJm  SSKJn  T R
                  mTR                  R                  T5      mS[        S[        4UUUU U4S jjnTS;   a  T R                  TTT5      $ TS:X  a8  [        T R
                  T R                  5       TT5         U" T5      sS S S 5        $ TS	:X  aU  [        R                  " [        R                   " TR"                  R$                  5      5      (       a  UR&                  " S
5      $ TS:X  a  TS   R)                  5       (       d  [+        TST ST S35        [-        TS   T5      (       d  [+        TST ST S35        TS   R.                  TS   R0                     n[-        U[2        5      (       a  U$ UR
                  mTR                  R                  T5      n	TR                  R5                  U	TT[7        [9        T R:                  T5      5      S9$ U(       a7  [=        TT5      n
TR"                  R>                   ST S3m[A        TU
TTT5      $ S;UUUUU 4S jjmS[        S[B        [        [D        4   4UUUUU4S jjnS[F        [H        [D        [D        4      SS4UUUU U4S jjnS[        S[D        SS4UUUU U4S jjnS[J        S[        S[J        4S jmTS:X  a  TR                  RL                  RO                  [Q        T R:                  S 5      5        T(       d  T(       a&  [S        TTS![U        T5       S"[U        T5       S#35        / nTRW                  5        H  u  mn	URY                  U" TU	5      5        M      T" U[[        5       S$9$ TS%:X  a  TR                  RL                  RO                  [Q        T R:                  S&5      5        / nTR\                  " S<0 U" S'S(5      D6 H  u  mnURY                  U" TU5      5        M      T" U[[        5       S$9$ TS):X  a  TR                  RL                  RO                  [Q        T R:                  S*5      5        / nTR^                  " S<0 U" S'S(S+5      D6 H  u  mnURY                  U" TU5      5        M      T" U[[        5       S$9$ TS,:X  a  TR                  RL                  RO                  [Q        T R:                  S 5      5        / nTR`                  " S<0 U" S-S'S+5      D6 H  u  mn	URY                  U" TU	5      5        M      T" U[[        5       S$9$ TS.:X  a  TR                  RL                  RO                  [Q        T R:                  S 5      5        T(       d  T(       a&  [S        TTS![U        T5       S"[U        T5       S#35        U" TRW                  5       5      $ TS/:X  aO  TR                  RL                  RO                  [Q        T R:                  S 5      5        U" TRa                  5       5      $ TS0:X  aW  TR                  RL                  RO                  [Q        T R:                  S&5      5        U" TR\                  " S<0 U" S(5      D65      $ TS1:X  aW  TR                  RL                  RO                  [Q        T R:                  S*5      5        U" TR^                  " S<0 U" S(5      D65      $ TS2:X  at  T(       d  T(       a&  [S        TTS![U        T5       S"[U        T5       S#35        / nT H)  nURY                  [        Rb                  " TU5      5        M+     T" U[[        5       S$9$ TS3:X  aJ  T(       d  T(       a&  [S        TTS![U        T5       S"[U        T5       S#35        U" TR/                  5       5      $ TS:X  aw  T(       d  T(       a&  [S        TTS![U        T5       S"[U        T5       S#35        / nTR/                  5        H  u  mn	URY                  U" TU	5      5        M      T" U[[        5       S$9$ TS4:X  a  T" T Re                  T5      [[        5       S$9$ TS5:X  a  [-        T[f        Rh                  Rj                  [f        Rh                  Rl                  45      (       aT  T(       aM  TS   R)                  5       (       a5  [        Rb                  " TTS   Ro                  5       TRp                  ;   5      $ TS6:X  d  [-        T[f        Rh                  Rr                  Rt                  Rv                  5      (       a  TS7:X  dC  [-        T[f        Rh                  Rr                  Rt                  Rx                  5      (       ao  TS8:X  ai  [=        TT5      Rz                  n
[Q        [Q        T R:                  T5      S95      nTR}                  [~        R                  " U
US9T /[        T5      -   T5      $ TTR"                  R                  ;   ai  [        TR"                  R                  T   5      (       aB  [        S: [        R                  " TTR                  5       5       5       5      (       a  U" T5      $ [        TT G]%  TT[        T5      T5      $ ! , (       d  f       G	N= f)=Nr.   )ListIteratorVariableTupleVariabler6   rj   r=   c           
         > T	R                   R                  STR                  S0 5      n[        UR                  T5        [        TT5      u  p#SSKJn  U" T	T	R                   R                  SU U/UQ7US9S9$ )Nget_attrrD   r.   r  call_method)r;   r<   r  )r   r  rf   r+   rX   r)   r  r  )
rj   	mod_proxyr`   ra   r  r;   r<   r3  r   r9   s
        rI   generic_call_method_helper@NNModuleVariable.call_method.<locals>.generic_call_method_helper  s     		..	I innf5'8v'F$J. ii,,!#1j1'	 -  r   r  _wrapped_call_implrt   _check_input_dimT_get_item_by_idxz``nn.Module`` z's call method z# requires a constant index argumentr   z# requires a tuple as first argumentr   __resultc                     > [        S [        R                  " T TR                  5       5       5       5      (       d   [	        SST ST ST  ST 3ST ST S3/ S9  g g )	Nc              3   @   #    U  H  oR                  5       v   M     g 7frC   )r+  rF   r@   s     rI   rJ   UNNModuleVariable.call_method.<locals>.assert_all_args_kwargs_const.<locals>.<genexpr>  s      0V1$$&&0V   z&non-const argument in nn.Module methodcall_method: r   z(Dynamo does not support calling method `z` of ``nn.Module`` z with non-constant arguments.r   )all	itertoolschainvaluesr   )r;   r<   r3  rj   r   s   rI   assert_all_args_kwargs_constBNNModuleVariable.call_method.<locals>.assert_all_args_kwargs_const  sy     09fmmo0V   D+D64&$qI!#f$7x?\!^r   namesc                    > T" 5         [        T	T
5      n[        R                  " U5      R                  " T Vs/ s H  o"R	                  5       PM     sn0 TR                  5        VVs0 s H  u  p4X4R	                  5       _M     snnD6nUR                  5         UR                  nU  Vs0 s H  o3XS   _M	     sn$ s  snf s  snnf s  snf rC   )r   r   	signaturebindr,  rQ   apply_defaults	arguments)rV  r!  r@   rY   rZ   
bound_argsr;   rT  r<   r3  rj   s         rI   
get_kwargs0NNModuleVariable.call_method.<locals>.get_kwargs  s    (*&B **2.333784a'')489?H1**,,HJ %%'#--J.34ez}$e44 9H 5s   B;(C *CrQ   zvariables.ListIteratorVariablec                    > / nU  HJ  u  p#UR                  TR                  R                  UTU[        T" TR                  U5      5      S95        ML     T" U[        5       S9$ )Nr   mutation_type)r   r   r   r   rg   r0   )	rQ   named_childrenrj   r   r<  
gen_sourcer2  r   r9   s	       rI   wrap_values1NNModuleVariable.call_method.<locals>.wrap_values  so     57N %%%II55-jd.KL	 6  !& (.>.@ r   objzvariables.TupleVariablec                    > T" [         R                  " TU 5      TR                  R                  UTU [	        T" TR
                  U 5      5      S9/5      $ r   )r1   r   r   r   r   rg   )rj   rf  r=  rc  r2  r   r9   s     rI   named_embed1NNModuleVariable.call_method.<locals>.named_embed/  sX     #))"d3II55-jd.KL	 6 
 
r   rg   c                     UR                  S5      nUS   S:X  a  U $ [        U5      S:  a-  UR                  S5      n[        X5      n [        U5      S:  a  M-  U $ )N.r    )splitr  r  r   )rg   rj   
name_splitr@   s       rI   rc  0NNModuleVariable.call_method.<locals>.gen_source<  sY    CJ!}"j/A%NN1%#F. j/A% Mr   rb  r   z0 args and 0 kwargsz
 args and r  r`  named_parametersr   prefixrecursenamed_buffersr   remove_duplicatenamed_modulesmemochildrenmodules
parametersbuffersr   rS  __iter____contains___get_abs_string_index_conv_forward_output_paddingru   c              3   @   #    U  H  oR                  5       v   M     g 7frC   )	is_tensorrL  s     rI   rJ   /NNModuleVariable.call_method.<locals>.<genexpr>  s     R+QaKKMM+QrN  )r=   NrD   )Jrl  r<  r=  r   r7   rf   r   r   r-  r1   r   rr   r   r   is_torch_inline_allowedr   getfilero   rF  r   r+  r   rO   rQ   r   r   r   r   r   rg   r   r   r2   rP   r   r   rS   r	   guard_on_key_orderaddr   r*   r  rb  r   r0   rp  rs  ru  r   r   rU   r   r   r*  r,  r   rx  conv_ConvNd_ConvTransposeNdru   r  r   r   rR   rx   ry   rP  rQ  rR  rS  r   r@  )r   r9   rj   r;   r<   r   r7   rB  mod_varr   r!  r]  rd  rh  rb  rp  paramrs  buffernamed_modules_listr   tmpitems_resultr"  r<  r=  rT  rc  r2  r3  ro   s   `````                   @@@@@@rI   r@  NNModuleVariable.call_method  s>	    	:.oo((-	S 	_ 	 	2 77 %%b$77Y (!@!@!BB 2$7 
 %%+*M*MOOF,,==>+
 +
 $**400%%7--// $VHOD6Ade d1g}55 $VHOD6Ade 1gmmDGMM2G'#@AA$$CYY,,S1F9944%mDKK&EF	 5   &B&&//0$w?D/BdFKK
	 
			5s 		5tCH~ 		5 		5	E#s(O,	-	 	"	c 	 	0I 	 		v 	S 	V 	 ##II((,,ZZ-PQv#)4ykCK=@	 57N & 5 5 7f%%k$&?@ !8'.>.@  ''II((,,Z]-ST68%66  Xy1 e !''D%(@A  ( 0@0B  _$II((,,ZZ-PQ35M & 4 4 !Xy2DE!f $$[v%>?! (EUEWXX_$II((,,ZZ-PQ8: & 4 4 !VX/AB!f #))+dF*CD! ("2B2D  ZII((,,ZZ-PQv#)4ykCK=@	 v44677YII((,,ZZ-PQv33566\!II((,,Z]-STv66OI9NOPPYII((,,ZZ-PQv33Lj6KLMMV^v#)4ykCK=@	 Fo33B<= '>N>PQQXv#)4ykCK=@	 v||~..W_v#)4ykCK=@	 35L &f##Kf$=> !/'DTDVWWZ'((,<L<N  N"6EHH$7$79O9O#PQQQ**,,"((DG..0FOOC  ++6588#3#3#8#8#@#@AAO+ 6588#3#3#8#8#I#IJJ-- &//B":dkk4#@*MI11..r)Dd#  F$$---))224899R9??4+QRRR-d337&r4dVDD[ s   i
ic                     UR                   R                  U R                  5      n[        R                  " U[        U5      5      $ )z<Sequence length for container modules (e.g., nn.Sequential).)r   r   rf   r1   r   r  )r   r9   r3  s      rI   	sq_lengthNNModuleVariable.sq_length  s1    ((9$$RV55r   )r   rf   r   r   rg   r   )r9   r5   r=   r8   )r9   r5   r=   N)r9   r5   r2  r1   r=   r1   )F)r9   r5   r=   r1   )&r   r  __qualname____firstlineno__r1   _nonvar_fieldsrN   r-  rU   r   Moduler   r   r   r	   r   r   r   r   r   r   r   rR   r   r   r   r   r   r   r  r   rP   r   r9  r@  r  __static_attributes____classcell__ro   s   @rI   r   r      s}    	
 
	'	'N22-029>2TW2	2
F 
- -D - T  f 23 2 2#  	
   
&= $BW <1)1141	1/5 /$ /*=
hhoo=
 $=
 	=

 =
 
4	=
~s-5 s-S s-_ s-jk#k 'k S/)*	k
 
kZ`
#`
 `
 
	`
P ]E#]E ]E '	]E
 S/)*]E ]E 
]E ]E~6 6r   r   c            
         ^  \ rS rSrSSS1\R
                  kr S\R                  R                  S\	SS4U 4S	 jjr
S
\S\4S jrS\4S jrS\SS4S jr\\R"                  S\\   4S j5       5       rSSS\\   4U 4S jjrSSS\\   S\\\4   S\4S jrSSS\S\\   S\\\4   S\4
U 4S jjrSSS\S\S\S-  4S jrSSS\S\4U 4S jjrSSS\S\4S jrSr U =r!$ )r   i  
value_typeis_state_mutatedr   r   r<   r=   Nc                    > SU;   a,  [        US   SS 5      n[        U5      UL a  [        U5      US'   [        TU ]  " SSU0UD6  SU l        U R
                  U l        g )Nr  r  r   FrD   )r   rN   r   r   r  rg   r   )r   r   r<   lazy_value_to_becomero   s       rI   r   &UnspecializedNNModuleVariable.__init__  sh    6!#*6,+?RV#W E{22
 (,E{|$/u// % '+kk#r   attr_sourcec                     U$ rC   rD   r   r  s     rI   _wrap_source*UnspecializedNNModuleVariable._wrap_source      r   c                 V    U R                   =(       d    U R                  nU(       d   eU$ rC   r   r   s     rI   r   8UnspecializedNNModuleVariable.get_nn_module_stack_source  r   r   rg   c                     Xl         g rC   r   r   s     rI   r   8UnspecializedNNModuleVariable.set_nn_module_stack_source  r   r   c                     [         R                  R                  R                  [         R                  R                  R                  [         R                  R                  R
                  1n [         R                  R                  R                  R                  5        Vs1 s H2  n[        US5      (       d  M  X;  d  M  [        UR                  5      iM4     sn$ s  snf )N__code__)rU   r   r  __setattr__r   __delattr__rx   rS  r]   idr  )	supportedr@   s     rI   _nn_module_method_ids3UnspecializedNNModuleVariable._nn_module_method_ids  s    
 HHOO''HHOO$$HHOO''
	 XX__--446
6q*% *+*< BqzzN6
 	
 
s    C9C Cr9   r5   c                   >  [         R                  " U R                  S5      nU[
        R                  R                  R                  [
        R                  R                  R                  [
        R                  R                  R                  4;   a7  UR                  [        R                  " X5      U /0 5      R                  U5      $ [        TU ]9  U5      $ ! [         a  n[        UeS nAff = f)Nr{  )r   r   r  r_   NotImplementedErrorrU   r   r   r{  r   r   r  r1   r   r   r   )r   r9   r!  ero   s       rI   r   1UnspecializedNNModuleVariable.unpack_var_sequence  s    	-''DB HH((HH""++HH((
 
 11%%b-  "!"%& w*2..'  	-%1,	-s   !C 
C/#C**C/r;   c                 
   U R                   n[        U5      (       a*  UR                  b  UR                  U l        [	        XX#5        [        U[        R                  R                  5      (       d  Sn[        U R                  U5      nOSn[        U R                  U5      n[        UR                  [        R                  5      (       Ga:  [        UR                  [        R                  5      (       Ga  UR                  R                  [         L Ga  UR                  R                  ["        L Ga  U R%                  US5      (       Gd  [&        R(                  " US5      n[        U[        R*                  5      (       Ga  UR,                  nU R/                  US5      R1                  5       R3                  5       (       GdE  U R/                  US5      R1                  5       R3                  5       (       Gd  U R/                  US5      R1                  5       R3                  5       (       Gd  U R/                  US5      R1                  5       R3                  5       (       Gd  U R/                  US5      R1                  5       R3                  5       (       Gdu  U R/                  US	5      R1                  5       R3                  5       (       GdA  UR/                  US
5      R3                  5       (       Gd  UR/                  US5      R3                  5       (       d  UR/                  US5      R3                  5       (       d  UR/                  US5      R3                  5       (       d  UR/                  US
5      R3                  5       (       d  UR/                  US5      R3                  5       (       db  UR/                  US5      R3                  5       (       d=  UR/                  US5      R3                  5       (       d  SnU R                  R4                  nU R6                  (       a  U R9                  X5      n	OS n	[;        U R6                  U5        U R6                  (       a.  [=        [?        [A        U5      5      U RC                  5       UU5      O	[E        5       n
U
   [        U[        R*                  [        RF                  RH                  45      (       d>  [J        RL                  " XU	SS9nURO                  X/[Q        U5      -   U5      sS S S 5        $ [R        RT                  " XiS9RO                  X/[Q        U5      -   U5      sS S S 5        $ ! , (       d  f       g = f)N__call__r  rt   _backward_hooks_backward_pre_hooks_forward_hooks_forward_hooks_with_kwargs_forward_pre_hooks_forward_pre_hooks_with_kwargs_global_backward_pre_hooks_global_backward_hooks_global_forward_hooks_global_forward_pre_hooksTrg   realizer   )+r   r"   r  r  re   rO   rU   rV   r  r   r&   r  rz   r{   r  ru   r,   r-   has_key_in_generic_dictr   r   r   nn_modules_globals_vtr  r  r  rt   rg   get_source_by_walking_mror   rr   r-  r  r   r   jitScriptFunctionr1   r   r   rR   r   r   )r   r9   r;   r<   r:   rj   r!  forward_method
globals_vtrg   ctxfn_vts               rI   r   +UnspecializedNNModuleVariable.call_function-  s    jj#  ,"%"3"3"2D9#uxx3344D$/BD$/B
 3<<!1!122s~~u'7'788%%)AA''+HH 00Y??$33CCN.%*<*<==55
$$R):;CCEIIKK'',ABJJLPPRR'',<=EEGKKMM'',HIWYSU '',@AIIKOOQQ'',LMWYSU "--b2NOSSUU!--b2JKOOQQ!--b2IJNNPP!--b2MNRRTT!--b2NOSSUU!--b2JKOOQQ!--b2IJNNPP!--b2MNRRTT$D00B;;33B=FF.t{{C@ {{ #BsG//1	  	 b5#5#5uyy7O7O"PQQ'--bVTR**2vT
/BFK S !55bHVVd+V SSs   A.T=0T==
Urj   c                   > US;   ap  [        U R                  U5      nU R                  (       a  U R                  X5      nOS n[        R
                  " XUSS9nUR                  X/[        U5      -   U5      $ U R                  X5      (       Gd   [        R                  " [        U R                  5      U5      n[        U[        5      (       aM  [!        U R                  X5      S5      n[        R
                  " XR"                  USS9nUR                  XU5      $ [%        US5      (       a`  ['        UR(                  5      U R+                  5       ;   a9  [-        SSU  SU SU SU 3S	U S
U R                   3S/[.        R0                  QS9  US:X  Ga  SU R                  R2                  ;   a  US   R5                  5       n	US   n
U
R7                  5       (       a+  U
R9                  5       [:        R<                  R>                  L d  XR                  R2                  S   ;   a  SU l         OvXR                  R2                  S   ;   a  SU l         OR[        U
[B        RD                  [B        RF                  45      (       d  XR                  R2                  S   ;   a  SU l         U[:        R<                  RH                  RJ                  L a"  [        US   [B        RL                  5      (       d'  U[:        R<                  RH                  RN                  L aP  [        R
                  " U[:        R<                  RH                  RN                  5      nUR                  XUS   /U5      $ [P        TU ]  X[        U5      U5      $ ! [         a    S n GNf = f)NrD  Tr  ru   r  z,UnspecializedNNModuleVariable missing methodrO  r   z'Dynamo does not support tracing method z of nn.Module z@Dynamo does not really define unspecialized nn.Module very well.r   r  r   r   r.   r   r   )*r   r  rg   r  r1   r   r   rR   r  r   r   rN   r   r_   rO   r  r   ru   r]   r  r  r  r   r   	DIFFICULTrx   r,  r  r   rU   r   	Parameterr  r   r   r   r  r  DeletedVariabler  r   r@  )r   r9   rj   r;   r<   r!  rg   r  method	attr_namer   ro   s              rI   r@  )UnspecializedNNModuleVariable.call_method  s
    77$/B{{77A#))"NE&&r6DJ+>GG++B55 //TZZ0@$G &,//#222<j (-- **2V<< 
++v'4+E+E+GGJ+D64&$qI"I$~^b^h^h]i jZ*44	 }$$**:M:M)M !G668	Q
 OO%%%*;*;*=ASAS*S**"5"5m"DD,0D)**"5"5j"AA,0D)%66%CC  !JJ$7$7
$CC -1D) %((//555tAw	(A(ABB588??666 (--b%((//2M2MN**2d1gGGw"2T$Z@@Q " s   *M: :N
	N
fieldname_vtc                     U R                  X5      n[        U[        R                  5      (       a  UR	                  U5      $ g rC   )r  rO   r   ConstDictVariablemaybe_getitem_const)r   r9   r  r  r   s        rI   getattr_helper,UnspecializedNNModuleVariable.getattr_helper  s;     ""2-gy::;;..w77r   c           
        >^^^ US;   a  TR                   R                  R                  X5      (       d  [        U R                  U5      n[        U[        5      (       at  [        U5      S:X  ae  U R                  (       a>  [        U R                  U5      n[        UR                  [        R                  5      5        [        R                  " 0 5      $ U R                  (       Ga  US;   Ga  TR                   R                  R                  X5      (       d  [        U R                  U5      n[        U R                  U5      m[        TR                  [        R                   5      5        TR                   R"                  R%                  T5        S[&        S[(        S[(        S[*        [,        [,        4   4UU4S jjm[        U4S	 j[/        U5       5       5      n[        R0                  " U[3        U5      TS
9$ [4        TU ]m  TU5      $ )N)r  r  r  r  r  r  r   )r  r  r  r  irY   rZ   r=   c                    > [         R                  " TU5      n[        TU 5      n[        TU5      n[        R
                  " X%5      nX64$ rC   )r1   r   r   r   r3   r   )	r  rY   rZ   r2  
source_keysource_valuer   hooks_dict_sourcer9   s	          rI   build_key_valueBUnspecializedNNModuleVariable.var_getattr.<locals>.build_key_value  sK     &++B2 00A1E
01BJO+221Cz!r   c              3   <   >#    U  H  u  pnT" XU5      v   M     g 7frC   rD   )rF   r  rY   rZ   r  s       rI   rJ   <UnspecializedNNModuleVariable.var_getattr.<locals>.<genexpr>$  s&      MGA!  a((Ms   r   )r   side_effectshas_pending_mutation_of_attrr   r   rO   rP   r  rg   r   r   r|   r   EMPTY_NN_MODULE_HOOKS_DICTr   r  SEQUENCE_LENGTHr  r  r.  r   rS   r1   r   NNModuleHooksDictVariablerN   r   r  )	r   r9   rj   
hooks_dicthooks_sourcer   r  r  ro   s	    `    @@rI   r  )UnspecializedNNModuleVariable.var_getattr  s    
 
 99))FFtRR$TZZ6
j$//C
Oq4H{{'1$++t'D%(33 , G G
 %66r:: KKK II**GGSS T2J *4;; =+66|7S7STUII((,,->?"""#&"78" "  A*M F
 66Z(1B  w"2t,,r   c           	      *   SSK Jn  UR                  X5      nU R                  USU5      nUc  U R                  USU5      nUc  U R                  USU5      nUc4  [	        [
        US[        U R                  5      R                   SU S3/S9  Uc   eU$ )	z
Dynamo tracing of nn.Module __getattr__ can be expensive if the model
has deep submodule hierarchy. Since the __getattr__ is stable, we can
directly look into the underlying datastructures. This saves a lot of
compilation time.
r.   )SourcelessBuilderr   r   r   r   r   r\   )	r  r  r   r  r   r_   rN   r   r   )r   r9   rj   r  r  r	  s         rI    manually_trace_nn_module_getattr>UnspecializedNNModuleVariable.manually_trace_nn_module_getattr.  s     	/#**24!!"mW=;%%b*g>C;%%b*g>C;$TZZ(1122MdVSTU 
r   )r  r   r  )"r   r  r  r  r4   r  rU   r   r  r   r   r	   r  r   r   r  r~   cacherT   r.  r  rR   r1   r   r   rP   r-  r   r@  r  r  r  r  r  r  s   @rI   r   r     s     
#	1	1	N2ehhoo 2 2 2( 6 F 
- -D - __
3s8 
  
/&= /$BW /0U#U 'U S/)*	U
 
Un\A#\A \A '	\A
 S/)*\A 
\A|)25@O	4	B-5 B-S B-_ B-H)14	 r   r   c                   *    \ rS rSrSrS\S\4S jrSrg)$UnspecializedBuiltinNNModuleVariableiK  z_
Differentiates between builtin nn modules (e.g. torch.nn.Linear) and user defined nn modules.
r  r=   c                     U$ rC   rD   r  s     rI   r  1UnspecializedBuiltinNNModuleVariable._wrap_sourceP  r  r   rD   N)r   r  r  r  __doc__r	   r  r  rD   r   rI   r  r  K  s     6 r   r  c                   v   ^  \ rS rSrSrS\R                  R                  S\SS4U 4S jjr	S\S\4S	 jr
S
rU =r$ )FSDPManagedNNModuleVariableiU  a  
Tracing behavior: trace into submodules and treat them as Unspecialized, do not
register parameters to the top-level, treat them as function inputs.

Guards behavior: if 'skip_fsdp_guards', many guards that would be installed
by a vanilla UnspecializedNNModuleVariable are simply dropped, on the basis
that a user wrapping their model in FSDP(model) is already opting into a
requirement to not modify internal model state, which would already break FSDP without
compilation.
r   r<   r=   Nc                 l   > UR                  S5      nUc   S5       e[        TU ]  " SSU0UD6  X0l        g )Nrg   zMFSDPManagedNNModule depends on having an accurate source to control guarding.r   rD   )rn   r   r   rg   )r   r   r<   rg   ro   s       rI   r   $FSDPManagedNNModuleVariable.__init__a  sC    H%! 	
[	
! 	/u//r   r  c                     [        U[        [        45      (       d?  [        R                  R
                  R                  (       a  [        U5      $ [        U5      $ U$ rC   )rO   r   r   rU   _dynamoconfigskip_fsdp_guardsr  s     rI   r  (FSDPManagedNNModuleVariable._wrap_sourcej  sL    ,.IJ
 
 }}##44)+662;??r   r   )r   r  r  r  r  rU   r   r  r   r   r  r  r  r  s   @rI   r  r  U  sB    	ehhoo      r   r  )Wr  r~   r   rQ  rk   rz   collections.abcr   r   
contextlibr   r   typingr   r   torch.nnrU   torch._guardsr	   rl  r   r   r   excr   r   r   r   r   r   r   guardsr   r   mutation_guardr   rg   r   r   r   r   r   r   r   utilsr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r   r/   r0   r1   	functionsr2   lazyr3   user_definedr4   torch._dynamo.symbolic_convertr5   r   r7   dictsr8   r   r  rP   r-  re   rr   r   r   r   r  r  rD   r   rI   <module>r     s  .    	  . 2 %    8 8   1 .      " = < 3 % 3 D*)&&	& ?
#& o%&	&
 
&R ++#+)@+GLxx++ +( TM  % 	 F[6 [6|r$= rj+H "? r   