Ë
    øÿæiþ�  ã                  óŒ  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZmZmZmZ ddlmZmZ ddlZddlZddlZddlmZ ddlmZm Z m!Z!m"Z" ddl#m$Z$ dd	l%m&Z& dd
l'm(Z(m)Z)m*Z* ddl+m,Z, erddl-Z-ddl.m/Z/ ddl0m1Z1m2Z2  G d„ de3«      Z4 ejj                  e6«      Z7dZ8ejr                  dDd„«       Z: ejv                  d¬«       G d„ d«      «       Z<ejv                   G d„ d«      «       Z=da>de?d<   da@de?d<   daAde?d<    eB«       aCde?d<    ejv                  d¬«       G d „ d!«      «       ZD ed"«      ZE G d#„ d$ejŒ                  «      ZGeGj�                  ZI G d%„ d&ejŒ                  «      ZJeJj�                  ZKejv                   G d'„ d(«      «       ZLdd)œ	 	 	 	 	 	 	 	 	 dEd*„ZMdd)œ	 	 	 	 	 	 	 	 	 dEd+„ZNdFd,„ZOdGd-„ZPdHd.„ZQdId/„ZRdJd0„ZSdKd1„ZTdLd2„ZUdMd3„ZVdNd4„ZWdOd5„ZXdPd6„ZYe)j´                   G d7„ d8e(«      «       Z[dQd9„Z\dRd:„Z]	 dS	 	 	 	 	 	 	 dTd;„Z^dRd<„Z_dUd=„Z`dVd>„ZadOd?„ZbdWd@„ZcdUdA„ZddXdYdB„ZedOdC„Zfy)Za  
Profile Guided Optimization (PGO) implementation for Dynamo.

This module provides functionality for caching and managing code state profiles
that guide optimization decisions in Dynamo. It implements both local and remote
caching mechanisms for storing profile information across runs, handles profile
merging across distributed ranks, and manages the lifecycle of profile data
during compilation. The profiles track dynamic vs static properties of tensors
and help Dynamo make better specialization decisions.
é    )ÚannotationsN)Údefaultdict)ÚOptionalÚTYPE_CHECKINGÚTypeVarÚUnion)ÚoverrideÚSelf)ÚCompileEventLoggerÚdynamo_timedÚset_feature_useÚ	warn_once)Ú	is_fbcode)Útrace_structured_artifact)ÚCacheArtifactÚCacheArtifactFactoryÚCacheArtifactManager)Ú
OrderedSet)ÚInstructionTranslator)Ú
JsonDataTyÚRemoteCachec                  ó   — e Zd Zy)ÚReservedWorkflowIdUserErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    úf/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/torch/_dynamo/pgo.pyr   r   7   s   „ Ør   r   é
   c                óô   — t         j                  j                  | «      s| S t        | d«      5 }|j	                  «       }t        j                  |«      }t        |dz  d«      }|cd d d «       S # 1 sw Y   y xY w)NÚrbl   ÿÿ Ú08x)ÚosÚpathÚexistsÚopenÚreadÚzlibÚcrc32Úformat)ÚfilepathÚfileÚcontentÚcrc32_valueÚhashs        r   Ú_hash_containing_filer1   r   s^   € ô �7‰7�>‰>˜(Ô#Øˆä	ˆh˜Ô	 Ø—)‘)“+ˆÜ—j‘j Ó)ˆÜ�k JÑ.°Ó6ˆØ÷	 
×	Ò	ús   ®6A.Á.A7T)Úfrozenc                  ó`   — e Zd ZU ded<   ded<   ded<   ded<   dd„Zdd„Zdd	„Zedd
„«       Zy)ÚCodeIdÚstrÚfilenameÚintÚfirstlinenoÚnameÚ	file_hashc                óÂ   — t        |t        «      sy| j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S ©NF)Ú
isinstancer4   r:   r8   r9   ©ÚselfÚothers     r   Ú__eq__zCodeId.__eq__�   sR   € Ü˜%¤Ô(Øà�N‰N˜eŸo™oÑ-ò (Ø× Ñ  E×$5Ñ$5Ñ5ò(à—	‘	˜UŸZ™ZÑ'ð	
r   c                óZ   — t        | j                  | j                  | j                  f«      S ©N)r0   r:   r9   r8   ©r?   s    r   Ú__hash__zCodeId.__hash__—   s"   € Ü�T—^‘^ T§Y¡Y°×0@Ñ0@ÐAÓBÐBr   c                ón   — d| j                   › d| j                  › d| j                  › d| j                  › �S )Nzhash(Ú)Ú:)r:   r6   r8   r9   rD   s    r   Ú__str__zCodeId.__str__š   s5   € Ø�t—~‘~Ð& a¨¯© °a¸×8HÑ8HÐ7IÈÈ4Ï9É9È+ÐVÐVr   c                ó€   — t        | j                  | j                  | j                  t	        | j                  «      «      S rC   )r4   Úco_filenameÚco_firstlinenoÚco_namer1   )Úcodes    r   ÚmakezCodeId.make�   s6   € äØ×ÑØ×ÑØ�L‰LÜ! $×"2Ñ"2Ó3ó	
ð 	
r   N)r@   ÚobjectÚreturnÚbool)rQ   r7   ©rQ   r5   )rN   útypes.CodeTyperQ   r4   )	r   r   r   Ú__annotations__rA   rE   rI   ÚstaticmethodrO   r   r   r   r4   r4      s>   … àƒMØÓØ
ƒIð ƒNó
óCóWð ò
ó ñ
r   r4   c                  ó@   — e Zd ZU  ej                  d„ ¬«      Zded<   y)Ú	CodeStatec                 ó    — t        t        «      S rC   )r   ÚFrameStateSizeEntryr   r   r   Ú<lambda>zCodeState.<lambda>ª   s
   € ¤Ô,?Ô @r   )Údefault_factoryz%defaultdict[str, FrameStateSizeEntry]Úautomatic_dynamicN)r   r   r   ÚdataclassesÚfieldr]   rU   r   r   r   rX   rX   §   s!   … à?P¸{×?PÑ?PÙ@ô@ÐÐ<ô r   rX   ú(Optional[defaultdict[CodeId, CodeState]]Ú_INIT_CODE_STATEÚ_CODE_STATEFrR   Ú_LOGGED_DYNAMIC_ALLOWLISTzset[str]Ú_KNOWN_DYNAMIC_SOURCESc                  ó   — e Zd ZU dZded<   y)ÚInferStrideaX  
    Denotes the quantity stride[dim] * size[dim], which is what the stride would
    be for the next physical dimension that results in a contiguous layout.

    For example, given size = [2, 3], stride = [3, 1], we can replace this with
    stride = [InferStride(1), 1], because InferStride(1) = stride[1] * size[1] = 1 * 3 = 3

    Indirecting the representation in this way is important for the join operation
    on strides as if we join [2, 3][3, 1] and [2, 4][4, 1],
    we don't want [2, None][None, 1] which would get eventually symbolized into
    [2, s0][s1, 1] (notice that the relationship between s0 and s1 is broken).
    If we instead rewrite the expressions as InferStride so we have [2, 3][InferStride(1), 1]
    and [2, 4][InferStride(1), 1] we now join to [2, None][InferStride(1), 1] will
    result in [2, s0][s0, 1], as desired.
    r7   ÚdimN)r   r   r   Ú__doc__rU   r   r   r   rf   rf   ´   s   … ñð  
„Hr   rf   Ú_Tc                  ó   — e Zd ZdZdZy)Ú	AutoUnsetz‹
    The identity element of our semilattice, a generic "don't know" element that
    is always subsumed when we get more information.
    r   N©r   r   r   rh   Útokenr   r   r   rk   rk   Ì   ó   „ ñð
 �Er   rk   c                  ó   — e Zd ZdZdZy)ÚAutoDynamicz‚
    The top element of our (bounded) semilattice, whenever you merge this with
    any other element you always get it again
    r   Nrl   r   r   r   rp   rp   Ø   rn   r   rp   c                  óJ  — e Zd ZU  ej                  e¬«      Zded<    ej                  e¬«      Zded<    ej                  e¬«      Z	ded<   dd„Z
dd	„Zdd
„Zdd„Zedd„«       Zedd„«       Ze	 	 	 	 	 	 dd„«       Zedd„«       Zedd„«       Ze	 	 	 	 	 	 dd„«       Zdd„Zy)rZ   )Údefaultz"Union[int, AutoDynamic, AutoUnset]ÚscalarzBUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic], ...]]ÚsizezOUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic, InferStride], ...]]Ústridec                óœ  ‡— dd„Šd	ˆfd„}| j                   t        u r4| j                  t        u r"| j                  t        u ryd| j                  › �S | j                  t        u r\t	        | j                   t
        «      rBt	        | j                  t
        «      r(d || j                   «      › d || j                  «      › �S dt        | «      › �S )
Nc                ó|   — | t         u ry| t        u ryt        | t        «      rd| j                  › d�S t        | «      S )NÚ?z
auto unsetzS(rG   )Úauto_dynamicÚ
auto_unsetr=   rf   rg   r5   )Úss    r   Úrender_singlez1FrameStateSizeEntry.render.<locals>.render_singleò   s<   € Ø”LÑ ØØ”j‘à#Ü˜Aœ{Ô+Ø˜AŸE™E˜7 !�}Ð$ä˜1“v�r   c                óD   •— ddj                  ˆfd„| D «       «      z   dz   S )NÚ[z, c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrC   r   )Ú.0r{   r|   s     €r   Ú	<genexpr>zCFrameStateSizeEntry.render.<locals>.render_tuple.<locals>.<genexpr>þ   s   øè ø€ Ð"@¹R¸¡=°×#3¹Rùs   ƒÚ])Újoin)Ússr|   s    €r   Úrender_tuplez0FrameStateSizeEntry.render.<locals>.render_tupleý   s"   ø€ Ø˜Ÿ™Ó"@¹RÓ"@Ó@Ñ@À3ÑFÐFr   zfully dynamic scalar or tensorzscalar ztensor size=z stride=zunusual )r{   z/Union[int, AutoDynamic, AutoUnset, InferStride]rQ   r5   )r„   z0tuple[Union[int, AutoDynamic, InferStride], ...]rQ   r5   )rt   ry   ru   rs   r=   ÚtupleÚrepr)r?   r…   r|   s     @r   ÚrenderzFrameStateSizeEntry.renderð   s«   ø€ ó		õ	Gð �9‰9œÑ$¨¯©¼Ñ)DØ�{‰{œlÑ*Ø7à  §¡ Ð.Ð.Ø�[‰[œLÑ(Ü˜$Ÿ)™)¤UÔ+´
¸4¿;¹;ÌÔ0NØ%¡l°4·9±9Ó&=Ð%>¸hÁ|ÐTX×T_ÑT_ÓG`ÐFaÐbÐbð œ$˜t›*˜Ð&Ð&r   c                ó   — t        | j                  t        j                  «      rJ | j                  «       ‚t        | j                  t
        «      r2| j                  D ]#  }t        |t        j                  «      sŒJ |«       ‚ t        | j                  t
        «      r3| j                  D ]#  }t        |t        j                  «      sŒJ |«       ‚ y y rC   )r=   rs   ÚtorchÚSymIntrt   r†   ru   )r?   r{   Ús1s      r   Ú__post_init__z!FrameStateSizeEntry.__post_init__  s’   € Ü˜dŸk™k¬5¯<©<Ô8ÐE¸$¿+¹+ÓEÐ8Ü�d—i‘i¤Ô'Ø—Y”Y�Ü% a¬¯©Õ6Ð9¸Ó9Ð6ð ä�d—k‘k¤5Ô)Ø—k”k�Ü% b¬%¯,©,Õ7Ð;¸Ó;Ð7ñ "ð *r   c                óx   — | j                   t        u ry| j                   t        u ry| j                   |   t        u S )NTF)rt   ry   rz   ©r?   rg   s     r   Úis_size_dynamicz#FrameStateSizeEntry.is_size_dynamic  s3   € Ø�9‰9œÑ$ØØ�9‰9œ
Ñ"ØØ�y‰y˜‰~¤Ð-Ð-r   c                óæ   — t        | j                  t        «      rt        d„ | j                  D «       «      sy| j                  t
        u ry| j                  t        u ry| j                  |   t
        u S )Nc              3  ó>   K  — | ]  }t        |«      t        u –— Œ y ­wrC   )Útyper7   )r€   r{   s     r   r�   z8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>.  s   è ø€ Ð0SÉÀA´°a³¼C´Éùs   ‚FT)r=   rt   r†   Úallru   ry   rz   r�   s     r   Úis_stride_dynamicz%FrameStateSizeEntry.is_stride_dynamic  sX   € ô" �t—y‘y¤%Ô(¬SÑ0SÈÏÊÓ0SÔ-SàØ�;‰;œ,Ñ&ØØ�;‰;œ*Ñ$ØØ�{‰{˜3Ñ¤<Ð/Ð/r   c                ó&   — t        d„ | D «       «      S )Nc              3  ó`   K  — | ]&  }t        |t        j                  «      rt        n|–— Œ( y ­wrC   )r=   rŠ   r‹   ry   )r€   Úxs     r   r�   z4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>9  s%   è ø€ ÐTÑQSÈA¤Z°´5·<±<Ô%@•\ÀaÓGÑQSùs   ‚,.)r†   )Úxss    r   Ú_munge_symintz!FrameStateSizeEntry._munge_symint7  s   € äÑTÑQSÓTÓTÐTr   c                ó.   — t        |t        t        ¬«      S ©N)rs   rt   ru   )rZ   ry   )Úclsr˜   s     r   Úmake_scalarzFrameStateSizeEntry.make_scalar;  s   € ä"¨!´,Ä|ÔTÐTr   c                ób   — t        t        | j                  |«      | j                  |«      ¬«      S rœ   )rZ   ry   rš   )r�   rt   ru   s      r   Úmake_tensorzFrameStateSizeEntry.make_tensor?  s0   € ô #ÜØ×"Ñ" 4Ó(Ø×$Ñ$ VÓ,ô
ð 	
r   c                óL   — t        t        | j                  |«      t        ¬«      S rœ   )rZ   rz   rš   )r�   rt   s     r   Ú	make_sizezFrameStateSizeEntry.make_sizeI  s#   € ä"ÜØ×"Ñ" 4Ó(Üô
ð 	
r   c                ód   — | t         u r|S |t         u r| S | t        u s|t        u s| |k7  rt        S | S rC   )rz   ry   )r˜   Úys     r   Ú_merge_atomzFrameStateSizeEntry._merge_atomQ  s:   € à”
‰?ØˆHØ”
‰?ØˆHØ”Ñ ¤\Ñ 1°Q¸!²VÜÐØˆr   c                óÎ   ‡ — |t         u r|S |t         u r|S |t        u s|t        u rt        S t        |«      t        |«      k7  rt        S t        ˆ fd„t	        ||«      D «       «      S )Nc              3  óH   •K  — | ]  \  }}‰j                  ||«      –— Œ y ­wrC   )r¥   )r€   r˜   r¤   r�   s      €r   r�   z6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>i  s!   øè ø€ ÐC±{©t¨q°!�S—_‘_ Q¨×*±{ùs   ƒ")rz   ry   Úlenr†   Úzip)r�   r™   Úyss   `  r   Ú_merge_atom_tupz#FrameStateSizeEntry._merge_atom_tup[  sa   ø€ ð ”ÑØˆIØ”ÑØˆIØ”Ñ ¤|Ñ!3ÜÐÜˆr‹7”c˜"“gÒÜÐÜÓC´s¸2¸r´{ÓCÓCÐCr   c                ó  — | j                  | j                  |j                  «      | _        | j                  | j                  |j                  «      | _        | j                  | j                  |j                  «      | _        | S rC   )r¥   rs   r«   rt   ru   r>   s     r   Ú__ior__zFrameStateSizeEntry.__ior__k  s[   € Ø×&Ñ& t§{¡{°E·L±LÓAˆŒØ×(Ñ(¨¯©°E·J±JÓ?ˆŒ	Ø×*Ñ*¨4¯;©;¸¿¹ÓEˆŒØˆr   NrS   ©rQ   ÚNone)rg   r7   rQ   rR   )r™   útuple[int, ...]rQ   z#tuple[Union[AutoDynamic, int], ...])r˜   r7   rQ   rZ   )rt   r°   ru   r°   rQ   rZ   )rt   r°   rQ   rZ   )r˜   ri   r¤   ri   rQ   zUnion[AutoDynamic, _T])r™   ú-Union[AutoDynamic, AutoUnset, tuple[_T, ...]]rª   r±   rQ   zAUnion[AutoDynamic, AutoUnset, tuple[Union[AutoDynamic, _T], ...]])r@   r
   rQ   r
   )r   r   r   r^   r_   rz   rs   rU   rt   ru   rˆ   r�   r�   r•   rV   rš   Úclassmethodrž   r    r¢   r¥   r«   r­   r   r   r   rZ   rZ   ä   s)  … à1B°×1BÑ1BÈ:Ô1V€FÐ.ÓVð 	ˆ×Ñ *Ô-ð 	Ð
Ló ð
 	ˆ×Ñ *Ô-ð ð ó .ó'ó:<ó.ó0ð4 òUó ðUð òUó ðUð ð
Ø"ð
Ø,;ð
à	ò
ó ð
ð ò
ó ð
ð òó ðð ðDà9ðDð :ðDð 
Kò	Dó ðDôr   rZ   ©Úis_unspecialized_nn_modulec          
     ó¬  ‡‡‡
— t         j                  | j                  «      }t        «       |   }t        j
                  j                  j                  �r³‰|j                  v }|j                  ‰   }t        j                  |«      Š
|‰z  }|rŸ‰
j                  |j                  k7  r†t        j                  d‰‰j                  ‰
j                  «       t        j                  d‰ddt        ‰
j                  «      t        ‰j                  «      dœ«       |rt        j!                  d‰«       	 d	 	 	 	 	 	 	 	 	 dˆˆˆ
fd„}|rà‰
j"                  |j"                  k7  rÇt%        ‰
j"                  t&        «      r£t%        ‰j"                  t&        «      r‰t)        ‰
j"                  «      t)        ‰j"                  «      k7  r |dd	d
«       n]t+        t)        ‰j"                  «      «      D ]1  }	‰
j"                  |	   ‰j"                  |	   k7  sŒ# |dd|	› d�d|	«       Œ3 n
 |ddd«       |râ‰
j,                  |j,                  k7  rÉt%        ‰
j,                  t&        «      r¥t%        ‰j,                  t&        «      r‹t)        ‰
j,                  «      t)        ‰j,                  «      k7  r |dd	d
«       |S t+        t)        ‰j,                  «      «      D ]1  }	‰
j,                  |	   ‰j,                  |	   k7  sŒ# |dd|	› d�d|	«       Œ3 |S  |ddd«       |S |j                  ‰   Š
t        j                  d‰‰
j                  ‰j                  «       ‰|j                  ‰<   ‰}|S )Nz%automatic dynamic int %s val %s != %sr]   rs   zscalar change©r9   Údim_changedÚreasonÚcachedÚnewz¼%s is converted to a symbolic integer. It is an attribute of a user defined nn module class. If you wish to keep it static, you can mark the nn module class as `torch._dynamo.mark_static`.c           
     ó  •— |€t        ‰| «      nt        ‰| «      |   }|€t        ‰| «      nt        ‰| «      |   }t        j                  d| ‰|||«       t        j                  d‰|€dn||t        |«      t        |«      dœ«       y )Nz#automatic dynamic %s %s %s %s != %sr]   r”   r¶   )ÚgetattrÚlogÚdebugr   Úinstantr5   )	Útup_nameÚshort_reasonÚlong_reasonÚiÚ	entry_tupÚold_entry_tupÚentryr9   Ú	old_entrys	         €€€r   Úlog_tupz)update_automatic_dynamic.<locals>.log_tupœ  s¤   ø€ ð -.¨I”˜˜xÔ(¼7À5È(Ó;SÐTUÑ;Vð ð
 �9ô ˜	 8Ô,ä˜Y¨Ó1°!Ñ4ð ô
 �I‰IØ5ØØØàØôô ×&Ñ&Ø#à Ø,-¨I¡5¸1Ø)Ü! -Ó0Ü˜y›>ñõ	r   rt   rg   zdimensionality changezsize(rG   zsize changer@   ru   zstride(zstride changez9automatic dynamic is off, overwriting int %s val %s -> %srC   )
rÀ   r5   rÁ   r5   rÂ   r5   rÃ   zOptional[int]rQ   r¯   )r4   rO   Úf_codeÚget_code_staterŠ   Ú_dynamoÚconfigÚautomatic_dynamic_shapesr]   Úcopyrs   r½   r¾   r   r¿   r5   Úinfort   r=   r†   r¨   Úrangeru   )Útxr9   rÆ   r´   Úcode_idÚframe_stateÚ	is_updateÚ	mut_entryrÈ   rÃ   rÇ   s    ``       @r   Úupdate_automatic_dynamicrÖ   r  sü  ú€ ô �k‰k˜"Ÿ)™)Ó$€GÜ Ó" 7Ñ+€KÜ‡}�}×Ñ×4Ó4Ø˜K×9Ñ9Ð9ˆ	Ø×1Ñ1°$Ñ7ˆ	Ü—I‘I˜iÓ(ˆ	Ø�UÑˆ	ñ ˜×)Ñ)¨Y×-=Ñ-=Ò=Ü�I‰IØ7ØØ—‘Ø× Ñ ô	ô ×&Ñ&Ø#à Ø#+Ø-Ü! )×"2Ñ"2Ó3Ü˜uŸ|™|Ó,ñô	ñ *Ü—‘ðOð ô	ð TXð	Øð	Ø),ð	Ø;>ð	ØCPð	à÷	ñ> ˜Ÿ™¨9¯>©>Ò9Ü˜)Ÿ.™.¬%Ô0´ZÀÇ
Á
ÌEÔ5RÜ�y—~‘~Ó&¬#¨e¯j©j«/Ò9Ù˜F EÐ+BÕCä"¤3 u§z¡z£?Ö3˜Ø$Ÿ>™>¨!Ñ,°·
±
¸1±Ó=Ù# F¨e°A°3°a¨L¸-ÈÕKñ 4ñ ˜ ¨Ô1á˜×)Ñ)¨Y×-=Ñ-=Ò=Ü˜)×*Ñ*¬EÔ2´zÀ%Ç,Á,ÔPUÔ7VÜ�y×'Ñ'Ó(¬C°·±Ó,=Ò=Ù˜H eÐ-DÔEð$ Ðô! #¤3 u§|¡|Ó#4Ö5˜Ø$×+Ñ+¨AÑ.°%·,±,¸q±/ÓAÙ# H°¸°s¸!¨n¸oÈqÕQð 6ð  Ðñ ˜ '¨7Ô3ð Ðð  ×1Ñ1°$Ñ7ˆ	Ü�	‰	ØGØØ×ÑØ�L‰Lô		
ð /4ˆ×%Ñ% dÑ+Øˆ	àÐr   c               ó  — | j                   x}€t        | |||¬«      S |j                  €||j                  j                  |<   |S d }|j                  D ]-  }||j                  v sŒt        | ||j                  |   |¬«      }Œ/ |€J ‚|S )Nr³   )Údistributed_staterÖ   Ú
all_statesÚlocal_stater]   )rÑ   r9   rÆ   r´   ÚstÚresÚ	sub_states          r   Úprocess_automatic_dynamicrÞ   Þ  sª   € ð ×"Ñ"Ð"ˆÐ+Ü'ØØØØ'Aô	
ð 	
ð 
�‰Ð	ð 27ˆ�‰×(Ñ(¨Ñ.Øˆð ˆØŸœˆIØ�y×2Ñ2Ò2Ü.ØØØ×/Ñ/°Ñ5Ø/Iô	‘ð 'ð ˆÐˆØˆ
r   c                óÚ   — d }t        j                  «       r(t        j                  «       rt        j                  «       }t        j
                  j                  j                  }| › d|› d|› �S )NrH   )ÚdistÚis_availableÚis_initializedÚget_rankrŠ   ÚcompilerrÌ   Úcache_key_tag)ÚkeyÚrankÚtags      r   Úformat_cache_keyré     sW   € ð €DÜ×ÑÔœt×2Ñ2Ô4Ü�}‰}‹ˆä
�.‰.×
Ñ
×
-Ñ
-€CØˆU�!�D�6˜˜3˜%Ð Ð r   c                 ój  — t         j                  j                  j                  rt	        d«       y t         j                  j                  j
                  x} �'| j                  d«      rt        d«      ‚t        | «      S t         j                  j                  «       x}�|\  }}t        d|› d|› �«      S y )NúGdynamo_pgo force disabled by torch.compiler.config.force_disable_cachesúmast:z•torch.compiler.config.job_id with prefix 'mast:' is reserved for automatically generated job id associated with a specific MAST job name and version.rH   )rŠ   rä   rÌ   Úforce_disable_cachesr   Újob_idÚ
startswithr   ré   Ú_utils_internalÚget_mast_job_name_version)ÚrÚname_versionÚmast_job_nameÚmast_job_versions       r   Úget_cache_keyrö     s¯   € ä‡~�~×Ñ×1Ò1ÜØUô	
ð ô �^‰^×"Ñ"×)Ñ)Ð)ˆÐ6Ø�<‰<˜Ô Ü-ð$óð ô
   Ó"Ð"ä×-Ñ-×GÑGÓIÐIˆÐVØ*6Ñ'ˆÐ'Ü %¨ °aÐ8HÐ7IÐ JÓKÐKàr   c                óx   — t         j                  j                  j                  rt	        d«       y t        | «      S )Nrë   )rŠ   rä   rÌ   rí   r   ré   )Ú
sticky_keys    r   Úget_extra_cache_keyrù   1  s0   € Ü‡~�~×Ñ×1Ò1ÜØUô	
ð ä˜JÓ'Ð'r   c                ó  — t         j                  j                  j                  st        j                  d«       y ddlm} t        j                  ddd| › d�«      }t        j                  j                   |«       d|«      S )	Nz'automatic_dynamic_local_pgo not enabledr   )Ú	cache_dirz[<>:"/\\|?*]Ú_Úcode_state_z.pklÚdynamo)rŠ   rË   rÌ   Úautomatic_dynamic_local_pgor½   r¾   Ú%torch._inductor.runtime.runtime_utilsrû   ÚreÚsubr$   r%   rƒ   )Ú	cache_keyrû   Úcode_state_keys      r   Úcode_state_pathr  <  s\   € Ü�=‰=×Ñ×;Ò;Ü�	‰	Ð;Ô<Øå?ä—V‘V˜O¨S°KÀ	¸{È$Ð2OÓP€NÜ�7‰7�<‰<™	› X¨~Ó>Ð>r   c                 ó`  — t         j                  j                  j                  ryt         j                  j                  j
                  x} �| S t        «       syt         j                  j                  «       ry	 ddl	m
} |t         j                  j                  d«      k\  S # t        $ r Y yw xY w)NFr   )ÚREMOTE_CACHE_VERSIONz'pytorch/remote_cache:dynamo_pgo_version)rŠ   rä   rÌ   rí   rË   Úautomatic_dynamic_remote_pgor   rð   Úis_fb_unit_testÚtorch._inductor.fb.remote_cacher  ÚModuleNotFoundErrorÚjustknobs_getval_int)rò   r  s     r   Ú"should_use_remote_dynamo_pgo_cacher  G  s–   € Ü‡~�~×Ñ×1Ò1Øä�]‰]×!Ñ!×>Ñ>Ð>ˆÐKØˆäŒ;Øä×Ñ×,Ñ,Ô.ØðÝHð  ¤5×#8Ñ#8×#MÑ#MØ1ó$ñ ð øô ò Ùðús   Á9B! Â!	B-Â,B-c                 óJ   — ddl m}  t        «       sy  | dt        «       dd«      S )Nr   ©Úcreate_cachez
dynamo-pgoÚFbRemoteDynamoPGOCacheÚRemoteDynamoPGOCache)Útorch._inductor.remote_cacher  r  r   r  s    r   Úget_remote_cacher  ^  s)   € Ý9ä-Ô/ØáØÜ‹Ø Øó	ð r   c                ó  — t        «       }| j                  j                  «       D ]]  \  }}d}t        |j                  t
        «      rt        |j                  v }n|j                  t        k(  rd}|sŒM|j                  |«       Œ_ |S )NFT)	r   r]   Úitemsr=   rt   r†   ry   rs   Úadd)Ú
code_stateÚdynamic_sourcesÚsrcÚfsÚdynamics        r   Ú_collect_dynamic_sourcesr  l  sq   € Ü'1£|€OØ×/Ñ/×5Ñ5Ö7‰ˆˆRØˆÜ�b—g‘gœuÔ%Ü" b§g¡gÐ-‰GØ�Y‰Yœ,Ò&ØˆGÚØ×Ñ Õ$ð 8ð Ðr   c                ó¤   — ddl m} t        «       }| D ]:  }|t        v rŒ ||«      rt        j	                  |«       Œ*|j	                  |«       Œ< |S )Nr   )Úis_dynamic_source)Útorch._dynamo.variables.builderr  r   rd   r  )Úall_sourcesr  Úmissing_sourcesr  s       r   Ú_collect_missing_sourcesr#  y  sS   € ÝAô (2£|€OÛˆØÔ(Ñ(ØÙ˜sÔ#Ü"×&Ñ& sÔ+ØØ×Ñ˜CÕ ð ð Ðr   c                ó2  — t         j                  | «      }t        «       |   }t        |«      }dj	                  |«      }dj	                  t        |«      «      }|r1t        dx}d¬«      5  t        j                  |||¬«       d d d «       y y # 1 sw Y   y xY w)NÚ,zpgo.dynamic_whitelistT©Úlog_pt2_compile_event)Úrecompile_dynamic_whitelistÚmissing_dynamic_whitelist)	r4   rO   rÊ   r  rƒ   r#  r   r   Úpt2_compile)rÉ   rÒ   rÓ   Úall_dynamic_sourcesÚframe_whitelistÚmissing_whitelistr9   s          r   Úlog_frame_dynamic_whitelistr.  ˆ  s�   € ä�k‰k˜&Ó!€GÜ Ó" 7Ñ+€KÜ2°;Ó?ÐØ—h‘hÐ2Ó3€OØŸ™Ô!9Ð:MÓ!NÓOÐÙÜÐ"9Ð9˜$ÐQUÖVÜ×*Ñ*ØØ,;Ø*;õ÷ WÐVð ßVÐVús   Á*BÂBc                 óZ   — t         s%t        j                  j                  ddd¬«       da y y )NÚdynamic_shapes_analysisz$Dynamic shape recompilation detectedz PGO detected a recompilation due to dynamic shapes.             Please follow the instruction from the action link to reduce             recompilation overhead.)ÚcategoryÚinsightÚinsight_descriptionT)rc   rŠ   rð   Úadd_mlhub_insightr   r   r   Ú_log_size_mismatch_recompiler5  ˜  s6   € å$Ü×Ñ×/Ñ/Ø.Ø:ð!%ð 	0ô 	
ð %)Ñ!ð %r   c                óø   — dj                  d„ | j                  «       D «       «      }t        «       }| j                  «       D ]  }|j	                  t        |«      «       Œ |r|ddj                  |«      › d�z  }|S )NÚ
c              3  óŽ   K  — | ]=  \  }}|› d �dj                  d„ |j                  j                  «       D «       «      z   –— Œ? y­w)z:
r7  c              3  óN   K  — | ]  \  }}d |› d|j                  «       › �–— Œ y­w)z  z: N)rˆ   )r€   r  r  s      r   r�   z.render_code_state.<locals>.<genexpr>.<genexpr>©  s,   è ø€ ð 
Ù5P©'¨#¨rˆb���R˜Ÿ	™	›�}Ô%Ñ5Pùs   ‚#%N)rƒ   r]   r  )r€   ÚkÚvs      r   r�   z$render_code_state.<locals>.<genexpr>§  sS   è ø€ ð ñ
 ‰DˆAˆqð	 ˆ#ˆSˆ	Ø
�)‰)ñ 
Ø56×5HÑ5H×5NÑ5NÔ5Pó
ó 
õ	
ñ ùs   ‚AAz°

PGO detected a recompilation due to dynamic shapes. To reduce shape recompilations by compiling dynamically to start, set environment variable TORCH_COMPILE_DYNAMIC_SOURCES="r%  Ú")rƒ   r  r   ÚvaluesÚupdater  )ÚcsÚcode_state_strr  Ústates       r   Úrender_code_staterB  ¦  s†   € Ø—Y‘Yñ ð
 —H‘H”Jóó €Nô (2£|€OØ—‘–ˆØ×ÑÔ7¸Ó>Õ?ð áØðGàGJÇxÁxÐP_ÓG`ÐFaÐabðdñ	
ˆð
 Ðr   c                  óL   — e Zd Zedd„«       Zeedd„«       «       Zedd„«       Zy)ÚPGOCacheArtifactc                ój   — t        | j                  | j                  «      | j                  «      }|€J ‚y rC   )Úwrite_local_implÚ!_rewrite_cache_key_for_mega_cacheræ   r.   )r?   Úmetas     r   Úpopulate_cachezPGOCacheArtifact.populate_cache¼  s2   € äØ×2Ñ2°4·8±8Ó<¸d¿l¹ló
ˆð ÐÐÑr   c                  ó   — y)NÚpgor   r   r   r   r“   zPGOCacheArtifact.typeÃ  s   € ð r   c                óH   — | j                  d«      s| S t        «       x}�|S | S )zø
        The PGO cache artifact key for a MAST job contains the job name and the version.
        When we want to use the cache artifact on a different MAST job, we need to
        update the key to use the new MAST job's name and version.
        rì   )rï   rö   )Úoriginal_keyÚnew_keys     r   rG  z2PGOCacheArtifact._rewrite_cache_key_for_mega_cacheÈ  s0   € ð ×&Ñ& wÔ/àÐÜ$“Ð&ˆGÐ3ØˆNØÐr   Nr®   rS   )rM  r5   rQ   r5   )r   r   r   r	   rI  rV   r“   rG  r   r   r   rD  rD  º  sD   „ àò ó ð ð Øòó ó ðð òó ñr   rD  c                óò   — t        t        t        «      sJ ‚t        j	                  d| |t        t        «      «       t        d|› d�dd„ «       t        dd«       t        j                  t        «      a
t        S )Nz$get_code_state %s hit %s, %d entriesÚget_Ú_code_stateÚstringc                 ó    — t        t        «      S rC   ©rB  rb   r   r   r   r[   zhit.<locals>.<lambda>Þ  s
   € Ô!¤+Ô.r   rK  T)r=   rb   r   r½   rÏ   r¨   r   r   rÎ   Údeepcopyra   )ræ   Útys     r   ÚhitrW  ×  se   € ä”k¤;Ô/Ð/Ð/Ü‡H�HÐ3°S¸"¼cÄ+Ó>NÔOÜØ
ˆrˆd�+ÐØÙ.ôô
 �E˜4Ô Ü—}‘}¤[Ó1ÐÜÐr   c                óŒ  — t        | «      }|�åt        j                  j                  |«      rÆt	        dx}d¬«      5  t        j                  || ¬«       t        |d«      5 }	 |j                  «       }t        j                  |«      at        j                  ||j                  «       ¬«       t        j                  t        j!                  «       | |«       t#        |d«      cd d d «       cd d d «       S y # t$        $ r t&        j)                  d|d¬	«       Y nw xY w	 d d d «       n# 1 sw Y   nxY wd d d «       y # 1 sw Y   y xY w)
Nzpgo.get_local_code_stateTr&  ©r  r"   ©Úcache_size_bytesÚlocalz&get_code_state failed while reading %s©Úexc_info)r  r$   r%   r&   r   r   r*  r'   r(   ÚpickleÚloadsrb   Útellr   Úrecord_artifactrD  r“   rW  Ú	Exceptionr½   Úwarning)r  r%   r9   Úfr.   s        r   Úget_local_code_staterf  å  s  € ä˜9Ó%€DØÐœBŸG™GŸN™N¨4Ô0ÜØ.Ð.ˆDÀdö
ô ×*Ñ*¨4¸9ÕEô �d˜DÔ! Qð.ØŸf™f›h�GÜ"(§,¡,¨wÓ"7�KÜ&×2Ñ2°4È!Ï&É&Ë(ÕSô )×8Ñ8Ü(×-Ñ-Ó/°¸Gôô ˜t WÓ-÷ "Ð!÷
ñ 
ð( øô !ò Ü—K‘KØ@À$ÐQUð  ö ðúð÷ "×!Ñ!ú÷
ð( ÷)
ð( úsN   ¼$D:Á D%Á"A
C4Â,4D%Ã 	D:Ã4!DÄD%ÄDÄD%Ä	D:Ä%D.	Ä*D:Ä:Ec                ó@  — d }	 | j                  |«      }|�¡	 t        |t        «      sJ ‚|d   }t        |t        «      sJ ‚t	        j
                  |«      }|� t        j                  |t        |«      ¬«       t        j                  |«      }t        j                  t        j                  «       ||«       |S t         j%                  d|«       |S # t        $ r t         j#                  d|d¬«       Y |S w xY w# t        $ r t         j#                  d|d¬«       Y |S w xY w)NÚdatarZ  z1get_code_state failed parsing remote result on %sTr]  z get_code_state remote miss on %sz'get_code_state failed remote read on %s)Úgetr=   Údictr5   Úbase64Ú	b64decoder   r*  r¨   r_  r`  r   rb  rD  r“   rc  r½   rd  rÏ   )Úremote_cacher  Ú
event_namer  Ú
cache_datarh  Úpayloads          r   Úlookup_remote_cache_entryrq     s3  € ð
 €JðDØ!×%Ñ% iÓ0ˆ
ð Ð!ðÜ! *¬dÔ3Ð3Ð3Ø! &Ñ)�Ü! $¬Ô,Ð,Ð,Ü ×*Ñ*¨4Ó0�ØÐ)Ü&×2Ñ2Ø"´S¸³\õô $Ÿ\™\¨'Ó2�
ô %×4Ñ4Ü$×)Ñ)Ó+¨Y¸ôð
 Ðô �H‰HÐ7¸ÔCØÐøô ò Ü—‘ØGØØ!ð õ ð Ððûô ò YÜ�‰Ð=¸yÐSWˆÕXð2 Ðð5Yús#   „C8 ˜A5C Ã!C5Ã4C5Ã8!DÄDc                óä   — t        «       }|�Xt        dx}dd¬«      5  t        j                  || ¬«       t	        || |«      }|�|at        | d«      cd d d «       S 	 d d d «       y y # 1 sw Y   y xY w)Nzpgo.get_remote_code_stateTÚ!pgo_get_remote_code_state_time_us©r'  Údynamo_compile_column_usrY  Úremote)r  r   r   r*  rq  rb   rW  ©r  rm  r9   r  s       r   Úget_remote_code_staterx  %  s   € ä#Ó%€LØÐÜØ/Ð/ˆDØ"&Ø%Hö
ô
 ×*Ñ*¨4¸9ÕEÜ2°<ÀÈDÓQˆJØÐ%Ø(�Ü˜9 hÓ/÷
ñ 
ð &÷
ñ ÷
ð ús   �4A&Á&A/c                ó@  ‡— t         €J ‚t        «       }|�}t        dx}dd¬«      5  t        j                  || ¬«       t        || «      Št        j                  d| ‰�t        ‰«      nd«       ‰�t         rJ ‚‰a t        d	d
ˆfd„«       ddd«       yy# 1 sw Y   yxY w)zo
    Reads an additional PGO profile from the given cache key, and merges it with the default PGO profile.
    Nzpgo.get_extra_remote_code_stateTrs  rt  rY  z'get_extra_code_state %s hit, %d entriesr   Úget_extra_remote_code_staterR  c                 ó   •— t        ‰ «      S rC   )rB  )r  s   €r   r[   z-get_extra_remote_code_state.<locals>.<lambda>R  s   ø€ Ô-¨jÔ9r   )
rb   r  r   r   r*  rq  r½   rÏ   r¨   r   rw  s      @r   rz  rz  6  s³   ø€ ô
 Ð"Ð"Ð"ä#Ó%€LØÐÜØ5Ð5ˆDØ"&Ø%Hö
ô
 ×*Ñ*¨4¸9ÕEÜ2°<ÀÓKˆJÜ�H‰HØ9ØØ#-Ð#9”�J”¸qôð
 Ð%Ý&Ð&�Ø(�ä)Ø1ØÛ9ô÷!
ð 
ð  ÷
ð 
ús   ¦A$BÂBc                 óZ  — t         �t         S t        t        «      a t        «       } | €t         S t	        | «      }|€t        | «       t         s>t        j                  j                  j                  x}�t        |«      }|�t        |«       t        j                  d«       t         €J ‚t         S )Nzget_code_state using default)rb   r   rX   rö   rf  rx  rŠ   rä   rÌ   Úpgo_extra_read_keyrù   rz  r½   rÏ   )r  Úlocal_code_stateÚsticky_readÚextra_read_keys       r   rÊ   rÊ   V  s¡   € äÐÜÐô œiÓ(€Kä“€IØÐÜÐô ,¨IÓ6Ðð ÐÜ˜iÔ(õ Ü!ŸN™N×1Ñ1×DÑDÐDˆ[ÐQä,¨[Ó9ˆØÐ%Ü'¨Ô7ä‡H�HÐ+Ô,äÐ"Ð"Ð"ÜÐr   c                 ór  — t         €t        j                  d«       y t         t        k(  rt        j                  d«       y t	        «       } | €t        j                  d«       y t        | «       t        | «       t        j                  j                  j                  x}�t        |«      }|�t        |«       y y y )Nz1put_code_state: never initialized, will not writez#put_code_state: no change, skippingz&put_code_state: no cache key, skipping)rb   r½   rÏ   ra   rö   Úput_local_code_stateÚput_remote_code_staterŠ   rä   rÌ   Úpgo_extra_write_keyrù   )r  Ústicky_writeÚextra_write_keys      r   Úput_code_stater‡  x  sœ   € ÜÐÜ�‰ÐDÔEØäÔ&Ò&Ü�‰Ð6Ô7Øä“€IØÐÜ�‰Ð9Ô:Øä˜Ô#Ü˜)Ô$ÜŸ™×-Ñ-×AÑAÐAˆÐNÜ-¨lÓ;ˆØÐ&Ü! /Õ2ð 'ð Or   c                óª  — t        | «      }|€y |dz   }|dz   }ddlm} t        j                  t        j
                  j                  |«      d¬«        ||t        ¬«      5  t        |d«      5 }|j                  |«       |j                  «       }d d d «       t        j                  ||«       d d d «       |fS # 1 sw Y   Œ+xY w# 1 sw Y   |fS xY w)	Nz.tmpz.lockr   )ÚFileLockT)Úexist_ok)ÚtimeoutÚwb)r  Útorch.utils._filelockr‰  r$   Úmakedirsr%   ÚdirnameÚLOCK_TIMEOUTr'   Úwritera  Úreplace)r  Úpickled_coder%   Útmp_pathÚ	lock_pathr‰  re  rt   s           r   rF  rF  Ž  s¶   € Ü˜9Ó%€Dà€|Øð
 �f‰}€HØ�w‘€Iõ /ä‡K�K”—‘—‘ Ó%°Õ5á	�)¤\Ö	2Ü�(˜DÔ! QØ�G‰G�LÔ!Ø—6‘6“8ˆD÷ "ô 	�
‰
�8˜TÔ"÷	 
3ð
 �ˆ:Ð÷	 "Ð!ú÷ 
3ð
 �ˆ:Ðús$   Á!CÁ."B:ÂCÂ:C	Â?CÃCc                ó  — t        dx}d¬«      5  t        j                  || ¬«       t        €J ‚t	        j
                  t        «      }t        j                  t        j                  «       | |«       t        | |«      }|€t        j                  d«       	 d d d «       y |\  }}t        j                  ||¬«       t        j                  d|t        t        «      «       t        dd	d
„ «       d d d «       y # 1 sw Y   y xY w)Nzpgo.put_local_code_stateTr&  rY  z$put_code_state: local cache disabledrZ  z*put_code_state: wrote local %s, %d entriesr‚  rR  c                 ó    — t        t        «      S rC   rT  r   r   r   r[   z&put_local_code_state.<locals>.<lambda>½  ó
   € Ô%¤kÔ2r   )r   r   r*  rb   r_  Údumpsr   rb  rD  r“   rF  r½   rÏ   r¨   r   )r  r9   r“  rH  r%   rt   s         r   r‚  r‚  §  sÖ   € Ü	Ð8Ð8�dÐPTÖ	UÜ×&Ñ& t°yÕAÜÐ&Ð&Ð&ä—|‘|¤KÓ0ˆä×,Ñ,Ü×!Ñ!Ó# Y°ô	
ô   	¨<Ó8ˆØˆ<Ü�H‰HÐ;Ô<Ø÷ 
VÐ	Uð ‰
ˆˆdä×&Ñ& t¸dÕCÜ�‰Ð=¸tÄSÌÓEUÔVÜ!Ø"ØÙ2ô	
÷% 
V×	UÑ	Uús   �BC6ÂAC6Ã6C?c           	     ó>  — |sdnd}t        d|› �x}dd¬«      5  t        j                  || ¬«       t        €J ‚t	        «       }|€ t
        j                  d|«       	 d d d «       y t        j                  t        «      }t        j                  |t        |«      ¬	«       d
t        j                  |«      j                  d«      i}|j                  | |«       t
        j                  d|| t        t        «      «       t        |dd„ «       d d d «       y # 1 sw Y   y xY w)Nrƒ  Úput_extra_remote_code_statezpgo.TÚ!pgo_put_remote_code_state_time_usrt  rY  z%s: remote cache disabledrZ  rh  Úasciiz%s: wrote remote %s, %d entriesrR  c                 ó    — t        t        «      S rC   rT  r   r   r   r[   z'put_remote_code_state.<locals>.<lambda>â  r˜  r   )r   r   r*  rb   r  r½   rÏ   r_  r™  r¨   rk  Ú	b64encodeÚdecodeÚputr   )r  Úextra_code_statern  r9   rm  r.   ro  s          r   rƒ  rƒ  Á  s  € ñ  ñ 	 à*ð ô
 
Ø�z�lÐ#Ð#ˆØ"Ø!Dö
ô
 	×&Ñ& t°yÕAÜÐ&Ð&Ð&ä'Ó)ˆàÐÜ�H‰HÐ0°*Ô=Ø÷
ð 
ô —,‘,œ{Ó+ˆÜ×&Ñ& t¼cÀ'»lÕKà”F×$Ñ$ WÓ-×4Ñ4°WÓ=ð"
ˆ
ð 	×Ñ˜ JÔ/Ü�‰Ø-¨z¸9ÄcÌ+ÓFVô	
ô 	"ØØÙ2ô	
÷1
÷ 
ñ 
ús   šADÁ&B$DÄDc                 ó   — d a d aday r<   )rb   ra   rc   r   r   r   Úreset_code_stater¤  ç  s   € à€KØÐØ %Ñr   )r,   r5   rQ   r5   )
rÑ   r   r9   r5   rÆ   rZ   r´   rR   rQ   rZ   )ræ   r5   rQ   r5   )rQ   úOptional[str])rø   r5   rQ   r¥  )r  r5   rQ   r¥  )rQ   rR   )rQ   z!Optional[RemoteCache[JsonDataTy]])r  rX   rQ   úOrderedSet[str])r!  r¦  rQ   r¦  )rÉ   rT   rQ   r¯   r®   )r?  údefaultdict[CodeId, CodeState]rQ   r5   )ræ   r5   rV  r5   rQ   r§  )r  r5   rQ   r`   rC   )rm  zRemoteCache[JsonDataTy]r  r5   rn  r¥  rQ   r`   )r  r5   rQ   r¯   )rQ   r§  )r  r5   r“  ÚbytesrQ   zOptional[tuple[str, int]])F)r  r5   r¢  rR   rQ   r¯   )grh   Ú
__future__r   rk  rÎ   r^   ÚenumÚ	functoolsÚloggingr$   r_  r  r)   Úcollectionsr   Útypingr   r   r   r   Útyping_extensionsr	   r
   Útorch._dynamo.configrŠ   Útorch._utils_internalÚtorch.compiler.configÚtorch.distributedÚdistributedrà   Útorch._dynamo.utilsr   r   r   r   Útorch._environmentr   Útorch._logging._internalr   Útorch.compiler._cacher   r   r   Útorch.utils._ordered_setr   ÚtypesÚtorch._dynamo.symbolic_convertr   r  r   r   Ú
ValueErrorr   Ú	getLoggerr   r½   r�  Úcacher1   Ú	dataclassr4   rX   ra   rU   rb   rc   Úsetrd   rf   ri   ÚEnumrk   rm   rz   rp   ry   rZ   rÖ   rÞ   ré   rö   rù   r  r  r  r  r#  r.  r5  rB  ÚregisterrD  rW  rf  rq  rx  rz  rÊ   r‡  rF  r‚  rƒ  r¤  r   r   r   Ú<module>rÃ     sê  ðò	õ #ã Û Û Û Û Û Û 	Û Û 	Û Ý #ß :Ó :ß ,ã Û Û Ý  ÷ó õ )Ý >÷ñ õ
 0ñ ÛåDßDô	 *ô 	ð €g×Ñ˜Ó!€à€ðj ‡�ò	ó ð	ð €×Ñ˜dÔ#÷$
ð $
ó $ð$
ðN ×Ñ÷ð ó ðð >BÐ Ð:Ó AØ8<€Ð5Ó <Ø"'Ð ˜4Ó 'Ù#&£5Ð ˜Ó (ð €×Ñ˜dÔ#÷ð ó $ðñ( ˆTƒ]€ô�—	‘	ô ð �_‰_€
ô�$—)‘)ô ð × Ñ €ð ×Ñ÷Jð Jó ðJðd (-ñiØðià
ðið ðið
 !%ðið óiðb (-ñ+Øð+à
ð+ð ð+ð
 !%ð+ð ó+ó\!óó4(ó?óó.ó
óóó )óð( ×Ñô�}ó ó ðó8óð< !%ð"Ø)ð"àð"ð ð"ð .ó	"óJó"ó@óD3ó,ó2
ô4"
ôL&r   