
    sg~q                     	   d dl mZ d dlZd dl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lmZmZmZmZ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 d d
l m!Z!m"Z"  G d de      Z# G d de      Z$ejJ                  jM                  d      ejJ                  jM                  d      ejJ                  jM                  d      ejJ                  jO                  deef      ejJ                  jO                  dd      d                                    Z(ejJ                  jO                  deef      ejJ                  jO                  dddddddg dg dfddddddg d g d!fdd"ddddg dg d#fdd"ddddg dg d#fg      d$               Z)ejJ                  jO                  deef      ejJ                  jO                  d%d&d'd(dd)d*gfd+d'd(dd+d,gfd&d-ddd)gfd.d'd(d(d/d0gfd.d1d(d(d/d0gfd.d0d(d(d/d0gfd.d2d(d(d3d2gfd.d4d(d(d5d6gfd.d7d(d(d8d7gfd.d*d(d(d)d*gfd.d+ddd)gfd.d)ddd)gfg      d9               Z*ejJ                  jO                  deef      ejJ                  jO                  d:g d;      d<               Z+ejJ                  jO                  deef      d=        Z,ejJ                  jO                  d>g d?      d@        Z-ejJ                  jO                  dAdBdd(gid(fdB edd      idCfg      dD        Z.ejJ                  jO                  deef      ejJ                  jO                  dEdFdGidHfdBd8dIdJfd'dKdLdMfdNdOdPdQfdR edS      idTfdR e       idTfg      dU               Z/ejJ                  jO                  dEd.d.dVdWfg      dX        Z0ejJ                  jO                  dYg dZ      d[        Z1ejJ                  jO                  d\d]      d^        Z2ejJ                  jO                  d_dd d`gfd(d dBd`gfdd g dafdCd g dafdddbgfd(ddcdbgfdCddcdbgfdd(ddgfdCd(g defg	      df        Z3ejJ                  jO                  deef      dg        Z4ejJ                  jO                  deef      dh        Z5ejJ                  jO                  deef      di        Z6ejJ                  jO                  djeeg      dk        Z7ejJ                  jO                  djeeg      dl        Z8dm Z9y)n    )ceilN)exponnormrandint)make_classification)DummyClassifier)enable_halving_search_cv)

GroupKFoldGroupShuffleSplitHalvingGridSearchCVHalvingRandomSearchCVKFoldLeaveOneGroupOutLeavePGroupsOutShuffleSplitStratifiedKFoldStratifiedShuffleSplit)_SubsampleMetaSplitter_top_k)check_cv_results_array_typescheck_cv_results_keys)SVC	LinearSVCc            	           e Zd ZU dZi ej
                   e ed       ed      dz         D  ci c]  }t        |      d c}}} Ze	e
d<   	 d	fd	Zd
fd	ZxZS c c}}} w )FastClassifierzDummy classifier that accepts parameters a, b, ... z.

    These parameter don't affect the predictions and are useful for fast
    grid searching.az   no_validation_parameter_constraintsc                 *    t         |   |||       y N)strategyrandom_stateconstant)super__init__)selfr#   r$   r%   kwargs	__class__s        h/var/www/html/venv/lib/python3.12/site-packages/sklearn/model_selection/tests/test_successive_halving.pyr'   zFastClassifier.__init__0   s     	L8 	 	
    c                     t         |   |      }t        t        d      t        d      dz         D ]  }d|t	        |      <    |S )N)deepr   r   r   whatever)r&   
get_paramsrangeordchr)r(   r.   paramscharr*   s       r+   r0   zFastClassifier.get_params7   sJ    ##.#c(CHqL1 	+D *F3t9	+r,   )
stratifiedNN)F)__name__
__module____qualname____doc__r   r    r1   r2   r3   dict__annotations__r'   r0   __classcell__).0keyr3   r*   s   000@r+   r   r   !   s~    $

0
0$ SXs3x!|4
 
 Ho%
$D  BF
 
s   A!
r   c                   B     e Zd Z	 	 	 	 	 	 	 d fd	Z fdZ fdZ xZS )SometimesFailClassifierc                 b    || _         || _        || _        || _        t        |   |||       y r"   )fail_fitfail_predictn_estimatorsr   r&   r'   )	r(   r#   r$   r%   rE   rC   rD   r   r*   s	           r+   r'   z SometimesFailClassifier.__init__?   s<     !((L8 	 	
r,   c                 R    | j                   rt        d      t        |   ||      S )Nzfitting failed)rC   	Exceptionr&   fit)r(   Xyr*   s      r+   rH   zSometimesFailClassifier.fitR   s'    ==,--w{1a  r,   c                 P    | j                   rt        d      t        |   |      S )Nzpredict failed)rD   rG   r&   predict)r(   rI   r*   s     r+   rL   zSometimesFailClassifier.predictW   s'    ,--wq!!r,   )r6   NN
   FFr   )r7   r8   r9   r'   rH   rL   r=   )r*   s   @r+   rA   rA   >   s.     

&!
" "r,   rA   z+ignore::sklearn.exceptions.FitFailedWarningz!ignore:Scoring failed:UserWarningz%ignore:One or more of the:UserWarningHalvingSearchfail_at)rH   rL   c           	         d}t        |d      \  }} | t               d| ddgdt        d      id	d
dd      }|j                  ||       |j                  d|    rJ |j
                  d   }|j
                  d   }t        j                  |      j                         sJ t        j                  |t        j                  |               }|j                  d   dk(  sJ |d   |k\  j                         sJ y)z\Check the selection of the best scores in presence of failure represented by
    NaN values.  r   	n_samplesr$   fail_FTr      rE      r      )resourcemax_resourcesmin_resourcesfactormean_test_scorerank_test_scoreN)r   rA   r1   rH   best_params_cv_results_npisnananyuniqueshapeall)	rN   rO   rS   rI   rJ   searchscoresranksunique_nan_rankss	            r+   test_nan_handlingrj   ]   s    ICDAq!		UDM3a9F JJq! ""U7)#4555 12F01E 88F!!!yyrxx'7!89!!!$)))Q5(--///r,   Estzaggressive_elimination,max_resources,expected_n_iterations,expected_n_required_iterations,expected_n_possible_iterations,expected_n_remaining_candidates,expected_n_candidates,expected_n_resources,Tlimited   rU   r   )<         rU   )ro   ro   rn      F)rn   ro   rp   )ro   rn   rq   	unlimited)%   o   M    c	                 J   d}	t        |	d      \  }
}dt        t        d            d}t               }|dk(  rd}n|	} | ||||d	
      }|j	                  d       | t
        u r|j	                  dd       |j                  |
|       |j                  |k(  sJ |j                  |k(  sJ |j                  |k(  sJ |j                  |k(  sJ |j                  |k(  sJ |j                  |k(  sJ t        |j                  d   |j                  z        |j                  k(  sJ y )NrQ   r   rR   l1l2   r   brl   rq   rU   )aggressive_eliminationrY   r[   T)verbosern   exhaustn_candidatesrZ   )r   listr1   r   
set_paramsr   rH   n_iterations_n_required_iterations_n_possible_iterations_n_resources_n_candidates_n_remaining_candidates_r   r[   )rk   r~   rY   expected_n_iterationsexpected_n_required_iterationsexpected_n_possible_iterationsexpected_n_remaining_candidatesexpected_n_candidatesexpected_n_resourcesrS   rI   rJ   
param_gridbase_estimatorshs                  r+   test_aggressive_eliminationr      s>   R ICDAq#$uRy/:J#%N	!!	5#
B MM$M
##
6CFF1aL4444$$(FFFF$$(FFFF??22224444%%)HHHH  $ryy01R5O5OOOOr,   zfmin_resources,max_resources,expected_n_iterations,expected_n_possible_iterations,expected_n_resources,smallestautorW   ro   rn   2      r{   r   ru   rv   rQ   iX     iW     iU  i,  d   c                    d}t        |d      \  }}ddgg dd}	t               }
 | |
|	d||	      }| t        u r|j                  d
       |j	                  ||       d}|j
                  |k(  sJ |j                  |k(  sJ |j                  |k(  sJ |j                  |k(  sJ |dk(  r8|j                  |j
                  cxk(  rt        |j                        k(  sJ  J y y )NrQ   r   rR   r   rW   )r   rW   rU   r|   rU   )r[   rZ   rY   rV   r   r   )
r   r   r   r   rH   r   r   r   r   len)rk   rZ   rY   r   r   r   rS   rI   rJ   r   r   r   r   s                r+   test_min_max_resourcesr      s   L ICDAq1vI.J#%N	##
B ##
1%FF1aL%&"4444$$(FFFF$$(FFFF??2222	!((B,<,<TBOO@TTTTTT "r,   z2max_resources, n_iterations, n_possible_iterations)	)r      	   )   r   r   )i  r      )   r   r   )i  r   rp   )    rm   rm   )   rU   rU   )   rU   rU   )rm   r   r   c                 L   d}t        |d      \  }}ddgt        t        d            d}t               }d}	 | ||d|	|d      }
| t        u r|
j                  d	
       |
j                  ||       |
j                  dk(  sJ |
j                  |k(  sJ |
j                  |k(  sJ y )Nr   r   rR   rW   rM   r|   rm   )cvr[   rY   rZ   ro   r   r   )
r   r   r1   r   r   r   rH   r   r   r   )rk   rY   n_iterationsn_possible_iterationsrS   rI   rJ   r   r   r[   r   s              r+   test_n_iterationsr     s    ( ICDAq1vDrO4J#%NF	#
B ##
2&FF1aL$$)))|+++$$(====r,   c                    d}t        |d      \  }}ddgt        t        d            d}t               } | ||dddd	
      }|j	                  ||       t        |j                        t        g d      k(  sJ t        |j                  d   |j                  d   |j                  d         D ]  \  }}}	||d   cxk(  r|	k(  rJ  J  t        j                  t        d      5  t        ||ddd      }|j	                  ||       d d d        t        j                  t        d      5  ddgddgdd	gd}t        ||ddd      }|j	                  ||       d d d        y # 1 sw Y   \xY w# 1 sw Y   y xY w)NrQ   r   rR   r   rW   rM   r|   crU   )r   rX   rY   r[   )r   rU   r   n_resourcesr4   param_cz0Cannot use resource=1234 which is not supported match1234)r   rX   rY   zSCannot use parameter c as the resource since it is part of the searched parameters.)r   r}   r   )r   r   r1   r   rH   setr   zipr_   pytestraises
ValueErrorr   )
rk   rS   rI   rJ   r   r   r   r_ir4   r   s
             r+   test_resource_parameterr   8  s    ICDAq1vDrO4J#%N	^ZA2VW	XBFF1aLr3y>111 #
}%
x 
y!! -VW
 fSk,W,,,,,- 
L
  !J1vR
 	q! 
*
  q6AaV<
 J1s"
 	q!   s   &#E$,/E0$E-0E9z2max_resources, n_candidates, expected_n_candidates))r   r      )r   r   r   )r   r   r   )r   rp   rp   )r   r   r   c           	          d}t        |d      \  }}t        t        d}t               }t        |||d| dd      }|j	                  ||       |j
                  d   |k(  sJ |dk(  r|j                  d	   | k(  sJ y y )
Nr   r   rR   r|   rW   rm   )r   r   rY   r[   rZ   r   r   )r   r   r   r   rH   r   r   )	rY   r   r   rS   rI   rJ   r   r   r   s	            r+   test_random_searchr   `  s     ICDAq$'J#%N	!#
B FF1aLA"7777y  r"m333 !r,   z*param_distributions, expected_n_candidatesr   rM   c                     d}t        |d      \  }}t               }t        || d      }|j                  ||       |j                  d   |k(  sJ y )Nr   r   rR   rM   r   )r   r   r   rH   r   )param_distributionsr   rS   rI   rJ   r   r   s          r+   )test_random_search_discrete_distributionsr     sX    " ICDAq#%N	~/BQS	TBFF1aLA"7777r,   zparams, expected_error_messagerX   not_a_parameterz:Cannot use resource=not_a_parameter which is not supported)rX   rY   z:Cannot use parameter a as the resource since it is part ofr}   )rY   rX   z:resource can only be 'n_samples' when max_resources='auto'      )rZ   rY   z3min_resources_=15 is greater than max_resources_=14r   )shufflezmust yield consistent foldsc                     t               }ddgi}t        d      \  }} | ||fi |}t        j                  t        |      5  |j                  ||       d d d        y # 1 sw Y   y xY wNr   r   r   r   )r   r   r   r   r   rH   )rk   r4   expected_error_messager   r   rI   rJ   r   s           r+   test_input_errorsr     sg    2 $%NsJs#DAq	^Z	26	2B	z)?	@ 
q!  s   AA(r   zcannot be both set to 'exhaust'c                     t               }ddgi}t        d      \  }}t        ||fi | }t        j                  t
        |      5  |j                  ||       d d d        y # 1 sw Y   y xY wr   )r   r   r   r   r   r   rH   )r4   r   r   r   rI   rJ   r   s          r+   test_input_errors_randomizedr     sg     $%NsJs#DAq	~z	DV	DB	z)?	@ 
q!  s   A""A+zAfraction, subsample_test, expected_train_size, expected_test_size))      ?T(   rM   )r   Fr   ro   )皙?Tr   rm   )r   Fr   ro   c                    d}t        |      \  }}t        t        d      | |d       }|j                  ||      D ]  \  }}	|j                  d   |k(  sJ |	j                  d   |k(  sJ |r1|j                  d   |	j                  d   z   t        || z        k(  r_J |	j                  d   ||j                  j                         z  k(  rJ  y )Nr   r   base_cvfractionsubsample_testr$   r   )r   r   r   splitrd   intr   get_n_splits)
r   r   expected_train_sizeexpected_test_sizerS   rI   rJ   r   traintests
             r+   test_subsample_splitter_shapesr     s     Iy)DAq	a%	
B xx1~ Kt{{1~!4444zz!} 2222;;q>DJJqM1SX9M5NNNN::a=I1H1H1J$JJJJKr,   r   )TFc                    d}t        |      \  }}t        t        d      d| d       }t        |j	                  ||d             }t        |j	                  ||d             }t        ||      D ]|  \  \  }}\  }	}
t        j                  ||	k(        rJ | rt        j                  ||
k(        sAJ t        j                  ||
k(        sJ t        j                  ||   ||
   k(        r|J  y )Nr   r   r   r   groups)r   r   r   r   r   r   r`   re   )r   rS   rI   rJ   r   folds_afolds_btrain_atest_atrain_btest_bs              r+   #test_subsample_splitter_determinismr     s     Iy)DAq	a3~TX
B 288Aq8./G288Aq8./G03GW0E 2,&,GV66'W,---vvf.///66&F*+++66!F)qy01112r,   zk, itr, expectedr   )dr}   r   r   efi)ghr   c                 l    g dg dg dd}t        || |      }t        j                  ||k(        sJ y )N	r   r   r   r   r   r   rW   rW   rW   	rm   rU   r   r      rM   r   rV   r   	r   r}   r   r   r   r   r   r   r   iterr\   r4   )kitr)r   r`   re   )r   r   expectedresultsgots        r+   
test_top_kr     s:      ,8?G
 A3
'C66#/"""r,   c                    t        j                  d      }t        j                  j	                  d      d}t        |d      \  }}dt        t        d            d}t               }fd} | ||d	|
      }| t        u r|j                  dd       |j                  ||       t        |j                  d   t        j                        sJ t        |j                  d   t        j                        sJ |j                  |j                        }	t!        |	d   j#                               t!        |	      k(  sJ |	d   j%                  t&              |	d<   |	j)                  ddd      }
|j+                  |
      }|j,                  }t        |dz
        D ]  }||   }|||dz      z  |k(  j/                         sJ | ||dz      z  }| | z  }|j1                         |j2                  |dz      k(  sJ |
|   j5                  |      j7                         }|
|   j5                  |      j9                         }||k  rJ  |	d   j7                         }|	|	d   |k(     d   j;                         }|	d   j;                         }|j<                  |	j>                  |   d   k(  sJ |	j>                  |   d   |	j>                  |   d   k  sJ |	j>                  |   d   |	j>                  |   d   k7  sJ y )Npandasr   rQ   rR   rx   r{   r|   c                 $    j                         S )N)rand)estrI   rJ   rngs      r+   scorerztest_cv_results.<locals>.scorer=  s    xxzr,   rW   )r[   scoringrn   r   r   r   r   r\   r4   
params_str)indexcolumnsvaluesr   ) r   importorskipr`   randomRandomStater   r   r1   r   r   r   rH   
isinstancer_   ndarray	DataFramer   rc   applystrpivotisnar   re   sumr   wheremaxminidxmaxr^   iloc)rk   pdrS   rI   rJ   r   r   r   r   cv_results_dftablenan_maskn_iteritalready_discarded_maskdiscarded_now_mask	kept_maskdiscarded_max_scorekept_min_score	last_iteridx_best_last_iteridx_best_all_itersr   s                         @r+   test_cv_resultsr#  -  s,   
 
		X	&B
))


"CICDAq#$uRy/:J#%N 
^Z6	BB
##
6CFF1aL bnnV,bjj999bnn]3RZZ@@@LL0M }./6689S=OOOO"/"9"?"?"DM,F3D   E& wwu~HFFQJ 4!)"
 #Xb1f%559OO
#% 	 
 54xQ7GG++/A.AA	}}""2"226":::: $Bioo.@AEEGr3779"^333%44 f%))+I&}V'<	'IJfh  ''89@@B??m001CDXNNNN-./@A


/
01B
C	D	D 	-.x801(;	<	<r,   c                 |   t        j                  d      }g g g  G fddt              }d}d}t        |d      \  }}dt	        t        d	            d
} |       } | ||d|dd      }	| t        u r|	j                  dd       |	j                  ||       t              t              k(  sJ t              D 
cg c]
  \  }
}|
|z    }}
}|d d |   }d d |   |j                  |	j                        }t              t        |      cxk(  rt        |      k(  sJ  J t        j                  |d      \  }}|	j                  |k(  j!                         sJ |	j"                  |k(  j!                         sJ |d   k(  j!                         sJ |d   |k(  j!                         sJ y c c}}
w )Nr   c                   :     e Zd Z fdZ fdZ fdZ xZS )=test_base_estimator_inputs.<locals>.FastClassifierBookKeepingc                 `    j                  |j                  d          t        |   ||      S Nr   )appendrd   r&   rH   )r(   rI   rJ   r*   passed_n_samples_fits      r+   rH   zAtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.fit  s*     ''
37;q!$$r,   c                 ^    j                  |j                  d          t        |   |      S r(  )r)  rd   r&   rL   )r(   rI   r*   passed_n_samples_predicts     r+   rL   zEtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.predict  s(    $++AGGAJ77?1%%r,   c                 D    j                  |       t        |   di |S )N )r)  r&   r   )r(   r4   r*   passed_paramss     r+   r   zHtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.set_params  s$      (7%///r,   )r7   r8   r9   rH   rL   r   r=   )r*   r*  r,  r/  s   @r+   FastClassifierBookKeepingr&    s    	%	&	0 	0r,   r0  r   rW   r   rR   rx   r{   r|   F)r[   r   return_train_scorerefitrn   r   r   T)return_countsr4   r   )r   r  r   r   r   r1   r   r   rH   r   r   r
  r_   r`   rc   r   re   r   )rk   r  r0  rS   n_splitsrI   rJ   r   r   r   xpassed_n_samplesr  uniquescountsr*  r,  r/  s                  @@@r+   test_base_estimator_inputsr9    s    
		X	&B!M0 0N 0 IHCDAq#$uRy/:J.0N	 
B ##
6CFF1aL#$,D(EEEE 46NO1aA  (
(
3!*H*-MLL0M}%5!6L#m:LLLLLLii 0EOGVOOw&++---&++---(#}499;;;-(,<<AACCC)s   F8c                 L   t         j                  j                  d      }t        ddd      \  }}|j	                  ddd      }t        d      }ddgi}t               t        d      t        d	      t        d      g}d
}|D ]X  }	 | |||	d      }
t        j                  t        |      5  |
j                  ||       d d d        |
j                  |||       Z t               t        d      g}|D ]  }	 | |||	      }
|
j                  ||       ! y # 1 sw Y   ZxY w)Nr   r   rW   )rS   	n_classesr$   rU   )r$   Cr   )r4  z*The 'groups' parameter should not be None.)r   r$   r   r   )r   )r`   r  r  r   r   r   r   r   r
   r   r   r   r   rH   r   r   )rk   r   rI   rJ   r   clfgrid	group_cvs	error_msgr   gsnon_group_cvss               r+   test_groups_supportrC    s   
 ))


"CqqIDAq[[Ar"F

#C!:D 	Aq)	I =I $dr2]]:Y7 	FF1aL	
q!F#	$ %&(>A(NOM dr"
q!	 	s   .DD#	SearchCVc                 
   t               }ddgi}t        j                  d      j                  dd      } | ||d      }d}t	        j
                  t        |      5  |j                  |g        d	d	d	       y	# 1 sw Y   y	xY w)
zBCheck that we raise an error if the minimum resources is set to 0.r   r   r   rU   r   )rZ   z;min_resources_=0: you might have passed an empty dataset X.r   N)r   r`   emptyreshaper   r   r   rH   )rD  r   r   rI   rf   err_msgs         r+   test_min_resources_nullrI    su     $%NsJ
Aq!Anj
KFKG	z	1 

1b  s   A99Bc                     t        j                  g d      t        j                  g d      t        j                  g d      d}| j                  dd|      }|dk(  sJ y)z3Check the selection strategy of the halving search.r   r   r   r   Nr   )r`   array_select_best_index)rD  r   
best_indexs      r+   test_select_best_indexrN    sT     4588$AB((HIG ,,T4AJ??r,   c                    	 t        ddd      \  } }dgt        d      t        d      d	d
gddgdg}d}d}d}t        t               d|dd      }|j	                  | |       t        |j                        }|j                  	t        	||||       ddddd}t        ||||       t        	fdt        |      D              sJ t        	fdt        |      D              sJ y)zqCheck the behaviour of the `HalvingRandomSearchCV` with `param_distribution`
    being a list of dictionary.
    r   rm   *   )rS   
n_featuresr$   rbfrM   )scaleg?)kernelr<  gammapolyrW   rU   )rT  degree)param_Cparam_degreeparam_gammaparam_kernel)r\   mean_train_scorer]   split0_test_scoresplit1_test_scoresplit2_test_scoresplit0_train_scoresplit1_train_scoresplit2_train_scorestd_test_scorestd_train_scoremean_fit_timestd_fit_timemean_score_timestd_score_time)r   r   Tr   )r   r   r1  r$   r   r   Oc              3      K   | ]J  }d    |   dk(  r=d   j                   |   xr' d   j                   |   xr d   j                   |     L yw)r[  rV  rX  rZ  rY  Nmaskr>   r   
cv_resultss     r+   	<genexpr>z;test_halving_random_search_list_of_dicts.<locals>.<genexpr>G  su       n%a(F2 y!&&q) 7=)..q17~.33A667s   AAc              3      K   | ]K  }d    |   dk(  r>d   j                   |    xr' d   j                   |    xr d   j                   |    M yw)r[  rR  rX  rZ  rY  Nrk  rm  s     r+   ro  z;test_halving_random_search_list_of_dicts.<locals>.<genexpr>P  sx       n%a(E1 9%**1-- 3}-221553>*//23s   AAN)r   r   r   r   rH   r  r   r_   r   r   re   r1   )
rI   rJ   r4   
param_keys
score_keys
extra_keysrf   r   expected_cv_results_kindsrn  s
            @r+   (test_halving_random_search_list_of_dictsru    s#    LDAq 7R5s;KL81v.FJJ" )J"!DWXF JJq!v++,L##J*j*lJW	! !
J(A   |$      |$   r,   ):mathr   numpyr`   r   scipy.statsr   r   r   sklearn.datasetsr   sklearn.dummyr   sklearn.experimentalr	   sklearn.model_selectionr
   r   r   r   r   r   r   r   r   r   2sklearn.model_selection._search_successive_halvingr   r   )sklearn.model_selection.tests.test_searchr   r   sklearn.svmr   r   r   rA   markfilterwarningsparametrizerj   r   r   r   r   r   r   r   r   r   r   r   r#  r9  rC  rI  rN  ru  r.  r,   r+   <module>r     sv      , , 0 ) 9   '_ :"o "> IJ?@CD+>@U*VW$670 8 X E A K
0B !46K LM	  
y!Q1n6GH 
	1aA{MB 
{Aq!Q8KL	Q1a9LM6,P7 N8,P^ !46K LM	  
VQB8,	VQB9%	RAt$	FAq3*-	D!Qc
+	CASz*	CASz*	CASz*	CASz*	B1r2h'	B1rd#	B1rd#!6!U7 N8!UH !68K LM8> N >4 !68K LM$ N$N 8	4	42 0
1v
wq!}	r"88$ !46K LM$ *+H	

 s3H	

 %#6H	

 !26A	
 d#	$&CD
	!>?%./ N0 $ 'C-	


 GKK0 )=92 :2< 	
Au	
ASz	
A#$	Q$%	
Au	
ASz	Qc
	
Au	Q 
## !68K LMa NaH !46K LM?D N?DD !46K LM N@ &;=P%QR
 S
 &9;P%QR
 S
Fr,   