+
    "Ý³jƒA  ã                   ób  € ^ RI t ^ RIHtHt ^ RIHt ^ RIHtHt ^ RI	t	^ RI
Ht ^ RIHt ^ RIHtHtHtHt ^ RIHt ]! ]4      tR	 R
 ltR R lt ! R R]]	P0                  P2                  4      tR R ltRR R lltRR R lltRR R llt] ! R R4      4       t ! R R4      t ] ! 4       t!R# )é    N)ÚABCÚabstractmethod)Ú	dataclass)ÚDictÚType)ÚLogBar)Útqdm)Úcompile_module_name_filterÚis_within_max_layersÚ*is_transformers_version_greater_or_equal_5Úmatches_module_name_filter)ÚDEBUG_ONc                óP   € V ^8„  d   QhR\         P                  P                  RR/# ©é   ÚmodelÚreturnN©ÚtorchÚnnÚModule)Úformats   "Úa/home/luca/screen-checking/.venv/lib/python3.14/site-packages/defuser/modeling/replace_modules.pyÚ__annotate__r      s"   € ÷ $ñ $œUŸX™XŸ_™_ð $°ñ $ó    c                óä  € R R lpV P                  V4       RpV P                  4        F=  w  r4VP                  P                  R8X  g   K"  \        P                  RV R24       RpK?  	  V P                  4        F=  w  r5VP                  P                  R8X  g   K"  \        P                  RV R24       RpK?  	  V'       g"   \        '       d   \        P                  R	4       \        V 4       R
# )zCMaterialize any deferred replacement weights attached to ``model``.c                óP   € V ^8„  d   QhR\         P                  P                  RR/# ©r   Úmoduler   Nr   )r   s   "r   r   Ú'materialize_model.<locals>.__annotate__!   s"   € ÷ )ñ )¤E§H¡H§O¡Oð )¸ñ )r   c                 óV   € \        V \        4      '       d   V P                  4        R # R # ©N)Ú
isinstanceÚReplacementModuleBaseÚmaterialize_weights©r   s   &r   Ú_materialize_moduleÚ.materialize_model.<locals>._materialize_module!   s!   € Ü�fÔ3×4Ò4Ø×&Ñ&Ö(ñ 5r   FÚmetaz
Parameter z/ is still on meta device after materialization.TzBuffer zCAll parameters and buffers have been materialized from meta device.N)
ÚapplyÚnamed_parametersÚdeviceÚtypeÚloggerÚwarnÚnamed_buffersr   ÚdebugÚrelease_original_module_)r   r'   Ú
found_metaÚnameÚparamÚbuffers   &     r   Úmaterialize_modelr7      sÁ   € õ)ð
 
‡K�KÐ#Ô$ð €JØ×-Ñ-Ö/‰ˆØ�<‰<×Ñ Ö&Ü�K‰K˜* T FÐ*YÐZÔ[ØŠJñ 0ð
 ×+Ñ+Ö-‰ˆØ�=‰=×Ñ Ö'Ü�K‰K˜' $ Ð'VÐWÔXØŠJñ .÷
 ß‹8”V—\‘\Ð"gÔhÜ˜UÖ#r   c                óP   € V ^8„  d   QhR\         P                  P                  RR/# r   r   )r   s   "r   r   r   9   s"   € ÷ &ñ &¤E§H¡H§O¡Oð &¸ñ &r   c                ó4   € R R lpV P                  V4       R# )zHDrop references to original fused modules after replacement is complete.c                óP   € V ^8„  d   QhR\         P                  P                  RR/# r   r   )r   s   "r   r   Ú.release_original_module_.<locals>.__annotate__<   s"   € ÷ -ñ -¤U§X¡X§_¡_ð -¸ñ -r   c                 óV   € \        V \        4      '       d   V P                  4        R # R # r"   )r#   r$   Úrelease_original_moduler&   s   &r   Ú_clear_source_moduleÚ6release_original_module_.<locals>._clear_source_module<   s!   € Ü�fÔ3×4Ò4Ø×*Ñ*Ö,ñ 5r   N)r*   )r   r>   s   & r   r2   r2   9   s   € õ-ð 
‡K�KÐ$Ö%r   c                   óh  a a€ ] tR t^Ct oRt/ tV 3R ltV3R lV 3R llt]V3R lR l4       t	]V3R lR l4       t
]V3R	 lR
 l4       t]V3R lR l4       t]]V3R lR l4       4       t]]V3R lR l4       4       tR tV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R ltRtVtV ;t# )r$   ad  
Abstract base class for module replacement during calibration phase.

Replacement modules replace original modules to ensure all components
receive data for proper quantization statistics.

Subclasses must:
1. Implement `original_module_class()` to return the target module class name
2. Implement `__init__()` with signature:
   (self, original, config)
c           	     óP  <€ \         SV `  ! R
/ VB  \        V RR4      '       Eg   V P                  4       f   \	        V P
                   R24      hV P                  4       V P                  9   dY   V P                  V P                  4       ,          p\        RV P                  4        RVP
                   RV P
                   R24      hW P                  V P                  4       &   \        '       d6   \        P                  RV P
                   R	V P                  4        24       R# R# R# )z>Automatically register subclasses in the replacement registry.Ú__abstractmethods__Nzi must implement 'original_module_class()' class method to return the name of the module class it replaceszModule 'z' already registered to z. Cannot register Ú.zRegistered z for replacing © )ÚsuperÚ__init_subclass__ÚgetattrÚoriginal_module_classÚ	TypeErrorÚ__name__Ú_replacement_registryÚ
ValueErrorr   r.   r1   )ÚclsÚkwargsÚexistingÚ	__class__s   &, €r   rF   Ú'ReplacementModuleBase.__init_subclass__S   s  ø€ ä‰Ò!Ñ+ FÒ+ô �sÐ1°4×8Ó8Ø×(Ñ(Ó*Ò2ÜØ—|‘|�nð %Ið Ióð ð
 ×(Ñ(Ó*¨c×.GÑ.GÔGØ×4Ñ4°S×5NÑ5NÓ5PÕQ�Ü Ø˜s×8Ñ8Ó:Ð;Ð;SØ×(Ñ(Ð)Ð);¸C¿L¹L¸>ÈðLóð ð
 FI×%Ñ% c×&?Ñ&?Ó&AÑBß‹xœŸ™¨°C·L±L°>ÀÐQT×QjÑQjÓQlÐPmÐ&nÖo‰xñ 9r   c                óH   <€ V ^8„  d   QhRS[ P                  P                  /# )r   Úoriginalr   )r   Ú__classdict__s   "€r   r   Ú"ReplacementModuleBase.__annotate__i   s   ø€ ÷ 	#ñ 	#¡§¡§¡ñ 	#r   c                óÜ   <€ \         SV `  4        Wn        \        \	        V 4      4      V n        \        P                  V P
                  VP                  P                  V R 7       RV n
        R# ))r4   Úoriginal_classÚreplacementFN)rE   Ú__init__Ú_original_moduleÚstrÚidÚ_tracker_nameÚ_global_trackerÚregister_replacementrP   rJ   Ú_materialized)ÚselfrS   rP   s   &&€r   rY   ÚReplacementModuleBase.__init__i   s\   ø€ Ü‰ÑÔØ (ÔÜ ¤ D£›]ˆÔÜ×,Ñ,Ø×#Ñ#Ø#×-Ñ-×6Ñ6Øð 	-ô 	
ð
 #ˆÖr   c                ó4   <€ V ^8„  d   QhRS[ RS[R,          /# )r   Úmodule_class_namer   r$   )r[   r   )r   rT   s   "€r   r   rU   u   s%   ø€ ÷ @ñ @±cð @¹dÐCZÕ>[ñ @r   c                ó8   € V P                   P                  V4      # )z4Get replacement class for a given module class name.)rK   Úget©rM   rd   s   &&r   Úget_replacement_classÚ+ReplacementModuleBase.get_replacement_classt   s   € ð ×(Ñ(×,Ñ,Ð->Ó?Ð?r   c                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   rd   r   )r[   Úbool)r   rT   s   "€r   r   rU   z   s   ø€ ÷ >ñ >©cð >±dñ >r   c                ó   € WP                   9   # )z9Check if a module class has a replacement implementation.)rK   rg   s   &&r   Úis_registeredÚ#ReplacementModuleBase.is_registeredy   s   € ð !×$=Ñ$=Ñ=Ð=r   c                óN   <€ V ^8„  d   QhRS[ P                  P                  RS[/# )r   rS   r   )r   r   r   rk   )r   rT   s   "€r   r   rU      s'   ø€ ÷ >ñ >á—h‘h—o‘oð>ñ 
ñ>r   c                óL   € V P                  VP                  P                  4      # )zuDetermine if the given module should be replaced.

Users can extend this method to add custom logic for replacement.
)rm   rP   rJ   )rM   rS   s   &&r   Úis_to_be_replacedÚ'ReplacementModuleBase.is_to_be_replaced~   s!   € ð × Ñ  ×!3Ñ!3×!<Ñ!<Ó=Ð=r   c                ó    <€ V ^8„  d   QhRS[ /# ©r   r   )Úlist)r   rT   s   "€r   r   rU   Š   s   ø€ ÷ 6ñ 6¡tñ 6r   c                óH   € \        V P                  P                  4       4      # )z.Get list of all registered module class names.)ru   rK   Úkeys©rM   s   &r   Úget_registered_modulesÚ,ReplacementModuleBase.get_registered_modules‰   s   € ô �C×-Ñ-×2Ñ2Ó4Ó5Ð5r   c                ó    <€ V ^8„  d   QhRS[ /# rt   ©r[   )r   rT   s   "€r   r   rU   �   s   ø€ ÷ ñ ¡cñ r   c                ó   € R# )z2Return the class name of the module this replaces.NrD   rx   s   &r   rH   Ú+ReplacementModuleBase.original_module_classŽ   s   € ñ 	r   c                óL   <€ V ^8„  d   QhRS[ P                  P                  RR/# )r   rS   r   r$   r   )r   rT   s   "€r   r   rU   –   s'   ø€ ÷ ñ á—h‘h—o‘oðð 
!ñ	r   c                ó   € R# )z/Create replacement module from original module.NrD   )rM   rS   Úconfigs   &&&r   Úfrom_originalÚ#ReplacementModuleBase.from_original”   s   € ñ 	r   c                ón   € V P                   '       g#   V P                  4        V P                  4        R# R# )zMaterialize weights if needed.N)r`   Ú_materialize_weightsÚpost_process_materialization©ra   s   &r   r%   Ú)ReplacementModuleBase.materialize_weightsž   s+   € à×!×!Ð!Ø×%Ñ%Ô'Ø×-Ñ-Ö/ñ "r   c                ó   <€ V ^8„  d   QhRR/# ©r   r   NrD   )r   rT   s   "€r   r   rU   ¤   s   ø€ ÷ ñ  dñ r   c                ó   € R# )z�Materialize weights from the original module.

Subclasses should override this method to implement
weight materialization logic.
NrD   r‡   s   &r   r…   Ú*ReplacementModuleBase._materialize_weights¤   s   € ñ 	r   c                ó   <€ V ^8„  d   QhRR/# rŠ   rD   )r   rT   s   "€r   r   rU   ¬   s   ø€ ÷ /ñ /¨ñ /r   c                ó>   € RV n         \        P                  V 4       R# )z8Release reference to the original module to free memory.N)rZ   r^   Úrelease_originalr‡   s   &r   r=   Ú-ReplacementModuleBase.release_original_module¬   s   € à $ˆÔÜ×(Ñ(¨Ö.r   c                óH   <€ V ^8„  d   QhRS[ P                  P                  /# rt   r   )r   rT   s   "€r   r   rU   ±   s   ø€ ÷ %ñ %¡e§h¡h§o¡oñ %r   c                óL   € V P                   f   \        R4      hV P                   # )z9Get the original module associated with this replacement.z*Original module has already been released.)rZ   ÚRuntimeErrorr‡   s   &r   Ú_get_original_moduleÚ*ReplacementModuleBase._get_original_module±   s&   € à× Ñ Ò(ÜÐKÓLÐLØ×$Ñ$Ð$r   c                ó   <€ V ^8„  d   QhRR/# rŠ   rD   )r   rT   s   "€r   r   rU   ·   s   ø€ ÷ 'ñ '¨dñ 'r   c                ó4   € RV n         V P                  4        R# )z,Mark the replacement module as materialized.TN)r`   r=   r‡   s   &r   r†   Ú2ReplacementModuleBase.post_process_materialization·   s   € à!ˆÔØ×$Ñ$Ö&r   c                óJ   <€ V ^8„  d   Qh/ S[ S[S[R,          3,          ;R&   # )r   r$   rK   )r   r[   r   )r   rT   s   "€r   r   rU   C   s"   ø‡ ‚ ñ  ¡¡TÐ*AÕ%BÐ BÕCÑHò r   )r`   rZ   r]   )rJ   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rK   rF   rY   Úclassmethodrh   rm   rq   ry   r   rH   r‚   r%   r…   r=   r”   r†   Ú__annotate_func__Ú__static_attributes__Ú__classdictcell__Ú__classcell__©rP   rT   s   @@r   r$   r$   C   sã   ù‡ € ñ
ð GIÐõp÷,	#ó 	#ð ÷@ó ð@ð ÷>ó ð>ð ÷>ó ð>ð ÷6ó ð6ð Ø÷ó ó ðð Ø÷ó ó ðò0÷ð ÷/ð /÷
%ð %÷'ð '÷i … r   r$   c                ó\   € V ^8„  d   QhR\         P                  P                  R\        RR/# )r   r   Úlabelr   N)r   r   r   r[   )r   s   "r   r   r   ½   s)   € ÷ ñ ¤§¡§¡ð ¼ð Àñ r   c                óè   € V P                  4        F]  w  r#VP                  R4      '       g   K  RV9  g   K'  \        P                  RV RV RVP                  P
                   RV 24        R# 	  R# )z>Log the first experts module found in the model for debugging.z.expertsrZ   z	Experts (z) [z] (z):
N)Únamed_modulesÚendswithr.   ÚinforP   rJ   )r   r¥   r4   r   s   &&  r   Ú_log_first_moe_blockrª   ½   sf   € à×+Ñ+Ö-‰ˆØ�M‰M˜*×%Ô%Ø&¨dÖ2Ü�K‰K˜) E 7¨#¨d¨V°3°v×7GÑ7G×7PÑ7PÐ6QÐQUÐV\ÐU]Ð^Ô_Úó	 .r   c                ón   € V ^8„  d   QhR\         P                  P                  R\        \        ,          /# )r   r   r   )r   r   r   ru   r[   )r   s   "r   r   r   Æ   s&   € ÷ ñ œuŸx™xŸ™ð ÄdÌ3Åiñ r   c                óÄ   € ^ RI HpHp V! 4       '       g   \        P	                  R4       . # V! WR7      pV'       d#   \        P                  R\        V4       R24       V# )z Handle fused MOE modules using transformers' linear_loop backend.

Args:
    model: The model to process

Returns:
    List of module names that were processed
)Úis_linear_loop_availableÚ"prepare_model_for_moe_quantizationzÃtransformers' linear_loop experts interface not available (requires transformers 5.0+). MOE modules with @use_experts_implementation decorator will fall back to custom replacements if registered.©Úfilter_rulesz	Prepared z MOE modules for quantization)Ú&defuser.modeling.moe_experts_interfacer­   r®   r.   r/   r©   Úlen)r   r°   r­   r®   Úunfuseds   &&   r   Ú_handle_moe_modulesr´   Æ   sX   € ÷ñ
 $×%Ò%Ü�‰ðô	
ð
 ˆ	ñ 1°ÔR€GßÜ�‰�i¤ G£˜~Ð-JÐKÔLØ€Nr   c                ó¦   € V ^8„  d   QhR\         P                  P                  R\        R\        R,          R\         P                  P                  /# )r   r   Úauto_detect_moeÚ
max_layersNr   )r   r   r   rk   Úint)r   s   "r   r   r   ã   sD   € ÷ 'ñ 'Ü�x‰x�‰ð'äð'ô ˜$•Jð'ô
 ‡X�X‡_�_ñ'r   c                ó˜   € \        V R4       V'       d   \        4       '       d   \        WR7       \        WVR7       \        V R4       V # )a7  
Function to apply module replacements to a model.

This scans all modules in the model and replaces any registered modules with their
replacement equivalents. Non-permanent modules are tracked for later restoration.

The model is modified in-place, so the same model object should be used.

Args:
    model: The model to apply module replacement to (modified in-place).
    auto_detect_moe: If True, automatically detect and handle fused MOE modules
        (transformers 5.0+ pattern). Default is True.
    max_layers: If provided, only replace modules under ``layers.<idx>``
        where ``idx < max_layers``.
    filter_rules: Optional regex rules selecting which candidate module paths
        are allowed to be defused. Negative rules take priority over positive ones.

Returns:
    The model with modules replaced.
zbefore replacementr¯   )r·   r°   zafter replacement)rª   r   r´   Ú_apply_custom_replacements)r   r¶   r·   r°   s   &&&&r   Úapply_replacementsr»   ã   sA   € ô4 ˜Ð 4Ô5÷ ÔE×GÒGÜ˜EÕ=ô ˜uÈ,ÕWä˜Ð 3Ô4à€Lr   c                ór   € V ^8„  d   QhR\         P                  P                  R\        R,          R\        /# )r   r   r·   Nr   )r   r   r   r¸   ru   )r   s   "r   r   r     s7   € ÷ Dñ DÜ�x‰x�‰ðDä˜$•JðDô 
ñ	Dr   c           	     óè  € . p\        V4      p\        '       d   \        P                  R4       . pV P	                  4        Fµ  w  rg\        V\        4      '       d   K  \        Wa4      '       g   K0  \        Wd4      '       g   KC  VP                  P                  p\        P                  V4      '       g   Kv  \        P                  V4      P                  V4      '       g   K¢  VP                  WgV34       K·  	  V'       Ed¥   \        P                  R\!        V4       R24       \#        VRR7       EFo  w  rgpV P%                  V4      pVP                  P                  V8w  dA   \        '       d3   \        P                  RV RV RVP                  P                   24       Ks  \        Wd4      '       g(   \        '       d   \        P                  RV R	24       K«  \        P                  V4      p	V	P                  V4      '       g(   \        '       d   \        P                  RV R
24       Kþ  \'        VP)                  4       4      P*                  p
V	P-                  VV P.                  4      P1                  V
4      pV P3                  Wk4       VP                  Wi34       EKr  	  M!\        '       d   \        P                  R4       V'       d#   \        P                  R\!        V4       R24       V# )zçScan model and replace registered modules with custom implementations.

Args:
    model: The model to scan and apply replacements to (modified in-place).

Returns:
    List of (name, replacement_class) tuples for replaced modules.
zScanning for modules to replacezFound z modules to replacezReplacing modules)ÚdesczSkipping replacement for z: class changed from z to z : module path excluded by filterz(: no longer matches replacement criteriaz No modules found for replacementz	Replaced z modules)r
   r   r.   r1   r§   r#   r$   r   r   rP   rJ   rm   rh   rq   Úappendr©   r²   r	   Úget_submoduleÚnextÚ
parametersÚdtyper‚   r�   ÚtoÚset_submodule)r   r·   r°   ÚreplacedÚmodule_name_filterÚmodules_to_replacer4   r   Ú
class_nameÚreplacement_clsÚ
orig_dtyperX   s   &&&         r   rº   rº     sq  € ð €HÜ3°LÓAÐ÷ ƒx”—‘Ð?Ô@ØÐØ×+Ñ+Ö-‰ˆä�fÔ3×4Ò4ÙÜ# D×5Ò5ÙÜ)¨$×CÒCÙØ×%Ñ%×.Ñ.ˆ
Ü ×.Ñ.¨z×:Ô:Ô?T×?jÑ?jØó@
ç
Ñ
˜FÓ
#÷@$ð @$ð ×%Ñ% t°ZÐ&@ÖAñ .÷ ÐÜ�‰�fœSÐ!3Ó4Ð5Ð5HÐIÔJÜ(,Ð-?ÐFY×(ZÐ(ZÑ$ˆD˜*Ø×(Ñ(¨Ó.ˆFð ×Ñ×(Ñ(¨JÔ6ß“8Ü—L‘LØ3°D°6Ð9NÈzÈlÐZ^Ð_e×_oÑ_o×_xÑ_xÐ^yÐzôñ Ü-¨d×GÒGß“8Ü—L‘LÐ#<¸T¸FÐBbÐ!cÔdÙÜ3×IÑIÈ*ÓUˆOØ"×4Ñ4°V×<Ò<ß“8œVŸ\™\Ð,EÀdÀVÐKsÐ*tÔuÙÜ˜f×/Ñ/Ó1Ó2×8Ñ8ˆJØ)×7Ñ7ØØ—‘ó÷ ‰b�‹nð ð ×Ñ Ô2Ø�O‰O˜TÐ3×4ò1 )[÷4 ‹8”V—\‘\Ð"DÔE÷ Ü�‰�i¤ H£˜¨hÐ7Ô8à€Or   c                   ó,   a € ] tR tRt o V 3R ltRtV tR# )ÚReplacedModuleInfoiT  c                ó<   <€ V ^8„  d   Qh/ S[ ;R&   S[ ;R&   R;R&   # )r   rH   Úreplacement_module_classz,weakref.ReferenceType[ReplacementModuleBase]Úreplacement_module_refr|   )r   rT   s   "€r   r   ÚReplacedModuleInfo.__annotate__T  s+   ø‡ ‚ áÑñ ñ "Ñ!ñ ð KÑJò	 r   rD   N)rJ   rš   r›   rœ   rŸ   r    r¡   )rT   s   @r   rÍ   rÍ   T  s   ø‡ ‡ „ r   rÍ   c                   óÌ   a a€ ] tR tRt oRtRtRtV 3R ltR t]	V3R lR l4       t
V3R	 lR
 ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltRtVtV ;t# )ÚModuleReplacementTrackeri[  zpTracker to maintain metadata for replacement modules.

This is a singleton class - only one instance can exist.
NFc                óh   <€ V P                   f   \        \        V `  V 4      V n         V P                   # r"   )Ú	_instancerE   rÓ   Ú__new__)rM   rP   s   &€r   rÖ   Ú ModuleReplacementTracker.__new__d  s+   ø€ Ø�=‰=Ò Ü!Ô":¸CÑHÈÓMˆCŒMØ�}‰}Ðr   c                óh   € \         P                  '       d   R # / V n        / V n        R\         n        R # )NT)rÓ   Ú_initializedÚ_replacement_to_nameÚ_name_to_infor‡   s   &r   rY   Ú!ModuleReplacementTracker.__init__i  s,   € ä#×0×0Ð0Ùð 57ˆÔ!à<>ˆÔà04Ô Ö-r   c                ó   <€ V ^8„  d   QhRR/# )r   r   rÓ   rD   )r   rT   s   "€r   r   Ú%ModuleReplacementTracker.__annotate__v  s   ø€ ÷ ñ Ð7ñ r   c                óN   € V P                   f   V ! 4       V n         V P                   # )z*Get the singleton instance of the tracker.)rÕ   rx   s   &r   Úget_instanceÚ%ModuleReplacementTracker.get_instanceu  s!   € ð �=‰=Ò Ù›EˆCŒMØ�}‰}Ðr   c                ó0   <€ V ^8„  d   QhRS[ RS[ RS[RR/# )r   r4   rW   rX   r   N)r[   r$   )r   rT   s   "€r   r   rÞ   |  s9   ø€ ÷ Pñ PáðPñ  ðPñ /ð	Pð
 
ñPr   c                ó
  € \        V4      pWP                  V&   \        VVP                  P                  \
        P                  ! V4      R7      V P                  V&   \        '       d   \        P                  RV 24       R# R# )zRegister a module replacement.)rH   rÏ   rÐ   z#Registered replacement for module: N)r\   rÚ   rÍ   rP   rJ   ÚweakrefÚrefrÛ   r   r.   r1   )ra   r4   rW   rX   Úreplacement_ids   &&&& r   r_   Ú-ModuleReplacementTracker.register_replacement|  sj   € ô ˜K›ˆØ48×!Ñ! .Ñ1Ü#5Ø"0Ø%0×%:Ñ%:×%CÑ%CÜ#*§;¢;¨{Ó#;ô$
ˆ×Ñ˜4Ñ ÷
 ‹8”V—\‘\Ð$GÈÀvÐ"NÖO‰8r   c                ó\   <€ V ^8„  d   QhRS[ RS[P                  P                  R,          /# ©r   rX   r   N)r$   r   r   r   )r   rT   s   "€r   r   rÞ   Œ  s*   ø€ ÷ ,ñ ,Ñ(=ð ,Á%Ç(Á(Ç/Á/ÐTXÕBXñ ,r   c                ó   € VP                   # )z7Get the original module for a given replacement module.)rZ   )ra   rX   s   &&r   Úget_originalÚ%ModuleReplacementTracker.get_originalŒ  s   € à×+Ñ+Ð+r   c                ó4   <€ V ^8„  d   QhRS[ RS[R,          /# )r   r4   r   N)r[   rÍ   )r   rT   s   "€r   r   rÞ   �  s!   ø€ ÷ ñ ¡Sð Ñ-?À$Õ-Fñ r   c                óŠ   € V P                   P                  V4      pVf   R# VP                  4       f   V P                   V R# V# )z$Get replacement info by module name.N)rÛ   rf   rÐ   )ra   r4   r©   s   && r   Úget_info_by_nameÚ)ModuleReplacementTracker.get_info_by_name�  sE   € à×!Ñ!×%Ñ% dÓ+ˆØŠ<ÙØ×&Ñ&Ó(Ò0Ø×"Ñ" 4Ð(ÙØˆr   c                ó$   <€ V ^8„  d   QhRS[ RR/# ré   )r$   )r   rT   s   "€r   r   rÞ   š  s    ø€ ÷ 
dñ 
dÑ,Að 
dÀdñ 
dr   c                ó6  € \        V4      pV P                  P                  VR4      pVen   V P                  P	                  V4      pVe'   VP                  4       pVe   WQJ d   V P                  V \        '       d   \        P                  RV 24       R# R# R# )zARelease the original module associated with a replacement module.Nz)Released original module for replacement )	r\   rÚ   ÚpoprÛ   rf   rÐ   r   r.   r1   )ra   rX   ræ   r4   r©   Úreplacement_refs   &&    r   r�   Ú)ModuleReplacementTracker.release_originalš  s�   € ä˜K›ˆØ×(Ñ(×,Ñ,¨^¸TÓBˆØÒØ×%Ñ%×)Ñ)¨$Ó/ˆDØÒØ"&×"=Ñ"=Ó"?�Ø"Ò*¨oÓ.LØ×*Ñ*¨4Ð0ß‹xœŸ™Ð(QÐR`ÐQaÐ&bÖc‰xñ r   c                ó   <€ V ^8„  d   QhRR/# rŠ   rD   )r   rT   s   "€r   r   rÞ   ¦  s   ø€ ÷ Yñ Y tñ Yr   c                ó€  € ^ pV P                   P                  4        F9  pVP                  4       pVf   K  VP                  f   K)  RVn        V^,          pK;  	  V P                  P                  4        V P                   P                  4        V^ 8”  d*   \        '       d   \        P                  RV R24       R# R# R# )z%Release all tracked original modules.Nz	Released z original modules from tracker)	rÛ   ÚvaluesrÐ   rZ   rÚ   Úclearr   r.   r1   )ra   Úcountr©   rX   s   &   r   Úrelease_all_originalsÚ.ModuleReplacementTracker.release_all_originals¦  sž   € àˆØ×&Ñ&×-Ñ-Ö/ˆDØ×5Ñ5Ó7ˆKØÔ&¨;×+GÑ+GÔ+SØ/3�Ô,Ø˜•
’ñ	 0ð 	×!Ñ!×'Ñ'Ô)Ø×Ñ× Ñ Ô"Ø�1Œ9ß‹xœŸ™¨	°%°Ð8VÐ&WÖX‰xñ r   c                ó   <€ V ^8„  d   QhRR/# rŠ   rD   )r   rT   s   "€r   r   rÞ   ´  s   ø€ ÷ Hñ H�tñ Hr   c                ó´   € V P                   P                  4        V P                  P                  4        \        '       d   \        P                  R4       R# R# )zClear all tracked information.z"Cleared module replacement trackerN)rÚ   rù   rÛ   r   r.   r1   r‡   s   &r   rù   ÚModuleReplacementTracker.clear´  s9   € à×!Ñ!×'Ñ'Ô)Ø×Ñ× Ñ Ô"ß‹8”V—\‘\Ð"FÖG‰8r   )rÛ   rÚ   )rJ   rš   r›   rœ   r�   rÕ   rÙ   rÖ   rY   rž   rà   r_   rë   rï   r�   rû   rù   r    r¡   r¢   r£   s   @@r   rÓ   rÓ   [  s~   ù‡ € ñð
 €IØ€Lõò

5ð ÷ó ð÷Pð P÷ ,ð ,÷ð ÷
dð 
d÷Yð Y÷H÷ Hð Hr   rÓ   r"   )TNN)NN)"rä   Úabcr   r   Údataclassesr   Útypingr   r   r   Úlogbarr   r	   Údefuser.utils.commonr
   r   r   r   Údefuserr   rJ   r.   r7   r2   r   r   r$   rª   r´   r»   rº   rÍ   rÓ   r^   rD   r   r   Ú<module>r     s¤   ðó ß #Ý !ß ã Ý Ý ÷ó õ á	�Ó	€õ$õ6&ôw'˜C §¡§¡ô w'õt÷÷:'÷TDðN ÷Kð Kó ðK÷]Hñ ]Hñ@ +Ó,‚r   