Ë
    Z^(hÊX  ã                  óÔ  — d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZ d dlZd dlmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZmZ d d
lmZmZmZmZ d dlm Z m!Z!m"Z" d dl#m$Z$ d dl%m&Z&m'Z' d dl(m)Z) er
d dl*m+Z+m,Z,m-Z-  edg d¢«      Z.	 	 	 	 	 	 d'd„Z/	 	 	 	 	 	 d(d„Z0d)d„Z1 G d„ d«      Z2d*d„Z3e2jh                  e2jj                  e2jl                  e2jn                  e2jp                  e2jr                  e2jt                  dde2jv                  dddddddddd d!d"d#d$f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d+d%„Z<e=d&k(  r e3«        yy),é    )ÚannotationsN)Ú
namedtuple)ÚPath)ÚAnyÚCallableÚTYPE_CHECKING)Ú	setValueT)ÚBaseCppType)Ú	GenLazyIRÚGenLazyNativeFuncDefinitionÚGenTSLazyIR)Úget_grouped_native_functionsÚparse_native_yaml)Úerror_on_missing_kernelsÚgen_dispatcher_registrationsÚ"gen_dispatchkey_nativefunc_headersÚparse_backend_yaml)ÚNativeFunctionÚNativeFunctionsGroupÚOperatorName)ÚSelectiveBuilder)ÚFileManagerÚNamespaceHelper)Ú
YamlLoader)ÚIterableÚIteratorÚSequenceÚParsedExternalYaml)Úbackend_keyÚautograd_keyÚcpp_namespaceÚbackend_indicesÚfull_codegenc                ó  — t        | «      5 }t        j                  |t        ¬«      }d d d «       t	        t
        «      sJ ‚|j                  dg «      }|j                  dg «      }|j                  dg «      }t	        |t        «      sJ ‚t	        |t        «      sJ ‚t	        |t        «      sJ ‚|D �cg c]  }t        j                  |«      ‘Œ }}|D �cg c]  }t        j                  |«      ‘Œ }	}|||	fS # 1 sw Y   ŒÐxY wc c}w c c}w )N)ÚLoaderr#   Ú
non_nativeÚir_gen)
ÚopenÚyamlÚloadr   Ú
isinstanceÚdictÚpopÚlistr   Úparse)
Úbackend_yaml_pathÚgrouped_native_functionsÚfÚyaml_valuesr#   r&   r'   ÚnameÚfull_codegen_opnamesÚir_gen_opnamess
             úV/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torchgen/gen_lazy_tensor.pyÚparse_native_functions_keysr8   b   sö   € ô 
ÐÓ	 ð 6 AÜ—i‘i ¬*Ô5ˆ÷6ä�k¤4Ô(Ð(Ð(à—?‘? >°2Ó6€LØ—‘ ¨rÓ2€JØ�_‰_˜X rÓ*€FÜ�l¤DÔ)Ð)Ð)Ü�j¤$Ô'Ð'Ð'Ü�fœdÔ#Ð#Ð#ØAMÖN¸œL×.Ñ.¨tÕ4ÐNÐÐNØ;AÖB°4”l×(Ñ(¨Õ.ÐB€NÐBØ ¨^Ð;Ð;÷6ð 6üò OùÚBs   ŒC7Â2DÃDÃ7D c                ól  — 	 t        | «      5 }|j                  «       }t        |j                  d«      «      }d d d «       |D �cg c]	  }|vsŒ|‘Œ }}|r.t        d| › dt        j                  j                  |«      › �«      ‚y # 1 sw Y   ŒNxY w# t        $ r}t        d| › �«      |‚d }~ww xY wc c}w )Nú
z<Unable to read from the specified shape_inference_hdr file: zGMissing shape inference function.

Please add declare this function in zD:

and implement it in the corresponding shape_inference.cpp file.

)
r(   ÚreadÚsetÚsplitÚOSErrorÚAssertionErrorÚ	ExceptionÚosÚlinesepÚjoin)Úshape_inference_hdrÚexpected_shape_infr_declsr2   Úshape_infr_declsÚshape_infr_decl_linesÚeÚdeclÚmissing_declss           r7   Úvalidate_shape_inference_headerrK   u   sâ   € ðÜÐ%Ó&ð 	F¨!Ø Ÿv™v›xÐÜ$'Ð(8×(>Ñ(>¸tÓ(DÓ$EÐ!÷	Fð 3öØ°dÐBWÒ6WŠð€Mð ñ Üð%Ø%8Ð$9ð :ä‡�‡��ÓÐ  ð$ó
ð 	
ð ÷	Fð 	Fûô ò ÜØJÐK^ÐJ_Ð`ó
àð	ûðüòs9   ‚B �+B¸B Á	B1ÁB1ÂBÂ
B Â	B.ÂB)Â)B.c                  ó   — y)Naå  at::Tensor to_meta(const at::Tensor& tensor) {
  // undefined tensors can't be converted to the meta device, since they don't have sizes/strides
  if (!tensor.defined()) return tensor;
  auto out = at::native::empty_strided_meta_symint(tensor.sym_sizes(), tensor.sym_strides(), /*dtype=*/tensor.scalar_type(), /*layout=*/tensor.layout(), /*device=*/c10::Device(c10::kMeta), /*pin_memory=*/std::nullopt);
  // needs to handle wrapped numbers, so dtype promotion works properly.
  if (tensor.unsafeGetTensorImpl()->is_wrapped_number()) {
    out.unsafeGetTensorImpl()->set_wrapped_number(true);
  }
  return out;
}
std::optional<at::Tensor> to_meta(const std::optional<at::Tensor>& tensor) {
  if (tensor.has_value()) {
    return to_meta(*tensor);
  }
  return std::nullopt;
}

std::vector<at::Tensor> to_meta(at::ITensorListRef t_list) {
  std::vector<at::Tensor> outs;
  outs.reserve(t_list.size());
  for (const auto& tensor : t_list) {
    outs.push_back(to_meta(tensor));
  }
  return outs;
}
© rM   ó    r7   Úget_ltc_helper_fnsrO   �   s   € ðrN   c                  ó~   — e Zd ZU dZded<   dZded<   dZded<   d	Zded
<   dZded<   e	Z
ded<   eZded<   dZded<   y)Údefault_argsÚNodeÚstrÚ	node_baseNú
str | NoneÚnode_base_hdrú&torch/csrc/lazy/core/shape_inference.hrD   ztorch::lazy::LazyTensorÚtensor_classztorch/csrc/lazy/core/tensor.hÚtensor_class_hdrútype[GenLazyIR]Úlazy_ir_generatorú!type[GenLazyNativeFuncDefinition]Ú native_func_definition_generatorÚTorchScriptÚbackend_name)Ú__name__Ú
__module__Ú__qualname__rT   Ú__annotations__rV   rD   rX   rY   r   r[   r   r]   r_   rM   rN   r7   rQ   rQ   °   s]   … Ø€IˆsÓØ $€M�:Ó$ØGÐ˜ÓGØ1€L�#Ó1Ø;Ð�cÓ;Ø)2Ð�Ó2à#ð %Ð&Gó ð &€L�#Ô%rN   rQ   c                 óì  — t        j                  d¬«      } | j                  dddd¬«       | j                  dd	d
d¬«       | j                  ddt        dd¬«       | j                  ddt        d d¬«       | j                  dddd¬«       | j                  ddt        t
        j                  d¬«       | j                  ddt        t
        j                  d¬«       | j                  ddt        t
        j                  d ¬«       | j                  d!d"t        t
        j                  d#¬«       | j                  d$d%t        t
        j                  d&¬«       | j                  d'd(t        t
        j                  d)¬«       | j                  «       }t        t        «      j                  «       j                   d*   }t	        |d+z  d,z  d-z  «      }t
        j"                  }|j$                  rt&        }t
        j(                  }t+        ||j,                  |j.                  |j0                  |j2                  |j                  |j                  |j                  |j                  |j                  |||j                  «       y ).Nz"Generate Lazy Tensor backend files)Údescriptionz-sz--source-yamlz--source_yamlzApath to source yaml file containing operator external definitions)Úhelpz-oz--output-dirz--output_dirzoutput directoryz	--dry-runz	--dry_runF)ÚtypeÚdefaultrf   z--impl-pathz--impl_pathz9path to the source C++ file containing kernel definitionsz--gen-ts-loweringsz--gen_ts_loweringsÚ
store_truezIGenerate TorchScript lowerings in addition to Lazy IR and NativeFunctions)Úactionrf   z--node-basez--node_basez7Name of backend specific custom Lazy IR Node base classz--node-base-hdrz--node_base_hdrz;Path to header file defining custom Lazy IR Node base classz--shape-inference-hdrz--shape_inference_hdrzBPath to header file defining custom Lazy shape inference functionsz--tensor-classz--tensor_classz1Name of backend specific custom Lazy Tensor classz--tensor-class-hdrz--tensor_class_hdrz5Path to header file defining custom Lazy Tensor classz--backend-namez--backend_namezName of the backend to generateé   ÚatenÚsrcÚATen)ÚargparseÚArgumentParserÚadd_argumentÚboolrS   rQ   rT   rV   rD   rX   rY   r_   Ú
parse_argsr   Ú__file__ÚabsoluteÚparentsr[   Úgen_ts_loweringsr   r]   Úrun_gen_lazy_tensorÚsource_yamlÚ
output_dirÚdry_runÚ	impl_path)ÚparserÚoptionsÚ
torch_rootÚ	aten_pathr[   r]   s         r7   Úmainr�   ½   sˆ  € Ü×$Ñ$Ð1UÔV€FØ
×ÑØØØØPð	 ô ð ×Ñ˜˜n¨nÐCUÐÔVØ
×ÑØ�[¤t°UÐASð ô ð ×ÑØØÜØØHð ô ð ×ÑØØØØXð	 ô ð ×ÑØØÜÜ×&Ñ&ØFð ô ð ×ÑØØÜÜ×*Ñ*ØJð ô ð ×ÑØØÜÜ×0Ñ0ØQð ô ð ×ÑØØÜÜ×)Ñ)Ø@ð ô ð ×ÑØØÜÜ×-Ñ-ØDð ô ð ×ÑØØÜÜ×)Ñ)Ø.ð ô ð ×ÑÓ!€Gô ”h“×(Ñ(Ó*×2Ñ2°1Ñ5€JÜ�J Ñ'¨%Ñ/°&Ñ8Ó9€IÜ)5×)GÑ)GÐØ×ÒÜ'Ðä×5Ñ5ð %ô ØØ×ÑØ×ÑØ�‰Ø×ÑØ×ÑØ×ÑØ×ÑØ× Ñ Ø×#Ñ#ØØ(Ø×ÑõrN   FTztorch::lazyÚGetTensorListÚ$GetLtcTensorOrCreateForWrappedNumberÚTryGetLtcTensorzTORCH_LAZY_FN_COUNTER("lazy::")zLazyTensor::Createz$torch::lazy::CreateAtenFromLtcTensorz$torch::lazy::TupleAtenFromLtcTensorsztorch::lazy::ValueÚLazyTensorPtrztorch::lazy::GetBackendDevicec                ó*  ‡‡‡‡‡‡	‡‡‡‡‡‡‡‡‡‡‡‡‡‡.‡/‡0‡1‡2‡3‡4‡5‡6‡7— |j                  d«      }|d   }dj                  |d d «      }t        t        ||«      «       t        j
                  j                  | d«      Š7dˆˆ7fd„}  | ‰«      }!t        j
                  j                  | d«      }"t        j
                  j                  | d«      }#t        |"|#«      }$|$j                  |$j                  c}%Š.t        |%«      Š2dd„}&t        ‰2|&¬«      Š2t        |‰2‰.«      }'|'j                  Š/|'j                  }(|'j                  })|'j                  Š.t        |‰2«      \  Š1Š5Š3‰1f	 	 	 	 	 	 	 dd	„Š0t!        j"                  «       }*‰/€J ‚‰.‰/   j%                  «       }+|�t'        |%‰.‰/|(|+|‰1«       	 ‰	�5t)         ‰0t+        j,                  ‰.‰/   ‰«      ‰2«      «      },t/        ‰	|,«       |+€J ‚t1        |!|+|)‰.‰2‰/|(|«       |(€‰/gn‰/|(gD ]  }-t3        |!‰|+‰.‰2‰/|-|*|||d
¬«       Œ t5        |)«      Š6|!j7                  ‰/› d�dˆ.ˆ/ˆˆ0ˆˆˆˆˆˆˆˆ2ˆˆˆˆ6ˆˆ	ˆˆˆˆfd„«        |
‰.‰/   |||«      Š4|!j7                  ddˆ0ˆ1ˆ2ˆ3ˆ4ˆˆ6fd„«       |!j7                  ddˆ4ˆˆ5ˆ6fd„«       y )Nz::éÿÿÿÿÚ	templatesc                ó    •— t        | ‰‰¬«      S )N)Úinstall_dirÚtemplate_dirr{   )r   )rŠ   r{   r‹   s    €€r7   Úmake_file_managerz.run_gen_lazy_tensor.<locals>.make_file_managerI  s   ø€ ÜØ#°,Èô
ð 	
rN   znative/native_functions.yamlznative/tags.yamlc                ó¤   — t        | t        «      r| j                  j                  n| j                  }t	        |j
                  j
                  «      S )z¯
        We sort the native function because of the note in concat_map_codegen.
        TODO(alanwaketan): Remove this sorting hack once all ops are grouped properly.
        )r+   r   Ú
functionalÚfuncrS   r4   )r2   r�   s     r7   Úsort_native_functionz1run_gen_lazy_tensor.<locals>.sort_native_functionY  s6   € ô
 %/¨qÔ2FÔ$Gˆq�|‰|× Ò ÈQÏVÉVˆÜ�4—9‘9—>‘>Ó"Ð"rN   )Úkeyc              3  óÖ   K  — |D ]^  }t        |t        «      rt        |j                  «       «      n|g}|D ]+  }|j                  j
                  |v sŒ | |«      E d{  –—†  Œ- Œ` y7 Œ	­w)zÛ
        We code-gen for the functional variant, which is all we need for IR classes/lowerings/shape inferences, but we
        only code-gen additional entries for the inplace variant for the native functions.
        N)r+   r   r.   Ú	functionsr�   r4   )r�   ÚxsÚops_listÚxÚfsr2   s         r7   Úconcat_map_codegenz/run_gen_lazy_tensor.<locals>.concat_map_codegenu  sh   è ø€ ð ò 	'ˆAÜ(2°1Ô6JÔ(K”�a—k‘k“mÔ$ÐRSÐQTˆBØò '�Ø—6‘6—;‘; (Ò*Ù# A›w×&Ñ&ñ'ñ	'ð 'ús   ‚AA)ÁA)ÁA'Á
A)F)Úbuild_in_treeÚper_operator_headersr_   Úeager_registrationzNativeFunctions.cppzDispatchKeyNativeFunctions.cppc                 ó  •— ‰‰ddddddddd	d
d‰› d‰› d�‰› d�g‰rdgng z   D � cg c]  } d| › d�‘Œ
 c} t        «       d‰j                  ‰j                  t         ‰ ‰‰› d�‰‰   ‰‰‰‰‰
‰‰‰‰‰‰‰‰	«      ‰«      «      dœS c c} w )NzATen/Functions.hzATen/native/TensorConversions.hzATen/NativeFunctions.hz6ATen/CompositeExplicitAutogradNonFunctionalFunctions.hzATen/MetaFunctions.hzATen/Operators.hzATen/native/CPUFallback.hú!torch/csrc/lazy/core/ir_builder.hz*torch/csrc/lazy/core/lazy_graph_executor.hztorch/csrc/lazy/core/metrics.hútorch/csrc/lazy/core/shape.hú/zNativeFunctions.hz	/LazyIr.hz.torch/csrc/lazy/ts_backend/ts_eager_fallback.hú
#include <ú>Ú ÚNativeFunctions)ÚincludesÚ
helper_fnsÚnative_functions_includeÚnamespace_prologueÚnamespace_epilogueÚnative_function_definitions)rO   ÚprologueÚepiloguer.   )Úpathr"   r   Úbackend_namespacer˜   Úcreate_aten_from_ltc_tensorÚcreate_from_first_tensorÚcreate_tensorÚgen_forced_fallback_codeÚget_device_fnÚget_tensor_or_wrap_numberÚget_tensorlistr1   Úlazy_tensor_ptrÚmetrics_counterr]   Ú	ns_helperrz   rD   rX   rY   Útry_get_tensorÚtuple_aten_from_ltc_tensorss    €€€€€€€€€€€€€€€€€€€€€€r7   ú<lambda>z%run_gen_lazy_tensor.<locals>.<lambda>×  sý   ø€ ð %Ø'Ø&Ø5Ø,ØLØ*Ø&Ø/Ø7Ø@Ø4Ø2Ø!�l ! K =Ð0AÐBØ!�l )Ð,ðñ& 0ð FÑFàñ)öàð ˜T˜F !Ò$òô2 -Ó.Ø(*Ø"+×"4Ñ"4Ø"+×"4Ñ"4Ü+/Ù"Ù4Ø&˜- Ð7Ø'¨Ñ4Ø$Ø0Ø)Ø&Ø1Ø&Ø'Ø%Ø0Ø3Ø3Ø'Ø%óð" -ó%ó,ñ=4
€ ùòs   ¦BzLazyIr.hc            
     ó¤   •— dD � cg c]  } d| › d�‘Œ
 c} ‰�d‰› d�gng t         ‰‰‰‰‰z   «      «      ‰j                  ‰j                  dœS c c} w )N)zATen/core/Formatting.hzc10/core/ScalarType.hztorch/csrc/lazy/core/hash.hútorch/csrc/lazy/core/ir.hrž   ÚoptionalÚvectorr    r¡   z
#include "ú")Úlazy_ir_sysincÚlazy_ir_incÚir_declarationsr§   r¨   )r.   rª   r«   )r¬   r˜   r#   r1   r'   Úlazy_ir_objrV   r·   s    €€€€€€€r7   rº   z%run_gen_lazy_tensor.<locals>.<lambda>  s}   ø€ ðöàð ˜T˜F !Ò$òð Ð(ð )¨¨°qÐ9Ñ:àÜ#Ù"ØÐ!9¸<È&Ñ;Póó ð
 #,×"4Ñ"4Ø"+×"4Ñ"4ñ-
€ ùòs   †AzLazyNonNativeIr.hc                 ó¨   •— g d¢‰r‰gng z   D � cg c]
  } | rd| › d�‘Œ c} t        j                  ‰‰«      ‰j                  ‰j                  dœS c c} w )N)r¼   r�   z+torch/csrc/lazy/core/internal_ops/ltc_ops.hrW   r    r¡   )Úlazy_non_native_ir_incÚnon_native_ir_nodesr§   r¨   )ÚdestÚ!generate_non_native_lazy_ir_nodesrª   r«   )r¬   rÃ   rV   r&   r·   s    €€€€r7   rº   z%run_gen_lazy_tensor.<locals>.<lambda>3  sn   ø€ òñ '4�M‘?¸ñ=ö
'àñ ð ˜T˜F !Ò$ò
'ô $(×#IÑ#IØ˜Kó$ð #,×"4Ñ"4Ø"+×"4Ñ"4ñ!
€ ùò
's   �A)rŠ   rS   Úreturnr   )r2   z%NativeFunctionsGroup | NativeFunctionrÉ   rS   )r�   z)Callable[[NativeFunction], Sequence[str]]r”   z/Iterable[NativeFunctionsGroup | NativeFunction]r•   zlist[OperatorName]rÉ   zIterator[str])r=   rC   r	   r
   rA   r¬   r   Únative_functionsr"   r   Úsortedr   r   r    r!   r8   r   Úget_nop_selectorÚnative_function_class_namer   r.   rÇ   ÚGenLazyShapeInferenceDefinitionrK   r   r   r   Úwrite_with_template)8r€   ry   rz   r{   r|   rT   rV   rX   rY   rD   r[   r]   r™   rš   r_   r±   Úuse_lazy_shaper­   r´   r³   r¸   r¶   r°   r¯   r®   r¹   Úlazy_value_classrµ   r²   Ú	lv_tokensÚlv_classÚlv_nsrŒ   ÚfmÚnative_yaml_pathÚtags_yaml_pathÚparsed_yamlrÊ   r�   Úparsed_backend_yamlr    r!   ÚselectorÚ
class_namerE   Údispatch_keyr"   r   r˜   r#   r1   r'   rÃ   r&   r·   r‹   s8     ``  ```` `   ` ````````` ``                 @@@@@@@@@@r7   rx   rx     s  ÿÿÿü€ ðL !×&Ñ& tÓ,€IØ˜‰}€HØ�I‰I�i  �nÓ%€EÜŒk˜% Ó*Ô+Ü—7‘7—<‘< 	¨;Ó7€Lö
ñ
 
˜:Ó	&€Bä—w‘w—|‘| IÐ/MÓNÐÜ—W‘W—\‘\ )Ð-?Ó@€NÜ#Ð$4°nÓE€Kà×$Ñ$Ø×#Ñ#ð &Ð�oô  <Ð<LÓMÐó#ô  &Ø Ð&:ô Ðô -ØÐ-¨óÐð &×1Ñ1€KØ&×3Ñ3€LØ'×5Ñ5€MØ)×9Ñ9€Oô (CØÐ-ó(Ñ$€L�*˜fð (4ð'Ø7ð'à;ð'ð %ð'ð 
ó	'ô   ×0Ñ0Ó2€HàÐ"Ð"Ð"Ø  Ñ-×HÑHÓJ€JàÐÜ ØØØØØØØô	
ðð Ð&Ü$(ÙÜ×4Ñ4Ø# KÑ0°,óð )ó	ó%
Ð!ô 	(Ð(;Ð=VÔWØÐ!Ð!Ð!ô 'Ø
ØØØØ ØØØô	ð &Ð-ˆ‰°KÀÐ3Nò
ˆô 	%ØØØØØ$ØØØØ'Ø!5Ø%Ø$ö	
ð
ô&   Ó.€IØ×ÑØˆ-Ð*Ð+Ø(÷4	
÷ 4	
÷ 4	
ð 4	
ô8ñt $Ø˜Ñ$ l°I¸~ó€Kð ×ÑØØ÷	
ñ 	
ôð< ×ÑØØö	
õrN   Ú__main__)r0   rS   r1   z/Sequence[NativeFunction | NativeFunctionsGroup]rÉ   z8tuple[list[OperatorName], list[Any], list[OperatorName]])rD   rS   rE   z	list[str]rÉ   ÚNone)rÉ   rS   )rÉ   rÞ   )<r€   rS   ry   rS   rz   rS   r{   rr   r|   rU   rT   rS   rV   rU   rX   rS   rY   rS   rD   rS   r[   rZ   r]   r\   r™   rr   rš   rr   r_   rS   r±   rr   rÐ   rr   r­   rS   r´   rS   r³   rS   r¸   rS   r¶   rS   r°   rS   r¯   rr   r®   rS   r¹   rS   rÑ   rS   rµ   rS   r²   rS   rÉ   rÞ   )>Ú
__future__r   ro   rA   Úcollectionsr   Úpathlibr   Útypingr   r   r   r)   Útorchgen.destrÇ   Útorchgen.api.lazyr	   Útorchgen.api.typesr
   Útorchgen.dest.lazy_irr   r   r   Útorchgen.genr   r   Útorchgen.gen_backend_stubsr   r   r   r   Útorchgen.modelr   r   r   Ú!torchgen.selective_build.selectorr   Útorchgen.utilsr   r   Útorchgen.yaml_utilsr   Úcollections.abcr   r   r   r   r8   rK   rO   rQ   r�   rT   rV   rX   rY   rD   r[   r]   r_   rx   r`   rM   rN   r7   ú<module>rî      s«  ðÝ "ã Û 	Ý "Ý ß /Ñ /ã å Ý 'Ý *ß UÑ Uß H÷ó ÷ NÑ MÝ >ß 7Ý *ñ ß<Ñ<ñ~  ØÚWóÐ ð<Øð<àMð<ð >ó<ð&
Øð
Ø9Bð
à	ó
ó6÷@
&ñ 
&ó]ðL "×+Ñ+Ø ,× :Ñ :Ø$×1Ñ1Ø(×9Ñ9Ø+×?Ñ?Ø)5×)GÑ)Gð 	×5Ñ5àð "'Ø$×1Ñ1Ø%*Øð +Ø)Ø%KØ+Ø<Ø-Ø%*Ø'MØ'MØ0Ø*Ø8ðIhØðhàðhð ðhð ð	hð
 ðhð ðhð ðhð ðhð ðhð ðhð 'ðhð'ðhð  ð!hð& ð'hð( ð)hð* #ð+hð, ð-hð2 ð3hð4 ð5hð6  #ð7hð8 ð9hð: ð;hð< ð=hð> #ð?hð@ "%ðAhðB "%ðChðD ðEhðF ðGhðH ðIhðJ 
óKhðV	 ˆzÒÙ…Fð rN   