U
    : iY¦{  ã                   @   sÂ  d dl Z d dlZd dlZ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	m
Z
mZmZmZmZ G dd„ deƒZd Zej ¡ Zedd… dkrÐd dlZdZdZd	Zd
ZdZdZdZdZdZdZG dd„ deƒZnÄedkrêG dd„ deƒZnªedd… dkrd dlZdZ G dd„ deƒZnzedd… dksbedd… dksbedd… dksbedd… dkr„G dd „ d eƒZ!G d!d„ deƒZnG d"d„ deƒZe"ed#d$ƒZ#e"ed%d&ƒZ$e"ed'd(ƒZ%e"ed)d*ƒZ&e"ed+dƒZ'e"ed,dƒZ(e"ed-d.ƒZ)e"ed/d0ƒZ*e"ed1d2ƒZ+e"ed3d4ƒZ,e"ed5e*ƒZ-e"ed6e+ƒZ.e/ed7ƒr8ej0Z0ne"ed8d9ƒZ0e"ed:d;ƒZ1e 2d<d ¡Z3e 2d<e(¡Z4e 2d<e'¡Z5e"ed=d>ƒZ6e"ed?d@ƒZ7G dAdB„ dBe	eƒZ8G dCdD„ dDe8ƒZ9G dEdF„ dFe8ƒZ:dS )Gé    N)Ú
SerialBaseÚSerialExceptionÚto_bytesÚportNotOpenErrorÚwriteTimeoutErrorÚTimeoutc                   @   s    e Zd Zi Zdd„ Zdd„ ZdS )ÚPlatformSpecificBasec                 C   s   t dƒ‚d S )Nz9non-standard baudrates are not supported on this platform©ÚNotImplementedError)ÚselfÚbaudrate© r   ú4/usr/lib/python3/dist-packages/serial/serialposix.pyÚ_set_special_baudrate.   s    z*PlatformSpecificBase._set_special_baudratec                 C   s   t dƒ‚d S )Nz$RS485 not supported on this platformr	   )r   Úrs485_settingsr   r   r   Ú_set_rs485_mode1   s    z$PlatformSpecificBase._set_rs485_modeN©Ú__name__Ú
__module__Ú__qualname__ÚBAUDRATE_CONSTANTSr   r   r   r   r   r   r   +   s   r   é   Zlinuxi   @l   *TX  i+T,@i   i.T  i/T  é   é   é   é   c                    @   s`   e Zd Zddddddddd	d
dddddddddddddddddddddd œZd!d"„ Zd#d$„ Zd%S )&ÚPlatformSpecificr   r   r   é   r   r   é   é   é   é	   é
   é   é   é   é   é   i  i  é  i  é  i  é  é  é	  é
  é  é  é  é  é  )r   é2   éK   én   é†   é–   éÈ   i,  iX  i°  i  i`	  iÀ  i€%  i K  i –  i á  i Â i „ i  é ¡ é Ê é  é@B é ” é`ã é€„ é %& éÀÆ- iàg5 i 	= c              
   C   s¢   t   ddgd ¡}zXt | jt|¡ |d  tj M  < |d  tO  < | |d< |d< t | jt|¡ W n2 t	k
rœ } zt
d ||¡ƒ‚W 5 d }~X Y nX d S )NÚir   é@   r   r!   r"   z'Failed to set custom baud rate ({}): {})ÚarrayÚfcntlÚioctlÚfdÚTCGETS2ÚtermiosZCBAUDÚBOTHERÚTCSETS2ÚIOErrorÚ
ValueErrorÚformat)r   r   ÚbufÚer   r   r   r   t   s    ú&PlatformSpecific._set_special_baudratec              
   C   sF  t   ddgd ¡}züt | jt|¡ |d  tO  < |d k	rô|jrT|d  tO  < n|d  t M  < |jr~|d  t	O  < n|d  t	 M  < |j
r¨|d  tO  < n|d  t M  < |jd k	rÖt|jd ƒ|d< |jd k	rüt|jd ƒ|d< nd|d< t | jt|¡ W n2 tk
r@ } ztd |¡ƒ‚W 5 d }~X Y nX d S )NrB   r   r    éè  r   r   zFailed to set RS485 mode: {})rD   rE   rF   rG   Ú
TIOCGRS485ÚSER_RS485_ENABLEDZloopbackÚSER_RS485_RX_DURING_TXZrts_level_for_txÚSER_RS485_RTS_ON_SENDZrts_level_for_rxÚSER_RS485_RTS_AFTER_SENDZdelay_before_txÚintZdelay_before_rxÚ
TIOCSRS485rL   rM   rN   )r   r   rO   rP   r   r   r   r   „   s,    

z PlatformSpecific._set_rs485_modeNr   r   r   r   r   r   Q   sD   á"r   Úcygwinc                   @   s(   e Zd Zddddddddd	d
ddœZdS )r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   )i ô i è r9   r:   r;   r<   r=   r>   r?   r@   rA   N)r   r   r   r   r   r   r   r   r   £   s   õr   Údarwinl   T  c                   @   s6   e Zd Ze ¡ d  d¡Zeed ƒdkr2dd„ ZdS )r   r   Ú.r   r    c                 C   s$   t   d|g¡}t | jt|d¡ d S )NrB   r   )rD   rE   rF   rG   ÚIOSSIOSPEED)r   r   rO   r   r   r   r   »   s    rQ   N)	r   r   r   ÚosÚunameÚsplitZosx_versionrX   r   r   r   r   r   r   ·   s   r   Zbsdr   ZfreebsdZnetbsdZopenbsdc                   @   s   e Zd Zdd„ ZdS )ÚReturnBaudratec                 C   s   |S )Nr   )r   Úkeyr   r   r   Ú__getitem__Æ   s    zReturnBaudrate.__getitem__N)r   r   r   rc   r   r   r   r   ra   Å   s   ra   c                   @   s   e Zd Zeƒ ZdS ©r   N)r   r   r   ra   r   r   r   r   r   r   É   s   c                   @   s   e Zd ZdS rd   )r   r   r   r   r   r   r   r   Ð   s   ÚTIOCMGETiT  ÚTIOCMBISiT  ÚTIOCMBICiT  ÚTIOCMSETiT  Ú	TIOCM_DTRÚ	TIOCM_RTSÚ	TIOCM_CTSé    Ú	TIOCM_CARrC   Ú	TIOCM_RNGé€   Ú	TIOCM_DSRé   ÚTIOCM_CDÚTIOCM_RIÚTIOCINQZFIONREADiT  ÚTIOCOUTQiT  ÚIÚTIOCSBRKi'T  ÚTIOCCBRKi(T  c                   @   sò   e Zd ZdZdd„ Zd7dd„Zdd„ Zed	d
„ ƒZd8dd„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd9dd„Zdd„ Zdd „ Zd!d"„ Zed#d$„ ƒZed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZd-d.„ Zd:d0d1„Zd;d2d3„Zd4d5„ Zd6S )<ÚSerialz¢    Serial port class POSIX implementation. Serial port configuration is
    done with termios and fcntl. Runs on Linux and many other Un*x like
    systems.
    c              
   C   s„  | j dkrtdƒ‚| jr tdƒ‚d| _z"t | jtjtjB tj	B ¡| _W n> t
k
r† } z d| _t|jd | j |¡ƒ‚W 5 d}~X Y nX z| jdd W n2   zt | j¡ W n   Y nX d| _‚ Y nX d| _z | jsâ|  ¡  | jsð|  ¡  W n< tk
r. } z|jtjtjfkrn‚ W 5 d}~X Y nX |  ¡  t ¡ \| _| _t ¡ \| _| _t | jtjtj	¡ t | jtjtj	¡ dS )zo        Open port with current settings. This may throw a SerialException
        if the port cannot be opened.Nz.Port must be configured before it can be used.zPort is already open.zcould not open port {}: {}T)Úforce_update)Ú_portr   Úis_openrG   r^   ÚopenZportstrÚO_RDWRÚO_NOCTTYÚ
O_NONBLOCKÚOSErrorÚerrnorN   Ú_reconfigure_portÚcloseZ_dsrdtrÚ_update_dtr_stateÚ_rtsctsÚ_update_rts_staterL   ZEINVALZENOTTYÚreset_input_bufferÚpipeÚpipe_abort_read_rÚpipe_abort_read_wÚpipe_abort_write_rÚpipe_abort_write_wrE   ÚF_SETFL)r   ÚmsgrP   r   r   r   r}   þ   sD    
"(zSerial.openFc                 C   sð  | j dkrtdƒ‚| jdk	rˆ| jrxzt | j tjtjB ¡ W qˆ tk
rt } zt|jd 	| j
|¡ƒ‚W 5 d}~X Y qˆX nt | j tj¡ d}d }}| jdk	r°d}t| jd ƒ}z"t | j ¡}|\}}}	}
}}}W n4 tjk
r } ztd 	|¡ƒ‚W 5 d}~X Y nX |	tjtjB O }	|
tjtjB tjB tjB tjB tjB tjB  M }
dD ]"}tt|ƒrL|
tt|ƒ M }
qL|tjtjB tjB  M }|tjtj B tj!B tj"B  M }ttd	ƒr¾|tj# M }ttd
ƒrÖ|tj$ M }zttd 	| j%¡ƒ }}W n  t&k
r   z| j'| j%  }}W nt t(k
rŠ   ttdƒ }}zt| j%ƒ}W n& t)k
rj   t)d 	| j%¡ƒ‚Y nX |dk r†t)d 	| j%¡ƒ‚Y nX Y nX |	tj* M }	| j+dkr¶|	tj,O }	nX| j+dkrÎ|	tj-O }	n@| j+dkræ|	tj.O }	n(| j+dkrþ|	tj/O }	nt)d 	| j+¡ƒ‚| j0t1j2kr*|	tj3 M }	nD| j0t1j4krD|	tj3O }	n*| j0t1j5kr^|	tj3O }	nt)d 	| j0¡ƒ‚|tj6tj7B  M }| j8t1j9kr¦|	tj:tj;B t<B  M }	n¾| j8t1j=krÐ|	tj;t<B  M }	|	tj:O }	n”| j8t1j>krú|	t< M }	|	tj:tj;B O }	nj| j8t1j?kr$t<r$|	tj:t<B tj;B O }	n@| j8t1j@krTt<rT|	tj:t<B O }	|	tj; M }	nt)d 	| j8¡ƒ‚ttdƒr¤| jArŠ|tjBtjCB O }n|tjBtjCB tjDB  M }n,| jAr¾|tjBtjCB O }n|tjBtjCB  M }ttdƒrþ| jErð|	tjFO }	n|	tjF M }	n,ttdƒr*| jEr|	tjGO }	n|	tjG M }	|dk s>|dkrLt)d 	|¡ƒ‚||tjH< |dk sj|dkrxt)d 	|¡ƒ‚||tjI< |s |||	|
|||g|krÀt J| j tjK|||	|
|||g¡ |dk	rÔ|  L|¡ | jMdk	rì|  N| jM¡ dS )ú,Set communication parameters on opened port.Nz+Can only operate on a valid file descriptorz&Could not exclusively lock port {}: {}r   r   r"   úCould not configure port: {})ZECHOCTLZECHOKEÚIUCLCÚPARMRKzB{}ZB38400zInvalid baud rate: {!r}r    r   r   r   zInvalid char len: {!r}z$Invalid stop bit specification: {!r}zInvalid parity: {!r}ÚIXANYÚCRTSCTSÚCNEW_RTSCTSéÿ   zInvalid vmin: {!r}úInvalid vtime: {!r})OrG   r   Z
_exclusiverE   ZflockZLOCK_EXZLOCK_NBrL   r‚   rN   r{   ZLOCK_UNÚ_inter_byte_timeoutrX   rI   Ú	tcgetattrÚerrorZCLOCALZCREADZICANONZECHOZECHOEZECHOKZECHONLZISIGZIEXTENÚhasattrÚgetattrZOPOSTZONLCRZOCRNLZINLCRZIGNCRZICRNLZIGNBRKr’   r“   Z	_baudrateÚAttributeErrorr   ÚKeyErrorrM   ZCSIZEZ	_bytesizeZCS8ZCS7ZCS6ZCS5Z	_stopbitsÚserialZSTOPBITS_ONEZCSTOPBZSTOPBITS_ONE_POINT_FIVEZSTOPBITS_TWOZINPCKZISTRIPZ_parityZPARITY_NONEZPARENBZPARODDÚCMSPARZPARITY_EVENZ
PARITY_ODDZPARITY_MARKZPARITY_SPACEZ_xonxoffZIXONZIXOFFr”   r†   r•   r–   ÚVMINÚVTIMEÚ	tcsetattrÚTCSANOWr   Z_rs485_moder   )r   rz   r   Zcustom_baudÚvminÚvtimeÚ	orig_attrÚiflagÚoflagÚcflagÚlflagÚispeedÚospeedÚccÚflagr   r   r   rƒ   -  sä    

*
 ÿÿþþ



ý

zSerial._reconfigure_portc                 C   st   | j rp| jdk	rjt | j¡ d| _t | j¡ t | j¡ t | j¡ t | j¡ d\| _| _d\| _| _d| _ dS )z
Close portN)NNF)r|   rG   r^   r„   r‹   rŠ   r   rŒ   ©r   r   r   r   r„   ¿  s    
zSerial.closec                 C   s    t  | jtt¡}t d|¡d S )z9Return the number of bytes currently in the input buffer.rv   r   )rE   rF   rG   rt   ÚTIOCM_zero_strÚstructÚunpack©r   Úsr   r   r   Ú
in_waitingÏ  s    zSerial.in_waitingr   c              
   C   s\  | j s
t‚tƒ }t| jƒ}t|ƒ|k rTzzt | j| jgg g | 	¡ ¡\}}}| j|krjt
 | jd¡ W qT|stW qTt
 | j|t|ƒ ¡}|s–tdƒ‚| |¡ W n¢ tk
rð } z0|jtjtjtjtjtjfkràtd |¡ƒ‚W 5 d}~X Y nV tjk
rD } z4|d tjtjtjtjtjfkr4td |¡ƒ‚W 5 d}~X Y nX | ¡ rqTqt|ƒS )úÑ        Read size bytes from the serial port. If a timeout is set it may
        return less characters as requested. With no timeout it will block
        until the requested number of bytes is read.
        rR   zgdevice reports readiness to read but returned no data (device disconnected or multiple access on port?)zread failed: {}Nr   )r|   r   Ú	bytearrayr   Ú_timeoutÚlenÚselectrG   rŠ   Ú	time_leftr^   Úreadr   Úextendr   r‚   ÚEAGAINÚEALREADYÚEWOULDBLOCKÚEINPROGRESSÚEINTRrN   r›   ÚexpiredÚbytes)r   Úsizer¾   ÚtimeoutÚreadyÚ_rO   rP   r   r   r   r¾   ×  s6    
"
ÿ" zSerial.readc                 C   s   | j rt | jd¡ d S ©Nó   x)r|   r^   Úwriter‹   r±   r   r   r   Úcancel_read  s    zSerial.cancel_readc                 C   s   | j rt | jd¡ d S rË   )r|   r^   rÍ   r   r±   r   r   r   Úcancel_write  s    zSerial.cancel_writec              
   C   sê  | j s
t‚t|ƒ}t|ƒ }}t| jƒ}|dkrÞzÚt | j|¡}|j	rN|W S |j
s¤| ¡ r`t‚t | jg| jgg | ¡ ¡\}}}	|ršt | jd¡ W qÞ|söt‚nR| ¡ dks´t‚t | jg| jgg d¡\}}}	|rêt | jd¡ W qÞ|sötdƒ‚||d… }||8 }W n¼ tk
r$   ‚ Y n¦ tk
rt }
 z2|
jtjtjtjtjtjfkrdtd |
¡ƒ‚W 5 d}
~
X Y nV tjk
rÈ }
 z4|
d tjtjtjtjtjfkr¸td |
¡ƒ‚W 5 d}
~
X Y nX |j	s(| ¡ r(t‚q(|t|ƒ S )z2Output the given byte string over the serial port.r   rR   Nr   zwrite failed (select)zwrite failed: {})r|   r   r   r»   r   Z_write_timeoutr^   rÍ   rG   Zis_non_blockingZis_infiniterÅ   r   r¼   rŒ   r½   r¾   ÚAssertionErrorr   r   r‚   rÀ   rÁ   rÂ   rÃ   rÄ   rN   r›   )r   ÚdataÚdZtx_lenZlengthrÈ   ÚnÚabortrÉ   rÊ   rP   r   r   r   rÍ     sN    

" " zSerial.writec                 C   s   | j s
t‚t | j¡ dS )zb        Flush of file like objects. In this case, wait until all data
        is written.
        N)r|   r   rI   ZtcdrainrG   r±   r   r   r   ÚflushF  s    zSerial.flushc                 C   s   | j s
t‚t | jtj¡ dS )z9Clear input buffer, discarding all that is in the buffer.N)r|   r   rI   ÚtcflushrG   ZTCIFLUSHr±   r   r   r   rˆ   O  s    zSerial.reset_input_bufferc                 C   s   | j s
t‚t | jtj¡ dS )zs        Clear output buffer, aborting the current output and discarding all
        that is in the buffer.
        N)r|   r   rI   rÖ   rG   ZTCOFLUSHr±   r   r   r   Úreset_output_bufferU  s    zSerial.reset_output_bufferç      Ð?c                 C   s$   | j s
t‚t | jt|d ƒ¡ dS )za        Send break condition. Timed, returns to idle state after given
        duration.
        rØ   N)r|   r   rI   ZtcsendbreakrG   rX   )r   Zdurationr   r   r   Ú
send_break^  s    zSerial.send_breakc                 C   s(   | j rt | jt¡ nt | jt¡ dS )zS        Set break: Controls TXD. When active, no transmitting is possible.
        N)Z_break_staterE   rF   rG   rw   rx   r±   r   r   r   Ú_update_break_stateg  s    zSerial._update_break_statec                 C   s,   | j rt | jtt¡ nt | jtt¡ dS )z)Set terminal status line: Request To SendN)Z
_rts_staterE   rF   rG   rf   ÚTIOCM_RTS_strrg   r±   r   r   r   r‡   p  s    zSerial._update_rts_statec                 C   s,   | j rt | jtt¡ nt | jtt¡ dS )z-Set terminal status line: Data Terminal ReadyN)Z
_dtr_staterE   rF   rG   rf   ÚTIOCM_DTR_strrg   r±   r   r   r   r…   w  s    zSerial._update_dtr_statec                 C   s2   | j s
t‚t | jtt¡}t d|¡d t	@ dkS )z(Read terminal status line: Clear To Sendrv   r   )
r|   r   rE   rF   rG   re   r²   r³   r´   rk   rµ   r   r   r   Úcts~  s    z
Serial.ctsc                 C   s2   | j s
t‚t | jtt¡}t d|¡d t	@ dkS )z)Read terminal status line: Data Set Readyrv   r   )
r|   r   rE   rF   rG   re   r²   r³   r´   rp   rµ   r   r   r   Údsr†  s    z
Serial.dsrc                 C   s2   | j s
t‚t | jtt¡}t d|¡d t	@ dkS )z)Read terminal status line: Ring Indicatorrv   r   )
r|   r   rE   rF   rG   re   r²   r³   r´   rs   rµ   r   r   r   ÚriŽ  s    z	Serial.ric                 C   s2   | j s
t‚t | jtt¡}t d|¡d t	@ dkS )z)Read terminal status line: Carrier Detectrv   r   )
r|   r   rE   rF   rG   re   r²   r³   r´   rr   rµ   r   r   r   Úcd–  s    z	Serial.cdc                 C   s    t  | jtt¡}t d|¡d S )z:Return the number of bytes currently in the output buffer.rv   r   )rE   rF   rG   ru   r²   r³   r´   rµ   r   r   r   Úout_waiting   s    zSerial.out_waitingc                 C   s   | j s
t‚| jS )z        For easier use of the serial port instance with select.
        WARNING: this function is not portable to different platforms!
        )r|   r   rG   r±   r   r   r   Úfileno§  s    zSerial.filenoTc                 C   s4   | j s
t‚|r t | jtj¡ nt | jtj¡ dS )zÝ        Manually control flow - when software flow control is enabled.
        This will send XON (true) or XOFF (false) to the other device.
        WARNING: this function is not portable to different platforms!
        N)r|   r   rI   ÚtcflowrG   ZTCIONZTCIOFF©r   Úenabler   r   r   Úset_input_flow_control°  s
    zSerial.set_input_flow_controlc                 C   s4   | j s
t‚|r t | jtj¡ nt | jtj¡ dS )z»        Manually control flow of outgoing data - when hardware or software flow
        control is enabled.
        WARNING: this function is not portable to different platforms!
        N)r|   r   rI   rã   rG   ZTCOONZTCOOFFrä   r   r   r   Úset_output_flow_control½  s
    zSerial.set_output_flow_controlc                 C   s   ddl }| dt¡ dS )zDEPRECATED - has no user   Nz0nonblocking() has no effect, already nonblocking)ÚwarningsÚwarnÚDeprecationWarning)r   rè   r   r   r   ÚnonblockingÊ  s    zSerial.nonblockingN)F)r   )rØ   )T)T)r   r   r   Ú__doc__r}   rƒ   r„   Úpropertyr·   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   ÷   s@   /
 

16		
		



	
	

ry   c                   @   s   e Zd ZdZddd„ZdS )ÚPosixPollSerialzÕ    Poll based read implementation. Not all systems support poll properly.
    However this one has better handling of errors, such as a device
    disconnecting while it's in use (e.g. USB-serial unplugged).
    r   c                 C   sÞ   | j s
t‚tƒ }t ¡ }| | jtjtjB tj	B tj
B ¡ |dkrÖt|ƒ|k rÖ| | jd ¡D ]&\}}|tjtj	B tj
B @ r^tdƒ‚q^t | j|t|ƒ ¡}| |¡ | jdk	rº| jdksÎ| jdk	rB| jdkrB|sBqÖqBt|ƒS )r¸   r   rR   zdevice reports error (poll)N)r|   r   r¹   r¼   ÚpollÚregisterrG   ZPOLLINZPOLLERRZPOLLHUPZPOLLNVALr»   rº   r   r^   r¾   r¿   r™   rÆ   )r   rÇ   r¾   rï   rG   ZeventrO   r   r   r   r¾   ×  s*    "

ÿÿÿzPosixPollSerial.readN)r   )r   r   r   rì   r¾   r   r   r   r   rî   Ð  s   rî   c                       s2   e Zd ZdZd‡ fdd„	Zd	dd„Zeƒ Z‡  ZS )
ÚVTIMESeriala      Implement timeout using vtime of tty device instead of using select.
    This means that no inter character timeout can be specified and that
    the error handling is degraded.

    Overall timeout is disabled when inter-character timeout is used.
    Tc                    s  t t| ƒ ¡  t | jtjd¡ | jdk	r>d}t| jd ƒ}n&| jdkrRd}d}nd}t| jd ƒ}z"t	 
| j¡}|\}}}}}	}
}W n4 t	jk
rº } zt d |¡¡‚W 5 d}~X Y nX |dk sÌ|dkrÚtd |¡ƒ‚||t	j< ||t	j< t	 | jt	j|||||	|
|g¡ dS )r   r   Nr   r"   r‘   r—   r˜   )Úsuperrñ   rƒ   rE   rG   rŽ   r™   rX   rº   rI   rš   r›   r    r   rN   rM   r£   r¢   r¤   r¥   )r   rz   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   r   ©Ú	__class__r   r   rƒ   ü  s0    

"

ýzVTIMESerial._reconfigure_portr   c                 C   sL   | j s
t‚tƒ }t|ƒ|k rDt | j|t|ƒ ¡}|s8qD| |¡ qt|ƒS )r¸   )	r|   r   r¹   r»   r^   r¾   rG   r¿   rÆ   )r   rÇ   r¾   rO   r   r   r   r¾     s    zVTIMESerial.read)T)r   )	r   r   r   rì   rƒ   r¾   rí   rÎ   Ú__classcell__r   r   ró   r   rñ   ó  s   
rñ   );r‚   rE   r^   r¼   r³   ÚsysrI   r    Zserial.serialutilr   r   r   r   r   r   Úobjectr   r¡   ÚplatformÚlowerZplatrD   rH   rK   rJ   rS   rY   rT   rV   rW   rU   r   r]   ra   r   re   rf   rg   rh   ri   rj   rk   rm   rn   rp   rr   rs   rœ   rt   ru   Zpackr²   rÛ   rÜ   rw   rx   ry   rî   rñ   r   r   r   r   Ú<module>   s†    
P	ÿþý   \#