+
    –°³jN•  ã                  óÒ  € ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
HtHtHtHt ^ RIHt ^ RIt^ RIt^ RIHu Ht ^RIHt ^RIHtHtHtHt ]'       d   ^ RIHt ]! R	4      t]R(,          t ] ]R
,          ,          R,          t!]R),          t"R R lt# ! R R]
],          4      t$]PJ                  ! R4      PL                  t'R R lt(](! ]$4      t) ! R R]$]	,          4      t*]*PW                  4         ! R R]*4      t, ! R R4      t- ! R R]-]*4      t. ! R R]*4      t/ ! R R]*4      t0 ! R R]04      t1 ! R  R!]4      t2 ! R" R#]*4      t3 ! R$ R%],4      t4 ! R& R']04      t5R# )*é    )ÚannotationsN)ÚStringIO)ÚAnyÚGenericÚLiteralÚ
NamedTupleÚTYPE_CHECKINGÚTypeVar)Úpatch)Ú
OrderedSet)ÚIndentedBufferÚreduction_num_outputsÚsympy_index_symbolÚ	sympy_str)ÚCallableÚTÚtmac               ó    € V ^8„  d   QhRRRR/# )é   ÚaÚobjectÚreturnÚstr© )Úformats   "Ú\/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/_inductor/ops_handler.pyÚ__annotate__r   :   s   € ÷ ñ �ð ˜3ñ ó    c                ón   € \        V \        P                  4      '       d   \        V 4      # \	        V 4      # ©N)Ú
isinstanceÚsympyÚExprr   r   ©r   s   &r   Ú_arg_strr%   :   s&   € Ü�!”U—Z‘Z× Ò Ü˜‹|ÐÜˆq‹6€Mr   c            
      ó$  € ] tR t^AtRtR R ltR R ltR R ltR R	 ltR
 R lt	R R lt
R R ltR R ltR R ltR R ltER@R R lltR R ltR R ltR R ltR  R! ltR" R# ltR$ R% ltERAR& R' lltR( R) ltERBR* R+ lltR, R- ltR. R/ ltR0 R1 ltR2 R3 ltERCR4 R5 lltR6 R7 ltR8 R9 ltR: R; lt R< R= lt!R> R? lt"R@ RA lt#RB RC lt$RD RE lt%RF RG lt&RH RI lt'RJ RK lt(RL RM lt)RN RO lt*RP RQ lt+RR RS lt,RT RU lt-RV RW lt.RX RY lt/RZ R[ lt0R\ R] lt1R^ R_ lt2R` Ra lt3Rb Rc lt4Rd Re lt5Rf Rg lt6Rh Ri lt7Rj Rk lt8Rl Rm lt9Rn Ro lt:Rp Rq lt;Rr Rs lt<Rt Ru lt=Rv Rw lt>Rx Ry lt?Rz R{ lt@R| R} ltAR~ R ltBR€ R� ltCR‚ Rƒ ltDR„ R… ltER† R‡ ltFRˆ R‰ ltGRŠ R‹ ltHRŒ R� ltIRŽ R� ltJR� R‘ ltKR’ R“ ltLR” R• ltMR– R— ltNR˜ R™ ltORš R› ltPRœ R� ltQRž RŸ ltRR  R¡ ltSR¢ R£ ltTR¤ R¥ ltUR¦ R§ ltVR¨ R© ltWRª R« ltXR¬ R­ ltYR® R¯ ltZR° R± lt[R² R³ lt\R´ Rµ lt]R¶ R· lt^R¸ R¹ lt_Rº R» lt`R¼ R½ ltaR¾ R¿ ltbRÀ RÁ ltcRÂ RÃ ltdRÄ RÅ lteRÆ RÇ ltfRÈ RÉ ltgRÊ RË lthRÌ RÍ ltiRÎ RÏ ltjRÐ RÑ ltkRÒ RÓ ltlRÔ RÕ ltmRÖ R× ltnRØ RÙ ltoRÚ RÛ ltpRÜ RÝ ltqRÞ Rß ltrRà Rá ltsRâ Rã lttRä Rå ltuRæ Rç ltvRè Ré ltwRê Rë ltxRì Rí ltyRî Rï ltzRð Rñ lt{Rò Ró lt|Rô Rõ lt}Rö R÷ lt~Rø Rù ltRú Rû lt€Rü Rý lt�Rþ Rÿ lt‚ER  ER ltƒER ER lt„ER ER lt…ER ER lt†ER ER	 lt‡ER
 ER ltˆER ER lt‰ER ER ltŠER ER lt‹ER ER ltŒER ER lt�ER ER ltŽER ER lt�ER ER lt�ER ER lt‘ER ER lt’ER  ER! lt“ER" ER# lt”ER$ ER% lt•ER& ER' lt–ER( ER) lt—ER* ER+ lt˜ER, ER- lt™ER. ER/ ltšER0 ER1 lt›ER2RER3]œEP:                  ER4RER5^ER6R/ER7 ER8 lltžER9 ER: ltŸER; ER< lt ER= ER> lt¡ER?t¢R# (D  Ú
OpsHandlera�  
Protocol describing the set of valid operations on ``torch._inductor.virtualized.ops``,
as well as the contract for op handlers.  The type T signifies the domain
of the abstract analysis AKA what all the functions return / take as arguments
anywhere compute occurs.

While these operators are typically dtype polymorphic (e.g., you can use mul
on both integers and floats), they do NOT do promotion and usually return the
same dtype as the input.  You are expected to have handled type promotion
during ATen decompositions.  Most operators correspond exactly to pointwise
operations as defined by torch, so when in doubt about semantics, check the
corresponding torch documentation.  These are all scalar operations (so they
are defined to operate on a single element at a time.)

For convenience, many operators take a src_dtype which indicates what the dtype
of the input argument is.  Although in principle this can be derived by an
analysis, providing this for ops where it is useful helps avoid having to repeatedly
recompute dtype in code generation.

Note that this often describes a class of static methods, for stateless
ops handlers.

Handlers are often defined using metaprogramming (e.g. _initialize_pointwise_overrides),
which means you will not get type errors for those methods.  We have tests in
test/inductor/test_op_completeness.py which check that all operators are implemented after
all the metaprogramming has run.
c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úvaluezbool | float | intÚdtypeútorch.dtyper   r   r   )r   s   "r   r   ÚOpsHandler.__annotate__^   s"   € ÷ "ñ "Ð0ð "¸ð "Èñ "r   c                ó   € \         h)z)Produces a scalar constant of type dtype.©ÚNotImplementedError)Úselfr)   r*   s   &&&r   ÚconstantÚOpsHandler.constant^   ó   € ä!Ð!r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Únamer   Úoffsetr   r   r   )r   s   "r   r   r,   b   s!   € ÷ "ñ "˜cð "¨1ð "°ñ "r   c                ó   € \         h)z$Computes inductor_prims.lookup_seed.r.   )r0   r5   r6   s   &&&r   Ú	load_seedÚOpsHandler.load_seedb   r3   r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úseedr   r6   r   r   )r   s   "r   r   r,   f   s!   € ÷ "ñ "˜ð " Að "¨!ñ "r   c                ó   € \         h)zIComputes inductor_prims.random with mode="rand".  offset has dtype int32.r.   ©r0   r<   r6   s   &&&r   ÚrandÚOpsHandler.randf   r3   r   c               ó0   € V ^8„  d   QhRRRRRRRRRRRR/# )r   r<   r   Úbase_offsetÚthreads_per_roundÚtidÚvecr   r   )r   s   "r   r   r,   j   s<   € ÷ "ñ "Øð"Ø$%ð"Ø:;ð"ØBCð"ØJKð"à	
ñ"r   c                ó   € \         h)zOComputes inductor_prims.random with mode="rand_eager".  offset has dtype int32.r.   )r0   r<   rB   rC   rD   rE   s   &&&&&&r   Ú
rand_eagerÚOpsHandler.rand_eagerj   ó
   € ô "Ð!r   c               ó$   € V ^8„  d   QhRRRRRR/# r;   r   )r   s   "r   r   r,   p   s!   € ÷ "ñ "˜!ð " Qð "¨1ñ "r   c                ó   € \         h)zJComputes inductor_prims.random with mode="randn".  offset has dtype int32.r.   r>   s   &&&r   ÚrandnÚOpsHandler.randnp   r3   r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )r   r<   r   r6   ÚlowÚhighr   r   )r   s   "r   r   r,   t   s/   € ÷ "ñ "˜að "¨ð "°ð "¸!ð "Àñ "r   c                ó   € \         h)z9Computes inductor_prims.randint.  offset has dtype int32.r.   )r0   r<   r6   rO   rP   s   &&&&&r   Ú	randint64ÚOpsHandler.randint64t   r3   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Úmaskr   ÚbodyzCallable[[], T]Úotherr   r   )r   s   "r   r   r,   x   s(   € ÷ "ñ "˜1ð " Oð "¸Að "À!ñ "r   c                ó   € \         h)aÜ  
Computes body, but only perform loads/stores if the boolean mask
evaluates to true.  For example, you would use this if you needed to
perform an indirect load that may not be valid on some elements;
without masking, invalid accesses can cause IMAs.  When mask is true,
the result is the result of body; otherwise it is other. Here, `other`
needs to be a constant.

Contrast this with ops.where, which can multiplex between two values
that have been unconditionally computed.
r.   )r0   rU   rV   rW   s   &&&&r   ÚmaskedÚOpsHandler.maskedx   ó
   € ô "Ð!r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Ú	conditionr   ÚinputrW   r   r   )r   s   "r   r   r,   †   s(   € ÷ "ñ "˜qð "¨ð "°1ð "¸ñ "r   c                ó   € \         h)zU
Computes torch.where: when condition is true, return input; otherwise return other.
r.   )r0   r]   r^   rW   s   &&&&r   ÚwhereÚOpsHandler.where†   rI   r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   Úexprú
sympy.Exprr*   r+   r   r   r   )r   s   "r   r   r,   Œ   ó!   € ÷ "ñ "˜zð "°+ð "À!ñ "r   c                ó   € \         h)uL  
Converts a sympy expression into a scalar suitable for indexing memory.
The kernel decides the actual computation dtype (typically int32) â€” the
``dtype`` argument is advisory and is not honored when it would conflict
with the kernel's indexing dtype. For values that must respect the
requested dtype, use ``value_expr`` instead.
r.   ©r0   rd   r*   s   &&&r   Ú
index_exprÚOpsHandler.index_exprŒ   ó
   € ô "Ð!r   c               ó$   € V ^8„  d   QhRRRRRR/# rc   r   )r   s   "r   r   r,   –   rf   r   c                ó   € \         h)aL  
Converts a sympy expression into a scalar of type ``dtype`` that
participates in tensor value computation. Unlike ``index_expr``, the
result dtype is respected, so this is the right op when the user
explicitly requested the dtype (e.g. ``arange(dtype=torch.int64)``
whose result is added to a tensor rather than used as an index).
r.   rh   s   &&&r   Ú
value_exprÚOpsHandler.value_expr–   rk   r   NTc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R/# )
r   Úxr   r*   r+   Ú	src_dtypeztorch.dtype | NoneÚuse_compute_typesÚboolr   r   )r   s   "r   r   r,       s<   € ÷ "ñ "àð"ð ð"ð &ð	"ð
  ð"ð 
ñ"r   c                ó   € \         h)z¦
Convert x to dtype.  src_dtype can be optionally set to specify what the original
dtype of x was, which can improve code generation (used by torch to(dtype=dtype)).
r.   )r0   rq   r*   rr   rs   s   &&&&&r   Úto_dtypeÚOpsHandler.to_dtype    ó
   € ô "Ð!r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rq   r   r*   r+   r   r   )r   s   "r   r   r,   ­   s!   € ÷ "ñ "˜að "¨ð "¸ñ "r   c                ó   € \         h)aÍ  
Convert x to dtype with truncation semantics (similar to how the int
constructor works in Python).  In Inductor codegen, this just decays
to trunc and then to_dtype, but this composite operation helps
roundtrips for Sympy evaluation.

dtype is taken as an explicit parameter because the desired output
dtype is typically the index dtype, which may vary between int32 and
int64 depending on if we've shown that all the indexing operations can
be done in int32.
r.   ©r0   rq   r*   s   &&&r   Útrunc_to_intÚOpsHandler.trunc_to_int­   r[   r   c               ó$   € V ^8„  d   QhRRRRRR/# rz   r   )r   s   "r   r   r,   »   s!   € ÷ "ñ "˜Qð " {ð "°qñ "r   c                ó   € \         h©zD
Convert x to dtype with ceiling semantics.  See also trunc_to_int.
r.   r|   s   &&&r   Úceil_to_intÚOpsHandler.ceil_to_int»   rI   r   c               ó$   € V ^8„  d   QhRRRRRR/# rz   r   )r   s   "r   r   r,   Á   ó!   € ÷ "ñ "˜að "¨ð "¸ñ "r   c                ó   € \         hr�   r.   r|   s   &&&r   Úfloor_to_intÚOpsHandler.floor_to_intÁ   rI   r   c               ó$   € V ^8„  d   QhRRRRRR/# rz   r   )r   s   "r   r   r,   Ç   r…   r   c                ó   € \         h)zJ
Convert x to dtype with round-to-even semantics.  See also trunc_to_int.
r.   r|   s   &&&r   Úround_to_intÚOpsHandler.round_to_intÇ   rI   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rq   r   r*   r+   rr   r   r   )r   s   "r   r   r,   Í   s)   € ÷ "ñ " !ð "¨Kð "ÀKð "ÐTUñ "r   c                ó   € \         h)z}
Reinterpret cast x to dtype (reinterpreting the bits in memory as another dtype.)
src_dtype must be the original type of x.
r.   )r0   rq   r*   rr   s   &&&&r   Úto_dtype_bitcastÚOpsHandler.to_dtype_bitcastÍ   ó
   € ô
 "Ð!r   c               ó    € V ^8„  d   QhRRRR/# ©r   rq   r   r   r   )r   s   "r   r   r,   Ô   s   € ÷ "ñ "˜!ð " ñ "r   c                ó   € \         h)z0
Returns x as is.  This is used to trigger CSE.
r.   ©r0   rq   s   &&r   ÚidentityÚOpsHandler.identityÔ   rI   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rq   r   Úsizere   Úcheckrt   r   r   )r   s   "r   r   r,   ã   s,   € ÷ "ñ "Øð"Ø$ð"Ø-1ð"à	ñ"r   c                ó   € \         h)au  
Convert an integral x into a sympy.Expr that can be subsequently used in
indexing computation.  'size' represents an upper bound on what valid
indexes can be; when 'check' is True, we check that the x is in bounds.

NB: This is typically mandatory to implement for any analysis, because you
MUST return a valid sympy.Expr of some sort (even if it's a meaningless symbol).
r.   )r0   rq   r™   rš   Úwrap_negs   &&&&&r   Úindirect_indexingÚOpsHandler.indirect_indexingã   rx   r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r5   r   Úindexre   r   r   r   )r   s   "r   r   r,   ð   s!   € ÷ "ñ "˜ð " Zð "°Añ "r   c                ó   € \         h)zS
Load from the memory location 'name', offset by some indexing expression 'index'.
r.   )r0   r5   r    s   &&&r   ÚloadÚOpsHandler.loadð   rI   r   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r5   r   r    re   r)   r   ÚmodeÚ	StoreModer   ÚNoner   )r   s   "r   r   r,   ö   s<   € ÷ "ñ "àð"ð ð"ð ð	"ð
 ð"ð 
ñ"r   c                ó   € \         h)z…
Store 'value' to the memory location 'name' offset by 'expr'.  If
specified, 'mode' can require the store to be an atomic addition.
r.   )r0   r5   r    r)   r¥   s   &&&&&r   ÚstoreÚOpsHandler.storeö   rx   r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR	/# )
r   r*   r+   rr   Úreduction_typeÚReductionTyper)   r   r   zT | tuple[T, ...]r   )r   s   "r   r   r,     s<   € ÷ "ñ "àð"ð ð"ð &ð	"ð
 ð"ð 
ñ"r   c                ó   € \         h)a±  
Perform a 'reduction_type' reduction on 'value' of dtype 'src_dtype',
using 'dtype' as the accumulation dtype for the reduction.  The result
is an intermediate computation which should be stored to the final
location using 'ops.store_reduction'.

Valid reduction types are .  For Welford reduction types, this
function returns multiple outputs; consult reduction_num_outputs to
determine the amount in metaprogramming applications.
r.   )r0   r*   rr   r¬   r)   s   &&&&&r   Ú	reductionÚOpsHandler.reduction  s
   € ô" "Ð!r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   r5   r   r    re   r)   r   r   r§   r   )r   s   "r   r   r,     s(   € ÷ "ñ " Cð "°
ð "À1ð "Èñ "r   c                ó   € \         h)zc
Store the fully accumulated result of 'reduction' to the memory
location 'name' offset by 'expr'.
r.   )r0   r5   r    r)   s   &&&&r   Ústore_reductionÚOpsHandler.store_reduction  r‘   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   Údtypesútuple[torch.dtype, ...]Ú
combine_fnz7Callable[[tuple[T, ...], tuple[T, ...]], tuple[T, ...]]Úvaluesútuple[T, ...]r   r   )r   s   "r   r   r,   #  s3   € ÷ 
"ñ 
"à'ð
"ð Lð
"ð ð	
"ð
 
ñ
"r   c                ó   € \         h)z)
Perform an associative scan on 'value'.
r.   )r0   r¶   r¸   r¹   s   &&&&r   ÚscanÚOpsHandler.scan#  ó
   € ô "Ð!r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r¶   r·   r¹   rº   Ústablert   Ú
descendingr   r   )r   s   "r   r   r,   /  s<   € ÷ 
"ñ 
"à'ð
"ð ð
"ð ð	
"ð
 ð
"ð 
ñ
"r   c                ó   € \         h)z,
Sort values along the reduction dimension.
r.   )r0   r¶   r¹   rÀ   rÁ   s   &&&&&r   ÚsortÚOpsHandler.sort/  r¾   r   c               ó8   € V ^8„  d   QhRRRRRRRRRR	R
RRRRR/# ©r   r¹   r   Ú
boundariesz.tuple[str, sympy.Expr, sympy.Expr, sympy.Expr]Úboundary_indicesÚindexing_dtyper+   Úrightrt   Úsorterztuple[str, sympy.Expr] | NoneÚsorter_indiceszT | Noner   r   )r   s   "r   r   r,   ;  s[   € ÷ "ñ "àð"ð Cð"ð ð	"ð
 $ð"ð ð"ð .ð"ð !ð"ð 
ñ"r   c                	ó   € \         hr    r.   )r0   r¹   rÇ   rÈ   rÉ   rÊ   rË   rÌ   s   &&&&&&&&r   Ú	bucketizeÚOpsHandler.bucketize;  rx   r   c          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   r5   r   r¬   r­   r)   r   Ú
extra_metaúdict[str, Any]r   r§   r   )r   s   "r   r   r,   H  s<   € ÷ "ñ "àð"ð &ð"ð ð	"ð
 #ð"ð 
ñ"r   c                	ó   € \         hr    r.   )r0   r5   r¬   r)   rÑ   s   &&&&&r   Úpartial_accumulateÚOpsHandler.partial_accumulateH  s
   € ô "Ð!r   c               ó    € V ^8„  d   QhRRRR/# ©r   Úx0r   r   r   )r   s   "r   r   r,   U  ó   € ÷ "ñ "�að "˜Añ "r   c                	ó   € \         hr    r.   ©r0   rØ   s   &&r   ÚabsÚOpsHandler.absU  ó   € Ü!Ð!r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   X  rÙ   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚexpÚOpsHandler.expX  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   [  ó   € ÷ "ñ "�qð "˜Qñ "r   c                	ó   € \         hr    r.   rÛ   s   &&r   Úexp2ÚOpsHandler.exp2[  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ^  ó   € ÷ "ñ "˜ð "˜añ "r   c                	ó   € \         hr    r.   rÛ   s   &&r   Úexpm1ÚOpsHandler.expm1^  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   a  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚsqrtÚOpsHandler.sqrta  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   d  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚreluÚOpsHandler.relud  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rØ   r   Úx1r   r   )r   s   "r   r   r,   g  ó!   € ÷ "ñ "˜!ð " ð " qñ "r   c                	ó   € \         hr    r.   ©r0   rØ   r÷   s   &&&r   ÚminimumÚOpsHandler.minimumg  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   j  rø   r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚmaximumÚOpsHandler.maximumj  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   m  ó!   € ÷ "ñ "˜1ð " !ð "¨ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚfmaximumÚOpsHandler.fmaximumm  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   p  rÙ   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚcosÚOpsHandler.cosp  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   s  rÙ   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚsinÚOpsHandler.sins  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   v  ó   € ÷ "ñ "˜ð "˜qñ "r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚlgammaÚOpsHandler.lgammav  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   y  rÙ   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚerfÚOpsHandler.erfy  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   |  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚcoshÚOpsHandler.cosh|  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,     rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚsinhÚOpsHandler.sinh  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ‚  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚacosÚOpsHandler.acos‚  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   …  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚacoshÚOpsHandler.acosh…  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ˆ  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚasinÚOpsHandler.asinˆ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ‹  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚasinhÚOpsHandler.asinh‹  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ž  ó!   € ÷ "ñ "˜ð "˜qð " Qñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   Úatan2ÚOpsHandler.atan2Ž  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ‘  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚatanÚOpsHandler.atan‘  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ”  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚatanhÚOpsHandler.atanh”  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   —  r  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚcopysignÚOpsHandler.copysign—  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   š  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚerfcÚOpsHandler.erfcš  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   �  r  r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚerfinvÚOpsHandler.erfinv�  rÞ   r   c               ó   € V ^8„  d   QhRR/# )r   rØ   r   r   )r   s   "r   r   r,      s   € ÷ "ñ "˜ñ "r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚfrexpÚOpsHandler.frexp   rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   £  r0  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚhypotÚOpsHandler.hypot£  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ¦  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   Úlog10ÚOpsHandler.log10¦  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ©  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   Úlog2ÚOpsHandler.log2©  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   rØ   r   Únr   r   )r   s   "r   r   r,   ¬  ó!   € ÷ "ñ "˜ð "˜að " Añ "r   c                	ó   € \         hr    r.   )r0   rØ   rY  s   &&&r   ÚldexpÚOpsHandler.ldexp¬  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   ¯  s!   € ÷ "ñ "˜Að " 1ð "¨ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   Ú	nextafterÚOpsHandler.nextafter¯  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   ²  ó!   € ÷ "ñ "˜að " Qð "¨1ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   Úlogical_andÚOpsHandler.logical_and²  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   µ  ó   € ÷ "ñ "˜að " Añ "r   c                	ó   € \         hr    r.   rÛ   s   &&r   Úlogical_notÚOpsHandler.logical_notµ  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   ¸  ó!   € ÷ "ñ "˜Qð " Að "¨!ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   Ú
logical_orÚOpsHandler.logical_or¸  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   »  rc  r   c                	ó   € \         hr    r.   rú   s   &&&r   Úlogical_xorÚOpsHandler.logical_xor»  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   ¾  rc  r   c                	ó   € \         hr    r.   rú   s   &&&r   Úbitwise_andÚOpsHandler.bitwise_and¾  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   Á  rh  r   c                	ó   € \         hr    r.   rÛ   s   &&r   Úbitwise_notÚOpsHandler.bitwise_notÁ  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ä  rm  r   c                	ó   € \         hr    r.   rú   s   &&&r   Ú
bitwise_orÚOpsHandler.bitwise_orÄ  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ç  rc  r   c                	ó   € \         hr    r.   rú   s   &&&r   Úbitwise_xorÚOpsHandler.bitwise_xorÇ  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ê  s!   € ÷ "ñ " Qð "¨Að "°!ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   Úbitwise_left_shiftÚOpsHandler.bitwise_left_shiftÊ  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Í  s!   € ÷ "ñ " að "¨Qð "°1ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   Úbitwise_right_shiftÚOpsHandler.bitwise_right_shiftÍ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   Ð  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚrsqrtÚOpsHandler.rsqrtÐ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   Ó  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   Úlog1pÚOpsHandler.log1pÓ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   Ö  rÙ   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚtanÚOpsHandler.tanÖ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   Ù  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚtanhÚOpsHandler.tanhÙ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   Ü  ó   € ÷ "ñ "˜!ð " ñ "r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚsigmoidÚOpsHandler.sigmoidÜ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ß  rž  r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚsignbitÚOpsHandler.signbitß  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   â  ó!   € ÷ "ñ "�qð "˜að " Añ "r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚfmodÚOpsHandler.fmodâ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   å  rÙ   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚlogÚOpsHandler.logå  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   è  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚisinfÚOpsHandler.isinfè  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ë  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚisnanÚOpsHandler.isnanë  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ð  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚroundÚOpsHandler.roundð  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ô  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚfloorÚOpsHandler.floorô  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ÷  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚsignÚOpsHandler.sign÷  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   û  ré   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚtruncÚOpsHandler.truncû  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ÿ  rä   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚceilÚOpsHandler.ceilÿ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,     rÙ   r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚnegÚOpsHandler.neg  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,     s   € ÷ "ñ "˜Qð " 1ñ "r   c                	ó   € \         hr    r.   rÛ   s   &&r   Ú
reciprocalÚOpsHandler.reciprocal  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     ó!   € ÷ "ñ "�Qð "˜Að " !ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚeqÚOpsHandler.eq  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     rÔ  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚneÚOpsHandler.ne  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     rÔ  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚltÚOpsHandler.lt  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     rÔ  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚgtÚOpsHandler.gt  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     rÔ  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚleÚOpsHandler.le  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     rÔ  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚgeÚOpsHandler.ge  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     ó!   € ÷ "ñ "�að "˜Qð " 1ñ "r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚaddÚOpsHandler.add  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,     rí  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚsubÚOpsHandler.sub  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,      rí  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚmulÚOpsHandler.mul   rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   $  rí  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚpowÚOpsHandler.pow$  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   '  r§  r   c                	ó   € \         hr    r.   rú   s   &&&r   Úand_ÚOpsHandler.and_'  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   *  rí  r   c                	ó   € \         hr    r.   rú   s   &&&r   Úor_ÚOpsHandler.or_*  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   -  rí  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚxorÚOpsHandler.xor-  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   1  ó!   € ÷ "ñ "˜ð " ð " añ "r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚlshiftÚOpsHandler.lshift1  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   4  r
  r   c                	ó   € \         hr    r.   rú   s   &&&r   ÚrshiftÚOpsHandler.rshift4  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   <  r  r   c                	ó   € \         hr    r.   r•   s   &&r   Úairy_aiÚOpsHandler.airy_ai<  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   ?  ó   € ÷ "ñ "˜1ð " ñ "r   c                	ó   € \         hr    r.   r•   s   &&r   Ú	bessel_j0ÚOpsHandler.bessel_j0?  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   B  r  r   c                	ó   € \         hr    r.   r•   s   &&r   Ú	bessel_j1ÚOpsHandler.bessel_j1B  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   E  r  r   c                	ó   € \         hr    r.   r•   s   &&r   Ú	bessel_y0ÚOpsHandler.bessel_y0E  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   H  r  r   c                	ó   € \         hr    r.   r•   s   &&r   Ú	bessel_y1ÚOpsHandler.bessel_y1H  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   K  r  r   c                	ó   € \         hr    r.   r•   s   &&r   ÚdigammaÚOpsHandler.digammaK  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   N  rä   r   c                	ó   € \         hr    r.   r•   s   &&r   ÚerfcxÚOpsHandler.erfcxN  rÞ   r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rq   r   ÚyÚzr   r   )r   s   "r   r   r,   Q  s(   € ÷ "ñ "�Qð "˜1ð " ð " qñ "r   c                	ó   € \         hr    r.   )r0   rq   r0  r1  s   &&&&r   ÚfmaÚOpsHandler.fmaQ  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   rq   r   r0  r   r   )r   s   "r   r   r,   T  s!   € ÷ "ñ "˜ð "˜að " Añ "r   c                ó   € \         h)zLMultiplication with round-to-nearest, preventing fusion with subsequent ops.r.   ©r0   rq   r0  s   &&&r   Úmul_rnÚOpsHandler.mul_rnT  r3   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   X  rZ  r   c                	ó   € \         hr    r.   r8  s   &&&r   ÚigammaÚOpsHandler.igammaX  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   [  s!   € ÷ "ñ "˜ð "˜qð " Qñ "r   c                	ó   € \         hr    r.   r8  s   &&&r   ÚigammacÚOpsHandler.igammac[  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ^  s!   € ÷ "ñ "˜!ð " ð " añ "r   c                	ó   € \         hr    r.   r8  s   &&&r   ÚgammaincÚOpsHandler.gammainc^  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   a  ó!   € ÷ "ñ "˜1ð " ð " qñ "r   c                	ó   € \         hr    r.   r8  s   &&&r   Ú	gammainccÚOpsHandler.gammaincca  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   d  ó   € ÷ "ñ "�Að "˜!ñ "r   c                	ó   € \         hr    r.   r•   s   &&r   Úi0ÚOpsHandler.i0d  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   g  ó   € ÷ "ñ "�Qð "˜1ñ "r   c                	ó   € \         hr    r.   r•   s   &&r   Úi0eÚOpsHandler.i0eg  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   j  rM  r   c                	ó   € \         hr    r.   r•   s   &&r   Úi1ÚOpsHandler.i1j  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   m  rR  r   c                	ó   € \         hr    r.   r•   s   &&r   Úi1eÚOpsHandler.i1em  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   p  rž  r   c                	ó   € \         hr    r.   r•   s   &&r   Úlog_ndtrÚOpsHandler.log_ndtrp  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   s  ó   € ÷ "ñ " Að "¨!ñ "r   c                	ó   € \         hr    r.   r•   s   &&r   Úmodified_bessel_i0ÚOpsHandler.modified_bessel_i0s  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   v  rc  r   c                	ó   € \         hr    r.   r•   s   &&r   Úmodified_bessel_i1ÚOpsHandler.modified_bessel_i1v  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   y  rc  r   c                	ó   € \         hr    r.   r•   s   &&r   Úmodified_bessel_k0ÚOpsHandler.modified_bessel_k0y  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   |  rc  r   c                	ó   € \         hr    r.   r•   s   &&r   Úmodified_bessel_k1ÚOpsHandler.modified_bessel_k1|  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,     rÙ   r   c                	ó   € \         hr    r.   r•   s   &&r   ÚndtrÚOpsHandler.ndtr  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   ‚  rä   r   c                	ó   € \         hr    r.   r•   s   &&r   ÚndtriÚOpsHandler.ndtri‚  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   …  rH  r   c                	ó   € \         hr    r.   r8  s   &&&r   Ú	polygammaÚOpsHandler.polygamma…  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   ˆ  ó   € ÷ "ñ "¨1ð "°ñ "r   c                	ó   € \         hr    r.   r•   s   &&r   Úscaled_modified_bessel_k0Ú$OpsHandler.scaled_modified_bessel_k0ˆ  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   ‹  r€  r   c                	ó   € \         hr    r.   r•   s   &&r   Úscaled_modified_bessel_k1Ú$OpsHandler.scaled_modified_bessel_k1‹  rÞ   r   c               ó    € V ^8„  d   QhRRRR/# r“   r   )r   s   "r   r   r,   Ž  s   € ÷ "ñ " Qð "¨1ñ "r   c                	ó   € \         hr    r.   r•   s   &&r   Úspherical_bessel_j0ÚOpsHandler.spherical_bessel_j0Ž  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ‘  s!   € ÷ "ñ "�að "˜Að " !ñ "r   c                	ó   € \         hr    r.   r8  s   &&&r   ÚzetaÚOpsHandler.zeta‘  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ”  ó!   € ÷ "ñ "¨ð "¨að "°Añ "r   c                	ó   € \         hr    r.   r8  s   &&&r   Úchebyshev_polynomial_tÚ!OpsHandler.chebyshev_polynomial_t”  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   —  r‘  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úchebyshev_polynomial_uÚ!OpsHandler.chebyshev_polynomial_u—  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   š  r‘  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úchebyshev_polynomial_vÚ!OpsHandler.chebyshev_polynomial_vš  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   �  r‘  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úchebyshev_polynomial_wÚ!OpsHandler.chebyshev_polynomial_w�  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,      ó!   € ÷ "ñ " qð "¨Qð "°1ñ "r   c                	ó   € \         hr    r.   r8  s   &&&r   Úlegendre_polynomial_pÚ OpsHandler.legendre_polynomial_p   rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   £  ó!   € ÷ "ñ "°ð "°að "¸Añ "r   c                	ó   € \         hr    r.   r8  s   &&&r   Úshifted_chebyshev_polynomial_tÚ)OpsHandler.shifted_chebyshev_polynomial_t£  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ¦  r§  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úshifted_chebyshev_polynomial_uÚ)OpsHandler.shifted_chebyshev_polynomial_u¦  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ©  r§  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úshifted_chebyshev_polynomial_vÚ)OpsHandler.shifted_chebyshev_polynomial_v©  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ¬  r§  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úshifted_chebyshev_polynomial_wÚ)OpsHandler.shifted_chebyshev_polynomial_w¬  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ¯  s!   € ÷ "ñ " að "¨Að "°!ñ "r   c                	ó   € \         hr    r.   r8  s   &&&r   Úhermite_polynomial_hÚOpsHandler.hermite_polynomial_h¯  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ²  r¢  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úhermite_polynomial_heÚ OpsHandler.hermite_polynomial_he²  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   µ  r¢  r   c                	ó   € \         hr    r.   r8  s   &&&r   Úlaguerre_polynomial_lÚ OpsHandler.laguerre_polynomial_lµ  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   ½  s!   € ÷ "ñ "˜1ð " !ð "¨ñ "r   c                ó   € \         h)zxC-style trunc division between integers only.  Computes the true
division of two numbers and rounds the result to zero.
r.   rú   s   &&&r   ÚtruncdivÚOpsHandler.truncdiv½  rI   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ã  s!   € ÷ "ñ "˜1ð " !ð "¨ñ "r   c                ó   € \         h)zÆPython-style floor division between integers only.  Computes the
true division of two numbers and floors the result.  If you want
floor division for floats, do regular truediv and floor the result.
r.   rú   s   &&&r   ÚfloordivÚOpsHandler.floordivÃ  r‘   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ê  s!   € ÷ "ñ "˜!ð " ð " qñ "r   c                ó   € \         h)z~True division between floats.  Integer inputs are NOT valid.  To
do Python-style (int, int) -> float division, use int_truedivr.   rú   s   &&&r   ÚtruedivÚOpsHandler.truedivÊ  ó
   € ô "Ð!r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ï  s!   € ÷ "ñ "˜ð " ð " añ "r   c                ó   € \         h)z€Division with round-to-nearest rounding mode.  Used for matching
eager CUDA semantics where division uses IEEE round-to-nearest.r.   rú   s   &&&r   Údiv_rnÚOpsHandler.div_rnÏ  rÏ  r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Ô  s!   € ÷ "ñ "˜að " Qð "¨1ñ "r   c                ó   € \         h)zÀTrue division between integers.  This is NOT the same as promoting
to float and doing integer division, there is a bespoke algorithm for
doing the division in higher precision than the above.
r.   rú   s   &&&r   Úint_truedivÚOpsHandler.int_truedivÔ  r‘   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   Û  s!   € ÷ "ñ "�að "˜Qð " 1ñ "r   c                ó   € \         h)z)C-style modulus, take sign from LHS (x0).r.   rú   s   &&&r   ÚmodÚOpsHandler.modÛ  r3   r   c               ó$   € V ^8„  d   QhRRRRRR/# rö   r   )r   s   "r   r   r,   ß  s!   € ÷ "ñ "˜Að " 1ð "¨ñ "r   c                ó   € \         h)z.Python-style modulus, take sign from RHS (x1).r.   rú   s   &&&r   Ú	remainderÚOpsHandler.remainderß  r3   r   c               ó    € V ^8„  d   QhRRRR/# r×   r   )r   s   "r   r   r,   ã  r  r   c                	ó   € \         hr    r.   rÛ   s   &&r   ÚsquareÚOpsHandler.squareã  rÞ   r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   rd   re   r™   Úlowerrt   Úupperr   r§   r   )r   s   "r   r   r,   æ  s4   € ÷ "ñ "Øð"Ø&0ð"Ø9=ð"ØFJð"à	ñ"r   c                	ó   € \         hr    r.   )r0   rd   r™   rå  ræ  s   &&&&&r   Úcheck_boundsÚOpsHandler.check_boundsæ  rÏ  r   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   r)   r   r™   re   rš   rt   r   r   )r   s   "r   r   r,   ì  s(   € ÷ "ñ " !ð "¨:ð "¸dð "Àqñ "r   c                	ó   € \         hr    r.   )r0   r)   r™   rš   s   &&&&r   Úhalide_clampÚOpsHandler.halide_clampì  rÞ   r   c               ó$   € V ^8„  d   QhRRRRRR/# r6  r   )r   s   "r   r   r,   ð  s!   € ÷ "ñ "�Qð "˜1ð " ñ "r   c                	ó   € \         hr    r.   r8  s   &&&r   ÚdotÚOpsHandler.dotð  rÞ   r   Úconstraintsr*   Úis_pureÚpackÚinput_dtypesc               ó8   € V ^8„  d   QhRRRRRRRRR	R
RRRRRR/# )r   Úinputsr   Úasmr   rò  z
str | Noner*   r+   ró  rt   rô  Úintrõ  ztuple[torch.dtype, ...] | Noner   r   )r   s   "r   r   r,   ô  sZ   € ÷ 
"ñ 
"àð
"ð ð
"ð  ð	
"ð
 ð
"ð ð
"ð ð
"ð 5ð
"ð 
ñ
"r   c               	ó   € \         hr    r.   )r0   rø  rò  r*   ró  rô  rõ  r÷  s   &$$$$$$*r   Úinline_asm_elementwiseÚ!OpsHandler.inline_asm_elementwiseô  r¾   r   c               ó    € V ^8„  d   QhRRRR/# )r   Úargsr   r   r§   r   )r   s   "r   r   r,      s   € ÷ "ñ "˜Að " $ñ "r   c                ó   € \         h©z2This is a fake op used in analysis but not codegenr.   )r0   rþ  s   &*r   ÚoutputÚOpsHandler.output   r3   r   c               ó    € V ^8„  d   QhRRRR/# )r   r    rù  r   r   r   )r   s   "r   r   r,     s   € ÷ "ñ " ð "¨ñ "r   c                ó   € \         hr   r.   )r0   r    s   &&r   ÚplaceholderÚOpsHandler.placeholder  r3   r   c               ó$   € V ^8„  d   QhRRRRRR/# )r   Úcondr   Úmsgr   r   r   )r   s   "r   r   r,     s!   € ÷ "ñ "¨ð "°ð "¸ñ "r   c                	ó   € \         hr    r.   )r0   r  r	  s   &&&r   Údevice_assert_asyncÚOpsHandler.device_assert_async  rÞ   r   r   )NT©TTr    ©NN)£Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r1   r8   r?   rG   rL   rR   rY   r`   ri   rn   rv   r}   r‚   r‡   r‹   r�   r–   r�   r¢   r©   r¯   r³   r¼   rÃ   rÎ   rÔ   rÜ   rá   ræ   rë   rï   ró   rû   rÿ   r  r  r  r  r  r  r  r!  r%  r)  r-  r2  r6  r:  r>  rB  rF  rJ  rN  rR  rV  r\  r`  re  rj  ro  rs  rw  r{  r  rƒ  r‡  r‹  r�  r“  r—  r›  r   r¤  r©  r­  r±  rµ  r¹  r½  rÁ  rÅ  rÉ  rÍ  rÑ  rÖ  rÚ  rÞ  râ  ræ  rê  rï  ró  r÷  rû  rÿ  r  r  r  r  r  r  r  r!  r%  r)  r-  r3  r9  r=  rA  rE  rJ  rO  rT  rX  r\  r`  re  ri  rm  rq  ru  ry  r}  r‚  r†  rŠ  rŽ  r“  r—  r›  rŸ  r¤  r©  r­  r±  rµ  r¹  r½  rÁ  rÅ  rÉ  rÍ  rÒ  rÖ  rÚ  rÞ  râ  rè  rì  rð  ÚtorchÚfloat32rû  r  r  r  Ú__static_attributes__r   r   r   r'   r'   A   sb  † ñõ8"õ"õ"õ"õ"õ"õ"õ"õ"õ"÷"ð "õ"õ"õ"õ"õ"õ"÷"ð "õ"÷"ð "õ "õ,"õ
"õ
"÷"ð "õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ
"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"õ"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷"÷
"÷
"÷"÷"÷"÷"÷"÷"ñ
"ð #'ñ	
"ð
 #Ÿ]š]ñ
"ð ñ
"ð ñ
"ð 8<÷
"ñ 
"÷"÷"÷"ô "r   r'   z	_.*|parenc               ó   € V ^8„  d   QhRR/# )r   Úclsz	type[Any]r   )r   s   "r   r   r     s   € ÷ Eñ E�)ñ Er   c                óz   € \        \        V 4       Uu. uF  p\        V4      '       d   K  VNK  	  up4      # u upi r    )r   ÚdirÚ_ignore_op_re)r  rq   s   & r   Úlist_opsr    s,   € Ü¤# c¤(ÓC¡(˜Q´-À×2B—q�q¡(ÑCÓDÐDùÒCs   “8«8c                  óT   € ] tR tRtR R ltR R lt]R R l4       t]R 4       t	R	t
R
# )ÚDefaultHandleri  c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r   r5   r   rþ  ztuple[Any, ...]ÚkwargsrÒ   r   r   r   )r   s   "r   r   ÚDefaultHandler.__annotate__  s)   € ÷ "ñ "˜Sð "¨ð "Àð "ÐTWñ "r   c                ó   € \         h)a  
Default implementation for all ops.  Override in a subclass to
provide generic op behavior.

Args:
    name: name of the op, see OpHandler.{name}
    args: positional args passed to the op
    kwargs: keyword args passed to the op

Returns:
    return value of the op

r.   ©r0   r5   rþ  r!  s   &&&&r   Ú_defaultÚDefaultHandler._default  s
   € ô "Ð!r   c               ó    € V ^8„  d   QhRRRR/# )r   r5   r   r   r   r   )r   s   "r   r   r"  '  s   € ÷ ñ  ð ¨ñ r   c                	óR   a a€ R  VV 3R llp\         P                  ! RS R24       V# )c               ó$   € V ^8„  d   QhRRRRRR/# )r   rþ  r   r!  r   r   )r   s   "r   r   Ú0DefaultHandler.__getattr__.<locals>.__annotate__(  s!   € ÷ 	5ñ 	5˜Cð 	5¨3ð 	5°3ñ 	5r   c                 ó(   <€ SP                  SW4      # r    ©r%  )rþ  r!  r5   r0   s   *,€€r   ÚfallbackÚ,DefaultHandler.__getattr__.<locals>.fallback(  s   ø€ Ø—=‘=  tÓ4Ð4r   zundefined OpHandler.z, please add missing op schema)ÚwarningsÚwarn)r0   r5   r-  s   ff r   Ú__getattr__ÚDefaultHandler.__getattr__'  s+   ù€ ÷	5ñ 	5ô 	�ŠÐ,¨T¨FÐ2PÐQÔRØˆr   c               ó   € V ^8„  d   QhRR/# )r   Útargetr   r   )r   s   "r   r   r"  0  s   € ÷ ñ ˜cñ r   c                	ó"   a € V 3R  lpS Vn         V# )c                ó(   <€ V P                  SW4      # r    r,  )r0   rþ  r!  r4  s   &*,€r   Úcall_defaultÚ2DefaultHandler._call_default.<locals>.call_default1  s   ø€ Ø—=‘= ¨Ó6Ð6r   )r  )r4  r7  s   f r   Ú_call_defaultÚDefaultHandler._call_default/  s   ø€ õ	7ð !'ˆÔØÐr   c                óF  € \        4       p\         EF=  p\        P                  ! \	        \
        V4      4      p\        ;QJ d4    R VP                  P                  4        4       F  '       d   K   RM)	  RM%! R VP                  P                  4        4       4      '       d‘   VP                  P                  4       vrEVR8w  d   \        RV: 24      hVP                  RV RRP                  V4       R	V: R
RP                  V4       R2	P                  4       4       VP                  R4       EK"  \        WV P                  V4      4       EK@  	  / p\!        VP#                  4       V4       VP%                  4        F  w  r'V\        9   g   K  \        WV4       K   	  R# )zû
Here we codegen many functions of the form:

    def add(self, a, b):
        return self._default('add', (a, b), {})

and install them in cls.  This is the same as _call_default above,
but is about 1.2x faster since CPython varargs parsing is slow.
c              3  óÌ   "  € T FZ  pVP                   \        P                  P                  8H  ;'       d'    VP                  \        P                  P
                  J x € K\  	  R # 5ir    )ÚkindÚinspectÚ	ParameterÚPOSITIONAL_OR_KEYWORDÚdefaultÚempty)Ú.0Úps   & r   Ú	<genexpr>Ú+DefaultHandler._init_cls.<locals>.<genexpr>E  sU   é € ð ñ 1�Að —‘œ'×+Ñ+×AÑAÑA÷ 9ð 9Ø—I‘I¤×!2Ñ!2×!8Ñ!8Ð8ô9ã0ùs
   ‚2A$µ/A$FTr0   z%expected first parameter 'self', got z
                    def z(self, ú, z0):
                        return self._default(z, (z, ), {})
                    z

N)r   ÚOP_NAMESr>  Ú	signatureÚgetattrr'   ÚallÚ
parametersr¹   ÚkeysÚAssertionErrorÚwriteÚjoinÚstripÚsetattrr9  ÚexecÚgetvalueÚitems)r  Úcoder4  ÚsigÚself_argrþ  ÚctxÚimpls   &       r   Ú	_init_clsÚDefaultHandler._init_cls7  sd  € ô ‹zˆß�hˆFÜ×#Ò#¤G¬J¸Ó$?Ó@ˆCß‹sñ ð Ÿ™×.Ñ.Ô0ó�s�sŠsñ ð Ÿ™×.Ñ.Ô0ó÷ ò ð
 #&§.¡.×"5Ñ"5Ó"7��Ø˜vÔ%Ü(Ø?À¹|ÐLóð ð —
‘
ðØ˜ ¨¯	©	°$«Ð'8ð 9.Ø.4©Z°s¸4¿9¹9ÀT»?Ð:Kð Lð÷ ™›ô	ð —
‘
˜6×"ô ˜ S×%6Ñ%6°vÓ%>×?ñ+ ð. !ˆÜˆT�]‰]‹_˜cÔ"ØŸI™IžK‰LˆFØœÖ!Ü˜ TÖ*ó (r   r   N)r  r  r  r  r%  r1  Ústaticmethodr9  Úclassmethodr[  r  r   r   r   r  r    s4   † õ"õ ð ôó ðð ñ&+ó ô&+r   r  c                  ó˜   € ] tR tRtR tR R lt]R R l4       t]R R l4       t]R R	 l4       t	]R
 R l4       t
]RR R ll4       tRtR# )ÚNoopHandlerid  c               ó(   € V ^8„  d   QhRRRRRRRR/# r   r   )r   s   "r   r   ÚNoopHandler.__annotate__g  s)   € ÷ ñ ˜Sð ¨ð Àð ÐTWñ r   c                	ó   € R # r    r   r$  s   &&&&r   r%  ÚNoopHandler._defaultg  s   € Ùr   c               ó   € V ^8„  d   QhRR/# ©r   r   r§   r   )r   s   "r   r   rb  k  s   € ÷ ñ  Tñ r   c                	ó   € R # r    r   ©rU   rV   rW   s   &&&r   rY   ÚNoopHandler.maskedj  s   € ár   c               ó   € V ^8„  d   QhRR/# )r   r   ztuple[None, None]r   )r   s   "r   r   rb  p  s   € ÷ ñ Ð%ñ r   c                	ó   € R# )Nr  r   ©rq   s   &r   rJ  ÚNoopHandler.frexpn  s
   € ð Ðr   c               ó   € V ^8„  d   QhRR/# ©r   r   ztuple[None, ...]r   )r   s   "r   r   rb  t  s   € ÷ %ñ %Ð,<ñ %r   c                	ó&   € R\        V4      ,          # ©Nr    ©Úlen©r¶   r¸   r¹   s   &&&r   r¼   ÚNoopHandler.scans  ó   € àœ˜V›Õ$Ð$r   c               ó   € V ^8„  d   QhRR/# ro  r   )r   s   "r   r   rb  x  s   € ÷ %ñ %Ð4Dñ %r   c                	ó&   € R\        V4      ,          # rq  rr  ©r¶   r¹   rÀ   rÁ   s   &&&&r   rÃ   ÚNoopHandler.sortw  rv  r   c               ó   € V ^8„  d   QhRR/# ©r   r   zsympy.Symbolr   )r   s   "r   r   rb  }  s   € ÷ ñ Èñ r   c                	ó6   € \         P                  P                  # r    )r"   ÚSÚZero©Ú	index_varr™   rš   rœ   s   &&&&r   r�   ÚNoopHandler.indirect_indexing{  s   € ô �w‰w�|‰|Ðr   r   Nr  ©r  r  r  r  r5   r%  r]  rY   rJ  r¼   rÃ   r�   r  r   r   r   r`  r`  d  sp   † Ø€Dõð ôó ðð ôó ðð ô%ó ð%ð ô%ó ð%ð öó ôr   r`  c                  óF  € ] tR tRt]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t	]R 4       t
]R 4       t]R	 4       t]R
 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       t]R 4       tRtR# )ÚBasicMathOpsMixini�  c                	ó   € V  R V 2# )z + r   ©r   Úbs   &&r   rï  ÚBasicMathOpsMixin.add‚  ó   € à��C˜�sˆ|Ðr   c                	ó   € V  R V 2# )z - r   r‡  s   &&r   ró  ÚBasicMathOpsMixin.sub†  rŠ  r   c                	ó   € V  R V 2# )z * r   r‡  s   &&r   r÷  ÚBasicMathOpsMixin.mulŠ  rŠ  r   c                	ó   € V  R V 2# )z // r   r‡  s   &&r   rÉ  ÚBasicMathOpsMixin.floordivŽ  ó   € à��D˜˜ˆ}Ðr   c                	ó   € V  R V 2# )z / r   r‡  s   &&r   rÍ  ÚBasicMathOpsMixin.truediv’  rŠ  r   c                	ó   € V  R V 2# )z % r   r‡  s   &&r   rÚ  ÚBasicMathOpsMixin.mod–  s   € ð ��C˜�sˆ|Ðr   c                	ó   € V  R V 2# )z ** r   r‡  s   &&r   rû  ÚBasicMathOpsMixin.pow›  r‘  r   c                	ó   € V  R V 2# )z << r   r‡  s   &&r   r  ÚBasicMathOpsMixin.lshiftŸ  r‘  r   c                	ó   € V  R V 2# )z >> r   r‡  s   &&r   r  ÚBasicMathOpsMixin.rshift£  r‘  r   c                	ó   € V  R V 2# )z & r   r‡  s   &&r   rÿ  ÚBasicMathOpsMixin.and_§  rŠ  r   c                	ó   € V  R V 2# )z | r   r‡  s   &&r   r  ÚBasicMathOpsMixin.or_«  rŠ  r   c                	ó   € V  R V 2# )z ^ r   r‡  s   &&r   r  ÚBasicMathOpsMixin.xor¯  rŠ  r   c                	ó   € V  R V 2# )z == r   r‡  s   &&r   rÖ  ÚBasicMathOpsMixin.eq³  r‘  r   c                	ó   € V  R V 2# )z != r   r‡  s   &&r   rÚ  ÚBasicMathOpsMixin.ne·  r‘  r   c                	ó   € V  R V 2# )z < r   r‡  s   &&r   rÞ  ÚBasicMathOpsMixin.lt»  rŠ  r   c                	ó   € V  R V 2# )z > r   r‡  s   &&r   râ  ÚBasicMathOpsMixin.gt¿  rŠ  r   c                	ó   € V  R V 2# )z <= r   r‡  s   &&r   ræ  ÚBasicMathOpsMixin.leÃ  r‘  r   c                	ó   € V  R V 2# )z >= r   r‡  s   &&r   rê  ÚBasicMathOpsMixin.geÇ  r‘  r   c                	ó   € R V  2# )Ú-r   r$   s   &r   rÍ  ÚBasicMathOpsMixin.negË  s   € à�1�#ˆwˆr   r   N)r  r  r  r  r]  rï  ró  r÷  rÉ  rÍ  rÚ  rû  r  r  rÿ  r  r  rÖ  rÚ  rÞ  râ  ræ  rê  rÍ  r  r   r   r   r…  r…  �  s|  † Øñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ðð ñó ôr   r…  c                  ó†   € ] tR tRtR tR R lt]R R l4       t]R 4       t]R 4       t	]R 4       t
]RR	 R
 ll4       tRtR# )ÚMockHandleriÐ  c               ó(   € V ^8„  d   QhRRRRRRRR/# r   r   )r   s   "r   r   ÚMockHandler.__annotate__Ó  s)   € ÷ 1ñ 1˜Sð 1¨ð 1Àð 1ÐTWñ 1r   c                	óÆ   € . \        \        V4      OpVP                  4        F$  w  rVVP                  V R \        V4       24       K&  	  RV RRP	                  V4       R2# )Ú=zops.Ú(rG  Ú))Úmapr%   rU  ÚappendrP  )r0   r5   rþ  r!  ÚfargsÚkÚvs   &&&&   r   r%  ÚMockHandler._defaultÓ  s_   € Ø&”#”h Ó%Ð&ˆØ—L‘L–N‰DˆAØ�L‰L˜A˜3˜a¤¨£˜}Ð-Ö.ñ #à�d�V˜1˜TŸY™Y uÓ-Ð.¨aÐ0Ð0r   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   r´  Ú  s   € ÷ 8ñ 8 Sñ 8r   c                	ó$   € R V  RV! 4        RV R2# )zops.masked(rG  r¸  r   rh  s   &&&r   rY   ÚMockHandler.maskedÙ  s   € à˜T˜F "¡T£V H¨B¨u¨g°QÐ7Ð7r   c                	ó   € R V  R2R V  R23# )z
ops.frexp(z)[0]z)[1]r   rl  s   &r   rJ  ÚMockHandler.frexpÝ  s!   € ð ˜Q˜C˜tÐ$¨
°1°#°TÐ&:Ð;Ð;r   c                	ó¼   a aa€ \         ;QJ d+    . VV V3R  l\        \        S4      4       4       F  NK  	  5# ! VV V3R  l\        \        S4      4       4       4      # )c           
   3  óB   <"  € T F  pR S RS RS RV R2	x € K  	  R# 5i)z	ops.scan(rG  ú)[Ú]Nr   )rC  Úir¸   r¶   r¹   s   & €€€r   rE  Ú#MockHandler.scan.<locals>.<genexpr>ä  s3   øé € ð 
á'�ð ˜�x˜r * ¨R°¨x°r¸!¸¸AÕ>Û'ùs   ƒ©ÚtupleÚrangers  rt  s   fffr   r¼   ÚMockHandler.scanâ  sG   ú€ çŒuö 
äœ3˜v›;Ô'ó
�uð 	
ˆuö 
äœ3˜v›;Ô'ó
ó 
ð 	
r   c                	óÂ   a aaa€ \         ;QJ d,    . VV VV3R  l\        \        S4      4       4       F  NK  	  5# ! VV VV3R  l\        \        S4      4       4       4      # )c              3  óH   <"  € T F  pR S RS RS RS RV R2x € K  	  R# 5i)z	ops.sort(rG  z	, stable=z, descending=rÇ  rÈ  Nr   )rC  rÉ  rÁ   r¶   rÀ   r¹   s   & €€€€r   rE  Ú#MockHandler.sort.<locals>.<genexpr>ë  s=   øé € ð 
á'�ð ˜�x˜r & ¨°6°(¸-È
À|ÐSUÐVWÐUXÐXYÕZÛ'ùs   ƒ"rË  ry  s   ffffr   rÃ   ÚMockHandler.sorté  sG   û€ çŒu÷ 
äœ3˜v›;Ô'ó
�uð 	
ˆu÷ 
äœ3˜v›;Ô'ó
ó 
ð 	
r   c               ó   € V ^8„  d   QhRR/# r|  r   )r   s   "r   r   r´  ò  s   € ÷ 2ñ 2Èñ 2r   c                	ó*   € \        \        V 4      4      # r    )r   r   r€  s   &&&&r   r�   ÚMockHandler.indirect_indexingð  s   € ô "¤# i£.Ó1Ð1r   r   Nr  rƒ  r   r   r   r²  r²  Ð  sp   † Ø€Dõ1ð ô8ó ð8ð ñ<ó ð<ð ñ
ó ð
ð ñ
ó ð
ð ö2ó ô2r   r²  c                  ól   € ] tR tRtR R lt]RR R ll4       tR R ltR	 tR
 R lt	R R lt
R tRtR# )ÚKernelFormatterHandleriö  c               ó   € V ^8„  d   QhRR/# )r   Úparent_handlerúOpsHandler[Any]r   )r   s   "r   r   Ú#KernelFormatterHandler.__annotate__÷  s   € ÷ -ñ - ñ -r   c                	óf   € Wn         \        ^4      V n        \        P                  ! 4       V n        R# )é   N)rÙ  r   Ú_outputÚ	itertoolsÚcountÚvar_counter)r0   rÙ  s   &&r   Ú__init__ÚKernelFormatterHandler.__init__÷  s#   € Ø,ÔÜ% aÓ(ˆŒÜ$Ÿ?š?Ó,ˆÖr   Nc               ó   € V ^8„  d   QhRR/# rÀ  r   )r   s   "r   r   rÛ  ý  s   € ÷ .ñ .°3ñ .r   c                	ó   € ^RI Hp ^RIHp Ve   W.MV.pVe   RR.MR.p\	        \        4       4      pVP                  P                  R4      ;_uu_ 4        VP                  P                  RRP                  V4       R24       RRR4       \        We4       F�  w  r‰V	'       g   K  RP                  V	 U
u. uF6  p
\        \        V
\        \        P                  34      '       d   R	MT
4      NK8  	  up
4      pVP                  P                  V R
V 24       Kƒ  	  VP!                  V4      ;_uu_ 4        \"        P$                  ! VRR4      ;_uu_ 4        V ! V!  pVP'                  V4      uuRRR4       uuRRR4       #   + '       g   i     EL; iu up
i   + '       g   i     M; i RRR4       R#   + '       g   i     R# ; i)rÝ  )ÚFlexibleLayout)ÚVNr    Úrindexzdef inner_fn(rG  z):Ú_ú = Úallow_indexingTéÿÿÿÿ)Úirræ  Úvirtualizedrç  r×  r²  rÞ  ÚindentÚ	writelinerP  Úzipr   r!   rù  r"   ÚIntegerÚset_ops_handlerr   r   rT  )Úir_fnr    rè  ræ  rç  rþ  ÚnamesÚ	formatterr5   Úargr½  ÚlhsÚresults   &&&          r   Úir_to_stringÚ#KernelFormatterHandler.ir_to_stringü  ss  € å&Ý"à"(Ò"4�‰¸5¸'ˆØ'-Ò'9�˜(Ñ#À¸yˆÜ*¬;«=Ó9ˆ	à×Ñ×%Ñ% b×)Õ)Ø×Ñ×'Ñ'¨-¸¿	¹	À%Ó8HÐ7IÈÐ(LÔM÷ *ä˜UÖ)‰IˆDß‰sØ—i‘iñ "%óá!$˜Aô ¤:¨a´#´u·}±}Ð1E×#FÒ#F™CÈAÖNÙ!$ñó�ð ×!Ñ!×+Ñ+¨s¨e°3°t°fÐ,=Ö>ñ *ð ×Ñ˜i×(Õ(Ü�LŠL˜Ð)9¸4×@Õ@á˜D‘\ˆFØ×%Ñ% fÓ-÷ AÑ@÷ )Ò(÷ *×)Ð)üò
÷ A×@úÐ@÷ )×(×(Ò(ús6   Á/FÂ8<F
Ä8!F<ÅF	Å0
F<ÆF	ÆF.Æ)F<Æ<G	c               ó   € V ^8„  d   QhRR/# r|  r   )r   s   "r   r   rÛ    s   € ÷ Fñ F°Lñ Fr   c                	ó:   € V P                   P                  ! V/ VB # r    )rÙ  r�   ©r0   rþ  r!  s   &*,r   r�   Ú(KernelFormatterHandler.indirect_indexing  s   € Ø×"Ñ"×4Ò4°dÐE¸fÑEÐEr   c                	óv   € R \        V P                  4       2pV P                  P                  V RV 24       V# )Útmprê  )Únextrá  rÞ  rð  )r0   ÚlineÚvarnames   && r   Ú_writeÚKernelFormatterHandler._write  s<   € àœ˜T×-Ñ-Ó.Ð/Ð0ˆØ�‰×Ñ ' ¨#¨d¨VÐ4Ô5Øˆr   c               ó(   € V ^8„  d   QhRRRRRRRR/# r   r   )r   s   "r   r   rÛ  !  s)   € ÷ 
ñ 
˜Sð 
¨ð 
Àð 
ÐTWñ 
r   c                	óx   € \         P                  ! V P                  \        V P                  V4      ! V/ VB 4      # r    )ÚpytreeÚtree_mapr  rJ  rÙ  r$  s   &&&&r   r%  ÚKernelFormatterHandler._default!  s3   € Ü�ŠØ�K‰Kœ ×!4Ñ!4°dÔ;¸TÐLÀVÑLó
ð 	
r   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   r*   r+   rr   r¬   r­   r)   zstr | tuple[str, ...]r   r   )r   s   "r   r   rÛ  &  sC   € ÷ Bñ BàðBð ðBð &ð	Bð
 %ðBð 
ñBr   c                	óN  € V P                   P                  WW44      p\        V4      p\        V4       Uu. uF  pR \	        V P
                  4       2NK  	  ppV P                  P                  RP                  V4       RV 24       V^8”  d   \        V4      # V^ ,          # u upi )r  Ú,rê  )
rÙ  r¯   r   rÍ  r  rá  rÞ  rð  rP  rÌ  )	r0   r*   rr   r¬   r)   r  Ú
num_valuesré  Úvarnamess	   &&&&&    r   r¯   Ú KernelFormatterHandler.reduction&  sš   € ð ×"Ñ"×,Ñ,¨U¸~ÓUˆÜ*¨>Ó:ˆ
Ü<AÀ*Ô<MÓNÑ<M°q�cœ$˜t×/Ñ/Ó0Ð1Ó2Ñ<MˆÐNØ�‰×Ñ #§(¡(¨8Ó"4Ð!5°S¸¸Ð?Ô@Ø",¨q¤.Œu�X‹ÐA°h¸qµkÐAùò Os   µ!B"c                	ór   € V P                   P                  R V 24       V P                   P                  4       # )zreturn )rÞ  rð  rT  )r0   rù  s   &&r   rT  ÚKernelFormatterHandler.getvalue3  s.   € Ø�‰×Ñ ¨¨Ð1Ô2Ø�|‰|×$Ñ$Ó&Ð&r   )rÞ  rÙ  rá  r    )r  r  r  r  râ  r]  rú  r�   r  r%  r¯   rT  r  r   r   r   r×  r×  ö  s6   † õ-ð
 ö.ó ð.õ6Fòõ
õ
Bö'r   r×  c                  ó.   € ] tR tRtR R ltR R ltRtR# )ÚWrapperHandleri8  c               ó   € V ^8„  d   QhRR/# ©r   ÚinnerrÚ  r   )r   s   "r   r   ÚWrapperHandler.__annotate__9  s   € ÷ ñ ˜oñ r   c                	ó   € Wn         R # r    ©Ú_inner)r0   r  s   &&r   râ  ÚWrapperHandler.__init__9  s   € ØŽr   c               ó(   € V ^8„  d   QhRRRRRRRR/# r   r   )r   s   "r   r   r  <  s)   € ÷ ;ñ ;˜Sð ;¨ð ;Àð ;ÐTWñ ;r   c                	ó:   € \        V P                  V4      ! V/ VB # r    )rJ  r  r$  s   &&&&r   r%  ÚWrapperHandler._default<  s   € Ü�t—{‘{ DÔ)¨4Ð:°6Ñ:Ð:r   r  N)r  r  r  r  râ  r%  r  r   r   r   r  r  8  s   † õ÷;ñ ;r   r  c                  ó"   € ] tR tRtR R ltRtR# )ÚAddParenHandleri@  c               ó(   € V ^8„  d   QhRRRRRRRR/# r   r   )r   s   "r   r   ÚAddParenHandler.__annotate__A  s)   € ÷ ñ ˜Sð ¨ð Àð ÐTWñ r   c                	ó°   € \        V P                  V4      ! V/ VB pV'       d,   \        V\        P                  \
        \        34      '       d   V# R V R2# )r·  r¸  )rJ  r  r!   r"   r#   rÌ  Úlist)r0   r5   rþ  r!  Úvals   &&&& r   r%  ÚAddParenHandler._defaultA  sI   € Ü�d—k‘k 4Ô(¨$Ð9°&Ñ9ˆß”j ¤u§z¡z´5¼$Ð&?×@Ò@ØˆJØ�3�%�qˆzÐr   r   N)r  r  r  r  r%  r  r   r   r   r"  r"  @  s   † ÷ñ r   r"  c                  ó@   € ] tR tRt$ R]R&   R]R&   R]R&   R]R&   R	tR
# )ÚOpCountResultiH  rù  Únum_opszOrderedSet[str]Úused_opsz	list[str]Úread_buffersÚnontrivial_read_countr   N)r  r  r  r  Ú__annotations__r  r   r   r   r*  r*  H  s   ‡ ØƒLØÓØÓØ×r   r*  c                  óx   a € ] tR tRtRtR V 3R lltR R ltR tR tR	 R
 lt	R R lt
RR R lltR tRtV ;t# )ÚOpCounterCSEiO  z#Shim to count how many ops are usedc               ó   € V ^8„  d   QhRR/# r  r   )r   s   "r   r   ÚOpCounterCSE.__annotate__R  s   € ÷ (ñ (˜oñ (r   c                	ó†   <€ \         SV `  4        Wn        ^ V n        / V n        \        4       V n        . V n        ^ V n        R# )r   N)	Úsuperrâ  rÙ  Úop_countÚ	var_namesr   Ú	_used_opsÚ_read_namesÚ_nontrivial_read_count©r0   r  Ú	__class__s   &&€r   râ  ÚOpCounterCSE.__init__R  s;   ø€ Ü‰ÑÔØ#ÔØˆŒØ)+ˆŒÜ*4«,ˆŒØ&(ˆÔØ&'ˆÖ#r   c               ó(   € V ^8„  d   QhRRRRRRRR/# r   r   )r   s   "r   r   r3  [  s)   € ÷ 
ñ 
˜Sð 
¨ð 
Àð 
ÐTWñ 
r   c                	ó®   € V P                   P                  V4       \        P                  ! V P                  \        V P                  V4      ! V/ VB 4      # r    )r8  rï  r	  r
  Ú_update_countrJ  rÙ  r$  s   &&&&r   r%  ÚOpCounterCSE._default[  sG   € Ø�‰×Ñ˜4Ô Ü�ŠØ×Ñ¤¨×(;Ñ(;¸TÔ BÀDÐ SÈFÑ Só
ð 	
r   c                	ó¸   € V P                   P                  V4      pV'       g7   R V P                   2pV ;P                  ^,          un        W P                   V&   V# )r  )r7  Úgetr6  )r0   r'  r  s   && r   r@  ÚOpCounterCSE._update_counta  sH   € Ø—.‘.×$Ñ$ SÓ)ˆßØ˜DŸM™M˜?Ð+ˆGØ�MŠM˜QÕ�MØ")�N‰N˜3ÑØˆr   c                	óp   € V P                   P                  R 4       V P                  P                  ! V/ VB # )r�   )r8  rï  rÙ  r�   rþ  s   &*,r   r�   ÚOpCounterCSE.indirect_indexingi  s1   € Ø�‰×ÑÐ.Ô/Ø×"Ñ"×4Ò4°dÐE¸fÑEÐEr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r5   r   r    re   r   r   )r   s   "r   r   r3  m  s!   € ÷ 'ñ '˜ð ' Zð '°Cñ 'r   c                	ód  € V P                   P                  W4      pW0P                  9  dv   V P                  P	                  R 4       V P
                  P                  V4       \        V\        P                  \        34      '       g   V ;P                  ^,          un        V P                  V4      # )r¢   )rÙ  r¢   r7  r8  rï  r9  rº  r!   r"   rò  rù  r:  r@  )r0   r5   r    r'  s   &&& r   r¢   ÚOpCounterCSE.loadm  s€   € Ø×!Ñ!×&Ñ& tÓ3ˆØ—n‘nÔ$Ø�N‰N×Ñ˜vÔ&Ø×Ñ×#Ñ# DÔ)Ü˜e¤e§m¡m´SÐ%9×:Ò:Ø×+Ò+¨qÕ0Õ+Ø×!Ñ! #Ó&Ð&r   c               ó    € V ^8„  d   QhRRRR/# )r   r5   r   r6   r   r   )r   s   "r   r   r3  v  s   € ÷ 'ñ '˜cð '¨1ñ 'r   c                	óæ   € V P                   P                  W4      pW0P                  9  d7   V P                  P	                  R 4       V P
                  P                  V4       V P                  V4      # )r8   )rÙ  r8   r7  r8  rï  r9  rº  r@  )r0   r5   r6   r'  s   &&& r   r8   ÚOpCounterCSE.load_seedv  sY   € Ø×!Ñ!×+Ñ+¨DÓ9ˆØ—n‘nÔ$Ø�N‰N×Ñ˜{Ô+Ø×Ñ×#Ñ# DÔ)Ø×!Ñ! #Ó&Ð&r   c               ó8   € V ^8„  d   QhRRRRRRRRRR	R
RRRRR/# rÆ   r   )r   s   "r   r   r3  }  s[   € ÷ 'ñ 'àð'ð Cð'ð ð	'ð
 $ð'ð ð'ð .ð'ð !ð'ð 
ñ'r   c           	     óL  € V P                   P                  VVVVVVV4      pW€P                  9  dd   V P                  P	                  R4       V P
                  P                  V^ ,          4       Ve#   V P
                  P                  V^ ,          4       V P                  V4      # )z#
See [Note: Inductor bucketize op]
rÎ   )rÙ  rÎ   r7  r8  rï  r9  rº  r@  )	r0   r¹   rÇ   rÈ   rÉ   rÊ   rË   rÌ   r'  s	   &&&&&&&& r   rÎ   ÚOpCounterCSE.bucketize}  s”   € ð ×!Ñ!×+Ñ+ØØØØØØØó
ˆð —n‘nÔ$Ø�N‰N×Ñ˜{Ô+Ø×Ñ×#Ñ# J¨q¥MÔ2ØÒ!Ø× Ñ ×'Ñ'¨¨q­	Ô2Ø×!Ñ! #Ó&Ð&r   c                	ón   € \        V P                  V P                  V P                  V P                  4      # r    )r*  r6  r8  r9  r:  )r0   s   &r   rT  ÚOpCounterCSE.getvalueš  s,   € ÜØ�M‰M˜4Ÿ>™>¨4×+;Ñ+;¸T×=XÑ=Xó
ð 	
r   )r:  r9  r8  r6  rÙ  r7  r  )r  r  r  r  r  râ  r%  r@  r�   r¢   r8   rÎ   rT  r  Ú__classcell__©r<  s   @r   r1  r1  O  s9   ø† Ù-÷(ð (õ
òòFõ'õ'÷'÷:
ð 
r   r1  c                  ó.   € ] tR tRtR R ltR R ltRtR# )ÚExtractConstantsHandleri   c               ó   € V ^8„  d   QhRR/# )r   Údeviceztorch.device | Noner   )r   s   "r   r   Ú$ExtractConstantsHandler.__annotate__¡  s   € ÷ ñ Ð2ñ r   c                	ó   € Wn         R # r    ©rW  )r0   rW  s   &&r   râ  Ú ExtractConstantsHandler.__init__¡  s   € ØŽr   c               ó$   € V ^8„  d   QhRRRRRR/# )r   r)   r   r*   r+   r   ztorch._inductor.ir.Constantr   )r   s   "r   r   rX  ¤  s"   € ÷ 
ñ 
˜cð 
¨+ð 
Ð:Uñ 
r   c                	ó‚   € ^ RI Hp TP                  YV P                  ;'       g    \        P
                  ! 4       R7      # )r   )rí  )r)   r*   rW  )Útorch._inductorrí  ÚConstantrW  r  Úget_default_device)r0   r)   r*   rí  s   &&& r   r1   Ú ExtractConstantsHandler.constant¤  s5   € Ý&à�{‰{Ø¨T¯[©[×-VÐ-V¼E×<TÒ<TÓ<Vð ó 
ð 	
r   rZ  N)r  r  r  r  râ  r1   r  r   r   r   rU  rU     s   † õ÷
ñ 
r   rU  c                  ót   a € ] tR tRtRtR V 3R lltR V 3R lltR R ltR	 R
 ltR R lt	R R lt
RtV ;t# )ÚSimpleCSEHandleri¬  z©Wraps the underlying handler with a CSE pass

NOTE: Compared to codegen level CSE this is simplified as it
doesn't support stores which require load cache invalidation.
c               ó   € V ^8„  d   QhRR/# )r   r  r   r   )r   s   "r   r   ÚSimpleCSEHandler.__annotate__³  s   € ÷ "ñ "˜cñ "r   c                	óR   <€ \         SV `  V4       / V n        \        4       V n        R # r    )r5  râ  Ú	cse_cacher²  Úmockr;  s   &&€r   râ  ÚSimpleCSEHandler.__init__³  s    ø€ Ü‰Ñ˜ÔØ;=ˆŒÜ“MˆŽ	r   c               ó   € V ^8„  d   QhRR/# )r   r   re   r   )r   s   "r   r   re  ¸  s   € ÷ :ñ :°Jñ :r   c                	ó$   <€ \         SV `  ! V/ VB # r    )r5  r�   )r0   rþ  r!  r<  s   &*,€r   r�   Ú"SimpleCSEHandler.indirect_indexing¸  s   ø€ Ü‰wÒ(¨$Ð9°&Ñ9Ð9r   c               ó   € V ^8„  d   QhRR/# rf  r   )r   s   "r   r   re  »  s   € ÷ ;ñ ;¨ñ ;r   c                	ó   € \        R 4      h©zstore not implementedr.   rþ  s   &*,r   r©   ÚSimpleCSEHandler.store»  ó   € Ü!Ð"9Ó:Ð:r   c               ó   € V ^8„  d   QhRR/# rf  r   )r   s   "r   r   re  ¾  s   € ÷ ;ñ ;°$ñ ;r   c                	ó   € \        R 4      hro  r.   rþ  s   &*,r   r³   Ú SimpleCSEHandler.store_reduction¾  rq  r   c               ó(   € V ^8„  d   QhRRRRRRRR/# r   r   )r   s   "r   r   re  Á  s)   € ÷ ñ ˜Sð ¨ð Àð ÐTWñ r   c                	óÔ   € \        V P                  V4      ! V/ VB pV P                  P                  V4      pVe   V# \        V P                  V4      ! V/ VB pWPP                  V&   V# r    )rJ  rh  rg  rC  r  )r0   r5   rþ  r!  Úkeyr'  s   &&&&  r   r%  ÚSimpleCSEHandler._defaultÁ  se   € Ü�d—i‘i Ô&¨Ð7°Ñ7ˆØ�n‰n× Ñ  Ó%ˆØŠ?ØˆJä�d—k‘k 4Ô(¨$Ð9°&Ñ9ˆØ!�‰�sÑØˆ
r   c               ó   € V ^8„  d   QhRR/# rf  r   )r   s   "r   r   re  Ë  s   € ÷ 
ñ 
°dñ 
r   c                	óD   € \        \        V 4      P                   R 24      h)z3: device_assert_async should be handled by CSEProxy)r/   Útyper  rþ  s   &*,r   r  Ú$SimpleCSEHandler.device_assert_asyncË  s%   € Ü!Ü�D‹z×"Ñ"Ð#Ð#VÐWó
ð 	
r   )rg  rh  )r  r  r  r  r  râ  r�   r©   r³   r%  r  r  rR  rS  s   @r   rc  rc  ¬  s5   ø† ñ÷"ð "÷
:ð :õ;õ;õ÷
ó 
r   rc  )Ú
atomic_addÚ
atomic_maxÚ
atomic_minÚ
atomic_andÚ	atomic_orÚ
atomic_xorÚ
atomic_casÚatomic_xchg)ÚargmaxÚargminÚargmax_valueÚargmin_valueÚargmax_with_valueÚargmin_with_valueÚwelford_reduceÚwelford_combineÚanyÚfmaxÚmaxÚminÚprodÚsumrð  Úxor_sumÚonline_softmax_reduce)6Ú
__future__r   r>  rß  Úrer/  Úior   Útypingr   r   r   r   r	   r
   Úunittest.mockr   r"   r  Útorch.utils._pytreeÚutilsÚ_pytreer	  Úutils._ordered_setr   r   r   r   r   Úcollections.abcr   r   Ú
AtomicModer¦   r­   r%   r'   ÚcompileÚ	fullmatchr  r  rH  r  r[  r`  r…  r²  r×  r  r"  r*  r1  rU  rc  r   r   r   Ú<module>r¢     s]  ðå "ã Û Û 	Û Ý ß L× LÝ ã ã ß $Ð $å +ß WÓ W÷ Ý(ñ ˆCƒL€Øðõ	€
ð ˜ �Õ'¨$Õ.€	Øðõ€õ*ôH"�˜•ô H"ðV —
’
˜<Ó(×2Ñ2€õEñ �JÓ€ôH+�Z •_ô H+ðV × Ñ Ô ô�.ô ÷:Lñ Lô^#2Ð# ^ô #2ôL?'˜^ô ?'ôD;�^ô ;ô�nô ô�Jô ôN
�>ô N
ôb	
˜kô 	
ô"
�~ö "
r   