
    h$,fZ              
       >   d dl Z d dlZd dlmZ d dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZmZ d dl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mZmZmZmZm Z m!Z!m"Z" d dl#m$Z$ d dl%m&Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z,  G d de
      Z- G d de
      Z. G d de      Z/ ej`                         Z1e1jd                  e1jf                  cZ2Z4ejj                  jm                  d       Z7d Z8d Z9ejt                  jw                  de2jx                  d   dz   e=dfd e>dfd e=dfd e=dfg      d        Z?ejt                  jw                  dd d e2jx                  d   dg      d!        Z@ejt                  jw                  dd" d# d$ g      d%        ZAejt                  jw                  dd& d g      d'        ZBejt                  jw                  dd( d) d* g      d+        ZC G d, d-e
      ZDd. ZEd/ ZFd0 ZGe,d1        ZHd2 ZIejt                  jw                  d3 ed4d56       ed57       edd58       edgd58      g      d9        ZJe,d:        ZKd; ZLd< ZMd= ZNd> ZOd? ZPd@ ZQdA ZRdB ZSdC ZTdD ZUdE ZVejt                  jw                  dF e$ ed 7       e              dGf ed 7      eVfg      dH        ZWejt                  jw                  dIeeeg      dJ        ZXdK ZYejt                  jw                  dLe=dMdNge=dOdP gf      dQ        ZZejt                  jw                  dRdSdTg      dU        Z[dV Z\y)W    N)Mock)datasets)BaseEstimator)CCAPLSCanonicalPLSRegression)make_friedman1)PCA)HistGradientBoostingClassifierRandomForestClassifier)NotFittedError)SelectFromModel)
ElasticNetElasticNetCVLassoLassoCVLinearRegressionLogisticRegressionPassiveAggressiveClassifierSGDClassifier)make_pipeline)	LinearSVC)MinimalClassifierassert_allcloseassert_array_almost_equalassert_array_equalskip_if_32bitc                       e Zd Zd Zy)NaNTagc                 
    ddiS N	allow_nanT selfs    Olib/python3.12/site-packages/sklearn/feature_selection/tests/test_from_model.py
_more_tagszNaNTag._more_tags&       T""    N__name__
__module____qualname__r'   r#   r)   r&   r   r   %       #r)   r   c                       e Zd Zd Zy)NoNaNTagc                 
    ddiS )Nr"   Fr#   r$   s    r&   r'   zNoNaNTag._more_tags+   s    U##r)   Nr*   r#   r)   r&   r0   r0   *   s    $r)   r0   c                       e Zd Zd Zy)NaNTagRandomForestc                 
    ddiS r!   r#   r$   s    r&   r'   zNaNTagRandomForest._more_tags0   r(   r)   Nr*   r#   r)   r&   r3   r3   /   r.   r)   r3   c                     t        dddd d       } dD ]`  }t        | |      }|j                  t        t               t        j                  t              5  |j                  t               d d d        b y # 1 sw Y   mxY w)N皙?
   Talphamax_itershufflerandom_statetol)gobbledigookz.5 * gobbledigook	threshold)	r   r   fitdataypytestraises
ValueError	transform)clfr@   models      r&   test_invalid_inputrJ   9   st    
B4TC ; "	y9		$]]:& 	"OOD!	" 	""	" 	"s   A77B 	c                      t               } t        |       }|j                  t        t               |j
                  | u sJ y )N	estimator)r   r   rA   rB   rC   rM   esttransformers     r&   test_input_estimator_unchangedrQ   D   s6    
 
"C!C0KOOD!  C'''r)   zmax_features, err_type, err_msg   zmax_features ==c                      y)Ng      ?r#   Xs    r&   <lambda>rV   U       r)   z3max_features must be an instance of int, not float.c                 .    t         j                  d   dz   S NrR   )rB   shaperT   s    r&   rV   rV   Z   s    djjma' r)   c                      y)Nr#   rT   s    r&   rV   rV   _   rW   r)   c                    t        j                  |      }t        dd      }t        || t        j
                         }t        j                  ||      5  |j                  t        t               d d d        y # 1 sw Y   y xY w)N   r   n_estimatorsr<   rM   max_featuresr@   match)reescaper   r   npinfrD   rE   rA   rB   rC   )rb   err_typeerr_msgrH   rP   s        r&   test_max_features_errorrk   L   sh    4 ii G
 aa
@C!LRVVGK 
xw	/ !a ! ! !s   A;;Brb      c                 V   t        dd      }t        || t        j                         }|j	                  t
        t              }| 0|j                  | k(  sJ |j                  d   |j                  k(  sJ yt        |d      rJ |j                  d   t
        j                  d   k(  sJ y)z>Check max_features_ and output shape for integer max_features.r^   r   r_   ra   NrR   max_features_)
r   r   rg   rh   fit_transformrB   rC   rn   rZ   hasattrrb   rH   rP   X_transs       r&   "test_inferred_max_features_integerrs   p   s     !aa
@C!LRVVGK ''a0G((L888}}Q;#<#<<<<;888}}Q4::a=000r)   c                      yrY   r#   rT   s    r&   rV   rV      rW   r)   c                      | j                   d   S rY   rZ   rT   s    r&   rV   rV      s    AGGAJ r)   c                 4    t        | j                  d   d      S NrR   i'  minrZ   rT   s    r&   rV   rV      s    #aggaj%2H r)   c                     t        dd      }t        || t        j                         }|j	                  t
        t              }|j                   | t
              k(  sJ |j                  d   |j                  k(  sJ y)z?Check max_features_ and output shape for callable max_features.r^   r   r_   ra   rR   N)	r   r   rg   rh   ro   rB   rC   rn   rZ   rq   s       r&   #test_inferred_max_features_callabler|      sq     !aa
@C!LRVVGK ''a0G$$T(::::=={88888r)   c                 6    t        t        | d         dz        S )Nr   rl   )roundlenrT   s    r&   rV   rV      s    E#ad)a-4H r)   c                     g dg dg dg dg}g d}t        dd      }t        || t        j                   	      }|j	                  ||      }|j
                  d
   |j                  k(  sJ y )N)gףp=
?q=
ףpgףp=
?)gRQg{Gzg333333)r   gQ޿gffffff)gQ?gGz?g?)r   rR   r   rR   r^   r   r_   ra   rR   )r   r   rg   rh   ro   rZ   rn   )rb   rU   rC   rH   rP   rr   s         r&   test_max_features_array_liker      sr     			A 	A
 aa
@C!LRVVGK ''1-G=={88888r)   c                 4    t        | j                  d   d      S rx   ry   rT   s    r&   rV   rV      s    s1771:u% r)   c                      | j                   d   S rY   rv   rT   s    r&   rV   rV      s     r)   c                      yrY   r#   rT   s    r&   rV   rV      rW   r)   c                     t        dd      }t        |       }t        ||t        j                         }|j                  t        t               |j                  t               y)z7Tests that the callable passed to `fit` is called on X.2   r   r_   )side_effectra   N)	r   r   r   rg   rh   ro   rB   rC   assert_called_with)rb   rH   mrP   s       r&   test_max_features_callable_datar      sL     !bq
AC&A!CaBFF7SKdA&r)   c                       e Zd Zd ZddZy)FixedImportanceEstimatorc                     || _         y N)importances)r%   r   s     r&   __init__z!FixedImportanceEstimator.__init__   s
    &r)   Nc                 L    t        j                  | j                        | _        y r   )rg   arrayr   feature_importances_)r%   rU   rC   s      r&   rA   zFixedImportanceEstimator.fit   s    $&HHT-=-=$>!r)   r   )r+   r,   r-   r   rA   r#   r)   r&   r   r      s    '?r)   r   c            	          t        j                  ddddddd      \  } }| j                  d   }t        dd	      }t	        |t
        j                   
      }t	        ||t
        j                         }|j                  | |      }|j                  | |      }t        ||       t	        t        dd            }|j                  | |      }t        j                  |j                  j                        }t        j                  | d      }	t        d|j                  d   dz         D ]  }
t	        t        dd      |
t
        j                         }|j                  | |      }t        j                  |j                  j                        }t        j                  | d      }t        | d d |	d |
 f   | d d |d |
 f           t        |j                  j                  |j                  j                         y )N  r7      r   F	n_samples
n_featuresn_informativen_redundant
n_repeatedr;   r<   rR   r   r_   rM   r@   ra   g?*   r9   r<   rL   	mergesort)kind)r   make_classificationrZ   r   r   rg   rh   ro   r   r   abs
estimator_coef_argsortrange)rU   rC   rb   rO   transformer1transformer2X_new1X_new2scores1candidate_indices1r   scores2candidate_indices2s                r&   test_max_featuresr      s   ''DAq 771:L
 bq
AC"SRVVGDL"LRVVGL ''1-F''1-FFF# #UR-PQL''1-Fff\,,223GWH;?Av||A23 

&%b9#vvg

 ++Aq1&&00667ZZ{Ca#KZ0011Q8J;J8W5W3X	

 L++11<3J3J3P3PQr)   c            	         t        j                  ddddddd      \  } }| j                  d   }t        j                  g d      }t        d|dz         D ]  }t        t        |      |t        j                   	      }|j                  | |      }t        j                  |j                               d   }t        |t        j                  |             |j                  d   |k(  rJ  y )
Nr   r7   r   r   Fr   rR   )
   r   r   r   r   r   r   rl   rl   rR   )rb   r@   )r   r   rZ   rg   r   r   r   r   rh   ro   where_get_support_maskr   arange)rU   rC   rb   feature_importancesr   rP   X_newselected_feature_indicess           r&   test_max_features_tiebreakr      s    ''DAq 771:L((#ABA|a/0 	,
%$%89#vvg

 ))!Q/#%88K,I,I,K#LQ#O 3RYYz5JK{{1~+++	,r)   c            	      `   t        j                  ddddddd      \  } }t        dd      }t        |dt        j
                   	      }|j                  | |      }t        |d
      }|j                  | |      }t        |dd
	      }|j                  | |      }|j                  d   t        |j                  d   |j                  d         k(  sJ |j                  t	        j                  | j                  d         t        j                  d d f         }	t        || d d |	d   f          y )Nr   r7   r   r   Fr   r   r_   ra   g{Gz?r   rR   )r   r   r   r   rg   rh   ro   rZ   rz   rG   r   newaxisr   )
rU   rC   rO   r   r   r   r   transformer3X_new3selected_indicess
             r&   test_threshold_and_max_featuresr      s   ''DAq !bq
AC"SqRVVGTL''1-F"SDAL''1-F"SqDQL''1-F<<?c&,,q/6<<?CCCC#--bii
.CBJJPQM.RSFAa!1!!4456r)   c            	      $   t        j                  ddddddd      \  } }t        dd      }t        d	d
gt        j
                  t        j                  g      D ]  \  }}t        ||      }|j                  | |       t        |j                  d      sJ |j                  |       }|j                  d   | j                  d   k  sJ |j                  j                  }t	        j                  |       ||      kD  }t        || d d |f           y )Nr   r7   r   r   Fr   r   r_   meanmedianr   r   rR   )r   r   r   ziprg   r   r   r   rA   rp   r   rG   rZ   r   r   r   )	rU   rC   rO   r@   funcrP   r   r   feature_masks	            r&   test_feature_importancesr     s    ''DAq !bq
AC1BGGRYY3GH 
=	4%yI1{--/EFFF%%a({{1~
***!,,AAvvk*T+->>!%1l?);<
=r)   c            	         t        j                  ddddddd      \  } }t        j                  |j                        }||dk(  xx   dz  cc<   t        dd      }t        |	      }|j                  | |d 
       |j                         }|j                  | ||
       |j                         }t        j                  ||k(        rJ |j                  | |d|z  
       |j                         }t        j                  ||k(        sJ y )Nd   r7   r   r   Fr   rR   )r<   fit_interceptrL   )sample_weight)
r   r   rg   onesrZ   r   r   rA   r   all)rU   rC   r   rO   rP   maskweighted_maskreweighted_masks           r&   test_sample_weightr   .  s    ''DAq GGAGG$M!q&S 
!5
AC!C0KOOAqO-((*DOOAqO6113Mvvmt+,,,OOAqM(9O:!335O66-?2333r)   rM   r6   r   r   r<   )l1_ratior<   c           	         t        j                  ddddddd      \  }}t        |       }|j                  ||       |j	                  |      }t        j                  |j                  j                        dkD  }t        ||d d |f          y )	Nr   r7   r   r   Fr   rL   gh㈵>)
r   r   r   rA   rG   rg   r   r   r   r   )rM   rU   rC   rP   r   r   s         r&   test_coef_default_thresholdr   J  s     ''DAq "I6KOOAq!!!$E66+((../$6DeQq$wZ0r)   c            
         t        j                  dddddddd      \  } }t               }t        dd	gt        j
                  t        j                  g      D ]  \  }}d
dt        j                  fD ]  }t        t               ||      }|j                  | |       t        |j                  d      sJ |j                  |       }|j                  d
   | j                  d
   k  sJ |j                  | |       t        j                  j                  |j                   d|      }| ||      kD  }	t#        || d d |	f            y )Nr   r7   r   r   Fr   )r   r   r   r   r   r;   r<   	n_classesr   r   rR   rl   )rM   r@   
norm_orderr   )axisord)r   r   r   r   rg   r   r   rh   r   rA   rp   r   rG   rZ   linalgnormr   r   )
rU   rC   rO   r@   r   orderrP   r   r   r   s
             r&   test_2d_coefr   f  s7   ''	DAq 
C1BGGRYY3GH A	4BFF^ 	AE),.)PUK OOAq!;117;;;))!,E;;q>AGGAJ... GGAqM))...FK&k)::L%eQq,-?@	AAr)   c                     t        dddd       } t        |       }|j                  t        t        t        j                  t                     |j                  }|j                  t        t        t        j                  t                     |j                  }||u sJ |j                  t              }|j                  t        j                  t        t        f      t        j                  t        t        f             t        ||j                  t                     t        t                     }t        |d      rJ y )Nr   Fr^   )r<   r;   r:   r=   rL   classespartial_fit)r   r   r   rB   rC   rg   uniquer   rG   rA   vstackconcatenater   r   rp   )rO   rP   	old_model	new_modelX_transforms        r&   test_partial_fitr     s    
%tC "C0KD!RYYq\:&&ID!RYYq\:&&I	!!!''-KOOBIItTl+R^^QF-CDk;+@+@+FG ",B,DEK{M2222r)   c                      t        dd      } t        |       }|j                  t        t               |j                  d       |j                  t        t               |j                  j                  dk(  sJ y )Nautor   )dualr<   rL   r   )estimator__C)r   r   rA   rB   rC   
set_paramsr   CrN   s     r&   test_calling_fit_reinitializesr     s_    
a
0C!C0KOOD!,OOD!!!##s***r)   c                  p   t        ddddd       } t        |       }|j                  t        t               |j                  t              }| j                  t        t               t        | d      }t        |j                  t              |       |j                  t        t               |j                  | usJ t        | d      }|j                  t        t               t        |j                  t              |       t        ddddd       } t        | d      }d}t        j                  t        |	      5  |j                  t        t               d d d        t        j                  t        |	      5  |j                  t        t               d d d        t        j                  t        |	      5  |j                  t               d d d        t        dddd 
      j                  t        t              } t        | d      }|j                  t        t               t        |j                  j                  | j                         |j                  t        t               t        |j                  j                  | j                         y # 1 sw Y   >xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr6   r7   Tr   r8   )prefitFzEWhen `prefit=True`, `estimator` is expected to be a fitted estimator.rc   )r9   r:   r;   r=   )r   r   rA   rB   rC   rG   r   r   rD   rE   r   r   r   r   )rH   rI   r   rj   s       r&   test_prefitr     s   
 cB1RV
WCC E	IIdA//$'KGGD!C-Eeood3[A	IIdA3&&& C.E	IIdAeood3[A cB1RV
WCC-EUG	~W	5 		$	~W	5 #$"#	~W	5 
 cB$
G
K
KDRS
TCC-E	IIdAE$$**CII6	dAE$$**CII6 # # s$   ;J9J7J,JJ),J5c                     t        dd      } | j                  t        t               t	        | dd       }d}t        j                  t        |      5  |j                  t               d	d	d	       d
}|j                  |       t        j                  t        d      5  |j                  t               d	d	d	       y	# 1 sw Y   WxY w# 1 sw Y   y	xY w)z:Check the interaction between `prefit` and `max_features`.r^   r   r_   Tc                      | j                   d   S rY   rv   rT   s    r&   rV   z*test_prefit_max_features.<locals>.<lambda>  s    177ST: r)   r   rb   z[When `prefit=True` and `max_features` is a callable, call `fit` before calling `transform`.rc   Ng      @)rb   z!`max_features` must be an integer)r   rA   rB   rC   r   rD   rE   r   rG   r   rF   )rM   rI   rj   rb   s       r&   test_prefit_max_featuresr     s     'AAFIMM$IdAUVE	&  
~W	5  L	,/	z)L	M    s   C !C C	Cc                     t        dd      } | j                  t        t               t	        | dd      }t        |      j                  }d| d}t        j                  t        |	      5  |j                          d
d
d
       |j                  t        t               |j                         }|dgk(  sJ y
# 1 sw Y   <xY w)z;Check the interaction between prefit and the feature names.rl   r   r_   TrR   r   zThis z_ instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.rc   Nx3)r   rA   rB   rC   r   typer+   rD   rE   r   get_feature_names_out)rH   rI   namerj   feature_namess        r&   !test_prefit_get_feature_names_outr     s    
 aa
@CGGD!C1=E;D
v = 	=  
~W	5 &##%& 
IIdA//1MTF"""& &s   ,B88Cc                  Z   t        dd      } t        | d      }|j                  t        t               |j                  t              }| j                  t        t               dt        j                  | j                        z  }| j                  |kD  }t        |t        d d |f          y )Nr   r   r_   z0.5*meanr?         ?)
r   r   rA   rB   rC   rG   rg   r   r   r   )rO   rI   r   r@   r   s        r&   test_threshold_stringr    s    
 bq
ACC:6E	IIdA//$'K GGD!bggc6677I##i/Dk44=9r)   c                     t        ddddd       } t        | d      }|j                  t        t               |j                  t              }d|_        |j                  d	   |j                  t              j                  d	   kD  sJ y )
Nr6   r7   Tr   r8   z
0.1 * meanr?   z
1.0 * meanrR   )r   r   rA   rB   rC   rG   r@   rZ   )rH   rI   r   s      r&    test_threshold_without_refittingr    ss    
cB1RV
WCC<8E	IIdA//$'K #EOQ%//$"7"="=a"@@@@r)   c                      t        d      } t        |       }t        j                         }t        j
                  |d<   t        j                  |d<   |j                  t        t               y )Nr   r   rL   rR   )	r   r   rB   copyrg   nanrh   rA   rC   )rH   rI   nan_datas      r&   test_fit_accepts_nan_infr    sI    
(a
8Cc*Eyy{H&&HQK&&HQK	IIdAr)   c                      t        dd      } t        j                         }t        |       }|j	                  |t
               t        j                  |d<   t        j                  |d<   |j                  |       y )Nr   r   r_   rL   rR   )
r3   rB   r  r   rA   rC   rg   r  rh   rG   )rH   r  rI   s      r&   test_transform_accepts_nan_infr
     sW    
#A
>Cyy{Hc*E	IIh&&HQK&&HQK	OOHr)   c                      t               } t        |       }|j                         d   du sJ t               }t        |      }|j                         d   du sJ y )NrL   r"   TF)r   r   	_get_tagsr0   )allow_nan_estrI   
no_nan_ests      r&   'test_allow_nan_tag_comes_from_estimatorr  .  sX    HMm4E??[)T111Jj1E??[)U222r)   c                 @    t        j                  | j                        S r   )rg   r   explained_variance_)pca_estimators    r&   _pca_importancesr  8  s    66-3344r)   zestimator, importance_getterz$named_steps.logisticregression.coef_c                     t        | d|      }|j                  t        t               |j	                  t              j
                  d   dk(  sJ y )Nr   )r@   importance_getterrR   )r   rA   rB   rC   rG   rZ   )rM   r  selectors      r&   test_importance_getterr  <  sJ     V7HH LLqd#))!,111r)   PLSEstimatorc                     t        ddd      \  }} | d      }t        t        |      |      j                  ||      }|j	                  ||      dkD  sJ y)	zCheck the behaviour of SelectFromModel with PLS estimators.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/12410
    r   r7   r   r   r   r<   rR   )n_componentsr   N)r	   r   r   rA   score)r  rU   rC   rM   rI   s        r&   test_select_from_model_plsr  N  sW     B2AFDAq!,I/)4i@DDQJE;;q!s"""r)   c                  $   t        j                  d       t        j                  dd      \  } t	        j
                        }fd}t        t               |      j                  |       }t        |j                  j
                         t	        |j                               }||k  sJ t        j                         5  t        j                  dt               |j!                  j"                  dd        d	d	d	       y	# 1 sw Y   y	xY w)
zvSelectFromModel works with estimators that do not support feature_names_in_.

    Non-regression test for #21949.
    pandasTas_frame
return_X_yc                 H    t        j                  j                  d         S rY   )rg   r   rZ   )rM   rU   s    r&   r  zHtest_estimator_does_not_support_feature_names.<locals>.importance_getterd  s    yy$$r)   )r  errorrR   r   N)rD   importorskipr   	load_irissetcolumnsr   r   rA   r   feature_names_in_r   warningscatch_warningssimplefilterUserWarningrG   iloc)rC   all_feature_namesr  r  feature_names_outrU   s        @r&   -test_estimator_does_not_support_feature_namesr1  [  s    
 !t=DAqAII% /@	c!Qi 
 x11199=H::<=0000		 	 	" (g{3166!A;'( ( (s   9DDzerror, err_msg, max_featuresz max_features == 10, must be <= 4r7   zmax_features == 5, must be <= 4c                 &    | j                   d   dz   S rY   rv   )xs    r&   rV   rV   {  s    !''!*q. r)   c                     t        j                  ddd      \  }}t        j                  | |      5  t	        t               |      j                  ||ddg       d	d	d	       y	# 1 sw Y   y	xY w)
zDTest that partial_fit from SelectFromModel validates `max_features`.r   r   r   r  rc   rM   rb   rR   r   N)r   r   rD   rE   r   r   r   )r$  rj   rb   rU   rC   s        r&   &test_partial_fit_validate_max_featuresr6  w  si     ''DAq 
uG	, ,#oL	

+aQF+
+, , ,s   *A&&A/r!  TFc                    t        j                  d       t        j                  | d      \  }}t	        t               d      j                  ||g d      }| r!t        |j                  |j                         y	t        |d      rJ y	)
zITest that partial_fit from SelectFromModel validates `feature_names_in_`.r  Tr   r   r5  )r   rR   rl   r   r)  N)rD   r%  r   r&  r   r   r   r   r)  r(  rp   )r!  rU   rC   r  s       r&   'test_partial_fit_validate_feature_namesr8    s{     !xDADAqqIUU	1i V H 855qyyA8%89999r)   c                     t        t                     } d}d}t        j                  t        |      5 }| j                  t        t              j                  t               ddd       t        j                  j                  t              sJ |t        |j                  j                        v sJ y# 1 sw Y   SxY w)zCheck that we raise the proper AttributeError when the estimator
    does not implement the `partial_fit` method, which is decorated with
    `available_if`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28108
    rL   z5This 'SelectFromModel' has no attribute 'partial_fit'z8'LinearRegression' object has no attribute 'partial_fit'rc   N)r   r   rD   rE   AttributeErrorrA   rB   rC   r   
isinstancevalue	__cause__str)
from_model	outer_msg	inner_msg	exec_infos       r&   )test_from_model_estimator_attribute_errorrC    s     !+;+=>JGIJI	~Y	7 29tQ++D12ioo//@@@IOO5566662 2s   .B44B=)]re   r*  unittest.mockr   numpyrg   rD   sklearnr   sklearn.baser   sklearn.cross_decompositionr   r   r   sklearn.datasetsr	   sklearn.decompositionr
   sklearn.ensembler   r   sklearn.exceptionsr   sklearn.feature_selectionr   sklearn.linear_modelr   r   r   r   r   r   r   r   sklearn.pipeliner   sklearn.svmr   sklearn.utils._testingr   r   r   r   r   r   r0   r3   r&  irisrB   targetrC   randomRandomStaterngrJ   rQ   markparametrizerZ   rF   	TypeErrorrk   rs   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r  r  r1  r6  r8  rC  r#   r)   r&   <module>rZ     s   	      & H H + % S - 5	 	 	 + ! #] #
$} $
#/ #
 x
))T[[aiiA"( % JJqMA	
 A	
 (	
 	
!2!32! !Q

1t)DE1 F1 &(HI9	9 *H!)LM9 N9" %';[I	?} ?(RV,472 = =248 Cb)R AB/qc3	11& A A>3(+(7V2#&
:	A
35 " #1-/A/CD2	
 
!	./	2	2 #|])KL	# M	#(8 "	7<	68PQ,, dE]3: 4:7r)   