o
    r¨Êh¸Q  ã                   @   s¬   d dl 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 G dd„ dejƒZG dd	„ d	ejƒZ	G d
d„ dejƒZ
G dd„ dejƒZdd„ ZedkrTejdd� dS dS )é    N)ÚDummyOptions)ÚDummyPConfig)ÚDummyProcess)Ú
DummyEventc                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )Ú"EventSubscriptionNotificationTestsc                 C   ó   ddl m} g |jd d …< d S ©Nr   ©Úevents©Ú
supervisorr
   Ú	callbacks©Úselfr
   © r   úN/var/www/html/env/lib/python3.10/site-packages/supervisor/tests/test_events.pyÚsetUp
   ó   z(EventSubscriptionNotificationTests.setUpc                 C   r   r   r   r   r   r   r   ÚtearDown   r   z+EventSubscriptionNotificationTests.tearDownc                 C   s,   ddl m} | d d ¡ |  |jdg¡ d S ©Nr   r	   )NN)r   r
   Ú	subscribeÚassertEqualr   r   r   r   r   Útest_subscribe   s   z1EventSubscriptionNotificationTests.test_subscribec                 C   s@   ddl m} g d¢|jd d …< | dd¡ |  |jddg¡ d S )Nr   r	   )©é   r   )é   r   ©é   r   r   r   r   )r   r
   r   Úunsubscriber   r   r   r   r   Útest_unsubscribe   s   z3EventSubscriptionNotificationTests.test_unsubscribec                 C   s6   ddl m} dg|jd d …< | ¡  |  |jg ¡ d S r   )r   r
   r   Úclearr   r   r   r   r   Ú
test_clear   s   z-EventSubscriptionNotificationTests.test_clearc                    sN   ddl m} g ‰ ‡ fdd„}t|fg|jd d …< | tƒ ¡ |  ˆ dg¡ d S )Nr   r	   c                    ó   ˆ   d¡ d S ©Nr   ©Úappend©Úevent©ÚLr   r   Úcallback&   ó   zEEventSubscriptionNotificationTests.test_notify_true.<locals>.callbackr   ©r   r
   r   r   Únotifyr   )r   r
   r*   r   r(   r   Útest_notify_true#   s   z3EventSubscriptionNotificationTests.test_notify_truec                    sZ   ddl m} g ‰ ‡ fdd„}G dd„ dƒ}||fg|jd d …< | tƒ ¡ |  ˆ g ¡ d S )Nr   r	   c                    r"   r#   r$   r&   r(   r   r   r*   /   r+   zFEventSubscriptionNotificationTests.test_notify_false.<locals>.callbackc                   @   ó   e Zd ZdS )zJEventSubscriptionNotificationTests.test_notify_false.<locals>.AnotherEventN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   ÚAnotherEvent1   ó    r4   )r   r
   r   r-   r   r   )r   r
   r*   r4   r   r(   r   Útest_notify_false,   s   z4EventSubscriptionNotificationTests.test_notify_falsec                    s^   ddl m} g ‰ ‡ fdd„}G dd„ dtƒ}t|fg|jd d …< | |ƒ ¡ |  ˆ dg¡ d S )Nr   r	   c                    r"   r#   r$   r&   r(   r   r   r*   :   r+   zMEventSubscriptionNotificationTests.test_notify_via_subclass.<locals>.callbackc                   @   r/   )zSEventSubscriptionNotificationTests.test_notify_via_subclass.<locals>.ASubclassEventNr0   r   r   r   r   ÚASubclassEvent<   r5   r7   r   r,   )r   r
   r*   r7   r   r(   r   Útest_notify_via_subclass7   s   z;EventSubscriptionNotificationTests.test_notify_via_subclassN)r1   r2   r3   r   r   r   r   r!   r.   r6   r8   r   r   r   r   r   	   s    	r   c                   @   sÌ   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1S )2ÚTestEventTypesc                 C   óF   ddl m} |dddƒ}|  |jd¡ |  |jd¡ |  |jd¡ d S )Nr   ©ÚProcessLogEventr   r   r   )Úsupervisor.eventsr<   r   ÚprocessÚpidÚdata)r   r<   Úinstr   r   r   Útest_ProcessLogEvent_attributesD   ó
   z.TestEventTypes.test_ProcessLogEvent_attributesc                 C   ó,   ddl m} ddl m} |  t||ƒ¡ d S )Nr   r;   ©ÚEvent)r=   r<   rF   Ú
assertTrueÚ
issubclass)r   r<   rF   r   r   r   Ú test_ProcessLogEvent_inheritanceK   ó
   ÿz/TestEventTypes.test_ProcessLogEvent_inheritancec                 C   óT   ddl m} |dddƒ}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ d S )Nr   ©ÚProcessLogStdoutEventr   r   r   Ústdout)r=   rM   r   r>   r?   r@   Úchannel)r   rM   rA   r   r   r   Ú%test_ProcessLogStdoutEvent_attributesR   ó   z4TestEventTypes.test_ProcessLogStdoutEvent_attributesc                 C   rD   )Nr   rL   r;   )r=   rM   r<   rG   rH   )r   rM   r<   r   r   r   Ú&test_ProcessLogStdoutEvent_inheritanceZ   rJ   z5TestEventTypes.test_ProcessLogStdoutEvent_inheritancec                 C   rK   )Nr   ©ÚProcessLogStderrEventr   r   r   Ústderr)r=   rT   r   r>   r?   r@   rO   )r   rT   rA   r   r   r   Ú%test_ProcessLogStderrEvent_attributesa   rQ   z4TestEventTypes.test_ProcessLogStderrEvent_attributesc                 C   rD   )Nr   rS   r;   )r=   rT   r<   rG   rH   )r   rT   r<   r   r   r   Ú&test_ProcessLogStderrEvent_inheritancei   rJ   z5TestEventTypes.test_ProcessLogStderrEvent_inheritancec                 C   r:   )Nr   ©ÚProcessCommunicationEventr   r   r   )r=   rY   r   r>   r?   r@   )r   rY   rA   r   r   r   Ú)test_ProcessCommunicationEvent_attributesp   rC   z8TestEventTypes.test_ProcessCommunicationEvent_attributesc                 C   rD   )Nr   rX   rE   )r=   rY   rF   rG   rH   )r   rY   rF   r   r   r   Ú*test_ProcessCommunicationEvent_inheritancew   rJ   z9TestEventTypes.test_ProcessCommunicationEvent_inheritancec                 C   rK   )Nr   ©ÚProcessCommunicationStdoutEventr   r   r   rN   )r=   r]   r   r>   r?   r@   rO   )r   r]   rA   r   r   r   Ú/test_ProcessCommunicationStdoutEvent_attributes~   rQ   z>TestEventTypes.test_ProcessCommunicationStdoutEvent_attributesc                 C   rD   )Nr   r\   rX   )r=   r]   rY   rG   rH   )r   r]   rY   r   r   r   Ú0test_ProcessCommunicationStdoutEvent_inheritance†   ó   ÿÿz?TestEventTypes.test_ProcessCommunicationStdoutEvent_inheritancec                 C   rK   )Nr   ©ÚProcessCommunicationStderrEventr   r   r   rU   )r=   rb   r   r>   r?   r@   rO   )r   rb   rA   r   r   r   Ú/test_ProcessCommunicationStderrEvent_attributesŽ   rQ   z>TestEventTypes.test_ProcessCommunicationStderrEvent_attributesc                 C   rD   )Nr   ra   rX   )r=   rb   rY   rG   rH   )r   rb   rY   r   r   r   Ú0test_ProcessCommunicationStderrEvent_inheritance–   r`   z?TestEventTypes.test_ProcessCommunicationStderrEvent_inheritancec                 C   s6   ddl m} |ddƒ}|  |jd¡ |  |jd¡ d S )Nr   ©ÚRemoteCommunicationEventr   r   )r=   rf   r   Útyper@   )r   rf   rA   r   r   r   Ú(test_RemoteCommunicationEvent_attributesž   s   
z7TestEventTypes.test_RemoteCommunicationEvent_attributesc                 C   rD   )Nr   re   rE   )r=   rf   rF   rG   rH   )r   rf   rF   r   r   r   Ú)test_RemoteCommunicationEvent_inheritance¤   rJ   z8TestEventTypes.test_RemoteCommunicationEvent_inheritancec                 C   sX   ddl m} tƒ }t|dddƒ}t|ƒ}tƒ }|||ƒ}|  |j|¡ |  |j|¡ d S )Nr   ©ÚEventRejectedEventÚprocess1ú/bin/process1)	r=   rk   r   r   r   r   r   r>   r'   )r   rk   ÚoptionsÚpconfig1r>   Úrejected_eventr'   r   r   r   Ú"test_EventRejectedEvent_attributes«   s   
z1TestEventTypes.test_EventRejectedEvent_attributesc                 C   rD   )Nr   rj   rE   )r=   rk   rF   ÚassertFalserH   )r   rk   rF   r   r   r   Ú3test_EventRejectedEvent_does_not_inherit_from_eventµ   rJ   zBTestEventTypes.test_EventRejectedEvent_does_not_inherit_from_eventc                 C   s0   ddl m} |j|j|jfD ]}|  |¡ qd S r   )r   r
   ÚSupervisorStateChangeEventÚSupervisorRunningEventÚSupervisorStoppingEventÚ$_test_one_SupervisorStateChangeEvent©r   r
   Úklassr   r   r   Ú$test_all_SupervisorStateChangeEvents¼   s   ýûz3TestEventTypes.test_all_SupervisorStateChangeEventsc                 C   s    ddl m} |  t||ƒ¡ d S )Nr   )rt   )r=   rt   rG   rH   )r   ry   rt   r   r   r   rw   Å   s   z3TestEventTypes._test_one_SupervisorStateChangeEventc              	   C   sH   ddl m} |j|j|j|j|j|j|j|j	|j
f	D ]}|  |¡ qd S r   )r   r
   ÚProcessStateEventÚProcessStateStoppedEventÚProcessStateExitedEventÚProcessStateFatalEventÚProcessStateBackoffEventÚProcessStateRunningEventÚProcessStateUnknownEventÚProcessStateStoppingEventÚProcessStateStartingEventÚ_test_one_ProcessStateEventrx   r   r   r   Útest_all_ProcessStateEventsÉ   s   ÷õz*TestEventTypes.test_all_ProcessStateEventsc                 C   s€   ddl m} ddlm} |  t||ƒ¡ tƒ }t|dddƒ}t|ƒ}|||j	ƒ}|  
|j|¡ |  
|j|j	¡ |  
|jd¡ d S )Nr   ©ÚProcessStates)r{   rl   rm   T)Úsupervisor.statesr‡   r=   r{   rG   rH   r   r   r   ÚSTARTINGr   r>   Ú
from_stateÚexpected)r   ry   r‡   r{   rn   ro   r>   rA   r   r   r   r„   Ø   s   z*TestEventTypes._test_one_ProcessStateEventc                 C   s4   ddl m} |j|j|j|jfD ]}|  |¡ qd S r   )r   r
   Ú	TickEventÚ
Tick5EventÚTick60EventÚTick3600EventÚ_test_one_TickEventrx   r   r   r   Útest_all_TickEventsä   s   üúz"TestEventTypes.test_all_TickEventsc                 C   sF   ddl m} |  t||ƒ¡ |ddƒ}|  |jd¡ |  |jd¡ d S )Nr   )rŒ   r   r   )r=   rŒ   rG   rH   r   ÚwhenÚsupervisord)r   ry   rŒ   rA   r   r   r   r�   î   s
   
z"TestEventTypes._test_one_TickEventc                 C   ó&   ddl m} |dƒ}|  |jd¡ d S )Nr   ©ÚProcessGroupAddedEventÚ	myprocess)r=   r–   r   Úgroup)r   r–   rA   r   r   r   Ú&test_ProcessGroupAddedEvent_attributesö   ó   z5TestEventTypes.test_ProcessGroupAddedEvent_attributesc                 C   r”   )Nr   ©ÚProcessGroupRemovedEventr—   )r=   rœ   r   r˜   )r   rœ   rA   r   r   r   Ú(test_ProcessGroupRemovedEvent_attributesû   rš   z7TestEventTypes.test_ProcessGroupRemovedEvent_attributesN)r1   r2   r3   rB   rI   rP   rR   rV   rW   rZ   r[   r^   r_   rc   rd   rh   ri   rq   rs   rz   rw   r…   r„   r‘   r�   r™   r�   r   r   r   r   r9   C   s2    
	
r9   c                   @   s„   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS ) ÚTestSerializationsc                 C   sv   |  d¡}|d }d}i }t|ƒdkr|d }|r7ztdd„ |  ¡ D ƒƒ}W ||fS  ty6   td| ƒ‚w ||fS )NÚ
r   Ú r   c                 S   s   g | ]}|  d d¡‘qS )ú:r   )Úsplit)Ú.0Úxr   r   r   Ú
<listcomp>
  s    z3TestSerializations._deserialize.<locals>.<listcomp>z'headerdata %r could not be deserialized)r¢   ÚlenÚdictÚ
ValueErrorÚAssertionError)r   Úserializationr@   Ú
headerdataÚpayloadÚheadersr   r   r   Ú_deserialize  s$   

ÿýÿÿzTestSerializations._deserializec                    ó¤   t ƒ }t|dddƒ‰ tˆ ƒ}ddlm} G ‡ fdd„dƒ}||_||ddƒ}|  | ¡ ¡\}}|  |d	 d|¡ |  |d
 d|¡ |  |d d|¡ |  |d¡ d S )Nrl   rm   r   rL   c                       ó   e Zd Z” ZdS )z=TestSerializations.test_plog_stdout_event.<locals>.DummyGroupN©r1   r2   r3   Úconfigr   ©ro   r   r   Ú
DummyGroup  ó    r´   r   ÚyoÚprocessnameÚ	groupnamer?   Ú1)	r   r   r   r=   rM   r˜   r®   r¬   r   )r   rn   rl   rM   r´   r'   r­   r¬   r   r³   r   Útest_plog_stdout_event  ó   z)TestSerializations.test_plog_stdout_eventc                    r¯   )Nrl   rm   r   rS   c                       r°   )z=TestSerializations.test_plog_stderr_event.<locals>.DummyGroupNr±   r   r³   r   r   r´   %  rµ   r´   r   r¶   r·   r¸   r?   r¹   )	r   r   r   r=   rT   r˜   r®   r¬   r   )r   rn   rl   rT   r´   r'   r­   r¬   r   r³   r   Útest_plog_stderr_event   r»   z)TestSerializations.test_plog_stderr_eventc                    r¯   )Nrl   rm   r   r\   c                       r°   )z>TestSerializations.test_pcomm_stdout_event.<locals>.DummyGroupNr±   r   r³   r   r   r´   4  rµ   r´   r   r¶   r·   r¸   r?   r¹   )	r   r   r   r=   r]   r˜   r®   r¬   r   )r   rn   rl   r]   r´   r'   r­   r¬   r   r³   r   Útest_pcomm_stdout_event/  r»   z*TestSerializations.test_pcomm_stdout_eventc                    s¤   t ƒ }t|dddƒ‰ tˆ ƒ}G ‡ fdd„dƒ}||_ddlm} ||ddƒ}|  | ¡ ¡\}}|  |d	 d|¡ |  |d
 d|¡ |  |d d|¡ |  |d¡ d S )Nrl   rm   c                       r°   )z>TestSerializations.test_pcomm_stderr_event.<locals>.DummyGroupNr±   r   r³   r   r   r´   B  rµ   r´   r   ra   r   r¶   r·   r¸   r?   r¹   )	r   r   r   r˜   r=   rb   r®   r¬   r   )r   rn   rl   r´   rb   r'   r­   r¬   r   r³   r   Útest_pcomm_stderr_event>  s   z*TestSerializations.test_pcomm_stderr_eventc                 C   sJ   ddl m} |ddƒ}|  | ¡ ¡\}}|  |d d|¡ |  |d¡ d S )Nr   re   ÚfooÚbarrg   )r=   rf   r®   r¬   r   )r   rf   r'   r­   r¬   r   r   r   Útest_remote_comm_eventM  s
   
z)TestSerializations.test_remote_comm_eventc                 C   óF   ddl m} |dƒ}|  | ¡ ¡\}}|  |d d¡ |  |d¡ d S )Nr   r•   r¿   r¸   r    )r=   r–   r®   r¬   r   )r   r–   r'   r­   r¬   r   r   r   Útest_process_group_added_eventT  ó
   z1TestSerializations.test_process_group_added_eventc                 C   rÂ   )Nr   r›   r¿   r¸   r    )r=   rœ   r®   r¬   r   )r   rœ   r'   r­   r¬   r   r   r   Ú test_process_group_removed_event[  rÄ   z3TestSerializations.test_process_group_removed_eventc           
         sÌ   ddl m} ddlm} |j|jfD ]Q}tƒ }t|dddƒ‰ G ‡ fdd„dƒ}tˆ ƒ}||_	|||j
ƒ}|  | ¡ ¡\}}	|  t|ƒd¡ |  |d	 d¡ |  |d
 d¡ |  |d d¡ |  |	d¡ qd S )Nr   r†   r	   rl   rm   c                       r°   )zUTestSerializations.test_process_state_events_without_extra_values.<locals>.DummyGroupNr±   r   r³   r   r   r´   l  rµ   r´   r   r·   r¸   rŠ   r‰   r    )rˆ   r‡   r   r
   r~   r�   r   r   r   r˜   r‰   r®   r¬   r   r¦   ©
r   r‡   r
   ry   rn   r´   rl   r'   r­   r¬   r   r³   r   Ú.test_process_state_events_without_extra_valuesb  s(   þÿïzATestSerializations.test_process_state_events_without_extra_valuesc           
         sæ   ddl m} ddlm} |j|j|jfD ]\}tƒ }t|dddƒ‰ G ‡ fdd„dƒ}t	ˆ ƒ}||_
d|_|||jƒ}|  | ¡ ¡\}}	|  t|ƒd	¡ |  |d
 d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |	d¡ qd S )Nr   r†   r	   rl   rm   c                       r°   )zITestSerializations.test_process_state_events_with_pid.<locals>.DummyGroupNr±   r   r³   r   r   r´   ƒ  rµ   r´   r   é   r·   r¸   rŠ   r‰   r?   r¹   r    )rˆ   r‡   r   r
   r€   r|   r‚   r   r   r   r˜   r?   r‰   r®   r¬   r   r¦   rÆ   r   r³   r   Ú"test_process_state_events_with_pidx  s.   ýÿìz5TestSerializations.test_process_state_events_with_pidc           
         sD  ddl m} ddlm} |j|jfD ]�}tƒ }t|dddƒ‰ G ‡ fdd„dƒ}tˆ ƒ}||_	|||j
ƒ}|  | ¡ ¡\}}	|  t|ƒd¡ |  |d	 d¡ |  |d
 d¡ |  |d d¡ |  |d d¡ |  |	d¡ d|_|||j
ƒ}|  | ¡ ¡\}}	|  |d d¡ d|_|||j
ƒ}|  | ¡ ¡\}}	|  |d d¡ qd S )Nr   r†   r	   rl   rm   c                       r°   )zUTestSerializations.test_process_state_events_starting_and_backoff.<locals>.DummyGroupNr±   r   r³   r   r   r´   ›  rµ   r´   rÈ   r·   r¸   rŠ   r‰   ÚtriesÚ0r    r   r¹   r   Ú2)rˆ   r‡   r   r
   rƒ   r   r   r   r   r˜   r‰   r®   r¬   r   r¦   ÚbackoffrÆ   r   r³   r   Ú.test_process_state_events_starting_and_backoff‘  s:   þÿæzATestSerializations.test_process_state_events_starting_and_backoffc           	         sæ   ddl m} ddlm} tƒ }t|dddƒ‰ tˆ ƒ}G ‡ fdd„dƒ}||_d|_|j	||j
d	d
�}|  | ¡ ¡\}}|  t|ƒd¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d¡ d S )Nr   r	   r†   rl   rm   c                       r°   )zOTestSerializations.test_process_state_exited_event_expected.<locals>.DummyGroupNr±   r   r³   r   r   r´   ¶  rµ   r´   r   T©r‹   é   r·   r¸   r?   r¹   rŠ   r‰   r‹   r    ©r   r
   rˆ   r‡   r   r   r   r˜   r?   r}   r‰   r®   r¬   r   r¦   ©	r   r
   r‡   rn   rl   r´   r'   r­   r¬   r   r³   r   Ú(test_process_state_exited_event_expected°  ó(   þz;TestSerializations.test_process_state_exited_event_expectedc           	         sæ   ddl m} ddlm} tƒ }t|dddƒ‰ tˆ ƒ}G ‡ fdd„dƒ}||_d|_|j	||j
d	d
�}|  | ¡ ¡\}}|  t|ƒd¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d¡ d S )Nr   r	   r†   rl   rm   c                       r°   )zQTestSerializations.test_process_state_exited_event_unexpected.<locals>.DummyGroupNr±   r   r³   r   r   r´   Ì  rµ   r´   r   FrÏ   rÐ   r·   r¸   r?   r¹   rŠ   r‰   r‹   rË   r    rÑ   rÒ   r   r³   r   Ú*test_process_state_exited_event_unexpectedÆ  rÔ   z=TestSerializations.test_process_state_exited_event_unexpectedc                 C   sB   ddl m} | ¡ }|  | ¡ ¡\}}|  |i ¡ |  |d¡ d S )Nr   r	   r    )r   r
   ru   r®   r¬   r   )r   r
   r'   r­   r¬   r   r   r   Útest_supervisor_sc_eventÜ  s
   z+TestSerializations.test_supervisor_sc_eventc                 C   s^   ddl m} |j|j|jfD ]}|ddƒ}|  | ¡ ¡\}}|  |ddi¡ |  |d¡ qd S )Nr   r	   r   r   r’   r¹   r    )r   r
   r�   rŽ   r�   r®   r¬   r   )r   r
   ry   r'   r­   r¬   r   r   r   Útest_tick_eventsã  s   ý
øz#TestSerializations.test_tick_eventsN)r1   r2   r3   r®   rº   r¼   r½   r¾   rÁ   rÃ   rÅ   rÇ   rÉ   rÎ   rÓ   rÕ   rÖ   r×   r   r   r   r   rž      s     rž   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestUtilityFunctionsc                 C   s8   ddl m} |jj ¡ D ]\}}|  | |¡|¡ qd S r   )r   r
   Ú
EventTypesÚ__dict__Úitemsr   ÚgetEventNameByType)r   r
   ÚnameÚvaluer   r   r   Útest_getEventNameByTypeð  s   ÿz,TestUtilityFunctions.test_getEventNameByTypec                 C   sd   ddl m} |  t|jdƒ¡ G dd„ d|jƒ}z| d|¡ |  |jj|u ¡ W |j`d S |j`w )Nr   r	   ÚFOOc                   @   r/   )z4TestUtilityFunctions.test_register.<locals>.FooEventNr0   r   r   r   r   ÚFooEventø  r5   rá   )	r   r
   rr   ÚhasattrrÙ   rF   ÚregisterrG   rà   )r   r
   rá   r   r   r   Útest_registerõ  s   z"TestUtilityFunctions.test_registerN)r1   r2   r3   rß   rä   r   r   r   r   rØ   ï  s    rØ   c                   C   s   t  tjt ¡S )N)ÚunittestÚfindTestCasesÚsysÚmodulesr1   r   r   r   r   Ú
test_suite   s   ré   Ú__main__)ÚdefaultTest)rç   rå   Úsupervisor.tests.baser   r   r   r   ÚTestCaser   r9   rž   rØ   ré   r1   Úmainr   r   r   r   Ú<module>   s     : > pÿ