Ë
    ¬ŒjMÐ  ã                   ó¤  — d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlZd dlmZ	 ddl
mZ ddl
mZ ddl
mZ dd	l
mZ dd
l
mZ ddl
mZ ddlmZ ddlmZ ddlmZ ddlmZ  G d„ de«      Zd„ Zd„ Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Ze d k(  r ejB                  «        yy)!é    N)ÚABCMeta)Úabstractmethod)Úgreenleté   )ÚTestCase)ÚRUNNING_ON_MANYLINUX)ÚPY313)ÚPY314)ÚWIN)ÚRUNNING_ON_FREETHREAD_BUILD)Úfails_leakcheck)Ú fails_leakcheck_on_py314_or_less)Úignores_leakcheck)Úignores_leakcheck_ifc                   ó   — e Zd Zy)Ú	SomeErrorN©Ú__name__Ú
__module__Ú__qualname__© ó    úf/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.pyr   r   "   s   „ Ør   r   c                 óÀ   — 	 t        j                  «       j                  j                  «        t        ‚#  | j	                  t        j                  «       d   «       ‚ xY w©Nr   )r   Ú
getcurrentÚparentÚswitchÚappendÚsysÚexc_infor   ©Úseens    r   Úfmainr$   &   sJ   € ðÜ×ÑÓ×$Ñ$×+Ñ+Ô-ô €OøðØ�‰”C—L‘L“N 1Ñ%Ô&Øús	   ‚,4 ´)Ac                 óF   — d„ }t        || ¬«      }|j                  |«       y )Nc                 ó   — | ‚©Nr   )Úexcs    r   Úcrasherzsend_exception.<locals>.crasher2   s   € Øˆ	r   ©r   ©ÚRawGreenletr   )Úgr(   r)   Úg1s       r   Úsend_exceptionr/   /   s   € òä	�W QÔ	'€BØ‡I�Iˆc…Nr   c                   óò  — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zed
„ «       Zd„ Zd„ Zd„ Zd„ Z ej&                  exr ed«      d„ «       Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"e#d5d„«       Z$e# e%e&xr e'jP                  dd d k(  d!«      d"„ «       «       Z)d#„ Z*e+d$„ «       Z,d%„ Z-d&„ Z.d'„ Z/d(„ Z0d)„ Z1d*„ Z2 ej&                  exr ed+«      d,„ «       Z3d-„ Z4d.„ Z5d/„ Z6d0„ Z7d1„ Z8d2„ Z9d3„ Z:d4„ Z;y)6ÚTestGreenletc                 ó  ‡— g Šˆfd„}t        |«      }‰j                  d«       |j                  «        ‰j                  d«       |j                  «        ‰j                  d«       | j                  ‰t	        t        d«      «      «       y )Nc                  ó¢   •— ‰ j                  d«       t        j                  «       j                  j	                  «        ‰ j                  d«       y )Nr   é   ©r   r   r   r   r   ©Úlsts   €r   Úfz'TestGreenlet._do_simple_test.<locals>.f=   s4   ø€ Ø�J‰J�qŒMÜ×ÑÓ!×(Ñ(×/Ñ/Ô1Ø�J‰J�q�Mr   r   é   é   é   )r,   r   r   ÚassertEqualÚlistÚrange)Úselfr8   r-   r7   s      @r   Ú_do_simple_testzTestGreenlet._do_simple_test:   sc   ø€ Øˆô	ô ˜‹NˆØ�
‰
�1ŒØ	�‰Œ
Ø�
‰
�1ŒØ	�‰Œ
Ø�
‰
�1ŒØ×Ñ˜œd¤5¨£8›nÕ-r   c                 ó$   — | j                  «        y r'   )r@   ©r?   s    r   Útest_simplezTestGreenlet.test_simpleI   s   € Ø×ÑÕr   c                 óÖ   — t        «       }| j                  t        «      5 }|j                  «        d d d «       | j	                  dt        j                  «      «       y # 1 sw Y   Œ/xY w©NÚrun)r,   ÚassertRaisesÚAttributeErrorr   ÚassertInÚstrÚ	exception©r?   r-   r(   s      r   Ú(test_switch_no_run_raises_AttributeErrorz5TestGreenlet.test_switch_no_run_raises_AttributeErrorL   sI   € Ü‹MˆØ×Ñœ~Ô.°#Ø�H‰HŒJ÷ /ð 	�‰�eœS §¡Ó/Õ0÷ /Ð.ús    AÁA(c                 óà   — t        «       }| j                  t        «      5 }|j                  t        «       d d d «       | j                  dt        j                  «      «       y # 1 sw Y   Œ/xY wrE   )r,   rG   rH   Úthrowr   rI   rJ   rK   rL   s      r   Ú'test_throw_no_run_raises_AttributeErrorz4TestGreenlet.test_throw_no_run_raises_AttributeErrorS   sL   € Ü‹MˆØ×Ñœ~Ô.°#Ø�G‰G”IÔ÷ /ð 	�‰�eœS §¡Ó/Õ0÷ /Ð.ús    A$Á$A-c                 óš   — t        d ¬«      }| j                  |«       | j                  |j                  t	        j
                  «       «       y )Nr*   )r,   ÚassertIsNotNoneÚassertIsr   r   r   ©r?   r-   s     r   Útest_parent_equals_Nonez$TestGreenlet.test_parent_equals_NoneZ   s5   € Ü˜tÔ$ˆØ×Ñ˜QÔØ�‰�a—h‘h¤× 3Ñ 3Ó 5Õ6r   c                 ót   — t        d ¬«      }| j                  |«       | j                  |j                  «       y )N)rF   )r,   rR   ÚassertIsNonerF   rT   s     r   Útest_run_equals_Nonez!TestGreenlet.test_run_equals_None_   s,   € Ü˜DÔ!ˆØ×Ñ˜QÔØ×Ñ˜!Ÿ%™%Õ r   c                 ó  ‡— g Šˆfd„}t        |«      }t        |«      }|j                  «        | j                  t        ‰«      d«       |j                  «        | j                  t        ‰«      d«       |j                  «        | j                  t        ‰«      d«       | j                  |j                  d«       |j                  «        | j                  t        ‰«      d«       | j                  |j                  d«       y )Nc                  ó¦   •— ‰ j                  d«       t        j                  «       j                  j	                  «        ‰ j                  ddg«       y )Nr   )r   r   r   r   r   Úextendr6   s   €r   r8   z)TestGreenlet.test_two_children.<locals>.fg   s9   ø€ Ø�J‰J�qŒMÜ×ÑÓ!×(Ñ(×/Ñ/Ô1Ø�J‰J˜˜1�vÕr   r   r9   r:   Té   )r,   r   r<   ÚlenÚdead)r?   r8   r-   Úhr7   s       @r   Útest_two_childrenzTestGreenlet.test_two_childrend   s½   ø€ Øˆô	ô ˜‹NˆÜ˜‹NˆØ	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø×Ñ˜Ÿ™ Ô&Ø	�‰Œ
Ø×Ñœ˜S› 1Ô%Ø×Ñ˜Ÿ™ Õ&r   c                 ó˜  ‡‡— g Šˆfd„Šˆˆfd„}| j                  t        j                  |«      t        sdnd«       t	        |«      }| j                  t        j                  |«      t        sdnd«       |j                  «        | j                  ‰g d¢«       | j                  t        j                  |«      t        sd«       y d«       y )Nc                  ó€   •— ‰ j                  d«       t        j                  «       j                  j	                  «        y )NÚbr5   r6   s   €r   r8   z3TestGreenlet.test_two_recursive_children.<locals>.f{   s)   ø€ Ø�J‰J�sŒOÜ×ÑÓ!×(Ñ(×/Ñ/Õ1r   c                  ó€   •— ‰j                  d«       t        ‰«      } | j                  «        ‰j                  d«       y )NÚaÚc)r   r,   r   )r-   r8   r7   s    €€r   r-   z3TestGreenlet.test_two_recursive_children.<locals>.g   s+   ø€ Ø�J‰J�sŒOÜ˜A“ˆAØ�H‰HŒJØ�J‰J�s�Or   r9   r   )re   rc   rf   )r<   r    Úgetrefcountr
   r,   r   )r?   r-   r8   r7   s     @@r   Útest_two_recursive_childrenz(TestGreenlet.test_two_recursive_childrenx   s’   ù€ Øˆô	2õ	ð
 	×ÑœŸ™¨Ó+µe©QÀÔCÜ˜‹Nˆð 	×ÑœŸ™¨Ó+µe©QÀÔCØ	�‰Œ
Ø×Ñ˜šoÔ.à×ÑœŸ™¨Ó+µe¨QÕCÀÕCr   c                 ó   ‡ ‡— g Šˆ ˆfd„}t        d«      D �cg c]  }t        j                  |¬«      ‘Œ }}|D ]  }|j                  «        Œ |D ]  }|j	                  d«       Œ ‰ j                  t        ‰«      t        |«      «       y c c}w )Nc                  óH   •— ‰ j                  «        ‰j                  d«       y ©NT)r@   r   )r?   Úsuccesss   €€r   r8   z$TestGreenlet.test_threads.<locals>.f‘   s   ø€ Ø× Ñ Ô"Ø�N‰N˜4Õ r   é
   ©Útarget)r>   Ú	threadingÚThreadÚstartÚjoinr<   r]   )r?   r8   ÚiÚthsÚthrl   s   `    @r   Útest_threadszTestGreenlet.test_threadsŽ   sw   ù€ Øˆõ	!ô 49¸´9Ó=±9¨aŒy×Ñ qÖ)°9ˆÐ=ÛˆBØ�H‰H�Jð ãˆBØ�G‰G�B�Kð à×Ñœ˜W›¤s¨3£xÕ0ùò >s   ˜Bc                 óx   ‡‡— d„ Šd„ Šdˆˆfd„	}t        d«      D ]  } |«        t        j                  «        Œ y )Nc                 ó–   — d„ }t        j                   |«      }|j                  «        | j                  |«       |j                  «        y )Nc                  ó^   — 	 t        j                  «       j                  j                  «        Œ-r'   ©r   r   r   r   r   r   r   ÚbodyzPTestGreenlet.test_switching_many_threads.<locals>.creates_greenlet.<locals>.bodyŸ   s%   € ØÜ×'Ñ'Ó)×0Ñ0×7Ñ7Ô9ð r   )r   r   r   Úwait)Ú	greenletsÚwait_to_die_untilr|   r-   s       r   Úcreates_greenletzBTestGreenlet.test_switching_many_threads.<locals>.creates_greenletž   s<   € ò:ô ×!Ñ! $Ó'ˆAØ�H‰HŒJØ×Ñ˜QÔØ×"Ñ"Õ$r   c                 óô   — |j                  «        |j                  «       s?t        | «      D ]  }	 |j                  s|j	                  «        Œ! |j                  «       sŒ>y y # t
        j                  $ r Y ŒJw xY wr'   )r}   Úis_setr=   r^   r   r   Úerror)r~   Úwait_to_check_untilÚ
quit_afterr-   s       r   Úswitches_from_other_threadzLTestGreenlet.test_switching_many_threads.<locals>.switches_from_other_thread§   sf   € Ø×$Ñ$Ô&Ø ×'Ñ'Ô)Ü˜iž�AðØ ŸvšvØŸH™HœJøð )ð !×'Ñ'×)øô
 $Ÿ>™>ò ñ ðús   °A!Á!A7Á6A7c           	      ód  •— g }t        j                  «       }t        j                  «       }t        | «      D �cg c]  }t        j                  ‰||f¬«      ‘Œ }}t        | «      D �cg c]  }t        j                  ‰	|||f¬«      ‘Œ }}||z   D ]  }|j	                  «        Œ t        |«      | k  r$t        j                  d«       t        |«      | k  rŒ$|j                  «        |D ]  }|j                  d«       Œ |j                  «        |D ]  }|j                  d«       Œ y c c}w c c}w )N©ro   Úargsg-Cëâ6?g      ð?)
rp   ÚEventr>   rq   rr   r]   ÚtimeÚsleepÚsetrs   )
Úthread_countr~   Úgreenlets_all_createdÚall_threads_deadÚ_ÚcreatorsÚ	switchersÚtr€   r†   s
           €€r   Úrun_itz8TestGreenlet.test_switching_many_threads.<locals>.run_it³   sC  ø€ ØˆIÜ$-§O¡OÓ$5Ð!Ü(Ÿ™Ó0Ðô ˜Ô&ó	ñ 'ð ô × Ñ Ð(8À	Ø@Uð@Wö Xð 'ð	 ð ô ˜Ô&óñ
 'ð ô × Ñ Ð(BØ'0Ð2GØ'7ð'9ö:ð 'ð ð ð  Ô*�Ø—‘•	ð +ô �i“. <Ò/Ü—
‘
˜6Ô"ô �i“. <Ó/à!×%Ñ%Ô'ã�Ø—‘�s•ð à× Ñ Ô"Û�Ø—‘�s•ñ ùò5ùòs   ¹ D(Á(!D-é   )é   )r>   ÚgcÚcollect)r?   r•   r‘   r€   r†   s      @@r   Útest_switching_many_threadsz(TestGreenlet.test_switching_many_threads›   s1   ù€ ò	%ò
	ö 	ôH �r–ˆAÙŒHÜ�J‰J�Lñ r   c                 ó  — g }t        t        «      }t        t        «      }|j                  |«       |j                  |«       ||_        | j	                  |g «       | j                  t        |j                  «       | j	                  |t        g«       |j                  «       }| j	                  |d«       | j	                  |t        g«       |j                  d«      }| j	                  |d«       | j	                  |t        g«       y )Nr   é   )r,   r$   r   r   r<   rG   r   )r?   r#   r.   Úg2Úvalues        r   Útest_exceptionzTestGreenlet.test_exceptionÛ   sÌ   € ØˆÜœÓˆÜœÓˆØ
�	‰	�$ŒØ
�	‰	�$ŒØˆŒ	à×Ñ˜˜rÔ"ð 	×Ñœ) R§Y¡YÔ/Ø×Ñ˜¤	˜{Ô+à—	‘	“ˆØ×Ñ˜ Ô#Ø×Ñ˜¤	˜{Ô+à—	‘	˜"“ˆØ×Ñ˜ Ô#Ø×Ñ˜¤	˜{Õ+r   c                 ó¶   — g }t        t        «      }|j                  |«       | j                  t        t
        |t        «       | j                  |t        g«       y r'   )r,   r$   r   rG   ÚKeyErrorr/   r<   )r?   r#   r.   s      r   Útest_send_exceptionz TestGreenlet.test_send_exception÷   sB   € ØˆÜœÓˆØ
�	‰	�$ŒØ×Ñœ(¤N°B¼ÔAØ×Ñ˜¤˜zÕ*r   c                 ó¢  — g }t        t        «      }t        t        «      }|j                  |«       |j                  |«       | j                  |g «       ~t	        j
                  «        | j                  |t        j                  g«       ~t	        j
                  «        | j                  |t        j                  t        j                  g«       y r'   )r,   r$   r   r<   r˜   r™   r   ÚGreenletExit)r?   r#   r.   r�   s       r   Útest_dealloczTestGreenlet.test_deallocþ   s“   € ØˆÜœÓˆÜœÓˆØ
�	‰	�$ŒØ
�	‰	�$ŒØ×Ñ˜˜rÔ"ØÜ
�
‰
ŒØ×Ñ˜¤× 5Ñ 5Ð6Ô7ØÜ
�
‰
ŒØ×Ñ˜¤× 5Ñ 5´x×7LÑ7LÐMÕNr   c                 ó<  ‡— d„ }t        |«      }|j                  «        g Št        j                  }ˆfd„}|t        _        	 ~|t        _        | j	                  t        ‰«      d«       | j                  ‰d   j                  t        «       y # |t        _        w xY w)Nc                  óš   — 	 t        j                  «       j                  j                  «        y # t         j                  $ r t
        d ‚w xY wr'   )r   r   r   r   r¤   r   r   r   r   rF   zHTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>.run  s?   € ð*Ü×#Ñ#Ó%×,Ñ,×3Ñ3Õ5øÜ×(Ñ(ò *Ü TÐ)ð*ús	   ‚,/ ¯A
c                 ó(   •— ‰j                  | «       y r'   ©r   )Ú
unraisableÚunraisable_eventss    €r   Ú_capturezMTestGreenlet.test_dealloc_catches_GreenletExit_throws_other.<locals>._capture  s   ø€ Ø×$Ñ$ ZÕ0r   r   r   )	r,   r   r    Úunraisablehookr<   r]   ÚassertIsInstanceÚ	exc_valuer   )r?   rF   r-   Úold_hookr¬   r«   s        @r   Ú.test_dealloc_catches_GreenletExit_throws_otherz;TestGreenlet.test_dealloc_catches_GreenletExit_throws_other  s‰   ø€ ò	*ô ˜ÓˆØ	�‰Œ
àÐÜ×%Ñ%ˆô	1à%ŒÔð	*Øà!)ŒCÔà×ÑœÐ.Ó/°Ô3Ø×ÑÐ/°Ñ2×<Ñ<¼iÕHøð "*ŒCÕús   ÁB ÂBz=Sometimes flaky (getting one GreenletExit in the second list)c                 ó2  ‡‡‡‡‡‡— g Šg Št        j                  «       Št        j                  «       Št        j                  «       Št        j                  «       Šˆˆˆˆˆˆfd„}t        j                  |¬«      }|j                  «        ‰j	                  d«       | j                  ‰g «       | j                  t        ‰«      d«       ‰d d …= t        st        j                  «        | j                  ‰g «       ‰j                  «        ‰j	                  d«       	 | j                  ‰t        j                  g«       ‰j                  «        |j                  d«       ‰d d …= ‰d d …= y # ‰j                  «        |j                  d«       ‰d d …= ‰d d …= w xY w)Nc                  ó>  •— t        t        «      } | j                  ‰«       ‰j                  | «       ~ t	        j
                  «        ‰j                  «        ‰j                  d«       t        «        ‰j                  «        ‰j                  d«       t        «        y )Nr4   )r,   r$   r   r   r˜   r™   r�   r}   )r.   Ú/bg_glet_created_running_and_no_longer_ref_in_bgÚbg_should_be_clearÚfg_ref_releasedÚok_to_exit_bg_threadr#   Úsomerefs    €€€€€€r   r8   z1TestGreenlet.test_dealloc_other_thread.<locals>.f4  sn   ø€ ÜœUÓ#ˆBØ�I‰I�dŒOØ�N‰N˜2ÔØÜ�J‰JŒLØ;×?Ñ?ÔAØ× Ñ  Ô#äŒMØ×"Ñ"Ô$Ø ×%Ñ% aÔ(Ü�Mr   rn   rm   r   r4   )rp   rŠ   rq   rr   r}   r<   r]   r   r˜   r™   r�   r   r¤   rs   )	r?   r8   r”   r´   rµ   r¶   r·   r#   r¸   s	      @@@@@@r   Útest_dealloc_other_threadz&TestGreenlet.test_dealloc_other_thread$  sF  ý€ ð ˆØˆä:C¿/¹/Ó:KÐ7Ü#Ÿ/™/Ó+ˆÜ&Ÿ_™_Ó.ÐÜ(Ÿ™Ó0Ð÷	ñ 	ô ×Ñ AÔ&ˆØ	�‰Œ	Ø7×<Ñ<¸RÔ@à×Ñ˜˜rÔ"Ø×Ñœ˜W› qÔ)Ø’AˆJÝ*ô �J‰JŒLð 	×Ñ˜˜rÔ"Ø×ÑÔØ×Ñ Ô"ð	Ø×Ñ˜T¤H×$9Ñ$9Ð#:Ô;à ×$Ñ$Ô&Ø�F‰F�2ŒJØ’Q�Øš‘
øð !×$Ñ$Ô&Ø�F‰F�2ŒJØ’Q�Øš‘
ús   Ä!E) Å)-Fc                 ó@  ‡ — ˆ fd„}t        |«      }|j                  «       }‰ j                  ||j                  u «       ‰ j                  |«       |j                  «       }‰ j	                  |«       ‰ j                  |d«       ‰ j                  |j                  d «       y )Nc                  óÂ   •— t        j                  d«      } ‰j                  | j                  d «       t	        j
                  «       j                  j                  | «       y)Nr   úmeaning of life)r    Ú	_getframer<   Úf_backr   r   r   r   )r8   r?   s    €r   Úf1z#TestGreenlet.test_frame.<locals>.f1c  sE   ø€ Ü—‘˜aÓ ˆAØ×Ñ˜QŸX™X tÔ,Ü×ÑÓ!×(Ñ(×/Ñ/°Ô2Ø$r   r¼   )r,   r   Ú
assertTrueÚgr_frameÚassertFalser<   )r?   r¿   r-   ÚframeÚfrom_gs   `    r   Ú
test_framezTestGreenlet.test_frameb  s}   ø€ ô	%ô
 ˜‹OˆØ—‘“
ˆØ�‰˜ §¡Ð+Ô,Ø�‰˜Ôà—‘“ˆØ×Ñ˜ÔØ×Ñ˜Ð!2Ô3Ø×Ñ˜Ÿ™ TÕ*r   c                 óê   — d„ }t        j                  |d¬«      }t        j                  |d¬«      }|j                  «        |j                  «        |j                  d«       |j                  d«       y )Nc                 óB   ‡ — t        ˆ fd„«      }|j                  «        y )Nc                  ó.   •— t        j                  ‰ «      S r'   )r‹   rŒ   ©Úxs   €r   Ú<lambda>z>TestGreenlet.test_thread_bug.<locals>.runner.<locals>.<lambda>t  s   ø€ ¤D§J¡J¨q¤Mr   r+   )rÊ   r-   s   ` r   Úrunnerz,TestGreenlet.test_thread_bug.<locals>.runners  s   ø€ ÜÓ1Ó2ˆAØ�H‰H�Jr   )gš™™™™™É?rˆ   )g333333Ó?rm   )rp   rq   rr   rs   )r?   rÌ   Út1Út2s       r   Útest_thread_bugzTestGreenlet.test_thread_bugr  sU   € ò	ô ×Ñ V°&Ô9ˆÜ×Ñ V°&Ô9ˆØ
�‰Œ
Ø
�‰Œ
Ø
�‰�ŒØ
�‰��r   c                 ól   ‡ — ˆ fd„}t        |«      j                  dd¬«      }‰ j                  |d«       y )Nc                 óN   •— ‰j                  | d«       ‰j                  |d«       y)Nr:   r9   é*   )r<   )re   rc   r?   s     €r   rF   z,TestGreenlet.test_switch_kwargs.<locals>.run~  s&   ø€ Ø×Ñ˜Q Ô"Ø×Ñ˜Q Ô"Ør   r:   r9   )re   rc   rÒ   ©r,   r   r<   )r?   rF   rÊ   s   `  r   Útest_switch_kwargszTestGreenlet.test_switch_kwargs}  s4   ø€ ô	ô ˜Ó×#Ñ# a¨1Ð#Ó-ˆØ×Ñ˜˜BÕr   c                 óî   — d„ }t        |«      }| j                  ddi|j                  d«      «       | j                  dddif|j                  «       «       | j                  d|j                  «       «       y )Nc                 óÊ   — t        j                  «       j                  j                  | ¬«       t        j                  «       j                  j                  dd¬«       | | dz  fS )NrÉ   r9   r4   r{   rÉ   s    r   rF   z6TestGreenlet.test_switch_kwargs_to_parent.<locals>.run†  sR   € Ü×ÑÓ!×(Ñ(×/Ñ/°!Ð/Ô4Ü×ÑÓ!×(Ñ(×/Ñ/°°QÐ/Ô7Ø�a˜1‘f�9Ðr   rÊ   r4   )r9   )r4   é	   )r,   r<   r   )r?   rF   r-   s      r   Útest_switch_kwargs_to_parentz)TestGreenlet.test_switch_kwargs_to_parent…  sd   € ò	ô ˜ÓˆØ×Ñ˜#˜q˜ 1§8¡8¨A£;Ô/Ø×Ñ˜$  a Ð)¨1¯8©8«:Ô6Ø×Ñ˜ §¡£Õ,r   c                 óÊ  ‡‡‡— i Št        j                  «       Št        j                  «       Šˆˆˆfd„}t        j                  |¬«      }|j                  «        ‰j	                  d«       | j                  t        j                  «      5  ‰d   j                  «        d d d «       ‰j                  «        |j                  d«       ‰j                  «        y # 1 sw Y   Œ;xY w)Nc                  óf   •— t        d„ «      ‰d<   ‰ j                  «        ‰j                  d«       y )Nc                   ó   — y r'   r   r   r   r   rË   zITestGreenlet.test_switch_to_another_thread.<locals>.run.<locals>.<lambda>•  ó   € ¨Dr   r-   rm   ©r,   r�   r}   ©Úcreated_eventÚdataÚ
done_events   €€€r   rF   z7TestGreenlet.test_switch_to_another_thread.<locals>.run”  ó)   ø€ Ü#¡LÓ1ˆD�‰IØ×ÑÔØ�O‰O˜BÕr   rn   rm   r-   )rp   rŠ   rq   rr   r}   rG   r   rƒ   r   r�   rs   Úclear)r?   rF   Úthreadrß   rà   rá   s      @@@r   Útest_switch_to_another_threadz*TestGreenlet.test_switch_to_another_thread�  sœ   ú€ ØˆÜ!Ÿ™Ó)ˆÜ—_‘_Ó&ˆ
ö	 ô ×!Ñ!¨Ô-ˆØ�‰ŒØ×Ñ˜2ÔØ×ÑœxŸ~™~Õ.Ø�‰I×ÑÔ÷ /à�‰ÔØ�‰�BŒà�
‰
�÷ /Ð.ús   ÂCÃC"c                 óP   ‡ ‡— ˆˆ fd„}ˆ fd„Št        |«      j                  «        y )Nc                  óÌ   •— 	 t        d«      ‚#  t        j                  «       } t        ‰«      j	                  «        ‰j                  | t        j                  «       «       Y y xY w)NÚfun)Ú
ValueErrorr    r!   r,   r   r<   )r!   r_   r?   s    €€r   r8   z&TestGreenlet.test_exc_state.<locals>.f£  sK   ø€ ð;Ü  Ó'Ð'øð;ÜŸ<™<›>�Ü˜A“×%Ñ%Ô'Ø× Ñ  ¬3¯<©<«>Ö:ús
   ƒ ŽAA#c                  óN   •— ‰ j                  t        j                  «       d«       y )N)NNN)r<   r    r!   rB   s   €r   r_   z&TestGreenlet.test_exc_state.<locals>.h«  s   ø€ Ø×ÑœSŸ\™\›^Ð-?Õ@r   r+   )r?   r8   r_   s   ` @r   Útest_exc_statezTestGreenlet.test_exc_state¢  s    ù€ õ	;ô	Aô 	�A‹×ÑÕr   c                 ó´  — d„ }d„ }d„ }t        |«      }| j                  |j                  i «       |j                  «        | j                  |j                  d«       | j                  |j                  ddi«       |j                  |_        | j                  |j                  ddi«       | j                  t        ||«       | j                  t        ||d«       y )Nc                  ó6   — dt        j                  «       _        y ©NrÒ   )r   r   Útestr   r   r   r8   z*TestGreenlet.test_instance_dict.<locals>.f±  s   € Ø)+ŒH×ÑÓ!Õ&r   c                 ó   — | ` y r'   ©Ú__dict__)r-   s    r   Údeldictz0TestGreenlet.test_instance_dict.<locals>.deldict³  s   € Ø‘
r   c                 ó   — || _         y r'   rñ   )r-   rž   s     r   Úsetdictz0TestGreenlet.test_instance_dict.<locals>.setdictµ  s	   € ØˆA�Jr   rÒ   rï   )r,   r<   rò   r   rï   rG   Ú	TypeError)r?   r8   ró   rõ   r-   s        r   Útest_instance_dictzTestGreenlet.test_instance_dict°  s¬   € ò	,ò	ò	ä˜‹NˆØ×Ñ˜Ÿ™ RÔ(Ø	�‰Œ
Ø×Ñ˜Ÿ™ Ô$Ø×Ñ˜Ÿ™ f¨b \Ô2Ø—Z‘ZˆŒ
Ø×Ñ˜Ÿ™ f¨b \Ô2Ø×Ñœ) W¨aÔ0Ø×Ñœ) W¨a°Õ4r   c                 óp   ‡— g Šˆfd„}t        |«      }|j                  «        | j                  ‰dg«       y )Nc                  ó`   •— ‰ j                  t        t        j                  «       d«      «       y rE   )r   Úhasattrr   r   )Úhas_runs   €r   Úfuncz;TestGreenlet.test_running_greenlet_has_no_run.<locals>.funcÃ  s"   ø€ Ø�N‰NÜœ×+Ñ+Ó-¨uÓ5õr   FrÓ   )r?   rü   r-   rû   s      @r   Ú test_running_greenlet_has_no_runz-TestGreenlet.test_running_greenlet_has_no_runÁ  s4   ø€ Øˆô	ô
 ˜ÓˆØ	�‰Œ
Ø×Ñ˜ 5 'Õ*r   c                 ó°   — dd l }| j                  t        |j                   t        «       «       | j                  t        |j                  t        «       «       y r   )ÚcopyrG   rö   r,   Údeepcopy)r?   rÿ   s     r   Útest_deepcopyzTestGreenlet.test_deepcopyÌ  s5   € ÛØ×Ñœ) T§Y¡Y´³Ô>Ø×Ñœ) T§]¡]´K³MÕBr   c                 ó4  ‡‡‡— t        d„ «      Št        j                  «       Šg Šˆˆˆfd„}t        |‰¬«      }|j                  «        ~| j	                  ‰«       | j                  ‰d   ‰«       | j                  ‰d   j                  ‰«       ‰d d …= d Šd Šy )Nc                   ó   — y r'   r   r   r   r   rË   z;TestGreenlet.test_parent_restored_on_kill.<locals>.<lambda>Ò  s   €  $r   c                  ó  •— 	 ‰j                  «        y # t        j                  $ rc ‰j                  t        j                  «       j
                  «       ‰j                  t        j                  «       «       ‰ j                  «        Y y w xY wr'   )r   r   r¤   r   r   r   )ÚhubÚmainÚresults   €€€r   Úworkerz9TestGreenlet.test_parent_restored_on_kill.<locals>.workerÕ  s_   ø€ ðà—‘•øÜ×(Ñ(ò à—‘œh×1Ñ1Ó3×:Ñ:Ô;Ø—‘œh×1Ñ1Ó3Ô4Ø—
‘
–ð	ús   ƒ ”A3B
Â	B
r*   r   r   )r,   r   r   r   rÀ   rS   r   )r?   r  r-   r  r  r  s      @@@r   Útest_parent_restored_on_killz)TestGreenlet.test_parent_restored_on_killÑ  sˆ   ú€ Ü™,Ó'ˆÜ×"Ñ"Ó$ˆØˆö	ô ˜ sÔ+ˆØ	�‰Œ
àØ�‰˜ÔØ�‰�f˜Q‘i Ô&Ø�‰�f˜Q‘i×&Ñ&¨Ô,ð ’1ˆIØˆØ‰r   c                 ó¨   — t        «       }t        d„ |¬«      }| j                  t        «      5  |j                  «        d d d «       y # 1 sw Y   y xY w)Nc                   ó   — y r'   r   r   r   r   rË   z9TestGreenlet.test_parent_return_failure.<locals>.<lambda>ð  ó   €  r   r*   )r,   rG   rH   r   )r?   r.   r�   s      r   Útest_parent_return_failurez'TestGreenlet.test_parent_return_failureì  s8   € ä‹]ˆä™¨bÔ1ˆà×Ñœ~Õ.Ø�I‰IŒK÷ /×.Ñ.ús   ®AÁAc                 ó†   —  G d„ dt         «      } |d„ «      }| j                  t        |j                  t        «       «       y )Nc                   ó   — e Zd Zd„ Zy)ú>TestGreenlet.test_throw_exception_not_lost.<locals>.mygreenletc                 óJ   — 	 t         ‚#  Y nxY wt        j                  | |«      S r'   )Ú	Exceptionr,   Ú__getattribute__©r?   Únames     r   r  zOTestGreenlet.test_throw_exception_not_lost.<locals>.mygreenlet.__getattribute__÷  s)   € ðÜ#�OøðÙúÜ"×3Ñ3°D¸$Ó?Ð?s   ‚ ˆN©r   r   r   r  r   r   r   Ú
mygreenletr  ö  s   „ ó@r   r  c                   ó   — y r'   r   r   r   r   rË   z<TestGreenlet.test_throw_exception_not_lost.<locals>.<lambda>ý  ó   € ˜tr   )r,   rG   r   rO   )r?   r  r-   s      r   Útest_throw_exception_not_lostz*TestGreenlet.test_throw_exception_not_lostõ  s4   € ô	@œô 	@ñ ‘|Ó$ˆØ×Ñœ) Q§W¡W¬i«kÕ:r   c                 ó²  ‡‡‡— g Šd„ Šˆˆˆfd„}t        j                  |¬«      }|j                  «        |j                  d«       ~‰r| j	                  «        | j                  t        j                  «      5 }‰d   j                  t        «       d d d «       ‰s0t        j                  «      }| j                  |dk(  xs d|v «       n%| j                  t        j                  «      d«       t        ‰d   j                  d«      r;| j                  t         «      5  ‰d   j                  j#                  «        d d d «       ‰sKt        ‰d   j                  j$                  d«      rF‰d   j                  j$                  j#                  «        n| j'                  ‰d   j                  «       ~d Š‰d d …= d	| _        y # 1 sw Y   �Œ0xY w# 1 sw Y   Œ‘xY w)
Nc                  ó\   — t        j                  «       j                  j                  «        y r'   r{   r   r   r   r  zGTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.worker  ó   € Ü×ÑÓ!×(Ñ(×/Ñ/Õ1r   c                  ó¬   •— t        ‰«      } | j                  «        ‰j                  | «       ‰r%| j                  «        t        j                  «        y y r'   )r,   r   r   r   r   )r-   r  Úwait_for_cleanupr  s    €€€r   ÚcreatorzHTestGreenlet._do_test_throw_to_dead_thread_doesnt_crash.<locals>.creator  s?   ø€ Ü˜FÓ#ˆAØ�H‰HŒJØ�M‰M˜!ÔÙà—‘”
Ü×#Ñ#Õ%ð  r   rn   rm   r   úBcannot switch to a different thread (which happens to have exited)zCannot switchrã   T)rp   rq   rr   rs   Úwait_for_pending_cleanupsrG   r   rƒ   rO   r   rJ   rK   rÀ   r<   rú   rÁ   ÚRuntimeErrorrã   Úf_localsrW   Úexpect_greenlet_leak)r?   r  r   r”   r(   Úsr  r  s    `    @@r   Ú*_do_test_throw_to_dead_thread_doesnt_crashz7TestGreenlet._do_test_throw_to_dead_thread_doesnt_crash   s‡  ú€ àˆò	2ö	&ô ×Ñ GÔ,ˆØ	�‰Œ	Ø	�‰ˆrŒ
Øñ Ø×*Ñ*Ô,Ø×ÑœxŸ~™~Ô.°#Ø�1‰I�O‰OœIÔ&÷ /ñ  Ü�C—M‘MÓ"ˆAØ�O‰OØÐYÑYò (Ø" aÐ'õð
 ×ÑÜ�C—M‘MÓ"ØTôô
 �6˜!‘9×%Ñ% wÔ/à×"Ñ"¤<Õ0Ø�q‘	×"Ñ"×(Ñ(Ô*÷ 1ñ  ä�v˜a‘y×)Ñ)×2Ñ2°GÔ<Ø�q‘	×"Ñ"×+Ñ+×1Ñ1Õ3à×Ñ˜f Q™i×0Ñ0Ô1àØˆØ’1ˆIð %)ˆÕ!÷C /Ñ.ú÷" 1Ð0ús   Á9G ÄGÇ G
ÇGNr9   )r4   rm   z;does not leaks on Windows 3.10, but does on other platformsc                 ó$   — | j                  «        y r'   ©r'  rB   s    r   Ú&test_throw_to_dead_thread_doesnt_crashz3TestGreenlet.test_throw_to_dead_thread_doesnt_crash:  s   € ð 	×7Ñ7Õ9r   c                 ó&   — | j                  d«       y rk   r)  rB   s    r   Ú+test_throw_to_dead_thread_doesnt_crash_waitz8TestGreenlet.test_throw_to_dead_thread_doesnt_crash_waitB  s   € Ø×7Ñ7¸Õ=r   c                 ó€   —  G d„ dt         «      } |«       }| j                  |j                  d«      d«       d| _        y )Nc                   ó   — e Zd Zd„ Zd„ Zd„ Zy)ú7TestGreenlet.test_recursive_startup.<locals>.convolutedc                 ó<   — t        j                  | «       d| _        y r   )r,   Ú__init__ÚcountrB   s    r   r1  z@TestGreenlet.test_recursive_startup.<locals>.convoluted.__init__H  s   € Ü×$Ñ$ TÔ*Ø�•
r   c                 ó†   — |dk(  r'| j                   dk(  rd| _         | j                  d«       t        j                  | |«      S )NrF   r   r   é+   )r2  r   r,   r  r  s     r   r  zHTestGreenlet.test_recursive_startup.<locals>.convoluted.__getattribute__K  s8   € Ø˜5’= T§Z¡Z°1¢_Ø!"�D”JØ—K‘K ”OÜ"×3Ñ3°D¸$Ó?Ð?r   c                 ó<   — 	 | j                   j                  |«       Œr'   ©r   r   )r?   rž   s     r   rF   z;TestGreenlet.test_recursive_startup.<locals>.convoluted.runP  s   € ØØ—K‘K×&Ñ& uÔ-ð r   N)r   r   r   r1  r  rF   r   r   r   Ú
convolutedr/  G  s   „ òò@ó
.r   r7  rÒ   r4  T)r,   r<   r   r%  )r?   r7  r-   s      r   Útest_recursive_startupz#TestGreenlet.test_recursive_startupE  s9   € ô	.œô 	.ñ ‹LˆØ×Ñ˜Ÿ™ "› rÔ*ð
 %)ˆÕ!r   c                 óL  ‡‡‡— t        j                  «       Š‰j                  «        t        j                  «       Š‰j                  «         G ˆˆfd„dt        «      }d„ }ˆˆˆfd„}t	        j
                  «       }t        |«      gŠ |«       ‰d   _        ‰d   j                  «        t        j                  |¬«      }|j                  «        ‰j                  «        ‰j                  «        | j                  t	        j
                  «       |«       |j                  d«       y )Nc                   ó   •— e Zd Zˆ ˆfd„Zy)ú;TestGreenlet.test_threaded_updatecurrent.<locals>.finalizedc                 óF   •— ‰j                  «        ‰j                  «        y r'   ©ÚreleaseÚacquire)r?   Úlock1Úlock2s    €€r   Ú__del__zCTestGreenlet.test_threaded_updatecurrent.<locals>.finalized.__del__c  s   ø€ ð —‘”Ø—‘•r   N©r   r   r   rB  ©r@  rA  s   €€r   Ú	finalizedr;  b  s   ø„ ö r   rE  c                  ó\   — t        j                  «       j                  j                  «        y r'   r{   r   r   r   Údeallocatorz=TestGreenlet.test_threaded_updatecurrent.<locals>.deallocatorj  r  r   c                  óÜ   •— ‰j                  «        t        j                  «        ‰ d= ‰j                  «        ‰j                  «        t        j                  «        ‰j                  «        y r   ©r?  r   r   r>  )r-   r@  rA  s   €€€r   Úfthreadz9TestGreenlet.test_threaded_updatecurrent.<locals>.fthreadl  sF   ø€ Ø�M‰MŒOÜ×ÑÔ!Ø�!�Ø�M‰MŒOØ�M‰MŒOÜ×ÑÔ!Ø�M‰M�Or   r   rn   rm   )rp   ÚLockr?  Úobjectr   r   r,   Úbombr   rq   rr   r>  r<   rs   )	r?   rE  rG  rJ  r  r”   r-   r@  rA  s	         @@@r   Útest_threaded_updatecurrentz(TestGreenlet.test_threaded_updatecurrent[  sË   ú€ ä—‘Ó ˆØ�‰Œä—‘Ó ˆØ�‰Œ÷	 œô 	 ò	2ö	ô ×"Ñ"Ó$ˆÜ˜Ó%Ð&ˆÙ“Kˆˆ!‰Œ	Ø	ˆ!‰�‰ŒÜ×Ñ GÔ,ˆØ	�‰Œ	à�‰ŒØ�‰Œð 	×Ñœ×,Ñ,Ó.°Ô5à	�‰ˆr�
r   c                 óä   ‡‡‡— g Šˆˆˆfd„Šd„ Št        ‰«      gŠ‰d   j                  «        t        ‰‰d   «      Š‰j                  «       }| j                  ‰«       | j                  |d«       y )Nc                  óœ  •— t        j                  «       j                  j                  «       } ‰d= t        j                  «       j                  ‰_        	 t        j                  «       j                  j                  | «       ‰j	                  t        j                  «       «       y # ‰j	                  t        j                  «       «       w xY wr   )r   r   r   r   r   )rž   Ú	initiatorr#   r  s    €€€r   r  z>TestGreenlet.test_dealloc_switch_args_not_lost.<locals>.workerŒ  s‹   ø€ ä×'Ñ'Ó)×0Ñ0×7Ñ7Ó9ˆEà�q�	Ü'×2Ñ2Ó4×;Ñ;ˆIÔð3Ü×#Ñ#Ó%×,Ñ,×3Ñ3°EÔ:à—‘œH×/Ñ/Ó1Õ2ø�—‘œH×/Ñ/Ó1Õ2ús   Á-B& Â&%Cc                   ó   — yrî   r   r   r   r   rQ  zATestGreenlet.test_dealloc_switch_args_not_lost.<locals>.initiator™  ó   € Ør   r   rÒ   )r,   r   rÀ   r<   )r?   rž   rQ  r#   r  s     @@@r   Ú!test_dealloc_switch_args_not_lostz.TestGreenlet.test_dealloc_switch_args_not_lostŠ  sk   ú€ Øˆö	3ò	ô ˜fÓ%Ð&ˆàˆq‰	×ÑÔÜ 	¨6°!©9Ó5ˆ	Ø× Ñ Ó"ˆØ�‰˜ÔØ×Ñ˜ Õ#r   c                 ó¸   ‡‡‡— d„ Š G d„ dt         «      } |«       Št        d¬«      Šˆˆˆfd„}t        |«      }| j                  |j	                  «       ‰«       y )Nc                 ó   —  | |i |¤Ž y r'   r   )rü   re   Úks      r   Ú_applyz0TestGreenlet.test_tuple_subclass.<locals>._apply²  s   € Ù�!ˆM�q‹Mr   c                   ó   — e Zd Zd„ Zy)ú1TestGreenlet.test_tuple_subclass.<locals>.mytuplec                 óp   — t        j                  «       j                  «        t        j	                  | «      S r'   )r   r   r   ÚtupleÚ__len__rB   s    r   r]  z9TestGreenlet.test_tuple_subclass.<locals>.mytuple.__len__¶  s&   € Ü×#Ñ#Ó%×,Ñ,Ô.Ü—}‘} TÓ*Ð*r   N)r   r   r   r]  r   r   r   ÚmytuplerZ  µ  s   „ ó+r   r^  rÒ   )re   c                  óf   •—  ‰ t        j                  «       j                  j                  ‰‰«       y r'   r{   )rX  r‰   Úkwargss   €€€r   Úswitchapplyz5TestGreenlet.test_tuple_subclass.<locals>.switchapply»  s$   ø€ Ù”8×&Ñ&Ó(×/Ñ/×6Ñ6¸¸fÕEr   )r\  Údictr,   r<   r   )r?   r^  ra  r-   rX  r‰   r`  s       @@@r   Útest_tuple_subclassz TestGreenlet.test_tuple_subclass¤  sL   ú€ ò	ô	+”eô 	+ñ ‹yˆÜ˜”ˆö	Fä˜Ó$ˆØ×Ñ˜Ÿ™› VÕ,r   c                 ó¦   — t        dt        fdt        d„ «      i«      } G d„ d|«      } G d„ d|«      } |«        | j                  t        |«       y )NÚAbstractSubclassrF   c                  ó   — y r'   r   rB   s    r   rË   z7TestGreenlet.test_abstract_subclasses.<locals>.<lambda>Ä  s   € °r   c                   ó   — e Zd Zy)ú:TestGreenlet.test_abstract_subclasses.<locals>.BadSubclassNr   r   r   r   ÚBadSubclassrh  Æ  ó   „ Ør   ri  c                   ó   — e Zd Zd„ Zy)ú;TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclassc                  ó   — y r'   r   rB   s    r   rF   z?TestGreenlet.test_abstract_subclasses.<locals>.GoodSubclass.runÊ  s   € Ør   N)r   r   r   rF   r   r   r   ÚGoodSubclassrl  É  s   „ ór   rn  )r   r,   r   rG   rö   )r?   re  ri  rn  s       r   Útest_abstract_subclassesz%TestGreenlet.test_abstract_subclassesÀ  sT   € Ü"ØÜˆNØ”NÑ#4Ó5Ð6ó8Ðô
	Ð*ô 	ô	Ð+ô 	ñ 	ŒØ×Ñœ) [Õ1r   c                 óª   ‡ ‡— t        j                  «       sy t        j                  «       d   Š‰dk  ry ˆˆ fd„}t        d«      D ]  } |«       sŒ y  y )Nr   é2   c                  óô  •‡	‡
‡‡— t        j                  «       Š
‰
j                  «        t        j                  «       Š‰j                  «        dgŠˆ
ˆfd„} t        j                  | ¬«      }|j	                  «         G ˆ
ˆˆfd„dt
        «      Š	 G ˆ	fd„dt
        «      }g }t        ‰dz  «      }t        j                  «       } |«       }|D ]>  }d }‰d	   r|j                  d
«        yt        «       }‰d	   r n>|j                  |«       Œ@ t        j                  «        ‰d	   r|j                  d
«       y‰j                  |j                  |«       |D ]  }‰j                  |j                  |«       Œ  y)NFc                  ón   •— ‰ j                  «        t        j                  «        ‰j                  «        y r'   rI  rD  s   €€r   Úanother_threadzWTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.another_threadÜ  s!   ø€ Ø—‘”Ü×#Ñ#Ô%Ø—‘•r   rn   c                   ó   •— e Zd Zˆ ˆˆfd„Zy)úTTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callbackc                 óP   •— ‰j                  «        ‰j                  «        d‰d<   y )NTr   r=  )r?   r@  rA  Úrecycleds    €€€r   rB  z\TestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.gc_callback.__del__ã  s   ø€ Ø—M‘M”OØ—M‘M”OØ"&�H˜Q’Kr   NrC  )r@  rA  rx  s   €€€r   Úgc_callbackrv  â  s   ø„ ÷'r   ry  c                   ó   •— e Zd Zˆ fd„Zy)úPTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbagec                 ó,   •— | | _          ‰«       | _        y r'   )ÚcycleÚcallback)r?   ry  s    €r   r1  zYTestGreenlet.test_implicit_parent_with_threads.<locals>.attempt.<locals>.garbage.__init__è  s   ø€ Ø!%�D”JÙ$/£M�D•Mr   N)r   r   r   r1  )ry  s   €r   Úgarbager{  ç  s   ø„ õ2r   r  r9   r   rm   T)rp   rK  r?  rq   rr   rL  r>   r   r   rs   r,   r   r˜   r™   r<   r   )rt  r”   r  ÚlrÊ   Úcurrentr-   r‘   Úlastry  r@  rA  rx  ÚNr?   s            @@@@€€r   Úattemptz?TestGreenlet.test_implicit_parent_with_threads.<locals>.attemptÖ  s/  ü€ Ü—N‘NÓ$ˆEØ�M‰MŒOÜ—N‘NÓ$ˆEØ�M‰MŒOØ�wˆHõ ô × Ñ ¨Ô7ˆAØ�G‰GŒI÷'ð 'œfô 'ö
2œ&ô 2ð ˆAÜ�a˜‘c“
ˆAÜ×)Ñ)Ó+ˆGÙ“	ˆAÛ�Ø�Ø˜A’;à—F‘F˜2”JÙ Ü"“}�Ø˜A’;ÙØ—‘˜•ð ô —
‘
”Ø˜A’;Ø—F‘F˜2”JØØ×Ñ˜TŸ[™[¨'Ô2Û�Ø× Ñ  §¡¨7Õ3ð àr   r;   )r˜   Ú	isenabledÚget_thresholdr>   )r?   r„  r‘   rƒ  s   `  @r   Ú!test_implicit_parent_with_threadsz.TestGreenlet.test_implicit_parent_with_threadsÐ  sJ   ù€ Ü�|‰|Œ~ØÜ×ÑÓ˜qÑ!ˆØˆrŠ6Øõ,	ôZ �q–ˆAÙ�yÙñ r   c                 óx  ‡ ‡‡— ddl mŠ ddl mŠ  G d„ dt        «      }t	        j
                  |«      }g ‰ _        ˆˆˆ fd„}t        d«      D ]  } ||«      j                  «        Œ ‰ `t        r&‰ j                  t	        j
                  |«      |«       y ‰ j                  t	        j
                  |«      |«       y )Nr   ©r   )r¤   c                   ó   — e Zd Zy)úTTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.GreenletNr   r   r   r   ÚGreenletr‹    rj  r   rŒ  c                  óœ   •— 	  ‰«       j                   j                  «        y # ‰ $ r# ‰j                  j                   ‰«       «       Y y w xY wr'   )r   r   Úgletsr   )r¤   r   r?   s   €€€r   Úgreenlet_mainzYTestGreenlet.test_issue_245_reference_counting_subclass_no_threads.<locals>.greenlet_main  s?   ø€ ð0Ù“×#Ñ#×*Ñ*Õ,øØò 0Ø—
‘
×!Ñ!¡*£,Ö/ð0ús   ƒ# £%AÁ
Arm   )r   r   r¤   r,   r    rg   rŽ  r>   r   r   ÚassertGreaterEqualr<   )r?   rŒ  Úinitial_refsr�  r‘   r¤   r   s   `    @@r   Ú5test_issue_245_reference_counting_subclass_no_threadszBTestGreenlet.test_issue_245_reference_counting_subclass_no_threads  s”   ú€ õ 	(Ý)ô	”{ô 	ô —‘ xÓ0ˆð ˆŒ
ö	0ô �r–ˆAÙ�]Ó#×*Ñ*Õ,ð ð ˆJÝ&ð ×#Ñ#¤C§O¡O°HÓ$=¸|ÕLà×ÑœSŸ_™_¨XÓ6¸ÕEr   z;The manylinux images appear to hang on this test on 3.13rc2c                 ó  ‡‡‡‡‡— ddl m} ddl m} ddlmŠ  G d„ dt
        «      Šg Š |«       Šˆfd„Šˆˆˆˆˆfd„}t        j                  ‰«      }g }|d	z   }t        rd
}t        |«      D ]5  } |«       } |||f¬«      }	|j                  |«       |	j                  «        Œ7 |D ]  }
|
j                  d«       Œ ‰d d …= ‰j                  «        | j                  «        | j                  t        j                  ‰«      |«       y )Nr   )rq   )rŠ   r‰  c                   ó   — e Zd Zy)úSTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.MyGreenletNr   r   r   r   Ú
MyGreenletr•  ?  rj  r   r–  c                  óD   •—  ‰ «       j                   j                  «        y r'   r6  r‰  s   €r   r�  zVTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.greenlet_mainE  s   ø€ Ù‹L×Ñ×&Ñ&Õ(r   c                 óª   •—  ‰‰«      }‰j                  |«       |j                  «        ~| j                  «        ‰j                  d«        ‰«        y )Nrm   )r   r   r�   r}   )Úgreenlet_running_eventÚminer–  r   rŽ  r�  Úref_cleareds     €€€€€r   Úthread_mainzTTestGreenlet.test_issue_245_reference_counting_subclass_threads.<locals>.thread_mainH  sH   ø€ Ù˜mÓ,ˆDØ�L‰L˜Ôà�K‰KŒMàà"×&Ñ&Ô(ð ×Ñ˜RÔ ñ �Lr   é-   rq  rˆ   rm   )rp   rq   rŠ   r   r   r,   r    rg   r   r>   r   rr   r}   r�   r"  r<   )r?   rq   rŠ   rœ  r‘  Úthread_ready_eventsrŽ   r‘   Úeventrä   rá   r–  r   rŽ  r�  r›  s              @@@@@r   Ú2test_issue_245_reference_counting_subclass_threadsz?TestGreenlet.test_issue_245_reference_counting_subclass_threads1  sî   ü€ õ 	%Ý#å'ô	œô 	ð ˆÙ“gˆô	)÷	ð 	ô8 —‘ zÓ2ˆØ ÐØ# bÑ(ˆÝ&ð ˆLÜ�|Ö$ˆAÙ“GˆEÙ ;°e°XÔ>ˆFØ×&Ñ& uÔ-Ø�L‰L�Nð	 %ó .ˆJØ�O‰O˜BÕð .ð ’!ˆHØ�‰Ôð 	×&Ñ&Ô(Ø×ÑœŸ™¨Ó4°lÕCr   c                 ó²   — d„ }t        |«      }d„ }t        ||«      }| j                  t        «      5  |j                  «        d d d «       y # 1 sw Y   y xY w)Nc                   ó   — y)Né   r   r   r   r   Úno_argsz\TestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.no_args  rS  r   c                   ó   — yrî   r   r   r   r   ÚleafzYTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error.<locals>.leaf„  rS  r   )r,   rG   rö   r   )r?   r¤  Úparent_never_startedr¦  Úchilds        r   Ú>test_falling_off_end_switches_to_unstarted_parent_raises_errorzKTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_raises_error~  sM   € ò	ô  +¨7Ó3Ðò	ô ˜DÐ"6Ó7ˆð ×ÑœyÕ)Ø�L‰LŒN÷ *×)Ñ)ús   ³AÁAc                 ó‚   — d„ }t        |«      }d„ }t        ||«      }|j                  «       }| j                  |d«       y )Nc                 ó
   — | dfS ©Né   r   rÉ   s    r   Úone_argzUTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.one_argŽ  s   € Ø�r�7ˆNr   c                   ó   — yrî   r   r   r   r   r¦  zRTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works.<locals>.leaf“  rS  r   )rÒ   r­  rÓ   )r?   r®  r§  r¦  r¨  r  s         r   Ú7test_falling_off_end_switches_to_unstarted_parent_workszDTestGreenlet.test_falling_off_end_switches_to_unstarted_parent_works�  sC   € ò	ô  +¨7Ó3Ðò	ô ˜DÐ"6Ó7ˆà—‘“ˆØ×Ñ˜ Õ*r   c                 óˆ  ‡—  G d„ dt         «      } |«       }g Št        ˆfd„|«      }| j                  t        «      5  |j                  «        d d d «       | j	                  ‰dg«       | j                  t        «      5  |j                  «        d d d «       | j	                  ‰dg«       y # 1 sw Y   Œ^xY w# 1 sw Y   Œ)xY w)Nc                   ó   — e Zd Zd„ Zy)úXTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parentc                 ó   — |dk(  rt         ‚y rE   )r   r  s     r   r  ziTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.Parent.__getattribute__�  s   € Ø˜5’=Ü#�Oð !r   Nr  r   r   r   ÚParentr³  œ  s   „ ó$r   rµ  c                  ó&   •— ‰ j                  d«      S rî   r©   r"   s   €r   rË   zZTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent.<locals>.<lambda>¤  ó   ø€  D§K¡K°¤Or   rÒ   )r,   rG   r   r   r<   )r?   rµ  r§  r¨  r#   s       @r   Ú;test_switch_to_dead_greenlet_with_unstarted_perverse_parentzHTestGreenlet.test_switch_to_dead_greenlet_with_unstarted_perverse_parent›  sž   ø€ ô	$”[ô 	$ñ  &›xÐØˆÜÓ3Ð5IÓJˆð ×ÑœyÕ)Ø�L‰LŒN÷ *ð 	×Ñ˜ ˜tÔ$à×ÑœyÕ)Ø�L‰LŒN÷ *à×Ñ˜ ˜tÕ$÷ *Ð)ú÷
 *Ð)ús   ¾B,Á?B8Â,B5Â8Cc                 ó   ‡— g Št        ˆfd„«      }t        ˆfd„«      }|j                  «        | j                  ‰dg«       ||_        |j                  «       }| j	                  |«       | j                  ‰ddg«       y )Nc                  ó&   •— ‰ j                  d«      S r¬  r©   r"   s   €r   rË   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>²  s   ø€ °4·;±;¸r´?r   c                  ó&   •— ‰ j                  d«      S rî   r©   r"   s   €r   rË   zDTestGreenlet.test_switch_to_dead_greenlet_reparent.<locals>.<lambda>³  r·  r   rÒ   r­  )r,   r   r<   r   rW   )r?   r§  r¨  r  r#   s       @r   Ú%test_switch_to_dead_greenlet_reparentz2TestGreenlet.test_switch_to_dead_greenlet_reparent°  sn   ø€ ØˆÜ*Ó+BÓCÐÜÓ3Ó4ˆà�‰ŒØ×Ñ˜ ˜tÔ$à+ˆŒà—‘“ˆØ×Ñ˜&Ô!Ø×Ñ˜  B˜xÕ(r   c                 ód  ‡‡— t        j                  «       Šˆfd„}ˆfd„Št        |«      }|j                  «        t        d„ «      }|j                  «        | j	                  |j
                  «       | j                  |j
                  j                  j                  d«       | j	                  |j
                  j                  «       | j                  |j
                  j                  j                  j                  d«       | j                  |j
                  j                  j                  «       y )Nc                  ó   •—  ‰ «        y r'   r   ©Úinners   €r   ÚouterzHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.outerÄ  s   ø€ Ù�Gr   c                  óN   •— ‰ j                  t        j                  d«      «       y r   )r   r    r½   ©r  s   €r   rÀ  zHTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.innerÇ  s   ø€ Ø�K‰KœŸ™ aÓ(Õ)r   c                   ó   — y r'   r   r   r   r   rË   zKTestGreenlet.test_can_access_f_back_of_suspended_greenlet.<locals>.<lambda>Ð  ó   € ¨r   rÀ  rÁ  )r   r   r,   r   rR   rÁ   r<   Úf_codeÚco_namer¾   rW   )r?   rÁ  r  Ú	unrelatedrÀ  r  s       @@r   Ú,test_can_access_f_back_of_suspended_greenletz9TestGreenlet.test_can_access_f_back_of_suspended_greenlet¾  sÚ   ù€ ô ×"Ñ"Ó$ˆô	ô	*ô ˜%Ó ˆà�
‰
Œô  ¡Ó-ˆ	Ø×ÑÔð 	×Ñ˜SŸ\™\Ô*Ø×Ñ˜Ÿ™×,Ñ,×4Ñ4°gÔ>Ø×Ñ˜SŸ\™\×0Ñ0Ô1Ø×Ñ˜Ÿ™×,Ñ,×3Ñ3×;Ñ;¸WÔEà×Ñ˜#Ÿ,™,×-Ñ-×4Ñ4Õ5r   c                 ó¬  ‡‡‡— ddl mŠ ddlmŠ ˆˆˆfd„Št	        ‰«      }|j                  d«       |j                  }t        d«      D ]-  }| j                  |j                  d   |«       |j                  }Œ/ | j                  |j                  d   d«       | j                  |j                  «       | j                  |j                  d«      d	«       y )
Nr   )Úpartialr   )Ú_test_extension_cppc                 ó¢   •— | dkD  r| ‰j                   ‰‰| dz
  «      «      z  S t        j                  «       j                  j	                  «       S )Nr   r   )Ú	test_callr   r   r   r   )ÚvrÌ  rË  Úrecurses    €€€r   rÐ  z@TestGreenlet.test_get_stack_with_nested_c_calls.<locals>.recurseß  sJ   ø€ Ø�1ŠuØÐ.×8Ñ8¹ÀÈ!ÈaÉ%Ó9PÓQÑQÐQÜ×&Ñ&Ó(×/Ñ/×6Ñ6Ó8Ð8r   r;   rÏ  rm   i°  )Ú	functoolsrË  Ú rÌ  r,   r   rÁ   r>   r<   r$  r¾   rW   )r?   ÚgrrÃ   rt   rÌ  rË  rÐ  s       @@@r   Ú"test_get_stack_with_nested_c_callsz/TestGreenlet.test_get_stack_with_nested_c_callsÛ  s£   ú€ Ý%Ý)ö	9ô
 ˜Ó!ˆØ
�	‰	�!ŒØ—‘ˆÜ�q–ˆAØ×Ñ˜UŸ^™^¨CÑ0°!Ô4Ø—L‘L‰Eð ð 	×Ñ˜Ÿ™¨Ñ,¨aÔ0Ø×Ñ˜%Ÿ,™,Ô'Ø×Ñ˜Ÿ™ 2›¨Õ-r   c                 ó4  ‡‡— t        j                  «       Šˆfd„}ˆfd„Št        |«      }|j                  «       }t        d„ «      }|j                  «        | j	                  |j
                  j                  d«       | j                  |j                  «       y )Nc                  ó<   •—  ‰ t        j                  d«      «       y r   )r    r½   r¿  s   €r   rÁ  z6TestGreenlet.test_frames_always_exposed.<locals>.outerô  s   ø€ Ù”#—-‘- Ó"Õ#r   c                 ó(   •— ‰j                  | «       y r'   ©r   )rÃ   r  s    €r   rÀ  z6TestGreenlet.test_frames_always_exposed.<locals>.inner÷  s   ø€ Ø�K‰K˜Õr   c                   ó   — y r'   r   r   r   r   rË   z9TestGreenlet.test_frames_always_exposed.<locals>.<lambda>ÿ  rÅ  r   rÁ  )	r   r   r,   r   r<   rÆ  rÇ  rW   r¾   )r?   rÁ  rÓ  rÃ   rÈ  rÀ  r  s        @@r   Útest_frames_always_exposedz'TestGreenlet.test_frames_always_exposedî  sx   ù€ ô ×"Ñ"Ó$ˆô	$ô	ô ˜ÓˆØ—	‘	“ˆô  ¡Ó-ˆ	Ø×ÑÔà×Ñ˜Ÿ™×-Ñ-¨wÔ7à×Ñ˜%Ÿ,™,Õ'r   c                 óª   ‡‡‡‡— ˆfd„Šˆfd„Šˆˆfd„}ˆfd„}t        j                   |«      Št        j                   |«      Š‰j                  «        y )Nc                 ó(   •— ‰j                  «        | S r'   rØ  )rÊ   r�   s    €r   Úk1zITestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.k1  ó   ø€ Ø�I‰IŒKØˆHr   c                 ó(   •— ‰j                  «        | S r'   rØ  )rÊ   r.   s    €r   Úk2zITestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.k2  rÞ  r   c                  óB   •— t        dg‰¬«       ‰ j                  «        y )Nr   ©Úkey)Úsortedr   )r�   rÝ  s   €€r   Úg1_bodyzNTestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.g1_body  s   ø€ Ü�A�3˜BÕØ�I‰I�Kr   c                  ó�   •— t        dg‰¬«       t        t        dd¬«      5 } | j                  «        d d d «       y # 1 sw Y   y xY w)Nr   râ  Úrtzutf-8)Úencoding)rä  ÚopenÚ__file__Úread)r8   rà  s    €r   Úg2_bodyzNTestGreenlet.test_switching_holding_critical_section_no_crash.<locals>.g2_body"  s4   ø€ Ü�A�3˜BÕô ”h ¨wÕ7¸1Ø—‘”÷ 8×7Ñ7ús	   ¢<¼A)r   r   )r?   rå  rì  r.   r�   rÝ  rà  s      @@@@r   Ú0test_switching_holding_critical_section_no_crashz=TestGreenlet.test_switching_holding_critical_section_no_crash  sB   û€ ô	ô
	õ
	ô
	ô ×Ñ˜wÓ'ˆÜ×Ñ˜wÓ'ˆØ
�	‰	�r   )F)<r   r   r   r@   rC   rM   rP   rU   rX   r`   rh   rw   r   rš   rŸ   r¢   r¥   r±   ÚunittestÚskipIfr	   r   r¹   rÅ   rÏ   rÔ   rØ   rå   rë   r÷   rý   r  r	  r  r  r   r'  r   r   r    Úversion_infor*  r,  r   r8  rN  rT  rc  ro  r‡  r’  r   r©  r°  r¸  r¼  rÉ  rÔ  rÚ  rí  r   r   r   r1   r1   8   sª  „ ò.òò1ò1ò7ò
!ò
'ò(Dò,1ð ñ=ó ð=ò~,ò8+òOòIð0 €X‡_�_ØÒ&Ð&ØGóñ5óð5òn+ò 	ò ò-òò& ò5ò"	+òCò
ò6ò	;ð &ò7)ó &ð7)ðr &ÙØÒ/�× Ñ   !Ð$¨Ñ/ØEóñ:ó	ó &ð
:ò>ð ñ)ó ð)ò*-ò^$ò4-ò82ò 5òn(FðT €X‡_�_ØÒ&Ð&ØEóñDDóðDDòLò+ò%ò*)ò6ò:.ò&(ó0&r   r1   c                   óH   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)ÚTestGreenletSetParentErrorsc                 ó
  ‡‡‡— i Št        j                  «       Št        j                  «       Šˆˆˆfd„}d„ }t        j                  |¬«      }|j                  «        ‰j	                  d«       t        |«      }|j                  «        | j                  t        «      5 }‰d   |_	        d d d «       ‰j                  «        |j                  d«       | j                  t        j                  «      d«       y # 1 sw Y   ŒPxY w)Nc                  óf   •— t        d„ «      ‰d<   ‰ j                  «        ‰j                  d«       y )Nc                   ó   — y r'   r   r   r   r   rË   zQTestGreenletSetParentErrors.test_threaded_reparent.<locals>.run.<locals>.<lambda>6  rÜ   r   r-   rm   rÝ   rÞ   s   €€€r   rF   z?TestGreenletSetParentErrors.test_threaded_reparent.<locals>.run5  râ   r   c                  ó\   — t        j                  «       j                  j                  «        y r'   r{   r   r   r   ÚblankzATestGreenletSetParentErrors.test_threaded_reparent.<locals>.blank:  r  r   rn   rm   r-   z&parent cannot be on a different thread)rp   rŠ   rq   rr   r}   r,   r   rG   ré   r   r�   rs   r<   rJ   rK   )	r?   rF   r÷  rä   r-   r(   rß   rà   rá   s	         @@@r   Útest_threaded_reparentz2TestGreenletSetParentErrors.test_threaded_reparent0  s¾   ú€ ØˆÜ!Ÿ™Ó)ˆÜ—_‘_Ó&ˆ
ö	 ò
	2ô ×!Ñ!¨Ô-ˆØ�‰ŒØ×Ñ˜2ÔÜ˜ÓˆØ	�‰Œ
Ø×ÑœzÔ*¨cØ˜C‘yˆAŒH÷ +à�‰ÔØ�‰�BŒà×Ñœ˜SŸ]™]Ó+Ð-UÕV÷ +Ð*ús   ÂC9Ã9Dc                 óÐ  ‡— g Šˆfd„}t        j                  |¬«      }|j                  «        |j                  d«       | j	                  | j
                  dz   ¬«        G ˆfd„dt        «      } |d„ «      }| j                  t        j                  «      5 }|j                  «        d d d «       | j                  t        j                  «      d	«       ‰d d …= y # 1 sw Y   Œ4xY w)
Nc                  ó`   •— t        d„ «      } ‰j                  | «       | j                  «        y )Nc                   ó   — y r'   r   r   r   r   rË   zYTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.worker.<locals>.<lambda>L  ó   €  Dr   )r,   r   r   )r-   Úanothers    €r   r  zGTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.workerK  s"   ø€ Ü™LÓ)ˆAØ�N‰N˜1ÔØ�H‰H�Jr   rn   rm   r   )Úinitial_main_greenletsc                   ó   •— e Zd Zˆ fd„Zy)úKTestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convolutedc                 óN   •— |dk(  r
‰d   | _         t        j                  | |«      S ©NrF   r   ©r   r,   r  ©r?   r  rý  s     €r   r  z\TestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.convoluted.__getattribute__g  ó(   ø€ Ø˜5’=Ø")¨!¡*�D”KÜ"×3Ñ3°D¸$Ó?Ð?r   Nr  ©rý  s   €r   r7  r   f  ó	   ø„ õ@r   r7  c                   ó   — y r'   r   r   r   r   rË   zITestGreenletSetParentErrors.test_unexpected_reparenting.<locals>.<lambda>k  r  r   r!  )rp   rq   rr   rs   r"  Úmain_greenlets_before_testr,   rG   r   rƒ   r   r<   rJ   rK   )r?   r  r”   r7  r-   r(   rý  s         @r   Útest_unexpected_reparentingz7TestGreenletSetParentErrors.test_unexpected_reparentingI  s»   ø€ Øˆô	ô ×Ñ FÔ+ˆØ	�‰Œ	Ø	�‰ˆrŒ
ð& 	×&Ñ&¸d×>]Ñ>]Ð`aÑ>aÐ&Ôbö	@œô 	@ñ
 ‘|Ó$ˆØ×ÑœxŸ~™~Ô.°#Ø�H‰HŒJ÷ /à×Ñœ˜SŸ]™]Ó+Ø]ô	_à’A‰J÷	 /Ð.ús   ÂCÃC%c                 ó  ‡‡‡— g Št        j                  «       Št        j                  «       Šˆˆˆfd„} G ˆfd„dt        «      }t        j                  |¬«      }|j	                  «        ‰j                  d«       	  |d„ «      }| j                  t        j                  «      5 }|j                  «        d d d «       | j                  dt        j                  «      «       | j                  dt        |j                  «      «       | j                  d	t        |j                  «      «       ‰j                  «        |j                  d«       ‰d d …= y # 1 sw Y   ŒŸxY w# ‰j                  «        |j                  d«       ‰d d …= w xY w)
Nc                  ó¢   •— t        d„ «      } ‰j                  | «       | j                  «        ‰j                  «        ‰j	                  d«       y )Nc                   ó   — y r'   r   r   r   r   rË   zhTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.worker.<locals>.<lambda>y  rü  r   rm   )r,   r   r   r�   r}   )r-   rý  Úkeep_main_aliveÚswitched_to_greenlets    €€€r   r  zVTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.workerx  s<   ø€ Ü™LÓ)ˆAØ�N‰N˜1ÔØ�H‰HŒJØ ×$Ñ$Ô&Ø× Ñ  Õ$r   c                   ó   •— e Zd Zˆ fd„Zy)úZTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convolutedc                 óN   •— |dk(  r
‰d   | _         t        j                  | |«      S r  r  r  s     €r   r  zkTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.convoluted.__getattribute__  r  r   Nr  r  s   €r   r7  r  ~  r  r   r7  rn   rm   c                   ó   — y r'   r   r   r   r   rË   zXTestGreenletSetParentErrors.test_unexpected_reparenting_thread_running.<locals>.<lambda>‰  ó   €  4r   z#Cannot switch to a different threadÚExpectedÚCurrent)rp   rŠ   r,   rq   rr   r}   rG   r   rƒ   r   rI   rJ   rK   r�   rs   )	r?   r  r7  r”   r-   r(   rý  r  r  s	         @@@r   Ú*test_unexpected_reparenting_thread_runningzFTestGreenletSetParentErrors.test_unexpected_reparenting_thread_runningr  s  ú€ ð ˆÜ(Ÿ™Ó0ÐÜ#Ÿ/™/Ó+ˆö	%ö	@œô 	@ô ×Ñ FÔ+ˆØ	�‰Œ	à×!Ñ! "Ô%ð	Ù™<Ó(ˆAà×"Ñ"¤8§>¡>Ô2°cØ—‘”
÷ 3à�M‰MÐ?ÄÀSÇ]Á]ÓASÔTØ�M‰M˜*¤c¨#¯-©-Ó&8Ô9Ø�M‰M˜)¤S¨¯©Ó%7Ô8à×ÑÔ!Ø�F‰F�2ŒJàš‘
÷ 3Ð2ûð ×ÑÔ!Ø�F‰F�2ŒJàš‘
ús%   Á>(E! Â&EÂ7A7E! ÅEÅE! Å!(F	c                 ó  — t        d„ «      }| j                  |j                  t        j                  «       «       | j                  t        «      5 }|`d d d «       | j                  t        j                  «      d«       y # 1 sw Y   Œ/xY w)Nc                   ó   — y r'   r   r   r   r   rË   zGTestGreenletSetParentErrors.test_cannot_delete_parent.<locals>.<lambda>—  ó   €  Tr   úcan't delete attribute)
r,   rS   r   r   r   rG   rH   r<   rJ   rK   )r?   r  r(   s      r   Útest_cannot_delete_parentz5TestGreenletSetParentErrors.test_cannot_delete_parent–  sd   € Ü™\Ó*ˆØ�‰�f—m‘m¤X×%8Ñ%8Ó%:Ô;à×Ñœ~Ô.°#Ø�÷ /à×Ñœ˜SŸ]™]Ó+Ð-EÕF÷ /Ð.ús   ÁBÂB
c                 óÊ   — | j                  t        «      5 }t        j                  «       `d d d «       | j                  t        j                  «      d«       y # 1 sw Y   Œ/xY w)Nr  ©rG   rH   r   r   r   r<   rJ   rK   ©r?   r(   s     r   Ú!test_cannot_delete_parent_of_mainz=TestGreenletSetParentErrors.test_cannot_delete_parent_of_mainž  sI   € Ø×Ñœ~Ô.°#Ü×#Ñ#Ó%Ð,÷ /à×Ñœ˜SŸ]™]Ó+Ð-EÕF÷ /Ð.ús   –AÁA"c                 ó^   — | j                  t        j                  «       j                  «       y r'   )rW   r   r   r   rB   s    r   Ú!test_main_greenlet_parent_is_nonez=TestGreenletSetParentErrors.test_main_greenlet_parent_is_none¤  s   € à×Ñœ(×-Ñ-Ó/×6Ñ6Õ7r   c                 óÐ   ‡ — d„ }ˆ fd„}t        |«      }‰ j                  |«        ||«       |j                  «        ‰ j                  |«        ||«       |j                  «        y )Nc                  ó\   — t        j                  «       j                  j                  «        y r'   r{   r   r   r   ÚbgzCTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.bg©  s   € ä×ÑÓ!×(Ñ(×/Ñ/Õ1r   c                 óô   •— d d‰dfD ]b  }‰j                  t        «      5 }|| _        d d d «       ‰j                  t	        j
                  «      dt        |«      j                  z   «       Œd y # 1 sw Y   ŒGxY w)Nr   Ú42z4GreenletChecker: Expected any type of greenlet, not )rG   rö   r   r<   rJ   rK   Útyper   )ÚgletÚpr(   r?   s      €r   ÚcheckzFTestGreenletSetParentErrors.test_set_parent_wrong_types.<locals>.check­  si   ø€ Ø˜1˜d DÓ(�Ø×&Ñ&¤yÔ1°SØ"#�D”K÷ 2ð × Ñ Ü˜Ÿ™Ó&ØJÌTÐRSËW×M]ÑM]Ñ]õ_ñ	 )ß1Ð1ús    A.Á.A7	)r,   rÂ   r   rÀ   )r?   r%  r+  r-   s   `   r   Útest_set_parent_wrong_typesz7TestGreenletSetParentErrors.test_set_parent_wrong_types¨  sW   ø€ ò	2ô	_ô ˜‹OˆØ×Ñ˜ÔÙˆaŒð 	
�‰Œ
Ø�‰˜ÔÙˆaŒð 	
�‰�
r   c                 óÈ   — t        d„ «      }| j                  t        «      5 }||_        d d d «       | j	                  t        j                  «      d«       y # 1 sw Y   Œ/xY w)Nc                   ó   — y r'   r   r   r   r   rË   z@TestGreenletSetParentErrors.test_trivial_cycle.<locals>.<lambda>Å  r  r   úcyclic parent chain)r,   rG   ré   r   r<   rJ   rK   )r?   r)  r(   s      r   Útest_trivial_cyclez.TestGreenletSetParentErrors.test_trivial_cycleÄ  sK   € Ü™<Ó(ˆØ×ÑœzÔ*¨cØˆDŒK÷ +à×Ñœ˜SŸ]™]Ó+Ð-BÕC÷ +Ð*ús   ¢AÁA!c                 óø   — | j                  t        «      5 }t        j                  «       t        j                  «       _        d d d «       | j                  t        j                  «      d«       y # 1 sw Y   Œ/xY w)Nz(cannot set the parent of a main greenletr  r  s     r   Útest_trivial_cycle_mainz3TestGreenletSetParentErrors.test_trivial_cycle_mainÊ  sT   € à×Ñœ~Ô.°#Ü+3×+>Ñ+>Ó+@ŒH×ÑÓ!Ô(÷ /à×Ñœ˜SŸ]™]Ó+Ð-WÕX÷ /Ð.ús   –,A0Á0A9c                 ó  — t        d„ «      }t        d„ «      }t        d„ «      }||_        ||_        | j                  t        «      5 }||_        d d d «       | j	                  t        j                  «      d«       y # 1 sw Y   Œ/xY w)Nc                   ó   — y r'   r   r   r   r   rË   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>Ñ  r  r   c                   ó   — y r'   r   r   r   r   rË   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>Ò  r  r   c                   ó   — y r'   r   r   r   r   rË   z?TestGreenletSetParentErrors.test_deeper_cycle.<locals>.<lambda>Ó  r  r   r/  )r,   r   rG   ré   r<   rJ   rK   )r?   r.   r�   Úg3r(   s        r   Útest_deeper_cyclez-TestGreenletSetParentErrors.test_deeper_cycleÐ  sm   € Ü™Ó&ˆÜ™Ó&ˆÜ™Ó&ˆàˆŒ	ØˆŒ	Ø×ÑœzÔ*¨cØˆBŒI÷ +à×Ñœ˜SŸ]™]Ó+Ð-BÕC÷ +Ð*ús   ÁA>Á>BN)r   r   r   rø  r
  r  r  r   r"  r,  r0  r2  r8  r   r   r   rò  rò  /  s<   „ òWò2'òR"òHGòGò8òò8DòYó	Dr   rò  c                   óJ   — e Zd Z eed«      sd
d„Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy)ÚTestReprÚassertEndsWithNc                 óL   — | j                  |j                  |«      |||f«       y r'   )rÀ   Úendswith)r?   r&  ÚsuffixÚmsgs       r   r;  zTestRepr.assertEndsWithß  s    € Ø�O‰O˜AŸJ™J vÓ.°°F¸CÐ0@ÕAr   c                 ób   — t        t        j                  «       «      }| j                  |d«       y )Nú current active started main>)Úreprr   r   r;  ©r?   Úrs     r   Útest_main_while_runningz TestRepr.test_main_while_runningâ  s&   € Ü”×$Ñ$Ó&Ó'ˆØ×Ñ˜AÐ>Õ?r   c                 ó’   ‡— t        j                  «       Šˆfd„}t        |«      }|j                  «       }| j	                  |d«       y )Nc                  ó   •— t        ‰ «      S r'   )rB  rÃ  s   €r   rF   z-TestRepr.test_main_in_background.<locals>.runè  s   ø€ Ü˜“:Ðr   ú suspended active started main>)r   r   r,   r   r;  )r?   rF   r-   rD  r  s       @r   Útest_main_in_backgroundz TestRepr.test_main_in_backgroundæ  s>   ø€ Ü×"Ñ"Ó$ˆô	ô ˜ÓˆØ�H‰H‹JˆØ×Ñ˜AÐ@ÕAr   c                 óN   — t        t        «       «      }| j                  |d«       y )Nz	 pending>)rB  r,   r;  rC  s     r   Útest_initialzTestRepr.test_initialï  s   € Ü”“ÓˆØ×Ñ˜A˜{Õ+r   c                 ó&  ‡— t        j                  «       Š G ˆfd„dt        j                  «      } |«       }|j	                  «        |j                  d«       | j                  |j                  d«       | j                  |j                  d«       t        d«      D ]  }t        j                  d«       Œ t        d«      D ]N  }| j                  |j                  j                  «       t        |j                  «      }| j                  |d«       ŒP y )	Nc                   ó$   •— e Zd ZdxZZdZˆ fd„Zy)ú/TestRepr.test_main_from_other_thread.<locals>.TNc                 óŒ   •— t        ‰«      | _        t        j                  «       | _        t        | j                  «      | _        y r'   )rB  Úoriginal_mainr   r   Ú	main_gletrœ  )r?   r  s    €r   rF   z3TestRepr.test_main_from_other_thread.<locals>.T.runù  s0   ø€ Ü%)¨$£Z�Ô"Ü!)×!4Ñ!4Ó!6�”Ü#'¨¯©Ó#7�Õ r   )r   r   r   rP  rœ  rQ  rF   rÃ  s   €r   ÚTrN  ö  s   ø„ Ø*.Ð.ˆM˜KØˆIõ8r   rR  rm   rH  rA  r4   gü©ñÒMbP?z (thread exited) dead>)r   r   rp   rq   rr   rs   r;  rP  rœ  r>   r‹   rŒ   rÀ   rQ  r^   rB  )r?   rR  r”   r‘   rD  r  s        @r   Útest_main_from_other_threadz$TestRepr.test_main_from_other_threadó  sË   ø€ Ü×"Ñ"Ó$ˆö	8”	× Ñ ô 	8ñ ‹CˆØ	�‰Œ	Ø	�‰ˆrŒ
à×Ñ˜AŸO™OÐ-NÔOØ×Ñ˜AŸM™MÐ+JÔKô �q–ˆAÜ�J‰J�uÕð ô �q–ˆAØ�O‰O˜AŸK™K×,Ñ,Ô-Ü�Q—[‘[Ó!ˆAØ×Ñ Ð#;Õ<ñ r   c                 ó  — t        d„ «      }|j                  «        | j                  t        |«      d«       | j	                  dt        |«      «       | j	                  dt        |«      «       | j	                  dt        |«      «       y )Nc                   ó   — y r'   r   r   r   r   rË   z$TestRepr.test_dead.<locals>.<lambda>  s   €  r   z dead>Ú	suspendedÚstartedÚactive)r,   r   r;  rB  ÚassertNotInrT   s     r   Ú	test_deadzTestRepr.test_dead  se   € Ü™Ó%ˆØ	�‰Œ
Ø×ÑœD ›G XÔ.Ø×Ñ˜¤d¨1£gÔ.Ø×Ñ˜¤D¨£GÔ,Ø×Ñ˜¤4¨£7Õ+r   c                 óÌ   — t        d„ «      }t        d„ «      }t        j                  «       }|||fD ]0  }| j                  |›t        «       | j                  |›t        «       Œ2 y )Nc                   ó   — y r'   r   r   r   r   rË   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>"  r  r   c                   ó   — y r'   r   r   r   r   rË   z>TestRepr.test_formatting_produces_native_str.<locals>.<lambda>#  rÜ   r   )r,   r   r   r®   rJ   )r?   Úg_deadÚg_not_startedÚg_curr-   s        r   Ú#test_formatting_produces_native_strz,TestRepr.test_formatting_produces_native_str  sa   € ô ™\Ó*ˆÜ#¡LÓ1ˆÜ×#Ñ#Ó%ˆà˜¨Ó-ˆAà×!Ñ!ÙÜôð ×!Ñ!ÙÜõñ .r   r'   )r   r   r   rú   r   r;  rE  rI  rK  rS  rZ  ra  r   r   r   r:  r:  Ü  s4   „ á�8Ð-Ô.ó	Bò@òBò,ò!=òF,ór   r:  c                   ó$   — e Zd Zd„ Zd„ Zd„ Zd„ Zy)ÚTestMainGreenletc                 ó    — dt        t        j                  «       «      v sJ ‚t        t        j                  «       «      }dt        |«      vsJ ‚|S )Nr  )rB  r   r   r(  )r?   r”   s     r   Ú_check_current_is_mainz'TestMainGreenlet._check_current_is_main6  sH   € àœœh×1Ñ1Ó3Ó4Ñ4Ð4Ð4ä”×$Ñ$Ó&Ó'ˆØœT !›WÑ$Ð$Ð$Øˆr   c                 ób   — | j                  «       }t        d|fi «      }| j                  |«       y )NÚsubclass)re  r(  rR   )r?   Ú	main_typerg  s      r   Ú)test_main_greenlet_type_can_be_subclassedz:TestMainGreenlet.test_main_greenlet_type_can_be_subclassed>  s.   € Ø×/Ñ/Ó1ˆ	Ü˜
 Y L°"Ó5ˆØ×Ñ˜XÕ&r   c                 ót   — | j                  «        | j                  t        j                  «       t        «       y r'   )re  r®   r   r   r,   rB   s    r   Útest_main_greenlet_is_greenletz/TestMainGreenlet.test_main_greenlet_is_greenletC  s'   € Ø×#Ñ#Ô%Ø×Ñœh×1Ñ1Ó3´[ÕAr   c                 óÊ   ‡ ‡— ˆˆ fd„}t        j                   |«      Š‰j                  «        ‰ j                  t        «      5  t	        ‰d«       d d d «       y # 1 sw Y   y xY w)Nc                  ór   •— ‰j                  t        «      5  t        ‰ d«       d d d «       y # 1 sw Y   y xY wrE   )rG   rH   Úgetattr)r-   r?   s   €€r   Údo_itz1TestMainGreenlet.test_greenlet_run.<locals>.do_itH  s'   ø€ Ø×"Ñ"¤>Õ2Ü˜˜5Ô!÷ 3×2Ñ2ús   —-­6rF   )r   r   rG   rH   rn  )r?   ro  r-   s   ` @r   Útest_greenlet_runz"TestMainGreenlet.test_greenlet_runG  sG   ù€ õ	"ô ×Ñ˜eÓ$ˆØ	�‰Œ
Ø×Ñœ~Õ.Ü�A�uÔ÷ /×.Ñ.ús   ÁAÁA"N)r   r   r   re  ri  rk  rp  r   r   r   rc  rc  2  s   „ òò'ò
Bór   rc  c                   óB   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)ÚTestBrokenGreenletsc                 óÌ   — d„ }t         j                  j                  |«      }d|_        | j	                  t
        d«      5  |j                  «        d d d «       y # 1 sw Y   y xY w)Nc                  ó   — t        d«      ‚)NzNever get here)ÚAssertionErrorr   r   r   rü   z<TestBrokenGreenlets.test_failed_to_initialstub.<locals>.funcW  s   € Ü Ð!1Ó2Ð2r   Tz;Failed to switch stacks into a greenlet for the first time.)r   Ú	_greenletÚUnswitchableGreenletÚforce_switch_errorÚassertRaisesRegexÚSystemErrorr   )r?   rü   r-   s      r   Útest_failed_to_initialstubz.TestBrokenGreenlets.test_failed_to_initialstubV  sW   € ò	3ô ×Ñ×3Ñ3°DÓ9ˆØ#ˆÔà×#Ñ#¤KØ$aõcà�H‰HŒJ÷c÷ cñ cús   Á AÁA#c                 óº  ‡— g Šˆfd„}t         j                  j                  |«      }|j                  «        | j	                  ‰dg«       |j                  «        | j	                  ‰ddg«       d|_        | j                  t        d«      5  |j                  «        d d d «       d|_        |j                  «        | j	                  ‰g d¢«       y # 1 sw Y   Œ5xY w)Nc                  ó  •— ‰ j                  d«       t        j                  «       j                  j	                  «        ‰ j                  d«       t        j                  «       j                  j	                  «        ‰ j                  d«       y )Nr   r9   r4   r5   )Úrunss   €r   rü   zDTestBrokenGreenlets.test_failed_to_switch_into_running.<locals>.funcd  sZ   ø€ Ø�K‰K˜ŒNÜ×ÑÓ!×(Ñ(×/Ñ/Ô1Ø�K‰K˜ŒNÜ×ÑÓ!×(Ñ(×/Ñ/Ô1Ø�K‰K˜�Nr   r   r9   Tz0Failed to switch stacks into a running greenlet.F)r   r9   r4   )r   rv  rw  r   r<   rx  ry  rz  )r?   rü   r-   r~  s      @r   Ú"test_failed_to_switch_into_runningz6TestBrokenGreenlets.test_failed_to_switch_into_runningb  s¸   ø€ Øˆô	ô ×Ñ×3Ñ3°DÓ9ˆØ	�‰Œ
Ø×Ñ˜ ˜sÔ#Ø	�‰Œ
Ø×Ñ˜  1˜vÔ&Ø#ˆÔà×#Ñ#¤KØ$VõXà�H‰HŒJ÷Xð  %ˆÔØ	�‰Œ
Ø×Ñ˜šyÕ)÷Xð Xús   ÂCÃCc                 ó²   — | j                  d«      }| j                  d|j                  «       | j                  |j                  | j	                  «       «       y )Nzfail_slp_switch.pyzfail_slp_switch is running)ÚassertScriptRaisesrI   ÚoutputÚ
returncodeÚ,get_expected_returncodes_for_aborted_process©r?   Úexs     r   Ú&test_failed_to_slp_switch_into_runningz:TestBrokenGreenlets.test_failed_to_slp_switch_into_running~  sA   € Ø×$Ñ$Ð%9Ó:ˆà�‰Ð2°B·I±IÔ>Ø�‰�b—m‘m T×%VÑ%VÓ%XÕYr   c                 óþ   — | j                  d«      }| j                  d|«       | j                  d|«       | j                  d|«       | j                  d|«       | j                  d|«       | j                  d|«       y )Nzfail_switch_two_greenlets.pyz	In g1_runÚTRACEzLEAVE TRACEzFalling off end of mainzFalling off end of g1_runzFalling off end of g2©Ú
run_scriptrI   ©r?   r‚  s     r   Ú#test_reentrant_switch_two_greenletsz7TestBrokenGreenlets.test_reentrant_switch_two_greenlets„  sh   € à—‘Ð!?Ó@ˆØ�‰�k 6Ô*Ø�‰�g˜vÔ&Ø�‰�m VÔ,Ø�‰Ð/°Ô8Ø�‰Ð1°6Ô:Ø�‰Ð-¨vÕ6r   c                 óš   — | j                  dd¬«      }| j                  d|j                  «       | j                  d|j                  «       y )Nzfail_switch_three_greenlets.py)r   )Ú	exitcodesrö   zpositional arguments)r�  rI   r‚  r…  s     r   Ú%test_reentrant_switch_three_greenletsz9TestBrokenGreenlets.test_reentrant_switch_three_greenletsŽ  s@   € ð ×$Ñ$Ð%EÐQUÐ$ÓVˆà�‰�k 2§9¡9Ô-Ø�‰Ð,¨b¯i©iÕ8r   c                 óJ   — | j                  d«      }| j                  d|«       y )Nzfail_switch_three_greenlets2.pya­  RESULTS: [('trace', 'switch'), ('trace', 'switch'), ('g2 arg', 'g2 from tracefunc'), ('trace', 'switch'), ('main g1', 'from g2_run'), ('trace', 'switch'), ('g1 arg', 'g1 from main'), ('trace', 'switch'), ('main g2', 'from g1_run'), ('trace', 'switch'), ('g1 from parent', 'g1 from main 2'), ('trace', 'switch'), ('main g1.2', 'g1 done'), ('trace', 'switch'), ('g2 from parent', ()), ('trace', 'switch'), ('main g2.2', 'g2 done')]rŠ  rŒ  s     r   Ú&test_reentrant_switch_three_greenlets2z:TestBrokenGreenlets.test_reentrant_switch_three_greenlets2—  s)   € ð —‘Ð!BÓCˆØ�‰ð=ð õ		
r   c                 óJ   — | j                  d«      }| j                  d|«       y )Nz#fail_initialstub_already_started.pya!  RESULTS: ['Begin C', 'Switch to b from B.__getattribute__ in C', ('Begin B', ()), '_B_run switching to main', ('main from c', 'From B'), 'B.__getattribute__ back from main in C', ('Begin A', (None,)), ('A dead?', True, 'B dead?', True, 'C dead?', False), 'C done', ('main from c.2', None)]rŠ  rŒ  s     r   Ú4test_reentrant_switch_GreenletAlreadyStartedInPythonzHTestBrokenGreenlets.test_reentrant_switch_GreenletAlreadyStartedInPython©  s'   € Ø—‘Ð!FÓGˆà�‰ð1ð
 õ	
r   c                 óJ   — | j                  d«      }| j                  d|«       y )Nzfail_clearing_run_switches.pyz„RESULTS [('G.__getattribute__', 'run'), ('RunCallable', '__del__'), ('main: g.switch()', 'from RunCallable'), ('run_func', 'enter')]rŠ  rŒ  s     r   Ú*test_reentrant_switch_run_callable_has_delz>TestBrokenGreenlets.test_reentrant_switch_run_callable_has_delµ  s'   € Ø—‘Ð!@ÓAˆØ�‰ðð õ	
r   c                 óx   — t         s| j                  d«       | j                  d«      }| j                  d|«       y )Nz0Only free-threaded builds take critical sectionszfail_switch_critical_section.pyzSWITCH CS OK)r   ÚskipTestr‹  rI   rŒ  s     r   Ú+test_switch_leaves_no_critical_section_heldz?TestBrokenGreenlets.test_switch_leaves_no_critical_section_held¿  s1   € õ +Ø�M‰MÐLÔMØ—‘Ð!BÓCˆØ�‰�n fÕ-r   N)r   r   r   r{  r  r‡  r�  r�  r’  r”  r–  r™  r   r   r   rr  rr  R  s0   „ ò
ò*ò8Zò7ò9ò
ò$

ò
ó.r   rr  c                   óL   — e Zd Z ej                   eed«      d«      d„ «       Zy)Ú
TestModuleÚ_is_gil_enabledz,Needs 3.13 and above for sys._is_gil_enabledc                 óž   — t         r$| j                  t        j                  «       «       y | j	                  t        j                  «       «       y r'   )r   rÂ   r    rœ  rÀ   rB   s    r   Útest_no_gil_on_free_threadedz'TestModule.test_no_gil_on_free_threadedÏ  s3   € õ 'Ø×ÑœS×0Ñ0Ó2Õ3à�O‰OœC×/Ñ/Ó1Õ2r   N)r   r   r   rî  Ú
skipUnlessrú   r    rž  r   r   r   r›  r›  Í  s0   „ à€X×Ñ™ Ð&7Ó8ØGóIñ3óIñ3r   r›  Ú__main__)"r˜   r    r‹   rp   rî  Úabcr   r   r   r,   rÒ  r   r   r	   r
   r   r   Ú	leakcheckr   r   r   r   r  r   r$   r/   r1   rò  r:  rc  rr  r›  r   r  r   r   r   Ú<module>r£     sÅ   ðÛ 	Û 
Û Û Û å Ý ã Ý ,Ý Ý "Ý Ý Ý Ý )Ý &Ý 7Ý (Ý +ô	�	ô 	òòôt�8ô tônjD (ô jDôZSˆxô Sôl�xô ô@y.˜(ô y.ôv3�ô 3ð ˆzÒØ€H‡M�M…Oð r   