ó
    Ö›‘h3  ã                   ó²  • S r SSKrSSKJr  SSKJr   SSKr\r SSK	J
rJr  \\srr
SSKJrJr  SSKJr   " S S	5      r " S
 S\R(                  5      r " S S\5      r " S S\5      r\
b   " S S\
R0                  5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg! \ a    Sr N«f = f! \ a    S=rr
 N­f = f)z'
Tests for L{twisted.conch.ssh.agent}.
é    N)Úiosim)Úunittest)ÚagentÚkeys)Ú
ConchErrorÚMissingKeyStoreError)Úkeydatac                   ó   • \ rS rSrSrS rSrg)ÚStubFactoryé   zV
Mock factory that provides the keys attribute required by the
SSHAgentServerProtocol
c                 ó   • 0 U l         g ©N©r   ©Úselfs    ÚaC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/conch/test/test_agent.pyÚ__init__ÚStubFactory.__init__%   s	   € Øˆ�	ó    r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__© r   r   r   r      s   † ñõ
r   r   c                   ó.   • \ rS rSrSr\b  \c  SrS rSr	g)ÚAgentTestBaseé)   z"
Tests for SSHAgentServer/Client.
NzCannot run without cryptographyc                 óR  • [         R                  " [        R                  [        R                  5      u  U l        U l        U l        [        5       U R                  l	        [        R                  R                  [        R                  5      U l        [        R                  R                  [        R                   5      U l        [        R                  R                  [        R$                  5      U l        [        R                  R                  [        R(                  5      U l        g r   )r   ÚconnectedServerAndClientr   ÚSSHAgentServerÚSSHAgentClientÚclientÚserverÚpumpr   Úfactoryr   ÚKeyÚ
fromStringr	   ÚprivateRSA_opensshÚ
rsaPrivateÚprivateDSA_opensshÚ
dsaPrivateÚpublicRSA_opensshÚ	rsaPublicÚpublicDSA_opensshÚ	dsaPublicr   s    r   ÚsetUpÚAgentTestBase.setUp1   s²   € ä.3×.LÒ.LÜ× Ñ ¤%×"6Ñ"6ó/
Ñ+ˆŒ�T”[ $¤)ô *›mˆ�‰Ôô Ÿ(™(×-Ñ-¬g×.HÑ.HÓIˆŒÜŸ(™(×-Ñ-¬g×.HÑ.HÓIˆŒäŸ™×,Ñ,¬W×-FÑ-FÓGˆŒÜŸ™×,Ñ,¬W×-FÑ-FÓGˆ�r   )r$   r-   r1   r&   r+   r/   r%   )
r   r   r   r   r   r   r   Úskipr2   r   r   r   r   r   r   )   s   † ñð �}˜™Ø0ˆõHr   r   c                   ó   • \ rS rSrSrS rSrg)Ú&ServerProtocolContractWithFactoryTestséC   zÊ
The server protocol is stateful and so uses its factory to track state
across requests.  This test asserts that the protocol raises if its factory
doesn't provide the necessary storage for that state.
c                 óè   • [         R                  " SS[        R                  5      nU R                  R
                  R                  S	 U R                  [        U R                  R                  U5        g )Nz!LBé   r   )
ÚstructÚpackr   ÚAGENTC_REQUEST_IDENTITIESr%   r'   Ú__dict__ÚassertRaisesr   ÚdataReceived)r   Úmsgs     r   Ú/test_factorySuppliesKeyStorageForServerProtocolÚVServerProtocolContractWithFactoryTests.test_factorySuppliesKeyStorageForServerProtocolJ   sO   € ä�kŠk˜% ¤E×$CÑ$CÓDˆØ�K‰K×Ñ×(Ñ(¨Ð0Ø×ÑÔ.°·±×0HÑ0HÈ#ÕNr   r   N)r   r   r   r   r   rA   r   r   r   r   r6   r6   C   s   † ñõOr   r6   c                   ó*   • \ rS rSrSrS rS rS rSrg)Ú"UnimplementedVersionOneServerTestséQ   a  
Tests for methods with no-op implementations on the server. We need these
for clients, such as openssh, that try v1 methods before going to v2.

Because the client doesn't expose these operations with nice method names,
we invoke sendRequest directly with an op code.
c                 óº   ^ • T R                   R                  [        R                  S5      nT R                  R                  5         U 4S jnUR                  U5      $ )zF
assert that we get the correct op code for an RSA identities request
r   c                 ó^   >• TR                  [        R                  [        U SS 5      5        g )Nr   r9   )ÚassertEqualr   ÚAGENT_RSA_IDENTITIES_ANSWERÚord)Úpacketr   s    €r   Ú_cbÚRUnimplementedVersionOneServerTests.test_agentc_REQUEST_RSA_IDENTITIES.<locals>._cba   s$   ø€ Ø×ÑœU×>Ñ>ÄÀFÈ1ÈQÀKÓ@PÕQr   )r$   ÚsendRequestr   ÚAGENTC_REQUEST_RSA_IDENTITIESr&   ÚflushÚaddCallback)r   ÚdrL   s   `  r   Ú"test_agentc_REQUEST_RSA_IDENTITIESÚEUnimplementedVersionOneServerTests.test_agentc_REQUEST_RSA_IDENTITIESZ   sF   ø€ ð �K‰K×#Ñ#¤E×$GÑ$GÈÓMˆØ�	‰	�‰Ôõ	Rð �}‰}˜SÓ!Ð!r   c                 óÂ   • U R                   R                  [        R                  S5      nU R                  R                  5         UR                  U R                  S5      $ )zK
assert that we get the correct op code for an RSA remove identity request
r   )r$   rN   r   ÚAGENTC_REMOVE_RSA_IDENTITYr&   rP   rQ   rH   ©r   rR   s     r   Útest_agentc_REMOVE_RSA_IDENTITYÚBUnimplementedVersionOneServerTests.test_agentc_REMOVE_RSA_IDENTITYf   sE   € ð �K‰K×#Ñ#¤E×$DÑ$DÀcÓJˆØ�	‰	�‰ÔØ�}‰}˜T×-Ñ-¨sÓ3Ð3r   c                 óÂ   • U R                   R                  [        R                  S5      nU R                  R                  5         UR                  U R                  S5      $ )zR
assert that we get the correct op code for an RSA remove all identities
request.
r   )r$   rN   r   Ú AGENTC_REMOVE_ALL_RSA_IDENTITIESr&   rP   rQ   rH   rW   s     r   Ú%test_agentc_REMOVE_ALL_RSA_IDENTITIESÚHUnimplementedVersionOneServerTests.test_agentc_REMOVE_ALL_RSA_IDENTITIESn   sE   € ð
 �K‰K×#Ñ#¤E×$JÑ$JÈCÓPˆØ�	‰	�‰ÔØ�}‰}˜T×-Ñ-¨sÓ3Ð3r   r   N)	r   r   r   r   r   rS   rX   r\   r   r   r   r   rD   rD   Q   s   † ñò
"ò4õ4r   rD   c                   ó$   • \ rS rSrSrS rS rSrg)ÚCorruptServeréz   zš
A misbehaving server that returns bogus response op codes so that we can
verify that our callbacks that deal with these op codes handle such
miscreants.
c                 ó(   • U R                  SS5        g ©Néþ   r   ©ÚsendResponse©r   Údatas     r   Úagentc_REQUEST_IDENTITIESÚ'CorruptServer.agentc_REQUEST_IDENTITIES�   ó   € Ø×Ñ˜c 3Õ'r   c                 ó(   • U R                  SS5        g rb   rd   rf   s     r   Úagentc_SIGN_REQUESTÚ!CorruptServer.agentc_SIGN_REQUEST„   rj   r   r   N)r   r   r   r   r   rh   rl   r   r   r   r   r_   r_   z   s   † ñ	ò	(õ	(r   r_   c                   ó*   • \ rS rSrSrS rS rS rSrg)ÚClientWithBrokenServerTestséˆ   zE
verify error handling code in the client using a misbehaving server
c                 óØ   • [         R                  U 5        [        R                  " [        [
        R                  5      u  U l        U l        U l	        [        5       U R                  l        g r   )r   r2   r   r!   r_   r   r#   r$   r%   r&   r   r'   r   s    r   r2   Ú!ClientWithBrokenServerTests.setUp�   sH   € Ü×Ñ˜DÔ!Ü.3×.LÒ.LÜœ5×/Ñ/ó/
Ñ+ˆŒ�T”[ $¤)ô
 *›mˆ�‰Õr   c                 óÊ   • U R                   R                  U R                  R                  5       S5      nU R                  R                  5         U R                  U[        5      $ )z¤
Assert that L{SSHAgentClient.signData} raises a ConchError
if we get a response from the server whose opcode doesn't match
the protocol for data signing requests.
ó   John Hancock)r$   ÚsignDatar/   Úblobr&   rP   ÚassertFailurer   rW   s     r   Ú"test_signDataCallbackErrorHandlingÚ>ClientWithBrokenServerTests.test_signDataCallbackErrorHandling–   sH   € ð �K‰K× Ñ  §¡×!4Ñ!4Ó!6¸ÓHˆØ�	‰	�‰ÔØ×!Ñ! !¤ZÓ0Ð0r   c                 ó–   • U R                   R                  5       nU R                  R                  5         U R	                  U[
        5      $ )z©
Assert that L{SSHAgentClient.requestIdentities} raises a ConchError
if we get a response from the server whose opcode doesn't match
the protocol for identity requests.
)r$   ÚrequestIdentitiesr&   rP   rw   r   rW   s     r   Ú+test_requestIdentitiesCallbackErrorHandlingÚGClientWithBrokenServerTests.test_requestIdentitiesCallbackErrorHandling    s7   € ð �K‰K×)Ñ)Ó+ˆØ�	‰	�‰ÔØ×!Ñ! !¤ZÓ0Ð0r   )r$   r&   r%   N)	r   r   r   r   r   r2   rx   r|   r   r   r   r   ro   ro   ˆ   s   † ñò,ò1õ1r   ro   c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚAgentKeyAdditionTestsé«   z4
Test adding different flavors of keys to an agent.
c                 óÌ   ^ • T R                   R                  T R                  R                  5       5      nT R                  R                  5         U 4S jnUR                  U5      $ )á  
L{SSHAgentClient.addIdentity} adds the private key it is called
with to the SSH agent server to which it is connected, associating
it with the comment it is called with.

This test asserts that omitting the comment produces an
empty string for the comment on the server.
c                 óä   >• TR                   R                  R                  TR                  R	                  5          nTR                  TR                  US   5        TR                  SUS   5        g ©Nr   r   r9   ©r%   r'   r   r+   rv   rH   ©ÚignoredÚ	serverKeyr   s     €r   Ú_checkÚBAgentKeyAdditionTests.test_addRSAIdentityNoComment.<locals>._check¼   óV   ø€ ØŸ™×+Ñ+×0Ñ0°·±×1EÑ1EÓ1GÑHˆIØ×Ñ˜TŸ_™_¨i¸©lÔ;Ø×Ñ˜S )¨A¡,Õ/r   ©r$   ÚaddIdentityr+   ÚprivateBlobr&   rP   rQ   ©r   rR   r‰   s   `  r   Útest_addRSAIdentityNoCommentÚ2AgentKeyAdditionTests.test_addRSAIdentityNoComment°   óJ   ø€ ð �K‰K×#Ñ# D§O¡O×$?Ñ$?Ó$AÓBˆØ�	‰	�‰Ôõ	0ð
 �}‰}˜VÓ$Ð$r   c                 óÌ   ^ • T R                   R                  T R                  R                  5       5      nT R                  R                  5         U 4S jnUR                  U5      $ )r‚   c                 óä   >• TR                   R                  R                  TR                  R	                  5          nTR                  TR                  US   5        TR                  SUS   5        g r„   ©r%   r'   r   r-   rv   rH   r†   s     €r   r‰   ÚBAgentKeyAdditionTests.test_addDSAIdentityNoComment.<locals>._checkÏ   r‹   r   ©r$   r�   r-   rŽ   r&   rP   rQ   r�   s   `  r   Útest_addDSAIdentityNoCommentÚ2AgentKeyAdditionTests.test_addDSAIdentityNoCommentÃ   r’   r   c                 óÊ   ^ • T R                   R                  T R                  R                  5       SS9nT R                  R                  5         U 4S jnUR                  U5      $ )á  
L{SSHAgentClient.addIdentity} adds the private key it is called
with to the SSH agent server to which it is connected, associating
it with the comment it is called with.

This test asserts that the server receives/stores the comment
as sent by the client.
ó   My special key©Úcommentc                 óä   >• TR                   R                  R                  TR                  R	                  5          nTR                  TR                  US   5        TR                  SUS   5        g ©Nr   rœ   r9   r…   r†   s     €r   r‰   ÚDAgentKeyAdditionTests.test_addRSAIdentityWithComment.<locals>._checkä   óW   ø€ ØŸ™×+Ñ+×0Ñ0°·±×1EÑ1EÓ1GÑHˆIØ×Ñ˜TŸ_™_¨i¸©lÔ;Ø×ÑÐ.°	¸!±Õ=r   rŒ   r�   s   `  r   Útest_addRSAIdentityWithCommentÚ4AgentKeyAdditionTests.test_addRSAIdentityWithCommentÖ   óW   ø€ ð �K‰K×#Ñ#Ø�O‰O×'Ñ'Ó)Ð3Dð $ð 
ˆð 	�	‰	�‰Ôõ	>ð
 �}‰}˜VÓ$Ð$r   c                 óÊ   ^ • T R                   R                  T R                  R                  5       SS9nT R                  R                  5         U 4S jnUR                  U5      $ )r›   rœ   r�   c                 óä   >• TR                   R                  R                  TR                  R	                  5          nTR                  TR                  US   5        TR                  SUS   5        g r    r•   r†   s     €r   r‰   ÚDAgentKeyAdditionTests.test_addDSAIdentityWithComment.<locals>._checkù   r¢   r   r—   r�   s   `  r   Útest_addDSAIdentityWithCommentÚ4AgentKeyAdditionTests.test_addDSAIdentityWithCommentë   r¥   r   r   N)
r   r   r   r   r   r�   r˜   r£   r©   r   r   r   r   r   r   «   s   † ñò%ò&%ò&%õ*%r   r   c                   ó   • \ rS rSrS rSrg)ÚAgentClientFailureTestsi  c                 óš   • U R                   R                  SS5      nU R                  R                  5         U R	                  U[
        5      $ )z;
verify that the client raises ConchError on AGENT_FAILURE
rc   r   )r$   rN   r&   rP   rw   r   rW   s     r   Útest_agentFailureÚ)AgentClientFailureTests.test_agentFailure  s;   € ð �K‰K×#Ñ# C¨Ó-ˆØ�	‰	�‰ÔØ×!Ñ! !¤ZÓ0Ð0r   r   N)r   r   r   r   r®   r   r   r   r   r¬   r¬     s   † õ1r   r¬   c                   ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚAgentIdentityRequestsTestsi  zB
Test operations against a server with identities already loaded.
c                 óJ  • [         R                  U 5        U R                  S4U R                  R                  R
                  U R                  R                  5       '   U R                  S4U R                  R                  R
                  U R                  R                  5       '   g ©Nó	   a commentó   another comment©r   r2   r-   r%   r'   r   rv   r+   r   s    r   r2   Ú AgentIdentityRequestsTests.setUp  óx   € Ü×Ñ˜DÔ!à�O‰OØð<
ˆ�‰×Ñ× Ñ  §¡×!5Ñ!5Ó!7Ñ8ð
 �O‰OØð<
ˆ�‰×Ñ× Ñ  §¡×!5Ñ!5Ó!7Ò8r   c                 óp  • U R                   R                  U R                  R                  5       S5      nU R                  R                  5         U R                  U5      nU R                  R                  S5      nU R                  X25        U R                  U R                  R                  US5      5        g)zK
Sign data with an RSA private key and then verify it with the public
key.
rt   N)r$   ru   r/   rv   r&   rP   ÚsuccessResultOfr+   ÚsignrH   Ú
assertTrueÚverify)r   rR   Ú	signatureÚexpecteds       r   Útest_signDataRSAÚ+AgentIdentityRequestsTests.test_signDataRSA  s„   € ð
 �K‰K× Ñ  §¡×!4Ñ!4Ó!6¸ÓHˆØ�	‰	�‰ÔØ×(Ñ(¨Ó+ˆ	à—?‘?×'Ñ'¨Ó8ˆØ×Ñ˜Ô-Ø�‰˜Ÿ™×-Ñ-¨i¸ÓIÕJr   c                 óÎ   ^ • T R                   R                  T R                  R                  5       S5      nT R                  R                  5         U 4S jnUR                  U5      $ )zJ
Sign data with a DSA private key and then verify it with the public
key.
rt   c                 ó\   >• TR                  TR                  R                  U S5      5        g )Nrt   )r¼   r1   r½   )Úsigr   s    €r   r‰   Ú;AgentIdentityRequestsTests.test_signDataDSA.<locals>._check0  s"   ø€ ð �O‰O˜DŸN™N×1Ñ1°#°ÓGÕHr   )r$   ru   r1   rv   r&   rP   rQ   r�   s   `  r   Útest_signDataDSAÚ+AgentIdentityRequestsTests.test_signDataDSA(  sM   ø€ ð
 �K‰K× Ñ  §¡×!4Ñ!4Ó!6¸ÓHˆØ�	‰	�‰Ôõ	Ið �}‰}˜VÓ$Ð$r   c                 ó<  • U R                   R                  R                  U R                  R	                  5       	 U R
                  R                  U R                  R	                  5       S5      nU R                  R                  5         U R                  U[        5      $ )zU
Assert that we get an errback if we try to sign data using a key that
wasn't added.
rt   )r%   r'   r   r/   rv   r$   ru   r&   rP   rw   r   rW   s     r   Ú$test_signDataRSAErrbackOnUnknownBlobÚ?AgentIdentityRequestsTests.test_signDataRSAErrbackOnUnknownBlob8  sm   € ð
 �K‰K×Ñ×$Ñ$ T§^¡^×%8Ñ%8Ó%:Ð;Ø�K‰K× Ñ  §¡×!4Ñ!4Ó!6¸ÓHˆØ�	‰	�‰ÔØ×!Ñ! !¤ZÓ0Ð0r   c                 óš   ^ • T R                   R                  5       nT R                  R                  5         U 4S jnUR	                  U5      $ )ze
Assert that we get all of the keys/comments that we add when we issue a
request for all identities.
c                 ó   >• 0 nSUTR                   R                  5       '   SUTR                  R                  5       '   0 nU  H8  nUS   U[        R                  R                  US   SS9R                  5       '   M:     TR                  X5        g )Nr´   rµ   r9   r   rv   )Útype)r1   rv   r/   r   r(   r)   rH   )Úkeytr¿   ÚreceivedÚkr   s       €r   r‰   ÚAAgentIdentityRequestsTests.test_requestIdentities.<locals>._checkJ  s‚   ø€ ØˆHØ.:ˆH�T—^‘^×(Ñ(Ó*Ñ+Ø.@ˆH�T—^‘^×(Ñ(Ó*Ñ+àˆHÛ�ØJKÈAÉ$�œŸ™×,Ñ,¨Q¨q©T¸Ð,Ð?×DÑDÓFÓGñ à×Ñ˜XÕ0r   )r$   r{   r&   rP   rQ   r�   s   `  r   Útest_requestIdentitiesÚ1AgentIdentityRequestsTests.test_requestIdentitiesB  s;   ø€ ð
 �K‰K×)Ñ)Ó+ˆØ�	‰	�‰Ôõ	1ð �}‰}˜VÓ$Ð$r   r   N)r   r   r   r   r   r2   rÀ   rÆ   rÉ   rÒ   r   r   r   r   r±   r±     s!   † ñò	
òKò%ò 1õ%r   r±   c                   ó0   • \ rS rSrSrS rS rS rS rSr	g)	ÚAgentKeyRemovalTestsiW  z4
Test support for removing keys in a remote server.
c                 óJ  • [         R                  U 5        U R                  S4U R                  R                  R
                  U R                  R                  5       '   U R                  S4U R                  R                  R
                  U R                  R                  5       '   g r³   r¶   r   s    r   r2   ÚAgentKeyRemovalTests.setUp\  r¸   r   c                 óÌ   ^ • T R                   R                  T R                  R                  5       5      nT R                  R                  5         U 4S jnUR                  U5      $ )z,
Assert that we can remove an RSA identity.
c                 ó˜  >• TR                  S[        TR                  R                  R                  5      5        TR                  TR                  R                  5       TR                  R                  R                  5        TR                  TR                  R                  5       TR                  R                  R                  5        g ©Nr9   )
rH   Úlenr%   r'   r   ÚassertInr-   rv   ÚassertNotInr+   ©r‡   r   s    €r   r‰   Ú;AgentKeyRemovalTests.test_removeRSAIdentity.<locals>._checko  s€   ø€ Ø×Ñ˜Q¤ D§K¡K×$7Ñ$7×$<Ñ$<Ó =Ô>Ø�M‰M˜$Ÿ/™/×.Ñ.Ó0°$·+±+×2EÑ2E×2JÑ2JÔKØ×Ñ˜TŸ_™_×1Ñ1Ó3°T·[±[×5HÑ5H×5MÑ5MÕNr   )r$   ÚremoveIdentityr+   rv   r&   rP   rQ   r�   s   `  r   Útest_removeRSAIdentityÚ+AgentKeyRemovalTests.test_removeRSAIdentityg  sK   ø€ ð
 �K‰K×&Ñ& t§¡×';Ñ';Ó'=Ó>ˆØ�	‰	�‰Ôõ	Oð
 �}‰}˜VÓ$Ð$r   c                 óÌ   ^ • T R                   R                  T R                  R                  5       5      nT R                  R                  5         U 4S jnUR                  U5      $ )z+
Assert that we can remove a DSA identity.
c                 ó  >• TR                  S[        TR                  R                  R                  5      5        TR                  TR                  R                  5       TR                  R                  R                  5        g rÚ   )rH   rÛ   r%   r'   r   rÜ   r+   rv   rÞ   s    €r   r‰   Ú;AgentKeyRemovalTests.test_removeDSAIdentity.<locals>._check~  sS   ø€ Ø×Ñ˜Q¤ D§K¡K×$7Ñ$7×$<Ñ$<Ó =Ô>Ø�M‰M˜$Ÿ/™/×.Ñ.Ó0°$·+±+×2EÑ2E×2JÑ2JÕKr   )r$   rà   r-   rv   r&   rP   rQ   r�   s   `  r   Útest_removeDSAIdentityÚ+AgentKeyRemovalTests.test_removeDSAIdentityv  sK   ø€ ð
 �K‰K×&Ñ& t§¡×';Ñ';Ó'=Ó>ˆØ�	‰	�‰Ôõ	Lð �}‰}˜VÓ$Ð$r   c                 óš   ^ • T R                   R                  5       nT R                  R                  5         U 4S jnUR	                  U5      $ )z+
Assert that we can remove all identities.
c                 óx   >• TR                  S[        TR                  R                  R                  5      5        g )Nr   )rH   rÛ   r%   r'   r   rÞ   s    €r   r‰   Ú=AgentKeyRemovalTests.test_removeAllIdentities.<locals>._check‹  s(   ø€ Ø×Ñ˜Q¤ D§K¡K×$7Ñ$7×$<Ñ$<Ó =Õ>r   )r$   ÚremoveAllIdentitiesr&   rP   rQ   r�   s   `  r   Útest_removeAllIdentitiesÚ-AgentKeyRemovalTests.test_removeAllIdentities„  s;   ø€ ð �K‰K×+Ñ+Ó-ˆØ�	‰	�‰Ôõ	?ð �}‰}˜VÓ$Ð$r   r   N)
r   r   r   r   r   r2   rá   ræ   rì   r   r   r   r   rÕ   rÕ   W  s   † ñò	
ò%ò%õ
%r   rÕ   )r   r:   Útwisted.testr   Útwisted.trialr   ÚcryptographyÚ_cryptographyÚImportErrorÚtwisted.conch.sshr   Ú_agentr   Ú_keysÚtwisted.conch.errorr   r   Útwisted.conch.testr	   r   ÚTestCaser   r6   rD   r"   r_   ro   r   r¬   r±   rÕ   r   r   r   Ú<module>rù      s  ðñó å Ý "ð!Û(ð !€Lð ß@ð ˜€K€Dˆ%ç @Ý &÷ñ ôH�H×%Ñ%ô Hô4O¨]ô Oô$4¨ô $4ðN 	Ñô(˜×,Ñ,ô (ô 1 -ô  1ôFS%˜Mô S%ôl1˜mô 1ôI% ô I%ôX7%˜=õ 7%øðQ
 ó Ø‚Lðûð ó ØÐ€DŠ5ðús"   ”B; ›C	 Â;CÃCÃ	
CÃC