a
    $ñ»jáQ  ã                   @  s"  d dl mZ d dlZd dlZd dlmZ ddlmZ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eG dd„ dƒƒZeG dd„ dƒƒZG dd„ dej	ƒZeG dd„ dƒƒZeG dd„ dƒƒZddœdd„Zddœdd„Zdddd œd!d"„Zddd#œd$d%„Zdd&dd'œd(d)„Zdd*dd+œd,d-„Zdddd.œd/d0„Zddd#œd1d2„Zdjddd3dd4œd5d6„Zdddd7œd8d9„Zdkddddd3dd:œd;d<„Zdddd=œd>d?„Zed@ƒeG dAdB„ dBƒƒƒZedCƒeG dDdE„ dEƒƒƒZ edFƒeG dGdH„ dHƒƒƒZ!edIƒeG dJdK„ dKƒƒƒZ"edLƒeG dMdN„ dNƒƒƒZ#edOƒeG dPdQ„ dQƒƒƒZ$edRƒeG dSdT„ dTƒƒƒZ%edUƒeG dVdW„ dWƒƒƒZ&edXƒeG dYdZ„ dZƒƒƒZ'ed[ƒeG d\d]„ d]ƒƒƒZ(ed^ƒeG d_d`„ d`ƒƒƒZ)edaƒeG dbdc„ dcƒƒƒZ*eddƒeG dedf„ dfƒƒƒZ+edgƒeG dhdi„ diƒƒƒZ,dS )lé    )ÚannotationsN)Ú	dataclassé   )Úevent_classÚT_JSON_DICTc                   @  s²   e 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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dZdZdZdZdZdZ dZ!d Z"d!Z#d"d#œd$d%„Z$e%d"d d&œd'd(„ƒZ&d)S )*Ú
ResultCodezè
    Indicates the PC/SC error code.
    This maps to:
    PC/SC Lite: https://pcsclite.apdu.fr/api/group__ErrorCodes.html
    Microsoft:
    https://learn.microsoft.com/en-us/windows/win32/secauthn/authentication-return-values
    Úsuccesszremoved-cardú
reset-cardzunpowered-cardzunresponsive-cardzunsupported-cardzreader-unavailablezsharing-violationznot-transactedzno-smartcardzproto-mismatchzsystem-cancelledz	not-readyZ	cancelledzinsufficient-bufferzinvalid-handlezinvalid-parameterzinvalid-valuez	no-memoryÚtimeoutzunknown-readerzunsupported-featurezno-readers-availablezservice-stoppedz
no-servicez
comm-errorzinternal-errorzserver-too-busyZ
unexpectedÚshutdownzunknown-cardÚunknownÚstr©Úreturnc                 C  s   | j S ©N©Úvalue©Úself© r   ú@E:\soccer\ml_env\Lib\site-packages\mycdp/smart_card_emulation.pyÚto_json8   s    zResultCode.to_json©Újsonr   c                 C  s   | |ƒS r   r   ©Úclsr   r   r   r   Ú	from_json;   s    zResultCode.from_jsonN)'Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚSUCCESSZREMOVED_CARDÚ
RESET_CARDZUNPOWERED_CARDZUNRESPONSIVE_CARDZUNSUPPORTED_CARDZREADER_UNAVAILABLEZSHARING_VIOLATIONZNOT_TRANSACTEDZNO_SMARTCARDZPROTO_MISMATCHZSYSTEM_CANCELLEDZ	NOT_READYZ	CANCELLEDZINSUFFICIENT_BUFFERZINVALID_HANDLEZINVALID_PARAMETERZINVALID_VALUEZ	NO_MEMORYÚTIMEOUTZUNKNOWN_READERZUNSUPPORTED_FEATUREZNO_READERS_AVAILABLEZSERVICE_STOPPEDZ
NO_SERVICEZ
COMM_ERRORÚINTERNAL_ERRORZSERVER_TOO_BUSYZ
UNEXPECTEDZSHUTDOWNZUNKNOWN_CARDÚUNKNOWNr   Úclassmethodr   r   r   r   r   r      sH   r   c                   @  s>   e Zd ZdZdZdZdZddœdd„Zedd d	œd
d„ƒZ	dS )Ú	ShareModez%Maps to the ``SCARD_SHARE_*`` values.ZsharedÚ	exclusiveÚdirectr   r   c                 C  s   | j S r   r   r   r   r   r   r   F   s    zShareMode.to_jsonr   c                 C  s   | |ƒS r   r   r   r   r   r   r   I   s    zShareMode.from_jsonN)
r   r   r   r    ZSHAREDZ	EXCLUSIVEZDIRECTr   r&   r   r   r   r   r   r'   @   s   r'   c                   @  sB   e Zd ZdZdZdZdZdZddœdd	„Ze	dd d
œdd„ƒZ
dS )ÚDispositionz2Indicates what the reader should do with the card.z
leave-cardr	   zunpower-cardz
eject-cardr   r   c                 C  s   | j S r   r   r   r   r   r   r   U   s    zDisposition.to_jsonr   c                 C  s   | |ƒS r   r   r   r   r   r   r   X   s    zDisposition.from_jsonN)r   r   r   r    Z
LEAVE_CARDr"   ZUNPOWER_CARDZ
EJECT_CARDr   r&   r   r   r   r   r   r*   N   s   r*   c                   @  sJ   e Zd ZdZdZdZdZdZdZdZ	dd	œd
d„Z
edd dœdd„ƒZdS )ÚConnectionStatez,Maps to ``SCARD_*`` connection state values.ZabsentÚpresentZ	swallowedZpoweredZ
negotiableZspecificr   r   c                 C  s   | j S r   r   r   r   r   r   r   f   s    zConnectionState.to_jsonr   c                 C  s   | |ƒS r   r   r   r   r   r   r   i   s    zConnectionState.from_jsonN)r   r   r   r    ZABSENTZPRESENTZ	SWALLOWEDZPOWEREDZ
NEGOTIABLEZSPECIFICr   r&   r   r   r   r   r   r+   ]   s   r+   c                   @  s¸   e Zd ZU dZdZded< dZded< dZded< dZded< dZ	ded< dZ
ded	< dZded
< dZded< dZded< dZded< dZded< ddœdd„Zedd dœdd„ƒZdS )ÚReaderStateFlagsz$Maps to the ``SCARD_STATE_*`` flags.Nútyping.Optional[bool]ÚunawareÚignoreÚchangedr   ÚunavailableÚemptyr,   r(   ÚinuseÚmuteÚ	unpoweredr   r   c                 C  sæ   t ƒ }| jd ur| j|d< | jd ur.| j|d< | jd urB| j|d< | jd urV| j|d< | jd urj| j|d< | jd ur~| j|d< | jd ur’| j|d< | jd ur¦| j|d< | j	d urº| j	|d	< | j
d urÎ| j
|d
< | jd urâ| j|d< |S )Nr/   r0   r1   r   r2   r3   r,   r(   r4   r5   r6   )Údictr/   r0   r1   r   r2   r3   r,   r(   r4   r5   r6   ©r   r   r   r   r   r   }   s0    





















zReaderStateFlags.to_jsonr   c                 C  sX  | |  dd ¡d urt|d ƒnd |  dd ¡d ur<t|d ƒnd |  dd ¡d urZt|d ƒnd |  dd ¡d urxt|d ƒnd |  dd ¡d ur–t|d ƒnd |  dd ¡d ur´t|d ƒnd |  dd ¡d urÒt|d ƒnd |  dd ¡d urðt|d ƒnd |  d	d ¡d u�rt|d	 ƒnd |  d
d ¡d u�r0t|d
 ƒnd |  dd ¡d u�rPt|d ƒnd d�S )Nr/   r0   r1   r   r2   r3   r,   r(   r4   r5   r6   )r/   r0   r1   r   r2   r3   r,   r(   r4   r5   r6   ©ÚgetÚboolr   r   r   r   r   —   sF    ÿÿÿÿÿÿÿÿÿÿÿßzReaderStateFlags.from_json)r   r   r   r    r/   Ú__annotations__r0   r1   r   r2   r3   r,   r(   r4   r5   r6   r   r&   r   r   r   r   r   r-   n   s   
r-   c                   @  sX   e Zd ZU dZdZded< dZded< dZded< ddœd	d
„Ze	dd dœdd„ƒZ
dS )ÚProtocolSetz'Maps to the ``SCARD_PROTOCOL_*`` flags.Nr.   Út0Út1Úrawr   r   c                 C  sF   t ƒ }| jd ur| j|d< | jd ur.| j|d< | jd urB| j|d< |S )Nr>   r?   r@   )r7   r>   r?   r@   r8   r   r   r   r   Å   s    





zProtocolSet.to_jsonr   c                 C  sb   | |  dd ¡d urt|d ƒnd |  dd ¡d ur<t|d ƒnd |  dd ¡d urZt|d ƒnd d�S )Nr>   r?   r@   )r>   r?   r@   r9   r   r   r   r   r   Ï   s    ÿûzProtocolSet.from_json)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ZdZdZdZddœdd„Zedd d	œd
d„ƒZ	dS )ÚProtocolz(Maps to the ``SCARD_PROTOCOL_*`` values.r>   r?   r@   r   r   c                 C  s   | j S r   r   r   r   r   r   r   à   s    zProtocol.to_jsonr   c                 C  s   | |ƒS r   r   r   r   r   r   r   ã   s    zProtocol.from_jsonN)
r   r   r   r    ZT0ZT1ZRAWr   r&   r   r   r   r   r   rA   Ú   s   rA   c                   @  sH   e Zd ZU ded< ded< ded< ddœd	d
„Zedd dœdd„ƒZdS )ÚReaderStateInr   Úreaderr-   Úcurrent_stateÚintÚcurrent_insertion_countr   r   c                 C  s,   t ƒ }| j|d< | j ¡ |d< | j|d< |S )NrC   ÚcurrentStateÚcurrentInsertionCount)r7   rC   rD   r   rF   r8   r   r   r   r   î   s
    

zReaderStateIn.to_jsonr   c                 C  s(   | t |d ƒt |d ¡t|d ƒd�S )NrC   rG   rH   )rC   rD   rF   ©r   r-   r   rE   r   r   r   r   r   õ   s
    

ýzReaderStateIn.from_jsonN©r   r   r   r<   r   r&   r   r   r   r   r   rB   è   s   
rB   c                   @  sP   e Zd ZU ded< ded< ded< ded< dd	œd
d„Zedd dœdd„ƒZdS )ÚReaderStateOutr   rC   r-   Úevent_staterE   Úevent_countÚatrr   r   c                 C  s6   t ƒ }| j|d< | j ¡ |d< | j|d< | j|d< |S )NrC   Ú
eventStateÚ
eventCountrN   )r7   rC   rL   r   rM   rN   r8   r   r   r   r     s    


zReaderStateOut.to_jsonr   c                 C  s2   | t |d ƒt |d ¡t|d ƒt |d ƒd�S )NrC   rO   rP   rN   )rC   rL   rM   rN   rI   r   r   r   r   r     s    


üzReaderStateOut.from_jsonNrJ   r   r   r   r   rK   þ   s   
rK   z0typing.Generator[T_JSON_DICT, T_JSON_DICT, None]r   c                  c  s   ddi} | V }dS )z*Enables the ``SmartCardEmulation`` domain.ÚmethodzSmartCardEmulation.enableNr   ©Úcmd_dictr   r   r   r   Úenable  s    ÿrT   c                  c  s   ddi} | V }dS )z+Disables the ``SmartCardEmulation`` domain.rQ   zSmartCardEmulation.disableNr   rR   r   r   r   Údisable  s    ÿrU   r   rE   )Ú
request_idÚ
context_idr   c                 c  s*   t ƒ }| |d< ||d< d|dœ}|V }dS )zz
    Reports the successful result of a ``SCardEstablishContext`` call.
    :param request_id:
    :param context_id:
    Ú	requestIdÚ	contextIdz/SmartCardEmulation.reportEstablishContextResult©rQ   ÚparamsN©r7   )rV   rW   r[   rS   r   r   r   r   Úreport_establish_context_result'  s    þr]   )rV   r   c                 c  s"   t ƒ }| |d< d|dœ}|V }dS )z@Reports the successful result of a ``SCardReleaseContext`` call.rX   z-SmartCardEmulation.reportReleaseContextResultrZ   Nr\   ©rV   r[   rS   r   r   r   r   Úreport_release_context_result9  s    þr_   ztyping.List[str])rV   Úreadersr   c                 c  s4   t ƒ }| |d< dd„ |D ƒ|d< d|dœ}|V }dS )z=Reports the successful result of a ``SCardListReaders`` call.rX   c                 S  s   g | ]}|‘qS r   r   ©Ú.0Úir   r   r   Ú
<listcomp>L  ó    z.report_list_readers_result.<locals>.<listcomp>r`   z*SmartCardEmulation.reportListReadersResultrZ   Nr\   )rV   r`   r[   rS   r   r   r   r   Úreport_list_readers_resultF  s    þrf   ztyping.List[ReaderStateOut])rV   Úreader_statesr   c                 c  s4   t ƒ }| |d< dd„ |D ƒ|d< d|dœ}|V }dS )zAReports the successful result of a ``SCardGetStatusChange`` call.rX   c                 S  s   g | ]}|  ¡ ‘qS r   )r   ra   r   r   r   rd   Z  re   z3report_get_status_change_result.<locals>.<listcomp>ÚreaderStatesz.SmartCardEmulation.reportGetStatusChangeResultrZ   Nr\   )rV   rg   r[   rS   r   r   r   r   Úreport_get_status_change_resultT  s    þri   )rV   Úhandler   c                 c  s*   t ƒ }| |d< ||d< d|dœ}|V }dS )zx
    Reports the result of a ``SCardBeginTransaction`` call.
    On success, this creates a new transaction object.
    rX   rj   z/SmartCardEmulation.reportBeginTransactionResultrZ   Nr\   )rV   rj   r[   rS   r   r   r   r   Úreport_begin_transaction_resultb  s    þrk   c                 c  s"   t ƒ }| |d< d|dœ}|V }dS )z·
    Reports the successful result of a call that returns only a result code.
    Used for: ``SCardCancel``, ``SCardDisconnect``, ``SCardSetAttrib``,
    ``SCardEndTransaction``.
    rX   z$SmartCardEmulation.reportPlainResultrZ   Nr\   r^   r   r   r   Úreport_plain_results  s    þrl   útyping.Optional[Protocol])rV   rj   Úactive_protocolr   c                 c  s>   t ƒ }| |d< ||d< |dur*| ¡ |d< d|dœ}|V }dS )z9Reports the successful result of a ``SCardConnect`` call.rX   rj   NZactiveProtocolz&SmartCardEmulation.reportConnectResultrZ   ©r7   r   )rV   rj   rn   r[   rS   r   r   r   r   Úreport_connect_result„  s    þrp   )rV   Údatar   c                 c  s*   t ƒ }| |d< ||d< d|dœ}|V }dS )zœ
    Reports the successful result of a call that sends back data on success.
    Used for ``SCardTransmit``, ``SCardControl``, and ``SCardGetAttrib``.
    rX   rq   z#SmartCardEmulation.reportDataResultrZ   Nr\   )rV   rq   r[   rS   r   r   r   r   Úreport_data_result–  s    þrr   )rV   Úreader_nameÚstaterN   Úprotocolr   c                 c  sR   t ƒ }| |d< ||d< | ¡ |d< ||d< |dur>| ¡ |d< d|dœ}|V }dS )	z8Reports the successful result of a ``SCardStatus`` call.rX   Z
readerNamert   rN   Nru   z%SmartCardEmulation.reportStatusResultrZ   ro   )rV   rs   rt   rN   ru   r[   rS   r   r   r   r   Úreport_status_result§  s    þrv   )rV   Úresult_coder   c                 c  s.   t ƒ }| |d< | ¡ |d< d|dœ}|V }dS )z.Reports an error result for the given request.rX   Z
resultCodezSmartCardEmulation.reportErrorrZ   Nro   )rV   rw   r[   rS   r   r   r   r   Úreport_error½  s    þrx   z,SmartCardEmulation.establishContextRequestedc                   @  s.   e Zd ZU dZded< edd dœdd„ƒZdS )	ÚEstablishContextRequestedz/Fired when ``SCardEstablishContext`` is called.r   rV   r   r   c                 C  s   | t |d ƒd�S )NrX   )rV   )r   r   r   r   r   r   Ñ  s    z#EstablishContextRequested.from_jsonN©r   r   r   r    r<   r&   r   r   r   r   r   ry   Ë  s   
ry   z*SmartCardEmulation.releaseContextRequestedc                   @  s6   e Zd ZU dZded< ded< edd dœdd	„ƒZd
S )ÚReleaseContextRequestedz-Fired when ``SCardReleaseContext`` is called.r   rV   rE   rW   r   r   c                 C  s   | t |d ƒt|d ƒd�S ©NrX   rY   )rV   rW   ©r   rE   r   r   r   r   r   Ý  s    

þz!ReleaseContextRequested.from_jsonNrz   r   r   r   r   r{   Ö  s
   
r{   z'SmartCardEmulation.listReadersRequestedc                   @  s6   e Zd ZU dZded< ded< edd dœdd	„ƒZd
S )ÚListReadersRequestedz*Fired when ``SCardListReaders`` is called.r   rV   rE   rW   r   r   c                 C  s   | t |d ƒt|d ƒd�S r|   r}   r   r   r   r   r   ì  s    

þzListReadersRequested.from_jsonNrz   r   r   r   r   r~   å  s
   
r~   z+SmartCardEmulation.getStatusChangeRequestedc                   @  sF   e Zd ZU dZded< ded< ded< ded	< ed
d dœdd„ƒZdS )ÚGetStatusChangeRequestedzb
    Fired when ``SCardGetStatusChange`` is called. Timeout is specified in
    milliseconds.
    r   rV   rE   rW   ztyping.List[ReaderStateIn]rg   ztyping.Optional[int]r
   r   r   c                 C  sJ   | t |d ƒt|d ƒdd„ |d D ƒ| dd ¡d urBt|d ƒnd d�S )NrX   rY   c                 S  s   g | ]}t  |¡‘qS r   )rB   r   ra   r   r   r   rd     s   z6GetStatusChangeRequested.from_json.<locals>.<listcomp>rh   r
   )rV   rW   rg   r
   )r   rE   r:   r   r   r   r   r     s    

ÿÿøz"GetStatusChangeRequested.from_jsonNrz   r   r   r   r   r   ô  s   
r   z"SmartCardEmulation.cancelRequestedc                   @  s6   e Zd ZU dZded< ded< edd dœdd	„ƒZd
S )ÚCancelRequestedz%Fired when ``SCardCancel`` is called.r   rV   rE   rW   r   r   c                 C  s   | t |d ƒt|d ƒd�S r|   r}   r   r   r   r   r     s    

þzCancelRequested.from_jsonNrz   r   r   r   r   r€     s
   
r€   z#SmartCardEmulation.connectRequestedc                   @  sN   e Zd ZU dZded< ded< ded< ded< d	ed
< edd dœdd„ƒZdS )ÚConnectRequestedz&Fired when ``SCardConnect`` is called.r   rV   rE   rW   rC   r'   Ú
share_moder=   Úpreferred_protocolsr   r   c              	   C  s>   | t |d ƒt|d ƒt |d ƒt |d ¡t |d ¡d�S )NrX   rY   rC   Z	shareModeZpreferredProtocols)rV   rW   rC   r‚   rƒ   )r   rE   r'   r   r=   r   r   r   r   r   (  s    


ÿûzConnectRequested.from_jsonNrz   r   r   r   r   r�     s   
r�   z&SmartCardEmulation.disconnectRequestedc                   @  s>   e Zd ZU dZded< ded< ded< edd d	œd
d„ƒZdS )ÚDisconnectRequestedz)Fired when ``SCardDisconnect`` is called.r   rV   rE   rj   r*   Údispositionr   r   c                 C  s(   | t |d ƒt|d ƒt |d ¡d�S ©NrX   rj   r…   )rV   rj   r…   ©r   rE   r*   r   r   r   r   r   r   =  s
    

ýzDisconnectRequested.from_jsonNrz   r   r   r   r   r„   5  s   
r„   z$SmartCardEmulation.transmitRequestedc                   @  sF   e Zd ZU dZded< ded< ded< ded< ed	d d
œdd„ƒZdS )ÚTransmitRequestedz'Fired when ``SCardTransmit`` is called.r   rV   rE   rj   rq   rm   ru   r   r   c                 C  sF   | t |d ƒt|d ƒt |d ƒ| dd ¡d ur>t |d ¡nd d�S )NrX   rj   rq   ru   )rV   rj   rq   ru   )r   rE   r:   rA   r   r   r   r   r   r   O  s    


ÿúzTransmitRequested.from_jsonNrz   r   r   r   r   rˆ   F  s   
rˆ   z#SmartCardEmulation.controlRequestedc                   @  sF   e Zd ZU dZded< ded< ded< ded< edd d	œd
d„ƒZdS )ÚControlRequestedz&Fired when ``SCardControl`` is called.r   rV   rE   rj   Úcontrol_coderq   r   r   c                 C  s0   | t |d ƒt|d ƒt|d ƒt |d ƒd�S )NrX   rj   ZcontrolCoderq   )rV   rj   rŠ   rq   r}   r   r   r   r   r   d  s    



üzControlRequested.from_jsonNrz   r   r   r   r   r‰   [  s   
r‰   z%SmartCardEmulation.getAttribRequestedc                   @  s>   e Zd ZU dZded< ded< ded< edd dœd	d
„ƒZdS )ÚGetAttribRequestedz(Fired when ``SCardGetAttrib`` is called.r   rV   rE   rj   Ú	attrib_idr   r   c                 C  s&   | t |d ƒt|d ƒt|d ƒd�S )NrX   rj   ÚattribId)rV   rj   rŒ   r}   r   r   r   r   r   v  s
    


ýzGetAttribRequested.from_jsonNrz   r   r   r   r   r‹   n  s   
r‹   z%SmartCardEmulation.setAttribRequestedc                   @  sF   e Zd ZU dZded< ded< ded< ded< edd d	œd
d„ƒZdS )ÚSetAttribRequestedz(Fired when ``SCardSetAttrib`` is called.r   rV   rE   rj   rŒ   rq   r   r   c                 C  s0   | t |d ƒt|d ƒt|d ƒt |d ƒd�S )NrX   rj   r�   rq   )rV   rj   rŒ   rq   r}   r   r   r   r   r   ˆ  s    



üzSetAttribRequested.from_jsonNrz   r   r   r   r   rŽ     s   
rŽ   z"SmartCardEmulation.statusRequestedc                   @  s6   e Zd ZU dZded< ded< edd dœdd	„ƒZd
S )ÚStatusRequestedz%Fired when ``SCardStatus`` is called.r   rV   rE   rj   r   r   c                 C  s   | t |d ƒt|d ƒd�S ©NrX   rj   )rV   rj   r}   r   r   r   r   r   ™  s    ÿzStatusRequested.from_jsonNrz   r   r   r   r   r�   ’  s
   
r�   z,SmartCardEmulation.beginTransactionRequestedc                   @  s6   e Zd ZU dZded< ded< edd dœdd	„ƒZd
S )ÚBeginTransactionRequestedz/Fired when ``SCardBeginTransaction`` is called.r   rV   rE   rj   r   r   c                 C  s   | t |d ƒt|d ƒd�S r�   r}   r   r   r   r   r   §  s    ÿz#BeginTransactionRequested.from_jsonNrz   r   r   r   r   r‘      s
   
r‘   z*SmartCardEmulation.endTransactionRequestedc                   @  s>   e Zd ZU dZded< ded< ded< edd d	œd
d„ƒZdS )ÚEndTransactionRequestedz-Fired when ``SCardEndTransaction`` is called.r   rV   rE   rj   r*   r…   r   r   c                 C  s(   | t |d ƒt|d ƒt |d ¡d�S r†   r‡   r   r   r   r   r   ¶  s
    

ýz!EndTransactionRequested.from_jsonNrz   r   r   r   r   r’   ®  s   
r’   )N)N)-Ú
__future__r   ÚenumÚtypingÚdataclassesr   Úutilr   r   ÚEnumr   r'   r*   r+   r-   r=   rA   rB   rK   rT   rU   r]   r_   rf   ri   rk   rl   rp   rr   rv   rx   ry   r{   r~   r   r€   r�   r„   rˆ   r‰   r‹   rŽ   r�   r‘   r’   r   r   r   r   Ú<module>   s’   1O ý û	