U
    f»{jÄb  ã                &   @   sÊ  d dl m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 d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZ d d
lm Z  edd�Z!e "e!ddd¡Z#e "e!ddd¡Z$e "e!ddd¡Z%e "e!ddd¡Z&e "e!ddd¡Z'e "e!ddd¡Z(e "e!ddd¡Z)e "e!ddd¡Z*e "e!ddd¡Z+e "e!ddd¡Z,dd„ Z-ee	j. /d¡dd„ ƒƒZ0ee	j. /d¡d d!„ ƒƒZ1e	j. /d¡ed"d#„ ƒƒZ2e	j. /d¡ee	j. 3d$d%¡e	j. 3d&d'¡d(d)„ ƒƒƒƒZ4ed*d+„ ƒZ5ed,d-„ ƒZ6ed.d/„ ƒZ7ed0d1„ ƒZ8ed2d3„ ƒZ9ed4d5„ ƒZ:ed6d7„ ƒZ;ed8d9„ ƒZ<ed:d;„ ƒZ=ed<d=„ ƒZ>ee	j. 3d>e%d?ge$d ge$d ge+d gf¡d@dA„ ƒƒZ?ee	j. 3dBe#dCdDdEdFdGdHdIdJdKdLg
fe$dCdMdNdDdOdEdPdFdQdGdRdHdSdIdTdJdUdKdVdLdWdXdYdZd[d\d]d^d_d`dadbg fe%dCdcdddedOdfdFdgdGdhdidjdkgfe&dldcdNdedEdfdFdgdGdhdidjdkgfe'dmdndodpdqdrdsdPdFdtdudvdwgfe*dCdodcdDdedrdxdfdydgdzdkd{d|d}dSd~ddTd€gfe+dCd�dNdDd‚dOdrdsdPdFdƒdudQdGdidwdHd„dSdIddTgfg¡d…d†„ ƒƒZ@dS )‡é    N)Úassert_allcloseÚassert_array_equal)Ú
pick_types)Ú	data_pathÚrequires_testing_data)Úread_raw_nirx)Ú_test_raw_reader)Úannotate_nan)Úapply_transÚ
_get_trans)Úsource_detector_distancesÚshort_channelsÚ_reorder_nirx)ÚFIFFF)ÚdownloadZNIRxZnirscoutZnirx_15_0_recordingZnirx_15_2_recordingZnirx_15_2_recording_w_shortZnirx_15_3_recordingZnirsport_v1Z!nirx_15_3_recording_wo_saturationZ8nirx_15_3_recording_w_saturation_not_on_montage_channelsZ4nirx_15_3_recording_w_saturation_on_montage_channelsZnirsport_v2z!aurora_recording _w_short_and_accZaurora_2021_9Zaurora_2021_9_6c                 C   sR   | \}}t |ƒ |j|jks t‚t|j|jƒ t|jj|jjƒ t|j|jƒ dS )z3Test NIRSport2 raw files return same data as snirf.N)r   Úch_namesÚAssertionErrorr   Ú_dataÚannotationsÚonsetr   )Z
nirx_snirfÚrawZ	raw_snirf© r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/io/nirx/tests/test_nirx.pyÚtest_nirsport_v2_matches_snirf9   s    r   z%ignore:.*Extraction of measurement.*:c                  C   sˆ  t tdd�} | jjdkst‚d}tt|  ¡  d¡j	ƒdg|d� tt|  ¡  d¡j	ƒd	g|d� d
}dd„ | j	d D ƒ}t
dddƒ\}}t||ƒ}| j	d d dd… dks°t‚t|d dddg|d� | j	d d dd… dksæt‚t|d dddg|d� | j	d d dd… dk�st‚t|d dd d!g|d� d"d„ | j	d D ƒ}t
dddƒ\}}t||ƒ}| j	d d d#d… d$k�s„t‚t|d d%d&d'g|d� | j	d d( d#d… d)k�s¼t‚t|d( d*d+d,g|d� | j	d d- d#d… d.k�sôt‚t|d d/d0d1g|d� t| jƒdk�s t‚| jjd d2k�s6t‚| jjd d3k�sLt‚tt | jj¡d4d5gd6d� |  ¡ }t|jƒd7k�s„t‚d#S )8zTest NIRSport2 file.T©Úpreload)é(   é€   g{®Gázt?ú	S1_D1 760çÅ�1w-!Ÿ?©Zatolú	S2_D2 760g{®Gáz¤?ç-Cëâ6*?c                 S   s   g | ]}|d  dd… ‘qS ©Úlocé   é	   r   ©Ú.0Úchr   r   r   Ú
<listcomp>b   s     z$test_nirsport_v2.<locals>.<listcomp>ÚchsÚ	fsaverageÚheadÚmrir   r   é   é   ÚD1ç+ö—Ý“‡µ¿çàœ¥½Á§¿ç³{ò°PkŠ¿é   ÚD6glxz¥,CŒ¿gaÃÓ+e™?é"   ÚD5goƒÀÊ¡µ?g,eâX§¿g�(í¾0‰¿c                 S   s   g | ]}|d  dd… ‘qS )r$   r/   r%   r   r'   r   r   r   r*   v   s     NZS1g¡g³êsµµ¿g‚âÇ˜»–�¿gÅþ²{ò°�¿r&   ZS2g       €gd;ßO�—¾¿g†ZÓ¼ã�?é'   ZS8gQÚ|a2µ?gZd;ßO�§¿gÉv¾Ÿ/�?ú1.0ú6.0gffffff@gÍÌÌÌÌÌ@gš™™™™™¹?é   )r   Ú	nirsport2r   Úshaper   r   r   ÚcopyÚpickÚinfor   r
   Úlenr   ÚdescriptionÚnpÚdiffr   Zget_montageÚdig)r   Úallowed_distance_errorÚallowed_dist_errorÚlocsÚ
head_mri_tÚ_Úmni_locsÚmonr   r   r   Útest_nirsport_v2K   sˆ    ÿ þÿ þ
  ÿ  ÿ   ÿ
   ÿ   ÿ   ÿ  ÿrN   c                  C   sÄ   t tdd�} | jjdkst‚| jd dks.t‚t t |  	¡ ¡¡dksJt‚t tddd�} |  	¡ }|jdksnt‚t t |¡¡dks†t‚t td	d
�} |  	¡ }|jdks¨t‚t t |¡¡dksÀt‚dS )z'Test NIRSport1 file with no saturation.Tr   )é   é¤   Úsfreqç¥„`UÕ$@r   Únan)r   Ú	saturatedÚannotate©rT   N)
r   Únirsport1_wo_satr   r>   r   rA   rD   ÚsumÚisnanÚget_data©r   Údatar   r   r   Útest_nirsport_v1_wo_sat‘   s    r]   c                  C   sÀ   t tƒ} |  ¡ }|jdkst‚| jd dks0t‚t t |¡¡dksHt‚t tdd�} |  ¡ }|jdksjt‚t t |¡¡dks‚t‚t tdd�} |  ¡ }|jdks¤t‚t t |¡¡dks¼t‚dS )	z=Test NIRSport1 file with NaNs but not in channel of interest.)rO   é°   rQ   rR   r   rS   rV   rU   N)	r   Únirsport1_w_satrZ   r>   r   rA   rD   rX   rY   r[   r   r   r   Útest_nirsport_v1_w_sat©   s    r`   r   )TFÚ	meas_date)NÚorigc                 C   sh  t }t|| d�}| ¡ }t |¡ ¡ r*t‚t|jƒdks<t‚t|d| d�}t	| ¡ |ƒ t|jƒdksjt‚tdd„ |jj
D ƒƒr„t‚t|d| d�}| ¡ }t |¡ ¡ s¬t‚t | ¡ |¡rÀt‚| ¡ }|d	krî| d	¡ | d	¡ | d	¡ t|ƒ}	|	j|jd
 k�st‚| |	¡ t |jj
dk¡}
dD ]6}t|j|ƒd	d	d… }t|j|ƒ|
 }t	||ƒ �q,d	S )zTest NIRSport1 file with NaNs.r   r0   Úignore)rT   r   r5   c                 s   s   | ]}d |kV  qdS )ZNANNr   )r(   Údr   r   r   Ú	<genexpr>Ï   s     z-test_nirsport_v1_w_bad_sat.<locals>.<genexpr>rS   Nra   ZBAD_SATURATED)r   Úduration)Únirsport1_w_fullsatr   rZ   rD   rY   Úanyr   rB   r   r   rC   Zallcloser?   Zset_meas_dater	   Z	orig_timerA   Zset_annotationsÚwhereÚgetattr)r   ra   Úfnamer   r\   Z
raw_ignoreZraw_nanZdata_nanZraw_nan_annotZ
nan_annotsZuse_maskÚkeyÚaÚbr   r   r   Útest_nirsport_v1_w_bad_satÀ   s4    



ro   c                  C   s:   t d } t| dd�}|jjdks$t‚|jd dks6t‚dS )z2Test reading NIRX files using path to header file.z/NIRS-2019-08-23_001.hdrTr   ©rO   é‘   rQ   ç      )@N)Úfname_nirx_15_2_shortr   r   r>   r   rA   )rk   r   r   r   r   Útest_nirx_hdr_loadä   s    rt   c                	   C   s.   t jtdd�� ttd dd� W 5 Q R X dS )ú*Test reading NIRX files when missing data.zdoes not exist©ÚmatchÚ1Tr   N)ÚpytestÚraisesÚFileNotFoundErrorr   rs   r   r   r   r   Útest_nirx_missing_warnï   s    r|   c                 C   s^   t  tt| ƒd ¡ t | d d | d d ¡ | d d }t|dd�}|jjj	dksZt
‚d	S )
ru   ú/data/r\   zNIRS-2019-08-23_001.evtzNIRS-2019-08-23_001.xxxúNIRS-2019-08-23_001.hdrTr   ©r   N)ÚshutilÚcopytreers   ÚstrÚosÚrenamer   r   r   r>   r   )Útmp_pathrk   r   r   r   r   Útest_nirx_missing_evtö   s    
ÿr†   c              	   C   sf   t  tt| ƒd ¡ t | d d | d d ¡ | d d }tjtdd�� t	|dd	� W 5 Q R X d
S )ru   r}   r\   zNIRS-2019-08-23_001.datzNIRS-2019-08-23_001.tmpr~   zA single datrv   Tr   N)
r€   r�   rs   r‚   rƒ   r„   ry   ZwarnsÚRuntimeWarningr   )r…   rk   r   r   r   Útest_nirx_dat_warn  s    
ÿrˆ   c                  C   s‚  t tdd�} | jjdkst‚| jd dks.t‚| jd tjddd	d
dddtjj	d�ksZt‚| jd dd… ddddgks|t‚| jd dd… ddgksšt‚| jd d d d dks¸t‚| jd d d d dksÖt‚| jd  t
dd!d"d#d$d%d&�ksøt‚d'}tt|  ¡  d¡jƒd(g|d)� tt|  ¡  d*¡jƒd+g|d)� t| jƒ}t|ddd,… d-dd-dd-gƒ t| jd.d/�}t|dd0d,… d-d-gƒ t| jd1d/�}t|dd0d,… ddgƒ t| jjd2d3d4gƒ d'}d5d6„ | jd D ƒ}td7d8d9ƒ\}}t||ƒ}| jd d d0d:… d;k�st‚t|d d<d=d>g|d)� | jd d d0d:… d?k�sNt‚t|d d@dAdBg|d)� | jd d d0d:… dCk�s†t‚t|d dDdEdFg|d)� | jd dG d0d:… dHk�s¾t‚t|dG dIdJdKg|d)� | jd dL d0d:… dMk�söt‚t|dL dNdOdPg|d)� | jd dQ d0d:… dRk�s.t‚t|dQ dSdTdUg|d)� | jd dV d0d:… dWk�sft‚t|dV dXdYdZg|d)� dS )[úTest reading NIRX files.Tr   rp   rQ   rr   ra   éã  é   é   é   é%   é   i`= ©Útzinfor   Nr   ú	S1_D1 850ú	S1_D9 760ú	S1_D9 850é   rO   ú
S5_D13 760ú
S5_D13 850r+   r   r$   r&   éø  é   éR  Úsubject_infoZMNEÚTestZ	Recording)iÞ  r‹   rŒ   ZMNE_Test_Recording)ÚsexÚ
first_nameZmiddle_nameÚ	last_nameÚbirthdayÚhis_idr"   r   r    z
S2_D10 760g"ýöuàœ�?r5   Fçú~j¼t“h?©Ú	thresholdr/   é2   ú3.0ú2.0r:   c                 S   s   g | ]}|d  dd… ‘qS r#   r   r'   r   r   r   r*   I  s     z(test_nirx_15_2_short.<locals>.<listcomp>r,   r-   r.   r0   r1   r2   r3   r4   ÚD3çÙ=yX¨µ?ç†ZÓ¼ã�¿çÞqŠŽäò�¿ÚD2çQÚ|a2•?ç«ÏÕVì/»¿ç€·@‚âÇ¨?é   ÚD4çn£¼”¿çÜh o�µ?ç)\�Âõ(œ?é   r8   ç;ßO�—n¢¿çlxz¥,Cœ?ç	ù g³ê³?é   r6   g/n£¼¢?gB>èÙ¬úœ?g+‡ÙÎ÷³?é   ÚD7çèj+ö—Ý£?ç•Ô	h"l¨¿ç$¹ü‡ôÛ·?)r   rs   r   r>   r   rA   ÚdtÚdatetimeÚtimezoneÚutcÚdictr   r   r?   r@   r   r   r   rC   r   r
   ©r   rG   Zis_shortrH   rI   rJ   rK   rL   r   r   r   Útest_nirx_15_2_short  sª    ÿ ÿ
ü	ÿ þÿ þ

   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrÅ   c                  C   sR  t tdd�} | jjdkst‚| jd dks.t‚| jd dd… d	d
ddgksPt‚| jd dd… ddgksnt‚| jd d d d dksŒt‚| jd d d d dksªt‚| jd tddddd�ksÈt‚d}tt|  	¡  
d	¡jƒdg|d� tt|  	¡  
d¡jƒdg|d� t| jƒ}t|ddd … d!dd!dd!gƒ t| jd"d#�}t|dd$d … d!d!gƒ t| jd%d#�}t|dd$d … ddgƒ t| jjd&d'd(gƒ d)}d*d+„ | jd D ƒ}td,d-d.ƒ\}}t||ƒ}| jd d d$d/… d0k�sæt‚t|d d1d2d3g|d� | jd d d$d/… d4k�st‚t|d d5d6d7g|d� | jd d8 d$d/… d9k�sVt‚t|d8 d:d;d<g|d� | jd d= d$d/… d>k�sŽt‚t|d= d?d@dAg|d� | jd dB d$d/… dCk�sÆt‚t|dB dDdEdFg|d� | jd dG d$d/… dHk�sþt‚t|dG dIdJdKg|d� | jd dL d$d/… dMk�s6t‚t|dL dNdOdPg|d� dS )Qr‰   Tr   )rO   éÜ   rQ   rr   r   Nr�   z	S1_D2 760z	S1_D2 850r“   r”   r•   rO   r–   r—   r+   r   r$   r&   r˜   r™   rš   r›   )éä  r‹   é   ztestMontage\0ATestMontage)r    r�   rž   r¡   gü©ñÒMbP?r   r    gÅ�1w-!?r5   Fr¢   r£   r/   r¥   ú4.0r§   r:   r"   c                 S   s   g | ]}|d  dd… ‘qS r#   r   r'   r   r   r   r*   ¡  s     z(test_nirx_15_3_short.<locals>.<listcomp>r,   r-   r.   r0   r¬   r2   r3   r4   r1   r©   rª   r«   r‹   r¨   r­   r®   r¯   r°   r±   r²   r³   r´   rµ   r8   r¶   r·   r¸   r¹   r6   r¼   r½   r¾   rº   r»   g±¿ìž<,¤¿g_)ËÇº¨¿gàœ¥½Á·?)r   Úfname_nirx_15_3_shortr   r>   r   rA   rÃ   r   r   r?   r@   r   r   r   rC   r   r
   rÄ   r   r   r   Útest_nirx_15_3_shortj  s¢     ÿ
ü	ÿ þÿ þ

   ÿ   ÿ   ÿ   ÿ   ÿ   ÿ   ÿrË   c              
   C   sH  | d }t  t|¡ t |d¡}tƒ }t|dƒ�}| dd„ |D ƒ¡ W 5 Q R X d|d< t|dƒ�}|D ]}| |¡ qhW 5 Q R X t	|d	d
� d|d< t|dƒ�}|D ]}| |¡ q¦W 5 Q R X t	|d	d
� d|d< d|d< t|dƒ�}|D ]}| |¡ qìW 5 Q R X t	|d	d
�}t
jdddddddt
jjd�}|jd |k�sDt‚dS )zTest NIRx encoding.ÚlatinzNIRS-2019-10-02_003.hdrÚrbc                 s   s   | ]
}|V  qd S )Nr   )r(   Úliner   r   r   re   Ê  s     z'test_locale_encoding.<locals>.<genexpr>s   Date="jeu. 13 févr. 2020"
r5   ÚwbÚdebug)Úverboses   Date="mi 13 dez 2020"
s   Date="ven 24 gen 2020"
s   Time="10:57:41.454"
r/   rÇ   r™   r•   é
   é9   é)   ipí r�   ra   N)r€   r�   Úfname_nirx_15_2ÚopÚjoinÚlistÚopenÚextendÚwriter   r¿   rÀ   rÁ   rÂ   rA   r   )r…   rk   Z	hdr_fnameÚhdrZfidrÎ   r   Zwant_dtr   r   r   Útest_locale_encodingÂ  sB           ÿrÝ   c                  C   s¾  t tdd�} | jjdkst‚| jd dks.t‚| jd tjddd	d
dddtjj	d�ksZt‚| jd dd… ddddgks|t‚| jd t
ddddd�ksšt‚t| jjdddgƒ t| jjƒ d}dd „ | jd! D ƒ}td"d#d$ƒ\}}t||ƒ}| jd d% d&d'… d(k�st‚t|d% d)d*d+g|d,� | jd d- d&d'… d.k�sDt‚t|d- d/d0d1g|d,� d2| k�sjt‚tjtd3d4�� d5| k W 5 Q R X d6| k�sšt‚t| jd2d7�}t|ƒd%k�sºt‚dS )8r‰   Tr   )é@   éC   rQ   g     @@ra   rŠ   rÒ   r5   r&   r‹   é/   iÌ r�   r   Nr�   r   r’   z
S1_D10 760z
S1_D10 850r›   r™   ZTestRecording)iÅ  rÒ   r5   )r�   rž   r    r¡   rÉ   r;   r§   r"   c                 S   s   g | ]}|d  dd… ‘qS r#   r   r'   r   r   r   r*   ý  s     z"test_nirx_15_2.<locals>.<listcomp>r+   r,   r-   r.   r   r/   r0   r1   gŸ<,Ôšæ�¿gäƒžÍªÏµ?rª   r    é   r±   gz¥,Cë²¿g˜Ý“‡…Z³¿g¸…ëQ¸~¿Zfnirs_cw_amplitudezInvalid valuerv   Z	fnirs_rawZfnirs_od)Zfnirs)r   rÕ   r   r>   r   rA   r¿   rÀ   rÁ   rÂ   rÃ   r   r   rC   Úprintr   r   r
   r   ry   rz   Ú
ValueErrorr   rB   )r   rH   rI   rJ   rK   rL   Zpicksr   r   r   Útest_nirx_15_2ã  sL    ÿ ÿ
þ
   ÿ   ÿrä   c                  C   sJ   t tdd�} t| jƒdkst‚| jjd dks2t‚| jjd dksFt‚dS )	r‰   Tr   r/   r   r:   r5   r¦   N)r   Únirsport2_2021_9_6rB   r   r   rC   )r   r   r   r   Útest_nirx_aurora_2021_9_6  s    ræ   c                  C   sª  t tdd�} | jjdkst‚| jd dks.t‚| jd tjddd	d
dddtjj	d�ksZt‚| jd dd… ddddddddddddgksŒt‚| jd dd d!t
jd"d#œks¬t‚t| jjd$d%d%gƒ d&}d'd(„ | jd) D ƒ}td*d+d,ƒ\}}t||ƒ}| jd d- d.d/… d0k�st‚t|d- d1d2d3g|d4� | jd d5 d.d/… d6k�sJt‚t|d5 d7d8d9g|d4� d&}tt|  ¡  d¡jƒd:g|d4� tt|  ¡  d;¡jƒd<g|d4� dS )=r‰   Tr   )é   é\   rQ   g      @ra   rŠ   rÒ   r<   é   é5   r7   ih0 r�   r   Nr°   r   r’   r!   z	S2_D2 850z	S3_D3 760z	S3_D3 850z	S4_D4 760z	S4_D4 850z	S5_D5 760z	S5_D5 850z	S6_D6 760z	S6_D6 850r›   )iÔ  rÒ   r<   ZNIRXrœ   Z	NIRX_Test)r    rž   rŸ   r�   r¡   r:   r§   r"   c                 S   s   g | ]}|d  dd… ‘qS r#   r   r'   r   r   r   r*   ;  s     z"test_nirx_15_0.<locals>.<listcomp>r+   r,   r-   r.   r   r/   r0   r1   gO¯”eˆc�?gûËîÉÃB½¿g�St$—ÿ ¿r    rá   ZD8gvàœ¥½±¿gú~j¼t“¨¿gâX·Ñ°?g¸…ëQ¸ž?z	S7_D7 760gn£¼¤?)r   Úfname_nirx_15_0r   r>   r   rA   r¿   rÀ   rÁ   rÂ   r   ZFIFFV_SUBJ_SEX_UNKNOWNr   r   rC   r   r
   r   r   r?   r@   )r   rH   rI   rJ   rK   rL   rG   r   r   r   Útest_nirx_15_0  sn    þ     û

ü
   ÿ   ÿÿ þÿ þrì   zfname, boundary_decimalr™   c                 C   s   t t| |d� dS )zTest standard operations.©rk   Zboundary_decimalN)r   r   rí   r   r   r   Útest_nirx_standardR  s    	ÿrî   zfname, want_orderZS1_D1ZS2_D2ZS3_D3ZS4_D4ZS5_D5ZS6_D6ZS7_D7ZS8_D8ZS9_D9ZS10_D10ZS1_D10ZS2_D1ZS3_D2ZS4_D3ZS5_D4ZS6_D5ZS7_D6ZS8_D7ZS9_D8ZS10_D9ZS11_D11ZS11_D12ZS12_D12ZS12_D13ZS13_D13ZS13_D14ZS14_D14ZS14_D15ZS15_D15ZS15_D16ZS16_D11ZS16_D16ZS1_D9ZS2_D3ZS2_D10ZS3_D11ZS4_D12ZS5_D6ZS5_D7ZS5_D8ZS5_D13ZS1_D2ZS1_D4ZS1_D5ZS1_D6ZS2_D5ZS2_D6ZS3_D5ZS4_D1ZS5_D1ZS5_D2ZS6_D1ZS6_D3ZS3_D7ZS4_D8ZS5_D3ZS6_D4ZS6_D14ZS7_D1ZS7_D15ZS8_D5ZS8_D16ZS1_D3ZS2_D4ZS4_D6ZS7_D4c                 C   sZ   t | ƒ}|j}dd„ |D ƒ}|ddd… |ddd… ks<t‚|ddd… }||ksVt‚dS )z-Test that logical channel order is preserved.c                 S   s   g | ]}|  ¡ d  ‘qS r   )Úsplit)r(   Zch_namer   r   r   r*   n  s     z&test_channel_order.<locals>.<listcomp>Nr5   r™   )r   r   r   )rk   Z
want_orderr   r   Úprefixesr   r   r   Útest_channel_order`  s     rñ   )AÚos.pathÚpathrÖ   r€   rƒ   rÀ   r¿   ÚnumpyrD   ry   Znumpy.testingr   r   Zmner   Zmne.datasets.testingr   r   Zmne.ior   Zmne.io.tests.test_rawr   Zmne.preprocessingr	   Zmne.transformsr
   r   Zmne.preprocessing.nirsr   r   r   Zmne.io.constantsr   Ztesting_pathr×   rë   rÕ   rs   rÊ   rW   r_   rg   r=   Znirsport2_2021_9rå   r   ÚmarkÚfilterwarningsrN   r]   r`   Zparametrizero   rt   r|   r†   rˆ   rÅ   rË   rÝ   rä   ræ   rì   rî   rñ   r   r   r   r   Ú<module>   sö   
   ÿ   ÿ   ÿ   ÿ
ÿ
ÿ   ÿ   ÿ   ÿ   ÿ
D


 







]
W
 
.

6üF   .2ù	