U
    ÃmœdNO  ã                	   @   sÜ  d Z ddlZddlZddlZddlm  mZ ddl	Z
ddlmZmZ ddlmZ ej ej e¡¡ZdZej ede¡Ze
 e¡ZdddgZe ddgdd	gg¡ed< e d
dddgddddgddddgddddgg¡ed< e dddgdddgdddgg¡ed< 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'd1d2„ Z(d3d4„ Z)d5d6„ Z*d7d8„ Z+G d9d:„ d:ƒZ,G d;d<„ d<e,ƒZ-G d=d>„ d>e,ƒZ.G d?d@„ d@e,ƒZ/G dAdB„ dBƒZ0G dCdD„ dDe0ƒZ1dS )Ez'
Tests for contingency table analyses.
é    N)Úassert_allcloseÚassert_equalzcontingency_table_r_results.csvÚresultsé   é   é   é   é�   é!   éT   é~   é   é   é   é   é   é   é   é   é   é
   é   é   é(   c                  C   s†   t tƒD ]x\} }tjj|dd�}| ¡ }t|jtj	| df ƒ t|j
tj	| df ƒ |jdd�}t|j|jd|j| ¡    ƒ qd S )NF©Zshift_zerosZ
homog_statZhomog_dfZbhapkar)Úmethodr   )Ú	enumerateÚtablesÚsmÚstatsÚSquareTableÚhomogeneityr   Ú	statisticÚ	r_resultsÚlocÚdfÚsum)ÚkÚtableÚstZhmZhmb© r*   úh/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/stats/tests/test_contingency_tables.pyÚtest_homogeneity"   s    r,   c                  C   sä   t j d¡ tjtdƒddgd�} t j ddd¡| d< t j ddd¡| d< t | d | d ¡}t 	|¡}tj	 
| ¡}t 	t  |¡¡}t| ¡  ¡ | ¡  ¡ ƒ t| ¡  ¡ | ¡  ¡ ƒ t|ƒ}t| d¡d	ƒ t|jd
 dƒ d S )Ni²  éd   Úv1Úv2©ÚindexÚcolumnsr   r   z$A 5x5 contingency table with counts:T©r   r   g       @)ÚnpÚrandomÚseedÚpdÚ	DataFrameÚrangeÚrandintÚcrosstabÚctabr    Ú	from_dataÚasarrayr   ÚsummaryÚas_textÚstrÚ
startswithr(   )r%   r(   Úrslt1Úrslt2Zrslt3Úsr*   r*   r+   Útest_SquareTable_from_data/   s"    

ÿ
ÿrF   c                  C   sŽ   dddgdddgdddgg} t j| dddgdddgd�}tj|dd	�}tjddddgddddgddddgddddggtjd
�}t||jƒ d S )Nr   r   r   r   r   r   r0   Fr   ©Zdtype)	r7   r8   r<   r    r4   r>   Úfloat64r   r(   )Útabr%   Zdf2Úer*   r*   r+   Útest_SquareTable_nonsquareF   s    .ÿrK   c                  C   s„   dddgdddgddd	gg} t  | ¡} t | ¡}|j}t|d
 dtdƒ ƒ t|d dtdƒ ddd� tt  |¡|jddd� d S )Nr   r   r   r   r   r   é   é   é	   r3   é   é7   ©r   r   é-   éH   çñhãˆµøä>©ÚatolÚrtol)	r4   r>   r<   ÚTableZcumulative_oddsratiosr   ÚfloatÚlogZcumulative_log_oddsratios)r(   Útbl_objZcum_oddsr*   r*   r+   Útest_cumulative_oddsS   s    

ÿ ÿr\   c                  C   s|   dddgdddgddd	gg} t  | ¡} t | ¡}|j}t|d
 dƒ t|d dtdƒ ddd� tt  |¡|jddd� d S )Nr   r   r   r   r   r   rL   rM   rN   r3   g      ä?rQ   é   r   rT   rU   )	r4   r>   r<   rX   Zlocal_oddsratiosr   rY   rZ   Zlocal_log_oddsratios)r(   r[   Zloc_oddsr*   r*   r+   Útest_local_oddsa   s    

ÿ ÿr^   c                  C   sÄ   t jdt jd�} t  dd¡}ttj| dd�j| ƒ ttj| dd�j|ƒ t jddd	gd
ddgdddggt jd�} t jddd	gd
ddgdddggt jd�}tt | ¡j|ƒ ttj| dd�j|ƒ d S )N)r   r   rG   g      à?Fr   Tr   r   r   r   r   r   r   )	r4   ÚzerosrH   Úfullr   r<   rX   r(   r>   )ÚtÚresultÚrr*   r*   r+   Útest_shiftingo   s$    þþþþrd   c                  C   sn   ddgddggddgddggddgddggg} t  | ¡j}t | ¡}t |¡}t|j|jƒ t|j|jƒ d S )NrM   rN   r   rL   r   r   é   )r4   r>   ÚTr<   ÚStratifiedTabler   Úoddsratio_pooledÚlogodds_pooled)Útab1Ztab2Zct1Zct2r*   r*   r+   Útest_stratified_table_cube€   s    .

rk   c                  C   sÚ   ddddgddddgg} d	d
ddgddddgg}ddddgddddgg}t  ddddgdddd gg¡}t  d!d"d#d$gd%d&d'd(gg¡}t | ¡}t|j|d)d)d*� t|j|d)d)d*� t|j|d)d)d*� t|j|d)d)d*� d S )+Nr]   rM   r   é)   i3  éö   i·  éõ   gh‘í|?6@gh‘í|?•1@gøSã¥›D@@g?5^ºIÌ3@g…ëQ¸Žr@g=
×£p�m@g�Âõ(\W{@g33333£p@g|a2U0j@g1¬Zä@g�Âõ(\�²?gNbX9´6@g' ‰°áéÕ?gw¾Ÿ/ÝØ?g®Ø_vOv?gÜh o�û?g|nôs;*ÀgŒú=yHÀg ¬­u5;Ñ¿g}¡6`F@g„ë8~¹â?gŸ]:½½ñã?gùêWøÌ²?gþ¤Ò6›Êô¿gUæœŽ¶hÀgÄ-Õ».ÀgÕW™!<7Ö¿gô¡°0éL@gUæœŽ¶h@gÄ-Õ».@gÕW™!<7Ö?gô¡°0éLÀç-Cëâ6?rU   )	r4   Úarrayr<   rX   r   ZfittedvaluesZchi2_contribsZresid_pearsonZstandardized_resids)r(   ÚfitÚc2ÚprÚsrrI   r*   r*   r+   Útest_residsŽ   s$    

ÿ

ÿ
ÿ
ÿ
ru   c                  C   sn  t tƒD �]^\} }dt |jd ¡ }dt |jd ¡ }tj|dd� ||¡}t|j	t
j| df ƒ t|jt
j| df ƒ t|jd t
j| df ƒ t|jd t
j| d	f d
d
d� t|jt
j| df d
d
d� tj|dd� ||d ¡}t|j	t
j| df ƒ t|jt
j| df ƒ t|jd t
j| df ƒ t|jd t
j| df ƒ t|jt
j| df d
d
d� qd S )Nr   r   Fr   Zlbl_statZ
lbl_expvalr   Zlbl_varZlbl_chi2rT   ©rW   rV   Z
lbl_pvalueZ	lbl2_statZlbl2_expvalZlbl2_varZ	lbl2_chi2Zlbl2_pvalue)r   r   r4   ÚarangeÚshaper<   rX   Útest_ordinal_associationr   r"   r#   r$   Z	null_meanZnull_sdZzscoreÚpvalue)r'   r(   Z
row_scoresZ
col_scoresÚrsltr*   r*   r+   ry   ¦   s     ry   c                  C   sd   t j d¡ t jjdddd�} ddlm} || ƒ}t | ¡ ¡ }t	|j
|d ƒ t	|j|d ƒ d S )	Ni'"  r   r   )r   r   )Úsizer   )Úchi2_contingencyr   )r4   r5   r6   r:   Zscipy.statsr}   r<   rX   Ztest_nominal_associationr   r"   rz   )r(   r}   Z
rslt_scipyÚbr*   r*   r+   Útest_chi2_association¾   s    r   c                  C   sp   t tƒD ]b\} }tjj|dd�}| ¡ }t|jtj	| df ƒ t
|jtj	| df ƒ t|jtj	| df ƒ qd S )NFr   Zbowker_statZ	bowker_dfZbowker_pvalue)r   r   r   r   r    Zsymmetryr   r"   r#   r$   r   r%   rz   )r'   r(   r)   r~   r*   r*   r+   Útest_symmetryÍ   s    r€   c                  C   s”   t jtd ddd�} tj td ¡}| ¡ }t| j|jƒ t	|j
dƒ t jtd ddd�}t|jtjd ƒ t jtd dd�}t|jtjd ƒ d S )	Nr   F©ÚexactÚ
correctionr   T)r   Zhomog_cont_p)r‚   )r   Zhomog_binom_p)r<   Úmcnemarr   r   r   r    r!   r   r"   r   r%   rz   r#   r$   )Úb1r)   Úb2Zb3Zb4r*   r*   r+   Útest_mcnemar×   s    r‡   c                  C   s®   t  ddddddddgddddddddgddddddddgg¡j} t ddgddggddgddggg¡}tj ddd| ¡}t|j	|ƒ tj dddt | ¡¡}t|j	|ƒ d S )Nr   r   r   )
r7   r8   rf   r4   r>   r<   rg   r=   r   r(   ©r%   rJ   rj   r*   r*   r+   Útest_from_data_stratifiedé   s    (ÿ&r‰   c                  C   sˆ   t  ddddddddgddddddddgg¡j} t ddgddgg¡}tjj| dd�}t|j	|ƒ tjjt | ¡dd�}t|j	|ƒ d S )Nr   r   r   r   Fr   )
r7   r8   rf   r4   r>   r<   ÚTable2x2r=   r   r(   rˆ   r*   r*   r+   Útest_from_data_2x2÷   s    0r‹   c                  C   sÆ  ddddgddddgddddgddddgddddgddddgddddgddddgddddgg	} t  | ¡} tj| dd�\}}}t|dƒ t|dƒ dddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgdddddgg	} t  | ¡} tj| dd�\}}}t|ddd	� t|d
ƒ | d d …dd…f }t  t |d d …df |d d …df ¡¡}tj|dd�}tj|ddd�}t|j|jƒ t|j	|j	ƒ t
t|ƒ d¡dƒ d S )Nr   r   F)Zreturn_objectgÍÌÌÌÌÌ@r   g
h"lxzó?ro   )rW   r   r   Tr�   zdf          1
pvalue      0.65)r4   r>   r<   Z
cochrans_qr   r7   r;   r„   r"   rz   r   rA   rB   )r(   Ústatrz   r%   ÚdataZxtabr…   r†   r*   r*   r+   Útest_cochranq  sF    








ø	


ø	

*rŽ   c                   @   sZ   e Zd Zed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 )ÚCheckStratifiedMixinFc                 C   sL   |s|nt  |¡}t |¡| _tj|dd�| _dd„ |D ƒ}t |¡| _d S )NTr   c                 S   s   g | ]}t  |¡‘qS r*   )r7   r8   )Ú.0Úxr*   r*   r+   Ú
<listcomp>M  s     z3CheckStratifiedMixin.initialize.<locals>.<listcomp>)r4   Zdstackr<   rg   r{   Zrslt_0Úrslt_pandas)Úclsr   Úuse_arrZtables1Ztables_pandasr*   r*   r+   Ú
initializeH  s
    zCheckStratifiedMixin.initializec                 C   s   t | jj| jddd� d S ©Nro   rv   )r   r{   rh   ©Úselfr*   r*   r+   Útest_oddsratio_pooledQ  s     ÿz*CheckStratifiedMixin.test_oddsratio_pooledc                 C   s   t | jj| jddd� d S r—   )r   r{   ri   r˜   r*   r*   r+   Útest_logodds_pooledV  s     ÿz(CheckStratifiedMixin.test_logodds_pooledc                 C   s:   | j jdd�}t|j| jddd� t|j| jddd� d S )NT)rƒ   ro   rT   rv   )r{   Útest_null_oddsr   r"   Úmh_statrz   Ú	mh_pvalue©r™   r{   r*   r*   r+   rœ   [  s    z#CheckStratifiedMixin.test_null_oddsc                 C   s6   | j  ¡ \}}t|| jddd� t|| jddd� d S r—   )r{   Zoddsratio_pooled_confintr   Úor_lcbÚor_ucb©r™   ZlcbZucbr*   r*   r+   Útest_oddsratio_pooled_confinta  s    z2CheckStratifiedMixin.test_oddsratio_pooled_confintc                 C   sB   | j  ¡ \}}t|t | j¡ddd� t|t | j¡ddd� d S r—   )r{   Zlogodds_pooled_confintr   r4   rZ   r    r¡   r¢   r*   r*   r+   Útest_logodds_pooled_confintg  s    ÿÿz0CheckStratifiedMixin.test_logodds_pooled_confintc                 C   s~   t | dƒsd S | jjdd�}t|j| jddd� t|j| jddd� | jjdd�}t|j| jddd� t|j| j	ddd� d S )NÚor_homogF)Úadjustro   rv   T)
Úhasattrr{   Útest_equal_oddsr   r"   r¥   rz   Ú
or_homog_pÚor_homog_adjÚor_homog_adj_prŸ   r*   r*   r+   r¨   o  s    
z$CheckStratifiedMixin.test_equal_oddsc              	   C   sB   t  ¡ �0 t  dt¡ t| j ¡  ¡ | j ¡  ¡ ƒ W 5 Q R X d S )NÚignore)	ÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningr   r{   r?   r@   r“   r˜   r*   r*   r+   Útest_pandas}  s
    
ÿz CheckStratifiedMixin.test_pandasc              	   C   sì   t j d¡ tjtdƒdd�}t j ddd¡|d< t j ddd¡|d< t  t  d	¡t  	d	¡¡|d
< g }td	ƒD ]B}t  d	| d	|d  ¡}| 
t |j|df |j|df ¡¡ qnt |¡}tj ddd
|¡}t| ¡  ¡ | ¡  ¡ ƒ d S )Néñ   r-   )r.   r/   Ústratr0   r   r   r.   r/   r   r³   r   )r4   r5   r6   r7   r8   r9   r:   Zkronrw   ZonesÚappendr;   r$   r<   rg   r=   r   r?   r@   )r™   r%   r   r'   ÚiirC   rD   r*   r*   r+   Útest_from_data…  s    (
z#CheckStratifiedMixin.test_from_dataN)F)Ú__name__Ú
__module__Ú__qualname__Úclassmethodr–   rš   r›   rœ   r£   r¤   r¨   r±   r¶   r*   r*   r*   r+   r�   F  s   r�   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚTestStratified1zå
    data = array(c(0, 0, 6, 5,
                   3, 0, 3, 6,
                   6, 2, 0, 4,
                   5, 6, 1, 0,
                   2, 5, 0, 0),
                   dim=c(2, 2, 5))
    rslt = mantelhaen.test(data)
    c                 C   sÄ   d gd }t  ddgddgg¡|d< t  ddgddgg¡|d< t  ddgddgg¡|d< t  ddgddgg¡|d< t  ddgddgg¡|d< |  |¡ d| _t  d¡| _d	| _d
| _d| _d| _	d S )Nr   r   r   r   r   r   r   rL   gY†8ÖÅm@g®ãüM¨?g|Vœjmð?g |(ÑÜG@)
r4   rp   r–   rh   rZ   ri   r�   rž   r    r¡   ©r”   r   r*   r*   r+   Úsetup_class£  s    

zTestStratified1.setup_classN©r·   r¸   r¹   Ú__doc__rº   r½   r*   r*   r*   r+   r»   ˜  s   
r»   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚTestStratified2a_  
    library(DescTools)
    data = array(c(20, 14, 10, 24,
                   15, 12, 3, 15,
                   3, 2, 3, 2,
                   12, 3, 7, 5,
                   1, 0, 3, 2),
                   dim=c(2, 2, 5))
    rslt = mantelhaen.test(data)
    bd1 = BreslowDayTest(data, correct=FALSE)
    bd2 = BreslowDayTest(data, correct=TRUE)
    c                 C   sà   d gd }t  ddgddgg¡|d< t  ddgd	dgg¡|d
< t  d	dgd	dgg¡|d< t  dd	gddgg¡|d	< t  d
dgd	dgg¡|d< | j|dd� d| _t  d¡| _d| _d| _d| _d| _	d| _
d| _d| _d| _d S )Nr   r   r   r   é   r   r   r]   r   r   r   rL   r   T)r•   g_)ËÇº@g¡Ö4ï8Å'@gÐq?FŠB?gä,ìi‡ü?g}ZEhö@g9ÖÅm4€ý?gX9´Èvè?gV}®¶bý?©r4   rp   r–   rh   rZ   ri   r�   rž   r    r¡   r¥   r©   rª   r«   r¼   r*   r*   r+   r½   Ä  s"    
zTestStratified2.setup_classNr¾   r*   r*   r*   r+   rÀ   ¶  s   rÀ   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚTestStratified3a�  
    library(DescTools)
    data = array(c(313, 512, 19, 89,
                   207, 353, 8, 17,
                   205, 120, 391, 202,
                   278, 139, 244, 131,
                   138, 53, 299, 94,
                   351, 22, 317, 24),
                   dim=c(2, 2, 6))
    rslt = mantelhaen.test(data)
    bd1 = BreslowDayTest(data, correct=FALSE)
    bd2 = BreslowDayTest(data, correct=TRUE)
    c                 C   sö   d gd }t  ddgddgg¡|d< t  ddgd	d
gg¡|d< t  ddgddgg¡|d< t  ddgddgg¡|d< t  ddgddgg¡|d< t  ddgddgg¡|d< |  |¡ d | _t  d ¡| _d!| _d"| _d#| _d$| _	d%| _
d&| _d%| _d&| _d S )'Nr   i9  i   r   éY   r   éÏ   ia  rM   é   r   éÍ   éx   i‡  éÊ   r   i  é‹   éô   éƒ   r   éŠ   é5   i+  é^   r   i_  é   i=  rÁ   r   gcÒßK¡ñ?gO¯”eˆcõ?g6«>W[±Ï?gZµÓ î?gA²%Pi©ô?g“Œœ…=Õ2@g¢ÏûŠ+ê`?rÂ   r¼   r*   r*   r+   r½   ñ  s$    

zTestStratified3.setup_classNr¾   r*   r*   r*   r+   rÃ   â  s   rÃ   c                   @   s€   e Zd Ze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 )ÚCheck2x2Mixinc                 C   s"   t  | j¡| _t j | j¡| _d S ©N)r<   rŠ   r(   r[   r=   r�   Útbl_data_obj)r”   r*   r*   r+   r–     s    zCheck2x2Mixin.initializec                 C   s   t | jj| jƒ d S rÒ   )r   r[   Ú	oddsratior˜   r*   r*   r+   Útest_oddsratio  s    zCheck2x2Mixin.test_oddsratioc                 C   s   t | jj| jƒ d S rÒ   )r   r[   Úlog_oddsratior˜   r*   r*   r+   Útest_log_oddsratio  s    z Check2x2Mixin.test_log_oddsratioc                 C   s   t | jj| jƒ d S rÒ   )r   r[   Úlog_oddsratio_ser˜   r*   r*   r+   Útest_log_oddsratio_se  s    z#Check2x2Mixin.test_log_oddsratio_sec                 C   s   t | j ¡ | jƒ d S rÒ   )r   r[   Úoddsratio_pvaluer˜   r*   r*   r+   Útest_oddsratio_pvalue   s    z#Check2x2Mixin.test_oddsratio_pvaluec                 C   s2   | j  d¡\}}| j\}}t||ƒ t||ƒ d S ©Ngš™™™™™©?)r[   Úoddsratio_confintr   ©r™   Zlcb1Zucb1Zlcb2Zucb2r*   r*   r+   Útest_oddsratio_confint$  s    

z$Check2x2Mixin.test_oddsratio_confintc                 C   s   t | jj| jƒ d S rÒ   )r   r[   Ú	riskratior˜   r*   r*   r+   Útest_riskratio+  s    zCheck2x2Mixin.test_riskratioc                 C   s   t | jj| jƒ d S rÒ   )r   r[   Úlog_riskratior˜   r*   r*   r+   Útest_log_riskratio/  s    z Check2x2Mixin.test_log_riskratioc                 C   s   t | jj| jƒ d S rÒ   )r   r[   Úlog_riskratio_ser˜   r*   r*   r+   Útest_log_riskratio_se3  s    z#Check2x2Mixin.test_log_riskratio_sec                 C   s   t | j ¡ | jƒ d S rÒ   )r   r[   Úriskratio_pvaluer˜   r*   r*   r+   Útest_riskratio_pvalue7  s    z#Check2x2Mixin.test_riskratio_pvaluec                 C   s2   | j  d¡\}}| j\}}t||ƒ t||ƒ d S rÜ   )r[   Úriskratio_confintr   rÞ   r*   r*   r+   Útest_riskratio_confint;  s    

z$Check2x2Mixin.test_riskratio_confintc                 C   s2   | j  d¡\}}| j\}}t||ƒ t||ƒ d S rÜ   )r[   Úlog_riskratio_confintr   rÞ   r*   r*   r+   Útest_log_riskratio_confintB  s    

z(Check2x2Mixin.test_log_riskratio_confintc                 C   s"   t | j ¡  ¡ | j ¡  ¡ ƒ d S rÒ   )r   r[   r?   r@   rÓ   r˜   r*   r*   r+   r¶   I  s    ÿzCheck2x2Mixin.test_from_datac                 C   s   t | j ¡  ¡ | jƒ d S rÒ   )r   r[   r?   r@   Úsummary_stringr˜   r*   r*   r+   Útest_summaryM  s    ÿzCheck2x2Mixin.test_summaryN)r·   r¸   r¹   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edd„ ƒZdS )Ú	Test2x2_1c                 C   sö   t  d¡}ddddddddg|d d …df< ddddddddg|d d …df< t  |¡| _t  ddgddgg¡| _d| _d| _t  d¡| _ddg| _	d| _
d| _d| _dt  d¡ | _d| _d	d
g| _ddg| _dddddddg}d |¡| _|  ¡  d S )N)rM   r   r   r   r   g      ð?g        g¼U3°?g~3œšù/@gv°c–™Ð?gL«%Íü@g,»}©,ö¿g,»}©,ö?z3               Estimate   SE   LCB    UCB   p-valuez3---------------------------------------------------z3Odds ratio        1.000        0.063 15.988   1.000z3Log odds ratio    0.000 1.414 -2.772  2.772   1.000z3Risk ratio        1.000        0.250  3.998   1.000z3Log risk ratio    0.000 0.707 -1.386  1.386   1.000Ú
)r4   r_   r>   r�   r(   rÔ   rÖ   ÚsqrtrØ   rÝ   rÚ   rà   râ   rä   ræ   rè   rê   Újoinrì   r–   )r”   r�   Ússr*   r*   r+   r½   U  s<    
  
ÿÿúzTest2x2_1.setup_classN)r·   r¸   r¹   rº   r½   r*   r*   r*   r+   rî   S  s   rî   )2r¿   Úosr­   Únumpyr4   Z$statsmodels.stats.contingency_tablesr   Zcontingency_tablesr<   Zpandasr7   Znumpy.testingr   r   Zstatsmodels.apiÚapir   ÚpathÚdirnameÚabspathÚ__file__Zcur_dirÚfnamerñ   ZfpathZread_csvr#   r   r>   r,   rF   rK   r\   r^   rd   rk   ru   ry   r   r€   r‡   r‰   r‹   rŽ   r�   r»   rÀ   rÃ   rÑ   rî   r*   r*   r*   r+   Ú<module>   sV   




ý
þ

AR,,E