U
    `»{jó`  ã                   @   s¶   d Z ddlZddlZddlZddlZddlm  mZ	 ddl
mZmZmZ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 e	jG dd„ deƒƒZe	jG dd	„ d	eƒƒZdS )
z  Test cases for .boxplot method é    N)Ú	DataFrameÚ
MultiIndexÚSeriesÚ
date_rangeÚtimedelta_range)ÚTestPlotBaseÚ_check_plot_works)Úpprint_thingc                   @   sv  e Zd Zdd„ Zejj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ej ddddddœdddddœfddiddifddddddœfg¡dd„ ƒZej ddd d d!d dœfd"d#d#d$d#dœfg¡d%d&„ ƒZej d'ddd(œd)fg¡d*d+„ ƒZej d,d-d.d/d0g¡d1d2„ ƒZej d3d4d5g¡d6d7„ ƒZej d3d4d5g¡d8d9„ ƒZej d3d4d5g¡d:d;„ ƒZd<S )=ÚTestDataFramePlotsc              	   C   sØ   dd l m} d}ttj ddddg|¡tj ddddg|¡tj ddddg|¡dœt d|¡d�}|jdd	d
�}dd„ | ¡ D ƒ|j	 
¡ ks�t‚| t ddd¡¡ | ¡  dd„ | ¡ D ƒtt ddd¡ƒksÔt‚d S )Nr   éP   é   é   é   )ZClinicalZ	ConfirmedZ	Discarded©ÚindexÚbarT)ÚkindZstackedc                 S   s   g | ]}t | ¡ ƒ‘qS © ©ÚintÚget_text©Ú.0Úxr   r   úh/var/www/html/bwave/python/venv/lib/python3.8/site-packages/pandas/tests/plotting/test_boxplot_method.pyÚ
<listcomp>,   s     zDTestDataFramePlots.test_stacked_boxplot_set_axis.<locals>.<listcomp>é
   c                 S   s   g | ]}t | ¡ ƒ‘qS r   r   r   r   r   r   r   /   s     )Úmatplotlib.pyplotÚpyplotr   ÚnpÚrandomÚchoiceZarangeÚplotÚget_xticklabelsr   Zto_listÚAssertionErrorZ
set_xticksZdrawÚlist)ÚselfÚpltÚnÚdfÚaxr   r   r   Útest_stacked_boxplot_set_axis   s     ý
ú ÿz0TestDataFramePlots.test_stacked_boxplot_set_axisc              	   C   s\  t tj dd¡ttjd d… ƒddddgd�}dd	gd
 |d< dd	dgd |d< t|jdd� t|jddgdd� t	j
tdd�� t|jddgdd� W 5 Q R X t|jdddgd� t	j
tdd�� t|jdd� W 5 Q R X t	j
tdd�� t|jddgd� W 5 Q R X ttjj|d dd� t|jddd� t	j
tdd�� t|jddd� W 5 Q R X d S )Né   é   ÚoneÚtwoÚthreeÚfour©r   ÚcolumnsÚfoor   r   Zindicr   Zindic2Údict©Úreturn_type©Úcolumnr7   F©Zcheck_stacklevel)r9   Úby©r;   )Údatar7   r   )Únotchr7   )r;   r>   )r   r   r    Úrandnr%   ÚstringÚascii_lettersr   ÚboxplotÚtmÚassert_produces_warningÚUserWarningÚplottingZ_core©r&   r)   r   r   r   Útest_boxplot_legacy13   s(    
ýz'TestDataFramePlots.test_boxplot_legacy1c                 C   sz  t tj dd¡ddgd�}tddddddddddg
ƒ|d< tdgd ƒ|d	< tjtd
d�� t|j	dd� W 5 Q R X | j
 ¡ \}}|j	dd|d�}|j}||ks¤t‚| j
 ¡ \}}| d	¡j	|dd�}|j}||d ksÜt‚| j
 ¡ \}}t t¡� |j	ddgd|dd�}W 5 Q R X |d  ¡ |k�s,t‚| j
 ¡ \}}|j	|dd�}ttj | ¡ ¡ƒ}t| ¡ ƒt|ƒk�svt‚d S )Nr   r   ZCol1ZCol2©r3   ÚAÚBÚXÚYFr:   r<   )r;   r*   Úaxes)r*   r7   )r9   r;   r*   r7   r5   )r   r   r    Úrandr   rC   rD   rE   r   rB   r'   ÚsubplotsrN   r$   ÚgroupbyZ
get_figurer%   Ú	itertoolsÚchainÚfrom_iterableÚvaluesÚlenÚ	get_lines)r&   r)   Úfigr*   rN   Zax_axesÚdÚlinesr   r   r   Útest_boxplot_legacy2L   s4        ÿz'TestDataFramePlots.test_boxplot_legacy2c                 C   s   |  ¡ }t|| jjƒst‚d S ©N)rB   Ú
isinstancer'   ZAxesr$   )r&   Úhist_dfÚresultr   r   r   Útest_boxplot_return_type_nonen   s    z0TestDataFramePlots.test_boxplot_return_type_nonec              	   C   sú   t tj dd¡ttjd d… ƒddddgd�}d}tjt	|d	�� |j
d
d� W 5 Q R X | 
¡ }|  |d¡ t d¡� |j
dd�}W 5 Q R X |  |d¡ t d¡� |j
dd�}W 5 Q R X |  |d¡ t d¡� |j
dd�}W 5 Q R X |  |d¡ d S )Nr,   r-   r.   r/   r0   r1   r2   z,return_type must be {'axes', 'dict', 'both'}©ÚmatchZ
NOT_A_TYPEr6   rN   Fr5   Úboth)r   r   r    r?   r%   r@   rA   ÚpytestÚraisesÚ
ValueErrorrB   Ú_check_box_return_typerC   rD   )r&   r)   Úmsgr_   r   r   r   Útest_boxplot_return_type_legacys   s&    
ýz2TestDataFramePlots.test_boxplot_return_type_legacyc           	      C   sú   dd„ }|  ¡ }tj dd|jd ¡|d< |jddgd	d
�\}}||d |ƒ ||d |ƒ |j|ksjt‚|jdddgd	d
�}|d |d |d   }}}|d }||d |ƒ ||d |ƒ ||d |ƒ |j|ksÚt‚|j|ksèt‚|jd ksöt‚d S )Nc                 S   s0   |  ¡ \}}||  ¡ kst‚||  ¡ ks,t‚d S r\   )Zget_ylimÚminr$   Úmax)Úcolr*   Zy_minZy_maxr   r   r   Ú_check_ax_limits�   s    zETestDataFramePlots.test_boxplot_axis_limits.<locals>._check_ax_limitsr   é   r   ZageÚheightÚweightÚcategoryr<   )r   r   )r   r   )r   r   ©r   r   )Úcopyr   r    ÚrandintÚshaperB   Z_shareyr$   )	r&   r^   rm   r)   Z	height_axZ	weight_axÚpZage_axZdummy_axr   r   r   Útest_boxplot_axis_limitsŽ   s     z+TestDataFramePlots.test_boxplot_axis_limitsc                 C   s8   t tj dd¡ƒ}tj|jd d …df< t|jdd� d S )Nrn   r-   r   rN   r6   )r   r   r    r?   ÚnanÚlocr   rB   rG   r   r   r   Útest_boxplot_empty_column¨   s    z,TestDataFramePlots.test_boxplot_empty_columnc                 C   sV   t tj dd¡dddddgd�}|jd	d
d�}|jjjdks@t‚|jjj	dksRt‚d S )Nr   é   rJ   rK   ÚCÚDÚErI   rN   )é   é   )r7   Zfigsizer   r€   )
r   r   r    rO   rB   ÚfigureZbbox_inchesÚwidthr$   ro   )r&   r)   r_   r   r   r   Útest_figsize­   s     zTestDataFramePlots.test_figsizec                 C   s6   t dddddddgiƒ}| j|jddd	�ddd
� d S )NÚar   r   r   r-   r{   r,   é   )Úfontsize©Z
xlabelsizeZ
ylabelsize©r   Z_check_ticks_propsrB   rG   r   r   r   Útest_fontsize³   s      ÿz TestDataFramePlots.test_fontsizec              
   C   s€   t tddd�tj d¡tj d¡d tddd� t¡tdddd�tddd�dœƒ}|jd	d
�}dd„ | 	¡ D ƒddgks|t
‚d S )Nz
2012-01-01éd   )Úperiodsr   ÚUTC)r‹   Útzz1 days)r„   ÚbÚcrY   ÚeÚfÚbox)r   c                 S   s   g | ]}|  ¡ ‘qS r   ©r   r   r   r   r   r   Æ   s     z@TestDataFramePlots.test_boxplot_numeric_data.<locals>.<listcomp>rŽ   r�   )r   r   r   r    r?   ÚastypeÚstrr   r"   r#   r$   )r&   r)   r*   r   r   r   Útest_boxplot_numeric_data¹   s    


úÿ
z,TestDataFramePlots.test_boxplot_numeric_datazcolors_kwd, expectedÚrrŽ   Úgr�   )ÚboxesÚwhiskersÚmediansÚcapsr™   c                 C   sN   t tj dd¡ƒ}|j|dd�}| ¡ D ] \}}|| d  ¡ |ks(t‚q(d S )Nr   r   r5   ©Úcolorr7   r   )r   r   r    rO   rB   ÚitemsÚ	get_colorr$   )r&   Z
colors_kwdÚexpectedr)   r_   ÚkÚvr   r   r   Útest_color_kwdÈ   s    z!TestDataFramePlots.test_color_kwdzscheme,expectedZdark_backgroundz#8dd3c7z#bfbbd9Údefaultz#1f77b4z#2ca02cc                 C   sf   t tj dd¡ƒ}dd lm} |j |¡ |jj	dd�}| 
¡ D ] \}}|| d  ¡ |ks@t‚q@d S )Nr   r   r   r5   r6   )r   r   r    rO   r   r   ÚstyleZuser"   r’   rŸ   r    r$   )r&   Úschemer¡   r)   r'   r_   r¢   r£   r   r   r   Útest_colors_in_themeÚ   s    z'TestDataFramePlots.test_colors_in_themezdict_colors, msg)r™   Zinvalid_keyzinvalid key 'invalid_key'c              	   C   s>   t tj dd¡ƒ}tjt|d�� |j|dd� W 5 Q R X d S )Nr   r   ra   r5   r�   )r   r   r    rO   rd   re   rf   rB   )r&   Zdict_colorsrh   r)   r   r   r   Útest_color_kwd_errorsû   s    z(TestDataFramePlots.test_color_kwd_errorszprops, expected)Zboxpropsr™   )Zwhiskerpropsrš   )Zcappropsrœ   )Zmedianpropsr›   c                 C   sN   t dd„ dD ƒƒ}|ddii}|jf ddi|—Ž}|| d  ¡ dksJt‚d S )	Nc                 S   s   i | ]}|t j d ¡“qS )rŠ   )r   r    )r   r¢   r   r   r   Ú
<dictcomp>  s      z?TestDataFramePlots.test_specified_props_kwd.<locals>.<dictcomp>ÚABCrž   ZC1r7   r5   r   )r   rB   r    r$   )r&   Úpropsr¡   r)   Zkwdr_   r   r   r   Útest_specified_props_kwd  s    z+TestDataFramePlots.test_specified_props_kwdÚvertTFc                 C   sl   t tj d¡tj d¡tj ddgd¡dœƒ}d\}}|jd|||d�}| ¡ |ksXt‚| ¡ |ksht‚d S )NrŠ   Úgroup1Úgroup2©r„   rŽ   Úgroup©r   Úyr’   )r   r®   ÚxlabelÚylabel)	r   r   r    r?   r!   r"   Ú
get_xlabelr$   Ú
get_ylabel©r&   r®   r)   rµ   r¶   r*   r   r   r   Útest_plot_xlabel_ylabel  s    

ýÿz*TestDataFramePlots.test_plot_xlabel_ylabelc                 C   sj   t tj d¡tj d¡tj ddgd¡dœƒ}d\}}|j|||d�}| ¡ |ksVt‚| ¡ |ksft‚d S )NrŠ   r¯   r°   r±   r³   )r®   rµ   r¶   )	r   r   r    r?   r!   rB   r·   r$   r¸   r¹   r   r   r   Útest_boxplot_xlabel_ylabel$  s    

ýÿz-TestDataFramePlots.test_boxplot_xlabel_ylabelc                 C   sÈ   t tj d¡tj d¡tj ddgd¡dœƒ}d\}}|jd|||d�}|D ]$}| ¡ |ks`t‚| ¡ |ksLt‚qL| j	 
¡  |jd|d�}|D ]*}|rž| ¡ n| ¡ }|tdgƒksŽt‚qŽ| j	 
¡  d S )	NrŠ   r¯   r°   r±   r³   r²   )r;   r®   rµ   r¶   )r;   r®   )r   r   r    r?   r!   rB   r·   r$   r¸   r'   Úcloser	   )r&   r®   r)   rµ   r¶   r*   ZsubplotZtarget_labelr   r   r   Ú test_boxplot_group_xlabel_ylabel2  s"    

ýÿ
z3TestDataFramePlots.test_boxplot_group_xlabel_ylabelN)Ú__name__Ú
__module__Ú__qualname__r+   rd   ÚmarkÚslowrH   r[   r`   ri   rw   rz   rƒ   r‰   r–   Úparametrizer¤   r¨   r©   r­   rº   r»   r½   r   r   r   r   r
      sx   
"þúþ
üþ
üþöþ

þ
üþ	


r
   c                   @   sü   e Zd Zdd„ Zejjdd„ ƒZdd„ Zdd„ Z	ejjd	d
„ ƒZ
ejjdd„ ƒZejjdd„ ƒZdd„ Zej dddddddgfdgdddddgfddddddgfddgddddddddddg
fdddddddddddg
fg¡dd „ ƒZd!d"„ Zd#d$„ ZdS )%ÚTestDataFrameGroupByPlotsc              	   C   sn   |j dd�}tjtdd�� t|jdd�}W 5 Q R X | jt|jƒddd	� t|jddd
�}| j|ddd	� d S )NÚgenderr<   Fr:   rN   r6   r   ©r   r   ©Zaxes_numÚlayout©rP   r7   r   rr   )	rQ   rC   rD   rE   r   rB   Ú_check_axes_shaper%   rU   )r&   r^   ÚgroupedrN   r   r   r   rH   K  s    z.TestDataFrameGroupByPlots.test_boxplot_legacy1c              	   C   s¢   t tjd d… tdƒƒ}ttj dd¡t 	|¡d�}|j
dd�}tjtdd�� t|jdd	�}W 5 Q R X | jt|jƒdd
d� t|jddd�}| j|ddd� d S )Nr   r   r   r   ©ÚlevelFr:   rN   r6   )r-   r   rÇ   rÉ   rr   )Úzipr@   rA   Úranger   r   r    rO   r   Úfrom_tuplesrQ   rC   rD   rE   r   rB   rÊ   r%   rU   ©r&   Útuplesr)   rË   rN   r   r   r   r[   S  s    z.TestDataFrameGroupByPlots.test_boxplot_legacy2c              	   C   s¬   t tjd d… tdƒƒ}ttj dd¡t 	|¡d�}|j
dd�jddd�}tjtdd	�� t|jd
d�}W 5 Q R X | jt|jƒddd� t|jdd
d�}| j|ddd� d S )Nr   r   r   r   rÌ   r   )rÍ   ZaxisFr:   rN   r6   ©r   r   rÇ   rÉ   rr   )rÎ   r@   rA   rÏ   r   r   r    rO   r   rÐ   ZunstackrQ   rC   rD   rE   r   rB   rÊ   r%   rU   rÑ   r   r   r   Útest_boxplot_legacy3_  s    z.TestDataFrameGroupByPlots.test_boxplot_legacy3c              	   C   sþ   d}t tjjdd|d�ƒ}t tjjdd|d�ƒ}t d¡� tjjddg|d�}W 5 Q R X t|||d	œƒ}| d
¡}| 	¡ }t
| j ¡ ƒdks’t‚t
|ƒdks¢t‚t ¡  |jdd�}t
| j ¡ ƒdksÌt‚t
|ƒdksÜt‚t ¡  | d
¡ ¡ }t ¡  d S )Nr   é¦   rn   )Úsizeé<   é*   ZmaleZfemale)ro   rp   rÅ   rÅ   r   rN   r6   r   )r   r   r    ÚnormalrC   Z
RNGContextr!   r   rQ   r"   rV   r'   Zget_fignumsr$   r¼   rB   Úhist)r&   r(   rp   ro   rÅ   r)   ÚgbÚresr   r   r   Útest_grouped_plot_fignumsi  s"    
z3TestDataFrameGroupByPlots.test_grouped_plot_fignumsc           	      C   s(  |}|j dd�}t|tjƒs t‚| j|d dddgd� | d¡j dd�}| j|dd	d
gd� d ¡ }ttj	 
dd¡|d�}d ¡ }|d |d< dD ]�}| d¡j |d�}| j||dddgd� |j d|d�}| j||dddgd� | d¡j |d�}| j|||d� |j d|d�}| j|||d� q’d S )NrÅ   r<   ro   rp   rq   )Zexpected_keysr5   r6   ZMaleZFemalezX B C D A G Y N Q Oé2   r   rI   zA B C D E F G H I Jr{   )r5   rN   rc   Ú	classroomrJ   rK   r|   )r;   r7   )rB   r]   r   Zndarrayr$   rg   rQ   Úsplitr   r    r?   )	r&   r^   r)   r_   Zcolumns2Zdf2Zcategories2ÚtÚreturnedr   r   r   Útest_grouped_box_return_type€  s6      ÿ  ÿz6TestDataFrameGroupByPlots.test_grouped_box_return_typec              	   C   s¦  |}d}t jt|d�� |jddg|jdd� W 5 Q R X d}t jt|d�� |jdddgd	d
d� W 5 Q R X d}t jt|d�� |jddg|jdd� W 5 Q R X tjtdd�� t| 	d¡jdd
d�}W 5 Q R X | j
| j ¡ jddd� tjtdd�� t| 	d¡jdd
d�}W 5 Q R X | j
| j ¡ jddd� tjtdd�� t| 	d¡jdd
d�}W 5 Q R X | j
| j ¡ jddd� |jdddgddd�}| j
| j ¡ jddd� |d fD ].}| j| ¡ dd� | j|j ¡ gdd� �q°|d |d fD ]&}|  | ¡ ¡ |  |j ¡ g¡ �qð| 	d¡jdddgd
d�}| j
| j ¡ jddd� tjtdd�� t| 	d¡jddd
d�}W 5 Q R X | j
| j ¡ jddd� tjtdd�� t| 	d¡jddd
d�}W 5 Q R X | j
| j ¡ jddd� |jdddgddd�}| j
| j ¡ jddd� |jdddgddd�}| j
| j ¡ jdd d� | 	d¡jdddgd!d
d�}| j
| j ¡ jdd!d� | 	d¡jdddgd"d
d�}| j
| j ¡ jdd#d� d S )$Nz1Layout of 1x1 must be larger than required size 2ra   rp   ro   rr   )r9   r;   rÈ   z7The 'layout' keyword is not supported when 'by' is Nonerq   )r   r   r5   )r9   rÈ   r7   z1At least one dimension of layout must be positive)éÿÿÿÿrä   Fr:   rÅ   r8   r   rÆ   rÇ   r-   rÓ   rß   r   rN   )r9   r;   r7   )Úvisible)r   r   )r   rä   )r-   r   )rä   r   )r   r   )r   r-   )r   rä   ©r   r   )rd   re   rf   rB   rÅ   rC   rD   rE   r   rQ   rÊ   r'   ÚgcfrN   Z_check_visibler#   ZxaxisZ	get_label)r&   r^   r)   rh   r’   rN   r*   r   r   r   Útest_grouped_box_layout£  s¸     ý 
  ÿ
  ÿ
  ÿ  ÿ
 ÿ
ü
ü  ÿ  ÿ
  ÿ
  ÿz1TestDataFrameGroupByPlots.test_grouped_box_layoutc              
   C   s¶  |}t  t¡�F | j dd¡\}}| d¡jdd|d� | j| j ¡ j	ddd� W 5 Q R X | j dd	¡\}}t  t¡�" |jdd
dgdd|d d�}W 5 Q R X t
 t|jƒ¡}| j|d	dd� t  ||d ¡ |d j|ksàt‚t  t¡�& | d¡jdd
dgd|d d�}W 5 Q R X t
 t|jƒ¡}| j|d	dd� t  ||d ¡ |d j|k�sZt‚d}tjt|d��@ | j dd	¡\}}t  t¡� | d¡j|d�}W 5 Q R X W 5 Q R X d S )Nr   rq   ro   rN   )r9   r7   r*   r-   rÓ   rÇ   r   rp   rÅ   r   )r9   r;   r7   r*   ræ   rß   r   z@The number of passed axes must be 3, the same as the output plotra   )r*   )rC   rD   rE   r'   rP   rQ   rB   rÊ   rç   rN   r   Úarrayr%   rU   Zassert_numpy_array_equalr�   r$   rd   re   rf   )r&   r^   r)   rX   rN   râ   rh   r   r   r   Útest_grouped_box_multiple_axes  s@    "ü
  ÿz8TestDataFrameGroupByPlots.test_grouped_box_multiple_axesc                 C   sF   t ddddddgddddddgdœƒ}| j|jd	d
dd�ddd� d S )Nr   r   r   r-   r{   r,   r   )r„   rŽ   r„   rŽ   r…   )r;   r†   r‡   rˆ   rG   r   r   r   r‰   .  s    &  ÿz'TestDataFrameGroupByPlots.test_fontsizezcol, expected_xticklabelr£   z(a, v)z(b, v)z(c, v)z(d, v)z(e, v)Úv1z(a, v1)z(b, v1)z(c, v1)z(d, v1)z(e, v1)Nc                 C   sl   t tj tdƒd¡tj d¡tj d¡dœƒ}| d¡}t|jd|dd�}dd	„ | 	¡ D ƒ}||ksht
‚d S )
NZabcderŠ   )Úcatr£   rë   rì   FrN   )rP   r9   r7   c                 S   s   g | ]}|  ¡ ‘qS r   r“   r   r   r   r   r   i  s     zQTestDataFrameGroupByPlots.test_groupby_boxplot_subplots_false.<locals>.<listcomp>)r   r   r    r!   r%   rO   rQ   r   rB   r#   r$   )r&   rl   Úexpected_xticklabelr)   rË   rN   Úresult_xticklabelr   r   r   Ú#test_groupby_boxplot_subplots_false4  s    (

ýÿ
   ÿz=TestDataFrameGroupByPlots.test_groupby_boxplot_subplots_falsec              	   C   sD   |  d¡}| d¡}d}tjt|d�� t|jdd� W 5 Q R X d S )NÚobjectrÅ   z:boxplot method requires numerical columns, nothing to plotra   F)rP   )r”   rQ   rd   re   rf   r   rB   )r&   r^   r)   rË   rh   r   r   r   Útest_groupby_boxplot_objectl  s
    

z5TestDataFrameGroupByPlots.test_groupby_boxplot_objectc           	   	   C   s¦   ddddddddgddddddddgg}t t|Ž ƒ}tj|ddgd	�}ttj d
d¡dddg|d�}ddg}t|j	|dd�}ddg}dd„ | 
¡ D ƒ}||ks¢t‚d S )Nr   Zbazr4   Zquxr.   r/   ÚfirstÚsecond)Únamesr   r€   rJ   rK   r|   r2   )r   r.   )r   r/   rN   r8   z
(bar, one)z
(bar, two)c                 S   s   g | ]}|  ¡ ‘qS r   r“   r   r   r   r   r   ‚  s     zLTestDataFrameGroupByPlots.test_boxplot_multiindex_column.<locals>.<listcomp>)r%   rÎ   r   rÐ   r   r   r    r?   r   rB   r#   r$   )	r&   ZarraysrÒ   r   r)   rl   rN   rí   rî   r   r   r   Útest_boxplot_multiindex_columnt  s    þz8TestDataFrameGroupByPlots.test_boxplot_multiindex_column)r¾   r¿   rÀ   rH   rd   rÁ   rÂ   r[   rÔ   rÝ   rã   rè   rê   r‰   rÃ   rï   rñ   rõ   r   r   r   r   rÄ   I  s`   


"
]
,öþöþíþ&
rÄ   )Ú__doc__rR   r@   Únumpyr   rd   Zpandas.util._test_decoratorsÚutilZ_test_decoratorsÚtdZpandasr   r   r   r   r   Zpandas._testingZ_testingrC   Zpandas.tests.plotting.commonr   r   Zpandas.io.formats.printingr	   Zpandas.plottingrF   Zskip_if_no_mplr
   rÄ   r   r   r   r   Ú<module>   s      .