Ë
    ojð0  ã                   óz  — d dd Z ddlmZ ddlmZ  G d„ d«      Z G d„ d	«      Z G d
„ de«      Z G d„ dej                  «      Z	 G d„ d«      Z
 G d„ d«      Z G d„ de
ej                  «      Z G d„ de
ej                  «      Z G d„ deej                  «      Z G d„ deej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ d«      Z G d „ d!eej                  «      Z G d"„ d#eej                  «      Z G d$„ d%ej                  «      Z G d&„ d'ej                  «      Zy())z$Revision: 1.5 $é   éþÿÿÿé    )Úpcp)Úunittestc                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚDummyTransportz A dumb transport to wrap around.c                 ó   — g | _         y ©N)Ú_writes©Úselfs    ú7/usr/lib/python3/dist-packages/twisted/test/test_pcp.pyÚ__init__zDummyTransport.__init__%   s	   € Øˆ�ó    c                 ó:   — | j                   j                  |«       y r
   )r   Úappend©r   Údatas     r   ÚwritezDummyTransport.write(   s   € Ø�‰×Ñ˜DÕ!r   c                 ó8   — dj                  | j                  «      S )NÚ )Újoinr   r   s    r   ÚgetvaluezDummyTransport.getvalue+   s   € Ø�w‰w�t—|‘|Ó$Ð$r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   © r   r   r   r   "   s   „ Ù*òò"ó%r   r   c                   ó0   — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	y)ÚDummyProducerFc                 ó   — || _         y r
   )Úconsumer)r   r"   s     r   r   zDummyProducer.__init__4   s	   € Ø ˆ�r   c                 ó    — d| _         d| _        y )NTF)ÚresumedÚpausedr   s    r   ÚresumeProducingzDummyProducer.resumeProducing7   s   € ØˆŒØˆ�r   c                 ó   — d| _         y ©NT)r%   r   s    r   ÚpauseProducingzDummyProducer.pauseProducing;   s	   € Øˆ�r   c                 ó   — d| _         y r(   )Ústoppedr   s    r   ÚstopProducingzDummyProducer.stopProducing>   s	   € Øˆ�r   N)
r   r   r   r$   r+   r%   r   r&   r)   r,   r   r   r   r    r    /   s%   „ Ø€GØ€GØ€Fò!òòór   r    c                   ó*   — e Zd ZdZdZdZd„ Zd„ Zd„ Zy)ÚDummyConsumerNFTc                 ó   — ||f| _         y r
   )Úproducer)r   r0   Ú	streamings      r   ÚregisterProducerzDummyConsumer.registerProducerG   s   € Ø! 9Ð-ˆ�r   c                 ó   — d| _         y r(   )Úunregisteredr   s    r   ÚunregisterProducerz DummyConsumer.unregisterProducerJ   s
   € Ø ˆÕr   c                 ó   — d| _         y r(   )Úfinishedr   s    r   ÚfinishzDummyConsumer.finishM   s	   € Øˆ�r   )	r   r   r   r0   r7   r4   r2   r5   r8   r   r   r   r.   r.   B   s    „ Ø€HØ€HØ€Lò.ò!ór   r.   c                   ó0   — e Zd Zej                  Zd„ Zd„ Zy)ÚTransportInterfaceTestsc                 ób   — t        «       | _        | j                  | j                  «      | _        y r
   )r.   Ú
underlyingÚ
proxyClassÚ	transportr   s    r   ÚsetUpzTransportInterfaceTests.setUpT   s   € Ü'›/ˆŒØŸ™¨¯©Ó9ˆ�r   c                 ó:   — | j                   j                  d«       y ©Nz
some bytes)r>   r   r   s    r   Ú	testWritez!TransportInterfaceTests.testWriteX   s   € Ø�‰×Ñ˜\Õ*r   N)r   r   r   r   ÚBasicProducerConsumerProxyr=   r?   rB   r   r   r   r:   r:   Q   s   „ Ø×/Ñ/€Jò:ó+r   r:   c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚConsumerInterfaceTestzõTest ProducerConsumerProxy as a Consumer.

    Normally we have ProducingServer -> ConsumingTransport.

    If I am to go between (Server -> Shaper -> Transport), I have to
    play the role of Consumer convincingly for the ProducingServer.
    c                 ó–   — t        «       | _        | j                  | j                  «      | _        t	        | j                  «      | _        y r
   )r.   r<   r=   r"   r    r0   r   s    r   r?   zConsumerInterfaceTest.setUpe   s/   € Ü'›/ˆŒØŸ™¨¯©Ó8ˆŒÜ% d§m¡mÓ4ˆ�r   c                 óš   — | j                   j                  | j                  d«       | j                  | j                  j                  «       y r(   )r"   r2   r0   ÚassertFalser$   r   s    r   ÚtestRegisterPushz&ConsumerInterfaceTest.testRegisterPushj   s2   € Ø�‰×&Ñ& t§}¡}°dÔ;à×Ñ˜Ÿ™×.Ñ.Õ/r   c                 ó$  — | j                   j                  | j                  d«       | j                   j                  «        d| j                  _        | j                   j                  «        | j                  | j                  j                  «       y ©NF)r"   r2   r0   r5   r$   r&   rH   r   s    r   ÚtestUnregisterz$ConsumerInterfaceTest.testUnregisterv   s`   € Ø�‰×&Ñ& t§}¡}°eÔ<Ø�‰×(Ñ(Ô*ð
 !&ˆ�‰ÔØ�‰×%Ñ%Ô'Ø×Ñ˜Ÿ™×.Ñ.Õ/r   c                 ó$  — | j                   j                  | j                  d«       | j                   j                  «        d| j                  _        | j                   j                  «        | j                  | j                  j                  «       y rK   )r"   r2   r0   r8   r$   r&   rH   r   s    r   Ú
testFinishz ConsumerInterfaceTest.testFinish�   s^   € Ø�‰×&Ñ& t§}¡}°eÔ<Ø�‰×ÑÔà %ˆ�‰ÔØ�‰×%Ñ%Ô'Ø×Ñ˜Ÿ™×.Ñ.Õ/r   N)r   r   r   r   r?   rI   rL   rN   r   r   r   rE   rE   \   s   „ ñò5ò
0ò	0ó0r   rE   c                   ó:   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
y	)
ÚProducerInterfaceTestzøTest ProducerConsumerProxy as a Producer.

    Normally we have ProducingServer -> ConsumingTransport.

    If I am to go between (Server -> Shaper -> Transport), I have to
    play the role of Producer convincingly for the ConsumingTransport.
    c                 ób   — t        «       | _        | j                  | j                  «      | _        y r
   )r.   r"   r=   r0   r   s    r   r?   zProducerInterfaceTest.setUp“   s   € Ü%›ˆŒØŸ™¨¯©Ó6ˆ�r   c                 ój   — | j                  | j                  j                  d   | j                  «       y )Nr   )ÚassertEqualr"   r0   r   s    r   ÚtestRegistersProducerz+ProducerInterfaceTest.testRegistersProducer—   s%   € Ø×Ñ˜Ÿ™×/Ñ/°Ñ2°D·M±MÕBr   c                 óÂ   — | j                   j                  «        | j                   j                  d«       | j                  | j                  j                  «       d«       y )Núyakkity yakz*Paused producer should not have sent data.)r0   r)   r   rH   r"   r   r   s    r   Ú	testPausezProducerInterfaceTest.testPauseš   sE   € Ø�‰×$Ñ$Ô&Ø�‰×Ñ˜MÔ*Ø×ÑØ�M‰M×"Ñ"Ó$Ð&Rõ	
r   c                 óö   — | j                   j                  «        | j                   j                  «        | j                   j                  d«       | j	                  | j
                  j                  «       d«       y )NrV   )r0   r)   r&   r   rS   r"   r   r   s    r   Ú
testResumez ProducerInterfaceTest.testResume¡   sQ   € Ø�‰×$Ñ$Ô&Ø�‰×%Ñ%Ô'Ø�‰×Ñ˜MÔ*Ø×Ñ˜Ÿ™×/Ñ/Ó1°=ÕAr   c                 óÌ   — | j                   j                  «        | j                   j                  «        | j                  t	        | j
                  j                  «      dd«       y )Nr   z Resume triggered an empty write.)r0   r)   r&   rS   Úlenr"   r   r   s    r   ÚtestResumeNoEmptyWritez,ProducerInterfaceTest.testResumeNoEmptyWrite§   sG   € Ø�‰×$Ñ$Ô&Ø�‰×%Ñ%Ô'Ø×ÑÜ�—‘×%Ñ%Ó&¨Ð+Mõ	
r   c                 óö   — | j                   j                  «        | j                   j                  d«       | j                   j                  «        | j	                  | j
                  j                  «       d«       y )Nzbuffer this)r0   r)   r   r&   rS   r"   r   r   s    r   ÚtestResumeBufferz&ProducerInterfaceTest.testResumeBuffer®   sQ   € Ø�‰×$Ñ$Ô&Ø�‰×Ñ˜MÔ*Ø�‰×%Ñ%Ô'Ø×Ñ˜Ÿ™×/Ñ/Ó1°=ÕAr   c                 óÂ   — | j                   j                  «        | j                   j                  d«       | j                  | j                  j                  «       d«       y )NrV   z+Stopped producer should not have sent data.)r0   r,   r   rH   r"   r   r   s    r   ÚtestStopzProducerInterfaceTest.testStop´   sE   € Ø�‰×#Ñ#Ô%Ø�‰×Ñ˜MÔ*Ø×ÑØ�M‰M×"Ñ"Ó$Ð&Sõ	
r   N)r   r   r   r   r?   rT   rW   rY   r\   r^   r`   r   r   r   rP   rP   Š   s-   „ ñò7òCò
òBò
òBó
r   rP   c                   ó$   — e Zd Zej                  Zy)ÚPCP_ConsumerInterfaceTestsN©r   r   r   r   rC   r=   r   r   r   rb   rb   ¼   ó   „ Ø×/Ñ/�Jr   rb   c                   ó$   — e Zd Zej                  Zy)ÚPCPII_ConsumerInterfaceTestsN©r   r   r   r   ÚProducerConsumerProxyr=   r   r   r   rf   rf   À   ó   „ Ø×*Ñ*�Jr   rf   c                   ó$   — e Zd Zej                  Zy)ÚPCP_ProducerInterfaceTestsNrc   r   r   r   rk   rk   Ä   rd   r   rk   c                   ó$   — e Zd Zej                  Zy)ÚPCPII_ProducerInterfaceTestsNrg   r   r   r   rm   rm   È   ri   r   rm   c                   ó4   — e Zd ZdZej
                  Zd„ Zd„ Zy)ÚProducerProxyTestszAProducer methods on me should be relayed to the Producer I proxy.c                 ó°   — | j                  d «      | _        t        | j                  «      | _        | j                  j	                  | j                  d«       y r(   )r=   Úproxyr    ÚparentProducerr2   r   s    r   r?   zProducerProxyTests.setUpÑ   s=   € Ø—_‘_ TÓ*ˆŒ
Ü+¨D¯J©JÓ7ˆÔØ�
‰
×#Ñ# D×$7Ñ$7¸Õ>r   c                 ó‚   — | j                   j                  «        | j                  | j                  j                  «       y r
   )rq   r,   Ú
assertTruerr   r+   r   s    r   r`   zProducerProxyTests.testStopÖ   s*   € Ø�
‰
× Ñ Ô"Ø�‰˜×+Ñ+×3Ñ3Õ4r   N)	r   r   r   r   r   rC   r=   r?   r`   r   r   r   ro   ro   Ì   s   „ ÙKà×/Ñ/€Jò?ó
5r   ro   c                   ó@   — e Zd ZdZej
                  Zd„ Zd„ Zd„ Z	d„ Z
y)ÚConsumerProxyTestszAConsumer methods on me should be relayed to the Consumer I proxy.c                 ób   — t        «       | _        | j                  | j                  «      | _        y r
   )r.   r<   r=   r"   r   s    r   r?   zConsumerProxyTests.setUpà   s   € Ü'›/ˆŒØŸ™¨¯©Ó8ˆ�r   c                 óŽ   — | j                   j                  d«       | j                  | j                  j	                  «       d«       y rA   )r"   r   rS   r<   r   r   s    r   rB   zConsumerProxyTests.testWriteä   s1   € à�‰×Ñ˜LÔ)Ø×Ñ˜Ÿ™×1Ñ1Ó3°\ÕBr   c                 ó‚   — | j                   j                  «        | j                  | j                  j                  «       y r
   )r"   r8   rt   r<   r7   r   s    r   rN   zConsumerProxyTests.testFinishé   s(   € Ø�‰×ÑÔØ�‰˜Ÿ™×0Ñ0Õ1r   c                 ó‚   — | j                   j                  «        | j                  | j                  j                  «       y r
   )r"   r5   rt   r<   r4   r   s    r   rL   z!ConsumerProxyTests.testUnregisterí   s(   € Ø�‰×(Ñ(Ô*Ø�‰˜Ÿ™×4Ñ4Õ5r   N)r   r   r   r   r   rC   r=   r?   rB   rN   rL   r   r   r   rv   rv   Û   s%   „ ÙKà×/Ñ/€Jò9òCò
2ó6r   rv   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚPullProducerTestc                 óâ   — t        «       | _        | j                  | j                  «      | _        t	        | j                  «      | _        | j                  j                  | j
                  d«       y r(   )r.   r<   r=   rq   r    rr   r2   r   s    r   r?   zPullProducerTest.setUpó   sJ   € Ü'›/ˆŒØ—_‘_ T§_¡_Ó5ˆŒ
Ü+¨D¯J©JÓ7ˆÔØ�
‰
×#Ñ# D×$7Ñ$7¸Õ>r   c                 óŽ   — | j                   j                  d«       | j                  | j                  j	                  «       d«       y )NÚhelloz+Pulling Consumer got data before it pulled.)rq   r   rH   r<   r   r   s    r   ÚtestHoldWriteszPullProducerTest.testHoldWritesù   s5   € Ø�
‰
×Ñ˜Ô!à×ÑØ�O‰O×$Ñ$Ó&Ð(Uõ	
r   c                 óÂ   — | j                   j                  d«       | j                   j                  «        | j                  | j                  j                  «       d«       y )Nr   )rq   r   r&   rS   r<   r   r   s    r   ÚtestPullzPullProducerTest.testPull   sA   € Ø�
‰
×Ñ˜Ô!Ø�
‰
×"Ñ"Ô$Ø×Ñ˜Ÿ™×1Ñ1Ó3°WÕ=r   c                 ód  — | j                   j                  d«       | j                   j                  d«       | j                   j                  «        t        | j                  j
                  «      }| j                  |dd|fz  «       | j                  | j                  j                  «       d«       y )Nzhello Úsunshineé   z(Pull resulted in %d writes instead of 1.zhello sunshine)rq   r   r&   r[   r<   r   rS   r   )r   Únwritess     r   ÚtestMergeWritesz PullProducerTest.testMergeWrites  s‡   € Ø�
‰
×Ñ˜Ô"Ø�
‰
×Ñ˜Ô$Ø�
‰
×"Ñ"Ô$Ü�d—o‘o×-Ñ-Ó.ˆØ×ÑØ�QÐEÈÈ
ÑRô	
ð 	×Ñ˜Ÿ™×1Ñ1Ó3Ð5EÕFr   c                 óÂ   — | j                   j                  «        | j                   j                  d«       | j                  | j                  j                  «       d«       y )Nr   )rq   r&   r   rS   r<   r   r   s    r   ÚtestLateWritezPullProducerTest.testLateWrite  sA   € à�
‰
×"Ñ"Ô$Ø�
‰
×Ñ˜Ô à×Ñ˜Ÿ™×1Ñ1Ó3°VÕ<r   N)r   r   r   r?   r€   r‚   r‡   r‰   r   r   r   r|   r|   ò   s   „ ò?ò
ò>ò
Gó=r   r|   c                   ó6   — e Zd Z G d„ dej                  «      Zy)ÚPCP_PullProducerTestsc                   ó   — e Zd ZdZy)ú PCP_PullProducerTests.proxyClassFN©r   r   r   ÚiAmStreamingr   r   r   r=   r�     ó   „ Ø‰r   r=   Nrc   r   r   r   r‹   r‹     s   „ ô�S×3Ñ3õ r   r‹   c                   ó6   — e Zd Z G d„ dej                  «      Zy)ÚPCPII_PullProducerTestsc                   ó   — e Zd ZdZy)ú"PCPII_PullProducerTests.proxyClassFNrŽ   r   r   r   r=   r”     r�   r   r=   Nrg   r   r   r   r’   r’     s   „ ô�S×.Ñ.õ r   r’   c                   óL   — e Zd ZdZej
                  Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zy)	ÚBufferedConsumerTestsz=As a consumer, ask the producer to pause after too much data.c                 ó  — t        «       | _        | j                  | j                  «      | _        d| j                  _        t        | j                  «      | _        | j                  j                  | j                  d«       y )Néd   T©r.   r<   r=   rq   Ú
bufferSizer    rr   r2   r   s    r   r?   zBufferedConsumerTests.setUp)  sV   € Ü'›/ˆŒØ—_‘_ T§_¡_Ó5ˆŒ
Ø #ˆ�
‰
Ôä+¨D¯J©JÓ7ˆÔØ�
‰
×#Ñ# D×$7Ñ$7¸Õ>r   c                 óš   — | j                   j                  | j                  d«       | j                  | j                  j                  «       y rK   )rq   r2   rr   rt   r$   r   s    r   ÚtestRegisterPullz&BufferedConsumerTests.testRegisterPull1  s4   € Ø�
‰
×#Ñ# D×$7Ñ$7¸Ô?à�‰˜×+Ñ+×3Ñ3Õ4r   c                 ó‚   — | j                   j                  «        | j                  | j                  j                  «       y r
   )rq   r)   rH   rr   r%   r   s    r   ÚtestPauseInterceptz(BufferedConsumerTests.testPauseIntercept6  s,   € Ø�
‰
×!Ñ!Ô#Ø×Ñ˜×,Ñ,×3Ñ3Õ4r   c                 ó¶   — | j                   j                  «        | j                   j                  «        | j                  | j                  j
                  «       y r
   )rq   r)   r&   rH   rr   r$   r   s    r   ÚtestResumeInterceptz)BufferedConsumerTests.testResumeIntercept:  s>   € Ø�
‰
×!Ñ!Ô#Ø�
‰
×"Ñ"Ô$ð 	×Ñ˜×,Ñ,×4Ñ4Õ5r   c                 ó†  — | j                   j                  «        | j                  | j                  j                  d«       | j                   j                  d«       | j                  | j                  j                  d«       | j                   j                  d«       | j                  | j                  j                  «       y)zMake sure I say "when." zdon't pause yetÚ3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxN)rq   r)   rH   rr   r%   r   rt   r   s    r   ÚtestTriggerPausez&BufferedConsumerTests.testTriggerPauseB  sŠ   € ð 	�
‰
×!Ñ!Ô#Ø×Ñ˜×,Ñ,×3Ñ3Ð5FÔGØ�
‰
×Ñ˜Ô"Ø×Ñ˜×,Ñ,×3Ñ3Ð5FÔGØ�
‰
×Ñ˜Ô"Ø�‰˜×+Ñ+×2Ñ2Õ3r   c                 ó„  — | j                   j                  «        | j                   j                  d«       | j                  | j                  j
                  d«       | j                   j                  «        | j                  | j                  j
                  d«       | j                  | j                   j                  «       y)z3Make sure I resumeProducing when my buffer empties.Úfxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzshould be pausedzProducer should have resumed.N)	rq   r)   r   rt   rr   r%   r&   rH   ÚproducerPausedr   s    r   ÚtestTriggerResumez'BufferedConsumerTests.testTriggerResumeM  s†   € à�
‰
×!Ñ!Ô#Ø�
‰
×Ñ˜Ô#Ø�‰˜×+Ñ+×2Ñ2Ð4FÔGØ�
‰
×"Ñ"Ô$ð 	×Ñ˜×,Ñ,×3Ñ3Ð5TÔUØ×Ñ˜Ÿ™×2Ñ2Õ3r   N)r   r   r   r   r   rh   r=   r?   rœ   rž   r    r£   r§   r   r   r   r–   r–   $  s.   „ ÙGà×*Ñ*€Jò?ò5ò
5ò6ò	4ó	4r   r–   c                   óH   — e Zd Z G d„ dej                  «      Zd„ Zd„ Zd„ Zy)ÚBufferedPullTestsc                   ó   — e Zd ZdZd„ Zy)úBufferedPullTests.proxyClassFc                 ór   — t         j                  j                  | |d d «       t        t	        |«      d«      S )Nr˜   )r   rh   Ú_writeSomeDataÚminr[   r   s     r   r­   z+BufferedPullTests.proxyClass._writeSomeData]  s/   € Ü×%Ñ%×4Ñ4°T¸4ÀÀ¸:ÔFÜ”s˜4“y #Ó&Ð&r   N)r   r   r   r�   r­   r   r   r   r=   r«   Z  s   „ Øˆó	'r   r=   c                 ó  — t        «       | _        | j                  | j                  «      | _        d| j                  _        t        | j                  «      | _        | j                  j                  | j                  d«       y )Nr˜   Fr™   r   s    r   r?   zBufferedPullTests.setUpa  sV   € Ü'›/ˆŒØ—_‘_ T§_¡_Ó5ˆŒ
Ø #ˆ�
‰
Ôä+¨D¯J©JÓ7ˆÔØ�
‰
×#Ñ# D×$7Ñ$7¸Õ?r   c                 ó¤   — d| j                   _        | j                  j                  «        | j	                  | j                   j                  «       y rK   )rr   r$   rq   r&   rt   r   s    r   ÚtestResumePullz BufferedPullTests.testResumePulli  s:   € ð ',ˆ×ÑÔ#Ø�
‰
×"Ñ"Ô$Ø�‰˜×+Ñ+×3Ñ3Õ4r   c                 ó  — | j                   j                  «        | j                   j                  d«       | j                  | j                  j                  «       d«       | j                  | j                   j                  dg«       y )NÚidatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumÚddatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumdatumÚdatum)rq   r&   r   rS   r<   r   Ú_bufferr   s    r   ÚtestLateWriteBufferingz(BufferedPullTests.testLateWriteBufferingp  s]   € à�
‰
×"Ñ"Ô$Ø�
‰
×Ñ˜Ô&à×Ñ˜Ÿ™×1Ñ1Ó3°\ÔBà×Ñ˜Ÿ™×+Ñ+¨g¨YÕ7r   N)	r   r   r   r   rh   r=   r?   r±   r·   r   r   r   r©   r©   Y  s$   „ ô'�S×.Ñ.ô 'ò@ò5ó8r   r©   N)Ú__version__Útwisted.protocolsr   Útwisted.trialr   r   r    r.   ÚTestCaser:   rE   rP   rb   rf   rk   rm   ro   rv   r|   r‹   r’   r–   r©   r   r   r   ú<module>r¼      s3  ðð !  BÐ'€å !Ý "÷2
%ñ 
%÷ñ ô&�Nô ô+˜h×/Ñ/ô +÷+0ñ +0÷\/
ñ /
ôd0Ð!6¸×8IÑ8Iô 0ô+Ð#8¸(×:KÑ:Kô +ô0Ð!6¸×8IÑ8Iô 0ô+Ð#8¸(×:KÑ:Kô +ô5˜×*Ñ*ô 5ô6˜×*Ñ*ô 6÷."=ñ "=ôJÐ,¨h×.?Ñ.?ô ô
Ð.°×0AÑ0Aô ô24˜H×-Ñ-ô 24ôj8˜×)Ñ)õ 8r   