§
    ‰eîiJ=  ã                  ó4  — 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mZm	Z	m
Z
mZ ddlmZ ddlmZ  ej        e¦  «        Z ej        dej        ¦  «        Z ej        dej        ¦  «        Z ej        d	ej        ¦  «        Zdd„Zdd„Z G d„ d¦  «        ZdS )u  MemoryManager â€” orchestrates the built-in memory provider plus at most
ONE external plugin memory provider.

Single integration point in run_agent.py. Replaces scattered per-backend
code with one manager that delegates to registered providers.

The BuiltinMemoryProvider is always registered first and cannot be removed.
Only ONE external (non-builtin) provider is allowed at a time â€” attempting
to register a second external provider is rejected with a warning.  This
prevents tool schema bloat and conflicting memory backends.

Usage in run_agent.py:
    self._memory_manager = MemoryManager()
    self._memory_manager.add_provider(BuiltinMemoryProvider(...))
    # Only ONE of these:
    self._memory_manager.add_provider(plugin_provider)

    # System prompt
    prompt_parts.append(self._memory_manager.build_system_prompt())

    # Pre-turn
    context = self._memory_manager.prefetch_all(user_message)

    # Post-turn
    self._memory_manager.sync_all(user_msg, assistant_response)
    self._memory_manager.queue_prefetch_all(user_msg)
é    )ÚannotationsN)ÚAnyÚDictÚListÚOptional)ÚMemoryProvider)Ú
tool_errorz</?\s*memory-context\s*>z5<\s*memory-context\s*>[\s\S]*?</\s*memory-context\s*>z�\[System note:\s*The following is recalled memory context,\s*NOT new user input\.\s*Treat as informational background data\.\]\s*ÚtextÚstrÚreturnc                ó¨   — t                                d| ¦  «        } t                               d| ¦  «        } t                               d| ¦  «        } | S )zQStrip fence tags, injected context blocks, and system notes from provider output.Ú )Ú_INTERNAL_CONTEXT_REÚsubÚ_INTERNAL_NOTE_REÚ_FENCE_TAG_RE)r
   s    ú6/home/div/.hermes/hermes-agent/agent/memory_manager.pyÚsanitize_contextr   :   sF   € å×#Ò# B¨Ñ-Ô-€DÝ× Ò   TÑ*Ô*€DÝ×Ò˜R Ñ&Ô&€DØ€Kó    Úraw_contextc                ó\   — | r|                       ¦   «         sdS t          | ¦  «        }d|› d�S )uÌ   Wrap prefetched memory in a fenced block with system note.

    The fence prevents the model from treating recalled context as user
    discourse.  Injected at API-call time only â€” never persisted.
    r   z‡<memory-context>
[System note: The following is recalled memory context, NOT new user input. Treat as informational background data.]

z
</memory-context>)Ústripr   )r   Úcleans     r   Úbuild_memory_context_blockr   B   sO   € ð ð ˜k×/Ò/Ñ1Ô1ð ØˆrÝ˜[Ñ)Ô)€Eð	ð ð	ð 	ð 	ðr   c                  óî   — e Zd ZdZd8d„Zd9d„Zed:d	„¦   «         Zd;d„Zd<d„Z	ddœd=d„Z
ddœd>d„Zddœd?d„Zd@d„ZdAd„ZdBd„ZdCd!„ZdDd%„ZdEd'„ZdFd(„ZedGd)„¦   «         Z	 dHdId0„Zdd1œdJd5„Zd8d6„ZdKd7„Zd*S )LÚMemoryManagerzàOrchestrates the built-in provider plus at most one external provider.

    The builtin provider is always first. Only one non-builtin (external)
    provider is allowed.  Failures in one provider never block the other.
    r   ÚNonec                ó0   — g | _         i | _        d| _        d S )NF)Ú
_providersÚ_tool_to_providerÚ_has_external©Úselfs    r   Ú__init__zMemoryManager.__init__[   s   € Ø02ˆŒØ<>ˆÔØ#(ˆÔÐÐr   Úproviderr   c                óp  — |j         dk    }|sP| j        rBt          d„ | j        D ¦   «         d¦  «        }t                               d|j         |¦  «         dS d| _        | j                             |¦  «         |                     ¦   «         D ]i}|                     dd¦  «        }|r|| j	        vr|| j	        |<   Œ.|| j	        v r2t                               d	|| j	        |         j         |j         ¦  «         Œjt           
                    d
|j         t          |                     ¦   «         ¦  «        ¦  «         dS )uá   Register a memory provider.

        Built-in provider (name ``"builtin"``) is always accepted.
        Only **one** external (non-builtin) provider is allowed â€” a second
        attempt is rejected with a warning.
        Úbuiltinc              3  ó:   K  — | ]}|j         d k    ¯|j         V — ŒdS )r'   N)Úname©Ú.0Úps     r   ú	<genexpr>z-MemoryManager.add_provider.<locals>.<genexpr>n   s0   è è € ÐLÐL ¸¼À)Ò8KÐ8K�Q”VÐ8KÐ8KÐ8KÐ8KÐLÐLr   Úunknownu¿   Rejected memory provider '%s' â€” external provider '%s' is already registered. Only one external memory provider is allowed at a time. Configure which one via memory.provider in config.yaml.NTr)   r   zJMemory tool name conflict: '%s' already registered by %s, ignoring from %sz*Memory provider '%s' registered (%d tools))r)   r!   Únextr   ÚloggerÚwarningÚappendÚget_tool_schemasÚgetr    ÚinfoÚlen)r#   r%   Ú
is_builtinÚexistingÚschemaÚ	tool_names         r   Úadd_providerzMemoryManager.add_providerb   sh  € ð ”] iÒ/ˆ
àð 	&ØÔ!ð ÝØLÐL T¤_ÐLÑLÔLÈiñô �õ —’ð&ð ”M 8ñô ð ð �Ø!%ˆDÔàŒ×Ò˜xÑ(Ô(Ð(ð ×/Ò/Ñ1Ô1ð 	ð 	ˆFØŸ
š
 6¨2Ñ.Ô.ˆIØð 	˜Y¨dÔ.DÐDÐDØ4<�Ô& yÑ1Ð1Ø˜dÔ4Ð4Ð4Ý—’ð'àØÔ*¨9Ô5Ô:Ø”Mñô ð øõ 	�ŠØ8ØŒMÝ�×)Ò)Ñ+Ô+Ñ,Ô,ñ	
ô 	
ð 	
ð 	
ð 	
r   úList[MemoryProvider]c                ó*   — t          | j        ¦  «        S )z"All registered providers in order.)Úlistr   r"   s    r   Ú	providerszMemoryManager.providers�   s   € õ �D”OÑ$Ô$Ð$r   r)   r   úOptional[MemoryProvider]c                ó8   — | j         D ]}|j        |k    r|c S ŒdS )z2Get a provider by name, or None if not registered.N)r   r)   )r#   r)   r,   s      r   Úget_providerzMemoryManager.get_provider•   s1   € à”ð 	ð 	ˆAØŒv˜Š~ˆ~Ø���ð àˆtr   c                ó4  — g }| j         D ]z}	 |                     ¦   «         }|r)|                     ¦   «         r|                     |¦  «         ŒC# t          $ r+}t
                               d|j        |¦  «         Y d}~Œsd}~ww xY wd                     |¦  «        S )zÅCollect system prompt blocks from all providers.

        Returns combined text, or empty string if no providers contribute.
        Each non-empty block is labeled with the provider name.
        z5Memory provider '%s' system_prompt_block() failed: %sNú

)	r   Úsystem_prompt_blockr   r2   Ú	Exceptionr0   r1   r)   Újoin)r#   Úblocksr%   ÚblockÚes        r   Úbuild_system_promptz!MemoryManager.build_system_promptž   sÆ   € ð ˆØœð 		ð 		ˆHðØ ×4Ò4Ñ6Ô6�Øð )˜UŸ[š[™]œ]ð )Ø—M’M %Ñ(Ô(Ð(øøÝð ð ð Ý—’ØKØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð
 �{Š{˜6Ñ"Ô"Ð"s   �?AÁ
BÁ!A=Á=Br   ©Ú
session_idÚqueryrM   c               ó:  — g }| j         D ]}}	 |                     ||¬¦  «        }|r)|                     ¦   «         r|                     |¦  «         ŒF# t          $ r+}t
                               d|j        |¦  «         Y d}~Œvd}~ww xY wd                     |¦  «        S )zÁCollect prefetch context from all providers.

        Returns merged context text labeled by provider. Empty providers
        are skipped. Failures in one provider don't block others.
        rL   z4Memory provider '%s' prefetch failed (non-fatal): %sNrD   )	r   Úprefetchr   r2   rF   r0   Údebugr)   rG   )r#   rN   rM   Úpartsr%   ÚresultrJ   s          r   Úprefetch_allzMemoryManager.prefetch_all³   sÍ   € ð ˆØœð 		ð 		ˆHðØ!×*Ò*¨5¸ZÐ*ÑHÔH�Øð )˜fŸlšl™nœnð )Ø—L’L Ñ(Ô(Ð(øøÝð ð ð Ý—’ØJØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð
 �{Š{˜5Ñ!Ô!Ð!s   �AAÁ
BÁ!B Â Bc               óº   — | j         D ]R}	 |                     ||¬¦  «         Œ# t          $ r+}t                               d|j        |¦  «         Y d}~ŒKd}~ww xY wdS )z=Queue background prefetch on all providers for the next turn.rL   z:Memory provider '%s' queue_prefetch failed (non-fatal): %sN)r   Úqueue_prefetchrF   r0   rQ   r)   )r#   rN   rM   r%   rJ   s        r   Úqueue_prefetch_allz MemoryManager.queue_prefetch_allÆ   s–   € àœð 	ð 	ˆHðØ×'Ò'¨¸*Ð'ÑEÔEÐEÐEøÝð ð ð Ý—’ØPØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð	ð 	s   ‹#£
A­!AÁAÚuser_contentÚassistant_contentc               ó¼   — | j         D ]S}	 |                     |||¬¦  «         Œ# t          $ r+}t                               d|j        |¦  «         Y d}~ŒLd}~ww xY wdS )z'Sync a completed turn to all providers.rL   z)Memory provider '%s' sync_turn failed: %sN)r   Ú	sync_turnrF   r0   r1   r)   )r#   rX   rY   rM   r%   rJ   s         r   Úsync_allzMemoryManager.sync_allÓ   s™   € àœð 	ð 	ˆHðØ×"Ò" <Ð1BÈzÐ"ÑZÔZÐZÐZøÝð ð ð Ý—’Ø?Ø”M 1ñô ð ð ð ð ð ð øøøøðøøøð	ð 	s   ‹$¤
A®!AÁAúList[Dict[str, Any]]c                óf  — g }t          ¦   «         }| j        D ]˜}	 |                     ¦   «         D ]H}|                     dd¦  «        }|r.||vr*|                     |¦  «         |                     |¦  «         ŒIŒa# t          $ r+}t                               d|j	        |¦  «         Y d}~Œ‘d}~ww xY w|S )z(Collect tool schemas from all providers.r)   r   z2Memory provider '%s' get_tool_schemas() failed: %sN)
Úsetr   r3   r4   r2   ÚaddrF   r0   r1   r)   )r#   ÚschemasÚseenr%   r9   r)   rJ   s          r   Úget_all_tool_schemasz"MemoryManager.get_all_tool_schemasà   sî   € àˆÝ‰uŒuˆØœð 	ð 	ˆHð
Ø&×7Ò7Ñ9Ô9ð 'ð '�FØ!Ÿ:š: f¨bÑ1Ô1�DØð ' ¨DÐ 0Ð 0ØŸš vÑ.Ô.Ð.ØŸš ™œ˜øð	'øõ
 ð ð ð Ý—’ØHØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð
 ˆs   ›AA9Á9
B.Â!B)Â)B.r_   c                óN   — t          | j                             ¦   «         ¦  «        S )z2Return set of all tool names across all providers.)r_   r    Úkeysr"   s    r   Úget_all_tool_namesz MemoryManager.get_all_tool_namesò   s   € å�4Ô)×.Ò.Ñ0Ô0Ñ1Ô1Ð1r   r:   Úboolc                ó   — || j         v S )z(Check if any provider handles this tool.)r    )r#   r:   s     r   Úhas_toolzMemoryManager.has_toolö   s   € à˜DÔ2Ð2Ð2r   ÚargsúDict[str, Any]c                ó  — | j                              |¦  «        }|€t          d|› d�¦  «        S 	  |j        ||fi |¤ŽS # t          $ rA}t
                               d|j        ||¦  «         t          d|› d|› �¦  «        cY d}~S d}~ww xY w)z“Route a tool call to the correct provider.

        Returns JSON string result. Raises ValueError if no provider
        handles the tool.
        Nz!No memory provider handles tool 'ú'z4Memory provider '%s' handle_tool_call(%s) failed: %szMemory tool 'z
' failed: )r    r4   r	   Úhandle_tool_callrF   r0   Úerrorr)   )r#   r:   rj   Úkwargsr%   rJ   s         r   rn   zMemoryManager.handle_tool_callú   sÒ   € ð Ô)×-Ò-¨iÑ8Ô8ˆØÐÝÐNÀ)ÐNÐNÐNÑOÔOÐOð	HØ,�8Ô,¨Y¸ÐGÐGÀÐGÐGÐGøÝð 	Hð 	Hð 	HÝ�LŠLØFØ”˜y¨!ñô ð õ ÐF¨iÐFÐFÀ1ÐFÐFÑGÔGÐGÐGÐGÐGÐGÐGøøøøð	Høøøs   ±A  Á 
BÁ
6BÂ BÂBÚturn_numberÚintÚmessagec                óª   — | j         D ]J}	  |j        ||fi |¤Ž Œ# t          $ r+}t                               d|j        |¦  «         Y d}~ŒCd}~ww xY wdS )zxNotify all providers of a new turn.

        kwargs may include: remaining_tokens, model, platform, tool_count.
        z-Memory provider '%s' on_turn_start failed: %sN)r   Úon_turn_startrF   r0   rQ   r)   )r#   rq   rs   rp   r%   rJ   s         r   ru   zMemoryManager.on_turn_start  sœ   € ð
 œð 	ð 	ˆHðØ&�Ô& {°GÐFÐF¸vÐFÐFÐFÐFøÝð ð ð Ý—’ØCØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð	ð 	s   ‹›
A¥!AÁAÚmessagesc                ó¶   — | j         D ]P}	 |                     |¦  «         Œ# t          $ r+}t                               d|j        |¦  «         Y d}~ŒId}~ww xY wdS )z$Notify all providers of session end.z.Memory provider '%s' on_session_end failed: %sN)r   Úon_session_endrF   r0   rQ   r)   )r#   rv   r%   rJ   s       r   rx   zMemoryManager.on_session_end  s‘   € àœð 	ð 	ˆHðØ×'Ò'¨Ñ1Ô1Ð1Ð1øÝð ð ð Ý—’ØDØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð	ð 	s   ‹!¡
A«!AÁAc                ó6  — g }| j         D ]{}	 |                     |¦  «        }|r)|                     ¦   «         r|                     |¦  «         ŒD# t          $ r+}t
                               d|j        |¦  «         Y d}~Œtd}~ww xY wd                     |¦  «        S )zÆNotify all providers before context compression.

        Returns combined text from providers to include in the compression
        summary prompt. Empty string if no provider contributes.
        z/Memory provider '%s' on_pre_compress failed: %sNrD   )	r   Úon_pre_compressr   r2   rF   r0   rQ   r)   rG   )r#   rv   rR   r%   rS   rJ   s         r   rz   zMemoryManager.on_pre_compress)  sÈ   € ð ˆØœð 		ð 		ˆHðØ!×1Ò1°(Ñ;Ô;�Øð )˜fŸlšl™nœnð )Ø—L’L Ñ(Ô(Ð(øøÝð ð ð Ý—’ØEØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð
 �{Š{˜5Ñ!Ô!Ð!s   �A AÁ
BÁ!A>Á>Bc                óF  — 	 t          j        | j        ¦  «        }n# t          t          f$ r Y dS w xY wt          |j                             ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        rdS d|j        v rdS d„ |D ¦   «         }t          |¦  «        dk    rdS dS )z>Return how to pass metadata to a provider's memory-write hook.Úkeywordc              3  óJ   K  — | ]}|j         t          j        j        k    V — Œd S ©N)ÚkindÚinspectÚ	ParameterÚVAR_KEYWORDr*   s     r   r-   zEMemoryManager._provider_memory_write_metadata_mode.<locals>.<genexpr>E  s/   è è € ÐGÐG¸1ˆqŒv�Ô*Ô6Ò6ÐGÐGÐGÐGÐGÐGr   Úmetadatac                ó„   — g | ]=}|j         t          j        j        t          j        j        t          j        j        fv ¯;|‘Œ>S © )r   r€   r�   ÚPOSITIONAL_ONLYÚPOSITIONAL_OR_KEYWORDÚKEYWORD_ONLYr*   s     r   ú
<listcomp>zFMemoryManager._provider_memory_write_metadata_mode.<locals>.<listcomp>J  sW   € ð 
ð 
ð 
ØØŒvÝÔ!Ô1ÝÔ!Ô7ÝÔ!Ô.ðð ð ð ðð ð r   é   Ú
positionalÚlegacy)
r€   Ú	signatureÚon_memory_writeÚ	TypeErrorÚ
ValueErrorr>   Ú
parametersÚvaluesÚanyr6   )r%   r�   ÚparamsÚaccepteds       r   Ú$_provider_memory_write_metadata_modez2MemoryManager._provider_memory_write_metadata_mode<  sÓ   € ð	ÝÔ)¨(Ô*BÑCÔCˆIˆIøÝ�:Ð&ð 	ð 	ð 	Ø�9�9ð	øøøõ �iÔ*×1Ò1Ñ3Ô3Ñ4Ô4ˆÝÐGÐGÀÐGÑGÔGÑGÔGð 	Ø�9Ø˜Ô-Ð-Ð-Ø�9ð
ð 
Øð
ñ 
ô 
ˆõ ˆx‰=Œ=˜AÒÐØ�<Øˆxs   ‚ œ1°1NÚactionÚtargetÚcontentrƒ   úOptional[Dict[str, Any]]c           	     ó¶  — | j         D ]Ð}|j        dk    rŒ	 |                      |¦  «        }|dk    r)|                     |||t	          |pi ¦  «        ¬¦  «         nE|dk    r(|                     |||t	          |pi ¦  «        ¦  «         n|                     |||¦  «         Œ™# t
          $ r+}t                               d|j        |¦  «         Y d}~ŒÉd}~ww xY wdS )z“Notify external providers when the built-in memory tool writes.

        Skips the builtin provider itself (it's the source of the write).
        r'   r|   )rƒ   r‹   z/Memory provider '%s' on_memory_write failed: %sN)r   r)   r–   rŽ   ÚdictrF   r0   rQ   )r#   r—   r˜   r™   rƒ   r%   Úmetadata_moderJ   s           r   rŽ   zMemoryManager.on_memory_writeV  s1  € ð œð 	ð 	ˆHØŒ} 	Ò)Ð)ØðØ $× IÒ IÈ(Ñ SÔ S�Ø  IÒ-Ð-Ø×,Ò,Ø ¨½$¸x¸~È2Ñ:NÔ:Nð -ñ ô ð ð ð # lÒ2Ð2Ø×,Ò,¨V°V¸WÅdÈ8È>ÐWYÑFZÔFZÑ[Ô[Ð[Ð[à×,Ò,¨V°V¸WÑEÔEÐEøøÝð ð ð Ý—’ØEØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð	ð 	s   —B	B!Â!
CÂ+!CÃC)Úchild_session_idÚtaskrS   rž   c               ó®   — | j         D ]L}	  |j        ||fd|i|¤Ž Œ# t          $ r+}t                               d|j        |¦  «         Y d}~ŒEd}~ww xY wdS )z/Notify all providers that a subagent completed.rž   z-Memory provider '%s' on_delegation failed: %sN)r   Úon_delegationrF   r0   rQ   r)   )r#   rŸ   rS   rž   rp   r%   rJ   s          r   r¡   zMemoryManager.on_delegationt  s´   € ð œð 		ð 		ˆHðØ&�Ô&Ø˜&ðð Ø3CðØGMðð ð ð øõ ð ð ð Ý—’ØCØ”M 1ñô ð ð ð ð ð ð øøøøðøøøð		ð 		s   ‹�
A§!AÁAc                óÎ   — t          | j        ¦  «        D ]O}	 |                     ¦   «          Œ# t          $ r+}t                               d|j        |¦  «         Y d}~ŒHd}~ww xY wdS )z;Shut down all providers (reverse order for clean teardown).z(Memory provider '%s' shutdown failed: %sN)Úreversedr   ÚshutdownrF   r0   r1   r)   )r#   r%   rJ   s      r   Úshutdown_allzMemoryManager.shutdown_all‚  s—   € å  ¤Ñ1Ô1ð 	ð 	ˆHðØ×!Ò!Ñ#Ô#Ð#Ð#øÝð ð ð Ý—’Ø>Ø”M 1ñô ð ð ð ð ð ð øøøøðøøøð	ð 	s   ˜-­
A"·!AÁA"c                óò   — d|vr ddl m} t           |¦   «         ¦  «        |d<   | j        D ]J}	  |j        dd|i|¤Ž Œ# t
          $ r+}t                               d|j        |¦  «         Y d}~ŒCd}~ww xY wdS )zãInitialize all providers.

        Automatically injects ``hermes_home`` into *kwargs* so that every
        provider can resolve profile-scoped storage paths without importing
        ``get_hermes_home()`` themselves.
        Úhermes_homer   )Úget_hermes_homerM   z*Memory provider '%s' initialize failed: %sNr…   )	Úhermes_constantsr¨   r   r   Ú
initializerF   r0   r1   r)   )r#   rM   rp   r¨   r%   rJ   s         r   Úinitialize_allzMemoryManager.initialize_all�  sÔ   € ð  Ð&Ð&Ø8Ð8Ð8Ð8Ð8Ð8Ý$'¨¨Ñ(9Ô(9Ñ$:Ô$:ˆF�=Ñ!Øœð 	ð 	ˆHðØ#�Ô#ÐDÐD¨zÐD¸VÐDÐDÐDÐDøÝð ð ð Ý—’Ø@Ø”M 1ñô ð ð ð ð ð ð øøøøðøøøð	ð 	s   ¯?¿
A4Á	!A/Á/A4)r   r   )r%   r   r   r   )r   r<   )r)   r   r   r@   )r   r   )rN   r   rM   r   r   r   )rN   r   rM   r   r   r   )rX   r   rY   r   rM   r   r   r   )r   r]   )r   r_   )r:   r   r   rg   )r:   r   rj   rk   r   r   )rq   rr   rs   r   r   r   )rv   r]   r   r   )rv   r]   r   r   )r%   r   r   r   r~   )
r—   r   r˜   r   r™   r   rƒ   rš   r   r   )rŸ   r   rS   r   rž   r   r   r   )rM   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r;   Úpropertyr?   rB   rK   rT   rW   r\   rc   rf   ri   rn   ru   rx   rz   Ústaticmethodr–   rŽ   r¡   r¥   r«   r…   r   r   r   r   T   s  € € € € € ðð ð)ð )ð )ð )ð,
ð ,
ð ,
ð ,
ð\ ð%ð %ð %ñ „Xð%ðð ð ð ð#ð #ð #ð #ð* =?ð "ð "ð "ð "ð "ð "ð& CEð 	ð 	ð 	ð 	ð 	ð 	ð XZð 	ð 	ð 	ð 	ð 	ð 	ðð ð ð ð$2ð 2ð 2ð 2ð3ð 3ð 3ð 3ðHð Hð Hð Hð,ð ð ð ð	ð 	ð 	ð 	ð"ð "ð "ð "ð& ðð ð ñ „\ðð< .2ðð ð ð ð ð> /1ðð ð ð ð ð ð	ð 	ð 	ð 	ðð ð ð ð ð r   r   )r
   r   r   r   )r   r   r   r   )r¯   Ú
__future__r   ÚjsonÚloggingÚrer€   Útypingr   r   r   r   Úagent.memory_providerr   Útools.registryr	   Ú	getLoggerr¬   r0   ÚcompileÚ
IGNORECASEr   r   r   r   r   r   r…   r   r   ú<module>r¼      sZ  ððð ð8 #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø %Ð %Ð %Ð %Ð %Ð %à	ˆÔ	˜8Ñ	$Ô	$€ð �”
Ð6¸¼ÑFÔF€Ø!�r”zØ<Ø„Mñô Ð ð �B”Jð IØ„Mñô Ð ðð ð ð ðð ð ð ð$Jð Jð Jð Jð Jñ Jô Jð Jð Jð Jr   