Ë
    éÓ^júL  ã            +       óh  — d Z ddlmZmZ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	gZd
„ Zd'd„Zd„ Zd„ Z G d„ de
«      Zdee   dee   dee   dee   dee   dee   dee   dedededeeef   dedee   dee   dededed ed!ed"ef(d#„Zdee   dee   dee   dee   dee   dee   dee   dedededeeef   dedee   dee   dededed ed!ed"ef(d$„Z	 	 	 	 	 	 d(dee   dee   dee   dee   dee   d%ee   d!ed"edee   dee   dedededeeef   dedee   dee   dededed ef*d&„Zy))u@   ADOPT PyTorch Optimizer

ADOPT: Modified Adam Can Converge with Any Î²2 with the Optimal Rate: https://arxiv.org/abs/2411.02853

Modified for reduced dependencies on PyTorch internals from original at: https://github.com/iShohei220/adopt

@inproceedings{taniguchi2024adopt,
 author={Taniguchi, Shohei and Harada, Keno and Minegishi, Gouki and Oshima, Yuta and Jeong, Seong Cheol and Nagahara, Go and Iiyama, Tomoshi and Suzuki, Masahiro and Iwasawa, Yusuke and Matsuo, Yutaka},
 booktitle = {Advances in Neural Information Processing Systems},
 title = {ADOPT: Modified Adam Can Converge with Any Î²2 with the Optimal Rate},
 year = {2024}
}

References for added functionality:
    Cautious Optimizers: https://arxiv.org/abs/2411.16085
    Why Gradients Rapidly Increase Near the End of Training: https://arxiv.org/abs/2506.02285
é    )ÚcastÚListÚOptionalÚTupleÚUnionN)ÚTensor)Ú	Optimizeré   )ÚParamsTÚAdoptÚadoptc                 óÐ   — t        | «      D ]X  \  }}t        j                  |«      sŒt        j                  | |   «      | |<   |D ]  }t        j                  ||   «      ||<   Œ ŒZ y ©N)Ú	enumerateÚtorchÚ
is_complexÚview_as_real)ÚparamsÚstate_and_gradsÚiÚpÚss        ú[/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/optim/adopt.pyÚ_view_as_realr      sg   € Ü˜&Ó!ò 0‰ˆˆ1Ü×Ñ˜AÕÜ×*Ñ*¨6°!©9Ó5ˆF�1‰IØ$ò 0�Ü×)Ñ)¨!¨A©$Ó/��!’ñ0ñ0ó    c                 ó°   — | rt         j                  S t        j                  «       t         j                  k(  rt         j                  S t         j                  S r   )r   Úfloat32Úget_default_dtypeÚfloat64)Úis_fuseds    r   Ú_get_scalar_dtyper!   $   s;   € ÙÜ�}‰}Ðä×0Ñ0Ó2´e·m±mÒCŒ�‰ðÜINÏÉðr   c                  ó”   — t        t        d«      r8t        t        j                  d«      rt        j                  j                  «       S y)NÚcompilerÚis_compilingF)Úhasattrr   r#   r$   © r   r   Ú_is_compilingr'   ,   s/   € ÜŒu�jÔ!¤g¬e¯n©n¸nÔ&MÜ�~‰~×*Ñ*Ó,Ð,àr   c                 ó®   — t         j                  j                  «       st        «       r| S t	        | t         j
                  «      r| j                  «       S | S r   )r   ÚjitÚis_scriptingr'   Ú
isinstancer   Úitem)Úxs    r   Ú
_get_valuer.   3   s9   € ä�9‰9×!Ñ!Ô#¬¬Øˆä% a¬¯©Ô6ˆq�v‰v‹xÐ=¸AÐ=r   c                   óÖ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 dddddddœdedeeef   deeef   dede	e   d	ed
e
de
de
de	e
   de
de
de
fˆ fd„Zˆ fd„Zd„ Z ej                  «       dd„«       Zˆ xZS )r   uq   
    ADOPT: Modified Adam Can Converge with Any Î²2 with the Optimal Rate: https://arxiv.org/abs/2411.02853

    F)ÚcautionÚforeachÚmaximizeÚ
capturableÚdifferentiabler   ÚlrÚbetasÚepsÚclip_expÚweight_decayÚ	decoupledÚcorrected_weight_decayr0   r1   r2   r3   r4   c	                óÄ  •— t        |t        «      r-|
r|st        d«      ‚|j                  «       dk7  rt        d«      ‚d|k  st        d|› �«      ‚d|k  st        d|› �«      ‚d|d   cxk  rdk  sn t        d	|d   › �«      ‚d|d   cxk  rdk  sn t        d
|d   › �«      ‚d|k  st        d|› �«      ‚t	        ||||||||	||
||¬«      }t
        ‰| �  ||«       y )NúElr as a Tensor is not supported for capturable=False and foreach=Truer
   zTensor lr must be 1-elementç        zInvalid learning rate: zInvalid epsilon value: r   ç      ð?z#Invalid beta parameter at index 0: z#Invalid beta parameter at index 1: zInvalid weight_decay value: )r5   r6   r7   r9   r8   r:   r;   r0   r2   r1   r3   r4   )r+   r   Ú
ValueErrorÚnumelÚdictÚsuperÚ__init__)Úselfr   r5   r6   r7   r8   r9   r:   r;   r0   r1   r2   r3   r4   ÚdefaultsÚ	__class__s                  €r   rD   zAdopt.__init__@   s  ø€ ô" �bœ&Ô!Ù™zÜ Ø[óð ð �x‰x‹z˜QŠÜ Ð!>Ó?Ð?Ø�bŠyÜÐ6°r°dÐ;Ó<Ð<Ø�cŠzÜÐ6°s°eÐ<Ó=Ð=Ø�e˜A‘hÔ$ Ô$ÜÐBÀ5ÈÁ8À*ÐMÓNÐNØ�e˜A‘hÔ$ Ô$ÜÐBÀ5ÈÁ8À*ÐMÓNÐNØ�lÒ"ÜÐ;¸L¸>ÐJÓKÐKäØØØØ%ØØØ#9ØØØØ!Ø)ô
ˆô 	‰Ñ˜ Õ*r   c                 ó   •— t         ‰| �  |«       | j                  D �].  }|j                  dd«       |j                  dd «       |j                  dd«       |j                  dd«       |j                  dd «       |j                  dd«       |j                  dd«       |d	   D ]¥  }| j                  j                  |g «      }t        |«      d
k7  sŒ.t        j                  |d   «      rŒGt        |d   «      }|d   r*t        j                  |t        «       |j                  ¬«      nt        j                  |t        «       ¬«      |d<   Œ§ �Œ1 y )Nr2   Fr1   r3   r4   r8   r0   r;   r   r   Ústep©ÚdtypeÚdevice©rK   )rC   Ú__setstate__Úparam_groupsÚ
setdefaultÚstateÚgetÚlenr   Ú	is_tensorÚfloatÚtensorr!   rL   )rE   rQ   Úgroupr   Úp_stateÚstep_valrG   s         €r   rN   zAdopt.__setstate__s   s,  ø€ Ü‰Ñ˜UÔ#Ø×&Ñ&ó 	ˆEØ×Ñ˜Z¨Ô/Ø×Ñ˜Y¨Ô-Ø×Ñ˜\¨5Ô1Ø×ÑÐ-¨uÔ5Ø×Ñ˜Z¨Ô.Ø×Ñ˜Y¨Ô.Ø×ÑÐ5°uÔ=Ø˜8‘_ò �ØŸ*™*Ÿ.™.¨¨BÓ/�Ü�w“< 1Ó$¬U¯_©_¸WÀV¹_Õ-MÜ$ W¨V¡_Ó5�Hð ! Ò.ô Ÿ™Ø$Ü"3Ó"5Ø#$§8¡8õô #Ÿ\™\¨(Ô:KÓ:MÔNð ˜F’Oò	ñ	r   c                 óÎ  — d}|d   D �]Ù  }|j                   €Œ|t        j                  |«      z  }|j                  |«       |j                   j                  rt        d«      ‚|j                  |j                   «       | j                  |   }	t        |	«      dk(  r¿|d   r4t        j                  dt        «       |j                   j                  ¬«      nt        j                  dt        «       ¬	«      |	d
<   t        j                  |j                   t        j                  ¬«      |	d<   t        j                  |j                   t        j                  ¬«      |	d<   |j                  |	d   «       |j                  |	d   «       |d   r|	d
   j                  rt        d«      ‚|d   r(t        j                  |d   «      r|d   st        d«      ‚|j                  |	d
   «       �ŒÜ |S )NFr   z'ADOPT does not support sparse gradientsr   r3   r&   rJ   r>   rM   rI   )Úmemory_formatÚexp_avgÚ
exp_avg_sqr4   zB`requires_grad` is not supported for `step` in differentiable moder1   r5   r=   )Úgradr   r   ÚappendÚ	is_sparseÚRuntimeErrorrQ   rS   Úzerosr!   rL   rV   Ú
zeros_likeÚpreserve_formatÚrequires_gradrT   )
rE   rW   Úparams_with_gradÚgradsÚexp_avgsÚexp_avg_sqsÚstate_stepsÚhas_complexr   rQ   s
             r   Ú_init_groupzAdopt._init_group‹   s   € ð ˆØ�x‘ó #	.ˆAØ�v‰vˆ~ØØœ5×+Ñ+¨AÓ.Ñ.ˆKØ×#Ñ# AÔ&Ø�v‰v×ÒÜ"Ð#LÓMÐMØ�L‰L˜Ÿ™Ô à—J‘J˜q‘MˆEä�5‹z˜QŠð ˜\Ò*ô —K‘K Ô*;Ó*=ÀaÇfÁfÇmÁmÕTäŸ™ cÔ1BÓ1DÔEð �f‘ô $)×#3Ñ#3°A·F±FÌ%×J_ÑJ_Ô#`��iÑ ä&+×&6Ñ&6°q·v±vÌU×MbÑMbÔ&c��lÑ#à�O‰O˜E )Ñ,Ô-Ø×Ñ˜u \Ñ2Ô3àÐ%Ò&¨5°©=×+FÒ+FÜ"Ð#gÓhÐhð �YÒ¤E§O¡O°E¸$±KÔ$@ÈÈ|ÒI\Ü"Ð#jÓkÐkà×Ñ˜u V™}Ö-ðG#	.ðH Ðr   c                 ó^  — t        | d«      r| j                  «        nt        | d«      r| j                  «        d}|�$t        j                  «       5   |«       }ddd«       | j
                  D ]°  }g }g }g }g }g }|d   \  }	}
| j                  ||||||«      }t        |||||fi d|“d|	“d|
“d|d   “d	|d	   “d
|d
   “d|d   r| j                  d   nd“d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “d|d   “dt        | dd«      “dt        | dd«      “Ž Œ² |S # 1 sw Y   ŒÊxY w)z°Perform a single optimization step.

        Args:
            closure (Callable, optional): A closure that reevaluates the model
                and returns the loss.
        Ú'_accelerator_graph_capture_health_checkÚ _cuda_graph_capture_health_checkNr6   rk   Úbeta1Úbeta2r5   r9   r8   Úmax_lrr;   r:   r7   r0   r2   r1   r3   r4   Ú
grad_scaleÚ	found_inf)
r%   rn   ro   r   Úenable_gradrO   rl   r   rF   Úgetattr)rE   ÚclosureÚlossrW   rf   rg   rh   ri   rj   rp   rq   rk   s               r   rI   z
Adopt.step¼   sß  € ô �4ÐBÔCØ×8Ñ8Õ:Ü�TÐ=Ô>Ø×1Ñ1Ô3àˆØÐÜ×"Ñ"Ó$ñ !Ù“y�÷!ð ×&Ñ&ò '	ˆEØ-/ÐØ"$ˆEØ%'ˆHØ(*ˆKØ(*ˆKØ  ™>‰LˆE�5à×*Ñ*ØØ ØØØØóˆKô Ø ØØØØòñ (ðñ ðñ ðð ˜’;ðð # >Ò2ðð ˜zÒ*ðð /4Ð4LÒ.M�t—}‘} TÒ*ÐSWøðð   Ò,ðð ˜%’Lðð ˜iÒ(ðð  ˜zÒ*ð!ð" ˜iÒ(ð#ð$ ! Ò.ð%ð&  %Ð%5Ò6ð'ô( # 4¨°tÔ<ð)ô* " $¨°TÔ:ò+ð#'	ðR ˆ÷Y!ð !ús   ÁD#Ä#D,)çü©ñÒMbP?)gÍÌÌÌÌÌì?g§èH.ÿï?g�íµ ÷Æ°>gZd;ßOÕ?r>   FFr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   rU   r   r   r   ÚboolrD   rN   rl   r   Úno_gradrI   Ú__classcell__)rG   s   @r   r   r   ;   sü   ø„ ñð (,Ø)6ØØ(-Ø"%Ø#Ø+0ð1+ð "Ø&+Ø"Ø$Ø#(ò1+àð1+ð �e˜V�mÑ$ð1+ð ˜ ˜Ñ&ð	1+ð
 ð1+ð ˜u‘oð1+ð  ð1+ð ð1+ð %)ð1+ð ð1+ð ˜d‘^ð1+ð ð1+ð ð1+ð !õ1+ôfò0.ðb €U‡]�]ƒ_ò:ó ô:r   r   rg   rh   ri   rj   rs   rt   rk   rp   rq   r5   r9   r8   rr   r:   r7   r0   r2   r3   r4   c                óŒ  — |€|�J ‚t         j                  j                  «       rt        |
t        «      sJ ‚t        | «      D �]  \  }}|s||   n||    }||   }||   }||   }|rgt        «       s]ddlm}  |«       }|j                  j                  |j                  j                  k(  r|j                  j                  |v sJ d|› d�«       ‚|dz  }t        j                  |«      rXt        j                  |«      }|�t        j                  |«      }|�t        j                  |«      }t        j                  |«      }|dk7  r|s|j                  ||¬«      }|s|r|n
t        |«      }|dk(  r"|j                  ||j!                  «       «       �ŒP|dk7  r%|r#|�|
dz  |z  n|
}|j#                  || |z  ¬«       t        j$                  |j'                  «       |«      }|j)                  |«      }|�|dz
  |z  } |j+                  |  | «       |j-                  |d|z
  «       |rU||z  dkD  j/                  |j0                  «      }!|!j3                  |!j5                  «       j+                  d¬	«      «       ||!z  }|j#                  ||
 ¬«       |j7                  |	«      j                  ||j!                  «       d|	z
  ¬
«       �Œ‚ y )Nr   ©Ú!_get_capturable_supported_devicesúIIf capturable=True, params and state_steps must be on supported devices: ú.r
   ©Úalphaé   ry   )Úmin©Úvalue)r   r)   r*   r+   rU   r   r'   Útorch.optim.optimizerrƒ   rL   Útyper   r   Úaddr.   Úaddcmul_ÚconjÚadd_ÚclampÚsqrtÚdivÚclamp_Úlerp_ÚtorK   Údiv_ÚmeanÚmul_)"r   rg   rh   ri   rj   rs   rt   rk   rp   rq   r5   r9   r8   rr   r:   r7   r0   r2   r3   r4   r   Úparamr^   r\   r]   Ústep_trƒ   Úcapturable_supported_devicesrI   Úwd_scaleÚdenomÚnormed_gradÚclip_valÚmasks"                                     r   Ú_single_tensor_adoptr£   ú   s§  € ð. Ð )Ð"3Ð3Ð3ä‡y�y×ÑÔô ˜"œeÔ$Ð$Ð$ä˜fÓ%ó 5L‰ˆˆ5Ù'ˆu�QŠx¨e°A©h¨YˆØ˜1‘+ˆØ  ‘^ˆ
Ø˜Q‘ˆñ œmœoÝOÙ+LÓ+NÐ(Ø—<‘<×$Ñ$¨¯©×(:Ñ(:Ò:¸u¿|¹|×?PÑ?PÐTpÑ?pð |Ø[Ð\xÐ[yÐyzÐ{ó|Ðpð 	�!‰ˆä×Ñ˜EÔ"Ü×%Ñ% dÓ+ˆDØÐ"Ü×,Ñ,¨WÓ5�ØÐ%Ü"×/Ñ/°
Ó;�
Ü×&Ñ& uÓ-ˆEà˜1Ò¡YØ—8‘8˜E¨�8Ó6ˆDá#¡~‰v¼:ÀfÓ;MˆØ�1Š9Ø×Ñ  d§i¡i£kÔ2Ùà˜1Ò¡Ø+1Ð+=�r˜Q‘w Ò'À2ˆHØ�J‰J�u X I°Ñ$<ˆJÔ=ä—‘˜JŸO™OÓ-¨sÓ3ˆØ—h‘h˜u“oˆàÐØ˜q™ XÑ-ˆHØ×Ñ ˜y¨(Ô3à�‰�k 1 u¡9Ô-áà˜d‘N QÑ&×*Ñ*¨4¯:©:Ó6ˆDØ�I‰I�d—i‘i“k×(Ñ(¨TÐ(Ó2Ô3Ø ‘nˆGà�
‰
�7 2 #ˆ
Ô&à�‰˜Ó×'Ñ'¨¨d¯i©i«kÀÀUÁÐ'ÖKñk5Lr   c                ó²  ‡)— t        | «      dk(  ry t        |
t        «      r|st        d«      ‚|rBt	        «       s8ddlm}  |d¬«      Š)t        ˆ)fd„t        | |«      D «       «      sJ d‰)› d�«       ‚|€|�J ‚|rJ d	«       ‚t        j                  | ||||g«      }|j                  «       D �]  \  \  }}}}}}t        t        t           |«      }t        t        t           |«      }t        t        t           |«      }t        t        t           |«      }t        t        t           |«      } |rt        ||||«       |rt        j                   |«      }t	        «       s=| d   j"                  r.t        j$                  | t        j&                  d
d¬«      d
¬«       nt        j$                  | d«       |dk7  r5|s3|rt        j$                  |||¬«       nt        j(                  |||¬«      }| d   dk(  rt        j*                  |||«       �Œ_|dk7  r*|r(|�|
dz  |z  n|
}!t        j$                  |||! |z  ¬«       t        j,                  |«      }"t        j.                  |"|«       t        j0                  ||"«      }#|�8| d   dz
  |z  }$t        j.                  |#|$ «       t        j2                  |#|$«       t        j4                  ||#d|z
  «       |r¯t        j6                  ||«      }%t        |%|«      D �&�'cg c]#  \  }&}'|&dkD  j9                  |'j:                  «      ‘Œ% }%}&}'|%D �&cg c]  }&|&j=                  «       ‘Œ }(}&t        j.                  |(d«       t        j>                  |%|(«       t        j6                  ||%«      }t        j$                  |||
 ¬«       t        j@                  ||	«       t        j*                  |||d|	z
  ¬«       �Œ! y c c}'}&w c c}&w )Nr   r=   r‚   F)Úsupports_xlac              3   ó²   •K  — | ]N  \  }}|j                   j                  |j                   j                  k(  xr |j                   j                  ‰v –— ŒP y ­wr   )rL   r�   )Ú.0r   rI   r�   s      €r   ú	<genexpr>z&_multi_tensor_adopt.<locals>.<genexpr>v  sJ   øè ø€ ò 
á��4ð �H‰H�M‰M˜TŸ[™[×-Ñ-Ñ-Ò_°!·(±(·-±-ÐC_Ð2_Ó_ñ
ùs   ƒAAr„   r…   z#_foreach ops don't support autogradr?   Úcpu)rL   r†   r
   rˆ   ry   rŠ   )!rS   r+   r   ra   r'   rŒ   rƒ   ÚallÚzipr	   Ú"_group_tensors_by_device_and_dtypeÚvaluesr   r   r   r   Ú_foreach_negÚis_cpuÚ_foreach_add_rV   Ú_foreach_addÚ_foreach_addcmul_Ú_foreach_sqrtÚ_foreach_maximum_Ú_foreach_divÚ_foreach_minimum_Ú_foreach_lerp_Ú_foreach_mulr—   rK   r™   Ú_foreach_div_Ú_foreach_mul_)*r   rg   rh   ri   rj   rs   rt   rk   rp   rq   r5   r9   r8   rr   r:   r7   r0   r2   r3   r4   rƒ   Úgrouped_tensorsÚdevice_params_Údevice_grads_Údevice_exp_avgs_Údevice_exp_avg_sqs_Údevice_state_steps_Ú_Údevice_paramsÚdevice_gradsÚdevice_exp_avgsÚdevice_exp_avg_sqsÚdevice_state_stepsrž   Úexp_avg_sq_sqrtr    r¡   ÚmasksÚmÚgÚ
mask_scaler�   s*                                            @r   Ú_multi_tensor_adoptrÌ   Q  s´  ø€ ô. ˆ6ƒ{�aÒØä�"”fÔ¡jÜØSó
ð 	
ñ
 œ-œ/ÝKÙ'HØô(
Ð$ô ó 
ä˜v {Ó3ô
ô 
ð 	wð WÐWsÐVtÐtuÐvó	wð 
ð
 Ð )Ð"3Ð3Ð3áÐDÐDÓDÐä×BÑBØ	�˜ +¨{Ð;ó€Oð ×"Ñ"Ó$óDañ 		ñ 	ØØØØØØÜœT¤&™\¨>Ó:ˆÜœD¤™L¨-Ó8ˆÜœt¤F™|Ð-=Ó>ˆÜ!¤$¤v¡,Ð0CÓDÐÜ!¤$¤v¡,Ð0CÓDÐñ Ü˜-¨°ÐHZÔ[áÜ ×-Ñ-¨lÓ;ˆLô ŒÐ#5°aÑ#8×#?Ò#?Ü×ÑÐ 2´E·L±LÀÈUÔ4SÐ[^Ö_ä×ÑÐ 2°AÔ6à˜1Ò¡YáÜ×#Ñ# L°-À|ÖTä$×1Ñ1°,ÀÐUaÔb�à˜aÑ  AÒ%Ü×#Ñ#Ð$6¸ÀlÔSÙà˜1Ò¡Ø+1Ð+=�r˜Q‘w Ò'À2ˆHÜ×Ñ ¨}ÀXÀIÐP\ÑD\Õ]ä×-Ñ-Ð.@ÓAˆÜ×Ñ °Ô5ä×(Ñ(¨°ÓGˆàÐØ*¨1Ñ-°Ñ1°hÑ>ˆHÜ×#Ñ# K°(°Ô;Ü×#Ñ# K°Ô:ä×Ñ˜_¨k¸1¸u¹9ÔEáä×&Ñ& ¸ÓEˆEÜ58¸ÀÓ5M×N©T¨Q°�a˜!‘e—Z‘Z §¡Õ(ÐNˆEÑNØ,1Ö2 q˜!Ÿ&™&�(Ð2ˆJÐ2Ü×#Ñ# J°Ô5Ü×Ñ  zÔ2Ü#×0Ñ0°À%ÓHˆOä×Ñ˜M¨?À2À#ÕFä×ÑÐ.°Ô6Ü×ÑÐ 2°LÀ,ÐVWÐZ_ÑV_×`ñIDaùóv OùÚ2s   Ë5(OÌ$Or1   c       
         ó@  — |€d}t        «       st        d„ |D «       «      st        d«      ‚|r)t        j                  j                  «       rt        d«      ‚|r%t        j                  j                  «       st        }nt        } || ||||f|
||||||||||||||	dœŽ y)z?Functional API that performs ADOPT algorithm computation.

    NFc              3   óP   K  — | ]  }t        |t        j                  «      –— Œ  y ­wr   )r+   r   r   )r§   Úts     r   r¨   zadopt.<locals>.<genexpr>ì  s   è ø€ Ò&XÀq¤z°!´U·\±\×'BÑ&Xùs   ‚$&zPAPI has changed, `state_steps` argument must contain a list of singleton tensorsz6torch.jit.script not supported with foreach optimizers)rk   rp   rq   r5   r9   r8   rr   r:   r7   r0   r2   r3   r4   rs   rt   )r'   rª   ra   r   r)   r*   rÌ   r£   )r   rg   rh   ri   rj   r1   r3   r4   rs   rt   rk   rp   rq   r5   r9   r8   rr   r:   r7   r0   r2   Úfuncs                         r   r   r   Ê  s¹   € ð: €Øˆô Œ?¤3Ñ&XÈKÔ&XÔ#XÜØ^ó
ð 	
ñ ”5—9‘9×)Ñ)Ô+ÜÐSÓTÐTá”u—y‘y×-Ñ-Ô/Ü"‰ä#ˆáØØØØØðð  ØØØØ!ØØØØØØØØ%ØØô)r   r   )NFFNNF)r}   Útypingr   r   r   r   r   r   r   rŒ   r	   Ú_typesr   Ú__all__r   r!   r'   r.   r   r~   rU   r£   rÌ   r   r&   r   r   ú<module>rÔ      sÁ  ðñ÷" 6Õ 5ã Ý Ý +å à�GÐ
€ò0óòò>ô|ˆIô |ð~TLØ�V‘ðTLà�F‰|ðTLð �v‘,ðTLð ˜&‘\ð	TLð
 ˜&‘\ðTLð ˜VÑ$ðTLð ˜FÑ#ðTLð ðTLð ðTLð ðTLð �%˜�-Ñ ðTLð ðTLð ˜5‘/ðTLð ˜‘ðTLð  ð!TLð" ð#TLð$ ð%TLð& ð'TLð( ð)TLð* ó+TLðnuaØ�V‘ðuaà�F‰|ðuað �v‘,ðuað ˜&‘\ð	uað
 ˜&‘\ðuað ˜VÑ$ðuað ˜FÑ#ðuað ðuað ðuað ðuað �%˜�-Ñ ðuað ðuað ˜5‘/ðuað ˜‘ðuað  ð!uað" ð#uað$ ð%uað& ð'uað( ð)uað* ó+uaðB #'Ø Ø$Ø'+Ø&*Ø!ñDØ�V‘ðDà�F‰|ðDð �v‘,ðDð ˜&‘\ð	Dð
 ˜&‘\ðDð ˜$‘ðDð ðDð ðDð ˜VÑ$ðDð ˜FÑ#ðDð ðDð ðDð  ð!Dð" �%˜�-Ñ ð#Dð$ ð%Dð& ˜5‘/ð'Dð( ˜‘ð)Dð* ð+Dð, ð-Dð. ð/Dð0 ô1Dr   