
    h$,ft                        d 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mZ ddlmZmZmZmZmZmZ ddlmZmZ dd	lmZmZmZmZ dd
lmZm Z  ddl!m"Z"m#Z#m$Z$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/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=  e       Z>e>j~                  e>j                  cZAZB e       ZCeCj~                  eCj                  cZDZE edd      \  ZFZG edd      \  ZHZIej                  j                  dd e(ddd      g      ej                  j                  dd ed      g      ej                  j                  dddg      d                      ZLd  ZMd! ZNd" ZOej                  j                  dd e'ddd      g      ej                  j                  d#di f ed      i f e       d$difg      ej                  j                  dddg      d%                      ZPej                  j                  d&e;e<z   e=z         d'        ZQej                  j                  d&e;e<z   e=z         d(        ZRd) ZS G d* d+ee      ZT G d, d-ee      ZUej                  j                  d.eEd/g ieVd0feEd1 e#       fd2 e1d34      fgd5d6eVd7feEd/d1 e#       fd8 eU       fgieWd9feEd1 e#       fd8 e2d:d3;      fg eU       d<eWd9fg      d=        ZXej                  j                  d.eBd/g ieVd0feBd/d1 e"       fd8 eT       fgieWd9feBd1 e"       fd8 e3d:>      fg eT       d<eWd9fg      d?        ZYej                  j                  d@ ed1 e#d      fd2 e2d:dA      fgB      eDddC eEddC f ed1 e"       fd2 e3d:dA      fgB      eAeBfgdDdEgF      dG        ZZdH Z[ej                  j                  dI ed1 e#       fd2 e2d:dA      fg e#        e'ddJ      K      g edL       ed1 e"       fd2 e3d:dA      fg e"        e'ddJ      K      eAeBfgdDdEgF      dM        Z\dN Z]ej                  j                  dO      ej                  j                  dI ed1 e#       fd2 e2d:dA      fg e#       <      g edL       ed1 e"       fd2 e3d:dA      fg e"       <      eAeBfgdDdEgF      dP               Z_ej                  j                  dQeed5 e#d      eDeEfeedR e"       eAeBfg      dS        Z`ej                  j                  dI ed1 e#       fd2 e1       fgdTU      eDeEf ed1 e"       fd2 e3d:>      fgdTU      eAeBfg      dV        Zaej                  j                  dWeee#feee"fg      dX        Zbej                  j                  dY e-d       ed      gdZd[gF      d\        Zcd] Zdej                  j                  d^d:dRg      ej                  j                  dddg      d_               Zeej                  j                  d` ed1 e#d      fd2 e2d:dA      fgB      eCj                  eDeEg daf ed1 e#d      fdbd2 e2d:dA      fgB      eCj                  eDddC eEddC dcddgf ed1 e"       fd2 e3d:dA      fgB      e>j                  eAeBdedfgfgg dgF      ej                  j                  dddg      dh               Zgdi Zhdj Ziy)kz+Test the stacking classifier and regressor.    )MockN)assert_array_equal)sparse)BaseEstimatorClassifierMixinRegressorMixinclone)load_breast_cancerload_diabetes	load_irismake_classificationmake_multilabel_classificationmake_regression)DummyClassifierDummyRegressor)RandomForestClassifierRandomForestRegressorStackingClassifierStackingRegressor)ConvergenceWarningNotFittedError)LinearRegressionLogisticRegressionRidgeRidgeClassifier)KFoldStratifiedKFoldtrain_test_split)KNeighborsClassifier)MLPClassifier)scale)SVC	LinearSVC	LinearSVR)CheckingClassifier)assert_allcloseassert_allclose_dense_sparseignore_warnings)COO_CONTAINERSCSC_CONTAINERSCSR_CONTAINERS   *   )	n_classesrandom_state   cvT)n_splitsshuffler/   final_estimatorr/   passthroughFc                    t        t        t              t        t        d      \  }}}}dt	               fdt        d      fg}t        ||| |      }|j                  ||       |j                  |       |j                  |       |j                  ||      dkD  sJ |j                  |      }	|rd	nd
}
|	j                  d   |
k(  sJ |rt        ||	d d dd f          |j                  d       |j                  ||       |j                  |       |j                  |       ||j                  |       |j                  |      }	|rdnd}|	j                  d   |k(  sJ |rt        ||	d d dd f          y y )Nr-   stratifyr/   lrsvcautodual
estimatorsr4   r1   r6   皙?
         dropr:      r,   )r   r!   X_irisy_irisr   r#   r   fitpredictpredict_probascore	transformshaper&   
set_paramsdecision_function)r1   r4   r6   X_trainX_testy_trainy_testr@   clfX_transexpected_column_countexpected_column_count_drops               Dlib/python3.12/site-packages/sklearn/ensemble/tests/test_stacking.pytest_stacking_classifier_irisr\   ;   sy    (8fvR($GVWf +-.	v8N0OPJ
'	C GGGWKKf99VV$s***mmF#G"-B1==4444230NNfNGGGWKKff%mmF#G&1q==9999230     c                     t        d      \  } }t        t        |       ||d      \  }}}}dt               fdt	        d      fg}t        |d	      }|j                  ||       |j                  |      }|j                  d
   dk(  sJ dt               fdt        d      fg}|j                  |       |j                  ||       |j                  |      }|j                  d
   dk(  sJ y )NT
return_X_yr-   r8   r:   rfr5   r,   r@   r1   rD   r0   r;   r<   r=   r@   )r
   r   r!   r   r   r   rK   rO   rP   r#   rQ   )	XyrS   rT   rU   _r@   rW   rX   s	            r[   :test_stacking_classifier_drop_column_binary_classificationrg   i   s    .DAq"2a!ab#GVWa 
!#$	%267J 
q
9CGGGWmmF#G==q    +-.	v8N0OPJNNjN)GGGWmmF#G==q   r]   c                  *   t        t        t              t        t        d      \  } }}}ddt	        dd      fg}t        dd	      }t        dt	        dd      fg|d
      }t        ||d
      }|j                  | |       |j                  | |       t        |j                  |      |j                  |             t        |j                  |      |j                  |             t        |j                  |      |j                  |             y )Nr-   r8   r:   rF   r;   r<   r   r>   r/   rB   n_estimatorsr/      r@   r4   r1   )r   r!   rI   rJ   r#   r   r   rK   r&   rL   rM   rO   )rS   rT   rU   rf   r@   ra   rW   clf_drops           r[   'test_stacking_classifier_drop_estimatorrp      s     #3fvR#GVWa !5)a*P"QRJ	Rb	AB
I6BCDC
 "ZPQRHGGGWLL'"CKK')9)9&)ABC%%f-x/E/Ef/MNCMM&)8+=+=f+EFr]   c                     t        t        t              t        d      \  } }}}ddt	        dd      fg}t        dd	      }t        dt	        dd      fg|d
      }t        ||d
      }|j                  | |       |j                  | |       t        |j                  |      |j                  |             t        |j                  |      |j                  |             y )Nr-   r5   ri   svrr<   r   rj   rB   rk   rm   rn   )r   r!   
X_diabetes
y_diabetesr$   r   r   rK   r&   rL   rO   )rS   rT   rU   rf   r@   ra   regreg_drops           r[   &test_stacking_regressor_drop_estimatorrw      s     #3j:B#GVWa !5)a*P"QRJ	BR	@B
I6BCDC
 !JqQHGGGWLL'"CKK')9)9&)ABCMM&)8+=+=f+EFr]   zfinal_estimator, predict_params
return_stdc                    t        t        t              t        d      \  }}}}dt	               fdt        d      fg}t        ||| |      }	|	j                  ||        |	j                  |fi |}
|rdnd	}|rt        |
      |k(  sJ |	j                  |      }|rd
nd}|j                  d	   |k(  sJ |rt        ||d d dd f          |	j                  d       |	j                  ||       |	j                  |       |	j                  |      }|rdnd	}|j                  d	   |k(  sJ |rt        ||d d dd f          y y )Nr-   r5   r:   rr   r<   r=   r?   r0   rD      rF   rG      )r   r!   rs   rt   r   r$   r   rK   rL   lenrO   rP   r&   rQ   )r1   r4   predict_paramsr6   rS   rT   rU   rf   r@   ru   resultexpected_result_lengthrX   rY   rZ   s                  r[    test_stacking_regressor_diabetesr      sZ    #3j:B#GVWa )+,uiV6L.MNJ
'	C GGGWS[[2>2F"0Qa6{4444mmF#G"-B1==444434 01NNfNGGGWKKmmF#G'2==999934 01 r]   sparse_containerc                    t         | t        t                    t        d      \  }}}}dt	               fdt        d      fg}t        dd      }t        ||d	d
      }|j                  ||       |j                  |      }t        ||d d dd f          t        j                  |      sJ |j                  |j                  k(  sJ y )Nr-   r5   r:   rr   r<   r=   rB   rk   rm   Tr?   r{   )r   r!   rs   rt   r   r$   r   r   rK   rO   r'   r   issparseformat	r   rS   rT   rU   rf   r@   ra   rW   rX   s	            r[   *test_stacking_regressor_sparse_passthroughr      s    
 #3z*+Zb#GVWa )+,uiV6L.MNJ	BR	@B
raTC GGGWmmF#G CD)9:??7###==GNN***r]   c                    t         | t        t                    t        d      \  }}}}dt	               fdt        d      fg}t        dd      }t        ||d	d
      }|j                  ||       |j                  |      }t        ||d d dd f          t        j                  |      sJ |j                  |j                  k(  sJ y )Nr-   r5   r:   r;   r<   r=   rB   rk   rm   Tr?   rE   )r   r!   rI   rJ   r   r#   r   r   rK   rO   r'   r   r   r   r   s	            r[   +test_stacking_classifier_sparse_passthroughr      s    
 #3v'b#GVWa +-.	v8N0OPJ	Rb	AB
raTC GGGWmmF#G BC9??7###==GNN***r]   c                      t        t        d d       t        d d }} dt               fdt	               fg}t        |      }|j                  | |       |j                  |       }|j                  d   dk(  sJ y )Nd   r:   ra   rc   rD   r0   )	r!   rI   rJ   r   r   r   rK   rO   rP   )X_y_r@   rW   X_metas        r[   )test_stacking_classifier_drop_binary_probr     su    
 6$3< &#,B+-.7M7O0PQJ


3CGGBO]]2F<<?ar]   c                       e Zd Zd Zd Zy)NoWeightRegressorc                 X    t               | _        | j                  j                  ||      S N)r   ru   rK   selfrd   re   s      r[   rK   zNoWeightRegressor.fit  s!    !#xx||Aq!!r]   c                 F    t        j                  |j                  d         S )Nr   )nponesrP   )r   rd   s     r[   rL   zNoWeightRegressor.predict  s    wwqwwqz""r]   N)__name__
__module____qualname__rK   rL    r]   r[   r   r     s    "#r]   r   c                       e Zd Zd Zy)NoWeightClassifierc                 \    t        d      | _        | j                  j                  ||      S )N
stratified)strategy)r   rW   rK   r   s      r[   rK   zNoWeightClassifier.fit  s#    "L9xx||Aq!!r]   N)r   r   r   rK   r   r]   r[   r   r     s    "r]   r   zy, params, type_err, msg_errr@   zInvalid 'estimators' attribute,r:   svmiP  max_iterrM   )r@   stack_methodz+does not implement the method predict_probacorzdoes not support sample weightr<   r>   r   r@   r4   c           	         t        j                  ||      5  t        di |ddi}|j                  t	        t
              | t        j                  t
        j                  d                d d d        y # 1 sw Y   y xY wNmatchr1   r,   r   sample_weightr   )	pytestraisesr   rK   r!   rI   r   r   rP   )re   paramstype_errmsg_errrW   s        r[   test_stacking_classifier_errorr   "  se    T 
xw	/ J 060a0fqQ0HIJ J J   AA66A?r=   c           	         t        j                  ||      5  t        di |ddi}|j                  t	        t
              | t        j                  t
        j                  d                d d d        y # 1 sw Y   y xY wr   )	r   r   r   rK   r!   rs   r   r   rP   )re   r   r   r   ru   s        r[   test_stacking_regressor_errorr   Q  sh    2 
xw	/ R/&/Q/j!1BGGJ<L<LQ<O4PQR R Rr   zestimator, X, yrj   rc   r   r   r   )idsc                    t        |       }|j                  t        dt        j                  j                  d                   t        |       }|j                  d       |j                  t        dt        j                  j                  d                   t        |j                  ||      j                  |      d d dd f   |j                  ||      j                  |             y )NTr   r3   r/   r1   rF   rG   rD   )	r	   rQ   r   r   randomRandomStater&   rK   rO   )	estimatorrd   re   estimator_fullestimator_drops        r[   test_stacking_randomnessr   o  s    : 9%NBII,A,A!,DE   9%N(BII,A,A!,DE   1a **1-ae41a **1-r]   c                      t        dt        d      fdt        dd      fg      } | j                  t        t
               y )Nr:   i'  r   r   r<   r   rc   )r   r   r#   rK   rI   rJ   )rW   s    r[   )test_stacking_classifier_stratify_defaultr     s>    
%v67I6F;<
C GGFFr]   zstacker, X, yr   rn   r_   c                    t        |      dz  }t        j                  dg|z  dgt        |      |z
  z  z         }t        |||d      \  }}}}}	}t	        t
              5  | j                  ||       d d d        | j                  |      }
t	        t
              5  | j                  ||t        j                  |j                               d d d        | j                  |      }t        |
|       t	        t
              5  | j                  |||	       d d d        | j                  |      }t        j                  |
|z
        j                         dkD  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ^xY w)	Nr0   g?g?r-   r5   )categoryr   r   )r}   r   arrayr   r(   r   rK   rL   r   rP   r&   abssum)stackerrd   re   n_half_samplestotal_sample_weightrS   rT   rU   rf   sample_weight_trainy_pred_no_weighty_pred_unit_weighty_pred_biaseds                r[    test_stacking_with_sample_weightr     sg   B Vq[N((	##a&>*A!BB ;K	1!;7GVWa!4a 
"4	5 &GW%&v.	"4	5 LGWBGGGMM4JKL 0$&89	"4	5 IGW4GHIOOF+M66"]23779A===& &L LI Is$   !E2E*E6E'*E36E?c                      t        dt        d      fgt        d            } | j                  t        t        t        j                  t        j                  d                y )Nr:   T)expected_sample_weightr   r   r   )r   r%   rK   rI   rJ   r   r   rP   )r   s    r[   0test_stacking_classifier_sample_weight_fit_paramr     sJ     -TJKL*$GG KKbggfll1o.FKGr]   z-ignore::sklearn.exceptions.ConvergenceWarningc                    t        |       }t        |       }|j                  d       |j                  d       |j                  ||       |j                  ||       t        |j                  |j                        D ]%  \  }}t        |j                  |j                         ' t        j                  t        d      5  t        |j                  j                  |j                  j                         d d d        y # 1 sw Y   y xY w)Nr,   r   rm   z	Not equalr   )r	   rQ   rK   zipestimators_r&   coef_r   r   AssertionErrorfinal_estimator_)r   rd   re   stacker_cv_3stacker_cv_5est_cv_3est_cv_5s          r[   test_stacking_cv_influencer     s    B >L>Lq!q!QQ ",":":L<T<TU 8(78 
~[	9 
))//1N1N1T1T	

 
 
s   5D  D	z7Stacker, Estimator, stack_method, final_estimator, X, yrL   c                 D   t        ||dd      \  }}}}	d |       j                  ||      fd |       j                  ||      fg}
|
D ]B  \  }}t        d      |_        t        ||      }t        |      }||_        t        |||       D  | |
d	|
      }|j                  ||	       |j                  |
D cg c]  \  }}|	 c}}k(  sJ t        d |j                  D              sJ |j                  D ]  }t        ||      }|j                  |       ! yc c}}w )z2Check the behaviour of stacking when `cv='prefit'`r-   g      ?)r/   	test_sized0d1rK   )name)side_effectprefit)r@   r1   r4   c              3   N   K   | ]  }|j                   j                  d k(    yw)r   N)rK   
call_count).0r   s     r[   	<genexpr>z'test_stacking_prefit.<locals>.<genexpr>R  s     Ry}}''1,Rs   #%N)	r   rK   r   getattrr   setattrr   allassert_called_with)Stacker	Estimatorr   r4   rd   re   X_train1X_train2y_train1y_train2r@   rf   r   
stack_funcpredict_method_mockedr   stack_func_mocks                    r[   test_stacking_prefitr   "  s<   . .>	12.*Hh( 
y{x23	y{x23J # @9%(	Y5
 $ < *6&	<)>?@ (OG KK(#"LI9"LLLLRg>Q>QRRRR (( 5	!)\:**845 #Ms   ;Dr   rb   c                     t        j                  t              5  | j                  ||       d d d        y # 1 sw Y   y xY wr   )r   r   r   rK   )r   rd   re   s      r[   test_stacking_prefit_errorr   Z  s3    6 
~	& Aq  s   6?z!make_dataset, Stacking, Estimatorc                     G d d|      } | dd      \  }} |d |       fg      }|j                    d}t        j                  t        |	      5  |j                   d d d        |j                  ||       d
}t        j                  t        |	      5  |j                   d d d        y # 1 sw Y   NxY w# 1 sw Y   y xY w)Nc                   "     e Zd ZdZ fdZ xZS )8test_stacking_without_n_features_in.<locals>.MyEstimatorz Estimator without n_features_in_c                 *    t         |   ||       | `y r   )superrK   n_features_in_)r   rd   re   	__class__s      r[   rK   z<test_stacking_without_n_features_in.<locals>.MyEstimator.fit  s    GK1#r]   )r   r   r   __doc__rK   __classcell__)r   s   @r[   MyEstimatorr     s    .	$ 	$r]   r  r   r   )r/   	n_samplesr:   rc   z' object has no attribute n_features_in_r   z6'MyEstimator' object has no attribute 'n_features_in_')r   r   r   AttributeErrorr   rK   )make_datasetStackingr   r  rd   re   r   msgs           r[   #test_stacking_without_n_features_inr	  y  s    $i $ Q#6DAqD+-#8"9:GF
GC	~S	1  KK1
BC	~S	1    s   B.B:.B7:Cr   r    r   c                    t        t        t        t        d      \  }}}}d}d| fg}t        |t	               d      j                  ||      }|j                  |      }|j                  |j                  d   |fk(  sJ t        t        j                  |j                  d	      d
            rJ |j                  |      }	|	j                  |j                  k(  sJ y)zCheck the behaviour for the multilabel classification case and the
    `predict_proba` stacking method.

    Estimators are not consistent with the output arrays and we need to ensure that
    we handle all cases.
    r-   r8   r,   estrM   r@   r4   r   r   rD   )axisg      ?N)r   X_multilabely_multilabelr   r   rK   rO   rP   anyr   iscloser   rL   )
r   rS   rT   rU   rV   	n_outputsr@   r   rX   y_preds
             r[   1test_stacking_classifier_multilabel_predict_probar    s    $ (8l\($GVWf I)$%J ,.$ 
c'7	  'G==V\\!_i88882::gkkqk137888__V$F<<6<<'''r]   c                  h   t        t        t        t        d      \  } }}}d}dt               fg}t	        |t               d      j                  | |      }|j                  |      }|j                  |j                  d   |fk(  sJ |j                  |      }|j                  |j                  k(  sJ y)	zCheck the behaviour for the multilabel classification case and the
    `decision_function` stacking method. Only `RidgeClassifier` supports this
    case.
    r-   r8   r,   r  rR   r  r   N)
r   r  r  r   r   r   rK   rO   rP   rL   )	rS   rT   rU   rV   r  r@   r   rX   r  s	            r[   5test_stacking_classifier_multilabel_decision_functionr    s    
 (8l\($GVWf I/+,-J ,.( 
c'7	  'G==V\\!_i8888__V$F<<6<<'''r]   r   c                    t        t        t        t        d      \  }}}}|j                         }d}dt	        d      fdt        d      fdt               fg}t               }	t        ||	||       j                  ||      }
t        ||       |
j                  |      }|j                  |j                  k(  sJ | d	k(  rg d
}ndgt        |      z  }|
j                  |k(  sJ |t        |      z  }|r||j                  d   z  }|
j                  |      }|j                  |j                  d   |fk(  sJ t        |
j                   t#        j$                  ddg      g|z         y)zCheck the behaviour for the multilabel classification case for stack methods
    supported for all estimators or automatically picked up.
    r-   r8   r,   mlpr5   ra   ridge)r@   r4   r6   r   r<   )rM   rM   rR   rL   rD   r   N)r   r  r  copyr    r   r   r   r   rK   r   rL   rP   r}   stack_method_rO   classes_r   r   )r   r6   rS   rT   rU   rV   y_train_before_fitr  r@   r4   rW   r  expected_stack_methodsn_features_X_transrX   s                  r[   0test_stacking_classifier_multilabel_auto_predictr     so    (8l\($GVWf !I 
2./	%267	/#$J
 +,O
'!	
 
c'7  )73[[ F<<6<<'''v!X"+s:!> 6666"S_4gmmA..mmF#G==V\\!_.@AAAAs||bhh1v&6%7)%CDr]   z,stacker, feature_names, X, y, expected_names)stackingclassifier_lr0stackingclassifier_lr1stackingclassifier_lr2stackingclassifier_svm0stackingclassifier_svm1stackingclassifier_svm2)otherrF   stackingclassifier_lrstackingclassifier_svmstackingregressor_lrstackingregressor_svm)StackingClassifier_multiclassStackingClassifier_binaryr   c                     | j                  |       | j                  t        |      |       |rt        j                  ||f      }| j                  |      }t        ||       y)z/Check get_feature_names_out works for stacking.)r6   N)rQ   rK   r!   r   concatenateget_feature_names_outr   )r   feature_namesrd   re   expected_namesr6   	names_outs          r[   test_get_feature_names_outr4    sX    D ;/KKa!(GH--m<Iy.1r]   c                     t        t        t              t        t        d      \  } }}}t	        dt               fg      }|j                  | |       |j                  |       |j                  |       |j                  ||      dkD  sJ y)zNCheck that a regressor can be used as the first layer in `StackingClassifier`.r-   r8   r  rc   rA   N)
r   r!   rI   rJ   r   r   rK   rL   rM   rN   )rS   rT   rU   rV   rW   s        r[   'test_stacking_classifier_base_regressorr6  T  sy    '7fvR($GVWf '57);(<
=CGGGWKKf99VV$s***r]   c                     t        d      \  } }dt               fdt        dd      fg}t        dd      }t        ||d      }d	}d
}t	        j
                  t        |      5 }|j                  | |      j                  |        ddd       t        j                  j                  t              sJ |t        |j                  j                        v sJ y# 1 sw Y   SxY w)a
  Check that we raise the proper AttributeError when the final estimator
    does not implement the `decision_function` method, which is decorated with
    `available_if`.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/28108
    r-   r5   r:   ra   r0   rk   r,   rn   z>This 'StackingClassifier' has no attribute 'decision_function'zD'RandomForestClassifier' object has no attribute 'decision_function'r   N)r   r   r   r   r   r   r  rK   rR   
isinstancevalue	__cause__str)rd   re   r@   r4   rW   	outer_msg	inner_msg	exec_infos           r[   -test_stacking_final_estimator_attribute_errorr?  `  s     B/DAq 
!#$	%12FGJ -!"MO
1C QIVI	~Y	7 +91''*+ioo//@@@IOO556666+ +s   %"CC")jr  unittest.mockr   numpyr   r   numpy.testingr   scipyr   sklearn.baser   r   r   r	   sklearn.datasetsr
   r   r   r   r   r   sklearn.dummyr   r   sklearn.ensembler   r   r   r   sklearn.exceptionsr   r   sklearn.linear_modelr   r   r   r   sklearn.model_selectionr   r   r   sklearn.neighborsr   sklearn.neural_networkr    sklearn.preprocessingr!   sklearn.svmr"   r#   r$   sklearn.utils._mockingr%   sklearn.utils._testingr&   r'   r(   sklearn.utils.fixesr)   r*   r+   diabetesdatatargetrs   rt   irisrI   rJ   r  r  X_binaryy_binarymarkparametrizer\   rg   rp   rw   r   r   r   r   r   r   
ValueError	TypeErrorr   r   r   r   r   r   filterwarningsr   r   r   r	  r  r  r   r1  r4  r6  r?  r   r]   r[   <module>r]     s	   1
    ,  N N  :  B  M L 2 0 ' 1 1 5 
 O N?! 
J{DKK;b l )12F ( 1oq$RH
I 4"EF 6$1 7$1N!6G,G* 5!TPR#STU%	r
	B	/4		L$/0 6!2 7 V!2H 7.H++" 7.H++" # #"- " "	,#Z1RS -/0C01 !0 9	
 -/0.01 ,
	
  -/0I6FCD $6#7 ,	
3%(RJS(RJ "	lB'5VWT#3#56@Q@S8TUV,		
  +-.I623 $5#6 ,	
0R10R  -1=>I6BC 4CL4CL		
 +-.I6BC 		
, 
231  454(
  -/0I6CD !3 4B7
	
  40
	
 +-.I6CD !1 2B7 	
2 
237  :>;:>:H KL -/0I6CD !3 4		
  40		
 +-.I6CD !1 2 
	
. 
233  6
7 M8
2 = B/	
 	
* 5+* 5F  !#5#785#%.I 	
 +-.I623  
	
010 '	02DE	+-=>4  	2& 	B/ 
23  
(
(8(0 &))<=6*E 7 >*EZ 2 -1=>I6BC 	
( -1=>%I6BC 4CL4CL'(	
" +-.I6BC ""&'	
I3h	m  ;x u62 7y;z2	+7r]   