U
    md                     @   s  d 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 ddlmZmZ ddlmZ ddlmZmZmZmZmZ ddlmZmZ ejejeZ ddggdggdggdggd	d
Z!dTddZ"dd Z#dd Z$d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& Z0dUd'd(Z1d)d* Z2d+d, Z3d-d. Z4dVd0d1Z5d2d3 Z6d4d5 Z7d6d7 Z8d8d9 Z9d:d; Z:d<d= Z;d>d? Z<ej'j(d@dA Z=dBdC Z>dDdE Z?dFdG Z@dHdI ZAdJdK ZBdLdM ZCdNdO ZDdPdQ ZEdRdS ZFdS )WzM
Tests for the generic MLEModel

Author: Chad Fulton
License: Simplified-BSD
    N)sarimaxvarmaxkalman_filterkalman_smoother)MLEModelMLEResultsWrapper)nile)assert_assert_almost_equalassert_equalassert_allcloseassert_raises)results_sarimaxresults_var_misc   approximate_diffuse)k_statesdesign
transition	selection	state_covinitializationTFc              	   C   s   t dd }d| }|rFtjdddd}tj||d}tj||d}tj||dd	d
d	d}| rt  t	d |j
dd}W 5 Q R X nd }||fS )Nd         ?   
1960-01-01MSperiodsfreqindex)r   r   r   TF)exogorderZtime_varying_regressionZmle_regressionZuse_exact_diffuseignore)disp)nparangepd
date_rangeSeriesr   SARIMAXwarningscatch_warningssimplefilterfit)r0   pandasendogr"   r!   modres r5   g/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/statsmodels/tsa/statespace/tests/test_mlemodel.pyget_dummy_mod"   s(       

r7   c                  C   sJ  d} d}d}t d}t | d }t t | | d | |f}t t | d d | | f}t |d }t t |d d ||f}t t || d ||f}	t t |d d ||f}
t|||||||||	|
d
}t|d | t|d | t|d	 | t|d
 | t|d | t|d |	 t|d |
 d S )Nr      r   
   r   r   	r   k_posdefobs_interceptr   obs_covstate_interceptr   r   r   r=   r   r>   r?   r   r   r   )r'   zerosr(   reshaper   r   )k_endogr   r<   r2   r=   r   r>   r?   r   r   r   r3   r5   r5   r6   !test_init_matrices_time_invariant<   sB    
     rC   c                  C   s  d} d}d}d}t d}t t ||  d || f}t t || |  d ||| f}t t |d |  d ||| f}t t ||  d || f}t t |d |  d ||| f}	t t || |  d ||| f}
t t |d |  d ||| f}t||||||||	|
|d
}t|d | t|d	 | t|d
 | t|d | t|d |	 t|d |
 t|d | d S )Nr:   r   r8   r   r9   r   r;   r=   r   r>   r?   r   r   r   )r'   r@   rA   r(   r   r   )nobsrB   r   r<   r2   r=   r   r>   r?   r   r   r   r3   r5   r5   r6   test_init_matrices_time_varying]   s`    
        rE   c                  C   s  t dd\} }t| d dtd  d| dddd d f< t| jdddd d f d t| jd jd	 d
gg| d< t| jd d
 t| jd jd t| jd d| _t| jjd t| j| jj d| _t| jjd t| jd d| _t| jjd tt	| j
td |   | d t| j
jd t| j
jd | dgdgg t| j
jd t| j
jdg t| j
jdgg |   t| j
jd t| jjtj t| jjtj t| jjtj t| jjtj | j  | jj}t|jtj t|jtj t|jtj |  d | !d | "d | #d t| jjd t| jjd t| jjd t| jjd t|jtj t|jtj t|jtj |  d | j  | jj}t|jd t|jd t|jd d S )NFr0   r   r   r          @r   r   r   r   )r   r   r         @r   r   r   grh|?g    _Bg   mBTg     j@r   g      @(   ZknownZ
stationarye   f   g   )$r7   r   r'   r(   ssmshapeloglikelihood_burnZ	toleranceinitial_variance
isinstancer   objectZinitialize_defaultZinitialize_approximate_diffuseZinitialization_typeZapproximate_diffuse_varianceZinitialize_knownZconstantZstationary_covZinitialize_stationaryZfilter_methodr   ZFILTER_CONVENTIONALZstability_methodZSTABILITY_FORCE_SYMMETRYZconserve_memoryZMEMORY_STORE_ALLZsmoother_outputr   ZSMOOTHER_ALLZ_initialize_filterZ_kalman_filterZset_filter_methodZset_stability_methodZset_conserve_memoryZset_smoother_output)r3   _Zkfr5   r5   r6   test_wrapping   sr    







rV   c               	   C   s   t j} t| d dd  }tj|ddd}t 4 td |j	ddd	d
d}|j	dddd
d}W 5 Q R X t
|j|jdd td
d\}}t  td |j	ddd}W 5 Q R X t|ddgd d S )Ndatar   r   r   r   c)r#   trendr$   Zncgr   opgF)methodr&   Zoptim_hessianZoptim_complex_stepoim{Gz?)ZrtolrF   r%   T)r&   Zreturn_params   )r   Zwpi1_stationaryr'   diffr   r,   r-   r.   r/   r0   r   llfr7   r
   )truer2   r3   res1res2rU   Z
res_paramsr5   r5   r6   test_fit_misc   s"    





re   c                  C   s   t  \} }| |j d S N)r7   scoreparamsr3   r4   r5   r5   r6   test_score_misc
  s    
rj   c                   C   s   t tdd  d S )Nc                   S   s   t dddS )Nr   r   r8   )r   Zfrom_formular5   r5   r5   r6   <lambda>      z#test_from_formula.<locals>.<lambda>)r   NotImplementedErrorr5   r5   r5   r6   test_from_formula  s    rn   c               	   C   s  t jddgdd} dd }dd }tjd	 }tj||d
 |d ||d
 |d f }| j|ddd}t|| | j|ddd}t||dd | j|dddd}t||dd | j|dddd}t|| | j|dddd}	t|	|dd | j|ddddd}
t|
|dd dd }dd }| |}tttj||d
 ||d f tj||d
 |d ||d
 |d f }| j|ddd}t|| | j|ddd}t||dd | j|dddd}t||dd | j|dddd}t|| | j|dddd}	t|	|dd | j|ddddd}
t|
|dd tjd }dd }||d
 |d }t	
 @ t	d t| |d |dd t| |d |dd W 5 Q R X d S )Nr         ?r   r   r   r#   c                 S   s,   d| d d|  |  d  |d| d    S )N      r   r   r5   phisigma2r5   r5   r6   partial_phi  s    z,test_score_analytic_ar1.<locals>.partial_phic                 S   s   dd| |  d  |d  S )Nrr   r         ?r5   rs   r5   r5   r6   partial_sigma2  s    z/test_score_analytic_ar1.<locals>.partial_sigma2)        r   r   T)transformedapprox_complex_stepFh㈵>Zatol)rz   r{   approx_centeredZharvey)rz   r\   r{   )rz   r\   r{   r~   c                 S   s   dd| d  d  S )Ng      r   r   g      ?r5   )rt   r5   r5   r6   partial_transform_phiH  s    z6test_score_analytic_ar1.<locals>.partial_transform_phic                 S   s   d|  S )NrH   r5   )ru   r5   r5   r6   partial_transform_sigma2K  s    z9test_score_analytic_ar1.<locals>.partial_transform_sigma2)ro   r   c                 S   sd   t d}| d  d | d d d  |d< dd|d    |d< |d< ||  d |d	  |d
< |S )N)r   r   r   r   r   r   r%   r   r   )r   r   rw   r8   rJ   )r'   r@   )rt   ru   hessianr5   r5   r6   r   q  s
    
"z(test_score_analytic_ar1.<locals>.hessianr$   r   皙?)r   r,   r'   r_rg   r   untransform_paramsdotZdiagr-   r.   r/   Z_hessian_complex_stepZ_hessian_finite_difference)r3   rv   rx   rh   Zanalytic_scoreZ	approx_csZ	approx_fdZapprox_fd_centeredZ	harvey_csZ	harvey_fdZharvey_fd_centeredr   r   Zuparamsr   Zanalytic_hessianr5   r5   r6   test_score_analytic_ar1  s    


















  r   c               
   C   s  t  \} }t n td | j|jddd}t|jd d | j|jddd}t|jd t|jd d | j|jdd	d}t|jd	 t|jd d
 | j|jddd}t|jd t|jd d | j|jddd}t|jd t|jd d | j|jddd}t|jd t|jd d | j|jddd}t|jd t|jd d t	
t | j|jddd W 5 Q R X W 5 Q R X d S )Nr$   r%   none)r&   cov_typedescriptionz!Covariance matrix not calculated.approxzLCovariance matrix calculated using numerical (complex-step) differentiation.r]   zmCovariance matrix calculated using the observed information matrix (complex-step) described in Harvey (1989).r[   zQCovariance matrix calculated using the outer product of gradients (complex-step).ZrobustzQuasi-maximum likelihood covariance matrix used for robustness to some misspecifications; calculated using the observed information matrix (complex-step) described in Harvey (1989).Z
robust_oimZrobust_approxzQuasi-maximum likelihood covariance matrix used for robustness to some misspecifications; calculated using numerical (complex-step) differentiation.Zinvalid_cov_type)r7   r-   r.   r/   r0   rh   r   cov_kwdsr   pytestraisesrm   ri   r5   r5   r6   test_cov_params  s\    

r   c                  C   s   t ddgft} t| ddgddg t| ddgddg | jg dd | jg dd | jg dd | jg dd t	dd\} }t| ddgddg t| ddgddg | jddgd	d}t|j
ddg | jddgdd}t|j
ddg d S )
Nr   r   r8   F)rz   rF      	   T)r   kwargsr   Ztransform_paramsr   filterupdateloglikeZ
loglikeobsr7   rh   )r3   rU   r4   r5   r5   r6   test_transform  s    r   c                  C   s   t ddg} t| ft}|jg dd}tt|tjd |g }tt|t	d t|j
d |jg dd}tt|t	d t|j
d d S )Nr   rH   T)Z
return_ssmr[   r]   )r   )r'   arrayr   r   r   r   rS   r   ZFilterResultsr   r   )r2   r3   r4   r5   r5   r6   test_filter  s    
r   c                      s^   t ddgft tt fdd t jg  dg _dg _t jdg t jdg d S )Nr   r   c                      s    j S rf   )start_paramsr5   r3   r5   r6   rk     rl   ztest_params.<locals>.<lambda>a)	r   r   r   rm   r   Zparam_namesZ_start_paramsZ_param_namesr   r5   r5   r   r6   test_params  s    r   c                 C   s`   t | d\}}t|jdd  |jdd    t|jdd  t|jd  t	|j
d d S )Nr1   r   r   )r7   r
   Zfittedvaluesr2   ZsqueezeZresidr'   r@   rD   r   rQ   )r1   r3   r4   r5   r5   r6   check_results   s    " r   c                 C   s   t dd t dd d S )NFr   T)r   r   r5   r5   r6   test_results  s    
r   c                  C   s   t jdddd} t jddg| d}t|ft}|g }| }t|j|j	f t
| j| t
|jdd|  tddgft}|g }tt|jd	d d S )
N
1980-01-01
1981-01-01ASstartendr   r   r   r    )dynamicstring)r)   r*   r+   r   r   r   predictr   rP   rD   r   get_predictionpredicted_meanr   KeyError)datesr2   r3   r4   r   r5   r5   r6   test_predict  s    

r   c                  C   s   t ddgft} | g }|jdd}t|tdd  t|jddj| t	j
dddd}t t	jddg|d	ft} | g }t|jddtdd  t|jd
dtdd  t|jddjtdd  d S )Nr   r   r:   )Zsteps)r:   r   r   r   r    z
1960-12-01)r   r   r   forecastr   r'   ZonesZget_forecastr   r)   r*   r+   )r3   r4   r   r!   r5   r5   r6   test_forecast*  s    

r   c               	   C   s   t jdddd} t jddddd	g| d
}t|ft}|g }t| }tt	
d|d k	d tt	
d|d k	d tt	
d|d k	d t J td tj|jjd d < |  d|j_|  d|j_|  W 5 Q R X d S )Nr   z
1984-01-01r   r   r   r   r8   r   r_   r    zSample:\s+01-01-1980Tz\s+- 01-01-1984zModel:\s+MLEModelr$   r   )r)   r*   r+   r   r   r   strsummaryr   researchr-   r.   r/   r'   nanfilter_results_standardized_forecasts_error)r   r2   r3   r4   txtr5   r5   r6   test_summary<  s     


r   r   c                 K   s   t | f|}t|jjd t|jjd d t|jj||f t|jjjd t|jjjd d t|jjj||f t|jjj|jkd |S )Nr   C_CONTIGUOUSTF_CONTIGUOUS)r   r   r2   ndimflagsrP   rO   base)r2   rD   rB   r   r3   r5   r5   r6   check_endogW  s    r   c                  C   s(  t ttddd t ttddd t ttddd tdgft} | g }t|jjdgg tdgft} | g }t|jjdgg tdgft} | g }t|jjdgg tdgft} t t| jg  ddg}t|ft} | g  dgdgg}t|ft} | g  d}t|ft} | g  d S )Nr   )r2   r   r   Tr   rH   )r   rH   )	r   
ValueErrorr   r   r   r   r   r2   r   )r3   r4   r2   r5   r5   r6   test_basic_endogk  s.    




r   c                  C   s  t ddg} t| ft}t|jj|jjk	d t|jj| k	d t|jjj| k	d d| d< t|jt j	d 
dd t|jj|  t d} ttt| ft t ddg} t| jd t| jd d t| jd	 d t| jd
 t| ft}|g  t ddg
dd} t| jd t| jd d t| jd t| ft}|g  t ddg
dd} t| jd t| jd d t| jd ttt| ft t ddg
dd } t| jd t| jd	 d t| jd t| ft}|g  t ddg
dd } t| jd t| jd	 d t| jd ttt| ft t ddg
ddd} ttt| ft ddgdggddgddggdggdggdggdd}t ddgddgg} t| fddi|}|g  d S )Nr   rH   Tr   r   r   r   r   r   r   )r   )r   r   ry   r   r   r   r>   r   r   r   r   rI         @rB   )r'   r   r   r   r   r2   r   rW   
orig_endogr   rA   r   	TypeErrorr   r   r   rP   r   r   Z	transpose)r2   r3   kwargs2r5   r5   r6   test_numpy_endog  sh    



 
   r   c                  C   s  t ddg} td t jdddd}t jddg|d} t| ft}|g  t jd	d
g|d} tt	t| ft t jddg|d} t| ft}|g  t j
d	ddgi|d} t| ft}|g  t j
ddgddgd|d} tt	t| ft t j
d	ddgi|d} t| ft}t|jj|jjk	d t|jj| k	d t|jjjj| k	d d| jd< t|jtjd dd t|jj|  ddgdggddgddggdggdggdggdd}t j
ddgddgd|d} t| fddi|}|g  d S )Nr   rH   alwaysr   r   r   r   r    r   brI   r   )r   r   Tr   r   r   r   ry   r   r   r   rB   )r)   r+   r-   r/   r*   r   r   r   r   r   	DataFramer   r2   r   rW   r   valuesilocr'   r   rA   r   )r2   r   r3   r   r5   r5   r6   test_pandas_endog  sF    




 
   r   c               	   C   s$  t  \} }|jjj}tjj|d|j_|jd d}|jdd}t|| t	t
|jdd |jd d}|jdd}t|| tt |jd dd W 5 Q R X tt
 |jdd W 5 Q R X |jd d}|jdd}t|| tt
 |jdd W 5 Q R X |jd dd	d
 |jdd d S )N)sizer\   
jarqueberainvalidbreakvar)r\   alternativeljungboxdF)r\   r   Zuse_fZ	boxpierce)r7   r   r   rP   r'   randomnormaltest_normalityr   r   rm   test_heteroskedasticityr   r   r   test_serial_correlation)r3   r4   rP   actualZdesiredr5   r5   r6   test_diagnostics-  s,    




r   c                  C   s~   ddl m}  tj j}tjdddd|_| |d dd	|jjd
}|	 }|j
dddddd d df }t|ddgdd d S )Nr   )r,   
1871-01-01
1970-01-01r   r   volumerX   n)r2   r#   rZ   r   r   r:   T)r\   lagsZ	df_adjustr%   gZd;,@g<,?MbP?r}   )Z"statsmodels.tsa.statespace.sarimaxr,   r   rW   load_pandasr)   r*   r!   r   r0   r   r   )r,   niledatar3   r4   r   r5   r5   r6   )test_small_sample_serial_correlation_testR  s(        r   c                  C   s   t j j} tjdddd| _t| d ddddd	}d|jd
< t	d|jd< d|jd< d|jd< t	d|jd< |
g }|jddddd d df }t|ddgdd |jdddd df }t|ddgdd d S ) Nr   r   r   r   r   r   r     4&kCr   r   rR   rQ   rG   gN@a3#@r>   r   r   r   r   r   r   r   r   gke@r   r   r   r   r:   r\   r   r   r%   gCl;*@g-?r   r}   r   r   r   gfW?gW?r|   )r   rW   r   r)   r*   r!   r   rO   r'   expr   r   r   r   )r   r3   r4   r   r5   r5   r6   test_diagnostics_nile_eviewsg  s&      



r   c                  C   s   t j j} tjdddd| _t| d ddddd	}d|jd
< d|jd< d|jd< d|jd< d|jd< |g }|j	dddd }t
|dgdd |jddd }|d |d |d g}t
|dddgdd |jd dd! }t
|d"gdd d S )#Nr   r   r   r   r   r   r   r   r   rG   g    }@r   r   r   gfffff@r   r   r   r   )r   r   r%   gGz!@r^   r}   r   r   r   r   r8   g?gQgQ@r   r   gQ?)r   rW   r   r)   r*   r!   r   rO   r   r   r   r   r   )r   r3   r4   r   Znormr5   r5   r6   #test_diagnostics_nile_durbinkoopman  s,      





r   c                  C   s   t  \} }| }|  d S rf   )r7   r   Zsummary_frame)r3   r4   r   r5   r5   r6   test_prediction_results  s    
r   c                  C   s  t jtjdddgt jddddd} t| d  | d	< t| d  | d
< t| d  | d< | jddd	d
dgf }tj	}t
j|d	 dddd}||d }t|j|d  |jdddd|j  }|jddddt|j |j  }|jddddtt|j |j  }t||d  t||d  t||d  tj}|jd }|jt|j }t||d  t||d  |dd }|dt|j }t||d  t||d  tj}tj|ddddd }||d }t|j|d  |jdddd!|j  }|jdddd"t|j |j  }|jdddd!tt|j |j  }t||d  t||d  t||d  tj}|jd! }|jd"t|j  }t||d  t||d  |dd! }|dd"t|j  }t||d  t||d  d S )#NinvincZconsumpr   z
1982-10-01ZQSr   )columnsr!   Zdln_invZdln_incZdln_consumpz
1960-04-01z
1978-10-01rp   rY   r   )r#   rZ   rQ   rh   r   aicZ	lutkepohlr   r   bicr   hqicZ	estat_aicZ	estat_bicr   r   Zunstructured)r#   rZ   Zerror_cov_typerQ         )r)   r   r   Zlutkepohl_datar*   r'   logr`   locZlutkepohl_ar1_lustatsr   r,   r   r   ra   Zinfo_criteriaZnobs_effectiveZlutkepohl_ar1r   r   Zlutkepohl_var1_lustatsr   ZVARMAXZlutkepohl_var1)Zdtar2   rb   r3   r4   r   r   r   r5   r5   r6   #test_lutkepohl_information_criteria  s     


 
r   c               	   C   sv  t j jd } tjdddd| _| jd d }| jdd }tj|dd	d
}|	dg}t
t|j|ddid t
t|j|ddid t
t|j|ddid t
t|j|di id t
t|j|di id t
t|j|di id | jdd }tj| jd t|dd|_d}tjt|d || W 5 Q R X tjt|d || W 5 Q R X d}tjt|d |j||d W 5 Q R X d}tjt|d |j||d W 5 Q R X | jdd }d}tjt|d || W 5 Q R X tjt|d || W 5 Q R X d}tjt|d |j||d W 5 Q R X d}tjt|d |j||d W 5 Q R X t| jd d j}t| jd d jdd  }	tj|d|d	d}
|
	ddg}t| d d jdd  }d}tjt|d || W 5 Q R X tjt|d || W 5 Q R X d}tjt|d |j|	|d W 5 Q R X d}tjt|d |j|	|d W 5 Q R X d S )Nr   r   r   r   r      rK   rp   T)r#   concentrate_scalero   r   r   )Z
fit_kwargsr   r   r   r   r   r   zeGiven `endog` does not have an index that extends the index of the model. Expected index frequency is)matchzdGiven `exog` does not have an index that extends the index of the model. Expected index frequency is)r"   z.The indices for endog and exog are not aligned   )   zJGiven `endog` does not have an index that extends the index of the model.$zIGiven `exog` does not have an index that extends the index of the model.$r#   r"   r   g?)r   rW   r   r)   r*   r!   r   r   r,   smoothr   r   appendextendapplylenr   r   r+   r   )r   Zendog1Zendog2r3   rc   Z
wrong_freqmessageZnot_ctsZendog3Zendog4Zmod2rd   r5   r5   r6    test_append_extend_apply_invalid  s    


  
r  c                  C   sT   t jdddgddddgdd} | ddg}|jddddd	gd
}t|jtj d S )Nr   rp   r   Tr  r   r_   r8   r   )r   r   r"   )r   r,   r   r   r   Zdtyper'   Zfloat64)r3   r4   pr5   r5   r6   test_integer_paramsc  s    r  c                 C   s  t j||g }t j||g }t j||g }t| jj| t| jj| t| j	j| t| jj| t| j
j| t| j
j| t| jj| t| j
j| t| jj| t| jj| t| jj| t| jj| d S rf   )r)   Z
MultiIndexZfrom_productZ	swaplevelr	   Z	predictedr!   equalsr   Zpredicted_covfilteredZfiltered_covZsmoothedZsmoothed_cov)statesixpredicted_ixcolsZpredicted_cov_ixZfiltered_cov_ixZsmoothed_cov_ixr5   r5   r6   check_states_indexl  s"    r  c                  C   s   d} t jd| dd}t jt| |d}tj|dd}|dd	d
g}t j|d | d dd}t ddg}t	|j
||| d S Nr:   2000Mr   r    r   r   r   rq   ro   r   r   r   r   state.0state.1)r)   Zperiod_ranger+   r'   r@   r   r,   r  Indexr  r  rD   r  r2   r3   r4   r  r  r5   r5   r6   test_states_index_periodindex  s    r  c                  C   s   d} t jd| dd}t jt| |d}tj|dd}|dd	d
g}t j|d | d dd}t ddg}t	|j
||| d S r  )r)   r*   r+   r'   r@   r   r,   r  r  r  r  r  r5   r5   r6   test_states_index_dateindex  s    r  c                  C   sx   d} t td}t jt| |d}tj|dd}|dddg}t td}t d	d
g}t	|j
||| d S )Nr:   r    r  rq   ro   r   r      r  r  )r)   r  r'   r(   r+   r@   r   r,   r  r  r  r  r5   r5   r6   test_states_index_int64index  s    r   c                  C   s   d} t d}t jt| |d}tj|dd}|dddg}t d}t d	d
g}t	|j
||| t ddd}t jt| |d}tj|dd}|dddg}t ddd}t d	d
g}t	|j
||| d S )Nr:   r    r  rq   ro   r   r   r  r  r  r       r8   #   )r)   Z
RangeIndexr+   r'   r@   r   r,   r  r  r  r  r  r5   r5   r6   test_states_index_rangeindex  s    

r#  c               	   C   s<   dddg} t |  tt t j| dd W 5 Q R X d S )Nr   r   T)Zinvalid_kwarg)r   r,   r   ZwarnsFutureWarning)r2   r5   r5   r6   test_invalid_kwargs  s    

r%  )TF)F)r   r   )G__doc__osr   r-   numpyr'   r1   r)   r   Zstatsmodels.tsa.statespacer   r   r   r   Z#statsmodels.tsa.statespace.mlemodelr   r   Zstatsmodels.datasetsr   Znumpy.testingr	   r
   r   r   r   Z(statsmodels.tsa.statespace.tests.resultsr   r   pathdirnameabspath__file__current_pathr   r7   rC   rE   rV   re   markZsmokerj   rn   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r#  r%  r5   r5   r5   r6   <module>   sp      
!(k
l<

(]=%$
	]R	