From 4a387727648e462082e8a998664cc3cbacb0fc69 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Tue, 9 Jun 2020 08:23:58 -0700 Subject: [PATCH 01/19] [DOCS] Adds documentation for drilldowns (#68122) * [DOCS] Adds documentation for drilldowns * [DOCS] Incorporates review comments * [DOCS] Fixes to text * Updated gif sans nav bars * [DOCS] Adds image of drilldowns and other tweaks to text Co-authored-by: KOTungseth --- docs/drilldowns/drilldowns.asciidoc | 108 ++++++++++++++++++ docs/drilldowns/images/drilldown_create.png | Bin 0 -> 87682 bytes docs/drilldowns/images/drilldown_menu.png | Bin 0 -> 53455 bytes docs/drilldowns/images/drilldown_on_panel.png | Bin 0 -> 41533 bytes .../images/drilldown_on_piechart.gif | Bin 0 -> 876715 bytes docs/user/dashboard.asciidoc | 2 + 6 files changed, 110 insertions(+) create mode 100644 docs/drilldowns/drilldowns.asciidoc create mode 100644 docs/drilldowns/images/drilldown_create.png create mode 100644 docs/drilldowns/images/drilldown_menu.png create mode 100644 docs/drilldowns/images/drilldown_on_panel.png create mode 100644 docs/drilldowns/images/drilldown_on_piechart.gif diff --git a/docs/drilldowns/drilldowns.asciidoc b/docs/drilldowns/drilldowns.asciidoc new file mode 100644 index 0000000000000..2687441c99340 --- /dev/null +++ b/docs/drilldowns/drilldowns.asciidoc @@ -0,0 +1,108 @@ +[[drilldowns]] +== Use drilldowns for dashboard actions + +Drilldowns, also known as custom actions, allow you to configure a +workflow for analyzing and troubleshooting your data. +Using a drilldown, you can navigate from one dashboard to another, +taking the current time range, filters, and other parameters with you, +so the context remains the same. You can continue your analysis from a new perspective. + +For example, you might have a dashboard that shows the overall status of multiple data centers. +You can create a drilldown that navigates from this dashboard to a dashboard +that shows a single data center or server. + +[float] +[[how-drilldowns-work]] +=== How drilldowns work + +Drilldowns are {kib} actions that you configure and store +in the dashboard saved object. Drilldowns are specific to the dashboard panel +for which you create them—they are not shared across panels. +A panel can have multiple drilldowns. + +This example shows a dashboard panel that contains a pie chart. +Typically, clicking a pie slice applies the current filter. +When a panel has a drilldown, clicking a pie slice opens a menu with +the default action and your drilldowns. Refer to the <> +for instructions on how to create this drilldown. + +[role="screenshot"] +image::images/drilldown_on_piechart.gif[Drilldown on pie chart that navigates to another dashboard] + +Third-party developers can create drilldowns. +Refer to https://github.com/elastic/kibana/tree/master/x-pack/examples/ui_actions_enhanced_examples[this example plugin] +to learn how to code drilldowns. + +[float] +[[create-manage-drilldowns]] +=== Create and manage drilldowns + +Your dashboard must be in *Edit* mode to create a drilldown. +Once a panel has at least one drilldown, the menu also includes a *Manage drilldowns* action +for editing and deleting drilldowns. + +[role="screenshot"] +image::images/drilldown_menu.png[Panel menu with Create drilldown and Manage drilldown actions] + +[float] +[[drilldowns-example]] +=== Try it: Create a drilldown + +This example shows how to create the *Host Overview* drilldown shown earlier in this doc. + +[float] +==== Set up the dashboards + +. Add the <> data set. + +. Create a new dashboard, called `Host Overview`, and include these visualizations +from the sample data set: ++ +[%hardbreaks] +*[Logs] Heatmap* +*[Logs] Visitors by OS* +*[Logs] Host, Visits, and Bytes Table* +*[Logs] Total Requests and Bytes* ++ +TIP: If you don’t see data for a panel, try changing the time range. + +. Open the *[Logs] Web traffic* dashboard. + +. Set a search and filter. ++ +[%hardbreaks] +Search: `extension.keyword:( “gz” or “css” or “deb”)` +Filter: `geo.src : CN` + +[float] +==== Create the drilldown + + +. In the dashboard menu bar, click *Edit*. + +. In *[Logs] Visitors by OS*, open the panel menu, and then select *Create drilldown*. + +. Give the drilldown a name. + +. Select *Host Overview* as the destination dashboard. + +. Keep both filters enabled so that the drilldown carries over the global filters and date range. ++ +Your input should look similar to this: ++ +[role="screenshot"] +image::images/drilldown_create.png[Create drilldown with entries for drilldown name and destination] + +. Click *Create drilldown.* + +. Save the dashboard. ++ +If you don’t save the drilldown, and then navigate away, the drilldown is lost. + +. In *[Logs] Visitors by OS*, click the `win 8` slice of the pie, and then select the name of your drilldown. ++ +[role="screenshot"] +image::images/drilldown_on_panel.png[Drilldown on pie chart that navigates to another dashboard] ++ +You are navigated to your destination dashboard. Verify that the search query, filters, +and time range are carried over. diff --git a/docs/drilldowns/images/drilldown_create.png b/docs/drilldowns/images/drilldown_create.png new file mode 100644 index 0000000000000000000000000000000000000000..1573a3dfb4f4f50acfb1b61e839081ddce76b68c GIT binary patch literal 87682 zcmb?@WmH_xvM(;dLxA8Af@{zq!CiwhxVyVMB)Gcr*P8MaPdkB4_>S^+7zDWhhG$H zRMh0azzcl*xB|J@s4~4UEY*^0I`We1=G0R5F0bx$!34muu%}5WOLgw#R+rbwau(N9 z7XNtxm(})mc8B?jDpt``%;uB`PJA%UI@()=e?3G!Y2b+BFwoK4XsJCm1Q?B)8(%PF zvPBVzKB7^_eV?CD&m$t%|dwj6qF@s*kQBF}Y(ckA>zW=8LYKd`(B%^L? zFxi{)eSW+_e2+iI{X=C6H#jw#%&fXj14D+^t7bV_kk6ba;q|6mV)#Hf5@RBJ!3(BL zqj<8YsU@?Cn-72S7);~LhKoj~IUS!gZ-blI|VZCzjYn|8184m(MYf;`b-vV9G!S<(K^>X)izw zHUl7J65r)7v%FnGI}L@SueKu9RGIkO)Ih3rM>s2FX_bM$-|JJar_Z`Y0Lu^l63$r~ zt(CNwxNisNZ{_9MAuWS^Yw)fv$p7s||7c5@6rR4i94k*`_ir*ac+USnKF5F;vAS$D zKL7CBdHC;tXo`N`Ja~T<%0`}N+}yH zQ_4|c+?%N_11~lmC=;L9OTk!gPP}mcllBb?4TteM?(G@Z1bEJ2iIa7(ugB4aUh8J9m}Wzz2ErU?G=FMKGQ$f`nb>hblr|yYm*|q zprzIVv?QI$Px{l${6rz*$QUEc>^)Rc(S%9mLAm*L*c3wgQTs-lZ3U0-Yxb7kEIs>K z4sZUyMpA|#AU`Xi0WP&TWqgv58Kq3EFjXB_E_$Zh3cpFhXR|#ijb$r8`6|LqIF#+v zpOeP-^2->Xtad@Fi42oBEtt)pLJ%P{I238hsh>%xCl1ZBaf!TV62hYINVPd??kaF9Lb32`|*hXl{B*-tF`}cRgZ!=?7uwv) zH%C&8=UsP%F9U_lzxG75mddA1S*aL(t5toSu>aeAtz8Lf zS2tRpU5-PXx-R28uNIBsWYgJ=l#knX*ocMwOQ6u5o1d0>c6#xai$Sc@ybMO zi#*8tmQP;CD3NlH5q?2QXMz;)&ik~m^D3ifq~HW|8`EE$7NQz{W@Z;@7Et8AA@0`U_r%wY=r+#X9 z|C7WAOiE6E-;0l;>E()9bnkrq&CMU%cJfv2?2=f(y|D~$-qgNe(GiWZCh&8-{QiRi7b?Gtlh4$?=JoFg7(x~b$ByiMnGlq=^W!qe z<8Gsp3P@&msZI+N@xSB0J*PARY0e+wK6EC{K6PK#bV5cc$C&`l_QY))@k^Uk%(Wc! zs}UGPBOfROUNu-vq_Gdh&o^`jzIyU|a_Gun7v$i#py=>CO3&ijsSt_+Sxw}te-+6? zV=0zcrrzuEe&lDYQn*6JrbwJ+thPx1#c4VqE2p%=;`I1nWShQ59drw(Z0Ov49HzmM z3q!$*ecx>Dk`-e=R9#5wYq5H}`9$qnR`+sGc6@N!!6dsa|omp3byoe>XlKh@VI* z_5Qk`??ncu^LJyttFNzOI^YPua$1bO6jM+(WLrwB)2z}_rRt`3UWPxZSt;wzyz$kl z(l{##tkdzD|EyFrC24KZr) z{Jb?0TcTDfPr`l>em|U4EUi}Cwrxw3E`}{!u2R4#@~}5yu?<{+*wjvJRaMs{p7`%r z#)Q`H#ghvvbx)NlR8yV?0@~fPOg%NKv{j}KqFm1gl?Z}VnU73pOUwDJs41aFIOM{w zHD|^3TAhD#7ukiHLnd@DRaR|ZZl}0zjg~b$quGE(^3Cs`zF6MIdBMX!1?(H;@HrLT z@n$Gy7@gKf*iZ8^TsJ!`eU1zFthXE|sb2dv7@bp%zPT9oJE(nxLfa?{o}-{0DD*rv zeN~@I#ez3<_GQ_^j5sLn&Lrh4BXRM6+!2wJ(U6$J?J;`V_sQb6iGDtOIo081L{p8C zwkr%7-q_~4`xV1JTxaqn?K^f$oG9yT(0M>pF9_*jD`R7GobQP-hLC-3>yUh3BFkt* zPO52rmFappU8yH|NT{3|?e2_w%eS_-Kh@W`rZTg$nXW}n4FHwk z<=gWi*`4#Ao2JdFr^V(D`Nyky5!5q_ncX*#YrZGim<$%pU#$k`?AGSDHG)nV9mnk} zXlA;bDgK|5Pd7>xCxZ|A>}tE1RvhVZS7Kl8j+GjN2VI&-ya zg#(bn~HPkJEB2!xD>Kqasl^;{ZGncm?EkObw`wRluL? z`FC!%W{t#2c`{*H&mn3d2#9cwCE;20=b)CGHwrQ+v#2uYNWZJ@X3J6I%R-L-r~}se zEdPdbl*q_mj<5nOO0hy5^gd&_TH~{A$uT~yqsZ;vx%9`n3J?H8oX=xlyWL+zq3*Ez z;(m<*UB0pN>7k%yQ@iKx^HKMQ7j%pZeQJU#a^XA5WlDH z2Up3@otu>62{^)_arvc|6Yc}5aN87JV_4v1;+nznI!mU7EUiJA;=&_#x{s~CL=wrh z)bNciopf5I&uwmjOXE!=^?Iu`tH+b?9w>!anYGJa@()Fieg%@>q}6Eje{P_`zIzaW zhd}Q$43l~uFO~daR~{8vsJ^I(JgD1v?hO*_Cfr}_SsjzjNQCN^FsHJ!x2gx9z}Pik zydbtU37Vd&((EX^IGSHG*Q-w7tJ19v-`w2dRA3!Z6t3I-mLQmrd6YFVSe{P#8-=6IK`o1wJ+?$n0S6NXmJW!bX{(q3oL zx2L-RoKO%bpI&8g!PoQ91<)=>Al$ zH4O8|@u?db%5L@t?&DtgfX#fr6YgKLwQF$1e4e?itU)(@e$w36jBu_e;==ax0im{YWvpt2`!JI|;j zwe;TkgEDReg(aQHKA)X$2Db0~rNK{a{&NRrZIDr3SDg`(mk`viM)a}dd}5EcwNLwQ zZKc`C!(MB*378~5WLUG`m6{aCnCGr0h}1j-Jt^d2*1b+x8WMRr<0Ix+$EeOQwxAGj zZ-rhuy+MeLwSQ?AMnpJ=OVy~?Y|quUU>@lwi-tkOmWoBnmp#}K@WInF3-lAxt4gYn z!IqX`=&Kruy~l1;0VEe_Z1RgCVke*@qWGN%Q(3)AJWAK}XY@K+q-{$(T;K6-hsSWZ zzjD~>dAgNpr+vtHI;{d4cFo1>-F?uN$lMBG3@b+0spo%TEI&OO@&}ZnO-wT4F4*NctE$p4cH9`ObRl zBqfJMF(f}&fz?jkXYHfS(sX+^2n82V4FgO8;(E-9{BKr(%iGNxmd%ACEwJ@l|C^6O z=Npux*F8^?7a&0Bw83zHf~bw(<(=Zyo{ydV&E3k0VIrGBO?|oD9FUr)ihjgne$8IE zb5aRF))x`cVB81Yx4JjG{l@xcO_##|wsdXu*Py}-r;vp3eP@Eu$8hGl5kvZ5J6k1N zUR}$F!Rm3)_q%9tr9)V71XzqfD;&xC3o`^K_N;KU2dbW_qQl!Q{ixqyby#hFFOR+h zTi#QTRCzjX^{t<$XxH-uy%s}m$OW6{X%EX|D@;uc(vn|ImnmtBe9!mf5I(y;Tp$I> zdBx&OG9a;h-uS9q2eq56GErEZgz`D9yo#Gyw7or;5}NzYg@qn%a*A&;4M0oOhPu~w zHM_OCOBW0)-okcQlYy7a+@w84A!c>$?tAv&{K*&rg~gPF==$;+}`R+=uawSW&M z?SU&OG=;ehumo_-R4C|C-0fj~CZbZkypo4ojKcp^n6Wgc`Ymf{`zzzg(#I^a*R+~3 zn=UiJu{;6KSbhAZLoK}(EN9$u@>3w{?@DeMfYxgTS^?>nIO8#Dv?eAYdhQoEzCSjX zq`wm))cc4^>UA1+xO^MQjlpo{9cghUB!Aj$zwoN#La<}pMQOKM;QNW;A>X~5tZDsl#`tVV^oa2wvr0pOfyE(G+puEpoT4-mb8HTQ* z6D)H&t9JyHZ=DEp`;DLhPe;G2lO4(sd-`e?$_D%#4zFYXCCL0A4a47K@)meCsz=HC!gysWZ5dD&un27p#UFe0Q(2DYuFfgsCNFtdgzxli~X{ zdmIfI0af9SD5PdcN8Th^L0?8mAUlo0V-T6cWck$7d!cC#r$+>Z4{_!eVDr<+%D1t~ zB0c(%7QI4T3t?#){%>ii*Wq_>hAm$}7`1NF#oHI4lC6p=p6fS^@hD%Ug2#1ocpcK2 zYphvkQ<5*d8`7IiY<~@m_?iQdbM!aC8Abx0)&;7B#D*9aBd29X?!Pnp^LV(gpxA{k z{4e54_vSw9WogA)6GVHzo4^EIuZV|i=S7eW_3E-PojqNw}Kw+->}yb%90km zfRXi3oLx>&H=l!^r?=EWyuw>^(-^}dT#$6Y-Pt_9WsF%BRcPFWd2lvQ^^gp|T@SUV zF_I;&+Bfkn-OgE`xI2swcFX0lirjUMt`tWhh&mx=LxIRYwJJrJb1G#?DNV&M_h%iZ z>XesyKjIZnf75c9W%8tOQV7U`M+&IX)kwmK@p-uOnD!5sSbW_3ZT2;Nr1j@kj*EhE zkTvH3B0#${oiH(!#^?!5+CE|#@jN$ds`)655cv}qMk2W^sd-ci!Vl*! zsv46bK=&^m==>I!whDBXSugsAE(g~hM|rPBHPG$Xf9{s-T2j|o(IHAUeY#ULg&MTG zN3{`2o^Rj7`XY9Z#qP!PB*_96g)FJe!oc^T*XKJ%b?3JAuAT>;U(ms8XA`+2PEZpU zo(jE|X1oc0fk|0q!+bWmWk#yUGf1-*Gs7%z(4+s#GB4u_myRJSHkrK#O6ArrD?$y) z(dD7;XrxC@Pyc>09FUw+5O?gg}5B9QNb#rW3G z563MM`_$oHD;@>plmj*P@%+C;A3jh9>aY6sd`Qlvam{jUZo4h30f^s~oNc z{5Y3LEkR3b(bUG|{6v?AfAB`;mCGEnRsVCUR+>xy1yo9C&DIkHTx%)sdj$W0+IE^V zh=9eL`(_l3@d&wFEAhJ)OudMI4?Z%v96w_4I*7pr(JVWExs=vYpT)UsD|qNfV}83H zGzJfix!A4ojyc2P)3*{X&W#wYH$9*A2&vOnA-L)2W^3-bd$v(CSuY{jggr0IEM2X| zT3T_p0zu)-|Eyk~uB*53g4PphPKs!jk6GY#7P?gC_Y&H5qu=}YI%yo7KEu)qoM>!p zfzP%~dzNLf{}sR~t6Z=<=%U!_lDwfb7Rl8ay4rQmy{%elR9gc*OQ`+v?G9KNu$890 zs~3N){rtjdZ^*F*fajGlbKt7Y5) zcZv;g6m#0i;>HU)n%({YSgSxV?m}uh?g<-y)jN~4SB~;X zPbX<>OUd5QbE|W&Ix91Rla;m<2k9@13r%`n=i^FBD<$}0FKAPnEC!9Na>fL)c!EYle`T=m>eUctk|G`> zA6i;fLL-cx)B@PSyVXX1I;-G}p>%M4YqPCKR(`-;apRUfK1)~-RY__R#D1lH*7USX zF>6Xq&Ff*lN^=@GKF{p)dcwLl8r(2x*2LNFMEHJghbP>sNNdvh=>4WQn?Cs?WU*RJ z^1;ogzTeiPeBGOkmoMOCM5eTC^l~#rWkH%J9|wM{^85+9L*C$7t7XTnSNEfI4KQ-T zo*$(AxvWXT{eA%T#J4VhsXNsk1j)bCs?_ISITs788)iU?<@&-{Yz58! zT^E?MBeZ>0%Jykg4a-*J4l51-DZGf!G0n;`%dDetMZyPnooyoe=nxKx`{=Mb@XSs$ zdY}EuiXQn1W#KoYR+@=Z>ipH9x*@$!=lsh>nPvW*Nkf^Umk*L0le4R;pn16a8Zsb~ z9JXH!&%9G4rN9zkh#gFeD^84{u(64=FjifTKLBxJK!y}#26@x@i^HkU@=&)tzs99H z!+i_qu{- z89>8M1*s_L_QiZfeo6YcfxEd+*fc>3EjCNjm}5CSg%{kRzxjAtYr{i+OKxb@=l9AzWaB{ z8!!4zf=VWFHWxKUVe|Lq0_!&=;^V$`L>WV$YQ_BBeflqaNfZgz;m6~ER{ypDjGpK> zvET=KWi2=5fY#T4kHACvQM+NzgYYrv&lYem9xQ!(3m6An{+#;F&p+^pB(5`v1pZ5p zz+Y(1CJPK>*#_P@+x(7R|Fr(&snd_)*L8T$TCIh~PQSrCp<63wc=BL7Lc7Y`1; z1?VgIC#nXMu>Kzj>oqq*`TvsTE#Q*(Ppl56ZZjA@lKsD_I)nBd{s)Bmp9hu9tMwh= z_OPwXr@s{;+M7@V@%#_6#dywq!DI&S*mD2077;IkvKIT{-SyO;piUy}86*URDcy*-X$`_6Cv)=9&HJK+7zsz#Cj^nvw$ zNtou@#(b~U{$ga~zqmG%Vk`U)t{nkgbq8w-f1);`@i36hHok^}=-cn4fGh;#9~_Fv z^TBWLcdHv_kjZ}xGC8}^|EEEmO=#B5FZ*kP*t`CmkN;&z@h@{8RPBVA?LXY5HzH1y zO>Q_(!F)XO2;{OPoK!5sZZFh%@u%~=Mc_vX5o&W&K)B$3VIHU5)Rn480(5il!ES@@@a z`-2-^FV=eNgzdMqY1+S?{f3ab&SS}Qq30>sm_H&hokdk2vOVt2m7X%|q&n!Q`sc(q zbX0ZTd#?X9z}qg#W@%*NWvdA@WGj zvBa~3KUMM;VTS-dXl36gVvXxR$Pgen0^Sjb2d@3$Yp})8N!6RA1p{a?F7hk?VpCKL z7R<5TZNQ8A;nTJSJ4_>lbvH=!`4og;Ku z{Q;7}^p{BRkLrEij1R5T*iOL*r}3KUX3Qvkes$*LszA^415kiT8+2Da;}h zPl3nJl+5hqI8q!G9)^mO?}Ya*=A(zvmW}7v3g;xn?m$TH_Uv~n4)=GcDfbT!<}Md{lc0SVN!2YLmwg~Z8BbJlJhsCDIPa*MZ0FMvQL%H|XRO|!L_1v{uSi!=i*qOo zSoDP=mul>(C5r?-s^bi2e~q=_@;D{5`O*4`Ovw4YRyi;ohWN-%no3!GxxfvvPO*FqVN+;>?W3Lc2xv)lQ5`=5D~} z@E-W2NmN(|eFTQ{xQ80dUVPd6s6<*8;J93;YW-!WDj*rh*L_iYy43&HRjo_<(*6jQ z`l(XAJ9#jMFz2}E)4?S|6#w+&OO9NAv$B~gO$8qQjB<;?79^Cmj3bR#ie)of0#B8b-sSOk%4<5qU%EiV<*fsq@c%-oSjD zfC5Fjp6hY3V9z|704M!c|x;y_J|6(3R+7FdfE`- zblB%6U*h_ZCI7Yp@yo}bH0C$o@m!6c;1`-5a{QsHDuA*)LNFxU1wXA0hhs_sdK0Ya z3F{F+9y^{=#&dYLULq5)@7zMM9P#NDQy&AkhLYO#+e}L@yiX7pnmrEqo)7Ui>})EApZ5HL5B^~OFL8IGs91-5-|rMX@lj4mL>xmg zNjPNVcjZ-+UPXKcT1jAY=;wi??=JV)8?44ho=46Q`4VT%)fzc5!!W8^H*(ZA7<6R4 zMa3T2pmtVz^_e>C!*KqJA4sFyjg@{c?7ox#d^2V>z+w=xm7JMa!Cc};FnuPFv}Er( zb$oTSMBgQH-+u?@(`4WLmZt!r+qK<|l4vs6Fg!NnJGWkjCan?AB9FYbCHrMKOg#k9 zGK)6p>3rNTFyB1=sn(#Sl=q;;{anCpQ6B*EjskF2(`lwf#*xU4sFk{Z&5_})Xo7dW zzZZduk?`8&9t8q*VjT}Xi#00M76g7uH$jzi?$WTP{H~6Zc(ohf*b$K@idZIo;@Sph zs2q15VB3ArF(+o23CEpho95HdM|7p6=|gYDwH}tuD!wVEX6Z=gdltU-v+W1ZGGlzl zbLY5D>;oQz3FD>>E~L@t2B1&aBYY*`ol2H~k|8(3i!f;ax&DN0w`!X#b1GlDGbYVw zYGMVXG6orbLENz3d#@hncIjQ((eTfUt+;pi_w&DO0|thoe!YZ5*XC4^5gKj9j#6%Z z{Hg#Zjpcs4smG7S<+Y#b-G4Kq;5|1++>Vf#CcqDac``81XZ6IiOwTaS#Jka>eC%hb zy^e)k*B-9rvp}Wh1=vs+B*^4L!TQ=nH%|&BELZKlmi{Gv$sJ8zp$OUH;;<7$=7f zo!L_CE3Sxcp7%X#ZMDq-{@- zPfqQU3FI{q(g;ElQYvfZ%}P@IbokSd0i$5@@!N?tSvI=^S{vF+&Th4Xb69LD9T|-K zT>G8PNsE|zJ|b;X{qZ}h@@z}d4+vS15WaJrV#0%&Yh`|e-_Qkvi(HspYLaNz2fK`> zPQ|Lq1H(aif)~Gvd6fgtd??#?Ry#bFfmE<_EN&ZukwKk8pO%Lthm$B1zhf<3jVwC& zl^PBfC5t3ok>RJ^EqSefR5WVPtV(BN*oxW8KtAvs&4}SsXelEoaZmDZr>A#3oRq=Y z_2#mhb7ss$IUOohBL?q6{obub5P8fi;KqYJep``Fh$ud3oFVw?}hZ+1nWgOoCp=+_YKM zAVPV>QK|+}`qesh_#cWXnQ# z&KGNc1a?ZuqU(-B{p6Cz=!NUB*VE$zZ?;&Bq_Wo=Ncf>|Wr>FfIHJ8=c)Wne% zJ*;NOqr;?@tfv=tq+pS8Tx|qAv+=Q;t+8PvIUB{dhy$)mk)c4TNGI6lq6oL1g}uHh z2Trw5`kDe-w2pLn-zJI#E;8ymty5@W=pYzYfURfkUYC|SaN0p7SeEwH1aHU%{AIt! z-l;L!krtCb_vTFvLB~6yYSfIuy~g2u-yLDw2I#QNyX4>ZHi|iH5i_q8ACMqi5+2HZp%EpHT>@nvVCfr^(H_&Y0Q9VnM3mN)GdOb` zi|Fkz;ICbvjUkgxBye`--2*POI`I+4*-?snqFs${)m+s94rq4PJ-QN%`}Vz8V~7;& z%#Fa2wy!FaW~J%tIA5J^|F&P5Rd-EEP4}Ym>GTI422~DIjZsY!`vj(Oxk$fESY#*f zOp3JYU1<&EYqRDo_q=xbF7TLNG~P;QqxydEH7L7mmaCn7w5?X|9cP?@-=pCRaAh!_)fbbX^OWY0T9u~aDssDdkKq#c>+{Q0w1mtXVk`?5wbBQ>rf!m`nm4=icj349sZThHu_V)qbOibNCClDi4d4eW^2QX}kNqWP5hAI(nhv$8UTc990_O_!nz z)j6*Usceh>qornWd4WF@vv$ptKR9P%WjD!eGuuwk?p9Yfy^&p(^qAycqicYn!xfLegKxic^xp@3bMF7fB|5Tya13nA2&YezoCs4|*p>di{cBi_w zY~+T0NFlD=mSZ3My-&iTKU_{t4V zk|l_i{!e*UhDV0d{vfYKT){{g9xgy_fKuskFlR&TyI0sTIgG=`TinQ6_gu8=>pZ%T zSmfRH9{Y6J`1ekEu-HQ!!H3?GnBb-tt_Z><==?(gruIoLuJ?H@0K@Yg*1D)+6IzuU zpm-s5HKqnQO^Ea38&y&v=Z~de$s*A{1ZjEt*a8NxHNTA1X=oz)ud(OUuUo@^@hWHZ zGczT%X)Y0Nz645838z$3hehh%ueAi#ZfYvbSkf|@^^lbxZC^D;VIF0_O58E2lLwZp~+&SlJ{n=Qx96K#b41)etiEVFWjt0 zTE?!CDWqB7uD9`mXKLoYVU@T3Qw>#mv1X6H%NBvFQbx7r+-EwwPyG=kNq583mW+aT z2xDyBo2DrRr4X$}uPUw2wmqmeez}}B(I%2hMOb*(cciskQ+=-y`EsT#h0*##LEm^EuJ+t+=MxuQY33%Z#<`Fw!`57Abqm+x3WQ?UQ3Fq%u(F z@H$QT5qv%pg;2LY+~cIG$?w($Z-aBRKgVb)CHNO*axjXiO!f3On3ZF@4r*#==3X$m z@4*h<0(+)g&<&i9nP51xqLZU~SGkhHwa{4I8DfAK`I{)49~GarqViF#ro#M-hv=1Z zfrR57n9Lk~A}_VM++S_X&5RfU-l=;o8d0rnCJ2X7;Xkc^f&r>4nsn?bO(qf_a=sk_ zeKWjc$u~4kOzPlbguCu51|RV}RDU=e%Ma8?#VHe3?b$M3Mwj|lk_di3iG8!w?8IeX zfkAh2cK0mHRn0hjsTxUh)<4puU{$ap!1d`9jcd?>t*b@elxvc%3C^w)!kv&40zM(M zWL8@}=zQ$Wx14mkftLtmkUj*`?sBO+!hjJ~bAqjl+0@E8(OP@IG_1v~(X0#Sl|EV zW9{U<4qyB(BQj3VHMKg+bZYqJ!P44CNmB9(Rj7_*V%*OA!yCpk7OrFK!m+VVRHinG z+qEB;C=K6DyLw-}(?TtFlwbWQV;r@aBtyxo@M6HG5L;0vLATlV6X84$$RN#yPjgcz z@@1}$si~;hG>HdXpibjUDup+HH0`-q}lp0qDni+!ep4l`6&R zEZW=<$J5|G-rYh)3DPi@H#WVaP39wNH1RW^0n;;~2yd!&>N}I<(WbXP>&bnn7R(eJ zDv3&otuv9bo&PD%%mwxzCPP?jBRoZ$AIXrLFt}c3Jn4Gq)(yfS4xyn4u-IKU*#?h= zzpC{0NV6;VzdI}E{qddfrFpSr0y>g#x_WtFDX6glo#-K+0D;8-7u&pVzP$%q2lIGs z7QUiUcl0#tYq{%gq6ytZ-u1G{?L;=e!m;0}At_oC21o*cRx(JL($aC#0hVQ-D@pKh zqb<3LB(3F3UQmg8&**XA)^@Knr>r)!FJY*Y_9Hk&HMs6@4zlVi<2Bfw46r+89Fi)R zj@##LD|#^9GJF2M)!GEmWSZ6_LYK(5HZ{v~2fm|SG6wg?HAR&^+fNHLs1-9Hch+7o zuNMnL*{f4bkps&>C66`|-rZKbVAIgijw2l2kvANQBe!x0ib-yVUnFAEtg^=+6_8~t>LB3cFIqIl>Xcsx^h!hff>wJL58f8RN`IpU|h za^3pmbyg>t8U*32?6X)b)dgZxEpYaN(*FiN2T4@7`~4KikX}`@T1z?XBd@GpN#1)I z5BE{g9w*YmP9PDoYw15;-H}eUE7`pZ+2#ZzuJDL1z4pB*%jw99 z2ei4Cii%GfB+5hH0^89LykWc9fff9{@=CEb2N`!)Yvo=dyYK;x;`i?=_CRue|J3HD zw7CpGmRS)r=?b0BGr^A3^wqUVLc-AB-neXqv5xPkDSk+lbs4|1(_VSZ-j6j5EHQROB{?EHR}Htgz% zMO*SgFn>TP>?C(2UW(9WKTZ}pd9~@2_eQ}~O@JQH5AJ#v2AbP9a%Q1g#g-m<`VRG7 zRQO+2>SjkPSoqHbtr<77P>x+lb-a!RUo*EHrU}@FXc87aux8k=lnVIu(E-|gS~OTS zWpy=~>7wr5bB{psoefK92o(OCqx!Dx^s9f(&sdaqjH#H=ORTjO!bX}S*#E;vC zuunMF7bNa*Ji?_Ak-^D&tDWeU0Rsr3dT2HrvZCz_TyylJ)ACDiE~C;;dP5{^T*KWP zAS0r|LYsYFD6HucS~?9SghJ-lyfW5Kx`2YJ(PQL!;_EOB!fKfxp-C zy5=3PO)x_eTMCQ03A*bx=RO-A#pV4M^2rE^{0CAHZn8)7e zumJjzGw1_P!}V8D5Qvu=Lz}V#Ll30zXg6WqS+0k6^?M2j)9yLGhor5a?hxjZ-4x{g zGSwo{IKT_IZaz&MNSMA|)eLXsB&YAuY=J9T#opyxXgHdWW|nfoF@GgFIDo#Q^~Zw{6`YpHsjr;{vlrc7Xs+URtF zks^#qol#}K`zrlgA88hv5BIwZls%LdJa-qJXEI*1<=yTe57~oIQ9#{$w@?($5M+hb zHNSm1nlA%=Lod8=H?7nf+=i5CV=)@pdH6W(j$hj54K4Oz_F+H*m z=M+Aew%-*A&)VgeIIcOJ%{glFg|w7|rwhi@K4I{UfWwHu>IL7@x=_tzbRjHz0h}I9 z%QxHRJ`S6%dwf=5LQ`hxLT5ki7d~(DA@aNgLB9r0Z7Z*&G_-k-Rj^HNRH9Y8!-@K6 z%wz#FD+gmFz6`c_q~6t02zU>qLvw*G}Pm7G(lwHQ=v%3 zb?gp-mAB+#;<8~E)$_m_pRdV7(O*G=K85boV1^f|Brfk~&bPm%z}q7CLHc_KfW%L= z_@kAOtPq9+y&=}|Dtf>rmo!8X`jZlBYkj!a6 z2MyP4Rgj^frqk*Z^yXajy?hc%*P~7d(U+MXAN86-4>`e1X0d~i2h}DL{irhyptP~5U%0yqO(;?W zcT9}9QPbmxV1N7Q5~X?;rK~-t*35OksHT`S%JUeF7~3&QF2D-u{!$4CjX~)G=~;g{ z9ux~TEn_aN`?HB;oO!BK7OV}L=%y4} z*HMaJTrQ@X;hMN~0Wq49**vyC%yDzY3!Nq{TNvTRaCWpo1dE71pjZ6^bo#|2TN4>; zfhk0s2Cg<-=Um6d%;c@F-Z0u#2~Y=?(r%8pQUCCIK&LkCAD3j-`lh2-rC$kRot&O) zRgs+`Nclb|Awd5WtMt0=l^QljxqY~3S(u_fM23v6dNZs8sR!L3q(AX;z+8zvGhdu{ z3VQ-VRxN(>Z93i>f1n&o{Vw4Cdc^Tzd{kyQ#g$9dtVlt3()X3JC4APfh;hG@9lLG=SzFn-xUCcE_QM-A6oCAzf$EgA#(U;d&AKBDk4N=$MJbeBS{&>- zF=lH|-2Pc(x?K{h9krE>wR+NOUdI_Hm$@`Kmu*5M=okk=E2)?MYZ10`tTa6*x+?N7 zZi*PImNR;`NE9_9#BNmr&*%CwiE{@F0AkIuJ=fck*< zMVcZ=JO}ZXQd7U^XW?^lb7SLp6a!#$0SgiRo>5}n)yJSWq>3LnE~5YSUjVIg?pi6LD6XeXM@xH+79e&L-OmQrA&-{RBbn=11 z=X;$5rE%Qx*`vP4!v3qzGX!)O)u;Z_1&v%&an1BK5m%YYk?(tmX;TO7RJ+m_Xf|}T?Pl;DQW}%epu{m;7+SRglctb5_dQPXpz9yeVrfj8ir1jqj7Iqv>@HJrxml%@ zLGPlCpk29Fq!L4`h#xjl3nsKNrxZR22m!U!+^x7zG3RDg+krva=kimfsy;Ninin&{ z1@2X}8$?cT0^r)nD@j}3;bj9|J+K&6-`0}N@Va(6e)DyL*b={G*W@#q{Ydxl`9@i9 zRMk9fUm}DP?X(NT3w3DM9|8%>XjqiYFbq7`Y{mV6fPB8M=-lAhOjB?0%Sy~9ATQhU zy96HcU{uiSK$)Agv;NR8Rk+_?@4mN^OomT2$dKbnX5r^BMj4|I*%IO{EnxsGfh=;q zef97$Kun+F@x?+7lBEj5w9XxmDi+E~(y6H|MLc84J2M+GxsC1!3-*6H|x zJKriN(X@M*7W8y3Vi{mFdk1M8L4r`RgRN$m!*-;w4y^MnW4}Xy9Ji)E_<{|=;v%+z zI9epYyGhx6lcL-CTvKK+U{w=88&46z#!hP0Me&t-|-n^gFWEtuFzD%Tk zAu3S%_AJXHD=#oDDZU6g^Adj_R#j$IW8uT62i8xC@7MdQPNarJIjs2dV5v~(iy6JI z<^|=xPZTzhu-TLrxtPhEF0T=}OuD*H?6MGX&;>`4v-?yJ0#j zb%nnkLwjC@q@j+6c@QjM%66nY7Nn-W$SWZSS=`64+Y}uIc645zw2XO?n&wZ2GiD=j zrmFUQ@A4}L1nv@k= z2X_k4#$0Ia!2`~UlK|dLa?>jC!P;+tHaP5@h+Ve?zfz~C^u$!sSi*p6*!bHfB9v=d zivCNu6;&pzWlE3XF*U2}!EG@hFgDQtH5GFP%SGo>QC?nczH1>pD2G|E`dF#1n^XDz zS$n)v@p>YFiu@5=oS7dF%_{X1uI2K4@vVUBslB+KTy^k9vbO@{J5AxU9>nF*pyAu~ zaol)mH4FrJ&?ME4Z_|C_VmYn3_58Nf8!u1xi+j@paJfQIEGrAKi31%{lMC*NKY zU`yde;>zMYL@Itvpg<>gywi;kFdJ<=za!~UvRa#_YLvzpcJ#e3?8rTs=H67H3?43Z zSKfmlliQ_8=<0!9b1&+l%&lWaK&Tka|7!R}@T=nqNN@36__A&fUEngBom;DLXd!!ykTG zW(=ez8h+vXSjymO5?L(vUUWml=Mx!VUn~mgm7+ivvcMSk%EL${0t}3|47*0TjIfBp zZp-SEL6rYLWPNp19L<|GFlcah5AN>n4#C|C?(XgyJh($}AKX2`-CctQ*Kgk4{q37Q z-#Puy^r`BqM`}*@Q}^EL0FjqlK2KVdzroZrn=^9K)Sb2Zhd{Th?78C~7fqFXOgeio zlKW{zabuM?AwAPOH283HMiK=C^RH9~+;M2?W|ERTt~EFfR%wr=TlaVdt6CAj68YT+8ccCnCxs!~`j+Bb0rmA|sz>qRY@T}> z)7l504#tY`HI{?o0@xiv|Bw6QH_w#oq6|X4Baw;v~IqFTDfxHE4h~n7~eS!ITr7DnA_8i z6cKA7dg`@nH@P9ATXipS%E7ak>~7|KX>nD{y?&)T1E1gaS*hK*(j0?oP3-v>3uk3n z8SU{OTJ1(dG5~~fi4#sF;1DU4U!C?2P|B+B( zlfu7<6Di^tbG<3Fx;AnST)R}Q3g3{tZu>L@(!nxf-KyWf&~cLdn#p;zg|yx($U&vj zBb-#U5Tsxixio`4?GeDJXl-ZvU<^{h@#=fdUaFvSjN+xZNq87P24?o0K``$tgTaAy= zP!735#QMuF-Lp<`M;MlIut6_rR9c>Y8cC=z`5FM;m8*^G1wBDi1{o@%WEFNVqlg@d z+x}QRQ>@h|?)CiRvyZm$v0(OzjusXC`UhwD?e87_bQB4%OnZ#y*Exe9IA2!|0T`AE z9$T6X%A&j;ZHx5OYMg{n@co7cZ$(Hq^^Gq`r?}>w*QX#H;IFUDd!n~!(BXz1-%T%z7PTn(#Ud%<>DwQh@NMwe!@$FRLK=cT`OFMt z3vBH02Qr5A+~u{N^Rl|nlyIeu%3#UCV`HTx`|N~aNsQZ6>haPBUrDd5=A(*~d4dw;Q3Dc<_M$!?4D zTbUqcARL^ypthnJ%HRQ*9DGMf{m(f`QP_#Rp{8u&&W|9Zl*d(~ZL1G8l=QDn1Y+6dlFIz0J(+3E%E;;3qb(Jd|reu zwFIsRM!M?iZ9m>aTAacZtU7lN0xs{EOX4}8zGZ3W`-3(xw_mP85`M#G<98S^ov*dd zxnMu6jzMcF*B!G6vqlxtk76JieW|o(Xgh4Tu`Rm;y(^@pM*U*f!s!cRouyo^*ph-d z6Esxb((#b}CfzaNwlw^D$!>sGnj{az@)ot!9H}jivGfWe?znrQ);9O>6&y-${A{Ib zt5e88uE{=FM%*Q(+i+hNa?P;SwlZsu-I^-GrS4R$_JVXiJ6j^i;~!D9S}v43^c|iE z^v;5dNOa8_${(d9H1N@JG$K$=y$*4v7~AJ7j^a-wkqZE?csGdplILhI9g{+msUrgT4vrycqQ1Z>Wu{Th3<; zlCkHhqdLUdJQLi3S@1Vz7>P-6bbHWg0hIQmkSk%+F7DPKRh%k2sS)I7o^bqA3{KHJ1%wpRi z_}5Fn*X@?g*p+l`shkG37`X@<2JLvGj+8UViGYeYI z(a$z}xz$oJMkgjbm{b>>ng$h2@HjNJo%ctLyHv@k4Rc<~WVUAYSYo>KHd@~^-ozMj zU*QJLWpH+T(bzuGLUN)^M`;^;7M!p{FrfDE^=OkkqD15s3uzHX0y%|=xZg|#jCok}O!ubZ3B9j;J|kb)Ev#^N_ahAR z!{hGe+fK3-^CLt*rG^e4*@&J9jYfTwQfUl|bzXxe@e9}At@rgXOJstHIBNFoL$f7C ze|aFRGv5gIj{O8|7=w|oyMnHS>K?S!Gd{tjz+V;Y829+SZtU+n8kU+IpKzDTyEDo> zisP1~?bQp`#@%f(x?SL|hMKie`2Mw6!P~aQ#H-9T^NSTeRc{zOtnF^E31qyjZBcw* zrXZ?WOXSEqILs=18B1NKE#DCb12h)ruOOH~WMA#}$tr{<^UcI?iS#iNC$DgC2(i^q zL9dn}#R}cUaW()f+}Tos?Vm35fS#v;bMPBQA(Gr?4}nP<@7$t0xH$Zq2KPe1_V69P z+n+J}34jfqMhs0MEDS5TO8wW^!3i*4nVI5jBGZ)B|8r# zk4((F$G+LqR)om^Mat(EtamFiTevl6q1D2qp_a$j(vO-P)4oy(8Pd*ElOT=WCF}?J zJ29?%(yQw>Dnl@e&-a+bzz3Ynu_mp70|AL*s2rs@s^bv-J-NRCn#zt1``64#`FyMs+P{6 zx|nu4R~PTVr-Pjm$2qy&tJV7+Bm7DYZx`3VY(-PK=tmhp&tT7qL(-dq;);9+cG&cF zpWG;Ov)QHf{y~8fIZgc(cXss0)V1^RT1tv?xO=z{@)UHApEB3X45KC2sJ`slK%jq! zt@GD!Gxeg7Lo^)w?0Yw5>#cPt*}|AyV@nF;_s(V_+$Xu zp4drQxRJkvVtu@xC^k+ly!j^h5CI-@u)^4U5O0xcrhUrzWR)lJyw3RarhvFV)*|z* zP)c9Fj0!x3I+28FGoOl&x{t8gGMRtrYXQHL1c%qo@bmp*Wp*Hd@Clewm5mr_DrlJ>`o3-m^~n2&mTMSt>}3WJdF-V2waCJcQ?kf$Qf zTKG#pWw7sFCK<3#B_dyY=5CQX#sMK~B5nu#1leSTifl-yVsA)t65S)ES|ZVi^MKbo zk8Jfpe9!VgYz$XVPJ>~T1Yg``fcs7xijW?a;2<3e+AN|~=vPq#&PRx%G%7X%F+J!n z7#CF5BBo?c4_zKQYx`}M!bCTGg3Gzwj&n#EgIDwcj}I)&BW0;7?SoOZ=r@H3D!xTi z!vS2l98*`ZW0gsw?Sse}<{De;M@-N1)JG(9fortv0tSMHqWlb5qdFQ({d-I%4Yam9;~1h1E7>#8rJ#Bhy~r)w^> z8c5NaUUg7-BhW(uJYjRmVQBH{Z!k$Zedi*=P^IK_20wo4qZ5Q|}!T?QQe# znOmyDnvegpOKgxfu1;5utM~OQL1qPJ22-B9wS>vm=0JP#OLynTBA@fa+e5j-89@7s z#{OO(DoA=UU+ubQC=bbI-_B#xeKwBkD__8Wt1t%9ljr|Y)|jnG_F-{ zV|W~6to8yt?3Nu_zzW(VMGWFwHe$p0AO#2~4;ZHRsaL%>bO2$`d|S?^4H&y0O*Rk; zbWs@DKC6of|AL|FhFWR*t4^34CcLi6A zvjfT>JLuCy4Ikh!A>~WM^PZBJCWS`di0=7B-m3;T6xY`minRg z4COU9UOMuWeU7p^yrRg}cw4oV7v81YJZR7j1oaO#>C^?mMlxSALz@2}?k*Px{ zi9)uChPc*+fWsuEd(mO8)fuehXH$m+eDlT$U3}x0uPgdYxCc@j^mCkl4vv}5IjV5S zel-KUXD9lh;Ln>&aEHdI&tq$FRbu6LW$4t`ppVGDjwpKG?EO-nNN1Rm?o2kw60~dY z{J8ii9`PZ@LHa5SnH07JWYq5beD2wm53d-;GHARyZ*{ZDcR3O9@iJ{7D(8YN@IXdNQFPySqxm=`r5daG(yDU8hlSD?%E(5cd#1MK#B2ZWWS% zK#3WX!O=I`Nu8pbelLERm9@R*B*19^PL*Mgf#B1zDG2_(Arm!Ij!JGmSeI0~9wI8V z^vHta$8kV+vQ}1`V<=BpquZf448quig7G{i1UYR7_VFf` zxu;U?6ARK1UrOXL+XsXA;45ZjifQ!Pv~Mqn)8MYxtqnO}EKH1n)KeGkJ4C$UT3H>~4 z))?%Z)|anmYaKr5l`d$Q#B*AA&sW>zwrJJWZa^Do2S;pG!sS!@Wa3fa*19rh3J`Y5dwIwm>I=+g3 zGTEKJ;VQHK*n8v$Ns*!?fcgEo_4fCb#eQ_)B?-vZ5FU|WVLkrC_YN77Z|l_x<&-gl zo)_3pa+P(t7FU8#oaed=sNJyvVFSO-cu9gWwwDK` z)GBX|H-Q*>xHYxMbb7!z|_3OjFR=MJM4e zGe>R2SMXZbe9>oPH=nCL*MV3c@`-s(=&ahCG3g1M#&@+i=2*c$*N?m)yp(IE!+}_K zrXp$Ov80#mo$M8f2AiE;pD8FLo*xLQ&2u|jVitmlKY7^>0f7gu2T^?|Iryw zPMx^{DQ?V09?IeKrlpo(Kije^j;41e(XA2zJsMEz_IUP75+WMHe6GEQ9&`r|wS_s>&O^A5lT6di@ZnYkqN@Wk$sd*ZsS4> znlFQ{I=*`Q;hj1gR>V=eXtQJ1{-lC=GhgG=4>HIEu~46E*Ojv$iH4E|+x6lgI-5cK zy36EmCDE0b-T}O}tUu)B{%GkG_|uS|(>+TH)S!~o$~Q$=Zpr*GP>@Zd&)lg`WbsOq zBlSZB0j4$`%-njq0dIV*n)K%$kj>7OffnytS>L}Eof!l-4|rSurTL94=YST832SomR4F;_&- z>uSqHe;tpXxuk^j?rp@QOIBE8j_eC{VM z8-;_3LB&#j?hx{FwfdRC9%bC`oOuzIFxLGUk)%vsxw9-c-1NTi8;x?UzFG5L0axX% zq^d=js!$L@Kb1}v%{m*(jGUs+4D2xBD+9pk-dBoFxP<+W3k$7k29RLAq0 zHF|C5dd9O;)wRc!`W-F1+KLl(%LXx{+p_p{>g_4!5fjiC#Mp+j^EW$W&NGMB)@$@2 zO*@o{$fHiLn5r%iD^HVwIQed&t|YdpAtk$=bYYd~#x$-(K(%aspfBW^(Z&zc^nA5B z~Nk`ZlFW$!bFz)Y_ZY?@YOS%J0CX{Y;rJ{oPO>3Uj`$3* z^?bR#iOL~pJ7}ylE(@dedxPuAmz8$6%I@HXs`;fB_zSDM+QqMCAQorVxbFG|NY9mh zpc`{_-lVz*(RygS$h_janu7IWY%|U3#ZTPEV(A^SFZs&g)mbHrOO;mHr<7SO7Ir@h zHW+5zgPP;osq@XkZj3*YehT!rRrnMx4NLiUaG9a?#w@%+M)bDcN z^=91gVIfcW*t*qhJ zZ4L-P0LJ^h)8}-vFvzJ5YYM$`JIq4$LN%H5qC1Q^h%}{9yrZJ9>{56O5Q7c|;TnH?&6*AsmG3T>JBiUzUGQ$l zz)PR7mdImIOTpPJ)u`JpQnU1oj`wk#X15m$(rQ+WQoxT2_ZXCW2Vc(he6KmsqXY5G z6bEu%PuS2$re@WPn$temhf=)lircg9dlKs9sDO~WMOm#5Yc&_($qGtU^MV}CkCt?X zpivkmB^UBalNY}0ez`-oi@Jv`)$%;5D1gj?Pco=vWpU5{s0cvD#sX=G+fd%mrutfziCXjQ_r=n;G~OJkHsWzZdlC7xn;@UL)f>yAMT z1hHw;%w^qGxFe8>S%-K{2C3U*zZU0oxVB8ji5kgR=03xUFd|i$o6Seg%vQKaS#6ZM zwJXLp2q)dmP~fN8k5|lo4J599kK}Ui68X;IkVfMKTPKW060WJYA_3>PEpt`!b76Ge%cFqb%}iOTZ&JWfO%AKcqx6Zpizc}SbrX}|i|FB*Fa!%_ zEFqhQPIH?cuSfT43d6WZ4((;<(@h_%8wxi`k!$bibVXOw*)-$E_VAx=kVY>j9kOgk zVOm~LNJ))N6A=jIZFK_TB{K>Lz0ap`hdPBLK_YM_%F9V%az5TInfKJXwxKupiU*J* zd!^9gl4oM^+#pBiKGIJZXM)2(1JdMe=nh?uCR1N^uwbXy341TPK8Ps3lq^6r>gfxI z;~9^aJ;+2Hf%c|8x4QPMK)-8oj*H(0_*!@ob6?|>k84tw0o2gR>joka(!K9aW!{6I zs=I_O`{Kp`ZtObsmTq2hZ7mZVlD_1-Yk{pML!SnqcPDzq1wdZvyo-=cHN{#xW=ok_ zM}9_bU=2BfrWivxSi5Z3U*iqQD(~o1!v%3xlCH^Crz}kqw?R6t3z5US5_0n0>av!t z)`YBy!RT_e4+4(0Ndc5}O_@;eO-j^HLiuhn3HDiZt6Evx>XY(VBi0>e4M2}eA~wfT zdxC1LBa6j*ocVMrs(*+<7I#V;_R1^Wvw{If8y;GMGvEuS$_FQRGE5ZxG@Rv^Liu*G zYt~0LHE9#Nt=|Ts&ph3X^J}mC-6=WwQjg~hJKQ^Fp6N0Q90bo-CL#@F78nx4nIENC z;{3VLSna|Qls#Z)!w?h*xKv70^2jzEE^FF@qSn8Nz^GSf3{k@JPlfLNnex`%OsBpc z8Gooq3z9*xvyWM%dpp19b7+KPd-IQM>HD^d?0&WeO?p2HeF%6#W+xnLgo4LpCmS*g zFL8p!Lyt;HS(sJ5gGDDW`(El7#!IIB(WFk_40u6Ip;_gOJ`07m*^yodN^iBN$*DcJ zbs7*FlsXc@o536f=@if}h)EP%oS&vqKWHOum6)-JP<@;&Ri{Jo7IdmRkqX`|_gsQi z>Ke$3>BkfB=&Y8{FY4M)l1 zPvP91mR@$&Y5r3q#}6oe)+(%`uisQC^`_DW>o=9%|{Y4hmC20&&%A zbIlyQJ`0@|O=0^rBX80!e4}+5gE%mTfPE^dl56&}Q~d_lb|`Q!LRB<@#i(c2o^);1 zayTL$1xNbEs;;kc>_8g$7N5f>&&7tjE9lni*}uh~Lw|p!s({k(6)6-GwKY}@53;anjeAI9?f2he^Ob0bb>ZoEf z=oOkBp{vst?JusiXCV_dZn&SJRA({t67@t57sTEl$kZTl3Yh98sqwHVMiY3S3Pjm~s6xY(y zkFrl$P@vRGRAQCtN&cuc$E8?9Nk`Ib<;qmK4}n3b|3&yfOIrS=?VIgVAM_2caw?(* zatf^mZe27q2G@aPy*Wm>P21IoDf3_h&}Yj2Pefs7;=%m9g6!#+18c%7QYEct5*>6( z`9!%aE;bvo5Vnxx<|TcbWfQBXs-+{&MB(Kmh99rabSq|9Q((?=4_U6tP)A~%`Ei77 zla3JxNO;W4(nlc){FVT^5CQ-X7VNm#N`_kg=o(0Cd$q;E=1EwYL<*(uCqxKd=#wM` zO**^Hk3m)m!N;u#R+~lowwKM0U;WXw%pvq?OU?%q8E8js)M>sjh8VBcfngWr3=gJB zA+H-=Q-l^2QAwtLl5=p29KQS1_yCuQGzMD|q8}69=nFm7pv`_s-uN;G$=@)ygw#=R zQ8&kXTO19+cgICU#8y7UlpY%{n!LDPX`GPS{j`c}7Wu=`cZ&g=oX!DnaZ9*kA+W~a zT?K21oE2FdE@{3sfXx&c)q@}InzA4U8GBwroU4g?A@X#CC_Vt@^@!xvxLb88AFs?z_h__C278IR&S#f#d7&VFQjZ7S9&#vn?54P+$F_K7Lh+CO*|Ad?NDyU* zH4VZnDljz;lkioJG$MijzV42JKB-uwi~nl+ZDh5pg##)_1|zu@;t76KzM2YFu40zr z;A4dkxtIC}1414onsh<QIII9z1uC!%2p%F19~YAh!R>Vo~J+dXb{^)~e*6UjOV4 z?#nA9l}=Bmm9DR?(Mt~1N~AMY+Seql>orl;I;~BAaPI~}K7O9C{X#?9iD^P{G$>L6 z@jkh5YtVzQ0$o5M%MuFsQn-W(5AlhdkHP+o49NJw{zl~!sZ|?Xt8+)YI(3w(Z0F); z1CrB?&yfSM)|(=5wKiEq_x201thsjR)_?|WJ(S*yO^2IT47RvUQdL`}a3*=+N^A;Qxk5Y~YWoW`6DfK-O> z2&&Jzupad_lc=7tJ=*}!0gZUo zR2ha0uyK!gFBGvES%6fVs|Q%P&+p3ThUqeUrE%2>zn5(Ai43NN5{Zc*n8&Y&jtp13 z5RiR=X*Nj$4uh_78=rdWL8#!4oR#hO5g-3iu-=V=k5?k=vy^+rGcC(cxAOjI2@!YS6 z6WJBN@aw13sIJZqv!Gz!sS9tL)XPL@JN|KnIqHX`BdpQ`Iu3k+g5PO_)+;Y8DmpKW z*-=BF*dfzvFq7%XAU#*e;>^^duf%rH>t)_wukvDR?AGZ==cVT}-GqJ__e zu0=*-awQxX!(N3=p$7ZVairMzN_KAQ4G2sObwIcGh6NfQOyzA6eR8ZHfI{Ok)WS2m zzDGtms(Tj=omYM@a|IG%*{!QFSAe~=o>X}Q!Fs>PvF7`i?8?!kKX*rf?Z=RMYHffH zbul{#zQpxyRfcXAzGnh3-s0Ru^q6a4`r&+%e80ZFP9r`Ak0G;Hd%3?Dp+5J5xz)bK zhm2JFfPteD={UilvtI0x##9?c$FlP6pWQ{0Mji;*Qch&4v@xCN;@4?M>Wqnw{1 zaU=OVY_xkc<70c0=jR&5gR#KhSF5w<69@8$8(emGDHI1%?UH+*?Y-IK|0X6x6ZBuN zia=q%o7Y6Uo^H)*wk=J2kZxx7IRiYPHeps(17!x#V0#Sq+du`Lmr!aEo>qq~`ywmj$o=jF{BX(pZhD$ZO&a3T8V6VMzythNG-$or;=jx-pws~0W#fA-0S zzxsc?c~l~c|CIG(4mWSqsy8|9Zd!mG!bDW7svN>SkM2gCzzc;Aub-&_DlTXk2MfZx zb2~U8imb6)F84})uhWN#_KRf33yNqA4TWqIm15i$4JCDn%%RKDvpOMjF8m}9bm-O5 z)g<0l;nMqaWfaZXfXS&ybtXrA9@`@Jq>MD;H`LZrpvc`b4RZw+1EV4TTUJ)oe^aG` z*G;|LIx`WeyXa#;e^4FK(BDy|x4A_-rgRt#v`RF#jls`D*_q+c2euLMIqJ?RJWVjl z+6}U<^25*2i4ah*N$JL`52ScV5BVzKv7V`GT($#+a1`DZdpYp^D`7WXs7h4&WY8Je zCPz`nL-^-D32y4x&jWrt{RD}8FXWgd=#yVf$F~=Ks8{POTu_vwKf`GCDMK(GvmwPa z-RyV&lp%3U_?hk2W!cPIg1uW_Zkbha;__1y^%ET`y^xf;rHLi1`c3ht8W8al+60~m>L8V2GJvF1NF zW05KhGAT3nYzUJ$s-z2(rvB=7-C2u?!J&jA(cgzF2&Qsk?sL#WXC8z;BYX^j0_tqA z>t6Li307|A*CUPu(T&F&Ke3IMhKW918wKJH;-C#UQ0Wf}ISLPjl!ip0r1a6?SCONn zdw%M3*UBYXZ#;`bd?GV&Z^qbPxY2!r5b2x2W1^&7)Rh!K8X+@W??k!62Va|&9U&{Z zNwC=A!?G$)L%QilgyO=Rhx6)}!mtC&lK~cTSHqX02y!1%HRG626ZRu>5y49A2N@e7 z=(qnFaH@M}P^PDiHg@K7s?}FiWGe4zY(~y9Gl6v%H!l>y;cps-csu5ZDeb2I+kVysHBISpDUDWr zTpXQf_ZvUW5N!sJ-zRdyOZ)Jf+${*4!-P6w}x7(*G7@XZ_(Dj!oqL|KB&?3uymTN3zk}K zPsi&=R*A>~j+&0GbmMR$h&}rI5uJ{kIrcD@;>`Tg?Q4@Xl#pdn`WuOcP|T~SBf0W5 z_>$%*jyZi|T;nf&iO9(lf%n5=AE;+OKO_N7kjM4chT zixBS3d+tD{zyxq>UO5J?yfUM08;?vfoV}Etoe+31<|(d5p1ofL(BJd)y=|;u9nTR? zJ;lF=c^j$0Xzb6qJ>cO~F;U~6$?;BszfJIPDif`zwZY||(`YaW!>+o9z2=2mT8VrHH#dP!P;8)^^1jV^kR1s@p0E+f{gQVOnx@-2l-Xtx1 z5HST(wtt`mu&||pr1RC9ns3HS4rZ@83BZu2djDs28{EOo)#jfnnq{nsDl5u#v zK0LK|;M0;mK~j?hJgUWEK%D3|lffg(%^#Ip^z_ylDNuQwe6_cp`v*Qa@{Yt^oxD8Efzlkm~yyL z1vO(Wc>(p?ChSMNoK`gX^oL^Aex0YGrtK3g z<_c=MOgqv4j_{qBQLpZs$uaZ*W|Xmvd*9H0fnJ+)mb$~n>XU`SX<>H|s3IdnELTB) z6HU1Ei-iM{+t~P5^g=SumN7$EDk4`l=&O9?6X5C7UiV}`)d zAd0=m>txDYr1cHY~%ImozuV=oYPS4X&md}Uw~b{yu*Z@J&@wvT{tbP>8fqz z9FNi6)S|!GXx02mJqr0%UtH{!vt&2yCa(`edB#{Y?o&D2c#G2jG`eVH#7*G^3iHc6 z8FUP4&8Q>sa!GKzXZ>!ZyK(S6;1(wGBc$$>8hyRYC~U+Ug<3a%+g@&-RJqr^Y70&z z3KgQV>{-2kTvKGI6Y&ovF|2#tW`V*^^77TV_bL{UCrT%%W!a2!-7KjV9R*w7s4tw@ zYGC;8wv_SvyFYsE_W~l~(v!obcebfXHfAYRx$Zm>JgFsGXxTvt_auakZahtA$q2u5zllw z3MXvW>sII!ak_ey-?!kX$wP@(VcgoP6d5Y!!C%^tP ziCogF{AH>hopT3q(YOxbv(`*8N;fx?N?s$3-|~`5;`(=D%0!cR;i~6nvK-TPU$y>r zNYmhZi6_)6I61pqelNFBlD=mS$z^3CdDcPkDN8qG$5qIK(HySUNtNk8;+5qgLJg$G z$#Kd%-Y3O2QD;KOm07ph&+H!DJvxLQmk8SeIWh{i zU{(X}zcEWnehzdm)9MmtfXT?X4IzDf<$aCI+yR2{_y}BfkuV5U#u~J~ZFPDRYWijD z96{TL^x41bei+?gQo_7l^$`Db_(a8TznJmM&*yT@E!@UxtKdp3IHUh_b){<>ecDFf zFGwy6gp&RPFtOVVZ3M$P&=Dn+hE={Y*>~`a!Z^>v&hj{E{SvU%fA|&b^;7 z*IWvf8Jid__A3@_gHx%M0o{*?6SRWU!<@w*McBUgZ#l3Gx8z3f%VTYutQz#dZ?$<;#AW4Q#{GO%xo(H2%nO)q#439 zJXyVV%>;-WzT?9@^I52w-g8nG?}T5h+g`z)eFFBWmj)tP4F~`jAsun+3Ot&hcY@B2 zGTW*N>Tr%C<2W|8gwWALl|AIqME=ncQy2~8<|pK*4JWfr+2K3?V>%Ms92J`(&EeGl zc@2iNOluOa7iq*u8jsE(keo=d587msP+15VE^M~*Jy6Dj`|F}rUcX!a3Dbosgr8I{ ziYZ8CCAF>b=v2(XUsn+^7~P(^;?64tPLxROA>%6Y)d)&rOH!NpX)0}5b=WeUb`_b~ z3Ayk9ItL*<0#&QY$v(YOS+Ukdm7XZ=rT-281|oc68eDJ?~v31dd{CnB?agNuf=*dMicHT1>$`k>`CEdn!UWx&Jjv$!f2wfx%swGTa7m!P^z9xylDOVW;hKCFR z#5lF&pL{TrfF!+3aBOAxr$dMXA}A0U^z4!ji7SnLD*WLBBwq#EA z%AHt({|NYsfBltREtuM~A^~66WS*7geRH;2;XQCYS$NA^MlNX36AgbrkVBfF{R%{B zxm=zcq*e5P-4P9g$GYkNY7PGKCV@4+b^1fYS?`SBYS#=s26((<;t@BwdjD*f(-37^ zcPpaza|U;%1Voxiwr7qaSMG(vm9r38?mKb^NiQBwM8>=})1ol{j=&#UT{tsKVLXDe zVW4a^z8Rrx?zF6@53C5ttRL7pjdOc8BnZddstY!ffYGzPj%X%ds+OyBo$mxh6e~e9i!8s`Qnjs&+h(4DA5%i`^YzZN?%zOTZ0^E z0)lhd&n|2EvE0Bn_J=U(QDg^>p-SWT>2}Yy_)}VN4X8sUgE0_S=b@7zTswjjcNv$5 z+#_r4ts2g4uHt~cD7#KhpBq=932UsVif#)aY#qfU0(t>pl*2n*@lFukV*DI-oAVZ> zwV*RS-HmA&5FW^c21SU^UB#$yiwd9U?$Dteeh2KNNMe4l_s0QC{EA+OePm4x1SRrc zDSf8>INjkmHEz!sHv?wuTO7h|c}caE^vedU5> z5GmM=4>Qm}Nn;Z%gVUYI=Uu#zm2=N>VZ%PLh&}Hh-)Vo-y8-~&fR*MWTkF~M*P==bh9pU^qF6P^7Qc z<3>Nu%k;e`vqSC3w)f*n-BjHQWpV#5Qh+=`LPQ`E;hIeV5nWLav0ZWp^A|8KCVIFC z!7$JG7pPg`twCBi9IO6MsPJmb?vP&BN=@MK_^RARXgnhRI z$UD|jsflo~Xs*RGKajX&j;R;=WtzB`c;Em>^8Svmtgc3h03g}najvqs@;f}#dmH>S z=c2Aqow$J|b|mE4i;kj%F@N@Zupsmj!4ZLYM^K3ik_g!E8DHDN2pwA^8Y$iUpVEM* z-NPteUMn)8;t=gkZbKEU>_(%ADB%ocz!}Xcxcz(Ic+JW4bILuSiExtUR*WFR1;&Kf zi{x><(9LO=B)4_Sp|v|xsk(`~_JIO)<`KiRSL|!Gl1)~=y)^ROqFkI(6|cD@4~g%z z(mJ@8ZU=2ZU9T5x44tG^9pRm1fLOqwU<$xZI8Ss->_eCb#n;WnN%DC+789%PCsFul zABNbm^qkiM^=vPQO2&9IC?=~XSQ{gr-%c*1b%;d7ZH7KHjqQj~BcO#kNH^KF#8x?A zP#w||qzbbi;ceVs%+1@1nA*p}{qPBsz8Kw1DT5DsSvT|BS$;cjWf1)Gc3ef`1IB<0{}NgR8K8_SkPX(P^q+X^3ET>tU4x{Ah{v z+~Zg(-UfMAVuSfpaOVtHb_+9OL(Jio@6)tAm?2b|Tz|2Ib`C zhsq&VXHQ1Bi5-#hkqd~pp{;fdA~_{>dHnFIoF;eM4~x%J;_~{Wz!G>?8p7rDVn4>| zHyaqWI`yQ$x{}YQ9Zr|3E0Pns-q!W;oA`!)WQ}e;UPP)RsEbq`E})}M?!pFMb|>zb z1ftKk@n`{#IemGza^S;NF5<=dY{mGg4A%o+C&K*RPx!2! z0#;SKHF{;%y0+4lZX`c^>sAOyWB_Z~mlwC|TN`(GN=rGVs>rr3-7kL}$DLYyRpplS z7w31mz4+X&n1tfR9Lo*{hrZ^sn&Q(t#$*1BO4l)%bl*RCkKelR-EecXPn={yK|-ml zgEqCIIpQup@|EI25vq1Yg}HXp(;-En`rz%DI5R||vZEp_i&gYnf8uj;j1AxoIt}q$ zgdRJpeBe4g_Zt<(n7B}f~c zdx}55c;>xU7NjcHk;L3uKGK`J7T}On^xL@ml)~6T3PJ%x1&QYS1iHkkGI&Xiq(f3OK^|12wYlxr_wH- z=0|!EzD}$O3En(+tgUc#mq@Ae|QI&0*Yq{!p}ATe;y|a$P^zd-y2@_COZB5U^as zUBB}i(GVZO4wAR+-585M8(3NO=|D))T(F^2sAGuEC_}JFc`{45 zD^hyPtZ*oDa5R!2d8J<8EH*y|Z4opQ(C`1gf)M0-`OcXJu=1d&{`V$0+UQS6Y7I7* zvj+Rm!Vv#+CH8?{TP?1j&8}qv{~7F`i-Zk5U+dS;>WTIwuzzOz&m{~^C0zf#4?l6} z-zNtBlm(Lu{ZeJIxM<$>KYjn{j*bHA4jDH}`#*jE>2C44*G+@Xw6a0*ud$Yfq{^$;Nb1xX2FtXn14Ny4J{wk&{lmh>aT{V;5r&0<(dZCzvjIH z3-VbDmbu?wozYQ2MvKRd{rKBxa*)qfbW-mAvQJ(dWFI;QWu@r9)6R?nThjg|Up?0T zS7*x4!V}h%wrU!G&jtWq)A$`%C&}%vV9Uz~rY*>?1FP`<6D%+|GgkNvxGt$`LBj%|J9I#y7KQBM1ie?HMG-V9KQEm{_6`+ zA~}Ne!qod{y-XTpNK0)u>8s?w%`X2hvpHbk z|MK(aZAxJ-FfK&@f7co4k-QMD0N8d)tE)Y^U&>rkJ%-^vPQ2?bvzC96E{J+D9 zW`W#j*(zl7S5!dlOgPH3BEtUp5BZ<}jA=@c!&c9yR+InNWMO5{9|7X&q4CbY!;-kd zIp!=(+xaYJ|2qaNID9(9FvuFG=3;A)>VKYEpFt^^o zqGsiMZJ6o*^pM;Brlrvs8WCkSLALfloF4K15<$S1X~uv;RJumqaQsmwfZkFWNZ4bW zrERQf%X4f)W1IJS=Dt#pSJ_IKQZLs!ekdSi7tlXBaI?2t-QYSPXz1&EoqaPJ-0ZU- z0N*-#6Zb;Fa-tUf_WFO)-xspM;0M{kM5+SiYm3-sZW>8K6OE4~%W%2$`OA>=iuYA$ z0d1b^|{xagR!A46yY|N&IV*nh0|Ol{QvaEizfDeJRD4ry(bai|g-|0|^r}XYuov zUg?|Eg$AmZc^kKv@lRUqZmS-%7-`1nPpY9T);tV&_%x=^3#kVHJQ@49_xoGO6_3Zz z|Hs)|Mpf~>VZ)@PfFPhE(w%}xcXz{~rKJ(+M(OTDHxh^LZlnaHyE!P`UC;0<{6Fjc z@T~XSS#xIg?Af#Dj_bO^7qZNgYeugO{?g8_8kMFVABmfc(T^50*?+v-KX6P)+Z$yV zbTpz}dcPg{66GlE&9yCrrQ&SH z&`OUMDBJC`w+<`{n+y7dc=rsL^)gJX4{&cu6g52gq1~v?{IT`CS8@jETTE~J@~8go z8;6j7hw702uMASsA~m)J_~}|#?-(i0H}?%Lv!QL}sbasb9hdgBR<-UQd7%lcsr6xydqw~ioUcwx4CbJWFl zG9uI&mcWuUu`RQ>ycMD#N1ctmB4X& z6ziZQg$T`WamZ28uBswp(fdvkPM4yD#sJ56z;Ky&-gtW^VQ-|?my6RtY}7hc)sGj< z2HR+`E!anhLo+jBH}Ic@0Q|s8L6A#k8LM>fTgBEeAbma$d$chbB)5g_ZL3tAnrELt zgg4@wD!$&Fj&0;GR~YQAF^*F5uB;D%?zx3sn~kgxDQU<0&=ZOuQ>Tj6%i*JO@OQi> zx!Rlu_%5HXxGGz?dj3}~IwNaGJE)c0tHx?_k}anvy)MKZreLZmB~~Z0}2;DNSn z+5vg<_U6O2?xXkycx@fFR-XBaP-TSwmGLA#W$C{dPgNk=Vs;yWvfx!hRlNxhE=5|? zGvuI=6&I>D?1tU8PeF3F`MCEPZl;;o=GoYn85$)1M;pu= zfsxS%F$6qNqT^=Ypi~$BEj{|m!9r@0rykxUX^#(5mL>+}Vo*v|5@g4ltX5yh^bJ;V z@;-eIJE?AJhwIrnT&*xP)r~{!ew90uR_=De&ZCf9hRe*ina6Rr;G!Cb4GwYU81QcD!vnitnW^-{uy}rd z>9}PZ?1P`xyEf5l`sB8I2>GvuQ*jOde3Tqk*x(8KCqp}b>q!{+g%JY%r`t>kpUrD|5u0lc_~K%vLDHTfOY4 zo1J9wDd;vth&Z*27XQ4Cy0}N=@7?t!5JqS5Oa5C>tc(!x0wu@?-wKkLGgbELQMN?N zA&gF#vZZdtmdw27_tch4<%%nDVPXAy0>qR8Yvx$&7$NbBC^<0%0%F}Uj`jQZQ!pCk zb`G;qb>P3&jMyI8_tWdQ_OFuJWHI43x1L14!Ij$Q0h(elQOQ$&bE^6A*KGe@FrhCn z3ov*3tN{T5Xhd1}BtU7Q$6aZL1$2dL$(TWG{plAHFQsIVHC~`BO-f1%7jHGO#a3Z9 zW>TQs7!S0CWc`p*X~kpzJCa_bK^q$<#(se(LLhRZKT%mKmY(vH%W>MS?Hs?&osdQj zbaytl5Ii2>~{slXfAat6@e6K6q`V8 z9P<*7)5;Ve77m=q$sue^IynTpW=r;H zLHWY@pp&SLVCn0x*sb@zeaY)+AW)8K@ter2B$i&|&Lu87TCPtRbCC?_K&Lq3DpX^+ zK$$HT7Dux0Mc;V76W8;mUhlZi;Fc^h?tIbhs^3b-=Do$1VD-4`z&^)9z$T0Ckkg#Q zcmA@CZ#)~J)boGn3lhQQbh<|S4uqwj`T5j|Y!=~dR~mJ;?aw*yIb54C7O12qi}E1v zZu2xMtmZK4?;0@7UxuA@6Y=W@zvi$NDA~3T)0CI*IT!uO#A(;{Ao8q~fi8hLYJ*!! z83LX!kJ_2*3mrZe6qh_fHvBGEwsK=OX4@L*Gx7>SHX@3&+pwX=gyg9!n%9V_vGhS#w0G=( zDf2d{yKfIji&f+gkMZ?=diJfkI|ST^MC3^-9`Twjq|A$JZz)+NHAj*(`R(lAJr)!*YpSiSO9RUACNEM~EF_WX-g<_c zGcl2L3GIzoU(4K=aCetH{_Lj*X+>mHXxJ~vU#R~KZsK2m`ts&X;N{^=fKs6fiqB6B z%yUg6k|O>)qa6Ev#}N1TmVr(D7f)SIp{B-Za`UhFR;7e`36ZjnM! zS`lu?I!z$**|O2V(9n`p4af&Um^AWz$?6rKC5k%d*fW@^F(zgrnU-4uo8Uc}A?N|5 z5;kgz;vhg!=rt;|2OLsUI9!C(N;D0P(;$op;LY`Su`@2mYCRUSs3IIf)rE1Y)Zo}t zTHBX@xP>o}jb04Uen?f>HkUnZr&s3E4H)Qo#ZQk@4P1H3zZ?036?)(?S5s``JOF0YRo$4Z1!+gzQ)KOv3 zZAXJa2O>^i?@Jw^qAq`}uBf9*Y&!IsW>vKaqRAO1%i1533W)!5M}wRWc@Rj)x`zmcmji=QdOe3+pCP85lOcbZvQ*oSI!y$bJoT`Cp zYI0_Nt;*o4(KWtDOYMRRfhE>>qTu5|yev5-m)N5FwMR1b#OACcr2#w&1AYIJwuidu zkECLp$d>q56A-BxmP0wE0?#WZNyLyXtt27@lL0(gCEh)4r#4rVZL_rbdI!I+dP;Rn z0=9e8;>MH1pY2_WIDa&B2AOAV29i~V$JSIH1 zha4r?0dpl@;Io)|K9fX~S zf9%x1&Nr!}X6bZ4Y3}T`jX-sgzA6gOf6pTCckXtShdTIajcTA#nD2%px(PO1E~3?-M~{#A{*ApB1N4FQIpDAXPub?JMNn322_C` z9k_4?lZ5k7yBeg~jh!{BM|GP+1^YW1eeDTWZYkwp8bfk~{I#Q%(U%h0S)t;T%cJfY zM-aBYq(fISPJIPx%@I^;j_X@OV62+JD^3SHoJlLfY$oEiA{USVM5TaynC~<}lU}*y zC0ePB1Lh#vt|gZb3bZW*omqq^Tli!qdLZ0E=WS3w=LVM!yyMg!?-5jeX@(Z5?Dyj6 zrE6jiPJ0Ue>kqOsQ@S3yx-JfpJO>9j*qNmGo|VHqw+Y2DTjNM{L?5!$WGt&DYeTKX zIJYK?DV#Y42a_gJ@{_#q01g+Cla}^cW9cVU+E?%KD_|AcS_zr_OdK?Iq>5KjP zq>vL}{DMGOMWCPe2T^2{frRbB90@nR)$(hrtCsn1PQz5_Xu?0k-GFK>7qiUBr80#O zJvO`JOp13P&RQp?wv~W#$pFN%ir;1^c#D=zLdrh@IK3B)6C0x)nNenBX4A ztIH2JW{!(Qj^e{Jxou zp@9*R{9b(5$9EkBRZ5fib7ZGLdGI(j+pZ>V43P@M8HbweA3j?s5GMG?jfMd4gARRi z;N)$km^pi&7GQrnVs(Y>EvKY6rQI9}3$sGm_J=9<;DLPTBJBjJ-OHUGZ}gGLqdWhk zq*~ck&p+@(S5!2;g6Q_1B;q}e@5|*Q!=Sbjp;2nR8#4Lb=BewZO|$lL7H%NQqnjr{ zNfueqz13|^cTWB-Bo%+`5v=r402KVB#?$Wa`l*lZEb%x%Gx)n=ez^VPSRioh$)~ll zkB?dsYwN)QZAL1)`{P&+LYWM8w|V4yjF3N&YjWb}kR61_(*)q!C1EVq$0}Z>SamA> z3B6K3xPZ<+Di?^JA;rD^n)LUXGgnHH{2B&~$n& zN?MsDc^-?0^-ae!8vYt~7+x32nXvcc6s&}j{3;Di8mkf>&x}fis6tMfsFN)_N(wvd z?;d*`2sI&kAyq_bY*~&7UC}X2u>8L+doMD=yuWe;pD~5Y=&4%LGpzDZa$7-^oUxa9 zl+0_MW3_3oc|Db)KIelr*Rw9I{@T;s6U;OoI+x$o)-6Ot4(C*~vZ{;UZ z@PrukVKYWO)1V+l+xy(W6gmk;^Gn%`gh9^9Ch$IA2jB`4&g_bQ8eE7Zt(qu1L|as{ z$slg`U(%vo3PwovzJo;l^q!tpp;NU?sLgfX?gCr_(?07?ul}9f7G)krC6<;hBJD@7 zHjxm8%>7}$5wAyusZ0Vr+h0=>*q~UB$#C88peFWQYv!uUOI7*`)D(F581VxH8tPyZ zm?v0ghm3g(Ivp;$aK4qCGz@mp`O7iN-6qifvtPA2;C>d?8Lr$Ljcnl-GIwa#Stekk zM7Ej1ZIY_Vn}Xe0xaBil4TOu5f==zpJ^w+weU{0WCkk3BIE5x^eIBG6BZm*L`p&B= zVdfjE-1WNwcQsb{O}a9X|85mj*mT5+%dGRazqUpDB7>p@0&ygOH$FrOI^4Wz%bTh( zU%J5jXHE#*u%&DhTKz@@GG+LQP%%SPz2{z)bDEgi7ec(MU}y|b8jDw=?7v>0ULnm z`%UySAEmT6!ZMj$dB5kMasaF9fjFr#12I3^3&gO&s%QVf>%b2HSZza56P%%^fBw(I z{Bi9aa-?faWE;>G{7 zO@`J@w-f`ceY)h;ZeChQ%K@afQ=< zO8h%H5b4^a*Wx`akZB z2LMw)&21+CSXY+kK1G{4vt;7oy@zX52zUUNIj08M=9pFMjP4Lpbn5o6ii%-t>0 zjvy%)m*znHtpVOPQJ#kqQ7pzAo{uu0q5Uo+oOf$*tp6?-vOe6;mz%U|5rq7VakOfY z2BIN13_GI1&!eWNUvPd}?Q$V({m?G-^5`yrxcy{tvc%#wXjUVNU5zs}*K(cr+J`}Vy`-_beO3t|gIqvtj)Bw2AQ(<@d%4KWQ)cC@*Q|5VtvM(Zj=fO;+sr+Xpd;|i2 zuzodf7U_PVr_ghK(u8{v77*z(BDfPv*dEe*pd?1W^u3GPu|(`(a&7Op*%)-Yv^Br1E% zY@zZJ_bYxl;!>56`H!}dXDPP30^YXYJ3|{o#p7J?tk7Z!jqUG7`(v*E6WCwA3T)AC zkj9qEZsUzg1e7}M&RBdIOhxQM5D|$+?L)rhDKQw}HyXgB0eUT*ETwGi+qB%u-CbD# z0A^ROMQJnn?yT-^h*qwYF?r;{7riPKBG}eiYBvdxctS!p*U~yyugy9QvzWeMd|8x5NY!N@(YytKGqU zr&D@#Q@Uz2}LoSVFVznJL zEjIR}annZ9ncZ60)ZCqeW||lOX%X)W9@~3fxG6tBG<@l7v8T|mDZRLAi>W^DeGEms zR&$L?spQGxSVNa>QyP}l|4;*;42sAS0|&JZO&6>0&kyt21__DnvQ(ZoPdB8-4y%LG z(zpciEM+2#Ry34AS~wF1>ZKwyE?F8DK@v4N^<$sB0*s%*Ju@h^UYNC0O`hCaIJ@;h z+GAY_xREX>69Sceh&tJsPzPYO52W}p{+`#n@`)_QNvNHo_ZITLSl0)! zBkvUhZHp0~3$Gz}s*3R5b+Nuz376Cf{8~jRmqH5v#tXF9oY&edy-O53%rB7Qc?e}^ z@mhpSWY(_;nvkXaVbi$lSlnsA;1=7!v#wGb!p36weVDfQSMt6YP~6S9E0F2ODmtAJ zkmORtgO!6rDK{$lu`ySEe~y70M8|G*CB3)f6oESM6c2N9HnGwq8TYbWoT$e6qio=8 zY3rq0JVNx0nS{%Do^1_8ZGHBoa2aGx^aX4du$c=9_*2T(y7`C!o%Rb*xMh zhbEW($5IDAMw^z)@SD49BGVj~nx`|B#^9}qLd`0mURDxyI%cgR1J)lN`#%8$W1h?HXqfE}vJM2rU~r^M#;_ zfY=7&=(6w1@8hD#_@nyc=w>3XevholxRZtBOqR$--Z`Dd^~HSek8HQ0iRh@1?%vN3 zv`Ica9>%3JUTzcojy$;%gd;ZKd&s{9FDyNGmb9l;%P9Dhk4)TC|5DFMM;y1p&}b_b z#qRSj0!z5LbN-u;=~!b}eaIgUw&DrLA+mO|bB9%9|ElKWCsW z>~6eSiA{V&*4qKQngQY#P87qvrOn8$!u|Qn#ItJO@C&P;6oqXw&+0D@#j5gl7Ytw5 z6`!46HO<%wh(c%J5HO3}$_zG`BA4(9TVkC~nx(0PiY04&{SyydPDYS&EfZNPK8_e1 zJ2m}E^BmRgrtIj%yq9Jk=l{H6dHLz&#pWn<b$HS~0 z{nYzocmI=nmqX5K9&m+HCgb_SdE|sy1Zo$lU&yqht<^+DJ-YLbKFZh{ooXR9!36Df z2O3i%1aAJV33Uiy6co~llepZ?o*ESG`@7 zDp3q6#bH)N9qFo9&tECQEb%d<${vb(^`~_o3ohfZn}T z!SvDrnM*?s?1lVLp{mQj)X#%<`wepA*dR57fQChsmMvEGNzA|lDyg0&qCMGKF$vYb zOJXbJ?%VWjXx#gK=r96Ly{wAQ-q$1|_%RCO! zWk&IF1&{&?CPor&JEv%E8u_5c_k{4^mW!(5nsMG$n^y_3X&&Kr}` zm)rl6M1}v>zD|zAb*LyGD}l{I4U9LK+y_eaM&#ENUq5f%mebj;$(JqrvQMv##H_fj zjg-c+LzA)772BN%dwr%_M4~mhh06*5fdi$=5dG zjfc_bI!z5PUrQ{|AZ{FZJ0+>R-SD8*0j(j{IYpf3kINA%4EWhww_!=rZn#B_7=$N5 zI2m8cs1sPhUB8Ctr0-^(1%J2CPBu75r-G^k0?xp{l~nm9ehsl}v>-+=z%g48wuG0- z#0N9w@dUn$XzRD>W*INTTa7xB z^#LMNzGi2vwrGPnhXpNU69n|_Y(nDSD>jX`E2KK&j!A^kOrzz1cU2G}S>S!=}ZH0xq@$|N4t<-Bd7!Y7N1v7tDA2 z12(D&JM#L*Jh@UxlkI!83kH*QXsV~l)=h#`k{-saGwIGpF9~1iS&%-(CCZJlXHI@I z+47_zMNO12*#EQ|XggLR!w~}2=*fnI(X_iM$P%5k{yV?u5pXe#v6-NiDuFhg7a@#cvGQF0(452phK zTwOPn*WXUa5Yqc%@+2K`tp~ZBnm*J4rE_UZfwmT4PFI2V1*g_OGn^2lsr0Reg#$1O zpo7_yW5Gu^pXKM6`TehmTz>0~?w7b(QC_kU+LTRI7|eY8`l_{saR?}>S?diA2?|n8 zAFtRz3&zJ-9@KD_HH)DPQ+a+C$-d|;-EzHu4#%$u@&FR~m_N-x)G={GPT{_x&`~37 zz*WC~A6TwZr@1iC#3d{0`U@DQx5 z9h};d3Rz8lL_19+ad}*!kL7w5mQr_A)4mI#s};d5!fFi{opjvd$7;KqD}T>eW5_Zt zjENZu)^m|%s1e`6g!cH-loc!I)wIlPs{slJbC+b*RL2q37+&u+(6(=v>n$WYcnm~S z*iw-YJCSSQRG`?LR5Svx4h{MqqIYrvm&*p;YYUl9rEeN?rbLo|I^5r4YBZm39`3p{x(}}LD%fMNZGB@#0e`rle$;fXaH%xG*W|dfKpn zV3zT&ybwkk?}Mx_kx5+%w^oJ#pOzZhfU&-hd#!ZG8vGkJK`!I|cN#4>?8yjcz!vDE z_F$m%?D_sZDfbvxXSKk$M9o{@p@<41*TA(|P^3Lokd69XSM5!m*z=!pFbYey3;PI7 zaj1BPplA}2w?#zw;3@yZw`5+w!c$pmc{3R~0^TjvPf@An9t6LxWep zq-RPdRU~9&cp95~tVXi~&IMtN3Eur?bCCo;`x=>gddzf{q0keb^F{O(kY2ThiRTgv zn6{R3&vq*{s|#m0grQKd-UL2h(L2VeDjO=>MCZMF{E08_9pUnyu)O}mHxURQWAOq^ z4Vhe58XWfN*nc-95^~q@l9jHIwL}AjwI%m^_G7H|Fu;*i?Tr_C>_`#D~*0>_xfc*28k5t)rMJktLf6-ewdSnpqme7T?#cg z2d;`21*CGixX$IKhaP@5H2o_QPO$_+gQ?$QYOZnaGO(a7)j!H|I$oh2?%cl`1snm& z>tGYr_LpD-=hvR8`P>L3@!@uGqnzJL;E)r3Bfti`X0~93U4-G{EJIL9P`oAtR?159 z%fuH5h}Fsw)H9r^*=J$o@j;xha4&jjo(!P9eulKVL=)nryBrXQY-kM?B{I*yd~mhqDJc0ry4UMP&F{9S~1H}G9_ z@n?2O;{${T@$@&jxXTU8bxb*Um{9+?3BvgvZwKP2?eGXkU(8bOl-(Cj+K&GtVewSDAdo03wgAF}4yp!`>uNSlIIccug zySH*h2j~C$gaHR{C;&!GaZI(SW2xLYD7PG zgBcHL2IGUB9gkBJ_>B!<=KpWhLES5X|2w6?ABY`fkx?$scw7@KAat^xpbZF6prE1I zM88rP%>!Z>4c)}1z3udhDgabU^iI26sO^^!QqJYCbg%wzvR*pBbKt)@WzJq$ZgN~7 zy3llX@8E+gbbloOO9J8fNN+u1HXD7u`N@sQY-&%l{_ZLn+ULbj=4G|G1KFl4#fa5y z-j4;GtBV?AUnXwHz1T&Mt3I#0<9>d|y_L=YAaa7O!gTnJG@3!)lFoUrs=7nuQ-b$* zYbWRX{KP=uR}>&jG&Q|$t2MZ^KYyK{xaZ?^Ia=qJySGGXy4uu`1&p4Jh z91BF2-L2UTC$|c0P1sPA@!$84qGDo#=NcAh&llWk0WbKTD34#igS`GGSd7JRgI=0W zuZ3fC>0WMg_SB>=iEaC@$M7B*FW~PR$?h4#V;j6}y*&$9Uimd$-nLl;B;}tGaoJN3 z+B0qp0k+LREX~;Z`O&@+blaC$6H}Km zFvvo8*%t`_ z*3lPAxjCW(CfEcx+jE$Zod>6Ea!3l7PGanvEIA9yXsy>w1@r+D!0n>SwO-&-YII}( zZ1n51fpr??K~42+G1UUCyl|u8v<1NCM(jM|FAx|c00Tv73&=-C6xBSbhN8&Cjr+$7 zOr92N7etRk)Ww02%$1#Z3hDU5IvrA~IN@8@(;T3@qlxhwcI&3@L;&!QWh7*>(yWaI z+{S{)(4VdJ(UE1kCbv9VN$<^yp!1Aq_>9pWaihm_cOIN>DAEouK_u#5Ik<#A_r z(W|2`(u9+Hl?AANR&^*S@ovd?&id?YN^7&T2F; zS=^sr^=|C8y!@@5K=EiVjwMjnvigQ!Yk}6>ORK>?@kbi3crYGamKkm(%eNk3Z_F3} z#vBTm5FZ@R=ce5vVH9%fUHQuM6Yd3t_pK=^CXotP^SC@|zO4DxnMvfP!r^S+JFeUy zLm{6GnRV-rE#3(lQ14Q%(Z(Gv(%_%_G*@GF4rI@|&b`rV$fDA_%St1#Y3Q!Bm|~nO z?VL-aBVapzPOb0*N3Y=vm5sK(e5>cVE5K11TnC_Ewkcx0`1&*!VuS%_qLI_w^MpvF0)l; zHleoYqlH?fnWne?PtyS8X;L}gR&oyTYt7_`(>!XKJj(hvONvtnQo7@1)15SIp*0va939#AvrHTd#=-x6ZZaHpS%kco2Chq~p%V z3+CFCA!;7-n-y{ImIl)v>i)M#WNTm2s+|K8!v$aftozW3_>?%~s#_GqBKl%#%YH%C zbt_x!&UrDNQO$K`&66{SGnk0O`Ff|z<#{fv;+iGL)FuOdP6Fc}-*C8w?y7G$o3^dp z*Q`l(gW1E`sx7au^sn)mG*$~-GjjgT zsL$z5PR-_X{3;kXH@(h1;wkU{NmlStpk($MVHvIq8so*G94;GPa69`JOt!E9GYKg* zc8;ev?{1>^n~Vqwiof1(6u&yz+pMng3%UfNLN!&tM-Wh8-fi7|GkR8Cr8(6=&RFgjAA0TZA*;m53MJo$C?o?EFaoB;kMTSta)6% zF6IHcuZXvvM}0jaexM5elAcu}K6jP= zI0m}4?{~zQA9-Y8u6bsxV2$lNfcxIkz&S}y7U|IGd7Oq(ygkX5r*9={xfk0QN~8ebhPbYnAT_UDT05C-txR{$ zZMq1aBPL+02e=>lorB0>AXX`wEhCF%^JGh4U02!Vnz!cTAFaUWxmI(K2eA979qDWF zKJUo^45!_CpvK-nETiGAe&4DK(9$&3c(y9ts9dw_EgV*6{2p+(foz~?_oaG)w&dOI zc;&__%g!2R+#ofLW>x;ql9xiq$zvvu&u6O0J%fq0!=Zy=?6fmkf~;q&MF1a@t6g6~ zOKB4ehlo0DM0RmMI7afjpKE>bSGcZHmdK~gx!T%pt^Cfb14Zqc9rXge*6`qQtz4tN zXuIKs+wo!6bPO|j*0*Z;9|TjIs&&%5?kHZeI;PCe)J6n{1*j;zjzmPmld>j6y_3B~ zTS+VPynTWzrD64AIt&lTbzG`|5uqB2hs%6;n5*J@8Z+-=7m{=%BOyC-6NyJTP0VmX zFShlQ-Q7<0<#w5;;7pM$afC4>Q`V-l0-Z%{O zZc6iM&ut_Gb6kJ`nIyKiHP!QCX(SJP>(9jCKY#cW*2#BqRt%Rm_JOR_*j8@y|Lze) z;U(C(-WMZ2)*#H;Eqy-MAUQ!Bx7!YDO^i#YqRqd9wh`4O;wr|kF zsH4{m9n=;lo?S^BDOs5Kj=stx)qPR0ewVJz?D?OepCbt4%DmvA z7J^4ZD;XqtbWKDzeqUZ+>Rh)HLBu~oud1%MAm*2n4+=ZGOfVTv8}#gCLA02bJZ1H> z(O0P;qH)Jt5l+ajoIc-QDy^K6|GhtU2PrS-+&O=H>f{SO7-ZLrX{TNO9+95oS;{|C z(|El^Q@iAu93=Ca-|No(x8&SZgTrSZtWQW6pF6x*0=S7z6T>Deh}(`(N&NfimD0!Q zxf0RwnkmCd-@(E|=DBS!qn(giP1VE$g+a24;o?Ld5`N_CA7^1V+to)=%4scYt>#Q# zlhE$htuZF=Vm?FC8?&TUOYK3pFeA+%y9kJxee)6LbqsG~E#JX4f+_OKT8~3Dj4bkH z_8a8sh*p8kf;s=oBd$sPuHi&!#EOluHLv?MOkB6yan}}AhHB%S51B$6!-X%23!4tV zLzGNxn*c3R^y6ocQ*X9>dfE{{m4IG$baZ$?y@@Q1jNWexJC+?`Vh(3Ha57vRLkIG# zVvI1UK8gpbo={Oe|A|CUMWiNru@XQ8%?uzKbMNrr>yvoxAb#-MOK~f22LUuYBEACN z^-bZlbKPFET>dYnxJ?6PSvPqvURB1uz35oKlP}I#8mvV^!qakj#$8|R#zf$F76h}f zhfL(YiWyH6=sj=lpxtPlYQsrN-|icvR%YJ8^(4x#Py0o*IOuM>^u35qorFG4B*6A7 zg{&99{}GX?54sf#y-^DAh)DYF$7cUKV873+^;(MW?gGAg_B3jUec_`S=Y1P3YRE71 z)TVWMCPa&rD^sZiRD(cf5W^u#`RPKfUSIFC^dww-7sHRQgztD=?UnJ+)_W9}X1XB5 ztrsjac0n75y`RFsYPK&(!mqELmhOfrah?)hrOCYD*DQ|Wl@Z}IpKvZD_NR70vJ8M> z1iF>U{(#f+b?7HhTZThCvH&t2XhU}8(k|>Ph}HM=I6C!Y4ov0k zb&gb#TK7wvEylxOP5YjKub7LbW-BY?k_<^$%j^sGUmKL@74-SVP|aWZ7a-!1PJarq zJvw7Ty25$G$4r6_3wMI=VA`8&@KWvEpgUyN_8u-Z!`~YTh@-&QBpiu2P=L?ma@;vT z>O5acn!t@Yns4tTm}90v$N7DC^V!eF?+d`+LZo{H9Tp_cm4|d>{zW!?(8Y-t7$86k zrFgf!P1DYO_Ic-!cS>|*H*hQPFNpM{u1>ctu=FQ7(z&PKSNjXz=u2FsxxI3TGc%b}r(@4$F-V%t$KidbT{%Gx-7WR5MJR<$tS zYs(o&LsC)~V%!SU^K&h~wU^Al&e@$%?{jx}E1>a#bJyt?;pqL|wX8z+YpQW1WvW++ zTCnu7h!eZ8oyP}pgPG~K`$8JLe2iEUA6D_CB+VHd>h#$VL5_Ka-FO!HfS$Gu*#@b! z!yAC8ToQAy3f~u>fL?p`BM|ooR9ibJMFPZ*%EpgG(}7Ul0?%BKDr|fo>(SH^$L6)b zCU}zT`o3~ltiLk?{iiCjNv|F5DX1N0(w5((vJ_JxLI`Di(c&xG4mQQZ|MXoFUD+cB^?1@@Z9@=MsB9{2;=Ug+K-e# zh7rRgHls$CZ?ObAhfdst%^$71?@x-H$-%#D-(kIEK1CnCJNP}ZV-$R3#`je(2HWVqrhFx#b-A7Swi6<~@d=(0cuEo z>=2;^;gqi{zQMJdX8*h~+~7X;OlPjDRfF=a_6|m`X(>jCVNlj73c)yjWr&<6mjTpQ zzcxVVIiTYLN6SWyUI%rW2h&YM>Qc?nrXKWoKEO7$kL=JH44j^-=n6TPgpwNo^h zz>HeoY~p6gryRFF;t7I;R>;uGkwzwfP@#B?enfrL!zUOMD(+O|MN<@Y-!yczs?AG; zFRlkuVWs^A6Nn~}5HE(`@Vbg<)>vA57ABzEhh4RHIAk~n833I~EC<9LvUx7MvPX~4 z_Ijl@1}AbM9_YKPb`~_WeT36(ojTi~OS0CB)yf+3=ae2+ z3k`#l0e+&drB%X|!PxXv6PdzV8aZmRfu}7_C+|nUXc5mEg9i4=ceE$0+0wi`f@a`|)Mj_vo9Hh(A?aWk8jf(RGO2*FU$e~{v z9^v%|lGp?3N*F!jB4Wr0MP33ge?|f|=UD^LYJ5<98(5$34L^;aZxqvftvt0z*0p*nvW3Kz1iE}TLAk)ETgw4Zlez1GxuKV_8AA=fg z7V{R_;VbbICuHTF&OEQw5x$S=*(u-smhpB1mxpLVTAwf)_)C73Cce-wqB1f}_WF(iXjG}e6IKsf0+ zqF~Y$emkl`W`0J-mq2gQj4v4{0F>2?BP4;mdDChW{uI214W}(6v`9VE$WU3?n%aE1 zG3Zt)C4fQ=OOb&PE1*V|5kFC+3x9GI=Z&oZ_xB%>J}CL1!8UgBkZ%aF{~q=!k|Wlk za+hg?WL>0FK3x3YKXby~r7XX+*AppnA)u#d5nT}0wYM+bOxm-dD*p@#oZgly?9DWE zc+xhIU`OF0s3_Lb0mO2E^)&|57Nnb+M^CF>Cbq`Q{xh?O!8gT-DJd~*bVH?UkLy=O zHcMVz(#p5!#`WvQ{5RK!hq%I8?yXsad>{MugWU@+)%0{@W;5!)XZ&j<0RdBZ38Y?E z)c=_{0aXSQV%;YbSKt2`j|*F2z?`dNQkmwjMf&SGmmP6>E%k+I)oh%?Mvmzo{}4do zpvZt#lPmu%^*>{W3J7?pv3BVEWchok|5+_^X@LcpXwhtf|CaAzC~GPJl+U@AhPD2M zxLyCptFVP26a}4Lo;lNjg0iGywoxLhgH@+KPrUx`93Spbn5Db*y$#AwhbVS5w3@5s zMysy!n3#u$XDl6TB<(eK7>ze`uAIQs>F!SWIo+sducf{AT*dyLZf_I9Jh77D+N#m{ zU3SI&G78F5G;sd!7sp%9sMA2}LUNlu0UGtfz~{XLX0Y9S9lIwY9$y7KZ170rPqYg6!S|f5 zN1-pzorJ&I)WiMkct!Y%(Nws@Xx}GWDc4=HKruJe*|`q#!Qq2Tr51mF&H$JyB!+Vadij(|SO#131SVDurDtj9bzHx%~Tu zwGm2q3!VO`XTG#qc~y_~hUVQB2W11S0;I0KoP1s%d|j-*XzU(Z%W zxGAO9k=LX8UYb;1H=FpE*ZUe}x|D2sN7vC51MAl#hS1Sm=^$Q02&hN^BLI|)4OZLl z)okY>BPCrQYuD>Lf=%pg)HIEo>Yuu@hJMw- zInTZB0_<+4`=K;SK)*^=ooV*W{<6@aBVySwyD!tY=GHPLG)>h5|GS}B=wO|y4o?($ z9a+c~y%b_yU4?8iJgO0B#og+M%;C%X+!w11TT?I_KfV){LN7X-;^NEos2?1KnVQ>| zn@v+$Ss+pWPT+DfjgojXr!oViv448{F_7d^jUhP^wL7@mW72Ax-s_H2SuUNAtiAs0 zdSc$27;{y+ftuaM^=+FL@Cy$4dqj)9hEsyvF^kjzQUEavO# zN_lEeEo*14Ehh76(>-|vW~+9|V*m`$!_5i2w}_% zNQ-nxw{(Yqbm!0w(%s$NF?1u{Al=;p(%mUBbiezY`#bk~-hYQ-_UvcAyVmnr>q!oi z>Ed=9o%l->$LDURUe(T|oFh+RvkVFd2oPKKa0TEWg03phueC1+(Um?Hu0F(7^Jl5R)zyM<$KUGG2$`iCl}zF(&uxyN!j>w~`lTDbIU|rfVl3 zs5HJO6f>62m4S;DU*ZUOnCANBmO&{}V zPi;Ooe^$x>7nC-1OEYTwy?)y9eJ~r&F(@>=3d-p3?D_GezfH#J=h*a00`jd8#+4un zfdR?T-}lp){WBn}-a+nBa5 zsVU3zZ+CX}Ocj{R-kHpLD-`KMJNX!{!}@R65(|+*V~VK5f@w9VR+?{O0gYJvV2W(J z(^m+hzDFQZbboIQ)@*vT{be*1JFRL53mXdSu7DJp>-_BZRUyw!xmYbP71cCg*t^a! ziAF;LXW2Qr%wN{h!XmwKqt(G=zRiSzwj7JvX9x1Dm>F`xfIj(vz%1xEz8pB!Bq_TP zH4FkmCl=sQ7qEBK+wCGzb5K7r40pVY#Y4a5PXwA};-826%_9b0Gv5c>+CARFPlp>k zyW3czdu7lr*bpF0GoyT;{yq_7zb80$6Hg&4dBgrNygj5y*10B2zvaevd&Z2-b*aIZ z=<==RuQU>)gPIThkv^_~_y1k4dn&DF-LLH~$4iRURwJ74zkQ&bb@O%pxquk5y|P%M z*KQ4P!2pTe^^x}f>`haHqE4itznQHdb@j6suNA4!L4QRGQE-SG$@kscPLX3P93nTC zRu#pGh13(#U88U{|Pr^$*qg!hRda&rPXwN)6C4TQ`*V2@2F5T#eP{>jUESL zry8E^X846xL;Ji>=#^xjv$ykb8YJEaF&g_2d4EEIeYb)P5r`Kd7du+>-V@w^Gn_oB z6K?H9$ehmabj+|X-X{^dxs&f)c>*W4_(_`3f_8%MDF8M18e07L{nuP}2YOPa6Mv$D zGY2-sF9i}G44>}DQ1U+J%lF))WZxOC^1v;dDM!rb$sT>Zj3Mv_*w*MqN*(V9UN_aN z?XBolA>?sb`=+nr&Pt=F9WU}`a{;w%9B0s!sy`w;?!~=_Lbb8tJ32ZZdAvS(D5y$K zeu_?Wltek(0W$|LBh%2L2cLMZr|Q1nh|c<~CX>lU#~*QrbC<~W@W^$JjLr3^VY*O4 zHJ`}rt6!>8p7>FnpH45i#9--1hC-vwm#PIrydj3KqCJpS@sp+&dbemV8SLbUtLT5u z;!;9HX}z6;y#R-^;ff%suCYg_#&9!NNt{TN5K~itfXgmCj#1^f*VTJHqe*@p?XxZ| zUOu(Ia|%}E!@I3;@IT)VuM`pM;Nu8uUb3CAKJXueOgE1if28j^eotL>&|11KdKcvCI|EI zwn=GMS6BB7O3I5$k_A#tr*mEuC=@^x+BLD6F}!cj7>jjYtU#Kwd3$whh^N3*WBe0D z*hnaLL3CsRps^Yuw{v9+fQ>0}3fL8|E_C5{xcGE0_UIA-*O6G4-(5ULw9(${frWQ2 zZL}{ZZ4X9k&;I?xQeRrk=LmQl7Id-O=RmGhN~VF|UA{|p5nLXQr@#08dY_%%2jM#| z6#u^)(asD(pT#bZ9PmKD) zSRr@dp0SWBvN$RwXM*WUJg>k||c+}ze@or_%j_|EF z;cmg>I#s>Ny*;RXgm27s4iqj?tH}_?f!Q>AMN5RQu8P#|5PNA}XOTbNr&Wt3QEE$N zx;zrQB4WyH@mS)gkH#6hH@|b)i2M*7D{B{;%Uq}vCH!UNpx(HP*H^#FW<#*XbQ<&E z=ko_Y?I=Hc@Tn&2kG~jkRA+;OLohp=POcVL!Q~JV58JxBoBR&Xl$Am=Tk|9yPzK@Cp8|Z)Sw+Bjnas9zBh`3PtS;7na2cTM8ZRyxAXl6fe!&&=*W_ zswHmgE*TH`)0UK#h1sFZL21?zXF)F8!mSuyDw|GkKYtbKeG3DVJk#~%3)BAAvq;s+ za+9d>_`NFM^W{4j1J@CQ=pS`Rtlgi_!+T)E7R{7PlMl+ryYY$Gmk~f4$@?GO4-^t; zwOdC+6x6NM+Rd<@83Ob!@7`fb-a(9XKSavbNvI3fA-hQ%=}{F}Bcks`8L^i_(e_~E zN=5NfBlNkS6vKjpP9t}c^jT#ymlbM_S&t(fcf?WBY4TwH^nqY5V0_R|?bBVQtbU1al zGvEFixKB=xx8jttbhpWvES}X01rlPqy4lCUl(cHOjiEnGdY^!i21WzdD}(HJ?QdwT ziEn%C=DiQ=I!5a!MUxU&s`cZwoDi?T{Z&0DEAD}_3Yoz#t?NIk91bLyTf0ntv9~n1 zHgzGw$p7{uOQc7TLc~jZx3&~{c4WD{-%g5LxA5iVpQkq<`gUH%&WYfMFAGabfJp4` zM%T2N#osli+?reKcI?gvZx`Ip8ihM~iNw40pt02Ii)TnR;+_P%B<6roLf#=n=bR9; zmI{#~ugi^=IQ+b(sNb$N*ehRf=k>(2pA4(s?fhivE2{0iT1IluLk+Xk_JStA@Pb^w z@cGDjhzX8o##@U-#Ugwd{^Byju14F{`&4H|z;CMn*g~l#F&RYb9kjPx^~BZYmWgluf2PD z72B!lWz!YDZBxt`)8GH86Jax92^%zqA>GyNl5uBYJ)bKn;Oo&PF2Xh@Gj}J%+sSsj zWZfQvo?Kt39|-BsHShbWxp&5GXa60gRA~k=3ZYxBwiW}1XR=IPz;5oG6Q zD!&T~uO> z-)SbG5;G?=*JJJ)x77?KlmevkciQRiFLd^(9(`K`o^^>1Uga6*1y`3g>|J`CcDLGe zy@|5R4R62y%yr41rw@noc8@*w7off$vg1=GAE!UNGa($I9F6WQAK@h64_6Y>2mBvq|iH4F5q zm>vDzaF!?S36c;c@JtGwNnv~|=KVtv48g&(b7G6 z!%>ClD5w@qfpn@N{y7!HneWWms6ba+YSdp*RkL^bdwYAk`1gUD@gA~~uWM=|^E!LuD5}p(5~Tugvh0`nhTJf&9#pWz6sN3qgTie zt#>J|XN%rWA1wPEZ@p~P}MTkMOuxEPSpkq>9cRg3|&%GA6Kh&=y0l6} zu()*1qLz%c@^{0H-XGko1K+RszU`v+puh9P2nSaGsUH>O<;@5Ywxif zaoCP0bE({r8xyG$rOa1VfO}-Z%iF|g*NKK{g<*;WIgag^(f{)_4=7?{ywEuH`{bYws}C3bC9i{J zhYxCVcCSiUwv$mo-a1qX{0$fkafH@Uy}zQJDjbUW<4;oXpg)uj#ZF%R@i9=)<_?Vf z#&0(HWr&Sl73%R6r~-heWjk1n8;iP}Iy`Kq?o;U<^?yY?XAI~ESDBR}g@d;~!t4U| z-xopoeQQ#83O;pEIj;YEAFv5So>$Z=%&WYUXn%-<0`NXiTA!85%#{C;Q2&-k2diL| z%8chV^4=)^PX-m3CGT{#R4z0A&6TZM`G<;%C@lcwQnd4`1A5|rUpBM^HdlN7G*_zn z$43PHr8r_=&wlIrw~ClHahS;IaE0{GdGqgYlaKB@TGBD~^j^iIM@Y(|b=?S=+(^ad zK&kSQ<&T;*lD)c4rKxQ*4Yz^bXf_a8JOE3P&>)& z$TaWF!14+H!CSz+%-T7jy1BVUhMA;HkB*jobtkAL{l^C6UYQE{*e5oBxom0)rwE`1 zr%(ZMG3z0gPvfPO4LE>CP+1F_NilJ<=6?lG3G^{SbMU_&e%p0;vTN)BGN$4mNvY6J zq=2FEu>+4-9US|2#{c)u@-HzMlT=_5p$P%scxZ0)HStPc$(J`>61u7XD%4bFr}B*B zmEvO746Dgc@T`wp!%rts%(cd`PnHvj+cUDtng->m%c^~~|V zwxKC0Kv!C^Q{42gbPnaaOvUO|y<1yx~E!uh|V0)KDx@o9!`gvvGkKjr2> z{}RInv;THImQ8KVuma2=DJC2dAUYsP%UAd{Oco_nx{=l^bAhyTNxGG{2A)IAqjk`T zo&9{|BoVW4hUXtS;qRqqN9b?!X` zzaR4g>tDT<0AlXaUyrgwC$T3Qn%g67*DBlnpT32q+BJ zgtj+lod-2tH8>0aREvg*Nnbdg8T*%>GWjVm-)2>lo+ijR|Ibp}7{FMifq37Vo26y3 z4=?{V5#~YJOH@&jf}7EYCV+hL*MtZpzKY}4@j8b<+JoX+T3T-JcR#;Cc1CDS#xoQB zMUh4VL&6nu42i*Jd*(6~H2+#7>1d5~wb1E2gk%#@Y9{C<+E``-pFL7Z5syAzU&M6X zz)FlP_7&*H>dOR{Y&ET{x1=&yYZq%)BnYP?$KpRki{mu?FeZxPJkg;60o_YQE(6FIE6?3k}iH0krkN+`P)3zr}sWeU9#m~xJ-uryg!mVR@x7Ndw&G@5|&F^VyW&larG&4J~Fni}kqq zJ?1MrlN9PBmFR_oKP9K%D9m2|T>qm9xuYwE;Nd#VAgARWCQ= z#_EwFzThhS_s+teb|N4`njCU-dUxp`+>0=9+MLOiR2m#!Vo$Y+@^j+)tpV2#NpSA= z-Z}dD^0AG0MY@;KEPxxAgIKMEtF=Utdba)cATe1uW?YYG6wn)VQ~}%e&5k&sP##$|(&UwU-4Y{*Ppy^NiI)vgXpY6?k2pbyk1|lPYvC-4 zfPuUUSU9Vys{wkrjpC{fzNJEMBg39r=^g|O3W)1%y)?OC>|c3 zo>tt4J)*VcZ74Jf^QpAlZ@QSep82?ax0lIMNUc&90t{i+u)DoaJ*5qXeKlHE=X~m= z)@+e@xxc!g?zoiX(4w23Q5x5m-sONzztY`Dz~#`3_;ho4*9_=Ink(BqahJ`NTJelU zJTJ%bka-fi4Q{K_yz2shM5=wbaRXmZwXck9rt!8sov=SGa3N>OKj&%0l%i#^BO~v1 zyqo1L+nah`sQa-pZWQDdWJQ6++W_phsmywbg7}4EXc?!2_UvX>t6`QcRz8_9S+?-^|hcPl>Vo_V~lfs?vd&72~FLuXDMWh(x?>;W&zxSrD z6?bB1i?RnqrG=MqX0Kp?(n$d8xXDO>sZ(4=f#AU%Fnq^|uTZd5-g4{R>#5_ehYW;G z<n$(*w#U*a&X=PIXDgP7yrrHbW%BG}cw3@*ewC!K zSYP`r(DCqS1|bo?p|KU>v{{cC0>8iSL1qQR5`IgkH2k*kY_Paiqq~8Y6L|OB|DI@u zBg<;|CXz3!1CXCA7VDIG+IYrT?N$JfLB2t->dx&sdOz30RQQBMQ;m^S$|fV?%jAGi zzTjOA1Tpz@Uw{9QQo1*)3*>S6dg|STL?%zum=lD^T)oBn!INuVGeK3ywF~j7rtHy# z45=-uo7eq1g#xfL9L}26J_3)2DV!HN_Oh#lx5XG#nxNH_IiaMUr+~e0cHXa3SX@(w zUNRcoaY|`cU|blY3ApJw?QbRC&61oMWdN$)=QBD#wa*|`hXpyf*YZCcRHR-i*1BQ}2r%L6?98O6^}34C?t+ z3*&BLlkC>dpSI9YP*Fo4)W?2B3;RZy4ZBG@=L~g7_aKt#0YM^E#}^S);2}6~P=ge& zzXr6Z>2MMiRe6@TI>JYK!{7R}zv3C)YV@`+9n3%OX;6^ywH+EU|?Z~vb-na zpuD}YZ=aVow|>*T=;j+?dc}X!Yrn~Cj$_av7}^!w$OMT!{eAx`<_iU+RRn^&GwB!W zJk~fLJG=SO_@me}z6A>UpFIohZ2vYcFv2uJx3T-+2yqwJrGLS|EySgI?cJNl$m2!) z=}-hoa;Ci_XX8odC0hEq-b^LF{2PnT(Xvp~7rDxElAdI<$)N+7QfcKZe9beGpSl$1ip5_Xp@M{ zhx6%TeF^mT{VjG#FrRgYwJ^MM?inGQeu4+rz9cB7R?;VYtXlU?&t};`805F|vuD{g+>ky%I+Lf1 zheezkO47{6riw}kHH6s7?p7{-tyf%8>KV^-{RtTfq1(|SDJrA62iCqtsZ=3$8cA}^ z>$MHPx74WfRq9pH+9_5AJrWY0_UX#0r)%xNQjPP3S4hFD8pQT-&o%7zIs!%#ChREp z&Z7&+b(};ZjX+EVtK%Z%B_g7g6z{~#yOT(*!3tg2%vSLkaQNWFj{cT%SlfTR*Ql`^ zkjeRs=H1IC=#UInkT*XY3Xv=AnPcGTXE$xs$U*6rO+Ol1eQfhOl*qA(0iD$?igm%jUbkz;igV`1-!L$@f9b<=vY0&-ZH0KPo2Mfi_Z9mt&u7yv zJxLki9VVl3KwL-KILXCA#2Sv1?!gI4G7b1ZuBMg~=m9nkysjQFDpo3Pb#>~vb3*i1 z(B$6k68!eJgsurhTdJ!x;75zy1xH1)nCuoN{(7Y5O338jo!_e+pb;y)@7qoxoEc;cWVeH6hQ_rqfkh#MH2*z?0+2(w-d;^70o>A5B$qu0@M(7&4?0kA(U~+n6xHCL6 zwchSNCTGe9w~zd`ouuAuvCJE_3UfT2Rg}PLMsxK+htOVgOXNyVUQ>qEpq=|!kK{@J z$RyuY7QQSiDuu)5X-?R(dI&TY$>U*{;hKQ%`}`eLHDzknW+vEZhEkG1y?51wM+uA;O? zJ+=}LQVJ%k2qsJlUUm6+RoyN&PQTyUQRTvhUZ|IZB@xiq-`rLPrDS;>GTP(4obh?S zpR_r?wRK=az#hT=ibWTKkrx$;xyKRlx$Fy(7FgytDdnJXs6)@-oAMSsoI=N#(9NI> z_^_o@(f7fh4X~P!hel%9dS~y<|9vj#?W{ zdBI+@OY)twL89kbS=&$eR&Kpo7Fu_D8+72}csdI|ac#zIHd(rdD=5i7y%o(zYT0=! z`bdumG&GA}EB~ZAKwyVY3N2>i@@>1nWXIQaB5JegaDB>pe=p!dCspQcFxlk3c^*6p z2Y=)a=QpPOwaaa(7vnmev6Ojlnm%< z%6;~x@X8fStts?K=Qc|&)YS(4T+^>INS4x|EO{C${{}Aw)X~?ila79AQcE1chl|$0 zr_l@dOH4yt^BruQT=kAcLbFGpqQ883qwh3`{$cwK+>B_428lV6KIPK%tc!L$1(F_+ zG zF0!tGWoco}1WYEZg>Sza{H9l-Ext1kz76P}$ zEt6%GIWgR5zIWZPWeD?V8?2WUWM?EfLc_qz5Q)2HQbWwG!_#mbIwxpe)t5M-r41(y zn0P6g*X3+#glq{Wv?p`FqH$Z!dU+fXWJxzOoHebNk$O)gTPB+fl;$5i=p9;Y%A%aG zU)P>6U%-EXjlFp=E9_6==EkdFfdU!L{@n{8B75~XCZSrbPW@AKm%Nbh+`#izGlAv7 zE%9-sDN5>_;%h%ge_`Q)@QMQ?&-)9R4kkP$I22a< zMcB}ca=hBLYd(c!+yz1AnF|-NH1WB=M
9ukrGTiU41%PZ424FCC!SBQk~mo6q^vj?aOoa`mMv^<6>|jD?rcZr zu0Ro1c|WK4kfvX*va;Bwe7lvob7N{ zLW9J*6qJ78(;XjKpOuwWAC5XZ>qu5n_aM;0&+JV)gIKX7L5!k(*-?+SEfaS!&>213 zOtBo??GG){nnh3rQouiJ)wEV4r<2#;G3~H`AHfPvZ0J!(uzMZ zu}4mTse1oS!xyw1Z6#=1L^G=MH)l=63!mSW?F8woRL4TC#dtkLb{jx|93B_ku0;~) zUxVAF&eAC=(jljuSrV&5z>KMkFmnVv$;}g@nFqzkbI(Lp6er;fPqMpTVIt0U zZOAcySCq>mI0B}f`l{!MJM$g45kF#OxdB~GNwIbpme-zq)hSAzf zc8FT3-i!==v=%;hQ33-O@pFx^u?)+m#k?zWdGFvuEu7|76{F%#*oVK2#>Q}IH}Rtg zn6y4chfQ|-XQ)S2hTtpRuRADwPm)5Pc~)xfW^&dIktO=xz7^RC`jCivk9S{>mN$Fn zRIAQf*=z$^vT_pV7Z0NoY1IgwK%S76Bq{F$>+woa+3siHhYTxIcf#Igk@|k^AQsFd zLBPC7fQXO%(1q(%APY|$haNE{o5g;(s9LSjw&Pn0`!Jk>4K-W2Mhdn;91(;b%N{Tq zQN=d@{ALsO^(xyD`_c>z&C7ODUCorGF{`FxS+9xzol2!jpMzJ))=ePa{)lQ>jgzlN z{~H)EUC^5jgt8jGeyxyc*Q@>2p+;M|eJ0S)dpb#;pBt|$=`cHJF1LQ5t$f5JYMg}A zm?^=;)B>6eF-S1CE%xh0P)PnH=0vLf!#X4UeC(C;Qi>#A~kY?>?DFU zNT5tJS|{5GzmJ;wnHot9@qw_Y)F}n9HHBa-k~zdVD3(u_i_1;37sP%}^@s%fRSP|+ zO2M%BdvZJ>d7gUpYlMH3-*8^a=M;a}MGqZV)}}*f%`unq7Ivv=Y?XQt224U!II zoCN41Brt{KI!V>-D*2{C`Hy{*f7dC6#Ejw~SZa}>&Wh&j+)8d$#m~sFmS!qrEu`!->?x(OBvQauf#l z6in5KQa1+8Ma9!E-DR++n*I+^R`(3W~JVkTr{47QC-j54&OX(Qg z*TMT~QZzLFHyoqZI?=yfxst$l8gs_p^heBDc|R<*S!xMdpH2iMwwaRt$pT*;$1Lt6a)RT%6AW%8<-C$%dwpe^Ch^f3Ek@?kh^%J~-?T)?c<~G&s zOuNzb28KO4;}MJ~?Ma0*xcZfB23JqjIvjL-IgctggQhA%#)z@>DLcJ*T|UIQ>l(Ly z&f%8!WLfn;XTx&%s`pOTOYPH8+}F?W3vEi=Dxr{Q8KYaB6h0yHQ8217&n^G$hFniqU+PiqIP!$R`VHt z3ArRZpYU=WBg=${-oB>aue@7rX_NNvWSTS^(2YT-kWDp><%mSaooM%LHn8e(`#zs8 z5sKOKp>%fmmDETN@f9`7$J3ir^W6RnEnI&$%6v1S{YkUlUY`%@E?9Tc-gR0n*EsUC z`QjwZGcsR75S&?B)5EB6ysR-iTam($-@@7+W;s@oP7>C=xO?`6!K}S`N6HHOI*3+p zAm;)H?l_z9kO!_lGOZ!Cv-&w1JDax5JSucR+5hLV{}a`*3xP~Z&%Qa+W_nH?+?0a! z`S9Br36Cw*U=cO#lM%=iM5=TH2PQ$urywNunqo4B8PEbd8Rco`DzsJ{aP|pXKU99- zVMH9yAuCZHF&0Vqj1|b&8qv9jp}DedJ-RWaKqk3cd5hrZdGdeVqQITOq?CAmh zV%RIfRo^@9HXdUjA5tNM@ze^&7@iHs*Yrf9;cwOzHc03s%z#D@F|-uhiQ`M&n+VRe zS717ayZ7gN@X*Myu4QFa-R#$R?A)+Q>#&ze>%+L?e3tmyBYU^m2h3=-GwfAs%k|l@ zJ%(A4$W24Ru9;5O)Y_6HZkE-!psp}85l3hGJ%R&s)zY$q?JMUScvxzIpTS7$g4rFeD& zgPkU7>pcUmP=4g89+g6?OAY_^EaQ06U%l)eig5{3kT#`~HTk4qLaG3zWICBM5?h2t z-4vH=Pt6hSibc!TV{W4=RN!fP6!le4p+v!Zc{NLBmE>ILeCd6SKo=h?uI#=)+mUz1(OK{ z*%AR^v_=nYeRD+kNEJq9ui!mYD4Ug}1skOYSC+lq)tW4IZ{Uf}PJ&J-C@*RYCJ3F} z-P#D(tk&m*>2qi=9#?itVCJ1TM+{n!?eg@mOxj6H{+6@*%TUMbSv(b#F@3Rksri4< z1=p*ClefAbXx`cjwDB8&5i=TeaybYSP|Igk=4dxgsQGTeYussdrLl?x#Ywn)nU`A# zV(0jC5m9_$`%BY%-H{WTlaI;X=zKr$g6xe=ZKX|F!4YCULS=aOQpkk7<5cd9kX($x ztdF_JC5{XvcH*Z@=gNiY&7nP$>DHGb!L`#Zt!{k(VUEO71cIDiSB0Gf>K4nMvz6?A zI77OAxgPSktr5|)Qp)Lei2Y<3arAZD5sy%$tb55ON-Iv3Iul&-)m}VvT@x#FR4-`o z+d={1T7hIN+-MU~&d1N#O@$2!-7tr~(CsM23sO*V;bBI^KaI$VY}$xbRJ8@=y76nXD<~ zKtnSw`?G88!V3LJXz~b?t9zXVkEaav&U>)FuQpoD$_m`%w{(V+niiP5z0Vi=Z(+At zPRC^GioW}n`bk#EGRyyus_Mj-@X1SS&?<|gdlEQGL|}TE@?&L4;44E+*l6{YpR^?} z!MAPYz!yF@qEvsJ(DRbLrEnwCPs+k>8?7nMGE-mvFsAqir!q$oL)?3K74B;8J`Y3j zmGMdD4wKrMMCFcJ^yn(ZsxEyq3$=KDfLyMrwch?{@;|HL|Hv$F8t4p_&*RCQ4gxv zMn)laMVUI$A7mM&FRieTttdd3{d_+ssr2pE6roV58+nsN|js`dxg6VnF=xPtZB zH5pX@*h_%W0!9lZaTok)^#vd-fI3n;`+h|Bhf|h_8C8zmXVjsguI!JU9n}8|lB>q8 z0GIxcyzw0s24FbjW({?fKfbad<6kh`{QJ3)e}COV%WvA*P|fjO`e)A8H#)3;U+4b8d6tb|c~JcYJ;9D^CWxCy4W(z87`-fraiXG< zFrL$6mV#pmpBX;v6OT#W4{8P0NLCXO!k=AXuyY6r_mPUxjvu70Xgof?&bMjTJwG2t zaj~*zot*xoc{zfdoe%xfk!)6McOZg9?Bf@Dy5Zj~Gj7Iz z7Mbr=gLD~z-*3*Ym?&BRrG_nIe?JE>HV^Sjtamu09lAK!U< zVRn7IFxKJWdNH_AOKi73C=VYUk`M+MlJGspzBCK|v05aE#^9EJK$RNgfVWd7j|?ZR z;FK9cl++cbKXoD3gM5NLoV;ULDwQ=MAE`H$inuaUpHYGI%B0~P2}whjB8xR=rTwqj zROaZqu;eV4JcoWNL1kL#mxupZrbKOUa`6QZzm#o5Yz|p$!^`+kQk`a%&;l~g0#|NV z++XMG&E%rNgdawdui>>T6l+p7xoo84@jBAa1P}D}4F!aDjKmcHXQ5jCJ~NA#u||B3 z72-&hsTtoL^=1nroQ#d}(Q6>vajNv@WqYVl=WkzYa&oeidrsMFe?DAlLN6AWIn=b0 zqY$94+4gV^wrp$F-S-ZDCEe;V5Th>J_Z|Hz^} zTd@*z%-3Mv1K0w=*vuy8!TU}tP`s7EqQ;H`u2?fe=Fvm^8ZryCB@JN#IZxHMd$c+7 zo{bJpuG#w9%$KJY;9q4IS67K~U*8RH7z}JHP~$p>&FGLzB>{tLIeGiSlu=4Mo-@s= z*IDAzK;k)&k$^QK71jLvZ|Z1kK3(LqUGw~O;#2|iP1gRdafmtbF<$`CyV&cOoY0;5IXFO%G8u_^6cgepxy7|V-Q3*5 zT3YP+H7oX(j6mU{e~2%Khgw{&>)-^NUDmhaIt0>SF#t*kA^;+3o&J$$VDox*;*y)q=Ok&%fBSugB|w#KFw&hoVJC|laRE$1UFWMpR; zE;nt()5e#vGlM51uOVJ{70%YP$JnoC@ye?S*BudD8DruZKlpbcMm#hNaeQmnuC-F^ z3iJ=HSG9kg*Vbi7JJ+s$y{NbNbRPQe89n8Eh8xM}pJh*H4LJ0#N|rIxPz=&#gH97F z&LH}lC(l|5R-#LlY^~jE+&IQZCMtS#^^XKeiwzzr8FCWXldMrK14&&Zwa*zedp-1G zIlyf6F`5a!L}61Y)Obrx>{^?HjW{hl8H;sqEsD(!C1P=^8+ zkhQ(eIghiHdNTkKqNAHt_hQ%5IHbX@0O2oCjFf{zY_@!jR4CY!q`KOc=^4BhAe8WQ zfBBcWIIky`sMdHaHs$4!;v<80!Y9y;!jTD(ImZ-g^y3AEfPg;B`>uXj^~GwT-2hA* zOamChS%L~6UpbM@=X-|~N2_QjfDRbE>Do0JRlovP@-uWAF#TLSFX(3YRPp-=5Px6b za1hr&tX8G_+&g`|+@#STl|?xaMF7su)`Xa)fk$J^fGN~F8^Nh*PaMmSz`!MKA=bH_VvCm=pcBWcmJB>*)wdm*~gu~uE0Rna4-A8VVP>{Dov(xIm zNG#M86j*1mZ+K-$Ki|72={YhoDTHCtlLB0g1hp^CG!WjZH}fD*;F+ID3#tM+ovf1l zHN1Shvc9j4_tkj(_T@pX@yi@n>nCVvXcgNEwaftbS2t@vEMbTD=$%)TCABS{>b6Hy zrjI4f&o;?M3WlEEcRH773c9X(S2ECsjhx@bwa%U^*Xnq9v`VG%DL$t$>(Fb3#WfEW zYPT&0Ij*f*`x#{;;`1p0m=EOy|4qUMqwN%ijSJ?$Sd8ZblGw9{tGtPZBrss4f~v6o z6Cb_y_vgEY(UjWG^up)1D^lmob@PD3L)Igk6aJlF2h#xmLo$}e8aqH>nMj#n`kOHL zq1EWfNxTzgi1w6*f#2GX#FgIZnqE61;k2DF{Gk=e>o5}{H}ZYgwfZ!oFNa4_mvzrx zG{^On*Ky~~*~R&Jb(lrj&n-rY8v8wh^Rvqs_tW-~&$^$#CxW8H<6k=42c%7^Z1e6R z$F;Iyuv`TWoVOT`MQ-)f0=DS7>o1pYlhh5o!E5_NiZ$%yd0uRCH?5VLHNS z{yT=m5E$u6t)hC&O>wEl`bBxXYMLuhgybt@xSluC@0Zn_qzG+0F}^3~%IT-0?Ta`~ z=;x?@dJ_}r87^-SI2S1^p(*M`EUHZXxvj3lNS4k9!()v+{njN`TApfNE>N zivpPc7pH~7qNQ_6rj6y*-f`}U!fayL+1X|H*eibUtNJ%C@r;m2kz9xZ zC3EDRUTXy2mH%Jj-mfw>t)wpGA3}vEkf*^M1%k~HM%(?wSB{gLJIQEeK1u*PHk?3D zys?2g1&|IkuLUnc2MB{WF5*q6jR%q77UfAgx_J>}dQfZ)>pc3XiEVMeA_T}o4Yn^u$S-Dcxr4RCC-8a`<~fbu$trLHEQu2`LN_xv8^2Y5Qb2uGZjquO zk{)q;&prLcC0m>X$XAXV4JO)YdxV6`=F9xX*>&4v0DZzG@}W^JBiiW#&(#LucGM(&&QqHN|J=P)zp3q>( zVtCT1mM501Yc(6flMJ(OEYDVPm%FWP@<~Bmsa9+P$~a>Fk2$DL}du z=zm@EGtsv?fVTEy_6J40~0q1%MAK{g5{g^t5fTbsEO=!k@sP@7 zd_a7_>{&?qQ_S3aui_-~^y_D>#I~!g!~V2~-k>4$inn0&O)GkTjHpx~Y@%4bAkKqv z+n`ppG--@j*Em%qJ@Ro-o=k^>ijB%}$D-+QT;r&-dM~R%kBMRPTNm17)AMjPFRN^=3Kid%9H?X# z5THH8&;jB3e{FqZU|!7@ZW_0-?WD17J8x{;Xk*(p8{2l$*tTt}v2H%}oSu7ceokiZ znOU>u-3!lpCW<5@NO?3eecj)C;G#QW*Kb@_gYIIs8nAtX1(q#QEm|!x@+*;g#i;Z7 zHQakwkGVuCq4q!kTE){ut5_~K75bA*;-j$Yi;i=#->Be#k3LGjO)V{T)kkzC2ANj- zqhOCb*hM{hD0D%v<2pK87UOw`)fv^22>jIW7Vq-2zlUJBHJ2$m@69g*^v}*}z#vxh zF087G?-}$f;fB$8qKu0}dTVu5dpmM64VJ>BW{0|Fi<{bZZ{YW9L^fGF#`LU|ziAor zE-ZmWdk}=r$f(NGytmqFThXf8Qg}|gmCAFp?&MUd7KTf(1WE-pd-JLJdHrqjnlR`p2t=JC65f)*V*$+ge z(>+&Lk0;T>xicb#>sDV^C%QLxeehccL}ZdEHlJ-Nk402%SJ5H~D{ri?<$s`5`fG-k zpp?tCEy}8q#ig+O4Y#9<6IiTQ^^F}mVHPbCb-$e2M(f z5P^i1`CRC-jS21>q3w!~`uvBtJa)XbFJwjB^gpDWfGMYd#X2UWX}Sx)jx`AhkCV~r6{4(H12u6 z_awlLCgF66uyrIH?ni^vn*8tw+fZBnph7t}0M;bTkY1Hyp(c1Ze9|Ln3Hc~qz(^d2 z+Ru1lJmF<`JZ;+QJSlJs&GeF1tt8Fzqn`*zXX-cYnUPrzoOG#Ny((kz1*+?1rat^I zM&s>@C>!F(b_eX#1QJfvbW~YC#9-2U+8rPn0k)1(?EW+)y7yW2>CiwtyLZd*3%hn)%t6)S zgTWxzwf-)1l2}I%8zhKm7^MdWJD276t*QsI2buAdMp?qG39+u;Hu3^_31m5{naznH z49aMw0?^fZcb98)FCi0UEA2+3soLwPh>(EytxAU1N;O0uJ>@UB-~&~5y5IHR*xhTf z5cF|O?z%kNdRV@@tA!eft@AuS?lHXuDN|>mBnh_KgH@qlx*8Dly8OffL=O08@WO43 zxqnlrYQ|B0L?P3K8g2#p)NirP`$VQr?voG-M$bCmFi(+LAN3l${o-z#ygQP%;91`s z7)uhSw-V5M8`*}$s`=Q-;L_wKCabF(3*fIp4ZH>zPC*poUgmEJO+h|fG4u*!U}l;x}SoZ)c8t@!k~8D^2m)-4a5sCwSh zix6BH=wabcK}i(Alu0S-i2LACi|AL@{oP$I9Ef-c?v~K$eA7O2dYmGO=I>|+Mgre( zNpD|14ay<49o60@vCT3P`1rCQRW6MRJ{O^l~T zi>35k6i0GxeSL#ojaU|SX-B{u1xtL=W?=NHl-ga2EI!@l9(EvndcFebL?;BIHJFMJ z0oG<$CTu*?CI1>2Z)fq$TWl2XYd2GTU0s!4etl%mEENP2mJZACT^Ig*GnxP7`H-Ay z-YJqW&g+HcHlJZXZ*4?C$p`ugvfGU8k)Y)6bUlpVAwwL~abFLoXW}Ci9dV~}X<@Wu zE(9b!n63W>RlO!w^3K=inM$(_S+H`00KKHXx@KzG4V9Uo`XX z*(A-Y=L!0yyUu6-j~;zwXmQHz?_@2pQLT>9TLzS;jg z6()4Kz{dnDiY-eYc?sU&sx84>)kpQu-aXE9$P$z=qh3b-iOfy;$|-gK-|^YoV- z{z$PC?+kb(p+{T{E>yo&@o0FqD)&!aqV2VBd+2KwlztIz@Yuc?IEepQD7Dc&k$`%; z-rj3qom5phnJ8$y980KguGHrjJlCjZKK$i@C8iDr&+tiC&+PBAXu%TbXpGw0d9}c)Vn2@FkQAsg;Q=3>Yk_ePKsFIZ~qC zK2`6xmwqfnPvlvjs&5Vg80g~TCq_G7u*$>4%A_ZR*oooW1>Y*PT3b?>by=zGq>xcQ zia6sKO$0{cB{fxYU6~)c&RLY{!-$0asAHeeotpC%!FpQcs?29hW+m*0bb(Mns;+lG zJB9!mitgbGRWMFxChAj`Z&ZC|1UY4jInXpIj4IQrP-9@DXswL8;&0G)>~!toV$=?Oa(NmDJ8dc>D zZ|s;DW!JVIALRiTlt@%>>|A@mRPhB4H4^$AhNWQC%)0Z|(0e+G7djO*9c5e;XQY;~ zht5nL@U;toMWdb}bao8HuP)bUVh$jQ@;`q$-FVC1PHd%5TZgQ$;Y^zg5p;ZT@G!Mq zlK87Gg^_#i&;;sdFUuf5ZCQAyVq{nOE(%WcM?PG6O5O)vYWE+v6zH(xf=FFVt_nL#FJSURB`wN(T+Dt{;XS^DNMO#g7oaQM@WW3 zLwT~CA(RdyHUUd!JAwmkKZ_2+v!*GONvH2_VR08#Q<2F+GC2+qWFKW-dDN<1{|4@z zVbgAL%s^dYaH&iwz2pE_P^hmDgkJc#&G^Cu+{0!E=3%7Pk=o;wP^`VS%c;3Y@q!A79~Bj!|fVJzeymZD8qB3V>M zU=%@UAP3kLB+SuR$#bg}C(LMC8CgWUmR-l6bGOZQu0#DqdNr@;?#J@iI{CVN?_u`= z!@g?-*K5~Ah<#W0vye)thyyyo($T{{OLLE}jj;2pe_G4$9B3@rV17 zeb~)X@E)gM{X%?H+^_gX_5t5Sd7&rwt0A!&0AGCS(*Ou{ zcHCQ63h|B@Kn`-c-7Rym0nk18Pl!5$KafG90|DVjsn@d#QTUUEHCJ(-Z%d?r6w~_r zs&cJT@L{)cDVzBk;Ta((2p*yzh~bQ!ljeuXgZmX6^|Axo&~EdRj<#$N)P-C6n~0*I zi!OT22RCYblX?lm3E=^8kMvpLsNcVAIFP{=O74sz-**BJyNNl<#mHUat(jMhr4}X) z*qSp+fA802{IY;>%$Uk-wQreKY)woH>tt)1u0NC#Rh)o!uXh>H-jQ2Bras-$Lm3h7_cXEaU7(W-FRFZCp?F zflV929ER17h%~|L`bcFI3Y<-^-6Q9nrd%zNt!`sKbYe;u1tg6ARn=zS)jALQRCAI; zJSh+hP=<#rfoy!oQ)=M(fMFNG=?E5kKUbMMn&{3>(yV*h*6 z{Pz}wRf!z2!q4pa2a)0ATybvas+os1op`HQ0C%4Dwl*YAeOA}D^S{Ybnr1%ky2S$0 zn1MYI(L+-Q&G`=M*`~}Myh5o>QTE2lF^>p?u%18Bj0nx z^gS39Z!<=*qmwUMm&)M-i07%h$X{yFt`#*ALVPKRNBl5?{3)XDYr=FJuXAOal&U-1 z*w$nveAMP2V>QN8Uo%q_5)!r4C&*~n(5U+A+HYq#c-W`(tUBgM%CpC*avD=BYjl4#$+8h8HygL zr(j4!oSn+~7u(D0xTshcFxW?e8=pw=$SLTQ$w(I%I-Y*!y;CBc)5)6AKFudAO)s>+ zlkADvZe8Q4r)AhYMUO@n>R)D-l*CReq*Bys6gL4wNYE3n`H#>J-R~ zxLg*)Q_{&?PHLi)@Qw0+Q5)WNz_Yp-B4r%3ITj14P=W9cLCgtp(RTXZC>%?a#N^X- z1H{@nb|)MvsQvc;pmqPyGgn|W=`#5$`7D9BR70fF7gJIxGeEu7e8(Rs4O!sE7`{Zr zQdE;?J&zA6Fvq{3-oFthAFN2wz$&L<7`b%n|3k3;i9}b1udjp~=C$m<*p818v;RVp z$TkW>{SU9r|G%#uWOCL6v;rn|@E`Dwzvw;ivl5jc@Sl|a2VP(RzgY(OAZY4upOpV+ zL;vMnXCuhcpZkogmH$5zp@&RP0=}%zeFDjNm=>|4fLih zL>mXkni2eleEi$g2-tsR zN9GeQ&R1A5oO~}V`9HJc1Ewo4F;Xh^{d3`bfyCd`biPCrT!f)Y{PAvy%`czo{~rRX zXi&PIk`H{&AZKpCZ~D!@N2UXvttmm_|MLa-J&3Z^sd_dMs8WA4tEF`srNiJ`r~tLQ z{;^6!Ltu^xbCI8%>MVb>l6``yn&$XpX&-z2{ezasyuY1Qo#Bs;hAzOkY8l?Zzv;4~ zhafledA7IqziNJL!;vsP!B$Q0mX7OJaMfZ}fXucl&F_aB#X47d0ED?ahWAU5&G1N3 ztBTd@g!0^6D4?sdW7m6^@%qgk0j|tE=|YqsWgjF?+u%q4VHjfo{zU7M5mbzp(Io$sIVn;0RT zyK-7AFFx*64Z1~iq)+q&B80C@jpuVkU_-?vB0|H9Ju4*Ii-Kh)32KBWD>FMm?L4hd zEL^~uzxl0NP2#}601+QB2LijhCI1rAR2$}^bz%VbX~E}7G@y^1-8pKA2-w)e6&D z_&wTSH0TE<1abT)B{Q4R;pm0RfMHcoX|2!%P;m`3AiKW9qGBw*{+4@n%-w19qLr~*yM#Y^tiMI=XM)yH$=BE^oVv)D2h)g z(caUol3KcYZY~`i><1k`v>f%&$e}J6zm31Y9Pr+Zj@s;Z+@zUgq-=?pG#}T(MUGpd zI1BCBNT*mpQk5aIz`SZBs|-XQBdxKjB<_AT32<7l1byouC{1Ci*{-2TtG5qBv8I9Z zuXlQ8aTL4P92pj?{~`?@Q|i+!t@AS^*G9q0c>()8Eg~Pn9u)hNXeYuqP<2*dGCg?$ z$=s*?6@*`2Yd5u)UCUN126L#-+au-AQDR{7$@sQ}K5ip1LXO5I5yx`6SPe>xXci6p z*lA+nTrg+T^Pcv@KyFs&>TZ_(<|Aft)3V1dww+ks>Q zj`Sv)Tt?s{XROoEc-}aGYn*{Qlc#OeklW|FT$g{ol7uSDlNW7a>DxROUSVX7?yhdX zK3((#yW4JaXn;pVuS;|jarGb{Er31#VWMEev8?^$F+bhoVgO(f-*r-Q#eG(j>$-Hv z^LV#dr{vQ{ah|!ZV;uL!Gy@)Ev-W-#cFS_*gmNFE{m$kQo$j;&?e?}aXM9wA zd$aEpL6`-m{G3pBtVKpsT1Pc#2%ez4=8wr3A(tpZV1>~YT-VTRlwY{GD+6^F$~#_% z$@IX>R-K8%oz-qdSy{t+P~JFDSXt8?{`LKOjouMGBJw*z>RWO?3qy^<^z}lA`Jw{= z=@Dk@VOpscVtSrspO}(xD|XJgs9(P&lW6l_0Re*^8az3SHY8Qxn7ncxEFJ`CoDG># zTHfw|c`oe2IbEGvJME8yQ1^5U^fz4yp93?XP&vqNn3-C(Rkb>ZTQxQTFWwt~u&9PJ*;KR(-<)#6sZpeIJa`Q3g+sw1f#q}zt(5L zHo<@*Pr|}(^0pTNHDvh0=fPisT?$1#d8PzXrLW5qsdM(;UO!@nTf!81RF-<;U>hBm%(gt1aC44y2>nXKhEEgGepWHyeMAh000cTm?q66F_`4~oSt;jQ7`UTFc4D}kKGgH?P3X)J z!cVZi;GMw64n7WJl-uOunh9;_FU+~fY#Eh)$jaruNvCHyI$Xa)SMOj=i8vMNm}Tq$ zBsZK#r(1K=r&DI*%`!RCrI(h}YvZh_vUZ2CmQzvGe}n-zn$FbF7;`6ZdhJ`D1d5Fk zZOH1GL%tQmmwZ~YEw|G)4xWi(GR&zmlx()5DGx=WU}^{Z)d<3|rwToF5=LqHxd6(+ z-_p&T^Nr9t$Wd(`FNX$ZZMt6L&^KaTD+3K7NEmj?81F!If3NYJrryFqD>)H zz0yM%K2z96i2mfky@70&ZLv;ft3IQJ;jb*8IJ``Lt(^z4=6dHfmKCu_HA5sR7H}fb z(DKIz2n->F1@w86h0ramFL>ae9}Wx(vT7qPXQBSwK|!cv&)SD zIHBt1&H~0*=XCM_Fv`Y7D>UfZI1zi;1mr%IJ+Fgg?K=j&`Dwa&OByJDc2`_2;gXFX zt>d0o%Y5)|F#!}-F#9t39Zap0)?NnmEPN!&B0U!)VNNsR zuV)&fcaVFCKI`)8W{pG^3|@3!T#mk=^W)BSbb7wk^RwhxR3ObmI(KmV^+UA@>Fxk3 z3w(PNZ*>rLZf$XRQsLnmi82M(HF#{;A&BQR(JFbWBZI4pbQras=hgDIxPG_82)@F& zXpS3oSMSD;wF3PK^Kr!KOmc8CY64S#gS(>9!3TO+JmuzO0d1LEAxVSzwNy;i>1kLe zoqKjXx6%eGCRRhFN#|!v=ee6rGs@-599CqVXS7-~=QtKB&qgQq#ZZ(osMU7fRlD!} z2h)YLH1Tux$A#?Ww6s;_(Fb4arQ+QXXC8QSpb1B8CGj2aV>&n>M$XqOA^?wXF%78A zHG}-|0(m!q)yOhDJ>Tdagl(K9MIZ^T zJF?M%Q%^fZ)mK)!4r1xos9Aj`-0Rkz+8QR`ymO=jWA8QHgCl%8WggaoSUiRb@b$JQ zVef#|Z4u^n&R^)@6_U$d4^O-9Y)l6$UF;LNua1)L7AzvGV4~j^#NPL3z|}a28!@k6 zwojQI&yX_Jvcaj!e^i}2F#^TRWq_&OQDKgSoxk_e47}}ZQHp?dlgX3jxb9>g=<6_! z(iC&Zb_ew7g zks7>#8Mv>P4!_KJ+?9M@y3tWZNS)#w%!E8!$*gRY#7i}6$Cz7n?eClE z&xah_XCI$W#|hg|G%O^u`rf20T&HEd zNpP#7f%s(jdL-}>FFx-HzOKxx2g$2NdAc8Y*Sq^oRaW-P&MZn|1mXVHh{#e%4`+3> zS!w&zdd*~q4)Eg(?*`lKPj7V3!O`RP3#xjkfnQbh(Yr}<4^(_7g_ne_Xpu+eaGE?6 zriSkvrF3KoAIq|2kOxyG- z!v5)gi~HI)@P>qLG1RPE65g3STRu872|xChki{0s4}ZgPT=#iF0UX>C*WIbuC`Lvv z_hmSn3|a?c(Bp8rM|Rnv_A&lmPt4x!p$|;dzVVqB3xlaMYKzt2(U{XyOq3HmZT%>W zpmfuAebCy+K&;CF^6?D|s&l%yatGXjjy^vnnYAB)sc;H;YE_^7Lc7@*^Te@JRpEHP zwI-WL|IOvJR#`?_qYs$U3T`eTW{y!MN*aD%?QXGAbSW&e{82(k$%^05e*I~h4)at3 z1iu*PNB8b!tVC`psv@r#75u7(j@DqjXgRmXoET?>gtB0>y`>Z9Ne0HpfE%L`v-Y6cNV~mZ`Xx?USyX z^?oXy(K|`$z7Bt>6PQGr!%0d-0d0DF%i?*Ss6?3IBxA+M)U#Mx!W^a;h<38? zm#yp977sW|Jq{$;(zm)?A2_mpS1KNW*0QpB)#Yj!#u4;vkUQUBV(pDvJ=pk`m$$rj zFtk9DET!70FZq2~Yv#1jOH0>Do6fzFsU${MDb`Xp?`~ch2PWARnM%>vAS@qQQ~^9w z|I~w!cCMJHMfEe~SEE{@xi`4C;!36HjbbQPd`i^D=4@`>(0Tj28bV6r7DFcDU*nQ+ zFs(3(H?cnjiDt>pfJNl7F!sv*r78=2Z~;vf$-wd4fnEbZKKU{#nJ%L3eNU>JZ zg`zdXc<(2i7@oS2q4S?`%Blz&Jb`m3TpWIC0%lr9xTLU7WMPSL0d!UcGHKP8wYLKe z_Dp$ZH}ev$r(H5<&;`ZJ7VN-dn{3;#hIeumX`>MMadZ-~5ryP8+-s#h=hB&Mz~$M4 zt6T;Ba5%E?)5An(7$YoTtz-P~3ph-2Ql)nU5kv$XP=`Giz5DT zGbD3Yp*}x@8i(}HD-*y`p9Oz1(427OcYAsIQO_bAR)fFx)CQw$LxO4+;7_o5fQQS< z`an{E%+=rg!YB#WwiZZq^@ zdR@*h8Y}jrh|D7zu&i=-`NVN7w=PWcU5V(AGl|wU?4_aQ5TOEN)~p=P#X;k59iLL> zw}e#Psi8y8(P>e+|-{97lc7z30Uwc&Duwr2mqUVDZ0O?(0?h`7X zey!X*lY(eqS;l9#2|QA|R3LF7enra2W4%I{3(NK` zB2oiu0@9m+B6O(C9g244fo10Ob3{dNHU?W$ zUbT#!yJ{Av)4YR$^=~<)iMqwEA9#ii5vCjT6o4V<)Fi4R3r-~iFoogwIko69x)MnV zV#|a8{If>PcI+vGp-{!s`j_+I@}nJ<$c9D??)DDd+;-`m7O1p2lSPh`VoJD11N=>M zvgK%1x5oOO3{fwvT}2E&Z*d`IQ?4r@C$Owu7G5ZavZ?>>O(Dnv}-bt054A@** zbwklb=xbs9UUQRk(iqMEb#tiz*jK4+gKs zjU+(Px6Tr8npv@I$$emyoqcAl<5v}VHb-M>%B!Sxp)WhBn!2K3^Y*JPpO(+nc#<3b9l^fC+cB1UF6ydS_j%6Cl~d;Kh~#*xv5$}AtW-FtSF~eG{QXQ z#h$v_V2S6zLi_!?AGsd7za{(YgrDNipk>WgWU>sAs8~iUkbU`rr`#At@)_*qhGVKz z^@-l9XBH9BW!sZsQIjAgj{(>tL%(EP7l(E5XK=@gW!&7Bl2nmmmAphP;F9iNJ`K&G znBOIbkM;gzH{rm0Ke_|EXi9joMixKZ9AT)BlNDR-IlNELmQ)vxVozf>WndFp5K(=B>}XE?Fc51g0!*H4 z4EQ84yHL^psOXy5)I;8(a1WcS@m({9|(r zNxU(pmp;qSR}7{1HttV&4WZ;dQW0!quT+sr?fX{~Wu^+nT5eJ{%8!yaE$uIJpIehY z7i|~PmBdk(DBleI;L9E2)YdVyS}|S*RX!5$dFtVvsEs>+8szCp6e)#c{JfBf5G~?( zGSq>{oiG)p_`=$88Bi{oR?1K;&h5*8|FE)Q;8qrpTy}bIz69(0`%tk}A!KEe`*yBg z_2x9O^GbgUvfUMsMm=tBQ?6l%7B} znEJDBuwP%`+l)9!_c-WrUJ(9H`N_c2s77S%_r?7AlO_`QoQ5Ci;D)VBP^}9aRZqP3 zrKUs!S#>RlGXd?}o!2{{#atOP^c~!|mO_&$jvbh7qjHB}O%#$#EhnYtk1j?h#Rry!@Q^@UcfkPjnNMTmZJ+!vPMgdp|hXolNr4cMgy zgAO4$o4lJU&q}ovX=7-zRvQmgD+*e&UTzd-yuzyWlHN>Z3svpic=Vqqb4VlVQg@K0 zW?mXI8JWVR&-(^l8A=iBH`Li94xkE1LNS`Ph7e2_a5f69y%b_r#S$uu-!s$c2aRWd zI!3lW(Rwz_b5tQ-016)S6JD7?-PmX&S5;5d@${X%?arSUzt(Vi2Ooyn&8y*x%q-A% zBa6>zJ8WbwE}Xl1R7V6|Mv{(Gyal^AIp-Sr1VyIJxLy3$CNY52HM#4Y-D5$P&rNuV z@_fF`GE3mzp?g`*(p(}0ewsCDK-SN5F}=;SU2f_apMt2|e0+B``}vxPWA*klVbFsb zbKDRaz;?_u+@agw_{sMPlk&CR>rv@fCC9X;hJHjhlgz%gt%I@CpnD1uiPtBD_86rL zq#(z-OoI1EjMCHn16~u}sp>nOyjzFh>bizp*WJK&EeH1}V3yX(G)6f29UUe3fOo?r zpPfTHVQILd6s(3+F7O%&+b**aads3L3BvEOfix7Z@e2hPAy8e~0k222Y=(zUr;e9E zD~=v$4Lg4ht%@S3Th5Spp78u(2%M#F4v;p87cf#u$-QQxaKEZ?pY?|*%d8mO*JoVa<{}8j~_Ljy?kK77elXHvv8!T zjN{W?jOh6QCXutWCrYtP;sQqdUnSDPY;7tTFz2ZTH!d*;sMfV}(UZ9@{1hi% zd6Yw0MR-#Eyj>Sn>H|Rlnw)hd>1rlZem^alUvpR@-q+(Yvm*?hux@KXaXahkrPEzQ zOu~|FD-2wA_XHcl)C0RkD4*c`xbBPrgM?2%TdRX!$qfN^A;P2KKU<3ipQbj<)LZcw zBRJMySTasP2hA4Kq^AUkgJ)co%V-6$N)&2Z4vYepBvUp**gB%1sd;dvJ(&_{2w#|t zp%-+0tN3SjKl~Rske9m5vg@U=Hk|(MJnO;qQ2j&FQOi5?Osg3J7xiq~93D(JnQ|)^ zTrhPUzg(LM1E08z5V4;S{G%h08(w@F_L(DhvIcZVGl@Fg%0?;Ur{)B;O&(-n&Vi2l z&d_n418nOJ-b;&Ulc6-EHq5(MFk-Ik%PKell!TdZDe0l7UdHc>jg!y=Ate&Z7Fb*O z%c%Kg84)gl z-TGKJX>fkN#E)uWUZlu^9GeB+KP_QGQ2-|pX-rS`9HL$rb!_s&B|GMa(QyL23vdiY zb4MfirbfwEV7@3|CW(rtMR2>a9+$o_(d(N*tVSiGOfhJJ+N_SBR7E|H8hrJbPY_v{!wbK=4On3v;yv*%QilAAJ0x@e-Jq$bV!A>!r1z@eF+* zs%^NRCQrmP1m%<;f?twtf|MB|vUE(F)zvAjrzK4KH!df!EFJfiJ7Bly14xR-a#s%K#80%)n={I#N z-FSrhw~QFbXs60t;k~)m0Vl>)|#dgb?{I6ViS@ngm1E!`LXU1PAJiFFBR!) z?3ChS!Aq_)XRBvI6K7m&t%)y5bay(K1eb;QqH!>1vTv{qGdeJiRNqa_e_|qkM_{oB zAqSy5hmL(T{W6^XPK^DVAA>aq)vR@uRjEY#&u8hwWA*{T_@rjtVtmV2!9UUZJE8Jd zgav{g*c$vByh;Vy*l*YR@BTQSbaWlE7P1aD{%rQc_^X+2p(5#jd*gj-RO7xpnUwrD zRr61>fJa#O-l@z+jinx}JZ>&gZ$JA#HtegfH^=E~b>piic^T>QF@ov23xrz^zO?c^ zXedq3?;#h%AP;}_zLYVYq$eTpLV3~_?B(G2Xc2m=I|vP&e&aZ$>GA9Xn%?A4dkw{R zwf`*#T^piK`kVRBIj-l~>0>44caF9+8wjSDKB?*>qhj??q7L<`#y{#->avV^^s*A? zN3(E8e-HT$^o|Jl8))lYlQxT+Lv{OApNK86!XlcX9&h4OoV5`oA9n4G!s*7>yM_<< zQv)Tp2wC~$0#N9o{IUB0f31e!!mWaUhsP=MNpTzZet8H`qBULs>MWjLQ^HkcWtyWU1@VC4@Nv`xr5c%KKL@_-nwrr%QgSAVK( z;B^OlJmR7Yw|^g=fAzl(`V%#-ea$k%C|BM8Jk-e}&^ZQlhcKBD{y*(}BM6fp_eQB% zv0LN*N3s46BI)YjcS;D5mOcZU%KTsdX@vh))1p!3Li~HFf2E$WecB_uSxi3G)hOrq z_&X)`PiCw&!aHtmEpVLZ-wesWvpofX+DoLx&9#SAjX3`P+4?7bMGabKrF4}@Ev@VX z#T~W#Kg+CALD=L1(r9g%96Ht(UJBs+CrI*J1n54qbxbR5#e)sjbi3Y%dIVP4vWk{;4OsNo}^P7c* zIaQ#JRm9H+Vva}k?%t*aCC_RhV`S+&@axj@k{VTslKg@~B8G%RW@W#&)DrWs{C+AJ zFM$9lN@->nxtHTm+v{j^=iV9UN4akLkiBjv%p;_Rf|f6EhWJU)aoVAC!!j-a0!=FI z#BY^!#e>4l*gIi`CZQ$%r)GnF^Trx3SkBS5Ih`9XV8RU7DUc)Mva97(~ zm+`ERQc&C5Mq3z<2w&^tc>}x%-kC#eOEh&s*$7^pIj-2UNAu8zi|uo2t~f=S{S-8Z zBtTRQ=aiND>51FXRR>ODn*Ye2o| zB*Z89fK?I8QJd=%P+m5_dc()=@WeE{B#>6r6VMJv@o+6bjOrH;es!mIQAh_z%dcz^ zBZa=NM}W;PC*J*{6Cw#Bsx>kcHXU*uSHh94Rr+Qgz^(U7P8GllIb5$Ay&n-l4o`v(V`o-S{lqLY?; zR_&a`+4qb{y!`SXOv`Urbse2~!N^aN)DrTl_tNbU*DtF<>gGE&~;9F~xjs46WTX=G&71=5nCpb@5A4?ZDVV;&<&xQm*M zV#7Q#OjlY|^UKjCF(bxoZbhQ3rH)B%Rk1X2pA1BRm=N5o&UQDCv?9eS`m=aZQ5`f5 zj_VyH&QpVfurk;uiqf(#h77F+Kl6=^RRO{u%p61hYy}#h&El;{%4t;u(StSpM#HHL zZ$9@z6$w$;)ld<2q~|Lt!h5D+Jl0b1SlJG_Y1B^Z@A$l>Mt4Z*%92EHU~V^z!1byb z5)#o)NKjG|3`Ap8D1T+wRH|SwtQ%_#|6y6`TL;=5*_H~>*k(|YrmOh^86KQ6El*jD zuN6bNWyWQ(0?V5b=6%B6%TTVNQc6Kh1oL7MlU)a*2CkyTSQ8SOIp~fbL8#R`XOll9 zGeR6;|5Ex$cL-_N)P~&P?^QT{RdvFO-tx=YbJ+<9>zeACl#py&WeCC+Ww%5+fmbhL ze~razSAx?t4J}El4dVxS+OhI(Q|NWDB9sE%@aZbXwTd7;Wf^#RyOpx@r6LBCGkisN zK8#C#h9JRiJVaoKf=D*0rFiiBPIxD6|^kph5m`%~|YilV>R zZt)o34>MKGkjk!*>5*J5vPzO&P9lh2-w4XT(E&@2azKxdU=- zhnT`<6hAXqr3&ena67)g+#`F+c`&z$+!k8c;s`k)=Wozy+jn$qTU6nK*NJ18ioe|( zy^w_=6tpxDdqm-hc3#E#627rE7vIH&%UwU?gT`f^6+gsC4Mklix+i$;=2W#5d_|Uz z$?RqtwGm`*S{$bM50}EZyPFf_%VL7$w+Kd7$v`; lXuFJg+Xd$pg!pZ};nlAxE{Wi`C{$RS4+%{vWPnE;#@I literal 0 HcmV?d00001 diff --git a/docs/drilldowns/images/drilldown_menu.png b/docs/drilldowns/images/drilldown_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..28e0d995f840d493d86cef60f2dd81ec6bd87833 GIT binary patch literal 53455 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

iUASMN+pMcTs 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 NQIu7asg`;j^gkXFrB(m{ literal 0 HcmV?d00001 diff --git a/docs/drilldowns/images/drilldown_on_piechart.gif b/docs/drilldowns/images/drilldown_on_piechart.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9b3311df03250b52220806b4c06ac516f1eae05 GIT binary patch literal 876715 zcmX8YWmMDu!^Ux7NsZBslt@cT%5QWdErJLLC?Mh}NtMyf2nhuo-3SuW4hBd{BT|lT zB$eL1|G7DPz=Orv=UngCcD~cr)sk0m2qAk&`tOE>Kp>o)oYvLV&&|!XwzjUWuBN7@ z_3mGP{Fps4F&P&Ze|&mbP*7M|Svm0M#?;ibySsa6Xn5}Udhhgd;`rvxn>TBlJHPS2 z_l{0lR`*wK2-VfKL-Q+b^E)TkH|s~IUeQ$s1_rw~gr1|D^M4oJv&-}AyICD0t&=Om zD}N@>32)z`x|j9`4{xS+P8JD-*}Y58;L!Qy)rsNZ;gRv;;t&O?85Te!u;~$GIUAZOi6ZUX<=-6YfgDbeR&14asg9Wn_7cSsO`zD z8~s$*{-ds{vi@6beN|Iq%jY&+dslZWZUHyA*Dy5KJ+wGHK8BlEn3xzTn*38Wxl%v5 zG&r@`@N=Qy*ZR<}#g^IS^0~iL^P|;E8|%vpXdODgnO|5Q9-Y|PSo3Lfp{aTVe^G(N#X)K0av$K2>wR;n~EKB`%dXO~0%n|F9V1SOf1127amz zN~#XZ?{Y~Vi@7?OQKUhL}OZ`^QvRr9b-Qh#FjV2R(Hf%Xc5CE_K-vf zN+tf)V$(k4q}7e2BY26YoL*3sUeKP=vz$Q)%L?`-w)){y!H0@Eq6pb_Be|GQxnHoD z=nzaUCeO{DSO`&vg36kLy7q!!Ys6HFCjJx`mlrQ=m1TdZsQ*^cHB8K=V*W32NtK2F zbEL8rSJ^W`tf=a9ZB>0m)#Pf`&&BFAboH0TYWzm6v*njpPIYmSM3U-SYwFs&i0#!) zE!WNN*3GZht?Uy!Y#5$vm|kqGto*7(-qhIIlK+V~!Is$-B0xmKT6>3xxU|kJv~~5g z;TGD4CW+Y-J!;$g+g|sj!_kzObVpAM_LV&m0^GzRG2`y`Hll0Y{axLIzq<$bx@VWV zm-mU#^c>#wToQ;H4*ZxW@;BJuOLS`R{AQ@8f{5VI)bh~u;?OLf=+yA|IFU0V3d2W# ze{^<^kB<;(AQDD2l!yfpN+KMS3nN6cCfARN>JhP3mP(Z0Ev zX(Gf#Ugt;piP+6AuMoLhI65T?yYzc$>4va8-?uV1yE6ZU7$gyEB86-7twe&?wpWST zZY?;qUJ>Ii8P;H9{(Nb`@6n&cJS-$Xzv_9 zL)4jgr^}OLVwOa63D>*C&xZdcKtci~kaV81>(pR6!=UtB;UzT=|3$+1^s;qo^Lyf0 zq}}HGY74$6ajVC2=zb~ePZbzp4cAF7Qj0v`ZaHD0e`c5_@4Y?WUsp2n2@yuYNkPXY z_g~3$&lRJ=0`9#eWrm(G1ft_^}8e z!+|H!(;xpEYEyZ(9>G@spQWI0V9I{=-dvOS&f;*Z-xCQ-h?!c#e!|mdqrEJ3DFO-U zGOrZh6vZa8-d4+)@TXXbK;IE@>7paZY?u6Q(R6SL7+)s8&-UMbZgYg{Dn-5uvapilRuWJKXFI`Dg{=2!NwdFFEq-f+>U}UfZ1=1u!#aJ1Y z_e1F4D>jJn-&WUHOiMI_6!AHy8~6TO$#hD0UC(kUE?fWL-ng~?5!oxWk?k|>x{>3* zUbc~Y#;keEq}LnK6mhjkN_Mod^@#$+tY4e z?$tUE*TX#HtR9aRvnI*He0`Mpz{ zxMN%Z6T?03p-u%ZsG}7dW}e!s!`tf)Rav8!`-ZOZZR?74K5Eo*FwJH!HDUetuNuku zMoB3-eMUnX>Cv>B3^c~}vaGkc5vXYzgBo9k2O@1^EY$QG34wLlrg1$R*fh`oE*VxS zZ%ubE$MM-Iuk=dS9uPXe{vMgRqPmsXRsg%z;j;nt*%?Bdw9)*K0?ULB@t+FaWc zH>p82PRja6d#rQvSi3fCX8s-(t=u=b_8mNJ{H)Ik!$A$`$MQY2AO8}i|KQwuheTU* zb0>8k61Us|k2UrIa4BYn@l}(6wVPDwf}7On&T8Z+euy#E%4<{pK8)}P-jDo>(v}WC z0PkQ6H0u!y2*Tu83;?y_eBiGkp@!m%7OcM2)B1REeiVC`s+)R&WRa0Ox>F>)%V6^$ z{Fd?|q=%uG@>NYJbK6+F%zP*uZLG!vt%ZuYpy(XVBF^GpS08a=NIB1bPQc-^vJxnA zb7OVtQW7$)lqIwrri=F$0(|o*&mBOjErE3a`O4f*P08d`W%1XPJ6jGNK>`=mBo$P; zdCALt0Jk1LQm_kA4YSAN6#PjNhn-RH-*RVDNwUbd9p**K8x-3%9Yz}o3Q#@R48K)a z3oqlYxrHz7@pnILEWsyw^ReVa=9jw zcEPF{A{ND_Yh*NWC`Zl-mw~$imiegc6^2H6P{y_<`Z<=Nc!S%`fRfDYeXgUYf^=C@ zI{)n-8bYGl%PER)9T?nLZad8*qh#cJwBHy~qD5V>cC>H_gj8ByxbFuCkjPA;fIX>G zfu4Dh>aR$vN`B7NK82K)$sb4GZyU!(xAQ(taLO9|ylt9st72^|9y3{2<7=iOE;aj} z(B1fX%esm*zhQ2%INdh6N9UytFMoB%YGYr~Akx*(<~b*o!)QXaPYLCMJI`<}WrQ`M zdz{YNg@@`j)o1_j`in;?a#Wj!cm0Q7XrJb1v>zmV4&KoJeKGs5<81iz+kb<>S6i{&22j!WkfEa(i!4Lgi_uDVS3 z@vK|Ws5bWD&@xl&S&u|wZTxeC6}GvvUilxjiGJ>mk1{iv>PVs@q~jeVshf*5cOT5dOE}U@?9)Rkx88gzB5`8%5`fCNFnltsKkQJ@5Gc3WhA;1T?vRV$IaoR z^bt*|ol!@z@=3S(Yo&-vADmFI2?(kZ7M3F|d`re*694kAKcGzh;V3@MNSRlaOL&1# zaE#`uK4;PxYw6(EAHI245>uW2tg0jnNg8RLoE>#6vzK{N>9J+MsZCl`(+blc4NWl_ z(MBm^Q9C5FUHY~(ZFpb0RQsW>NH9-O;eTZNok}-{*OJ*KJP*zXR=`|OmRr|llO*F` z-W+2HZPsEBF2+CJoRmIj-+nl9G2MD|T9eei`~1P>?A*=YrswCFKSP&`mpA{+8yOCw z9$YQU1?=`d=s3z4xmtH@8vT*faZ>W?>W9s{ioTm^=el>LdlPJ@b2L|k^b~`lw{nb6 zmXgdbY`?wzB1itqspR~nq~(TBHtvR6Ib5vv?ZXmmj+D^Ig^V&_oPbZ4F8b36wto(c+<6NSX~iiS`;$7#pr) zAI^T}&3xc3j|F&ONw47)>}Rhy4m6j%U@^uDB}j@y%u|MfyjxM7~Sa5w~{{Z1#t7 z@zbIlL-(J%HqTfT_|aNyO6L57`L0KQWf8~e2sUQ|l}A-u=qVHJrSmXyvONHfLcI>G zoWLqr7psRhi|;#)KPrwt)qZ~4AKp--x$ZAX?+0%Tqy5j%-0l6N*Qi8wRVQR}+~*Sz zO*r7b3y`oLBaczAbW(VT4dW7w@URDRx&WW}Cnn4L3vW`=9)P5+l-!ujh2Bew7SYur zNx5|4dE8_m6EmQs8LJrz*a?9lLBiZ*!ksDC1Z;vOW0GoTl0s+DwSTgQzp54D12t|(P`Rc(#27J5(&!$<2Ck=ymxShVlXh@Rx7Npu7=wAa$=>*rM%RUNgvf{J zq&|~}3&o^3W&tVvNaeZ7Mi8mIcqnZY0Fay^6a!f9Cgnit31i3tg_x~$>HZ;t5t8wH zn{InQT@U2oeUr~)%7T(h!y_`oK43|yGXdjp(h@va!8j!rM_R&7R?AJQUqZ1Il3s}G(CuuEgOmslc9ec4`PF{ z8Go>(0^vDyHTss_0IixBZ`vI8L#I1Gx=0stCSIZ7MRsjIsi0+2F?hPE!4zlg?!Y)CU-o%PR3UV;97i%&!_{rfzUA{E*^29yId5OW4E4UMHa zF)sa!ERC`*J&`EYA+$INc9x(ZWrg6fS_v|CPY^GLOdgwh#Zv}bD$y1$J;B0u52%X+ z%Zpp6O9RVyjZ4o$Fb2=)a$9`sgyT)wXvKSIpA?nk1Xi$-mY>#?hAWnj!Kr^qz~TmI z1_o%((A0wiG^dEt6*To^Y$b}K!v7v!!>rewTUN)m@Iq{`JY#vmK>3-34YZbK1r5JM zl#5&AgRHZXl2Sk4Mp{u^cm!Pamf7zG+xUhzpBwyChTp?&C^{S2rFek## zO=Fesb;IdfQ|jG5Xa0)Ek5@4l!zkG**A!tWMHn!M_7XvS@|vOn*jWwc=8Sfeg=!oL z)8?oCPB>1WW2bBjyyG<+O^B{NDgNyJrHWardKX!Fg{-->hn?bSd4p<(K2VQIz>Z_h zBt(kD8{9|WRKY8hNvWoaVSdq`(1 zC>gd{SVyaB4jVJ<{z&@=qYOqFS-$sQ3vX+%saXlc{DlK;4jR>HVQ*^4xjt5nDz%go z{90>^Lch^dY}BaHRgm8urx}+}i%l(wKcg~|P%vRtE(gY?Iwq8*0oB&@njJe5G5T7F zmsU=4qG@fx_L6_l$j0N4@@{PTiMN!DbQtd2&oiozZqiIEP-Ud$`i|Zkw)U6|%r>&+ z2o4OwGwHXsF9bQ%Q+AZy>8JrklK-Sx_Aw8}18d>8gg*dB&`>Qng=Rp;y;L~{4f&sa zM%n5SR}~>odWyfSYSOtN9#aoG$CN`7n5qDqdtt@@ggwJ)XbO&md8odT+S zzt8mH0qh}$oGgIi!)R#gN(XL2)edX)g};B}g}Q8-W+0z_*{YnLvi^q&Rb9Ap>`H%) zjNGH{Vpbo6e1i8k$UGt{N>(J{%UbnKgS}zLm5~LzULo&VdBBPFaDg6itHeasix>pyKf6OPQN2@O;0nE$s2EWyOQR(24sU|ULS=t;@f$|x>#JNXgw2torSO$ zAi1a&LICO#Y4R8BjT9y_*)25Z@UQ=wPP!gpG%ILg;XuP6<|PS;M#NVhgT9hG^f2`CbJp<%PQObHJ#b-I}BKcczi02W$Vy11KK^-88 zpR{e|yKagle)D<5z8&&&;<~J2*!Sm4x?u@&E9?UI{=(Az^d9pjnFq{%ewSc?@nqkJa(3Gx0&5RFa4DCF}GLQDg#3!c`LlOGFFN<&*tP1^U%# zs_<34Cr;lyHr;j$hmJgJx6!xbRn&w+v^t*R zFx${sz9f#uZ;1U8PGfovi~D8je*Hc8WuPaF?z{cQ>%@%!m1Tk4WhRq|wX5Gl(^C#0 zGa9QVO|}>Xtel52$S(jy|C8DRx!M`ltH_+_ID{I}GLqfX^EiN2%SgwntJnD$I97&) ztE*}|Qzsf*|G@(K91SM#VgCkXsJ}NAa#Ax_QBJTLO!YQW=sS3psfHmYX^EZZCp@Fu!1(a_pATDgQ10 zBEetosO%*DG`i4=_F~3D=sKz9zt{f1OBfx8?od&_Xk!<5q*p>kd#Fl`D1ni%GuuWdHL>0f;J8Cwa)Vld?W%j+G?RVl4 zKDO2?81p{I^y@q3ZTRjR^v~}!@M|E9f96jPHVkxW>xsjSF*1@f8WmcNEo;WJ%6hEM zjIDeRCBGfY|LBW-osy76vBt_qMr*>Ez2`t`|N5}9?QXnunWxi(P+k=5w)JG;X#AhF zj*60zCukR~qNnu@u3O`8bZL!(Gx~liX?GMS-nN;p)GmBp(sew&JFS#K!{#IFfVt|y|z#0`Hk zSfVT6eJ=;l@0Xiafh|UgZCfh|E_2*Vs>iEkta|Tb3g6Fb8zn6o_=jx{P@A79s5G=F zc%AI0Ws6*oN0j&6Nf+STDlO4xs7TNDSXe#tIxe!ics^1X5!-|N`M&1*$CCf+h@{Wn z95I^QwNGP;K3Z{Xt!H^NtroDWs09cxsN}}1b@FdgjwX|w%Wq^+KrXtZpz5fDtR!T? zrtq7SUtOQqBV$XFY@Yzc3ag$@dTMidrd54U#0wRrEvCCZqm!Y_0}BS6^z9Uj7iU8H zM!h(o-TWL&j)Sxd0PRHDiYAFPkrez&Y*3#MF5!$|AndbZtUcev+o^e%elt!)ZEHOFt_R2Pz?fCA zFsrcYY>9Ajwcg9gTk2lVEv;WPoLWBip7MS8B#)rcV;hn@2i1gy~m7=&X=>1 zbvDr7erIQ0)HIg?kx|cEWGAHMQd~Zd|1dCEw$mLvox~AtA}Vjmi4U^ijS*7!3X6`$ zv~#()o2U7_m4o-DV$FlKtuh_c1D<_&{$!x>0y!G+JU8g?`EyJdQ=m((cb_VlRm(VV zi`KXg6@^3%L}lMe-68NoUmA7j$k+{>Jz%R5**oI|^jp%X-FvYGnY2ndUuJ-kpY&wd z<4>KjiI?PS`){8Hfbpm^IEzN?!a>hm`^L>r=Egh9$l(F#@w6IBg?^?EbYGxht!TSU zJ6WuL-=+7td-rSaa5u|0zSB1UPSWv@mmb~cmLl~$n1uA`w_Iu zdW`WxK4ASFgD(dC@dH`BYsajeD~&Wkl#?@ zn*&vFvv^BQ$pyyv`=|3YYO{gk5)J2f49&R`D!BHltv}8yj`jdfmx?3ZH4a`EJCK;a z>H@WnwZ$O$DR_qPjkK5|{Gn^?y-<7D7att8Gjd4bNZ|b&s{%!6_|!8dc@d-mj`JWy zTXDP-2LYQzcgA8&1fo^>1(M&eF+91y9+fJ-%M;FB7)_HGm7l;MDfCA^iizB-wl==T z`yyJazn2Wg=fcbIck3gqKVCComyb)R0zz$5jD6Gz;AlW=DHcmoyBPyGCW)8#u(VXJ zR3^!B*^C@0ukP8HkkGnTlH2byl^{-DuQ@VvfQkYAv#!qsALX$bouxEfFM&Dsn`U~_ zy(I0Fah&nLO#frS_4pO43rRE&`Lv*fABIXw=QU*(Q%P~6ls75glk2N-<9fae-bGXe zQ~i=z8A2064igt`#!OF8G+scIsK;nHB2*Hie!DZ7^_TYj3uK~rS9Rp$JPXB8+W7m^ z%egtFnsu-;buI7-YDctRsYO+Fb_vhJi$y`Jv8cO!u(U>cQV5H1=w0(PfG}cHLsOR_ z2&r~A*uh9x4pRPFq3g+-UTD77q@1>Lyn!{D6|bT%C^Bv7m0ffM?Nik}DS2L6i>5Bs z8NMiE{yd6zB4Gl`g}3=Q3VEJ-mYY((F4NQt*@BwQg4}%v@6=6|rB~e|p zAaX0ti4JJBna^q3+$A(m0v6rgfC3w$6~cL_R5Ecs$L5Q$Q^5rLA+=B6GBxk)vr@T* zP!l*(ZHo|MJBl5FyO@TR&U}G}(szgWRC;Hf^m%8Xin&{U{pF_dwgaRcnSb|8LP+kM zBvA@Kc;EdvB1>^yOb)1{_REzfG}v>_i!s)7+KRrng9N6HiB>y{DSDS3_ZdiDNTIdK za%=kdYh7f;jo=^oP#UA!-mYxN z&!*(x?auLRN?xF(I_oGIA9IL&fhj26VYKkOQ399EZiJcx3k&U6>VaHGn9rngC_Tu^>#rSj@ zeLNX6J_M*y<7zaqPbRro50uBE4E-)9C38I=#HxQ2+bn4OPeG>&^mpi={o%739;(l8 z?z8#}J4^gMK4KM zk$#koX?&ZlW=GahuU751sqxvR^L?=&d~TRF>~;O?Ps*P0*X^yAxCdO>@G^p7zRbfb z6Up$S+ys_>YQ-$`V^lSL->-rMgy%%<^N~^j@2GX|sZQd>Amaw9- zZ;$7%C7h;EKE6mW&#kw2bd)UCg=^@a94eY#%m@AK*IV|OZ1{M!r)7ISH+9YD>zQKc zmGW=<{+;6fCgU(FNZvoOn|l(FUvgWjQW^9&flHg}ZLDu!O>L;eLH1U)WC^hvL3#==xJQm7mL0W$IV9QMIcYcG?Daao~#$j&iAiP;fn_>@?LlQ2j16Uv(G_s6$ zNFiESWpn~BOHA73pbwfH6lhw2rFe zXJq7fRFo%>7Ai^Z0=<&>kE4e3A7AVnOw=oGh;vO?g)SL~KG&E(Gc#qiuz$utO`3Qh zqKt&+wK3QUE~Mc?#>O4h)5>MjB;ae00L>{0E8{|A5wxjgnNnl~xon0~QbtBWdZQ&k zykctRwlD`2B*j|WZ_{av5aZay{*?$_#0d!;BN%Hs|LY_@b(EUa%jBZE{WA2{TYHGX zP`A50c62U#Q7_b9C(}wEBpo9}Dk&hd8*?L+D1ZPyobM7qfR-LV#alS`)lB5evq+adaBA5%kry)TmATy0uO2W!>;R_D9H=65mC(3y{#FXWXUixOe%FT~%UTl#w1tn>Xc=hiOy zTWpjszi#Skx6!0#ZlzjA{4FPRzd*F6l{_Gv9pfDhdNBj6;O@%{(yLvK9gb~d9pYy^ zBctzbi)hPn_UX%WZ$Zzu`SACr41s4ah?ghzH=_04az~X@4GAg&j57zfO(4(V5t!Ck z9hqTT|rp9Xr_!#^* zH`pQ=DzF*nf{jY!SMGJHh>;gJR8{;r)Sfa}Na*(g80m#7?AE?JCxek>hD$OG*E4MR z0LFGXq1?m%5_*9(gRdlXb2IbXuMCGh2T+2rfEvRCbK27vWx3mFm+G1am5O~=WT)OF z9O#ky!p=W~1`UsUKVNh>%h0Q28ZDL?`8F9P4;k$}9*!_;`q%ySkGt{a*eCwX(f-G2 zr-KH{Va8|it&QD{!%VyKqvMlJ=U0vC?l(iD zNerzZnHWk&Thr8`0cKep=$mn{rkTh!H$ilGJSLPxe!&zX7-nY`l{ljvY&<@>YV^%) zLUx!|`o7M8*Jc$v;Qcxs4MTHHTXU_K=GrgKp=dKmbchrt+#)khUQc_HVZyL&xR`44 zABXu*28&c38r*8~35kX960Zu2%ELDnRtXl5axAQ?ENt4Rme@(DXQpgrQA(NNx-1b6 z2Vj1&ww-1!L)$UnaAfDs1myPQRn{2GZHtrx(2FzlWg;bo>kJd6`J}{asxP}DAGAITmumn zm;*F*`4!yr(;_;;voCUw!>Z^i@=0`LsH|0_g_RrU;HOilb5J~>Hu8k~QK6xAk*#&{ zOY0It>w#uEi|f`n!z9oa*nhyfYQegC&-(MVbq%#m^;)FQL8OTe(BAo1y6s#;!XseA zBPPzMHuE-2(OAn`f9pc@kZxo2RB}uL)srjBct)EpvH42p)-Os?KE_c#$S5Ctq%#Z1 z-q~h=Gs0?g0=4iXl_RS1Am6OL;q%$Omq8G4=d8VSY}@^bFvE!{&RDCiX~$pF0Ehlc zTZ3*}rLd;hs(N(QRcuw8HG!_#vJS^{*AU`{eK=riGsubfDBI8EoV7vv^DL7+%pd$h zkp0WjG;S+jT`2RDSNMzJiePtJHA7p~+jf|y*;Jl|y!(CjaV2y2Tb)wj9|{Farq3+8u-D6)1Djsq;I13K$GNZ{m43p5IFFfBYGBKLC+)DI7S!~z0# z%rj2Sd*UA_Wqqu;zUOiJq~K{b_|R_ffITX~VUp27M0Uxxewlue_K9?yheUF-iFB6) zdchV>@A?#&6`z8H5MEhD+SylHVWU#rO`5A95B6d@sJ~w4KNaeE`fAEC1(`QeMP1MU z|Kb3@+n8O2``*GidZtD+wLxtdnG zZ=LjRqBjRdxwe*Ttm&C!tMyfIW?XB^;?6Er&fx~mc~z#|Sq}7hNue>>*fnPx0R=}( z+s7&+PE63vg`OaZ>9`8x6+p0XXa9=kDZ9JXUY+z^FKQx5MY*cXP z`}M6qrG5VD?XdIBgjwza^Q>McobqBcjh|_)JMQ_^&a)8MgLhzSfAMH|^EV31G_QcA z&;ay5!3zC=O#*p8T=UmQmE_NbN}DK4YSjLwaMlLx`X*MDc0>ohz6;T6Wmk`tHr=vasagfA)dJ5f+ zj!-$zV7nKJ;Ihm6yXCj&R-L{P$~0(Qj0P|9rtB@>UsCsoa0z39S6b|x)WlPCT9^LV zs=3(~`s>!#vDVsagXxX_c0JiXt>4bI+ac;sz319;{Q{@5+u^Y*xaQW=YuFpP8(Qu@ zD31I7tiS)YW%m#F8t~rw=B~=k?y>C4F@abtVq-E=Z}Qpt&yJ@<9($i|XnTxb%sy$K z;hOpd+axUhc-f^#BMIJ@xY+YtbpO5hav8Q2j-CB9u)U^5xsv{Jt$1xKaX-Q^`UR)Q zuI1j27VfU*eh=T?{*6bUz#rWo3-qsxj`rQAJ^sM&L2)^+E~;N$cD%ZZykpz7bhZDA zaP#Lf9ZGTwNp=?r`0s#_9v!Diyd;l=ygT@82=QCodKvkO@*9$B1WElHdF9!9c8!G7 zc+%eTq`T`$|DPwr15d{1N}G>7ncsP`Bzdxa@}#x1f_?L>>w9+C>p9R7#d#-&BIy;^ z#>-m|R=6Ro$6QCR#E*QGLWM)9kO!XpMvzalN!sKsujm&BLrR=KcF7JT+DK(TZ=rgD zM+por5T1;GtZx(Rxex6XjOG^v*qBoE9`M+W0>z(l(ERf1gWKNz&raZ0rtoIbt2JJw zr7%BxHF3ofpOD{=tUnUUL(M|&M52ntXYUocpi!IU)-SyMpHhiOQQ2Ws`=HWcipBr^ z(HD3CJPL#uvUKxdQG6^YSrhb9D_NA(@ldw$fH~^PS5>}E2;&(#dbS!)kLnM0yTXU5 zUa3T}k@othiAa#`N{2>mvt*CcL{fkl4^*PO)Vbuzh>ossNaMOPyD5o?2bezhfaYAve(H!QcjtSu_g`vap;5rMJ`1DO4K*9tBkM7 zkH9um8lA5SI}_T)mGQ$#m#_Td&HRQPyu|uZ(w%;C%AqB?V(Oe4QC+8}I8@Llb-vP2 zCym#B7y|)mw%}KS*)1gSWxFsb}qo4X|!Rzg&kdeO5 zyG40HNup$zUF(anb*SG*M(l{Q} zY5z?(3P%p24Y_-I6YvrcgN!Cj$bu*S2&na z%6;=7Pu&i}`1&LCkheFUP0nj~^N_C(O+((nCwRm^kS6@_i~H8m?V(H|!w+e$#{xgH z75zN;AEn+I#i&Kmi7BQPj}_`=NLg&v2~C!omYCj;sTZEEw02Zk*gh4RsS*DiEB4}^ z`_DSJpI=V(8pY51noiu^3fcK7ikYzDdqTBr-(ov|*^$>wNs0kk2AU(K$=-LYf;T4{2T(^EPe0s_V`Z2v4llB!3! zemkf~bDJ!`eRJCBtPK8yZc|T|^!cF#v}DM9M=mUw;?F@^ioU~L^YsbxZlA-9n9$^N zySIDo2i>7Dr#|c&8{KL)f*s*>ak8SFD+zKtSm=u4PO0~b;=c0PNBR2~rACT!-~c{l z?oPASSJJco1&Yfg{j2xy<*D1_acR?k9kKvp#J(0J4&K6~O#$})S!R{Z&$9DJ} z8wf&GX2+82-7&z@ylRp#nxgdbuGjF}W?af@E=!=wnvTOrMu#?3B%`IMr-|IU%qoP1 zxibt#WgX8WQuX=Ag%-<$U{9F)HGk@Za^~A!dFr!REm1he?GV_c5uyid*6^1Ex76h4 z0Wzo-RtE1%6rx0{o`|ydwlpl%m8(y3EWy9wjgP@_SJ4+B7X56;#Cy=(V;1EH4B6r> zj5h9`m37vnFM4WuE4KW3t&5W79w;+&Qr$g+4>{o64hfx~#u_kyLH8U5roufYD{fov zuY=`m43&~6qbTEAvL@Xm?taa7neZRrCK5orh#3H2$n#aEj_UT;KIEA6n6P;Stm|nV zsYtasHMPw9OfOlPUIr;j8ob8bppubey~eL!U0_3y6Ph;qHWDrs$%cX(_Hw&b+?SOR zWEe0JeK#3mIQ39Yy>GG&u|h8Pz}`koz5X%YNIfv@I1cWJ@RpTMqv8uw$hi1`R)9xw zL#GliZ!Z@*7JcH5 zWxPCo%p=-K@q}fCDV#+M)@2EAn*#GmAv)Dz(Qy=yc`2MifE;)PNVf0+)l=gL;lCyS zx%45}xUwRc-HhWQuveki72$V2G;~HOcad_NElAjtKp{s@S>JJkDe9A3=Xm)2uH|j` zoJxDd+>)7xSi%6#EWPBW1tA^37|vyuVIIcnY}GxFSiz(iNWX zYor^Kx-r?**-!OrQb2V0K_{H^D3WXj%@bIlC3J5T3Q==p&C*bn8A_%SX6lYTGwWe# z791gG1H@l?&jYd?deM23=)`<3#n?`;s<|46{6usJg10Y}qYP}~qQMZU8z~D^BNwq> zrGGXmck#Z2P6Sg(bqR?gIHW{g_gmiCgCxOSNSw$eyR{!V=$Y%G85zUF+5YHDSbmZgjqV2Qk~{UR~<@8m6&^OBL|Q?opR`y&Lz zdNgbxQlpJxuCPTlH{!3O6_-6gxEs?UTS^L6)A>MyfF^&D@}W|!T-71X1iKH}EASX> zarYc{GO6-MVWYQ&%v>jIunwGBc-+F<+1oB{B%pcyKGFsWpn3NwUG$4`JQ!upV(J(9 z0LouJg8~4@W{BfHB4|{%bmnx@uld$vWxe={<~Zv8JUH5d`}lSNy&{ z`kd=XwF`s{Di277W23|dYk+#jVSgo`vjjx)nbzm0-hAito5ymSOG4?(KZ7Mm$eIQy zbt45)Q0}!Qg3f}?R7L(|>SQL0%Iz=QOVziyrF}~=1s{q3G0t-!0j6@>{Q8!vlTymL zN30ia(7E@uWfY3zQ^-#=8sd(VJ{6asFp06jaNqjJ{ZdWl0(9cVM}2-7?v_^@elK1< zmZFxI!)Iny;o;BEgf)+le_NQf^J8qJ-fk#sTynT6KT}6^k5Wr=8JW#lPDYc)MPxHr zpnl}d1D7oqcCzrQ{Pe=CHgS!5Qk%%}Q1g#XIy^6SaqP#_>~=b83QvDIM)|8j)pTB{ z*E@V*G+siXv1E)N$|(w^erEQWgYMqcn8=#)0zdgl@VpR2GoNocDvG7W>-yL8u-yl}q>Sbnhr{bP>^eWA~{k!cbD3Yjl5mDSrY5pwn!JU=ktt)*YzOo`uZeMl-t ziw3@tdJRxWAn^uSJbQocEkLG8k82`pNv)0V^90gsgX=NAF4=0p6|0Spx99<~_^e&q zlRq~nA4US0J8CF&llka4Db?8(8Lnf3EbvR@%$Pg(J6$^kCBQ-_x5z^fl;K#)E7dij z89Zlp*l@QtT#c%&ON9Hq2DuS8yfcbib+wiykeY6*lReh=@tAM!oku99E7E)SyMJYd zO6DvMESZZT5j*W%S`1kfv-7_;EeQUhqKHsn=csw!W0oZ{X$;A&m*MbAgwQzweI#jn z8xaQ2X8tDFtvIR%<;Y{Ty#d-){T$gx+D&ad93qjT%wTl?r5k>!wh#PfGS><{DMVLjj_I#%?Jd5%qLKf z(pI7sPl$sYP&CZnxej1PNOLO2&~5vc!`wUN=e!K2!$Tu%0|DK)mo z>bx3q@??JXad$OXiiU1^7&9q%V_D$rrY~nS$P?-27w9($SmG}X+!ka)4K`HC`9fMS zLoYgm$PghaW4iK5-e7a{PP|7goqQ?cUDM)&P>c;VJirAYJ6SCHg-jY=AUR;}%b1$_ z$l`n`gqbVLT-?sWlI*Ur+Anu!bt@E|e;5tk+RB=fqU}A+`$>;#XPejR5)xsM8ZzND z)7mjs?-m=D!;B}zoOZLCG*>Z!EX9;HaqZU#2QocOA%gM@yUM?Al^M<_FYp?{t2yb2 z(g7BD#`g1AXgvvi=747jo}oX(-Zjm=E>xvTv-2ym5_*#06*AAAlQ7+f6}TO4vM?>0 z&-Ka^Ab)@;KYNzpj|0z#O2(7)!Joq-#!STTw2cwgZV+LcK0qpl&~d}tB9HHgkCM^Y ze=IgZF-&vBgz}2(nCW@~Xeym;YoD8RrNU$L&ws7uB$&L_T2|R#F+bS|B-wOfqjrd;M{eS`>WojVMd7GV%_Xg;O$lb0(d4#%=_2&IV(Y3 z*im9S9YjOJ=c6#$A_h{Jr;0s*$QN2|gg)?NGSmJvEw34T@OlBAkSlL@ai>|yOX@>; z*E?R@rJVpVe-as&ZFOj;rRPJBM`~0H4AMv(Gh(w`rCU7U2Niaa_?F-X&;1sJ4?In% zNY!B;K*b@fm_eCuAlYjv0L%w)Lah$93YBc@q_DPA9aW=}e<2;e#be(kEpH&vM%uV- zkyDlT@dIaeeopqd$YYr>>a&f=rYIPk*ZYJduvGgE;yb0xfQm#KzDESelp8Lboh9+O zWBY~hnQ7E(rlxp=4O!K7CCT~N?eDC+Q;4iMsWfer8>7Fgy3=EOi`||h%U*#{_LJ3D zyxq5`URtP@s>N5*9l{4FelukeQto;IrH4rF_U+!x2)_;tqdHMzgwdgIXl}=sE?%J+ z;d_}+yLeoT)w086tw`ywjDi~rlmbOKLPZ=FdPs^%prUu7g$8#ddc~R$ZyE3qYzWz3 z+%HSZS&CUreh#(WA@$c9^22L4@Q=c16uAOdv};Jb*ba9<2>0g0hu0%gSk)!yFtlHiBTV&~W zIpV`)VRD;Tq5Azh_eS3r^Qvu9v$>G!fgZf%fU$kj zT(-sHBr>T^pq-)yy>Lgu2xVIcEuZdRa5>;h)sG=N(Mp{~w(=qBssU?z4O-H1Q9~>& z&PHBu1yWAf*u$5OE+KN~wsbqe1CLK?fqBqEaeY{Q3M}o>$NL zoaa8zbD#UZuJ3uoQYfhI#q*!nQ{B;uiu98PY;aiqQOM$yE`?pP=`9~br`s;OC`_$P z1yH?9Xj9PzQ209yqEElUJevvLI}ce>5mPgiktLizI<7jsSNgA`$-vCeO*A~*W~XfK za#8p_lkOhLk5{D5Z=yU^)yew2BvoAj1ASrem%J@_;lBNyHhvaEq$HS12J^WpD!vL8 zj8PyDd^FuQ|9#|g3C@AzQ8Rqm$b)jFbl&mtkTrz^d6#{T0;T2ML82WK96O&heu8zD zd!eKv^LRCts$I@5`&w1|LG0~VV=lQ8F>c=_z&jO@^)Q*_Y2EW*^O?&K&j3R+Lm?b? z^H;>L)ei!4cE2z7b0;z+p$|M7E~wdqBniAil0ccCeQGm#YI$|6WX_j&_I4#{umc0r z1OwR%Z9Azv=65|%G2c*kJ1ky7bvim!l>Mw894ndn7ui@kB-%J7Ce@(U>wiawJNypT zx~GDRrWo!eRM`t6G}EXJGv8Jjd0tayNC!i zw`=zGR=MjQeX*s(vaxxNOWx`>o5DsJ%jOl6!ONG~^pTJzEdgG#`Hc&;VRZ$_@NA*H zB!fWq4uj%(q^PR(lYK|EK1FASH|+7>SVLC2h?&U_wm{u}SPNQ?@6K;2-WVePh z=}k&f=#Oi^NpJRUl;E?a)V0rF@fV53|A8oK#rCKQz`U`d*qR2!jEJfNh4M> zV-YiQ;RNzJ9bWQ4MT1&;g^`uxO|)}{gm^DM~e=S#X)pp z@z%Rkj9s~sKi;LGi{BiK642L^g=lr4_Eyi%nrNaf$KCy?bL;Ytq=-=c$Ua_4U`kx5 zKB4t`axX6jm#)2`cZ98p2`?O*&5HXKE1Kc>g>-T7$=?gS0$C+@WRe36=H_5M!s?KB zVwYd$C(vbTk&w(TCr2z@!yyA_NC3z6)i*bMfA-*^Jiu@}5Tccge-ZI35~Q0OVTdH2 zH6YTUolMAI{l~yB63GlMUQKD=NG_4b18D&JRCVO>lcI^AK5tU5)~XxD8U~K`O0@T@ zRt@45X)*+=;z64u?08o;i@K1StThbUFnw;bqjOEdXv?lwHntCA{e1KGl+PLJNer}T z^;a~*zIAn5FEq+^Z|Y3gC4wkue|%HT4hBJkLa5%kUV$TV&ySmWrHzoh;4|Mt;~2{L zeblVP=Gg=TUZUMxADFk}FosfUFbV?C+CMvv`*DSn^>V**F&-P#^7>5_L)g&9<(>f( zB?U}YaI7XVKF73NYEC*IF8~^37gzQQh*ja(NbNhD41J;^Ac6KW%a<^3Tl3xaHgi%i zbX4!;^s_1v`aM+`7a=`P+hSkBc~++6nCfKo9@Gq^u)#U_d;q%@rnQxJ^^S8(aElA{ z^V2RV8OYbF&&~G#DOb@`>nX}sjXfN1l2gthp+4Dc(N;U_wqH3=f5-e z-Cy);L^!56`KRC=q)aQrt0AeW&RPlBj2_HYhZ>4kPF?#JY%rkpxM>ucCl{$=YHGWwe z%2iKY+ZnULv8PC04Tl?fuV7nMH@=t^6hGD_`$TcDL}^~AW5gSm2&6Wbq=f$=nDcWDOEO8B#Fo*bbfMmF{men?;-&-Yb2=%<)ukHOB zxCD_pbc0u{G)s`DOR(jXXoo*a|GMII3N2df0Aa1Z+MZXPUL40}jO5hW6jW|xZ@=qj zB1uW+GHba2J!R{jY{XR@uf-zlO6nDr_#(wFrZ|2zyk8)#YbqszC8rfi`gRU>Z2oAu zU_@B>rBaW3_$ds(SNaVD?|bnts^oBbO;gh?35XnXHt}(z8C4BGd_|TPr=}m+X{#gR z?9ARWx1^uX7Vc5DBY`GG)IH*s_SVCk=cTv@M0T#_c&8TF5EeJ5tycH&**9fR>SY%+ zW9y{sdbpJ(9n4itQZLtl`q;G@Nhql!`fin;cW1t#Q^z!}-Nuo6Cv}m38n0OiQMzsn z3H`k*P4mBZ$FVxlx@+Df_%|gjS3!i6`@XTW;?HG1tKw>t*bcy|JO8_LT54;*g3?uW)__*(kz066AKfe5vVJ`gEExY_#4) zOil@xdLBjX+FLJQX{(n}(cf>QS@LQmyHpN<87AMR{i zl{1&Vx9Bv0dDJcc-3A&AFYz)6%L~!&zW5hZbW{Aa3LdxQ_HNL-6lCxzpd8OsD_9ljBzoH_ zotg0b2T10)DNkF?$Hp10og%_|tc`bjPFckEj_equ+-Nj@tE*P$YtRS1ZJ4e!kEL1o zD7o;Kq$p=$jFbQLI+;|#xxULhfotqq!q`$owhoo<#NLnYXrKOOQ44u(&CKM0t#AxF z579>MyPs$G<{)kIPS`4D;V^ZEQ{h7?UoOXVNAT}UvRB6ie8f!Tc_}_;!a{v>WmnRT zWfNC3&1?!1%6Azgvn4wuNFOS%ZKg{M*Nctyghjo^9GBa;82BCHxl~(E>88ta1-)cM z!9JUgQhZ&2pNKRV?=J;b8cmQY%<;_z^Xy=XeNu&cuSx z(I8K?px0R%@+(n3@$Hbgp5bA^>vj1|OpEq&`ooI> zseO2-NR0e&{x*DnfIewR`y&IR?}Wrm`a@)%o(b z!vj|h()kKyEh^iw*XMU>s4RauxHFk;T^6i_Trhb%Y+LAc0NM(aMVy+nE%n7q=w2GX zH$WSaJuKVcBLZQxukENV>ba7t_dFgTm&lCX0OJfkU-Nq)xFX#wS)jOkd0*4B<9!4?i*|~*dP>%l4(MD+la2ZU z7-xHa6<5(Tn{FqT=2=w{G%wT_P3L?+5+;#e4)l}QP**V0|A9Jp(%SjqQ|bbFk4{)g z=PjJ{k;&zI`CYyFc--p@Nt=RlF-f<6S}`3G6c>-s3bmERDsy);VOQ=?*}CFy!TkZU z%7mQ?)F50o{VQ0R$$p)w593e7K*SdgNwvSHbO+5$3@B+@ZQ>GQ_LQWXIU{H8Gg)I! z7tH9as$VPo)cL)_08!%NYs;C6Y|8JqYZ@#`4ClTAx-~NI2mreppkWTTAp$7^$d=r` zOpC%bgj4Kb>ni9+p#Cu!mVti-$5iwOMgs% zJBsZc6~W1T{;?q6j~?rO%V#;A$QkIW{cqEGnlHf*L`u%9_$50V*31`QjK8|OGeF7} zz8BjsFMm}zmT-@|@Q_8rL_foYd2@aGuklWMpoAaKJ8l;Xy~-Ot`<4%=Tn}MgXUXr_ z0?=hDDrc%hUcMThJH>W#nAG*1uf1;4ga^my4M#93*(lle606{cSLJ&iW)BN_c9Tb5 zrt&vP7#q-Rr$fF-Hhqz=;L_=V6;LS5N*^C-$+~-$zdS|N$(%NR{dGz^FTEutVSk9d z+(dv7*ZKZp&*fvky4|l5P<8#j*~`ykDcAf#V*aaaz2vs0hPS2qe17`e9SE!+=DyWL z1K~XLW*wxtHzRSC<36TubV9jig8cz5Hl&H|Ov46`wU5`Dm;tr`=DpT2gwso&@eBBC zVNh@H$zp<8sQZfHVR7AiVE^mN=WQAvf$>_ zH7l&D$vrLw5R1GLGzEjO0N!CA+NTn@lLIBxiSR#TBU>Ziq%U*S_l7THd2E0p()BYf zlS0Q2Yz?O?g-D(Pzr>HaaIre;Jck&b;XHQVwO2tF@OqUlW(CMW>bWKirj7xhM_`E? z+ighHQNLcQoHSr3+>v~0fX1&&L2>#C@cGt@8+_qWS(Nt_BH{T**-uB0C3g%S*LiZE z%e!9}tZG&-sT1@mq?f&kE;xwib!y>#Wj*-yJJvh?>C<3bhr=cdW)@mE!U;VRqizmmw$zzCsf3<*076$ zD!}IxEo91jIK@Zu4Jw}H^xwX|cYni(O&v4fwU#(7bLzV?>PufU5d;Vw1p_Gd$FZKM zbA4A{PX@(SV3%?@Me~GW0X$nd=93lM_+T9NiiGhf_lO_X93-#D;$Ymjs3t9LXpWBed|}j#|6bs>x0RIO1B!W=3RLCs7+RJlc#~s z-ao=tUvTEhv~a(^NZvQIrVH@40&P@{!lhb61FYcJ3ib(3(I*4AF6_D2VGEB8!=-)H z2N{q*6JjVT+KVpGf>egK_2rzdPL)!MHw}t~VS(eR()B)%qi5u~=robFmd(_?D3DGK`NWtkprFQ0)P+_48C83uJ(`(%Q z40OkyFt?IO=$dG}@?Azdv%x@h3@K))U`;;_L0&-q?%@a|>fH*M`_US@-3L{LW8NDv z3sPHs$c(&C+mku?Q+vCwF{dOsJ*7i!i1j}wF%bC!gVQ_?s_K$=iQ7z&m>-cdy<&iG zg2fkpW)fh%ie=SXyHD?7_t_1f#!5E<62Xn!+{XhTK#H_3n zZq7Qjx0X>ummtm{~KfJ*y zJMiVNK89!2t9`&?MAjZ>Z&pV(F*5xiNrIDi2EQV%0d5RHrpV!tPP(e3=F-9EQ}Bb4$V#S7dd8uVJy&X z2WkIifwCX^JtL{{#Qmx<+gCSf0={Ss79j(&z_IhF=lM2uOJlE}1zMP``{Y$rCmSrD z>D~P4O~?#)BJsj+AR?KGhuHX5r}&oOoHz}T2B@XN`+n8D!Y!Vn_xFWAD_<6*IE#XX z^?Kj}6+HGaI#U%8+Wf`hBGfR4YsQ*L6E=2YRiya48J-p(2M+N7!UTwtCzUlK9eMCQ z@Eh9QI7*dVF?6U(@M*I)1__ii>=n$>?DOaOcd*ZTIE~1GAt2vN87EjB(L50Su<-jjo_nWV``D8IQcDj{a*@Zg3gIx2XzD6|r@C;&t(1Fsg!_WZ z&66QebW)#p5rbx@@ZI#>Og-OO$s_98$uVI2CiYlBsaji33C_dN4aFrt`N0HMI zesxtbPQ!dRh4ZtElF*X= zQw`P7Vh#YNjB5z`7x`f{Vxyh6t!(Z<0>w zLw#Bps!VKQpcI+HN5aHE#8V}xLb8igQ_nM}YfmNOIaK*?1ZgCf>_(s}zt^=2IXK&u z@+i=-O4ESNCZebpb@SL2Bl|CM!7Os>DGSmI66)?!>;R#p7 zpLusftK(kn&IS9+)z_Z)XqgQxZ(#RgIdhx@k28R7in(R4QXL$tcG(%Vy=o3c~a*g8C zso?(CkMRQ_*?ZiS*^0rZS5DF_z+aORm*(E;6E4SF;UF3)FU@v1w+pn*0qj z+<%6IH@YCl(g3h36ID|=7QGGz?6dxff6N%Rh{x;HuK5XLksC`npW@!oDeN7YQSn4k zA83?C6^kR*+&2@oPDXVc`iHHFUjO+}2wYKwsb3!nbOE9j8HlY5dtQUJid{B-1Lt8# zOg*2V@;CSWB3rZ9SnE>3a?fC4L1{<4y(QR|=_wdFUGP{!EwmKz;FI^)ISw+T7N`(p z_9X2e0DfZPU#q7C@5MV3IlCkpZdD8y_c$~Qv2+k>6kgF@=$M_0F$=Eb6X}`!BiGCw z-ORGeCzKkK#8Hl-@(?ap{tJ2&(sb{uD|#*a2bM_P|8|~Ulc;l170+5liS1sXaXY z`oE@odHczniXxta00?IAff|6-q~`h$DHc4P732x>TJEpthYT0Vi=AzA>i%>r>z3+5 zf#lqAPo$#Rd#+yqur3bcy17NFwnRjL^rwY>F2a`#=1dn>zS#p=U{hkJyjfoJNZw7v z{54^vdk7yy)Q%$sBxR!}o;p73uIh0g?OBD5u8zLD(kc#PsVw0lGx^?@on2dgy^)yO z|3exwUF$$dWqOlLKcoC8{>u*cOOfI&`augoR<5g4jm8Z{zRx-Rg_1%wcZJ!0i!_Bj ze1RC@Y{2Y6bZ4i$W?3jFZ}<{x!;x5D&$UMOo6fU>6-wRt^8k$WjS4Zg%_P!yV}|kG6ZovFRXD=ZXg^;)GSlpJ?B4%)c8VM@{-!~BzR-SjaA6*Kiy^`VrwGnt z+2Sb#e(fZcs%BRycn5=9rv)MSirWXc^GJdRYj8y&#z_~zRoWw9zoTzjxGe8kmoI@h z9Ky_c_*PV~59SCG0i#!^K-QHvLvL{T>qD#7ASq3bD(8xe!e?H^KGVLuHP_5|Sb%=3 zXko>$SB46MDvWUq*2GPBx)TbJx!gFCdiOxGvHZF|3 zt5?+flXVr~Q#4y$OUaEv|E>W0y_|heu+^e*-7Y}LC|2fp4AvldzsfN3ezDc!;u;G& z^lefnKrqtrMZDCzCt;D}*pV2?D6Vb3&n3#2CK~h(0;4dG5H;>kyizoqUq1{O>k{(n zSuwoymnnx0=WA|wmN51IBB+WNX|FOxx_`njc;%PiKGFG`r(nk~M9*hUHHC|ld@dIT zt}iKRkCp1H_FJv+5+boeZva;9E{>Bvkk3E+Gi6LlJpO){Y%Gv^9PjX5dYs+4SW0Iq zKiE&v+SNX(BpYb`luNQ>a)w~odjAw$=YC6L3SW)If3CQ04Tb7K-tS|5(|_)K$ly}K zhW`2s49^r|v=|d9NrGyrp2NX|a9z)H+5`upe%;J*GS9_y&s0>;doE$>9}r6S+5w=C z!@tfDokpw6?}aKIOtK}*w|T-ez*FlMB3Xsvd4{k401Q~f{9CzF#{RSzuqY60#RRp2 zb|@U@ngC$P)N8_sdS`T^BBO;ly62%Il{~W#unAPu3Vdn`MFASd{z3Po#44396qb?@p?% zFud7)GQ~Cw4OIv|7MC)9eGv4o%=Z%t{Hz^jrYhyI2E--aNfA|7Q=bK6%kf@(mzvby zk0|y&j1LT>QwCq1(kX=GR@~kd7j@m=_3}7wc`aI;swE4j*}$^vs4pugyTg>Eu=qZB z;@*+NyQ@c2UMakPlPiqLA5<(_8W(q|bZWc9W_9X?sgFBOoacia(y@NSo)SSu;cxKE zgcHf3x~G~MCQs48T8C%c`F-}{dZ%|Eq{7>RC(7u8WXfV3Ar~RqPbh1riivI$E)yuhy1=d5_oQu9Mr^L1$y4SN%qV~Be{Wo0G}Guip3FX#;xCi`)N@56=b zNJ6t1kaR;fn}BA|>k@ZtIvyvki(Z>iE61iaOl8RLUOAN#`=N2SRm%20Zh)n5Ezdc5 z7~H3Va{I?s+;5!9U)Xum(1-=43|LKUuoG4906=1ch#ssUlTAMso!P2;>~@p9Mjg21 z#iktII{G+wGawhe?8Q0!((3q2x$&7(4IdP{1z6dqH`!1-RQ`SeF~N`Nn6O}(xDR_h zr!Kx%us0gyWpt)|YhnW9mp;b_08D=TFwPJ>xChO|rI3BJ^^%K1!#2TAzf?P(A9Bho z?#PDj z;rz4c19GVJ>)QQTF56f1;-S#rz}ensznc#o^uiPy&G?jbHp#!l#fl7}3G*q4SbVGuMZ}E*6)G zkNBG?A7VVlh!S6lkA0s$JV?Pu`mnMe8l?+ux8`>5@L{rV-O(3sayQs9sAoNxA`2O^ z?(Foi(|5%_uQnFka)&7SdxBya4DNFHsdLwgar=UUg$>C9zh93OI7v=&%X*zk+o6wH zs`sLcI*H1{t^culc_YGb5cPL2Q!Oyuyf3pLCo=v@*S8Kbg8PDy#wFaLXD0P^QK?5pSTWwduY;K=@4gj;zr!Q;lNe^xQwF?Va z9f&a~>JY-!<0om93ce1$jF+Dx9(u8AaaB;A3n8o^omZycSh6g($b!!`K0ZS(C~D8E zJpz6=LE3MjkCo6sf$q)$fxurw>#ICM!*Ar&e^sXn@JKwn5|9e-#1>9lh1cKg&$Y|& z1cla3@uakTa!Ap!m|Sdt8V>5$_F=v2vBq^PYTHX=Q02+=92!t2 z<@57XyP3VW&@7SUf%bQTQ$|{5J8BmHxw?eM$70?>9{iEMQX>+x*vs2Xc!U4VOacJa z(7f*qU%}u4k>~HGE9O$jopP^#r3l0*%IfM8pt~jFkZRC<*JR77X?u{y@?mgZ)EON%4nz44m%^ViHBES}J7HH3bCo4vq&QUHt=Id@6Al0`u6&=}T1 ze|NZkT%BX}JyfnVpW>Fx5O6q$qZrkn~3=ED(}nE*9ZKXmO3j4J=i8q8oJ#LLZjR4-%Dk`A<7Csn2vYSVicz>AYyqZfhGG)IT(JUz5gJx}mJ5i^zgAu#jVO zjh6bk+n-){6?-+$n`;^DB1w#9zK7|;H~r4F+xxe3tvttRF48|Ef0iQHd0KN)@4WDO zn)M*Iu21HXc}5%SJbEfg<#bl-cOL66mv41G$_}^yM>&XJKpp+ash0kVh@M?7YzRsS(OUrsi>xRU6< z3*Za{CClgn=8LSgcD}mbF*0Oos4_n-EYUGRmYJ!dM*4f0!a`oZIr(l!e z4)I{$YC5pQm*X$y;v;@jsG8eGdxRdH&2-jF5GNXEYcdOjs}K`QZO^y#CU&eP)-u4R zE!YRGX4Md|Fq-vET7vw~%X?F&w?Ve;6tPdOSRV>*!>tVewK02IcH zdHbZ(SJ_>OARJ!d-@@f&ESca076w2ZVxlJAli6#c8vShQw2oz6b~RU8cq6?t(bE*% zE=6eCiuBks+>{!r<$T@LDW6W2jOEsBLy7FM`7xlCOO!ll6iN=m(;Y9-?3+gRe*EPkpWGeMKBut3O`^LPP2(Y(d;K=Sm6uo&s6nP7=Wr)ST`kM zlzFw;%N6zT%w-__8WSwAo<0c3(1t<_{WIPaWOOru@SV$lYjnIBfO7=c-=EhKd9Hz- z$qYJ#oesHwc>N)7CP%NsrMXO+crK@=Cqv-BK7nKCfHpPOm&$l#J!W<@!IxFcz-D1f zb;6PD&Em~1SkB@gZGACLG&Lu`Nc@9i@+}qvt*M~x!9c5YA62T^%v5gXNbz5PzCkib zUNUb74c?tHdLxypUzPX0BjV#KdK!Cq-B+RAvU?h$44|Cs{i`3OPv=Ly)C<`{~i8 zQW97>6K0&N?>gTk8T62eew1fIZP9kpOs#^z8BC~}IhxLPzS;r9z_UOmVa8ekLgqq) zq_m7Yh;XG5>k%ok3IZWn>uynfs7PWd4FR6Xm;k-43@p34yK!xB+}hE&>Rk75@2JuLTJDvxlwDQ$~bCSBQ! zyE$M_1#}=?@gQCTP=f#kl;S7zYL#|_`un}hO>dp)q$6B&yu#S{BrDXWEO_O8!WgVu zsX?0N9P)OdXp>yj-Z658gxs90IN^k1+YJAJeiALZl z#4_fhb{C%?5FR*LHZEAsujQ^Uq!V1jVFTbaq(d^IMHo0%b`t#28QcoAdN`lIE(O=} z6J3rA>xsMZ`Em8xjEp}}xW*2^alr^(3m}nd#`0?19u)??hOskXD=x5SzwR956CF!p zIcK7{Z}{vG;X8}4yNue8A5RoPb%TqRxAL5f4Y&vM@YQ&O^p{zx^H@0;$`b&R!UIt| z01bRS6#&1R$5oeCA0FqjoJ@bWRi8UVKUaKfMO!UTqoOwO%C#pA{J+>pXNoV**;M|- zgmJT15RY}xyPDU;A9??ld4z#D0uY1rM^|1w3jX{kFd_CWfYltW)jY`&fnkgL@hJF; zdoG@16pu(tj!l1T*+B-??#MjLgB8%h0StIT5;?jRO4Xd{B0Aq*Io4frY!n6x9U zw+HyZgWt%=H8S!W0QHHEj9(u5%8Fb8AOp(=m~^CfH!`DX7&|=>7Nj2jr~m7TW)MCU zy50W?HyqeBI6FD;6*CxbHME1_zhU(84{g!Bj+N!Ui#{y~N(*54O79{h`}=74m% zgyt%nk}y^Itfe;^9BGQ^C!_hY+9MgP6buX?1QjjA%Vr`PRbfR$ED;owmeMgWsbBF) zfQN2%Yr)&Q(#`fPx^;&|z`k!QwL-9|Z<8rCf$NLD;iFnsMCbkQH66P_NBt$Cgb>($ z97@0%y)lV|#@ z>NL0lwLgiJ`GVHSo?0Ny82{*VPpf^kJj(N9G%6fVGCdv(uWoof%DucjMl$spIGE$w z21$~~h4Xs0x5szfZ%P_^{#?dp-5UG7Jb}`I#k+KTJe0aix58X0KHECU&)yOD!Ta&X z3%#;N+w7?$I)`}+hkzFXFSV(SPgXvU~B13p(!n&606twUe)X z`ViTRAFW?(1;5?pUb|VL_~|cnSTSR%n8bQ`g1M!`ev#f> zCa>|_TT8=X+pogzUPW!JaI7OZ_erd`F|)tvuweZ1U-Z&{2<*LcaxJ*`$O?|=$(fd& z*Ts{|Vpn0oj5V=x2^4u2ckm$CWAcA4Gz1mEtH-mvls4aZ*kFFNNhCihD^<;z5J@GAW3qE2_R-OB3Skl6=W z*q@U~+bQJtyg6{|tZncV*cP>kIiB4lO&{$bH*k%}8z=FD-Pu7}j;(gYfBx#Ir7D5~ zPYsD$@X9ECMo}6iTW1^J&VIpdY)2pybzcns`ON=J{d4x*7bWV>iipbD&HI@7rNOzo zWR6ZeM>o&cgywpgp1UL{J;{csKl*>gp-i}!-)?Y&8Q+>WrL@0(_~*6xkFAKn_G13)8}&^Frfpx3 z`7P)hYx%d;N8ip%puykh$KwmY^B?~x!U{STejM@7;yf3GqhAtRLCh9@3SEWeX1fB^+{lVDEf@cL^XT(Bdf%hI;5o2XDkq zbR*YaxM31DM_K;P_vExwN0pU_4|NWW73BrjjszEvva#|jM8sbr!g5*QpMv~1^e>Z| zBg%urzvSPx6^AQyRgZl5V^nB6Yv>FbzV+YHJSr5)di2=!Ur_hag}NQS2cuW?zK48$ zOA*=xOr<04UHbd0$8hubWftcAXLxVlptMbydERxd(S1(+V|UJ8{QTkR zMd{g?eZA=QboGzUXS@+#e_LsJErxloHoy7Qy7D3=?(W%5j#%$Yq37JV5w9KJI_JQk zjUo+q1BQF=o>K^!?DjmK?bKl5__19m(f{Jsf0jNvf6us8P8OfJ0+&Mk%18;P>sqMC_cFXgH#?8k7K)zG+H>nhU3OY16i;3Kfpxx-u^jZ*px z%+L;!;cU{JF{S9*x|WkHhVCe|C(B-R{d!+*QjkwWgLapEW3xM)qbXxez*5Sc?&&K) zTC)i4=^wAiY*U?x$a+BNs(5gBA9AJX@xiACOZDF(Zu^2B+6kL?e(-%(Jhz_nbnHo2 zr5d6&q^aV8@Jp{&zyDr)eSDxf3p4)GQT8?~r~Tb@?i|Rq=gw`vU(L0_ zdQU!7JlOcLS?u<<)e3CBa{J|z$Bp|&vTs@glJaWCl2r3{qky29{sJK1+UZK6r zO}Z|#rYmU9>GHFvg-dDYqL(h$KKrp~>-hH|LJoTJu@+6P$uTRKKI_r73TjTBpSI`ZnkNtlH&zPDA;Ti;=Ac_hqYy z7fuOZd-HSi#kJ#OC=tK{JG)$D9rKDt=#)Kpit@06^OP1We_E*Mk_$E32`q;k`6;ho zmAo{g*7u$rirbEAB4&C!y*D^K*J~bH_UR)8!(@m0^QyCyd<|CwbCFEC5Fu$P%#8zF4J$f?aRUf@u9rg@qfyz>7 zdix?=62~onA_v|VTPLg;q~}kBZ}o|EtEcuAZxfO*U@yC5|Nd&D-HbG&^^{M0$lsU^ zj*zV(UXh;R%aQLzdXDVHHJ*&nORTRW*F0YL58&556cb&S-|Th|oaTJiXymo*_3Tfy zCWwvH7BxqCu&AGw*L54#WOS`ruu~vG%tnwml$xy3{5y zjq^Skd}2I+*7o%9|MG-{C#|xZkowQ8&_Sl|Gk50I*QZ31v*mMC&+%u{u)08SFTxs~lVd+$u0F-UR#9OmI%qzA`fMGgx zpKgH0b+Bs+ggp@gy{9B>%Lp54bxl!xLg3AQy6>LYNj|4R%@=Eg`nc4OrIJ1MF|t*>&Rb^F%5(jikF62Y92{vCmLVn?Tr!n*a@Lb~F2WlcOS5Jmi%5 zg7Mdd9y0+d7upzl`V;AbQ`xME_g^Ckukg&0&PpT&E&Ee?k2@a;;uT*Blv-TibuUwI zed<>KJkS|_n?SvbzdnLvx170|H4vMX=NDvS>QMhE`r5ZcgZ3_9`<*-98CO0QU5Wbq z-~8$052yP}{4Of17XFM|6Qo;0x!+AGtTFBhrOFN{R^{j9;KaGgI|r0b&;c$d99&l5 zkSl#A-woHx-5Ng}@!)KB8K%Fh2$v!!Z_DnAi&6UG&u8QxwsMIKR@%auNL@E51itvm zSDg-#@~^Op6}Tr`PJEz0n2EM?uj1*%8Q~R#+174Wa=)O5xR(kOzuNSp>+t4`{+fK2wb~#f_5I&hr$LgQ|L!%&176 zsXSISH7?OjB|C4SRb1rF|CBZ&I>BNy#L!y9vF!7irLRVJSZ~#15dn-o(ZY-SRd+ny zV%=%u>BxQc3wLsS7B$79H(0fjrVufm-l9a-wBk8VRBU3&t2n+W4a}XbpoO@MO^R#i zo$iq6$G`7<+A#BET0c!F`+P^__k9PtD zR9fuZ{ns;}bnl6j?y*FDTg{BNpT^XlF+D?y^2>QTA~fZ4`1$SB_7!}sj?}5+^JhmZ zvU4qm_`ly@KU1)qlXJIEXlv<`6o=BSE%c_~d|u|uhW6#8s`nq-5UDy`{UfQS%b%Qb zW9NR$@DGw{YSVc(xPq`UKN%yuh%^VSnrMxbd^@pZ}a4T8iP$ z^f~CA{4#YTSkwV|DJ#uppl$BmrG)6A>D-ap5pnVhy+0pnpI7oieQ^BXd-jTW z_N&j48{G%uJZrngN+Na~{}!og_;>4@XJ1_X`qc6FBfEAf@KrxrmiH5@QQqR?(@&Pm zAUcmb64KO9gYT$Gc%1typ!`qCJc(3iC_23bjnP&cVcso!^J4!-%hL72TsLvf&(Pmb zCAFT^oS+vX7h%(fMV4Mg)~^5c;Ip@e|I6%Q4NXV%0@CdAGUpRydRtNtXqh{&(=QYF z9BpsLh;xJEUVQoe{OkK3DK*LT&SVQZYj$z!a&hhpLXXiNi#78^=ax($B`f>O+^4gN z13**ZHx!Clt+iQ>$&xX9DH4h_S2Bk=3BZAaKJ28r9%f!<(&W0OzmZPhtTd7BZqe-? z-Js@EMo<%avP*iK^JH>BY~NERWAk&WDn0Wl3A|0?vU3Is#6s8_Qw)x+ZYpE+0BxB@ z0O%Pe4eiE$N|p>-WTEZQ6wHzdW~^FuROKu~)3{V+bgo!`pV%m`>7T4%^E4wO@5jl$ z`3k)MNzR*3bH?<~x5yjqag&(f*-40N1&6CE(Tq1nP6ZT&AF563}=atq!CD9y*v&rVy|)? zim< z9o-Zo5=~W>mfQb=;5_UM8#xG}t|vHN?o= zm(5Zp7TNh5jp5-Iy}Z8q2$OjDfB82ms-*89ynN6h8Vj+^#^j(yUY(b3Z?}K-a9L=~ z`_<#b<|H%A&Z<{k+vZREU$qokW{kdi-fdWM@QSfq`h;h+cipU2-KyJYwBKh`+HG_& z@l_edYPf22tWoQ6(`bL8)$`HO@#Vh6_f``=uVP>-)5$qAMq{(~V{<-Z^O0i<$zzL! zV@p+IuRF%x^p7pij;*YZy*;p=?Z|n@GrlT0zNS9@-e`QyNNvhzd?RvvGkJWgaQx$J ziE3Y)URc`a+3_#y<6jTPzdaacHUR5kId zpyn{QOF=6rfbV2^hti|iNx4c@wi}bA*$i;- z8<$X|oj?WgWgfllUY*>;|WX1*5>#XV~K@Wa`c!#-b&qB=&%x=?^L^`RG zTbUu9)ZM@)Fr5wM9t_Qz>^LAVYta0LLB zAoBKiN}~UChM*|{Ov?Q6eo8~^Qb3;m$70sI;2yuY$)$#zr3*{rA{VHC5rUD)=f-%= z!&||UcCwN9yEpWGN2V*!TIYVwjKIriWgsgvIc}Xr2p-(H6Xg1D>Sjm=<1ZdgNPP1+ z+iid`a2)pL>0H&&f!hm~WyW`1hU9Wzkv7KIJzaQtfMsql$~}g*JRCeZQtd9&zWi!s zVsy@3>izO~_V@(L$~lNt?<7L|JIAUsW9q7VpRY&Ly@q9&jMh5Pw9bQ)NC3UO+qt|F ze9169$>$BbHIxMO79j%>_T~gY?J1f9GsAOfI8RG4|A7JMXoe_;$6WK z-#ZXz^@*&kgODWRsO~CwT(r~wf+D_(6#G0!j(!CAaPD z8A4{FPo6W6*?Yi^L~j!}>%6zaY_i*KcaEG)JF{xoJ0M3?RsUyxGf!M)X=WB_^0HZx z=ob#UDf9IR-s390`)D&+5rRoW%Hu6$(j5!Oine9h+XW8umy21~htH7A{?k7V);i1; z50cO2c0RKObwpKJ{ z(JtF|rW2&Mm3{UZ^(2z@2OQkbQKOTbeXsP2@*()l&lJ9NTM5VMbSji z&b%0>U9*`R$rnXr9g42vRq|A&cPSeBXvq`{>@P(ndK zq`M>qR8r~gjwP3rZj|m?LRuQ>?ru?}L(+Ztet-Y}^Wu4~-~D1C%h}4@)@yw2N~^MZWpM|?_k5n)A&@qEieIQSzxn4Y zmB5rxbC-BaQT8CFD=d}R2|M{;4Fc0?W729Pg;vneW{PzN*0bI{TK* zXd6FU?(>0eJVB9TuBO}fz>zPOakizl4DS)U*lhEEe0#OCt;pRXGz+2qD$)54L|`@^ zb=OrncIBdx!#TG;n@6FWd90fx$yQhUnF?5CJQJ;1rEFo3q0nqOLEsvU~ zOz_g#NRv~g&vsXGh8+k)g_SKzV&(D}S#%~ob7Jqow|wU6ihrife(OPBTNWU73uu|o z8H7>AX0gkm==7Js5(LN$!{&#ZDMC<#n9apqZ$X*_D{$nmYJi#*9m_>yiLvcJP)%Wgy z(;XVo=a>4G>$k5XTtX$q(rT(VMv2(Qs*TT1dc=|@RA08MzG@#8eEdeFolmrZPwXp| z_~+xZ%rk)_Rf(dSgK1~3_va!n&jrx-E=iWjRST(hNFLc6Cq5!)Ufkg+52*mq#aN7q z1?vXe%Z(>;7aWF;WbTfd+;*03n=0Ib9@y#X_NQou3r)jyZEnUV{ulZUr|h3yjVPQr zlP`)FCEm9?HMU)ZGg%p;FD!@;-%?!W&bqR_y!`mn#9Akcgw4%L?$G+H8+n+U)0+!N z?p-r;JKdjdwuTL#{<=B7an~_-bry5?PPz2@`q#?vuZjELaN0}!Xm=Of>Y zX7nItkP>zs>VFmd!`1b%oqv&)C|WQ?Te<6Ah)6U*^T^}-N%aq*b0RN-Ym6ID;kr;C zmtM?tT-|Z7&v@u_i?C?jYZj$Yss7%8vQo&)_f*X7`g?pqk@4miF+{^5cB?3D<{C=vl`NBQgd0ytslQ<=xadbO^UnKI}+12=BfMTOUG&3Yw>8eE}96%R1dEb$f-+L&%rD)|%#?393wqFYd|TU`Q%1{GMRt3v-0iSnqkV zw%kPbGjkJBFFi?IyCO41+vc0q_@Nc06vLEn+z~kW?f*H! zyZ-Nue|s~X&x19q;{UnO+`}V4VnW9^MaQgnWX<0{_y5zYyRZiu7!-|80Z*I~*GZ0%B+J8IxvCiMytD(V(o6)rzM`ZTW0T-Cbvls@;g6;HLh+yaeCXbMNjKv(RmtF!IaE#~{@CiVZUgqlt$N(*q2McE znpX9A(0xx><*fc>d$fXU#wu}9MPDrEMOu9MgVt_;lE>fEgZ;nU>m7l(q|a=wcs6@{ ziXUUtdB^go_H(?S7kQIk8&p<>WIiTI5CTHgS~1(hpjdp$3IHE9w`$ zI4hfeH*;3CVR=bnV1QngSND>5m!k$4Tgq!j_-@N+*|LHI!eF=tfuR^E3@(g^2*A?D#DJhNKH|~JS7&zy zK}eq{LyU5|!vH45OnFppZzSb&tL1)F-jC04sR&wy`24bX_K%nr><*@bDLfwsGZktJ zM=}JRf73#GN%}QJIc^d$d*Mn!$+2WB19c@+MQVA9S&B2cZ`4uJ7u8xXiVIZbyKbaS z!h;I3!8FFvTFKpUx`rPw1osjiv^ZW5L#3BAjPi9wO!y@yE!Aeak))gk!;PpZS+4{l z<-xh}IHrggP?95{P~IRXtN@!YnaD2?nNZvq=g=t9jbqJu4NY?>Vv^q#UL9#^I9ls~ z4Xrb)eOu0bP2HJ%YF1B5Jo>%u z_V4kQyL9w(45`4&o&B}3_I5NH1Bd;=>WJK89RXo2UJoP?*n6n0$g*z)lfAXr2%%)$ z?F^-L+cOS@hq5zjaf|2ngtHeGZ$@x^^VnpHh+^N0dNJyuNXyX+!=>e&-P`&sE^vhx zBh-hb5c|Lk%lCizJ^15iC0UN0#1?)%AP%J#XG-hTpR<*s@5jOV$iTod9|!Eo8o@H@ zxjm>r-KMaU*_l*B>x(DTG2lhfIRJl)S|5l@!tQm%Ws16EkmC~cGZ|;|Uq`a!p|})* znCNVUSdReccF|WB1U3Fwm*kra8#7;rw?$A#zD#jGd31`nWNx3vJ|eD~JlyfkM=bSN{sL_Yba0NF%H z{s*oUh|4p{hV&;@TAoqbnOV>SxEiL<@7ai`tR5M1U5AR>1@Rb*&ACc{hB_NA_vM@| zx<~=5Z6>S>iE*~iB77BnD8YBdMjIrbj>Qkm&JQK_pWv1n4=o5E4TnqcQs_lfCYMXX zV!f?f`Cfs}z2ECGLJdTzmUukDxXbD0arrjm-H~nzu?474-apvffqYOMRxg9oJSxC? zyi7t$t1J^tcz-0G+vhzw{$fsFGsBkNMWcy$1Wm}cWb3U6tei%39&R9>ojVjDP4qcZ zLf!QFQz8aYwlg@U@6=ZLF~5&5yM>Lu_sf;5Ym^t1)NuM$-Y|Oei@~_LdB1MX?su%r z7fW@Hxbwr?qYhl|R+h{j5U&yL)VlzQ4!M#=xcQK+k**fG8Vb z5(y0i%m>V!b>7SfL8U=@EdFYlo+h&t|g9b`X3j!}#dyM=!I)TvRWWzX|7lnH(uvGFs z(HlqR@?3363>d8I1clotgzx&!B3Y&;MBhIupZP(?5}}ogqpD0(9CHPTYddKr5EQU4 zy&Tj?KTRxFHf3Jh77BOJNUDx1;4)VjdbfC*+&EnD%za?U;N~=?gP@QnOkvoB+Bvmc zd6zduVOWRnEG_q(b}w5&B?=&Ui(>DP{%5A}e#OdEUa>GUQ*XqnuM5L2suxOY(x+iBwD zHKtYC<9Ah%KO<2}lc2iuwo!S`3%Gmu|hR3h%?IAFH%)RZFimPWHawZ?( zEGd~HZF`H!-U){SVAazsZvUhVoj7Q!Sl#Pt6)}x9)aeFKh5Q`CxooN9)RAnT{|;)AQ!5ZrZ?9!{^>YjaOC{T6b3E=D zWOLkV$&Z|s6y8Q-VKZR3;4!YQ5D4+Esqmz#OPU2u&#N%*>?&tcdEw& z8;(B*Bkr#^>>?AhLC53}RxUcmY|*BX_7x1)GZiEE92$kyXN?j>F%IQqEQ9o&=k@~P zC$yX{U&qi-k!i1Ojf7k7;Bqqj@uKC9VdX|(CEYGUx6w0q5^5#KAIbGa)xr)wR2{-duj2OahuP=R2`=$Hr453f0T6JTJyc0Q z!S=_~C7~x4nhmsq5taQl3X>eMZ(fUXtUXI!Ds~Dssv$wH7GYL~ziEDIur~7)FRb=o zTmpjfQ87CoJV<-A^<~I1mXNT$)v-!LSSj3=Ubr|*%y?LG>Y!cph-fM&QU!P|vi!I7E-5(L!qi)C%@` zc@+@&S0j7_N8SRP3FfOb4`Z@W#Joa?*L$mChM?df+VeD*E`i-W0W3LghU_F-l%Y`h z!0G}w<#h`i!7!c^90mX%Up&k!m4tXa%pOp~(be@9M54xV+}Hv8Y>2uzl9(?Tgx*Bb zpXh)Qc&XwxQAl_!62bQZFJe5LHy4jtHvGY8oZda$w_g1a<*+Rgo*Ii+DHu_ms$01C z_$#Au1+!{nYGiX`Wb1t7_kKks6kb9{1l@W>pG6cIDzp}<>~|J9dKF2B$wmnW6plF) zJ)-6s4~hb!seCTD(wNqF&lPCWK2)I^bih8Y=*>0OSCEj-{UqIdX4L z1vk_}Q7;mL!1&gc{N|exR%i0NM;89wAm(+p=^be5i}Y`GpW=}QA9gb4@@1{gov~mb z@dttNv^bS3C$lSE{*I6!Y*h(|Oc)HL3gAmrW6cU>-0=rsqc^m0fXpFFrG5_J*EL{q z@#baGmrf4-BRuDWmwjwA;Zlcb7P-g`o0U~F>L{(QFAwYgS zfQwNTNTV7XR;IYk`}MdQpuwM{hWM#fyc{nf;{|P%!i3FXi|+uE-@pnKRt4~3wp0R2 z(EI>^=@m?u0fNI&oe#saO$VIO64E(pu#G|Zk3wng^(rVV>}xk41C9W zu)16!J4ied4kyJQ^Md;P2KxonQL5uYChBmp>md{GT%JP%-UFI6)$EQSUmh&umU@P~ z1{_!uBBBDAzzd+RC7*!UV&vkZP^wD>De?{Yj36d)sB~F_en6dH_BT?;2D28FTmUOx zvYv=|BOYdLg!MOe7+#=J6U|m-Y$Ol_7bS+-XIcZz)_|V_Hsn1$?g_a|0Awk-k;|eP z63BXVQz?Cm=Zg-&tz60kHXtQlK%i1vs!}W$r#fC7gmS6{)G0c#(Av}7O56g(Ro787 z)JA5&)Zh)+C*%_1kScyqO@{ws3r)iXwCcF6$N|gM2;y5-LY7mtr__RSXvL4yGk0jh zkL$ofHSYiR%!4pplNMR=3OeXmATmYV|dvAF!4Fy<)OO!IRbOem-mOG@pV?)z4w zS3s6gdna`xZcZO)0^5!N?Ag(RO^Z*^qINt)-z`k?>4OE%RvhCVocKm2wHj#} zd|9*-Dq8$I6+H(vl|cLfWqi|M$k>w*=^1VaL~q~vca_LeOMAD zu3V9LIo-Dm37s%|D`5b;>9I+20kK3s*rcB+y9bEmjq<6WXXv$D?!+;M4 zMgYhofK>_`S4auKqHXSU%)ON;XfA(-k&EX>UBLRf-*t&H-V{Q4)>VZu9D~lqC8L2T zWv5f+bRGr|!%D!P)UbHhGibs9W&*HUCV)i;Bcy{VD8hV2fII>UxeIV$Hl~sq4jv}h z!3gST4I?I$iV&Y<8ELcabucPm=3O+vb1=6;n}sj&4JVEB_nU@~c%Ib*i^!HaQGWP&wRNs6n zFr0}Bx(7%cz^V^s5*;J11mMVZgLE^zt^+CRsZrf`aOLI#nV2H5@do;&%P6BB6}xC7 z42dZRGQ2UUXg8}-v!FOV*JCV^bzJvy;5`AjQU?g9*}|Hbcy>6Bzp+TfP&;Vd&V|@{ zv)=dk`xaI;1a1m>y1XXDY?fgQU)Jw=`g)N8joHBSp*3cc-B%6u$Z_wiWfgGLGsfV< z6@^VG_u_Q6tPM{0ye19I1fKB#N)@GqTNB~kLAVUqH;e1f6My;vzwa6L>qfWlF_*q( z_I&2)?74fGfvi;7K;kpN&POkw8lS`nZ}`vfF@&WdR>sS?k=#G%&EBy%;@5zHdv$)I; zet(|MqSk79S7z?V!ZD}UnPWcCMF11S0soA*YUjB<;9Az#95dd)0v0(s#>v5Ssixch z-Xwl>fMk=N2M>o1_Cy&X(1`_Fcd3a^)ZwVmOC=9}0lri2?L*EDbmWE!y&~YWJ&Y zlR@Gtj`2WP6|n#7_s>`J^>2VgT9_%#^{oo*s~xaoGrFZmFGR41cXcha@sbu*>tPRc zw*wg2YmF;dyqsr`#DEyI_JM^MaQOw;e*$$7Jv{n$i*E?)5ZgkMmK?~@8r;u(j>g@v z_aCm}i)6T&5WdI91UyU#Y4-xwI~ceC5*wFsV=irC;z<-UDn>d=3db#C2FR0Ap%9CS zno%Gd2$N6FriJWe2VvuUeB{`V+JPz(^Y>`T*T|Kt5q}0=z$Xfrk`5rW=pwPv3Hy-Md^-4+Ypj6D1aB};D>%6Z*Cg6vgJ(lB z&_z^MWd5g7o&@Dk&9tsl?0SA65z*<@qZsJ~doe3Uc8a`_0u~;k!RLzX3hXKTRb~fT zq{tw#wI^M=4HxKxAbC92(M6AJ+hwMK+~9k)zv5yFD`uuGA8h0coIclX^HztflKT?> zi{7Cbknh4~Qed^fJMI3$?)yd~-NK7`6<4UZl7nCHC*lk5tIVL8&yS~QsjadVc>~lDMzNajHA{rX)+2 zQi40Y@$6}G5)YJ{d>!XTwX83;7@5r~%STXf%~M;&uXK8R(3?(FiupWFEgq{q2!|Fg z=KSq+dDE=q3ln9cdM7pMK;7^FdBF~f z-9s`F$8TtJ;Y~WhrHD-l13(hTwT&!UxrC!($QjosulxUy3J9caDl5ZO3e?_&V;wkW zKbNt&)Gar0J;}~htKn$*!zfc+MAPYP!5f%w`lMfDc?3Fj6L{85qAkYMU*JHj@kuz| zif-?%-6O7Qe(Ry0CwdaZR*gmlJ{L*K^P|>^dLM}k1fB}AeV^?C@Cl#kKzB$iz=_h7 zoAOTe31s?;xYp3O1=Rb&*q(HY9DEvSi*C%Frz@YCrRZw}$yFVCEIN#cOG!-11v*AP zJ_vxL2Vs1X+LXWJC@($W;?+RG2?O54b}YOJ{J1z6UL7wm^ChJw|5i%E(c-QO!2Odi`&dKkqCg(FzF1;ROb{*D zU@Q4Coko4!S(6s+_C5|0PWd9P;7-+_2tlGGsFU}z7faOd7KzV3NfYRj3kx!~cvgOl|@T%#QGrv^5w7xVzxR7&q(%F&MW?h~kB$BReeBUa|UBya*3~ z%LE}$G^acGWCmxGCK*)Am7Lv^(>zU+h6m2k(ewpIgHF1MD%i=v^dM+Pwx+co=+On; zDO`*MUrTtRON8*4De-&|hop&-I9^&T?zSIaj;|zD?>GD@H4>kZp(QR6#ewji0MP{o z9#6!v;KRdJ-u9Ec5|x&{Ss=s3Vh9lvkR^*t{PaBQT6snYmTr=hrg`ju{Q~W`{n-n9 zSRC?G<}Had!RYCbgkmSjQtKW>ZcF3YNI??)^iB%99wrfPS70OoDHH8+H%wN0RF}&+ zUFCXPoX|@xT>cCh`eaWI>t|xFI*hYeTEU|=_8A3F3`-4je|he61?2A)_Z3ApQz zo@ic9x&EKW{g+Acch0W_q-p;F!a~8jby7d4Q&}mdxuvaGGAAS=hOW@Oa#K~%WCr@Cydo3#gVYyGCGk4s)k)i4K;rV3BxdF?O6X_VfBS>IpI(Vb=#QH-V6WkA2ye`+bQ$`R)s z7aXpD=z<3dQABlUlm-wK-vGhmSi{=&*bCur(j+6)muHlq`Ukcj2IF(E-j-x!(MwE@ zKMUJVhHJ4vaN9596pS`LCux6Ces>uwUhKj@K?C8S+AKv>e5xD#uxp-%r-HGU{msU< zLPy>hx=@Myww2Vc`i-OYhiDIQ;gu?Ys3uh8u!>mj8;A+Wcamn_@FNW3-51z{f^Z5=Q-#y(Jdxyqk>URr9m3P7UJnuUdz-Z3p49 zz>uo-NyDv!cGhT-W71ebZ@m0{l*1`Jn2K1I4E8O5I!&I^G1vi?z@lv)QO1Yo6ozvj zM?8fyk-H9c{RIyxWIP`d&T`_aW7gl45D+}t;+9n;!$M#k$zhP=vkqA1 zJeaszg44x{aL;^t=? zETY((RzGebC3YMd`z%#yDcSI5$5oHO^-Pd}2CCY6j^zT8>JY&EMNmNbuzAfJ zhP{x6#v}LOrc!1Qy4-X#(;uf+tx%II=kY4Tdy*XCi)Z-}i2$)Tah%tsV}m9OhH( zIwL`OX7>9Nfv5N+Nf&|#qc1(;YjNaru9CMtOjYCYSHgtG z@koXoX8qR8fZsAi0VsBYzQwK@w0bv0*ad2CQ<@bn>#f{?C@$0W2-&E9a_bFY6qj&l zZK6_^9vcsq%a8Tqq*U<;`aIsAlJ+CWgC&X*e07Fx^#QsjSTWp*d@@1Yo@ZG917^`-v8J$al+aO?|FBBkCq z!S5>16_SJFV7dcO@#Xq7BWhxY3M>Nfb+fVAmAgfhd-7pjPu zlM)$X_h*3ogdimX#06@ZHOef>@6GcpPb!Y8s1q>Y>V8~;k0w=01_)tFFBvIA)Qu25 zkrH*Fb_&4|M`p-3W+XbRU&`SFnDJPGS$e2>xMqQ?AUNt(igXWW^H51gE6!e~)oH}X z_sSOz!%QDK!crgojqM2Elw(hg2gM=>w}Rs1mO{)%R{(f-M3QSq$#gfC@7jmg&^f(A!_N~W>!d$t|}PE7@Hs3 zBm42|gW9qD*l0<;kfQRVr^?}1%6-S9Ve(kvsY%}6k-1S|c6NY)tUyoXxp8;IBY6dm zy|%k-MXhjf9FIy$EYJP6%)B#%d|VL2w5`Ddprz&p@WMp`68dbN(DM*huMQ0c(T)kxEa5bPO^jeU(eWhkMCn(8CXjr?&f z9ztez%(T)Pb)KQ*>G8Apr%Iek4mO&AcI(meY2gb#uc3${ODdD6v#oLXQvFm~k6w$~ zQiy32XMwm1yCx7P8cTNd!Mg0c{9UdnmtoJ`KDk> zNLr~w1i9)m1hM7T&SIu$Rx5k=HcJSpQ>-1vqiQvSr*ErZ;5%SF^O(L)X1QNgIaob` z5BZcG8=ZwQ9VZ`5z48M=IgQ|XhMXj{?Tru@l=bU@Gq22ZCuT4$_adcrWYl#moFdJm zrQbYNP>Y`9x}Ee)g7{yIH@}OjDyw084Z)O|$9^;)1fO?5SM#u~;(LvBJ0s9+93;{s zqW3{Q(w`WO#V=8$UR~0>ehvv5pJE&#PH9Fu`Zino{wPeHj(ZJB@fwxyAJ+WZ&@LXzWC`EeUm)-quTQM?UwM%;LltPM^AfBYp#3h; z=$()6Vx)@hFOkZ2pP?ozvFVUR^8S}m**(Y|g&KX*KUNWZ&QOV`y5Vqjk$|8+uoM*XZsL*pWYTk0+rnv;6=N^h?O9-YoNhuqyrn``KsV}VW=TxJEbS6e z78ytY4q3B}kgQ#)#ah>8Hwc4(1u(wOpr#RmMp4nLAJYsnD-5D(wf{tq3*QN!8H3+a zVr~%#WZyhAXP>beHUSO@mHaKL(y5vD*RNsPXMV$yocjFE;ZA7r$^{T#IyZ1Kn-AYwXd$z)f?=!?7ok0?abVY!gB(Hv%nzM?BxOzexIXGQ8D&GZ%Ysccu>YT z5UJ$VhWzw`aVrx19I{J!X%P-ry?FFnJN`q0pJdWul(38SPo8BX8LKu?=KIC{5;d#B ze>{k$MeRUw&VrW*9Y}&?a=TH3ho-TZsm+&Cg&H9Xgx@q)tvwjy-# z+7<;5UU(Fcmk-*iIo$7qN>qCOI3*gGVd&Vlo5>-Ytj~j5S_(6=2d&ei_^A91qstx9_g{{Bk~L4=kP1k_MB%s!vY^!!ZyCUyl1DdjT?1betm#mjl>vpl78bN!xqk0rSU@S4}r+miJ47I zlr!P!VKe01-ELwG^7L`6vJ62R}uv8KYzV;d#^YkJrIs-&UKiKemB zdQAutKaiAX9g-?)$=l-Q`p1d8M9-F6*i+N}QQD*1eK+2Od_DKya_txVYbyF<8dDad zg5PxyS0a06&IfnT8Ar})h+Mr@Of_}wHMkYbh|ks0KhYu5w#|NhQkxP^_N18T2dPGg z7BYkn*%8;_@rHxUjUv*y@-oPyCGO2N-3K|&ba(17EAOvXbYmSEEL-#G-OXmzp$7H? z_0GmAA50pAg1`Q$q$d*d_pnNtViSD!wtcTmrk-0JW~3jz!#>>^`U^a98Mh8f5hHun z?&Uo9IBhKA9r|qK``_Nx6ZaL*zJqIawC7;kkxM}8xwzMN9j_=1 z9}XSN8cHAfr#@0e2HJK$3txS+yzUAta_ZhV_Z0e|DF!`3A-7G5-X#aCqwU@zW4A$X z7AKCpLv=1G%x(m=eHo4JEwi?YiwqXW{0NS@`Z$*Rti4ei9uwctvDqZ{ z+B$L>C%)KubJHH?7ZvOGyQ+rp+;qAAK9Az%@j|&x@OVuDQ?@{A-99HOYb}nn@?cuB zKqruTg2+b{qe%i>A%UJ~^u^SFwCv@T82RzQ8$+qM`~-=JSgb)d;f(Z64DD}k?G7;6UK;h z&#rr5rJ2V<`592jn)xS}??0_S{R|8x05gce1Ekg;x9uviI?rIV}Z^Af!C60anX z&6BXXxgx`Vk_8D2ZC+E$wQX8X z5MxQe$|WWYrmZU$tXiHn3>q&zZQO`>^{i26~*xV^}IuXWs!+65;Lj6kP_`sHAkOdT~sL9Sq_4 zIH(M29Us0yj;}PjX+)eK(7*uw#I0G|xu`|0kr0!X*@L0!fYT`L7&*_l(c*ILpaQ4L zei%p}4uCA|j>jRNAsVrrhO%_{*f93#piwN(wigSg87nCq@?@_7%r|HeH9}&PnjDu= zJFP$}h-|!L1w4W3qi*OkQQ*Sr;S=YAWVT%mB)JSX%K5ZJH+=g9`%=LPqE&5@;Lm(m z639!5-Z;d#GYkLPY9Hr)OI2LJf2bixKLG<8R#l+r;r%@e9-U`Qg z&Muy6Ssg@w2Zu6jMc9c7rDF0rkJfYbHk5_sbmUnfIldxoj|&O|TOtz0l7n2N9+uM$mJc=CT(y@^u%s}d2 zg+7%%w4mQM^D`O^jKE^2xCrNM7IVE+Jl}l_a8m#l&S_mc*OUr{AoXal<#!7b$4_@o zq~B!)s(-|BWK5C~4J2NvPz*X{?uxJpPnC?i*3@Pl`ml*?ag2FR)_%EcWfMIs8S_2W z{7P4YDUJ;t_j_BO335$gBQ^;NdKMjzV_MwEWvV>N0>S{=*kzyVO++;-DdXugHl!n4 zO+-~)0TjF3t<3XxzUK@*$`JUlE)ITUE&)oO8Sc=V6Cp31JSMrVVyOxI_yscq@s3Gh zUIB@PiS9p8YD$Q(q4$-ijE}S4F~9T#iceV}raj}qZ^dV-WwaSdp+i>^RT~`y&u`&aiLie^qTVwAvPD8Rj_wSb@hQ3E-B40Y6wEsM-^22TgqzOI| zH66?{5*5~3VCi-&SUZ$MXz>-0lj*>}BneM9W8AR1mVu@2miQ;{hAm$G9HQa~l2;XBq|$*2%X#q^2%JNz8Pwaq}<)GsT_7oSl6>2zSdPRWn& zHj`k-?Z#v9?RUQ9pRYD|%$kONWb7HK?(OhOaSwkIbv_@C+U5V82sbf%o=H)(D>x-& z#PoeBW54`o;)v&%pPkP4n_=Vix7TBazYE%kmQ8v<9gLo=^Ld`PDI$5gIE;A~R^4Qg zkEQn~#l(4KLs@pHYg6H~rTuw?(X0>(FQH^|J4e}-6v?7@Gu%hYLKTMFT|H}krNymGWdN_1k| zKfKpB@X9sxi8i+NFbPgD3D5ZW$f$GT|Q#@fcl(bXm-&o->W7KyU=|6(7V=@6Re zn3(V66X@g@;}n$XgsgCOc5x1ja1G0MPb=_3CU`|;dVQ_(7UlE~j_}Uy^Y!)h^Ftt# zih_be!V)r(F$u`8<;a4%@bvuf;i5h0W&e!pQ$3sB9X{N*)~gF?jTEsQ1Uv)XLBadg%0Wcz9%ZadmikYk2=``1;?- z_|(YO(dfj;WJ|-;=)~02^wiq+)WPl4*}v(L;pxSt>8<_gYxK_;Z%5Cl z%fjyI;=#?*bnVjg)Y8K2(nDhhAG>TVLwmTB+Gu zUD{gR*g81d`iI_rh_kz$m6n~o{oUU?yQddF$2x!i{I$P1xBqkJ&!2-o2Pc32p${60 z4^GbyE^be@2hI)-&Mt1xZZ6Kx4$jXn&hP(S>}+2>s5<_=xf$uXS)0E--M&3Lxj#I( zzdJ)e(0Trscwjja(9c|1B_rPU&0uLaoJA z>Agigb*a@CYS^G6*&2mv^l4z{oCP<7r0R)^gsD6CcfOVmhnq9p$1~j6=xh_4zi(=q zAqf(Fm*$F0stP?7bSlktzov>ctLni`j%l*VCx~Ae1T^GEGJ}a}8aM>3%ErXsNN45M zs0>Zv2+Z1|DKeg!L?V7jlV+l7O(%vOl3S1Ld!}F#I;Xt3_4;gYs*Kyeipp5o@Vn8C z)JuZ9-udK)cQJU6O3mK~cP@70*yXhDUs5YslCaJn95P^Ut#tQDRGr!aPo3FVUBXap4CKL|GcC0kH<#yZy z6KXqNS>V@pg4%zWP+aPkJ4w1`B?Yq2lHJBqj2`?6MGq1OHj^zBEqBu_<1eB}p7(J4 z%ygNx{F&u=$D%uiC+ z^P=UnehvP?p&fq^ZHGvA^upxe@Xq!RiO1Ynq}!aBSaOh|a%_cuT{X^)djX(ndof6j z`p2{h@WPc=3!kyxBI?bz@lZ_s7rx3OvHia#yVagrx^UK7{ zP2dt;PaJ0*JAotNNFd69KR_*-+5dxz&DeM{O6Qn=R+nTzK9rb&xjQJfHH-RzMTBbu zNEhMCI|O6DAMQ9J2(xhrU6!-yIKsKDMC+H7y=Im%f2y(>M=w)t7~eG$ zV8mF3Uq8aO41|cPt!su2VcS-Qi$B8;J|8ar{3wA>ATdsv=}P<*tU+AA1bHq&9E_*2 zWc2^=bY4MCI9(J^gCx`>^d34=H1rM$1f+KXX@=gLAcCSM5Fnw3YNTioq=+I-0YMGD zDS{v(MT3GOqM{(g@|TaN?|C0~cIVFQ?78=xALQ2vKDXQZOtoOgO46c&`>66otlO~k zMcBTTd?2LpJuYO|XB#N6Qgu(7MSmiQhFGLu=6C8J0~#3HbtI*(cx+hdMP+cv?H zjw7qDvMtZi{5Eygdb8?fdDu)pgE(x*^jdI|sv!*GeiC=zs>O%@jN$a zkGK`{sfA+-ikx)j8bxgi+Vp2sUUBPsD4EZV??k2pLR4qTl6dB|h&z^=v- z$mK0@uY^KGvtmIwIuohTc27)&bmqSw63dbZgWvu$!qtRPnW!$rnAC8@wu`Me6vUfD zQ!iNarebYA&<$P;N32hJa;uGx-6$IpzQY{TqJ+`--&so1i5yA`2FSTA%izR(7Ix8< z+fbTZXnYo?%~?{I5%FI7w4sgmi&|d5Da(^DF=JW_5#uDmS&Af!2)bN;C&ZBe4%3$C z2uXY3H~l02M&%jzitn8_Oo#L3srC55b}sAv@7Ee4H}2vyCUj~(mEV3>u6K3hS?uqq z)7+ostZDFPXHnE@eyXk7v*z;lTT$+;r-Ei&nCBn_5zun>EOwI*w>@{Moh#fyR07Lad*N}lZZdWJg8;o8y zZ=~M#XtaBI+vn$P?`O9?yC+|^UijHU;BE09vs>uUJ13`W3UiO0q?uB_-AyQH@%w1^ zs{1$&5%Vm%^l|;G%H&V=3P`9s2X~!_REMN43Yv?^qlwGjzejsS#mY}9-e+dkWvzcU zoy3<;#qHaFV!IiC9VnCqmC2Rfx)bG9CGB|JQu$VFqxGi))WYG?{sZ}&;${R~Us39N z8ap*6L1r-j{92vlP0gI#5~OuHS-5+qpfxRd0PeYIAtJ;T2pRhBlgv0-}4S1BE=-hE4bChO9BKG{|MGmk*39c-n7LGz)Py zr>Km#zRhKB5F3-tuT8Jz$zb!C{R6;xss<3QlnlOK_U}-KAy)!P9OP3Kh;xC3vdi!# zyL|4o#eQ+T*|+NmS`gI?e1Lz|e(oz)+omR{V}ES&5gm;Uth zquHNd&xw3p45;I#g~aa}ic{B3k!PFM#=mE2DJ2Q=v8XvW@$S^or0Nrw1TxP)yoWeG zcHP`Ds>r)iuBw3`DKr)3diD29h2p_sSTB$F3IQFZN69=TS6N=KUb5XY${Xk3;*eu0 zk(PbG!#D#5eZfRq&R|<}ura(m!(et3(2R(U6@m?ehXY3PNX)x$6)(QtoThN?XvU;-EwP&KnXNwU*A`Np;_ePoI*sLMho5`KuMKZieA7IyYF-JrC-mK8Ds6TB zD}7w>$98$$S0Fd3ZpPz5NviX4R*A{`VW-9nJ{VbQRPljbP{4<2()360mn?${*+SoY z#=KH4q(=pBND^#caHQZLoKaiK1Ac`!F;6V!6qT_L?qz(j+2r8(dlwWlcWul29z)m& zkznC1!KFjwguqgxVLW*7d2`tC_qCMt2mo@8qQ7pHolLf=dHZ)LhwJxgg%{9&dpw_p zzywlk^pnLUig)+@Xy8GX$D7TCLVc-tmtUDXmx6{L|KwG2zI9IY3i`9?@hz`bkOiOy z0NxHPLkMp9?jrnn5!dnly40k4Q`LN3%c?d!!PJf+QlG# zp!wgnk=_yz-&{z030Ho9OnQ`ql-h|Y%~rAtO&4VIv5!~4o$6 z^CUw$?^`B0REL*qmP}CLea+029nXqeRNkW@1X4+C1h1ATuVWL^$vel3!tbLZ{40wP zZ$QBnTMHN{Z3<5qTSeId~O#CxWWCMxNV&{c{&?9?4%~BexMbKd?~q8Ip0JW+0k-sHY%w-&kmX z@0G!6<1vKwZlPkLkyl&3lIE2?G`~3u@^eRE8Nqp#m9v=|rk2RF<(2?$*IB(v00$DJ zUTJzM*>d&hXp7+T<%`rkiiIbF{)X9_)q4CV%5M&U;sP}_p&h@19tgLGplw`=KP!7|?nQC77uc@e%z^?)q+)98iGx$o-aPx=? zceo#XE#wm-e4nCp{6|Fxrh>Cw$E$+#l?zlevzU7}aoqw-5JM`SH);S2vYUz$SVz~2 zN*1G~!HcF8C^vsylSSry#X_ChgfC#|^{0{Lzpf&R6Ax%PV6mKp9q=?=_;9gOu>GV( zV{+Rs!eASB6Ajjg=1;&v>xulG2>u5KS8Qy7BQD~Bi0Xb@)FKT|ML^@woWU5*Is`xQ z5Di^F22G!V)X(tt{!&>ut@9O*EPZ)h2*>}ES#c|nzlZ>TWhnfZ27CL76R^dZh=8ua zVZ{lIVkVT!j>8cH|B6xY97Wijvpzs*t9q5ftc9e-_@?(zr$(g;nzeXrl1~Pg?Lm(Y zaJ>%6>D7J1c$ROR2D3*nbc`4rxeVBC##tzYC!!;KRrv^BrLeR7uA-7u(O+joe8jiU@ z|Lvy1+G*V18&!9MUNs5W{$ey1=Uiac7WoKVLv!jHF`kM;gJ#eilXXUw&BcW49?UXn zLF9T6odXzL>)u19mDAE?$ERblx z@3;fLjVtU$sG(hN9j}DzL^VHCh3$lD=ur6UvCwohbiR`D>Na9^95F`Jc@lNj6iKnt zws><}agWL`X9#bmig(aDE-=#Nfbv0xv@dONXmoQBqb=mH0wFBV&j!Fe(Cu+P?MNW+ z5s~VoJfb`V;Sd$Zwt+5Iic@bxM-kB_-8aS=cc2o`U@WXl6uFD#dw;DtJ>l-)?Zh{1 zFz}*u?+$DWAupNO`iIJ!ezxuHF_>OX=MOB``s)T0V>qtF*y%$v+@Pp&fbTy8Zga-9 z1|;XBq&xC!@M;XtID!$p10C^3?lT)=RiWkyTyiBE-@Ik%LwpRh7DR#XiY(u;_vPT) z!Znt8_f{O6c{j_j4Cc!Hq|(|}jUp}9A(HAYTntJp&&^)Rq20zWdY( zn`8w4k^LHuu&vbLN{kXH`2DIK(cTSxw~XBl6M-e$u2~LpzRiZaMSjmVW|#b1fW<8R+Ya{19W@Y&fC?z_G?`k%_uh z7lkwzyZIyPn!+D2!ASfZQRhcqXi^GTml3OYM_daHR$>9wR|b_5&dMbAPTRMyiOSKE zc*ok>p|!kQqB<=Pb>2l=wEH4$A0}yD?F+4~s88tFZfWZ0j@(_4FE@5#v--JygAe;+ z3;G?Xj>`}graK!@*{{XQr(4NDnW#m`HgRNQetV`4y>%8fYZi&QRb7SsJ z;hd2j@T@%wRWTrk97L}na*z5YUl$ryz-mu}%I57dCozDg5%w#fE% zkrGh!Mox=n|AQShR2%c$vo>3Su@HBj(`z#qr4la2dkNGu3iILkrq!S(YK2>Ct!o6E zPekj7#!sUZN$%B+vwUviFePlmwtB?9g=uvK$^7TdSxADn5oj6ev)&u75 zq}%Ld@sE;y71@_#&QHnWQe#A(i!*?Z`ruQ+zDP6zU4w|7;k*eHso zM1X1#K13a%M@WtJX+2H;(zaQDNt7WC{6+5E8ly#~o%hu#Xr4VPb5HK(cb|KqeBi{+ z+o#e(^HGCd(nlbXsPwx*CgLC*>?>4sU$xQ)1DorchZciJdTt9sMd|W^mjI&JotBEf z*G2OMeiC0gn4t6ti6?}QTK`R4Dgt3C7cZU!N@0ObU*cgfRFh+xIBn@-_{)&mvHz-W z%HKREq=|p{<+yvJ{3GlI{Aa((Zd9$~Gs)`B`%ArRz<;&c*-2 z|J@ZRgvQHUMp%o)x5Oe8%nE)W+ChAeo>bG?W;mA^yjlKgBJ{FNhID5yubO?7)Xv(T zL+YOTg)a`^DE+DR?(=acQ&o4C8l;x(TY=^J&jm5*f2=P<*RaE0v3ibgPQ@XlOpxCZ z?dxI>SiExRg5g+;D-==wbr$$>x^!n6;^QWZUlUT|{)l)xL3kDjv40Z?y-;y}0v)Is zQ^=o;<@j^h#A=)+BD>c-1~ZE#Vb%z+6z|7<7p_|b&7`jpQr8h~UYGyz;%eOAwckc` z_s7*7-+V$}#Vl^kVpl)6Cn@TyUX6y35{HTLabOL6Y;2*q)LIP%@MaKyjM$iH8aXD&OuuKD^&IzQDWN>~8C zd;HUpNTj&P=Yg~{Z%U5<1X<>8NqJUk9R?IOMA!o^O2U!QpI?-cWS zAr*C~`6|SfOYBOvaOMtNhPQt_veTCDfzuCbEQdohT951soRQ{JR<1oe@jpP zTRD9D-gCK6MQ6`{Q#i?wf-1}DkUlg4 z5lzDm*E&Kb=y>Xm;!+pG ziw%3aX6SVN>A4S%)rRN3uD_o9=*%!4%IXsqRMv^muF@S+c9;>>gb9S*tZWXn^kBcS znrdi&|EhKPY=Mr?!uIK|$d|35Eqam@-LV_f1%~tMF8yggziuqQ`gVqSv4uKRq2e@% zKPBY;Ecf|mueRC8{`J1Ee}q20rW^lZ#jt6WS!?xvV`BQaS<)a`HsDU`-0&E!&$=`w zKJ3u1yl1Z1;gx;0-izy5{K^6ST5)UR1>C%2adAC90*NA~X%2>ys~axgDwmd2ALrBb z!|F_*?N4vAQ=WXu;{S#AX2AUW9 zlZvrBk&RL%7An)}mO{BGBvLbb?Jt#7F>Sbi-%arB6t>x#2 z0g?IVRuX!35B!qnPM!BpSw45*pZdQ1e87?A`5+*D_vQIBm;d}cc$?PFkxIyTE!0CG z3l#3(J;mqA4y2rZlx>uAsNvybD&L?VTwv_vAz4HM>4j8SYyS!ynjnaobkuCBX zMxU`KIXNh5Zys_kiaaWhi@rKA@-dqlrXg}8Y%xGdQHTXPt*BwAY9~p9C*Cu~x89|H zewxd9bEz*P=6P4iyFphjm%(1+1(@SI@7&R&nJOdN`yk`#ez*v(8M z8@Jl8d^^A(imXkLZ`Sg6s+5dS!jK<_iV+qBd*DA7p31*t`=xWhQ|2Q8MV>1+~70ZodF0yo$Ypsfo!^BmRD zsI#oGSL-{8x;=OO7y$@xK&xDQGk0A<7KfT2;q(6VOnH&XX=Y>Rb|W9G_znX#Q#xOf zSe<-JU_ji(#iyk7L$aLKPqcGaom4vDzOpa)wY~4)oVA85$HCK&)~-Zw_M4oOc1<6# z+_^;}EMm!KZXx1jwt#dX7RISbLB!BbN!ANNRhc1nOFk%R2Ov+F&8X+C$yiZQ4SZ|JZL@rU@R~r;_-#Ku}giI&A*?j|)(NnQN ztyDqy$vTRIs&Gy}&0-G+ycl~CY?dvXZ_NVN>evoOoXP;E*Mme9NO)UfJJiDlA=685 zv!?)-OZS9j#8@Da`DjjD%mCMU>iu&+`CyNF^Gq-tH*V{}X-T^4qRx!Zm$ao~sN zS#F+n{U_b5Z}|PcAN}bH3FoLHpM_L|GnW`gUhh=2zX$f?jf za=m3`D-fF@aArrP$Q8xw6A1n$6VfwbE*11eMS;UQW2U>ZT0jTi>@7 zeUK1Yc0Dl1DnV|k#mutGmketBu%N^B<(R2$&4$fbkZ_xwTS zVJyyeH))y?k=!_&bzgz7JBN0hAsO6F_@Pgu;AYcDS@M*J3Jop~Z2cKdbVd-=!lte6 z*He}g3^Ku+Hyw+zDZ{R&@9%1RF-szQ97$?D#Oe<&pa7QT>u#pi6B3CZN2ud$ zWN=P!KSq(&(&a+Eb8T7)DoTMGT%FzZ-JY8JC*y1>+yM<_8TV6F zAU3eBVnTljnk3nz`{#49)_A8K%RC*Op%2J`sl&C|k1E(Ep7M_%I_5Re%$ii@AKD3z z4mgB6>(DW}Q=6HCS_DebJ6nCJjcRZyx}j&C(U~T#y^HGW(ODwnB&H>NaOz%r@Br1o zSR0e`=&bS8O^7rT=wL&AgTkI1%F$%z$g}!>*ke!r$!tiXT6>f12={~P9#dV&LZwgK zxHHT8p2*GM)#gFU%zlA^9F;|2dsPoe@X@R#lL{D`vlNm3p5?^U)UYp;seMq69m2mh zDZv=IN|59zoeDjG5870de05!{UJ>_zD%b*NLbZlU)G(&R-DiDx^vv=&P zU;*y!fpjxP6>E2x)fI;}Ultjd2gjf-PC0OT4nx@z7^P}hG?QqpGF}4fh+>frO_Ozy ze>0S53e!R6*9@31v9h@o0(5;~NTLt5D=ngu!15m|>;YQ~;JcHT3@9!6V^ z4pj<}X)fA(aX6=Z`AMMnXow{>S34^tb*h3z5+;~G^s}*wz(|Wi(hZ)LL_nR1WZ8q&oi0UZa{y-MQBf>NhPi-lMAC+^WpH<1?J4U23y6_jn{N?H(S?mKB7e~FiA%jxjH4|#iFd%TH^WX0i+A0r>w5h_n zN4sWvCOn^gjkzy5E%D4%+lDiCb5`9Ej*4g#`l8W`*X;CjQ*(DHRWYOYKv60gz4dPY z1=)mRIyWHTGiAWfs_=_#;~W@r(7JipXJQccIdz6pSEIi$`h}(Y_~YO?Ex$aY&{9Pe zD#;FbhilLr-ekVom?ZTK?pSs)f}{bk<@R`{X!B5EoaAg}oC+2tvKdvk4}v~3||Tt9}_mcRtaf}1x~OB9Uj8~YhzEPFRJ_TngwE(Y32H>4xHSWV`8l1CD?gZnQzBM z@00z$mv1dv4+99I+1?{ip}n5L`&t$344YUur^evJYR&OW`tLT7DR_0;8p?~Uo@?jy z6N#Db*vAPo9CIEzv9Z)j;|HTA)^TY{CFmwmk%L@J*l z$;rPh+88R^c}5onnu0wKw;(nudadfzMD(Dq3iwr)l?QwJ_V$Vi4PyQKOt284^7HHB zWQRC0PKln|`GYx!Nbk4UcG87PO2Hshgph02?vH(Kl6a@*!nsZ)_70gluvCRK>@X=X z3QZawPE#YJQaNML8PI^W;j%TexULGcVWlpVK8fAhn&g+7;_hmx9u}z-8XuzBX_EY6S@?!PUoY zew)I%WJ$(=iO(8N+C3pIO~O)6@UMMYf_hYcmDzo@Gk?Wd*L-Ko+OkBjp?}Xk*^0r$ z^Z;E_Ll4spUij{iyLmcJz@A?EW9iqF?LH1FW7nBFw3lEa&I!B+2Vj#UZ4-=?r6Tfi zk+vs{m8EH)q8<<|U%Sa&hkYB$d1Ra^twNF`I%2O=QbeJo@d-5(=W8v! z`PX4`6ws#eM=cdSpQf76Dt8TSKD%HeSxIv&4`#fnh%Xc3(1yd4VkXSs#$WS$nzEvM z5$yw{Jp#Py5h{w#(1-{qD(_F{);AGQk?2a@xCaX9l|7k0Ddl=!7o}< z4?}4tEc@(EJ{zJ{L>VBnJ1pv?d-j5*dhYd1B+QtQ;LA=XsnDk?)E?~5IG16^OA#D9 zeBXAI;Ga*$1jWT@cfkXCVhny!rJ46iS>C;&ZMUyx!Eq%3 zaGx3cYZXjPbn4zC063*<+bKI>ljzsO=Y+-NTE>*KogXMntT}$W>Kz|#R^~MQUb3438q=oN0*y+yO-Eb*P#L(I%D z>A|TNifg6QCnOP$S6M&_!e*jh+(W0+!r{{g0T`LWL2ef?tHoLD8^9h*{hJqf%r`k+ zH-6OGAKeI-ef0@9anj5~&tc3^t?f~{N^c4VtiJF;`Rx;S@RyoFfaD0r&ZXst@|H^h z3Cq@5Q00K?3jyl#U&3a9qD_t&(>v4e7a^V5Q(15k(Lm(Y&()A@PsUHD>lD>iOkxkw zlo@y4K0CBYA{j%C!hYrbcsj`BY)E0UZTL6S({rW&Osa!37x0_5eK{#CGlEx~d7q)@ z<$XCJJ(LDj2))Sf5X5nCmh)uRhS;uk*UxeSr^F^OU~ETlDzWsdL329wP$0p!XY^=| zLm+h=2|Fp+y1_BiDS9u)XJs+xU_Ur4GVvbOHlF+2Z~g!J%@F~Gwuk@ z)_R&$LhOUGgMVLB-IeV_l1TO@)Dow6C5vOkd%!Wd)DCs3*ho%`Zz^N==bY!q3Jg%a zEouHi>XjBw0fXeyh@5rl&%4K{#+g~%2@9GU4?+PT<=f4I>2O>-)5C5 zKzR$>wA<0GnL|6*#47ULOJvz+3;GR^qeB_COMW5u3GeO(R=eOHMocO^_GLS;`Xi!8 zuIIBIO!Iqhp)uEN+E-J9P?iH#>?jAntP|7%LumXj)g-mkC(@-h9q&9K*iT-MN&;z@ zE(rQ%o_Y1+ZuCK%T)G^dLHPdht51x*+4eaaV-PB+hdBhsZTB4Skh}2933;%H7E7mE zsXyKplR2T264h!I_JZt%3VT4meJ1%}y5jb6jG z>c=a>G0EWY!Ay$_EPFWTn0u+_M%*_0`_!)AUdH=vS%ohmR1p!6CDqa}k4(1{Z$SHf z#~Va0u8T;e2%d4PRxh^{68WN);llAf8KKTb)DB7RCT<9MXXfi7^|&K`p1$DfFN$@g`1ND@ESFw!l*a#!-tI z<-@8*TI!yY&ESv0U(V*ROZk$W70+~poWk{P=o~tnWvY7#nrUGhX*i?d9A|lmKSaqv z;!@CLiWILqOm?lHQJCjtmI2L{TfyLiLp}0mLkjl`D;R&&j{b)$Oci-FaWP_T*s7*1 zfu^MtF@!cVz_;J<^S|_R>X?*YSzxTxV~!xF32$mq=&7Y1q#2rwu;60%6a8Z!XS)DF zFyl-sq zJb%#b@?3ER`VObl`r3PL&SPIb1Y8RjF3YbIunMQ~de+McDMvX$95|su-K#ZeeA*83 zbb3Nj>c0S;jCxr;x$n5@8L@X4b0=RN&S|JE>RKTc`Cq=hVid^5qkq&$bQM!E&3A5^ zqHS4-HDx!cdIyc<@#_iig-E_U#joCy-j%Czf_f0K&~nfAaRNxSU1LqnOo-XD-=!@2 z>?cL9p0<83sPBWfEVj~E10FaKi|8@E_9uE3ZQw$}C2{AGUtJLpQ+a7{s^B^7cxog~ zS$t5;Lo`hbaNmQ~!R#r!|+HQu8N1alCbsR1NvE@Fe z^jp?X|C#>0<75wJ-N%Fo{QayfoAP}6CE>>|&Q*QZ(99516G4B8m9ysHUPYGOCd-%n@5Hz^KWOs z43uH5vsO8-)L_+fM(P84E{KJ<{wNkfo>AxmK84N`?hA=SWm?-v)eaWdQ?_e4P6=dv z1awJeDp+zp#7yYeg(FZb3?A0`6!(;N%V>hnx$BQj<&JB934J(Pt)=K2vHa;5pPMCqZ)i4C!SIu}$DwR+d-?_IBh<{&4nX5H7 zS?k~Qg`7cypQL?=vAs~-K`2uY>|wF;h z+7eOl^T@SePoO<>yY*1hXq?2w^}-;Nt;S`XN>RzBTWaG@h#9)fT4jt6!L36@%XKKP zZepdr=(q+yZnEV&t7%m%r68u(XDeKX;Gm~N%uJCV9OE=O9;P~S)?nnPUqlRt(T~DL z#TPLRjI2z?ps)fZOI%@C$764>RA3Fy__t}6NwJ8|O!g}eYZeYDkM=o1Sqp!0?#}&l zE*a?l5b%8=+*Dwm&*#bo*jH<;du9Ch#Z1@Q*&qlaz$(8I+8R{oWfb?P;T-YU&=O<>$BlCv%Bt#(gC5sp ziyqkwS^dK}@@eSMtW8vb@6YA;tym&d48|8}zpf<;0&Sx5kli7SQ#25##B(iKDVUC){FtIfy7!r0M-mc%1&$w`-PN-1usHqU%BqTN1v8v~0fIR>k} zByAym_&082@;YrsJA<_V&+U5xvL4V;X=8FYVdN#5L09j@I%qWzK~jBa_}HbVdEt1F z9F$@{qkFKJlVMV!H$`v$PQ> zwx3s&wFOe0ei)~$g{9gblXp9kT6b$o$Cq68J>QG|qF*mji73;v^@(ATtYn7Ih$58EboQ;D z{|2GNJj~$>lWy=uY@yx$1Ua$)``E@Qj(P|f)VugjNwXYS$4;eQS^J$}ySyAQG#(U^ zMvJWBQB;m4f>Tut*p^*Gn$N~sAym^*zePU|lh zn#n0G5vM=Yvyo9CL$gv;5%3a4S z#d$C1>Oxxu9#y84$Ta~oBHEIKp4WKp<8bPimH+Qm2&PTOR{@N2I21Kwzi297(NMAE z6GbVvmH#umJ~dzg-OM%c15CZn`hFzH5C+m0E0L?Yf;PbaJQxy_dBBlTur&)3u>3Y= zA)IX4^O|GAhT~vnM7SE;pUA+?(`?%$JT|P^z+#+-s4IZ}P0CAbSjK@;^F&uhfdEEy z;cC|)oE{l;_8Z(^T!5+ERPx}^f3-e4fVpcBvGQ8v?K7y`vltKXmt*CAfneBw16+%C z!X4s=KQq>ahPC{#f$az_YraO_{Fn1wUE6CC)^)-8*6se*ipeBd8otF zL+i&ZsWc4a%+FQ&_VoclvevlR4vsf*+uFTX%vXqff^>MzNrjhj%)${cAn})~+P6Eq1&0dYCGZyH=? zZF2G;o1|N0ZVc+UTd7%zlzAl>WdOvQjmW$K>CuU7MN*aI`cW6ck%#xi?5c)jg^vpT zgom_|_{fGP zj`{vR={J4rT_)K4XX_zV=x9Dw{Wu-w^6fRU)%&02dO_#H>3 z%X-IIrdmNK9LtMovU5t?Iq`J)nQO$^myK zh^frNn-xmMH#GUb$vj0L{#>wlzLm>`ZqDXOScN<$zO z*BWY>+?!(Af}}|G!#Cjs%TL#aPqf)ULWqd2WB%yOXcf-e2{?W<=aocmu1$c$1x^X9 z#ZUmbb{{|T1=@eRjCnSXx1a8_ha)Xm<1c0BRct!P4cw{}GfTheLZZMt!@X85)C_9- zg~)tmqL-4T^oa1q=4mP)*xVDWF;6rVlr-A}2rTAl`JKcOz;Hhoqfe?6ddhAJ0eKH? zeOs@#3*)bz9g)e8Sg3c`n#UTtM4VKy5I#$uIwvvNLloO4(S1~UK(##`R*m-+uD!9j zbN6#FW1z+e@s9!cvSxWm=jMj3g*I7;sDm0rA$ohxFdHm~H}lN=NXXHNrm>LmvLyp- zTk=#W`B3Gp^)}w&j?eIXm&sI*w@1hK`Q!I-;$679LHp0oTEk%jCv;ULpAFbEVwiVg zqAzc4@w^-CU$DX-8)*unm?*czJ$-&Wa|RU)H^`^^(W_x#crvIpLwVkguV`zyD1dz8 zzdYZwCl|z<&;G@UHs#1(Zv0NL$P4vdS?C%YEh?vZZlE z0G$tc(ba<;4g;yYE(k}rN~yQv(wXYn{giQ z9e-l0)lLm)EtC6BoSaP?h}Zt=wd>b?c=RkVW-+ApkX8A3BH5^E)St?3+&adn~9YzD0StD;=fIB_#u z1TG1p{~FA|bl$es+;vP8^2)S9+@03*`zA<6_t=UaoD^A|vYJtHD#M;t7tQ>2n1ky{ zbY*I)+BiHLoc-Rj3u6yjHz88mD`oU8Dm{Y#RniZScNFk|1P#sxW6uKlueOadJHG%` zgvi`63|r9*DNktpwPA3t&AQKyPqKyTB_=ecP3=ls8@X-hcm`a8tl^ATZA##9;O0us z0LjpJ4u(r^f4)l~O2s&-Nb0&NpL5HLJeNFyr{QaGd`}5Y1IgtF$q_hqh@HBPpgPij zG57ko;=Of{{;K8lkKM-_<01~geWRBJW|9OIOJvi>@g6Zu#LBr3`KX7dwf+v=62fcB zZ{UvNVikvAF;AuW_ueOF;LiLU5$dog|4cU%#DA>DzaLWM_X=SI-aOlWHr zZkz~t_l`^G7=Lk%cNJLB8|1VSP{-@I_4F;j5Ky#B_vJ98aEY5+43ZOoAK@AD=Wjmu z^?pY5QU*f!$2;(2R~0?T-phzUie`%2<0+XQ>OX($VAUU?r}UnGzpIg2fL;VtTmpVx zBMFrO`cpXlX%8YVYK7gb#=*dOAy`g4FyXxoe;JmOC1NIe7{i%f!P~~BcHtHW zz%5w`RglEPbtx5G$rCKfr7DVWjrXsxnaXV(c{><(&N)3O1`p(bNO&Zb`*dxmNJ>qn(K3|&te83uwlV-fcHJ5wjuW5K^ayLz{MbN@ya*ery^ zkikD1lX5$X5-KJtmxU57#kChSsg|F_4!Jp-rZrNtZq*?hrmRMupE(M9^2BCT3M%Zv z_j2xw=UgR;Dh^EEFAC{1x>IDMuG12nI#AQf5jm%)4dA?YBc-s4eD_Qk?O+&IhwC`e zC)JfvxSS=WU|c?x>`eIcXmLPl??^1R7;#8Fa>jDp@jT8rU3gpd)blhavMT!@Y8z%J z*h6*Rhj`0BxRIAB$f&U;e`Ef=ic7r;d0CSPGw=)lZ|iS>atLv&Dfh~V`)EPh8@w|Il)S1ze%K-7T8rs;k@*6T097wDF&$5hENTl|@w_J`NUY`4j-`<_7&w5b;xaYz9_Uf&q zOIdL8A3O}i!}HjSaB%C8PYi??i!oucBuM;$s$}kXpf8C(hc|s_r`a}?Yfa-!SRAkA zNaPwkvqtr}P8v#aGCK?-r}MKUu%k>na-l0tKzYzBg@^PsQh--NFMsD5iM%Ujb|O1w zH9aN!*-d}*@27`yMiG<8Q-n`DQpXObs~bGNp9{<^n)UQl`nDDlJQg+|rZc-}xFvl2 zb?MmN{(oW|oR2+3&Is$J_w2A-CLOwLn|Z*k723v?1C6u!7UY|8aBb3$B~vMHofdL3 zVuXOI0-7kv*!d13IWOkYS>jCmD;}nZ?$>$uiy4xn`d0KWwQ|z{t zv%Tqy!lma=fYmbN?U1?}!mUm(6SE9Z#sOaa^u*w?BG{$VZPuVQ=_g8FPRAvao&Y%T zpUS(_Q9EKMo(7SNyW^sikKGx){i(UB;rE29j__=*S~z{Sp|X_uBY5z}Q;TRd=e@IS zO1+yMYRbZiH^Z6Yu}e7k%jA{f!;^y-?5)HkDK>CAPjX#z$CRFrW8HJ7hog*@sKFE9 zmtk(B^$P*+A%!8gW${_=ZgPQz1F7~$zf!XH@Z?msCZAzPWv1dSDRPfh-8bRE&5DpN zUrJy0EffHbQ?f}0`SkWKtp~=2eL5%ffAYr1xoH* zV`N8R?p31ubB{GLwAKf!OLFbh^!~bpS~^+yMGT{oj5IZjeNHz?rFZz`DT#%jO>8(q zkbPEn`6G8uHfAEKg)A?)h4hoTGTcbXamlDB*GJi*I@fnj1MNyHBcb3*ogrpED$M7r zf<_LhekuykLQzOp{6APKW=&eAaY;iPD;IjG`7 zc*+bdLR~<-8!t;`2Xm+g?5?}A4SvAtop;)qJSdeCEoSzEoqKarCAMQrF38(i(?IT! z;HCfEgmQ7=k+~SpD%JY(+rIiH6L)k~sj5+Jj{`Qv2*h7|^@#|%2i%r)f19NU{Xc5Ju5SYkTyI64?Omt=Agnhc- zAAN$$PMZ9!On>n-Sug9wT1t-mk;0|jZ1*m&jO)UJ%xjeeZf%+Y`6U(IZdi^d18)>wFxSbr{qPi5ppf3JyU|u$ zGEGVMgJUcwKinSnNHy9~uq9QkIJtF)-TxMsCn{sd{vfOu!jW!1u)u11QIV;rBq%n| z;?(sPcc*}4@_LxIgxNxswmYG!#VfmrY=m^oQ-vj)><_3Ci}Wru*kY#G*2khai_J|4 z0A&ee6H$bE&cM#T5f}!+@%sBm$NLfvjk%uE&(d*R&D!FaHpKt-BzrzSnhp zkMH;T51v0fkMlU6&+~EK?v1LU1A;v3L^UbX3jfcW4pqcH8twYT2k-YHGW!zWI^zM{ zwhVWoCs9uY*1I8VWvuhPiSob@70yR4cWX)?$GLly)UL*gCZB8Q3UwXi{#FBW3P={# zA0)IkKIFdyl1TzQj_>UfhV$QSe_eG8%cNA+2Z#S&7emC*zqgZgq`9LvAa0r#zxX5$ z*0icO*OI}q77KBiSleO&#)ADyj6OXu-qvQ-Bv=6;9i4hmmK6>UNpCjB&e36eDRxxB zX9fjb?i-opL6V)eYp?W&O92@K@SK5!r!Ag-Q9gB3O+-b$kXI$H9*f@%X2m389QW?TYm!Yjm8UPoInN0C zP^Fs7jI&!EiQhb>alg5fb?tDcB4X_c2c!c$P4BNH2B4%yT%f`V2 zU|M`#OO8eu@oAZ4mb}3Zuw(RD)QkF<$9?FnS?$$nq(}fZwpwvJ_CslFUu0HKYpF1O zxt|RU&5C#&A`D-3Kk%19)In**w0f-npJLfKcxGcMEj75RF_A_2N!u%}uW8kplx*0I zAht?P{cOc+qD~2na`JjtjE6b1ZAWOoZ#;WY({J?vhh<+Y9uO|ZBb8P&M{R9;FAK$3 zpCwrISa!WlGn^z1T#94-*|&fDxRCB|LLl4uM*^j1pJJ3Lo{su-iz_ntfi8{ZjmK*@U2NB?{04mUe{wR=7{CtJk)tjR~{Mcns^w#RZ$=Zo+* zN)+O06_6`6s?t z!?MFaL3T4UEi6ja?lb(Q9z|Z-^12(>Er;RnK&Ghg=?vcMI>c{>YWLjvcYmEpQ2)9) z1^f0G6kzH77hcNod;G^d`R0`WpMiA1kMX~7^*_dIfc;wz6Tl^0^?t|Zeu81Ml=A`H zQn~TRWe{qXi86Kn7Z0s z#Xu^nAay^axFb?PZ+ua|P9Xk^9X?Y7P2l9J6!bq7%#x72{Y^kuiwly~IN=gALC`+V zM0tTkzQ>BpVsdIsp$%H{RY=T?i(scjlyTq5Q3Ld;iBg2cWflvp*`VYjAn&M#l%5#> zH4KZmKG54x+Q_vzW{pqp8>7w9B}E2)Cvz$dhD9bpJ6bcyr2xdWKmpr2*_%7Efs;zC z*=n5AYCKHp=Md!&&o2u}H4VR;L#`>ma=F-EB2#0oBGQ>z)oitcRXpld6p}>GErV6v zkmB3>i-thieQjC7gg9)P=CY|8Z??{zX`Opay0Jm(^pn;@jDu2^60#va)`JYX$4yJ` zl+BR*22E5}Osf0=SF-MNK3rvYA_(~I3WPE;3m@O|G1Cc_ZVNZbbWIbuRmawNpvZub z(Jt3M19BX!8n^I&Z{#-)#%|6r>CdaP*4DA~tr{cxpijpXI-5)mT}(e`o9urzZij#O z)3glBB-LWLXmdy_OiD>6thKA67-pp_SJYo6z(=yh#6q-h^p)c3TVyl!9!*;gsbajw$ghqu^o}{Hes_#)7Iy?-_Qbt42d@WX zUF(>6*r<7C4lR7+0*^zCzw>gTRt0KTU9xg5y}i9|uCe8_@VJw`yuE!SsS)*BjJ3HU z&0%T_uCDAB%FJd>*kHHGEFX>mhH$ZHO<5_`*H88+JS>`R>||`uU95$<__SGLJgGzM zSl2vnzGG1nT{?nE#Uka6utBlYC7FRi{CPprvzIGdbS6)M{aIr5phNLfpVt-|%VDi+ z);8O%rF$%(!&CR$RvxTtDt~6E53K_{PWfo%#9_A$9~|&K1n78wx4Rous*KURViS>< z7g3m}c2&+QNyh*9)h*kTV{s`rJqEmcKOQA=p;j{&9HKInuE7{;3`2L1I)`-``yb}6fSViq84p1z`V4U^A$}+2Hr!D zz&3T5H=S{6BVvZ5IXgP{%&~UnWQG+i&vSC7MS9qW`+}RVj<7*g{)k)~^E^s+WBN<5Eb9RE`I$kVvzFdfSKb<${a=pQVWEf*<*pl&`*C7v69XiRWZDkql zZ`xhLI#y>I%Mvvw!?jW0Vzzcipt7Zt6Hdd`#lS_5ICfc&zbxCr;>YVdh~W|f@OS~n za3!n-n?aFkMwB=Dz11v9VHmgzCPUM7+`9B72vf37gBH|qZN|40q}{t(Lu!YVyuUPd z7J#DwIb&cfGg*IhK9IYrtv?{J5$BY57+!cqX`cdRQ<&o#F5j=j7ahx)oX`l?h1{W(v3ZZe>LkwV|=3^Qdc;wKPh%XTulB zu{OA>we;yaYV)2vqxBou#dNsO?y%?Zl$(l%?%-)aNXx&v`|k z3zt5##=Ls0l2;mcOa;9BW)Z)_Htvuzakh%712ZL}`Cw!*k@Yd~ze= z@V1??jz>VFglmrC>9s$!df?M_8P~w;r8n+g z)Npk-F=K-6V%~P1UA!;hkphrzfgN<~`#%=XAEn=k?0HTiQTzyMQ=RMN;mP*?i&&#N zYolaAVPsZDDPq)NQ6L)t`DsisRg67sX(A@Qj}#|&OY9gY!P~>hIOzQwB2_k=!DmpQ zoFrBLI!DZ*BZ@}4!Z1hf9Jv-dhgqi=f(GyWZb!JZ5#`{>=BkEm`o}!NY?tOsw#TY0 zpV@aOx41u+kb>x2MZ!1Ch1vK2G*^LzRp@o2VeB;SUNh|>yYt;Ca&`K)XH-;gh?;}w zI!?l(ZtVDoZiR25mLa6UQ*X$3e5X5Ap=mQU=+JC4)!*yJ_^gZ~>XKsfPC%7hXEeQ1 ztKS22i+cjY1>d&4&w5vL?-+(|FLHeF-t&t(JNz(Ks3hnW)~+9>aaHAI+SSgm%_lGJ zoWoSQ&JH(53suuqx__SREp*;vQ0@8s<9K)BWxDFizkh!J`gP9Wj0eJWoe5MZqH_$b z_^@*ej9F2`0AKjPDum&dzzHNX zl$Xr7?q{W_=NYV`J~x#wRUT^+;!~jqzs{ovK&W)r&p^dO8-wFz&%$LaFQ4IE-;4Mp z^b4p&dFa70An$%5mCs$m=9l3ugmkwsp9ho4aGGRK?buZTp&N0?jeJ=Ru%PFI+EdmU zL+ba0iAwep0>d*cExkfBjtEOjdPR(xWsNoBCySZ_I>JIb)K$OVnTBRmxPtwCfYu{1 zGFGdKvL&A3yp1_@>m9BOmYGG}mMr5V9ZlB${7h;GyC56dLL7IvI@D=q23_qJW74uS zfH%brmJK?@9Ypr4`NV5j!_JIbl5Ne;tPsc{g?I)#4U!go7+ZzA^iXa!S##iCRl+10 zeV=3QdO@_M+q0vk-}6_3;(tt;?$hcpKMRSc)bzITbZ-tS4jl0}WOgHtzvFu}C-cjI_tkN!_7qI1*9tRTP(`%EGhmK)OJlu?>3z6qH z&F{;3scUGrxMwd;*WMpFo8Z5qa%Cx6Lk0QCW|cckHz}oTa|}lbQ*??>H2!(*;9**1 znMFhY&-2Z49r>TTjpN3h>n+P^cfLjr*529gIsdD0(8pl%Tc?XPUD;C(b)EH_lu;J+ z>KW6MvTq}l4Ej~$-SP{I9MAI~C}oYAkIPxHJ$90ea4&Dkb#!8Q898I)vFACMx_qB6 zlWW#K;?x$1tTodTXN2lhZpXBr<&2n_c8>ktSx>VY!?L#HV(mj!=D92D~jOmW;RWqk=5I=j*z>>~Dr{o6abNbo_b zpZnYMRVN`WfmY45n>D;vioN*EX$S{(Gq2wE_AA^_+#OKWW3*P#poWOlWsw!OIeW%I ztqy8Zrsc#-W8{c_ZDMAD%mlyWhY@g~R5qyEj!rM>wPo!DjcGxBo(BXEt7U5!_N~Q-=E|;tf$x> zLUT2t6c#F^e;;I~BR@}gd!w4fe~i}&n$CEWv)Es-Hl~ZcPd(<^BdGnNj9CRT(mo5f zP@Zp|^&IxfgCX4WdCazSwe{Yr?lj>fWBP6aJJ_#Dgb4iLGu7NLHO+8_l?r~|*8CvF zD8L*5&u0Hv$)j{UnVoN0DhNhq4SD4eBDaco*{Mb01t{y4_4`-&Q4~Pa=`wvO^nV%k z!~cU($LQK)#ijq%)0>q-t5sdYG|VjZZe$o58W|?PG>&*+dNabz!tozH{mwag>4Hwb72y(}DLsEsZg!e>AE51pR)xF)f*B`GcIA3FV6 z+Xb3_-%daM{7yzwUuOH8f9domS!K1^y{kF71-Up(?z5NqBYOoc)g z>cd%eSxd2KkJ@(Mt=Jbp#HC(UbFbA=F`FR=IZAkmj45&*X3o`l|89{Gykul zZrM1!+LVHCdiLxeMty$oA4z@vYjan9%Zv7Z^mOlQ7l3-35>4BSjtfBjzk2$A==6c5 z&e^pKI=yT3A2+@0%l8X6z2`+^&(!RNp59wtOfJmryU^1Ycl)2$_3xbw^mP71r;kn! zTo~$amItOk4$Q9(tRMWVr~kRo(_fDb{o|%jeH@*?aMS<(gQj1I>FfLd71MXWjsGL2 zw@!^u{hwm`yC3KOpy}&-(-&6y{NnrF;~8S`%*_1E=8ySz_4D&H^Pj%WfBCgg`DkH! z`oC!U=HCBy(^oeZk4~4)|3%XmhyM}Nm;Xmh|Jd*kntt?OH2u@=#^%xK)>QxJt)1QV zf6?^aFJHbM{)bEd^7nkdxB2J-P5=7;M$^yMKAwI5`QzZj&+(yOhoAmOOh5j=i0S{I zkopCq{$h|*xBkD3`fz>8|1YC1RnnVzxWcad3V|9Wh*_0B)NA_RjJioo9_@Tb_}9hC z@F!`oxK}buqcN8|9Ti)%iw$C>)=wH({PU|GJNN$&qb{19{DNk(*Z)wQe!Y|?<74eD zny^@o^wG+8N2;(AW)nvB+-oaX?lX}9<*EydHjBlCrqn>ct^DIyd(+lF9)t7Wl)Y^L)OjC#l!Wog{r|#FuDN`edQO9K<+rf^Se%(6*AuYw0xp7Xs^YahG*Ht3KuG zMz4bbSb7{B0AlKmcXh0&+AI)=js@rQ)8l#pTE!!qkHR;TiZ6suzAb>oT-8=_-06UG z3EiRH1VxaPKItJ1A8xZO!`Md{keRG7@i>%agC6ToETxX*z8Q?vuE17{gl2V18S=zE zI=44fWaRcC)d(bGXSJJ=W!n`&PUt-_&G2VDLLE}lOF8B`31|W-7vq{i5X|Q%!6Ggb z67ipBKk6Mk{F$Z}%En}*PDW=B;UekccB>Cy+qSIhpJGhw0_okLRfh)-R%-h_O0LcY zh6JJv(aZIh8z9UKptt401$kDhH_)`!P%MacU@wg|9Zi#rQ^n zEb458F91QFxC6OTuQ0lMp!>Tdb}BtJIOb5ug49Z%!S`@ z9ara)XR18Guc7t`d4DVFi5}~4d;B79-dr|;&ws#TfHRPF5{$Jt`^7TUd+XfLvutSS zODuztB{_!S@T{J|Eh+Q4f0fo*QhI7Z#Kj0t^W&k}?cJd#ubgOa@-|PG1?Ng&_rQT8 zmG+d(k&$0}mL~L=?BxxeN`>AJidF{$#^utiJo5z{du;;MULulsPxSju1V#v5>ZIn4{Gx3Ot2)qB{1-hKh^?k_NyH{kQ}dUKxilGu#@E@dDi z(>TP1gfnkx1}uq$aVfr%7?y)mvBYt1W0-$91u9=Ze2(Vioq57HNQQbDy5(bMhE($L zBN+GVzeFDELgYJtw!>vu?hv2r=PAc}`Ix1?#ta7yYe;^CyDv8pf1Eq%YQo+GU?lxa z5tnD4#>(qsfcW9ZLUI{=;)lt6idYuLlM0k#bz&j#11v&F`*L)k@uT@tj+Qd5D~$s; zmRAOv#kF23&L5@?DdNx|55|+{hv`M$>pZVqNd8@9Y8~A&EbGXyw&GESP5=X1P;W$; zMoJK#OdT)v;bl0E$oa6QOh_k5NEB9P!=iEVBLb*s-f@&88ickNrx~@M50Vzq)3RC1 zXu0pKk;NS7EK1!-W4CmaKdhW`NnDcF;rJ+YLDxpvYw+^DtE=d5y9{b=2RVK4xR`z6 zu}{ajV?hN?0tNL$LSdo3alc)>8>NY;`S+^oNKHojIRS@|Z|A6fiavOIQX(d|_+c=| zaj^^{o>GIxBr(Jl)3&Bf$IZyJ#>OWU!4AQ;QLx8dFzTou+NKFEm*an99yjX0ssfpJ z`XMz-VPr0~u2s620C1W7o6lO7t|^%!1KF%DmBxwsmXtItmAXbgdX3&9EcyfG`uG2D zjC#RIjW=LNvT%O-N$JURTl#W`RsGq5u`50mz;Y)}``I4XIGV56EnL*=+Hc;Qd|!e@ zO6L@Dl|N4!m@#{5GVpX(rZP}LNez@4`r)l&83>ZpEBt~$F-{L?K5QeaX&Q9k6=s_1 zjUYY?Rob)XLtz4S_kC{V<=dDxp0qlDxCA8ZV!Juy3d`BPYBcIKr-1fq6(3y+%p0a4 z!s1-1QmK8fCHDYX%9@KkssmI-T0hS)0BR>vV>}&z6OE_nIKO?3B~FIVBJPm(aDN)9 zVr+}~jV?Fo%cVyVuT^caD0_-MNw$Ltf~8Gs$rFEX>LBOj?B16gef9Vx-#SH!Vy1#C zM9Cco_)qb;9)THvhUqWyU$@Q%1v42KodROQWpJI8W;a1;htv}>vyDnBM1BEf_~)Pb zXlbFqyS|R=;n`sjN=eE4b84h8x`A{FZC_apZ;?omJWP!dP_q><*H=sA_A-`Mnl6Eb z6!V^Q2E3&z{P1v7j8blZB~UVNVr(-Y&J8`=rma?ccmoGj%^1h`-1d%BsQBmrPk9rg3sA5B&rz1wz z98j-2qhDa_+EXUf=&IIKH_2 zV@-|TMmr zJm*!=T|_X13{cWst&YEvjMc%~vDWi0s5(9FEPO^v!82xt&wlX@H+&W&AaX^R33i70C-EwDv&89C$ z_GP^WXbVzmsx%Ks4Od>{P7UZcsYWnp>wf$KYk&5OD&{-E;LE|Yi$EBjD&&>hBMdX@ ztV{YH=?Dh$8q$9JT50V_HWfOrpkRf9s~)ph7q!-GK@=ZSd}}Jh95vh~0(7oR^4wLx ze8F|MVKQ=W4=aDKy{w?DGk)J`LY*nzOM!2bBI$bl+TJmh4(MlEZrV5054I7WbLBEZ z()KG}IzN0r-wZiXzD*St6#(P|y{Xt2)cl-#`>T;SDqSzY)A1p7w1OEl{s8O;X9$ph zQ@2G&nZlzE@TM!E^pzk~ql0KU;%O%Hp0p#7FO0J->PI5-jv8ifg35S;om&vEP=bty zQ_+&~)T@v*IJGGSxTYR6ZAyKz3O7wKQkO;8=7wh8xHoEre8IwSyv4p>PxtI;OjtY( zC4y?3m4Vt8E|CvEpaut%;)EON?N>aw8XT_AMpBzmhXy#S%PT4c26}&I7s;T`NW5n( zgbY}T0cGGR1LL7;v46J^`_lfJwj$6&V}`(>PznF~Z}9szh`0mFjq{^Br&O>@TM67c z!NJ>zeCI^kaClf-^c4u0fsGon3W=fs`@B+}0ZWvdhJsfkuBdr-XI^`$L&V63MDsDO z^x4$ih-lxA1-r-q5#k+f^m8mkY8MY*DsX8=Or8+Zv=V+DEeX6$zj6R2t$@BH!r|e` zh*fjD+rjb}TLG6;{yx}^?+{&doL2*FF$Jv=1i2yPyiTH_U5$|nh36%}UYaJCdcn&p z!`7TV8v8A`c;QDDR>8gZ9|JVb z`jDFSbJ)}h^r@38a)GgZ-|rogsN!Z*IU8sS z@cbaeeYQgwM+E$jF4`$r{}2~J9Y|T=LbFJb(320xL+-q6OR4=%0Ant24CEdj6eGvI zFOV*LH; z?qow8L+ssv%jjlJWN7-5;6hpvKjLy6^+MDb^WkRs8iGb` zSg>G879S>Q+9k>xFG_k4u5|*;9V~o&2o%S`8H)h}dJl8nBlNxV%85RYtL{;&rC`iL zzx5~6G!Vg_dkQP~z63^%&xf@*9_eyxUgr zS1R)Y27^vNk0nZx--L_p z=P>Y}jH@geY~=VQJ>+Q!9bA(hDwB6;nwcY`TFwj*90#2cns_+8fZMf2$sp)#Mfdw^BevsV{#9nU}KcN&wNLiymE>2i%WLyT zp;h1(M1&bD!tEuVPE^^CkHE_xz-50ZD*h0URX{$Qf5d0ziTLpd>teEgz(na{GQtEX z&8gkihs$jub~!vg|GalGthy+IZa0126pUs=OZD7OXvh_HSZ8G{XU zE=#V10~lyI8#CBh_|JVyB0kud?SS&^Md7Rr-gZr%flb*3O*0KoFJ)!`*Q9kjUCa~Q zJJFrPU5kWtW6nxDB+ogah;h*quT#(1NZd|EB0NRmi?wNPs zO;#@~pTQD;L4%7^btj4o)ha7R>a~#ERg?hNKLv!W9o*fM+FfMe^i82FF>;Y&pfKLtD-%06y z!RY}ybP_v{wBtMN)~a}c#oW9{MPDCAKYGwIg{i)6?!8Lt8ZiKg{VH*Vb~rNET&8{U z_fF^UU3W5VFNpk-wEOapFZ}Y)YY@ZUk9T_D&w6$`eMcvnZ1`^;;$BvDQrbR?yI%3q zf%%D>eS4!XH$sqHFWcq8|CqxNG&%~gUg>$%Kwo@dOOJDxbFAo3w&#Dy*tp}ngYOge zYq(LKEgm&sKSz~=?teTJ4-R7lbJ8C)#;Ve?gr>)KJ-;LB&#p5N79*} zJM@Cj1N-Us>S1()3V==+fgIaKhjti#HB+DQ>l&RQOQz%CUx9&%;=X*x*Q#U+ItdqE zD5Au1#L(|`{X@pe)Ylfc^5QPfL-gy;u#tu?ub`CPUaqk|<*@XuP5JGHBXB?gu$}sr4bBih@is3) zsNmH1b4p()sjtlO4QI?7`={f6SXviTkc9+T>j3;^>}@=WCiesM5T{!>bEBQ>O=msy zd+NB|rscFZ{55HkqkEEzyZ-iV#H#?h{^E)2a4OI>ND`h#{0r-kJ~JHRpfl6Lz%&u~3YDGYkDvGi}&Cb$m80&F!5jD_-}zPBXGJanR24KI3m?MDRz(fNMyR z5|wUZ0j-+uCY=5UBSSNK#_i2ivBY@Co;Sl5f(Z*h#fnbY%?3Vd;R5Dj1D~tEvYT9) zq+6x$?wxwjJMHmjf-!aG1MbaL%HgJ+I!!s%%&Q-K-9N|xQgK^FwSV5x1j060=S9Cv zmvMW4D5jUcT1Fjcc>rC|*AkW3O{{r@n3{k(iqJOUJdz*z$Z@lb-d|*En|D2&S3D=@ zQA;h(-@LJMb?Mbm+2*4qa`_VR`-p(Ls0woV=<4$ErRBYw*6XC@pWUzbpCi^+?tH(? zr~0Bqm1~7c90C4X1SuI3c$rFonqIRW#<>hw2r@(PHOyIj7;V0C9z$b=*?kC(9)@rwzNl zWeFfg_twS@!h7St8>XmF<|?14znfb|f3hw5Wbqegzx2uJ?L-+h~ zlg;Xe!(y4E7I*>wHNkrN4iV2v@KXMvcA}eKv=XeW`8+pnwTn{O>K!=Qtr9o> z0xLZLlLx`2p9*OvV^80UXO|cEf9(dFxp~NT1ls~D*ck*T3c-Odh7{o0(GM%NuG^#S z8>K2P!vVQgZj~+9BTel$V79N)taM*=YY}k^2h_llEb5_PggcxoO?2UWCAp)S{t?O1 zL?MxQM*X+c;Dx#QZ*%jwkV#0%QGW~ls{kbZra1VkdDkUS&Jg?nbz{Zv{l-S_1w9)GIW0tn+_2zv=QJOFTE zDJcWLhu`}iW%6CY3KVGqM@zub6hKjmT~>3@h2fF3Y`?p{6z7k~uLq>mopHk%lFk7o zRhXv|Kfn!VdS$E>UL*%?C91OW^$YuC1Dl#)1JA|10 z)u;+@xc9r2=hqU21&hlsxj>6m7^30cuj%W5-uqh|I{%U5=g>N@|50S}bMYoxED)5K zeul;Yl`Jp4S+Myw?1St+h3@ymQ^EDGAapJ!>$=Zl)wQSIcS(#31o`RV8n7p~GA^|nzI6eF+ zL5I{It@v9gfGv+hX+6+PD*j1t8uZB!)K#O(C<&|+^dR~D1&EF=2de@4YI+$C{o*|q zX1+N1Ye@`Hk|kyxx*{5i-Yv}Dd{uevS5L&sV7-fyiaW@q#=L*QpUE;Knbo(rS?*~v zf-;2GpH#=RmQgBZ3Kulb_3uV7U!HGh#d(H5$AeSO9}%q9J}9Ju8N8>U?cGKhekFBs z&?|%Qe1a`O!Lr_i@45pzY#7=I{##3r8tdXe{z-e~Fie#k?(Lg-V;SX6&+s{~<0-?b zgR<|*$^Jd>1=U1i(Yq5Z04;jI#UqbU_q6G@07kaAg1 zEy{sfrM*~`=XsEBdx^R!t`7d9 zz|&xJw0%NEkp4>|m#4f)m5g}Nr^e&PODs_bYpM&jY!XC(7DZnLh*Pl~n8*=zAo7Q= z1f4r2WoV4HRlbu_7cSQ8lSQjc)+iPks61DP^c!dE7BJ7p=wx$6vfV_xo^g3)NX`t1 zP`GJxcrwx=+0BKW^BeS<`99c7Y3!%|46?pp)I(qUdol^VbhyJU6d%r%^mK9|3Q{78 zzLkHoOqP>YZFYSv5Z)K=)U5YD!7#s9Cjr>Jmldu~@E8yOnW|F&FLc@Mp(*9`PGwR) z97vNhcbt|b*uRIOjLf}&@&u_%Hti+aw0(GE&HIVKY0$;Jlnk*lzs`CmZlkX7vg1&< zG^JDdB1h`AlXbh*<2XZ#tMczGWcl?0^PJ@;2aCEoeYqHK!wHJkj9h1c2Ei3GyVy0= z_xeV}dd50bG7b(*5jr>k@$qA6&wZ!%VxYF~2)_sPDKo6!+XkUIlwBy0 z!+Tsu^o%vsd}aF_^12muF7ir7M35nFeX~@4z4-@+sZp@QUe2i(DzVwMgfX%{i9{AD5I`f0C9IP0( zt;8Ut_(U=cmTjE2;i#{#h|mY_3=8Ve2@)D5O3^1O_Bqd<$py_5pm z6)fim&gS4I=dI-s6xv8gH_(W1b|~5`Kcy?=Tt$dFxR(^7OIwXgUTfD6y=YcuK^k6n z9cVFf&f#%mF)_>(z{mb%P1Qe1KxEl1bi01}F;z9IR97mKUR?RjR4|7_s~;9RWuM4G zU1IBn)pSwNfs6I^CU8~B48r3o`XJ1$a}=WHNFyPiYzPiZtjrw{gL&jR2#y_oDG$L_1u4jAT(`iDqh{ z6q8=ja0Hg{;h7N2m`rgv$O8L3fKdlf(Idx}Yd_pf{9%P0FHTT+eRfTn&OHwMIa+B3Ej2DN5fnywA!`BqzqHDN~ zwt7EzgjZroyn#tFYYlG+0pVz90BJ{sEgd=LIsi->vKMi-3J``rL+X`~mcw9d_~Let z`#RJcKHf?0bB|}bZz*>G+!IyCnQJ4Gug}lDIkcXJs++QV%>yr|Uh(pLRpYNu-)W!N z`>ZYZl8xswmY(+E8VkqD3`gF|yGemFSEbP5%X%F^1u!u(@+JxcnkcoM82?ad; zWMXWf5VN0`5F_q-jnNtKImLeBdO_-y+{b31i>2+IQNwUYErJ8l0^3h?Z0^rm)0c~b z>N%%S%a?pnGLb;NAZ5zq*0lJC!!T6hZ>S%+fR}Rv(F^s1oWl zo6dH)mm5UNgr9`_tt>m7_s-J1y;gr2^db8I#QlR~6jhAR9fPINr>z)KjrjGnQYGD` zM)G*ee~3DtZ`IL*p}yaZHwD^VY+%2>T_>G>s>~s-@UPJ`JOpkbe~TTjF{T?6%C2)? zmEmTa+$pacq{^*2E30~2*1Y_h_14G8Ys#dVIVj&d&z7%WT+S`}J4&U7+vS$x=l_0v zkuFRt1o;V?ndC(uYCS%(Wl+gmbA;vagD^btuTckf%0R1BYj^?wMi54r0`3f%Io>bwmbMH;5QA zuhFh10bLe8M}+>QP|8>9fAZvzF~9zRod8!9!ia&O>9eJDbpR*>5qxu@fKaUZCxzO; zRF2R_3ZIL6PLyDz_i&|TK;(xiOF!upPL>JVgjG1%k>o}rh}60Tub&2H4e zyYj8~OJqMGK+#T@$L1);C5hnH&R>X6^ja&2L|oN&Ba%4tcT%VsJKL#3h#15Cc%k?V z`9yto;!Y=&Kf8-2g-xqD$v_u+7t=>)2hu1`y)vn8-jI697m^huG7yv?J4q$-x;4QT z8Q^HAzL>!qnB{4;R(8^o&?+$+* zBw_a%fw!1WvtF4N{wkjBr7EX1;b0&Gf+pDNkSZwxq_jvxK?+K!wL8Ry34(Ef2~6~f z7b3310i;TzDXG~WR}=0P&q_gc-4AlkW2vE^qOcCA-jJmAaMaESDQqe%@^w$)Iv}V$ zRNkVJs!PO$QBFt%Hbay zQ1EFOwFR&ZB%>k2@xx33CA=ja04FbE@B#ZZNkVN1Wb4jwNak>Qr|u`ysu#o6@w!79 zsiSSeBXS!lShqexegV@i;LRazI6B+E16#-iVKfzZnL@W14oB20wy-Ca?8T!CXrFWy z^8yeguQ8b9V6h*h%MHq53s6SrZkTb~G7-<&4HAY40|*FNDUqfgOXP~3X;0B#VX>yk zV;MF2xcDY*T9=ec;GWQ8Kp%_E18Et7j7ra zKCC2cgFi44k;Rmczx6!xfy##Tt~gHIXManbnyMCFXQBC4=>V^v4dIP4E-Xu(?<2>z zk={xY-Y7ogf)~j;5KB_2&D!`6+#zWW#0*!W3ke`$sruDa;&}-j_YYbGod4&T{$8ia z;E{?b64K)fVQ_;`a1&W^9SK4)<=LhYkyqv1O+^QDyvL9}q(@y8saZ0aAHBQ7ZF?n8 zK>7!GG@NHMHSs(<>XH~XenzcN_xHpXN5BmxNXT>^V|T{aD1wa7WIQ_O!B6}>JCoLJ z;Aj@{?LhWVx~WHuMEzoH!UXmd8BcRoA8tEEfR`kY0JHj!Z8L}W>UQ z6OX&{rBCbOAlG_6Jq|!%PaO&HXS!-C+#;6rZud@e#7{*6zGt#52Fp>cW3{0^eP)toZX0i(5_C;l8vLTE@!y)F$okD;_ zyadg!mK$ovRRYSC4G6>WssRvhTm1U9!ut2spAnsHna@;7YF7fzP#{|~6A{==r@otF7LWPPmiB6p_PWINMv*J0y%hU*7n(?btslT8rIa2z zDCcA^0ke$<^?O9Q7}?a)>VSn4J6M4a&jqqn8sqd zO;QujbTi*B$jeU(d+*f2N}Sc^nj*N8MC>7|)@g^1CWe>h>uhPHh9?)}FD<>NTxN!Z zv&EWlLs&f_jBK%No)6O*=?+0O`;bpM-8Nf@PFVOeT|L|S6-hWAk5$3f-YNQ+b-m-P zp%o3dgyLt+*B4}W9G6&bRHT4VwBadfjG2ggJNZnyI>H|6`1Y%V(h^r{^(eJh2uX>T z25EVIS2bM^B|&uu8qh|nrtG+*JRvqigW%LDvU@kKYz=of!Rkg!VJvb2B-!nT~RVk zuim5rr7JO&29@%ra8o{fJ`#8ertRUqVKrmbH9@~<#goKEWO%m~j(cS| zKsXv@FoJuP!@;SjnOJf0345<@q3zSN=CZMp)8*c8q1-` zDC85*{rUEQTmtU1#n;_}n?%PIkH6rQxA(mhD)9q!DI9Hp@T(lNKpK%I&yx}WsqI0$ z9mMJY{POEohS$!aL#9z1!JHz2!x~=aERa|^qj_p@&S(n~sh=?^=5?*S;jc0tzK!dt z{}@n`>RMS4AE3-A4{m0Gw4nUN0lBR!!fsqf?s2;>yu6U=SC3FhJbz`HNIWm+@C{hk zeQwVm0jQ4>%N+;1b@^AFjTzn*xehuJ@BEVKz~kFj6yZ3)Eild1-aYZ5rO7|n&o>O{ zDfYwb2^`(|eUSq&f(Z$?zU=|w#PPT$v+GqNXjvfWN|3WxVunz?-|8pc(2v?ao5QU% zsvmr=Z||(5Xnxz{4urVP;PK4GU#&}6uEW8vQsNS9jk<@kC*loGb*W!bCe@OB>(69< zg{All#WZ?(?0 z;318KI-z$GdhZ?7gx(1V2na}*-m9Pz2pyz@NHJ7tA|N0tBE1PnZ=!SrMWoy1@I3GT zyzg1(!&zsq`8;dZ%$GfDU-$32s>`hNNWoy z^!e`BI0R2iJC&(^^~uju%oqJ>`5CTdyzpc!j9jUo#t?06)Q;%E=zih=W?jaDDL{nA^=oHt*dAVHzQZAd%WFxs?)JMm1M;>Fr6Nu@-Xh7~btJnr2c zv%B%n_*wQ0VDoq9nN2=sU)K%VO3d*qE{~&S33g0W#Nl9Nu!pwvdf~BO#Ikr+=93XA zjW=f|;+)UED^XpxXeW^OJj(5!O@H~p>4+3lIY2RTu~V9eo|X?eo_k5-hxkS3rPkRU zx1*%Xq0i157w#XYm!GH>r%2Bz-$TW=yXa zUR!HZqEak@+=Tz4APD&@n&IQ#s=z3ABKO5^mLoDl5x(9($gO%q6Y}6(=c*)Xn-ew^6mg z&%Eb+tlsw5t@YME;-Qb1dT&lJ$H&Ns1}0zg66(HwslX#;a4xne9+G)3u&haFGO>EJ z{-c(~Zy`nZOVpimhns5xab--pG2VdSG(MTUp?x#kCqp9dm}Zp4&$;8?ArxZT-lwf+ zg1nZ)Q$5^QlP`_@TNxEZS|Th9bP$#q-0hv($l=tr3_j`tW(b0$-(R(#B~uv%uU@o% zo`j zX^4r)Lm_7KAcdr?H%JO2^dMe`wURBbHd9kS4{062fLkfhIX4PED~J$yaORU6hdHcN z#@s$^`6f_oRD3)}o`h&O*Yo3BWT0%C$OB^U1{7p?QAo>9DEH&L@IsoVXCJW!n|N~* z&<6!;*BAX8@T&}Rn@E#V^9l@(yAiSNK_)?5_k>&=pI;Rf<5>u#Sd1_9?L6s;qeNEX z`>{Q!3Mex)4dPQ7C&ok8&ti=IF~ zFOO#PT%$-;PWKK;{d#Q`-p`-_YY^1(quH)E5aDvZh;-#)LNV(B41MHNx@MeaM*8e# z>fBcEX7Z|hKGHwi4mpyTHj1SChEB4!M(5v?_2-`G&A2 z8y%1#;D!Zgp{3R&_8}>Xz-&W9T<9T49S~t=oYU$H*|BDe@XQx54(4}eF4ux5=%j>` zL`47WA_a*D@zvs6?5+15)jFjC)ecAcSKs6191wYaC$99;9YwQMWtwp(F-+r1(?{dY ziKmV_xSAyLnv>aH+671NxKAa9KzDmwQLowdb=`|d(*1ENC*fd7W-pIvOy$X{8LD6i z+u?}SP)k8S_S9crFHIg6>j$_p2801!Ay}t3I<>st`4+f>5bl6vlCzbR6G}GZ6U7*i z%$Q&9(C_hSUN?;3wBgCrVjOvN9*5(AcvT&!crcKuP2u|)=*uYCy|HABJ7hrNIwd=m zCR_>$V{(cnQ1?OLQY;9-JS(@soj%!RvTs%iLSh81CGlqyR&JS;@}cUK88Z~ZZpq`*pK`b7;N@Hd9z}MYN#jrv46K}GCk^9>KCV2qTzWI zPqP&=z8F$Nb}w-DvOdkGfND$bjz#HQn%z@kkry3prsXa0`v!`xj%WpdrH zScBY37AElxWJ9!@Fs~pnKt`!QFmuY*)E11HX{-*kRJ4mLQmFoz=^Wbn#;!6H)NxnK zNNosj&yWG?g;#0a=v2d)xvbHA=0sfDShHV{(V|*~ks%biz^Y21*FVR+)TmhU!l6oB z{#)t5M+##IE%f#5s22vkOa=fdT;KI{gFP2o92xly8t$CBB9A^8?xr>WfKr)6ImQ^! zLru`v4Tb!3rRF5GfQtU|Pq$bk%Y|IxS8BS2V~Rdw@&Q9r%$ayzQGTvGl&Rl}h%h-% zVI!C+U%b8kK>DoFLY8+^O_#KSlLSaIujwwG>j&LxGXTEEICNIpyPNe!+CO9|6E*n_ z7alrNJqxv|GyQQ4SIB_iRM{T?e*E-qIoN?rQZsR-{_~dZBpGbb8TtV2_qsP_yE44R z_`a8Xz4QJRvwAGVAscpi%#vU4J$geBWi^Dz>gI0*Ip$dhJ=*jSK1EPnhe$KxE}8++ z?BmYFX?K4*nYz!cJqwXR@6}0;DfO1k1N6|#4sq^y-v_KTf#7#^8-4^33uPKANJbP}0kk*An zL_^))=XCmZLBh~lR16?8z<~rJ$DWYSwFAa3XMvEl_AiUDz;~HFh1F^OeZ7ih3(?<ZBDl%QEj^^vQXW$j|OF=DAMmiNI6kz6rKrrWw^8Sc<8f^H!U~Z>{ z9f!T%Vb{OHS^~3-YwhZysK*Mk4q#Ia!b|DRZSA)Y7dgc^a3^4C3oJ~GV2;p0UG&@# zqiGRPrcG>dYaF~Gnl3!W65oUUZT;kZ$;%L1wVe_|W(?h8w6=om6# zhY+YXS*uihP4YeA(utH;DCr%yI=8m}KVyQxVAoJ7y6KlQHYR6W+smP=OkN?DsR$ zon`nhbjwz`Xv$&iq2v~pm1+@4LCvnyJuA(k(zR++6D$2$y%D--h6(XR^)8I!LaL}{ zUyfEf)@qavm?t-cET2zfzclXJDi?&mJkjc z%7>e=6N`3Ib6>yF-#bo%y%LWLsdSN-8RW__l9^DKl7_wHU=`1LVKJfEg$BOfeE zT`R&>J=M)5_(r|%2+IU$yT$HT#nz=jh>I}vxe>qVCaeT8VAnZ1nB!EDQ`*pV)j_)= z_PaV`@Hnq*gyJD!{A`mY}T+1zUN zPfFC~_50EPm$l%|kzg`URXUXH%7gT132m_*HpQrD>Y-v4o*fqR?VX$%%h}4<7}&)i z)=hg75TX@lsU?%s&00j@5$a*x>y96Hx;uB3mAI4GBVe|)>CLtw-USfvQCc*{nK!xL z8|b}*$gB?KFjc8cr4W>(`%)g!6Jw?aQNueQp#ap7i>;k*EQ>&;Hfp@Uf0y< zcOqZ)h+Wh}ZL#;_QdI5KP>kWOI(p!na6G8EC$FqD-~LVicVb44c|pwRou4-zh%D+Z zMgNfUa(mE4w;=4yw^QN^7SlcN5{?2%|MswidTLUAig0jL-zl3}6$GO-6~4+gqfD$ zDysAf)cTnk@)oGH8eXu8IO(Hy=Af9846_yWgL-|w9QCZta^PJZACXV4?`h1C4~-^r z1~+(V#M2?k&~TImal_aDGj0doaO(98}^WdHY?= z<`c*52GCk95qi>Z7LKLu;|-gLUljl1D>XVz1Fh~dShdr{6T!t*Z|7tNFpNHjBSgbd zUiPunMKfGh^XT(C#RhR>3k#s}nZD(Ly7&9SDdAX}zT!?Ntre!Pf#H*@uk?b0og>i8 zWlUmb5)H#D`#tLWoVvc|EPEL92FXyEDO*gx(;n9SCV;%i#Po;8`993_O_JXL(PBnw z_eW|!m4y-yIwWvi4VKW|vCt%SZ}s2@W+&Z`8x@9reD90Q?6Y^XQ>*BbPV;%{DKIVK z*SrfNyELF>c+Q`Q(i95^!P-~nrkK_^M$DpzRRxGHv!=1D@eM8Mzh?X9J-lG;RBbuZ z!tJYfgDKvRi0(EbD0Q*a-+O-B$BF*X{QDy16uN&mv*%o(!H2?s<4n{0p2Mbn?M7(7 z=n2o@Wq&9=wA$=Iadijda8Mn(2mfY6p1nb?;f&D98)>7w`d3nzMSaM={+_+zG)j|F z(9BdOWdA-p(eP~6PI9DTvGO((rLeQH4VXqawi$;nf1MQ9BpSO3MnhC|e zbyMydcaHW?ZQkt5n3vpW{KUU_u=Epvz067*hkd~McaJy%%dJED)S5IPY;K1zj^it^ zfpUL8b~(?4%jV;KPGL~6-Kp{Mth9i6w55i`F7GFLMM+|I#M5~c6ox%+uqosKMN@Zl zD_^_e;5lAGXT}KXLUqXglz$X7paHuRY*r*AcXnvqB7lDBt9Bx5%+%a_FNFhyx{gP3 zE#q*5y%;_@f*s90o{%S(TKIM3isWD$Wxj%u(+K*rvXXA?r}EL3dYTX9^^f{w56-ndKQ9@*5z;x`F_=(zd7m)oq$08>RQXLMl*9(e}%pu z*0rgbZjOL=S#_iY&;2<( z9{MeCKDFi->&PeHRQmSgD-$9EePKBBv%LJUeA&1kLoR(KxFP*>Pv4y9CPUp)-@z1O zvk)N=3=iUBX?Y`7%YlzEIa^{KBABWK^PejUJaIGm{lxjDClCOBi3nxVIy!F?bG^o< zQl)bpT(91;ES(y4E8{noL*q?INlnD6nR)LJw}xyVM4ls7F}(L?^X$RqMZijmu?o+I7oVp%rvbj(r z4^v?nh}g8!bm_%5UbZ1=m~?fjR^Pb=?C*rVF(W}##L|^Wf33xmcb=k_Bt2OHZ`Iq? zFZ_?L;Kfybi|MXC#*7@b%I?bmaVs1w`8?$j^`W(!_U2XUEJ4;OM#e~DRNmYQNs&twe! zDsVA$+nAR7uIrt6uxw34$QtD%3C){vvt427MW2aDvx?;khUEHV9xY=PF}uwxC0mh^ zf8W_WzXf}FyS{mx&F68Oes+pP%=mN4`l}K_!mMf|iDFy;S9ml`S?%J0t)C@`s+pi! zKH5x>NxAtnT!r2=uXTcF3_X4E!!Kvu%rf+#wbS$Qx#)sRq3LUMoOe=T_-KR(XMh0R z$DzDFM?Y15Lb;BUOH}%Yv!ITov&ulwIotq?L&Q(L!s!GH;y)>6HJSI(pmOYY6;*vq1q3nc1 zs!pDcc;VhviZ|e9ZJHn|pFx_)R38OZ*W%nc8=qH<^R^+68BNZQC>u>04S?!&& zCFRGLdimR2oaYwwMa4h&I%&w1 ze5+V--oB}odVy?%RY4A-kt*2m9G>j9O+83W7k`wF+S3dUj@Ya&$L5L57vga^y<`9)O> z<4m6L7{L;s7}i^bNo~WGA_b*fJG3P_Qq zGKIJP*2SN9E6 zk^k-MfoD{4?g@+qX}b|2StMP2kor4(21am()WOt} ztEP2N;Ro9d-H~UFU5tFU-K{5|)42iPBh>G3)jn(m#b3E0*iRY=#vF%3=Hd!-CpLVDKv zVZ(>u+xLDZu*YbWMXk zE;;^%h8uD)x)i^WTNHbCH0=3zI*lK?gVl;KQi*pf%wNn*t}`;7o5EMaXQTq;1U46l-F7p2{@@|q=nVgj zFQ2T!T1h6Os7DNxjGELvCT~uIF%gl~Vqg6mv2A?-I^_-P-a%vMfUHx&$QywH_x>D( zBdYM7hf=CcvoVGih0vxA3&-AE3D4a60%|kE4UFa39j0)r#Su=1Uk`iQHaV7Bmb(Ua z?q9;IqtY>tG&XIRG~Cy5w`;t-X{E2nv+zhVS@hr44Tx7=ATZocBWK|bQn{=zl2vu+ z?v$U@6xYQo5gVdwpEg`3!%~KVlTC`Ix-O4MxK%d&VRl~>75FyN^6HRtO3@rs^F~jf zegMlJrBQ~wF15v;p$rp*pYu@Y3;6KVyzlcVPe|=>2fKm=8U@S(R(aY0coqJp1 zfHRA-2>aKI=!XL5f^F{EQ33lpwO6Aumvjobnx*^4IDcMdRT?B@7?mz5TRXWmumagRE)n|9pni^G-*!g1mwZj$UvlX-2zZ}O4}sl1F< zGH`_lgShb}0cQPP?RRY$^;&Dyu!ZUm&rW-(5p>X@M~_hSPclkU(jdxq+h&%{h7Ck68`*JQ8?39M6G8%<-cX$+N$A(Ky>_w;T4WhVjd z>~8AkWgL)7%shM_nE%?=kpD&m?!jb|LUA~Hr_BOgHknMIb@3K@>Cb|czQ#lk4ZM6z4kg=o6 zHShQL`|yoB?)H*=x7tfs`>y;V2)#CXn_l{3_r~2{Z&S1f@evZ$WOtZUHd(51Tfe_< zm3;Y21CZH`d>!)JrJEq*2Ec38WV{(*(Ft&nD_9Z_QOtnE@j_Gqs0JR&-UHH^fSNQy zt^lxW2MXuWX|Th`&>ML8&5Yl34IaJ#`SUgStTB1O1bG<#%N;x-Ap;RHfk+3C*?44r z2C{Gh`4FHe$5TAYps1Umcmhy91t{+N4<=4fz6Pjz@l=BuRBtAz-U8Iqcem_U z<{9t}Jk7@pn$Ht7gPy;ZcT&$XXn#%6o&x~H6d=z8C?^406pG#y#hi&^pG0wI0<1jn zufV)OCf)7?O!9EVJ(U=FONV~&32^{Q)1CYt>bV2wVKk67KsbeDMYFHs zTm``F#u9A$T~zBha<`jk8En<4qjwe-s^7qFiD8S5_U!bXdEr;3Ny~)t^XM^}J-=VY z9~_VN_vHyBBX)X{-M+cg=jqv({;g^f{VDa#U6RW<8oe;N3+DmfnM7-nU=-^VZfNRu zNiLpMxY`@$IB721Xf&c3Dud#reapE)_^H`L4edeeJFuH!z;N|?&=kK29WQ;e!qN`y z=qik99S&drsh@_Ah-n2dXc$O*lsP^+kT}ee{52(cPA7E^xhh4TEk!vk zMN2PDe^r_}Tbg}ZT3qT^^uDxUwoJkxrpTC0^my*fO!g@aMm76^6207`;jb?~x@yvs zF4Ie=AMxnWFXE@=HL}qPX7%e$VaqZP{HH(V>5!(@`g*q6sC(#EU<%H%V&=z|4zgU1 zvds6pFmsx2@${h&$Um+Vkj9eBB?FB5Zflm~SP1z++E0z0*KHGq9e&u9dufx-c-fu?VLGga86C`&+_-_fYW}(@RZgqab zz7ybMZx*@l;OQHUjCVlzIv`F~1-`iPDVqJ2iw^f6gwe=xO?+iJXUb9fDtpa}=31@n z73d7}BckFiwHEz}WezRxJ6iO!Ze{Bkxvb-ksiq0F+7l1BD)wYb;fqU%mE^As z3GeW?ab*~!{eZTszG7X&>F*r-DTeKgX*;0Rjv-fpg^^^8+D@J}B}+aV-50Jn-V$KE zCO2EDG>h-fso&3fdoRd*<;creUd(FJ$CA;a)Xd^~$Y0%7{>#~+0*AUz`a4+pc|Jx- zWyYle4CfRfEk>SJD~8r!*NTu+f57`X(!8sutE-oy6}#xm+c+Uc|W zAdlIwSfmG#zfjSYmk9ETlaK+?*a|I%qYDl~c2@ow2bH z6srY{%Xc|NFqY5CjiABK?^>(2Ph62@zuYXZEaX^D5Ey%Sxt7rG_WG{3<4@f;$Vrpl z2Q#J*8G$+{4+}=jV1-A@Bb(1zo-1bZ51B;Ab$zNr^&2e=T4pf~bKyOqUgvnck?yrX z9HmeTp}NX-nQpIRX3i7F*^Cn+OE$*Kn(SVEppqwb{wI&Yhso`RyT8wdeFD^<@>v!1 z*$CaWD;(DXl(Pc1CXN(leWV|+(Cp;V5rUGfO9BF$_Ps z{hnFcBF$+2+fx<`$14UCJ7LG;)40}Wp1pJ4>^xSm1#|N7r&g^J7^)!d?|N&g64~)- z3y7G^%^_W8%WgMI#f7`&$UD@uDEfzD!J6qeX*56{0Bku2luf1?& z_?ZuOyibY}jraN_L~nJ?n=IjvSwdv{5BHnFH~WctyX@My*xq%H>(}l6MJB`l4`gz}<4&0uvHTxrGBDI9;jvF*li$4}zjHhPoQi;`m`5$mD;7$(m<5Se~4&)w~O2vZ5}pt}pN9SpL)T`y+e*aVBe9|F<(a zS#mp+G`dpe=}?xFU0z;MUe{F7^`@eCwzB9!Lqg(1~TSgcEBTV*=K2xK3=3#dsOg`_Md-1yW#n`(S%X=@j_FrDCne~^8YySw7 z7rbQe)~mjk7s%v4ykvDn&jl|z+}X4Isdx0tKfL6te|gE#slL(wwk5y*w=Fr;@N#76 zUtY3r_#a{Nzj(Ec1Qw?2Q|-TVAy@5==*dHm({*99-R z|Ks#)*VF&uB~LD9cvnw<|M~WL^4rmu@0+U^$mFk?H@{Af|LpJmIa>eo`}FUhz5jn? z@`9KAh%6HH`~To2n_Y&27`ICI+K+5;*;39U|HDhNqAE!S8{?(Hvty)*2vJy>p$fiQ z6jy88YCdAV+hs76!Bt;tF`?!qWZ}A{*H*vy)P1_v?u}*n+gSULe~Lc3u3m&0ptW>- z)$Y?l_U4m+%Jdt%Op)0Xq4EcBW*-N`@;qcDvr)c2vR)tlK|UxHgtC@-yvRjJKbhWx59V>okOJZ zZrj~1^dAtuS!e{>SStwM-d!oawL~;y;iLASAnQ2w*eRVnOma6A@{pz_%g`3tt;n&w z;3dJ*{(WUdp-Tm2CHGD~mgnbric}WZWLj0%w|%NjEZ09*$smJkicEkh861EH3UPGC z<70QvS#NOWH8W*K-0`PoUYn~Nn(w;?D5`HwF=yVuk3*{Kk6l)M;GGnFFqEd$g@K78 zV$`9iQF=1S{n;J z1SyCJp%sux7oBGG64R8MPvgCv$JqXAPv*O+L%3BT{Wjkov%ynj|QSl@BL@I(D&_h3I;@PK4F`@|sXU z_RG-z025vrUL?2FfS(i=?|=S&5a14&_Cg!h`0H)y{+3-mEHV4tlh%ZewdoTrdBy}1 zw)-)1?Sl-cf$Kg2%&<>5T`&4JE=_eWAQe*y(UTVdU-?gW z^Nbhv4UqI;K$cR3RX<`lI=~Hjtks;uu^=3Z1bPrzTB(rGn}q(HfZxMtMYY!>#(GVW zHH+8`C0e^-sdzhc1Q``jZ-kUec6VW9oOWl-CArYMi0N^#I+UC@9o`ErPvi_sq`M@x zpB_zBfhN}*y26E1_UbFY;3aj_@wys_ZYo8IK57a(U37Mb3$Nnv@Fjja!OvDYPBP{h zc$+wOlf4R&Ye|pFhwcefdk>jf>AkTjsYZYNP9qxnD3eZrFOOz&Q#m;kd7bU}{;z<3 ze%o%t_zHDQ4GX2<_F)rG$5(WEAKsMMQxa6oBURgF?2>nu8__{muw(ehM#7QW^#MJP zFFsM6R3lHFM5mFD&vm~bcH*&o9|2d=7zS=86mr2!y6I^th|0Vrc>8d@P32SXz%zJV z`m7qS2VJVo=KhD5ZCQy-vy7#aDlX*&Q8tzA z2kR$~u&!^o6xXLoY^T-UrSWDpgqbRp(;EE$i9dyO9Je$kL9;H-!F@c<5I zds3J?a@O{geqtr!!e}CA-b3g6_}+~48jCPQm#DM(M~`9FBND&AB8Q9n2sW>1Bz@UbeSLfDlC;41E78)T2HS~-SvgRJ}QgZdT*zy$+xRO?i3RDG=D_Y>|p8m@9* zSN7(;EF&AWM(O6zJ9LN$Qu{!lmQIftSa67c@LJ6oa^uJOn5NrT)eNx=$}i!E@zFYl+a)W=xr38>aEf1ci@#FGA2JL z_?n&?w;66Od$`^2MVHMX9u|&y6;eUG!KQi5&p5L~+aUws2<;Z!y1R@l4~vH${j>Q? zS$^dZTD6I%Myse)x$k9-d*k1Nrq=ESH^!15`zILJX2$Efo2@9_7E)(0Msdsa<+C7t zgO}H6Lib42Y6KmHPYxtcUXDjc`-wl?8G1qweyy0EcPW{4p^*1ze{CqZ2KRBv$j7Hf zp&_4bQVjR~xUlQ|YDs;F_mn{iGdV3Aq>Q%7?@zLlH+v-4pR0sV#NQ=*B^HvXIr*%i z!1v%fr>VPv!qjST!!sDy7YD`Hm~KdVK8y>hsA_E{h<3WDJS@YL^BsVY_M@?!;K7#R z_o#bF(yzVKyqDGjO^HgQ&Q!;sUcrS!a%C%fn!AZ$zJ|5X@4mM_r7uvav2-K)KSP;Q zSQ0m2bP2=f-RQfCe;CRR5Fx)8Bny2t7^WIn!-ILLs|JU8(CHaUEhR@3nY|2EQnVkk ztIH{N{dKAa4(J)R>FNH&*6IX^p znYHc_qAqWdYBUzRC9`JV^3pgTz@1ma2NLcK%>yIf5aWV$3j_26c|e6ciZ=m{SEOy8 z0}K>tr6#ynm}t}-B8%7Dk2By}7@FTaRr)kVnKwMZ8hGIEf^uI3&M10Vjk3 z*O*ax{z34j%dXw#2!ai>sXFrxpqdEixCgm(+iy+KNGZV7GGdD|Z+c8n2nx|<!OUj7JhGXL(O+?noXek2KPuVL1-)PR6Zk3SH+HO-yyT7P6JeJZMU5b0n$o1!e7=&n zL!#qG+Ed|~%!GDS&PPO}VkEkqLr;ko&2+^?iuO-C5R4B3npC*g{K1$jg=;id!;(fz zlPd);f7#)qAoF4gh=yRu)w)thnM8y#a4ZOLUobHgxTeLP+&@j(b&< zk&MyAh4@*uZIGoD&WO7l6e zn1~v3;4sW(v~R-iKmziI=~om|6Fg7>lS!L-G#vBEEZx+qFw+_b$~J%GTRv6pVEo$< zfF4foey+##30-)3IO@0b-8f}nPR@v`8&=I|DhNZID*?X{Spk!Uh{=MIL!XXD2p>x7 zGm>tRMEN2*RnXD6T#90Tm*P)sajG;`RT6$pm`-q*=?hTsu_kjIm&02C_(rpCOOqgk zTrlP~99ISocsO?GlMeEKxXUq1qCCw@MPo`Krg~rHN(YEwcoOi~x|9`D5ynDuDwOmK z#XS265bQ5|n+QarfofNdceAE4HLMc)bXQbpx!LG)t>`=g8MMs=bOH_O{jJ?^Rq>Tp zflI5z^O#hv)5kt?xA_;bIZ~<@(3=nE@ZbVCexkG-a(FScFjMl)M5zR=3P~_6)44~i z=|Ns#ZY6(rIX8wj*QzjrEmN_(dfOxR(#57|tISD{PRoHKRK(}_;5Iz7Cb{o^F_d;^ zqUP!ZB;$qUuwLq~#-FV&%OgF0mY~*^NS);8Ht+N>t}1WKQM$V(VW+zF6GzP| zd?c{+am>A#8gBnbwNY`lNQdhh3V_goHGP%s$fxUX9@y6G-cU~lBS}HzWKZHJvc2sl3Yd?LseRi)$+3ksPuSh zc&Xb@$FhcX_q~IsS5%?p50YzYi9xduj=LTp4?s8(Ac*oAW#luzx@sK7v(+DM@TO-C zyUp>ew8dwwRMwV_Dzt8t&8ooTu=X~oBufH&iDeByRrlCA9=zu^*@2) zy62-45st7r)r^;g-)Q*X@JvPEk=TsSwf5IvG9f_}@9`Zpxb_F82ZnjU&}>R{_d(-TvDR(UCnuMLi-NJz~o} z!oNXMzd;9Zu1(Z zs293DpoE)yCbc{RDN@KgYRLP*kejXNwPoPRD&-{mVDdQ?N`(#KfE~Cf&AlTA#C--j z52)U@4TYWLq_$8?oKn7SL^z2JXYM8Bb^x9NzA}@P6!pX80#ws4fgu?hX9BCU;mDm- zWTpSeP~8Y`ch1|shYi1N3{(JSg&;UY{Aut&bSg5-djwhPrhMJ!05sTJ6gN}^Y-W$4 znur?{RAavfbBbK0=@MR`UPl)n<0&fhobMOW?5NRwT^|3N zNx<>P{8gKP+D*W3PaujXXryVrRZP%4W^MR6L3e4gNHc@s_N4wUu$(%{A&#nCea-o2 zqMu`m&u&WK_LNZZl*p?ovG-FFf2O3wC%f3EInKrXWR0ekil7)r{f$8RI`QuBX%ZOLR>|etO}xV6rB*$;>BmR5X<<`vCWZ9G3yYADLvtErXvX@IH5LnzVYgmYpp3=#v z>bK$qO|0E2dtv}lTD|Z8n7~ARhkH>z*VU%e96BY45VCRnYw>#SM4wYYkAVP|n{aHa zoW;k@QTao`f5P}5@HWNX`a zL;a_9fstc0{yE>UMgO07JzYzzDBBv)UC23V2Ht`~EzAkByxm@q8ZaBAK@m2)hY@QZ zu5$j%OWLiR-Cp@#e8Eeu{C;e_6+QchbJgTeU+eci_+{WFlIOm|D%JQZn8u79SflGC zgEZYemxh2#!6ImYP6AN=vAP>fqk~<89FlCpLx7&+r@X&4YSVWzaiAHA$o^K54#Q_tc#3~ z(?M3~QA}X60hvZ&SkhRN*q-dX9rY-ug3$s8ylLj(;VR6kgEWZJ&U6`UjyZr=| zFPmDW?&ilX8CR*#qaXIhKkSCfex`5bPp9-AGE{COFich{3fm(h9 zv%w;W_!KMj#YoA%6%pX|pE(9moi;EVft<+i0u54RHy-CVXF#kRfE)LzD|BCylIW=Y zP~$=dq(f@L`FC)4ERRqC1aA8IEr#0c1CJ;MLcx7v(+KDBhwP2-3$0d=PafWs14{f4 zj~kI)(UgQ}O5QHP^VzVG?pA zPjoO;(-Ze@E-k-jjPWic-d}gDm@v+s(TG(bgOHoFbT)0 zQ836&Z&L|zX^a(yRHN$)w7IMT5jm?>gm&X`NUl%G)fl{waiz`dCyRRPR^P3qe|Sm9 zn=uUTH%sK3JZ5b!k;{yBJc*}d@?)kqqiAw|bDn&9MdbCHA0^Q$%BQm*9o zxo>`}-Ep*n5_x-SPu)`z_&@zBYKe$bi_0w2O3KO?bz5LuaFn#{()D^Qql1&Ji4`*Ec`++!JOSC!_Lh8Cf7ViPaQh^yNwCyu!KV3*`u~4 zq128;#gv^L*K1SpwR3vJoo`r87rVFnljG zLSt^l9#l*<7XWqmPc75q1Sz=ylgmCT#-*2y_};v}63cN|k2TOd475tDj3Amx^a)5`4}v20@G}M z=)Ry>nvFvvJ z@4G@%nRN-{!=bfKoXxs#&9|-Tx`Xxq7jgF;&sO;G4?iR!f;RTn*jqzwS|qV!mfBmb z(xRx@CK1Gr(bis7TWeFRLF`eK8l`5@rIfaG%VjUJm+=J>zwPl zKJO0=W0{9hp5X>+RgUUg9(jWyX_!#b%79Vm7335(V!3S!zXdy#sd*~y7G8PX^^v0m zj)66@m}}SN)(+`waTUlUF5Ldk=K0dGhM`~IEkYFAfKp!GK*7-U>yz!D3;Ex)*W4}+ z9wOZZtp%^ViabGNT+gXD7Lp-_cGf0I3xL86fJ;sIp zoWjSJ$iPPoR-4y%UOI>hWtzLW+n^?pO20PivnQMm`uM`&_3I0s*<;|9o9hJi>o*C= z8rsQYY>J<0sJ2MEGu%4_vsU>{pfc8;2LD-$R=^fPybRGnH;*6Ixq$|So=M(#jK8jR zz;eKEa5&0Vd~ao^&F&-szks7}T@ZMhT}}RBcWy{6eGX z04JAqZn4q{&%by51f7dI5G5Uc9=JY|n+T};R!9bThFyuYAn%q@$~T_h1RkZMR&oca zQ=nV=zJ<};kq<#pvqI{l3~~ahY)ThI@l(cb!3Wi&=~JFw53I$N4?qv*c#ecuqMzzuHyURwF+sV7 z!ZVnpp&GY_M=gp^P~>?cZvSRLYrX-Sc%)_q=&qoB5O+M*XXyF7LP3-!y?*VU0gfs3 z33wT+qz&ywRR&d*?0D${<{7yC`-S1;3B!;ZB);>)=%@iNx4A`;&u51stb7p7;FW>m za#n=X5>fLckHjS!D9-zPPpi3_vtbGppuPFX#?;F6S(KMnWa$=Y@rpr%Z|Kv@z+tAG zNY%dgfelxdw;lB=X*qgI6D2V_PPTcxw>6;Ra2TEiF*DdmX9OzOy=AUiHijcwQ{n$W z46HuQHPdArp^ZTwt;gN$Gxnd|wsoF<&RWnrT%4xGaAd8-giG+TW9NCj<>&BseAcLX zn4T zdL>JXy4cy}alJ&EG!@eU*W~+RQ>m8iAL&&Gio8h*4{qGAWzf+)n%6=ffgVi9@s4)t znpvfAv-=vg<5w2FyG8nyM%;c{@& znbMiaXhcX(x4)AVy{VwBuWoptFjx}1K_@_}zm+bsRs8*DEJOEfeSn8D*$E$8IJKTr zX|<*52*RQ(X2x8++r)Nxbwx-dcMo%4i}uRXDEKuEM+I)XzO~Jm@(X^~Uwyf@SaO-3_n2f* zu9L)(x9X;U;S%wwdeLs=jE98B&nn9JPrTsb&>Sdl=#Ta5*OBK)gz3O98`8=_TPnPt zLA{&2{C*+KrWAL9qRzYnavQhl-hBOyO z*v!S}is89r;+E7H0tlMYLv{5Y1n= zD_6_8mDbwlK9|7rZ@o=oCteb9qxtEW91+z^a0Apzcj~CoFrTK0ECHC80Ca9xDJ2{a zNxGNie69~G5r8LcLltxBNs$AijOjG|CE6aiYijgVvIP%^2K~n;$!0p>EWf84nu&La z>7%+@b_Gcn3KN?Pk~r8P2&pz*3$}E_eu7~i9^3z1<~a|BQ>!r9#Es^vWS`w@T|ol( zbrMmXx12DF;|qF;Q$sF^5LcztNRl<(zY1CxP4|ABS*~HP`ZSh*pMWU-Grg#IZVP+zVRHY6|67_q87RK#?RJS;TVy+c#Ej zH$Z~!KJdo27BMf8Q~D`R2Rn*Tudmj{?Z@#Sc3}Hy0cQ^{dDdq55{Qr?ydk)`Q5~YL zmlgy8NuqoGhFbv%-R^?OZ$qs!SciH&DqSbv@-}z#A@<@awmYw*4wie9mzc(X!IPbs zT}Xei5!uN~WR-+$=Ox_?;$$C8p613ajSc?$#Yh<>vE+{7Bj`3hbw`f&MK(5BiV!FG z3^0lbJ#M^n{RW9M1i9s|+WzE&yF~HaN7}3C)^X)TN#H1%#NOB(2_I#b1jeOyN2(z+ z)DTA5dXKEdIf+Kkmr6-_i78qDI^RlGor$!XI_>7-a}A6GPSc4V>ko!xuoExBh%fm? zagt?uz87#hKp&bUzrtj*eNbKm&Tj&BwoE2i^@STfGP+JgVNr=e<92Mh+@lG4g~@^C z2FyEMwOB2QJo+o6EU}_Q>ZO*xH6{`Kd`f$a_S%vp>M%`Vr(l#|x$GRvz--d&w!E;Yt=veoqS8t2ly7#~!3>M91MI`9#f zq@UrrX?)os%_l}nvLli3TDN^!VxHQamP|g8{&%g(I(FxKCyAHho|XDt!Q~PY*ofAR z3Avc*@8oG5KyDy7&I!Zlt%zY|7G+^2ehjGOf=%8DmN^L!&+LIN@&*l;_^z4~b`TJt|f+fLLrVy>{8G~Mvrrbx}FAPaZ8G#L!ZFbN;cO1Lj zqDR0ao=mtH0&x+|>j^f@*Z@soa;hevlB1SH+8m#56}M59&g+-qkqZ}5~q}UO1bLJk`eKs*rqX@qgv4a)GdF>|fa>-10C%4sx$h z_PYfP#?C*7zc$Xstt^!-VO5t%%h0sCbR|}oC8@2RWBITk(b<>Iy@=s*C(g9-`oiSY zRgyh!)Ow5N!sH)js$qQT7bvNd@ay%<8&`QqWTJb7O?~N0Of|yvsZs`_LT7Yngqbkf zn|yT%^KKLhkRnv4^?=l09CohMLK^i$iP>plD5jT^LMjRZluwRVjV6=f70IU&j#NDN zGM=1g`^7mPE^TCIk7EJdXnFJaFSBC=?OB0KoTti$9sRig3EOP0x3f`X?5nj~BS!cC zrQv1%Tc^e7h?5j=j?X<7fZRg^AUPwM6(jtBgjqhwX75rHBWn@^VMh*PZtoJn)czj3 z+y(<}RlL*Epufbf6BULak#Ntd&z0}X(qD{l`+W&veTv^-1<4S{MIaW2dbe?Q8KiZ3 zF#;afZ6TSvVvMViBR-?J){VBEu<^6CG^3>}9i7LZRg54FExH1c!K=6J~onisT!kzlU=`C)fhbqqa*Tj_53I;nbkNc^yryq}k+ z09{^EyuSbx#Lgy5}>0xjG1H&9xvkyjQ%=an-S?qSbqaR%;3>#8^WRI zwQ0Rw9Q)FxMGFn;rheBQOHaBPc6UpTX)&aUgL zagb-YQ0|HrEW9|#MlVM$CO2`W$P=IR>NItv#=DC((>CcJ)S}k6ymqHKVrPrI+ved{ zn~Nh=I#fve-A2EDCI%q@R5K(ml62f-#->8pvy%hqCFX9XD(CU|;tOwgXk<>{X6$Ya zfJ^SrM5-l}4r@&$t$7B^JT-&b7biYz!}B1#8>$;N?KoccHtb<9G|R6vwD0R=(HZMh zT%8xr7+l@*wbx@vfx_Dxjg_;eH?W-2Ru`b3X&9(}#R89qMGprzEJcZ@h`=KGKCS~0 z*Sn3E#-H~cKM$w3B|LI6^>tC{->xBpWDXsLa^pzvq0wS!;mj>Yln zI=8ixI$w%_UY~(UByhup)b)e+aRs}soS;okwo=k{zS#xJM6s@+# zZG0_WZX<3%lnB{?_W3D51tBlz4I6bpQW-l({VWWUQk+3`zDtIj+~C@vxbJWF4>%xk zc|g$2NvudN(}7mUjj_1cz0eB>OYCg!hd6~0$i;BT4b4QyYS!Y~Uxxb{3v zE;_gmIgNC~I?Q7;rEmpBNgnRssWPALWCUd=j1Y39j51rna!wp8H|C@&QCy0-$ZD(+ zeX^8I5Oex?89Tq{yPpuBAKlj;iXlpmgyd}O1W0NJ9Pd8x*%j0?2M5{yAYjugW}n!} zgccC9SbY=jmO6%0q4%ne9%VAHoD_^!SmTyv+t)zsTtvCUpK$vD>>UR@H>!ID%NfKK zuZ=Z#ZfGDzNZbo62pZ5K6Ze%cwM*Y6yo2y(lb&lGrn@`*#xxXK-qAOV>O0B`=ESkn zhk0C(OQohr48;66A#xw+6M zL|^v>xo}_ojTb?KbjV{bwcLBiK^i*!n(4Rb>nrByQKuVVjaMsEqBm9HlSkk8d$?Ta z*<42F12-d~PSgQpwdZF4W7@SXWNxtg1zq71u>>ip?Pmn?g(*wBnx=_yrR$yf5}-|? z$I!i`FZJx3;>2SO^&YK)G8FNpJ|OV}xNIyE?wsXRJ$`wBPd0F(HSn*-k54As(#%S6 zLyW3+kEgS@a)wfC0vbH@s>58I35sXm*avJutON(8cc;?>hNj^G93}3-Q({)mj+-~x zgpA-PC01kzjZ4(BeZ(ecl}K=4Jmc75z+_K7S-E*UGmvTWs!+tpOmOaGS*uJ+)xmF- zJ<~wer58KL6gA1lN4&h??Pyb(dg4wR=h&H%Jyr^}M>8_lSZ49cNm$(-Ri342xdbg+ zc`P`qQN{B#&M8UNJ(wYf)3H+@N-vbigvS&rFMJn|!Sr@`J6cWl`syCC3a|N0CJ7NC9t?YRLfoZ;ZsN>0y zRg=Bb&K(o|8R>Xa#P}(TAJmd%(xhXcVp1#G7hP>~T|7KJlaYnuDB1U7p456=Q3}0& zWp++FclnW0hN~`&UEbXzy-Oa$Rud^8cI->L-W_FC>thqnA7Ww_?Xl2M0a3h3-}2+1 zl6iT!@3;Mmj(e5}ym;UKc$_&b>a&w((|qefB?Aa>s`dOEpP`W0p!8q9%8=lr!5p-z&MB zESDwJsRjCQ*|5dyHs<}5e(yu(l~Yz}cNuI04;=fxhYrdcZ3nIJ>IFy*-P>%naer#z z{Q4Eay);k1x__m)PE1qv^(`e1LE-t*ekV^3$?8;)euXTB52NZR_0(2`FusbsW|E-y zu>499u;I$hoB{L|(cY6+wbfQg8_SFTeusIL6o+*f}vM2l`QB)D;IbrDF@GOTPy*_hyX)<{AaQ>cJ$J{(luOW~IC)rWdlD9t~t zP+Xe>(Z8x1C|W9GDateC+6b>9eHXnwfr2$d#2G)o_~07S0=&dISKWeRj$Q$}Mt{7i zN+62G+>U}XkNxc6a2VB#ch_Y`XC-%S)(0PMR|=xJ*7y)_w}Nr_A&r_h_LQk zh#EPPLnz^R^+0CfyO_7g+6?Pfl`wiVzy4DRmN(P z0GaWdX)vVZFylNeny!X*MiR*8?hoQwhvk_Te#=TNolO9EMdmQi7*>Ds(eJPDS@MlNk)=BgHuIda_#HyFjOp597irX@%W~ z)bC?quim%Xj8|B>&LojMoT~EG2ECcxk@t7IA~a+TR2?09lCsm^! z!#-Q4{oV95a+pXom43?B^4YW+rosguI{}17=M5QQ zhc}?*-`kA8Fi84+QU{Gf3w2&Uv2CuNn>Y#g(uN*Tk=&(M&g)|gIz)u-vfu$iIzLPP zhWUk0o&Qw@{VZE=aF00C$k4=QYvI1|xfhK%TlCphSbjb*QAr~8+T3`&%QlnN8!n)q zzJX)ge3CnYnk%{~UXxdJ@c=bV)5rZh z&(&DS;`uo~uwz1Ap0i=egJ=&iIW&m>S&}Fd)%iwf&8`Ej9k60i+0SY5W8U08CsMxQ zrr<5~0`2c3be6(WZG^*^oS0%sI(&-LEyZn&nDLUUoK8Hkb-_G6pu)@n{&IjauHOGf z+&b7fyo!Wax0bVDc@j9DyGd5}tJAMI{NmDo=8cDe-5VRZf9wR;YBD_0|Ckpz{Fi6o zX44ob%facfFP=Rf1`wXRS{v5lm`ao+G{0Z7ikj$faXi4J(fuxSYt7UutjKlU|3H zMGy%3oC-QdQoK)ibdo`PS6-k)>?8d;m)J~u zLU1|7*a@uLzOo%Z&JBycA7WJexi?Q~Sw9@4%I($oK;Az}`_J}e>X`_LXCUG{)vTNL z^EKl?p#np7P^lG$qDH=?+`5h|9RIUmqB?VlYNMx$MfIL<#mc>uFSpT+K?A!c@+c)M z6=NU|IJNB(L&BsQoTA3Qq0YV$Tfx`dP~hVFqANlLjf-wHu59`44czOo zM)T|+?cM@_ZlOcVW#!+>wvduQo@=YC>a$upv)w%g0?8D9@lwgGBtENt>O4sEoZ|`I z(jwDp%@8zNY4`~q?pi25S%Rk40IO4+h8B{q5vaLABPuB@+S)HMFsOKqR_%UynDxe$ zE{ZZ7tuYy=QApjsLPlL}r)k;;`Nw$jA%Mtz5jDj@%|lv2#1nmtC!gIDTezpf3ZoRA zCv#DG?+ePkv7)FiXjeH3M*x{#r=)V>?YC+iV=qWvW%b9hN5)b4P%qd7maO-{j71-s^If%j!HI{w&92!f%=Df3z3{4g_kA9{-(~tz z$!+hY{pDsRjRb~C!Y!l(EhP~xC0_S;-TmWKsIm7$_bM~rsxW-jgMSiOy8T?DMArM8 zy+snHe=6DgKpY9I=XI4ey4CvRy{t6%LDLN7{Q|b}mDo3n;d2g{gQ~N@)L~fy-!59V z^GO(NKHmEAaA}Dt%*5^^NWInM^BOvxNk9GM$?)XEYPU-L`J3UB-T}X=ZCexMchF%% zREpvxDjUj z^iqmcKAOc~%H`2XEABZ7`$({BY=~8q{Ju$J71||dHAc!vzA7fcnk5i?^PoKOheScv zUO}>O8C238F(5DJmq)?>T0lQ{CL**xJijeL+VV&Bzm3RekO_Qz80b*#A%$`BZ!UgZ zGh6;BS;|<&zHWN3ZjSKNrs}f%C&2KB$nSPltGQ*uGTrTU-SRojoYimP1m#0&LDg+v zX%{IOGnpQTTd~c~G3kEgp`SXY(VfkkVHaLq`A{%_RCQ$esawCEVipiFT$h9AEmQkc zm7Li(mv5-^xh>eQLq4w-TK}?-*K3&9ICfw9Mx{AZk%?Np4OVvOP5son&%*)!1+=@- zvc%ynnQHyA);`eG4e*bfZ!$M;F^W}=iOVfj$i}W^)wkEbG9KiS<*(_Yk89WW+p1r@ zFSo>+G!)_=VE^V-bH&fl07ifG>^0v=zc1fo%7XptOw{(qt~H$1OD)vewhs^{yBMYt z8a6J-Z_W)Z9n`nved#R^Jk|Tu$J)>$w~F%uFO`0LI{D>ky>#BN+)TSyeLD4%@loKL z;yOb(a)a~P1AjJT^#P_){v-6jiZY=!DYUF1iTL%toF{d=`NL$?oK4RcsaU^b3#JW# z_}~HQyfCE1D$OGfTCzWgkN@+xtb;mdu*sUfgx#|h!@;k3d4f1?Z7&7m z@b!mEBQWtxsnbwtp?#sDbIj`g{Y`yZMU2fP>kZMtIWu{hmr0Jkv@(F21X3csfhFD7 z#jjb1YA*(|iU;Mr5c!cAjy+=_#~~Zh8vz5L-G4#!uTbTECa^MeHHHfEpu9sXAsJuk zqCVTA0tTSkjU28D-B$U^zQu-zwWfc*B7J=mrh&I!AXV#SOerpBtJU1MBv~$_H-xQ0 z_@>VfFDg=s`;-Uy7T293;tX>#5;zArMJNcSbCCq-(s)C=*sZ4@t=dVO`sfvc|JG>G z5i;i$)l7=>j-teN{fjrBCGIs#W++Oj9%`_ANV+3n(b6)iEm!W`De5E0p`}y&>HOi=mBRBM zI1@6;6U0uC(iW)C4+jKQ5)d&=suWsTr(-QUd}$VgQm19QKJ^NJ-6KxsIRC)oD_^f@ z(^tcFGOxWt$v#NcO)`G+>{u&kfGCevCnKeEBvn_Xke5L+ImktCgXcqvN+6k%E|9^` zD~5@!8`B>|1>8>j2?^G$syjwWbKi2U|7z!eNDKe%(jKN>kY-1WuBO8D_dWjM#GW9^P*h76q}9-@%ihza%f8*Zvco~tgmdp zPH8F+HseM%B`blv#g$L+$c_{xCOq6NOO9JA!dn@$5o)jfooz<9xs%}H`W-)oa(@-) zy|3(W3v~5~?v<(#v!88VDc{^h2%g;_w{A2CM#bkIwcY0v1qVktSuUEa9wNI52%Wg$ z!|&p#A3iTt0!Dr?j;RDLwg<9}1@5)q{u;jgt^E#FC9qp1=%Q-y&z2xA)es3)sY@Lp zsvUPV5qGsaLd}0J4l@kyj2W{@89zS>^Xj$v|_^})}M2V5T?(05`*>JaCp#+TH(6+28s)Z(^5_f=1= z{PbZ;8zZoJ$6JISF1seFfUVF$1Jvmi5o@%or|HIbE#EuE{zR2C-sNW+JL%ioxy%{CLQgaIsoF?=8XVHHdz) zm~z;hEgw;|7j8O;mO4EvSwx?%P&~N0$}j&HFR86jVbE1!uJP2i>#3_orB7Go9gV7c zT~!Y>suR1aGrA1P>PRo?nyRQGiLP27`-E4R!j7)%Vh7k=UEZUT!hN*rQF-i4iDZI!#`CH5D`_1RiI_~xh^8c7DR5#lhb=m|V z*>zb?vArXJ+(8OkD7G2aqHj@)IE;Al+eatcD0G|P@*4nSr>mC;9Z8|MC;kcZYJ>Y; zP~Zyhx|7=bNzJ@I#?-5=cM+Y^jn2PJd2Fj?{c1?WM+;*SWBojAy{U`B+B^L=VfN04 zT&>etTZcK-tL|D?=gt2D`MM2rP;J}jH`+OJ*Z&5VcP++!dB)hXpxULC6T4K^yYl?% z+m7D1FR!kSTn#koT}`}tg^UE#4W_<{eR_AGb+dg_#bZ#8RP3YJFSTRE9Opt}D;3X#eujbovJ!LzRDhrvfVdSoLf9UY~8i zRg`&}T#)XK!E52Ae}Q!k8k2s!xSA2)9Ch{8lRX-TvKmMC0(+&)4Cl**)b2)U%QH3BJ3(M_&GU zMZNn{`|rB;zrC0LzG_o{zNDrk7o2DKeRjVlHoSVPU!AIbkMoEsBGXbgvt06bc_J>K zDdUx^A@JV?tzwj_6Rl#5TArPl3?evhas!DS6pP6FxsI+r{6~GBQXt{hVbW$2@iP9j zClC&l(b7JI4<>rXII|yNUH(v`1HOp3YMHzKVLbbTj6J0SFHY9Yh`7e&oyO!jAtGwW zM515XMo_6Hi|UvMc@fn3hzA~reTLXLnb6+KV$`jeQ|fOY2pI$*=$H}6CWP~?$U2k+ z9f+6x`HBwm{P2&@`5DL`?dAj>9l-wp9HZwFEr1sAfYzEO5da6UAZ<9vv{EPwRj1o( zk*yk`wWxblMm||4eo+{VsbzHWxx3-yhiIk(~I<$bec>{e*xf2@swfd5f8 z>ev5Q+4yf_Bjj!j{#@2bJ}=ZvNlmje z&WMf3)Rp`nR^v&-e?X18zH>(-zpkYqHL0MWu&|=8u#H??TweNLd`3ldNJV|;Q!VzV z1^G{_YM)kD{Rh!_yIbk)@IQz~^K{Mf&;QsN>mTcO59`mzv!(yQ8PA%}?Tlx+Ip<_X zGZEWz)3&9q_CI7sFQsMmeQS5)e_KbO5B`pi4UK>OH}S0Je`$=BwaJ~s$)g`rGq0!Cwx?&NW?#+Cb+x^&Eq^^V`Tut@ z=2zY>yjecCFc#D9E${x9g7Nn4+pS;!>tD=_tygA2w$`?!N!{zYxaB{|jN99KRa-ZwTY$ zT){XeFb3QHLty;;b+)y7_I3H3!1!~t^B)D{&&mI}e*yTvJJ`?a*oWM|X%2uZ|bnCGL#RxLjRZ9L;c z-{FKfX1X(b(iBQ1;6AMY(NIzmZ@nn&*>bP>%iGSopWaP%cMLh0Tz{jYrqwyPHJo_K zz6jQexKI_5IUQ%dPe4-tM1YHwIIvm(2Tm&W`tA*SWsx>;3)naC@S}{AFM4 zr_ite0XQDmiPJ^g#L_UF`fT7J;zTQ~Ge;1B_Do80lfZsJUut_n7>17L58oGx=Hj*1 zp#kz*02DI$5_Fno+|sN)E!xNGw&D7Yn#h9U98b-)Q57!7zy7C%Jet%eM=*l*1M{bsW$n z(T5!D<7uqzoFM)>--R6KB;|MrGbQhaWtOCH9FE3ZaKla4D%pYr@+Oig*`szVH7HSG zEGE|sTnj6qD>}<6pbG}?)$JCYGf+0{f9cqD!^SP^^y=RvF4Z${Vws#GCvTFRfQ)=3pEv!y$fzC_pL=dw4dQJ7^po64}lD^FbBoZBay%<0sM;d6}FwwN}reU;|1Q|6Lz` zp*C!DJ+gi@n8^Pj%C1nCr%6#Ui%Esh-)~&Z4X>EtWiJIud|UN>?3(2OlZ@D^$s7`p zXb?decUU(POVcI4&s#l-*hl=~yak(Yms)lwwajRJ6g&W;+ z9dDtpI)AK1JZTt7mj6Nh@^c-_rxQpU_q6cmrW$X01V%~z;B=dm0d_)V^MMMtGJT$% z?H1lUh>R>{Iy>91*fX3L>XyFY_?}KkJnBQ^$h%z8AeeBHXtZ7Eb7W%7qu&!(p$VyF zaT?&y&yUBS{rToWqX*F)OHtC(%eJ;;yh^ zKlC7hqhYj^PIa{ZLR3&3CsP^3z;J*y|BxVwDTCUM4sdoI#v@Y8n0yQec~=e-)Y!*B zcSi@IE(akSAIo6WL_>-&X9d0N^-%!xmX22=ZS+N)@JRmPRS}0HQ5N5FU13BoRE+`z zA8m1rK-3W$6*N#wtnTC~Oi5al_5x0XXK!EmwVn9AQ8!Q2N@D6h4=5w_zX1*;?>CJo zt%^Br1nV_kN?NdW67N;GzL%O+W^POd@9)lGL=+(P_DMPa`%|NMYgQhXYEj-H!?8r7 zWoouBK*~IC%pofg!a>>&5Y_>SCg5qXUZT>O!Nw{#tkQjRp74f6vc48&z1rRQ6uvNG zh)}#jd)(};d&8c^h7*)dQi906v?uw5TjlTnN%tc`X!YV-Xn1J0MLT$sgKsw%4o-?F z9xPK~N>KpNC}97ZF732DFOmC0y%5}B03($zS}3Nw^&M(EZUg39Qf|1JA&iGh!@jdF$Psq8|9hk4W{vrn#=IRFRE8EC zmeB~d8MeM->wvEJX5+ijCtXp0naAIUW82_rUif96)p~zrt661PVUE%UqZ{rxrc`Rf zkM?dMeZ;dF{CN5h_w8?k7lKWkhIY!q>UK=y3686S%bbBPB6K;}JyY#M-I*r?Z|}tX zu51?Mg1ok2lHUn({*rZ@8JzURG!&M#7qZt0)_v~b)B zF2{WIBYEy0eUQE}D?ANh$9TAjYKriLq)u}#B@D3c+8C$jB;j}Dxko!`6}g+vyIbeE zm=7s|*aG*adf|&+l7{T0CXnh5lF3I6$VtM26ySrD_W3}@RT3Xl2e-JF-2e&@yse_P zJf^8n3*)BQLeeF2+hB3GQ!`0_1((J0;DZU$16~SRXOn?T3NTIbt37yp}aJC zjl-mz(Y4a3iNq4mbNR)X@BNUR=YXBV+~NBiLU@!!h2!C`N=BCHyCxd-B%a^)LO0JX zkb9HFCh`lJJY_?w20GQMwRGIkJ2+hIFGW4IDe6YUn136XF<6jozKt%Y zd*LPXC&Fm$bVZgMjE|4@Os!MFFUTyn=zFB5TBxaTJ>5Uyh$y_}oYE=w`>M)KtPgAO z>qPF6u(-I6&xzsNJS!5*@vQ=^V1HXCo_;q1cYwgY^C#6r+YRMA{=t>;zvCQqgyiBiwh*k#bxo!;>t#%4l%J_n_Ps(&RTiAfNi_6wEb zi^~)lyctmdx=1WjN>hKq>Ulaa>C+d+_y-}FE#o!os?d=jfJzNBsA7E8{z5M*IOPrh zFl(J*2qr}L=!yspU3KO3i4q>|wk=7PPB$BAk`9Zn*!=QR1I(XX#9DH1ZA^wbO=Ut7 zuEL9ueRl0DQ(nic@IlaME_RDcnb~KAU?l(9H=z1ob?}~$b_eQq3vV3Dy>*3& zBnaqt$SOA|PaVp3t;Cak8_M>eIcIPhm1gc!T~p_7)ba$97cs!~kaU%GNsF@mCQm&2 z6+=pJmczF%*ED;GV~BK?RAadAqTy*fZ1WbI>Vx+f?yr4RH*G7DFs_{A!QWLWnGHQ< z74lyhOYEOLb877LC7!QU5B@p|Kga_Bc}9Y4`$s&p3Kh$W6gnrwVEmX>*wd&)As`mS+R(@qTdn?(67|!76Q!S> zhuv4JNOO3@v5jO@Jxc4cW$Ru_X`#B&i}=yE%%p_FQd>%)eZKT@04QOUv7eYTpvH=> zhNU0EMsk7tMkp2tkjC_HKLOf2YaMFMrhffNe^O*!_u{288ng@9N;;k zHBhk)NOmdM7Y_7&LEi&=G=gQ2Br~RC>C(A#TXdj3I?#ZzN40MB>5Y&5Yk=pRN1HMv zTK#+-kU`fdLq{F;Ze!I0OllLUmBMr@eob+eU1F*!LVf^edwo$+T|vu0}= z{~VM3Q(&)Tu84hpdTxF-gB!hXDb#nS983e2Czm=L0)5Xf834R(lyR+;ad|f3QnOY624mkL zZEIpAI1=eWAc+T?`!*K#R_CS|WsRI=<37-?B{8WdGvs`rO&`s6S7$_*LM?PaxsCMc z5OA5r6Km;$+MptI5>s3$)azr}BXtPQ9wwH|6mC(a{sH2k^Hj9SDjU@4T!B~Y{{ zgyLXoa%gCQf;tkJzJ{Y(=O6g*H2n2>u9FCOPyJZ_vzJT6eh3q*J?h>9-9jy0 zi+=^l82Z*&USJtkkdq?PZ~mm_8SMmNLOQkk@R^de^+P~iGcT~U3qm`>7or0V337AH z!}}3ZF1qWle|!imcn0Q6rB6XU`&HYLA8XT?FeAjk8QtU#V$+5L1%Ee<@HUgFYRxKM zO#O$n3RsY~zD=MH%cCyS*|{z<1PG^>|PXM6~DEd>RT31kak*ZA%R;`K8*oP0hDatf>}4YPagSU5D|N7PZMiRiN&Hu(HiCRq2UPi(BF2)T zciOvACvWtTUxT}!wLXqR2XyU4cbp7EZNW<+hbKSkz{)`db?S8CkxX~T3T1v}J76DM z99B3W80FpQB`s<{eT0eEz?wAEnPmkoGO35V(I;*YyMxM%;q+xeT?KsI>Sw({H96@s zFOXxfTv&JY+w7|!Afi&;&5RwXcCdqA^_umD6^LOkr(sX6tlYyKwGU`ILZ{Q8;kR`# zSN`FperfNRk%+>PsGbooS)tHcXf*8z{!iNlg^|!z8?4r7GIf>Y{CTJaFnrna>gUMO z%hsJ`h>oGoQRiE*G$y8IM7N15t0OTj=MNI4##n}Bh;AOQTQ$fk9q(w75RPLgwU{U? zg=Xta=o?Mcy5;maO^{b7+9$`GnI=n18S*VAa&@33Gm|CQVG;WYEM_wL+ej^zq4u!V zV#bAYHtlHu3Z;fOpTzCd7YFEo&@j-sYl9=xUEi2?ECpQ$(0QCryEf8a)d6|fO-IkX ziaw{LaRy{ zvSE_Q{*9{6az^}?)GKTQC>M&Y6cRCBa>6uw*fxYpL zedAm-<=XqkI_-^bAi?GDLTeDg`!DLTCxH~RAhN*NT}r(FcM&_q*o{~sI1^(9mLeM# z)xk`urc3c@gv26ZTmv!Pc^Ti!m|C>Vk-1EoTuy3ODiv7Semz?5ydv+uP+7E6+q+V~ zw(?94W&3-j`RdzN=eO;#Z##?LcJ;pPS$o^}_bs`|$clTl+}VE6bak|7b-Z_Va&2|` z@9K=e+T7K(dFQn^v1^Q=IrmJhS&@`es+ZB1I4pEDW8*Cl%buLwV{p0v`#^M|$Eyf*bo=x-!Xakp9&}38Bu!nLs^x@!IHJZxChondc_N8XHM zV@lACcM}aF&)OF_h z5~ugS9_{1XX&;(^c?$cWe zhRp88x!`sNK}_q1qd~Mvu%i!s?}dXo;w@laIv>sxYQjQF%w_Z!XRp2D43kxOxHc%u zWX^dH3(-V`i++U>NIRocSlDw^VAF=3gWs1!T{>y_XETD}k7uxhSUz|Br|l+M)|Wsy z`~&ppn<&jUiOa0w>k(3$;G3neAKoytm#pFsSlO?!E_$#KH>Dk4v0-?_9(ys+WkS`~ zVccBe-a%|63jzHM0srR$PFSXU7C+y(OWAtJ8JYtPwOMaIIO3%F{^$uy4dS8AZ5Z(m zOFZd2*zyOb<$GsWnA9B>+oL@WnnS{K7N7-7jw?IeCWGz6V|SWyi-$kIW}bmFX;{r! zpFB9_)@Ds{Wx06Bnt73{5^*M;`I{s749fD8Q+GU~?6dHZ%#}MV{8X43^^|UtKJYnA z;|^Ob)w=$rpqU#Bj(YjGB+YlP#54^6j0a*=+-okY4hR z;@r*{shX6xc?>EevdQ>D3f-FE23P5q?J)7I9zsM_Wqk6|>pgun8Fgq{C$LPR68Hh0 z`u;;1xz0f7#{7Q+9774R>Td!JAuM_D-=!YlW`T?Trm5104U|HlA8a!T#$sGL8U@c5 zYrIX-qn$*fiuar;(=+MGjyU;{bncVstwp&x;BGBm zs3^tLQPVoh_QNL&6dqc}85O02y8NN;gS>Yhj7b{072~|+Yw0u@cy2ySiR0}_fem{v zZVsh9J#z24#kc##%3$=@pJ*>(FX6!>ooMtpTeRmNW|qW_l!}6CH5DDWq{w;MmW)oE zG2;YX`k()Yy8C`-Gk*BLj|7nfu}6)FS*x*XYhup|MU7HaOO@7MMMI1;X6(JGU3+)f zwO7?FRii~wbfLpnKi72~-}}0Mx_`a%H=IX~^LU@{$Lrbtu=rJLlWqdE+Z&=rr))^e z_ci(WP;47+`Uv$?8|>anxYz3to+nUjhyi}wp)dMN*Ner*nsrvRYoJ8j)Z^50Duj8@ zPc)F!^4SLBS}Kg9dKb5b ziGRoiX(#My?q5Ukn-W#n3W-PW4J?v+Sp!Q{=H7TXv3H97hVTxE`=W#+Dk z)DBSHo^ty9eHTpRYH8C=B&}qW(28fftL2oc4w=WBjliZ78flsNuY^_Y*f<5akxE8i zq69jK(pQ1XA;d^eiu$Lt(l<|T{20qv8f&@?&Toy+Q*0N^2ujK4}6sgqCL zA~dl=PEIFiV1WK!kiF4?xM^yX9$!$W`js%X3guF2uavsYXKDc@6((Lki?5eDc@>M# zoq$oAR`(uz6Ao2H+$WNb-u0vTt(CvU-K%~a4XFspG%6Q7PVR`JY!LY0ey=swkpPUMTPD#kt?#g zB900g%+piI{Wn8Up;nm%+Wttkoe2nbT}aVQEPy?1)kkF}vu>@BT5uM?nFb&}*H0m9 z*^B93oM^RNoTfaQHv0)Sy%u3u@5g}MFfP1WE@)R8JJjuvub?iw6};&M=~(}KAe5wM zhUcSp82H^EpgWOAmt>xrE*Q*|-fg)~$B=2LjS3(s*}3tHl7lRh8+BsEDJ5sR50?B3Jb8PZm|LKNmQXFIlWv~eS!-e{}W>F zTapRPRJ}jdD&Vf%{cZh;b6Z9M6NiFTlGJD{a7Ey`TMAa_slqL+lh5mSz^OQejJCDY z73z-RT76<19|oL1w^=??A9yvbdmJ@m6?O~HZV(Z$hg84h$n=_x!A@vD%wEdL1-F2q2%luq4<6SebsnWm_M}xN`uK?cSH)7Ltm=tkC?Hu>+!i3=JXon*mpz# z3^5DkVc6G9R*zIh^_94{*g~ioyNf9NT*B`PX5xCKsnM+DZc_9=>wUtRDqpvu7WXW# zv)Q60!tQdTCzUkh!{oS_Ia=pG!*I5$#gYJ)z-}L-;L2^Vu~HIt-a?C&(PtDNmgxdmqF;w$MKuWPO!gKxjhFN zWyP#flT}e>CEdEZZL9HoQL z_l=W@FZX-HjinFjYG_M`D)v5U<5cW@PmnAS^o_YZZ9pV-ge~jn1$DBU(`;Bwu9Ek8 zZ0SCWq_NY8LqE_;y~>*BAPi%c*EtK{(4tYE*jaxR^n1k>!| zUTe`t+top4{fi-#<(L4n8=gGi)lW8G3^b0tkk^#kL`?L47e-ew3EV=4T+(emPjg6g z;^c7S>8!0E7s<5sbF(Q{%9rq>4iTI~s*(b;QXeK!FDNC5|M|!-5l%pIdEU5G)Kh+K zHc2sR@Vb~n?aIJC(+Yxslps9~SL)g9qdP>nw2Gc-WGJ)S!3V_M_kBDG+zhWk21@i5 z2LRJszrXC@R}6t(ii8x<=S}AVmW>~lS8CH*UmCgvoPN2@ z5iC`;MvnfjBE6aCU6I8`fH0KlRwR;)G;8U9eF1%3J@AR0QUeYd=L1!V3xrfg$WKuw z+H8fdm*|xgD4g&wr!cQl8=B+l$>$%u`f1a=m7*L0v?sL_etj)W6p?yyNVNZj_|jAd zo~=l!P<*{j{{AthfGoei3xMQyPuF7}tYe7va+@FOOE4T)6zTQ?EhRmGx8)B$6Y;UtS<^< zsZgsclucNm5FZ1)@Ave3s3%SJH7P_Kf7VDk(O3o%E7vHbec&>)MN9#BNwE4ksW${x zm55ePYENXUCpX+op1D-OWJ!tBjB194t8XM9JzYrbFxeRKJeh*5D(N9 zou${7rUGsP18j`1U)#T&)}XqS+2XL*Q4$2gR$Vh5;}m&!`5bF67FY4Yyh0TKn5lnv zOA#O(@5CvI5lLv>h6NCV6OS1JQ7@H<=q9(RZ+QC^2>BgHsVhYNE3Nm8Y`YPrX2?#? zq2CgCHDnmvbc&Ca1+GjDW_1wp`u(2$-8SpM88O*47E;a3!}J+Zs|*M$hCLl)Vm8z> zdnd4S$mZ{ug&?Q7I0Hc2Cz@lP#d{bKEb+aZXlE&!5@v{GMTH*|B$!yQHVUbLr-Qo( zT9~ee+w|Z4Hb}5!%kQlA{S7?agX@d|^(vxH_~IdWLKB=OjSJQb%V`k@_o*1pAF*C= z*mn3BaZN^8$&iIa_aYZPc&6vXKCX8OcvUla9y4Op)B&0YBVMiNZ?LOPZR=-qh(#Ed zMTVE!5jCH8jVaDTKWze$W;79sVXVxM_h8}-IF@tlsjDW(K_f74$gG*!$WJmN7LF&l z6i^NsZLJ%vEDNk@CVkkHp+*uKxd6#`x!WoLMSn_k{|Ep?{>IfBs3>?!!K%%Oq*UNl zA#37u;P^MxmpP|JGvcjJOYkso`$Jy~-}Simq-9O2-|vh-Ih~0LCg-z|by@liS%%HA zWXs;RMI0#n2jjjX`8mRrD0 zX260hk}H`0emsOqr285RO^C)-fD6LQu5i!=(EFNN5N}>;Qgwk7`#t!=v>>ip0*fc4wJlV2NMF`o_p+z6Z4vj$BN>*wbP~vRGAGyT0JZg5T5o}2QD*q05GX#@Bh%~ z^hZC*ey)2V47LV#)&ev1u-U5$sER~9UoK6CfC6)FxCMo;HO+-B%z0}q#mIqZo-g=H z-0YsURN7iduq}fia^uu1fT6CO-vCyksz-{L88T0@p976pneA9fi4v7D%dr(@(dIFk zfz~&*sBmxlufahH0mBtqQ75@e?@KMOEm{(hmlJ*CA4=2Q{tjsUfpql9IYa_bg}5Ou zV_`u|id=F;S)%gAHp>EDHZK=yLY#adR6xQ2+!c3vmJ4QVBoA%$7b1+%z{@{26)iS# zc{crWdFNe!GG_h&Z&Ed|T2%JjHZj3{bv70_0`Oq~Xk)kIX$L!(U2Y4p!MuUGRoV1y zLEQDjU75k{FVf$ck9OB;OMheN9bf2svDB|MQ2*UJerRsQw)dADpo&~31T=PUk7Tk` zP0hyqakC>2FV;{1fBXjN*ar?&)7O64hLJEo(YIr0t#7W_R+@{!s+N96n%8{q-GCK` zR~M0ACV5Q5sH zW2A|NVmf^g2Fvc=;rH;yYal;biy|k2E}lF;mywSQqIic)hIn=L4)M^=?VW|NNNl%& z;RyH4U;H3s9T+=_0)FZ7&J^~9L{RdZsb0iBoEyOb2FG$?BUw?ZV#eOw-a&OTZtzHqgNv* z$M)o&QQoS!t)%oIg0vUk?KaO!JNIKxtGIcH&W$Jp+a(RAv`_Z=C7xRZFR5JzdB23b zruuMl*PVztaFU`rApp@X55pi-^uK``GP;s&n(dd69lL(MotO_y+0{b_Umew)AW`-n z2Pue0+C}^OEW|t>q6N#Ffftj@7V1xWw%2$b+O!tNC3G*b630H~Y8{5r!lFby2=i%-5w5-hk%}VCMi%+mLH`$JlbLfem>3W zAK!PCU5}r7+V^bt{oKlLp}n*G-Pb~!Li8S>@8k&;;d1zxb1pK$k?9y2Hb9P@!Vyg+ z4;+YAc&8xe2*{&4mxvH8z@9x^3zwm&6U9Cm2GOCiJPaGMBGAYK_6(XAGD(&EE_Qcgm@zec`-S~RHjXA%-0{`hXzn}N^%(VT8BK~n} zKhYG9>V7}^BK?jX{j1~s^@r~VWPE>9|2;uO`7K@S`RJm)jslII!sjt&8ad;Qq%{qL zN;k;07@z=>kO54r$`C0#ybohgR&L27rdD7;GzwI0*>}>9T=cZk}-?fK{_@B~P z!o@uxi$m98a>3M}K#ETMmRzhR1}Oaky_yOBte{nL4Jc0xvUdn1d7K7Q`^Q2Eo@~Cc zRO{LFB{|WBYJXSr-aiu7J~28Ey!;hv-VMab16cd~F1E^Y>ex88i);Se&(0xr!m62x z02+A<5b;k#KUUTD4;HR%agJ~G_s72cQDq)LC?uF`QPr0FPtpImANSa4W@jk6u~KZ_@>t#!MWA0LgCFOWUHS;z~VPqKx)KmWtS_vdl6Zy)t9qHb`O4v>BA zr>EfG?abgP{vkrSUzp|83LCIW9lHNMREp9&!P1u?5<$e zpyR#jbb@%R=~RTaHUp|qC=v+fnCj#uIGQebyEpE#x6pX@)ko`NmEOXW`Dzam#(


i;e}=MnA0p<|!~q+nEhcTt!LZn0#aE{W79*8(S0dvRR4ly&N1{ca^u~+% z9~jd^_Z#~S{I9%!8TzQWm_OBJjNgdnoFAr?vS(H9KpBN)WqE4l6ea1n)vJZhKtEuK zVOeN+Ff+v`CH?HTrND6Zqx0SbiA$}ki>;3~COFJw?qwOV#CU}p>VHX#!zx|p3~W4# zNxSmkV~S@JM@zLy;!_CcJ(qzhnONO6u;!n-@t7n!kI3gWW*MOn+g_#F+S<;ADkdZXAB$SqDm`u^ot1qJb z!_p$`qUDVcIXF_7k^nWBmSRfJArYBz4(c>9u6KTf$BC(j%Q}T0RyjWiFgo3l8kickNQ51bZxy~2CeT)ziGulbX7#gCuQ8L7Qd9*b2!$LCZ614ep zaY?duRpmz`>C1o%^6O=3e%6kXQi_h49X=B%vq3e8t`tCN1zoN-4y_TOxg^9*G14%! zC%jiVseY-pnZDtOJLKt}32PIr?b0@1#>|$O^dj9iTmB3Rf?>%zU8?TwgJV&|b5O`J zqW#T!PTk92YNcX9zgmt>N+tJ;V_x}`QG7D6Kh8mk8bD{E9U{_WGnuq^avKJ>E?>nB z2uLbZUSeu1Ro5tri@RT7a}G!J^jzxWY8vytzkuN6t<#B6SIY6>Z39Ux3zLClrJJTh z=z?VfJ=WbE#ZpMm8KiBxGhB0xt~K*c>U*m?(^G^@Px07%RvEzD1I3SBoWM@EEI;bw z_IGoDMYO*2-^goQmArUN9&24UluQ@C#{7LXnm@mNJyvG5eIrqWr(-kahF!;2#-03* zk2&6}9iIvaJe}JmDR!MZt-sBG zLsMh-b7bgOcF!xJtDEQ5@ngS1!{<0U`o%58t_GFe?(1uDXgnTtK|Ng5VfN_UckZ2koA%$k`jk4v5dsz`-Dfnsq`oZ3QBb?CH z;32w4+kLzgQh+)aiXqmepC2Vf)W3yd%GvH0R+ow~%|)?Py9|gqO2t~gL$P&jE4~=3 zbM(_IVjE?DezqtWeK(?rV_BqXfeZCmbuB9+rnITf-GC3TG1+j~&U7WqU9`#-m{`q} zyVB4Q|MIiLbquNJphxSnPmt^&b(=ZuPK)y+KtIx*?Jh`9};Dz~Gq8D4fF#;UOwsyJhNu zJfPt$2>39f7#Yseg1 z?S7MgR%1K!V`uV7l`|W~3MCpEQ+x;6oKI#eqH$?=Dq3B(m@!X8ODt&IdxVlzOCw4+ z&S6^O0Gn9?i@L;$gxf(}qF)Ky3n9y{& z+Nq$9Wb0)m#4~jRhll&OC^79y6%)Qh_HnV>Aan9NKji95P$l*-Wsz>qs|_)>;&&n! zW(U=;HvU2tIf*F?KYw}sS!r+DUE1#zydq$zwPiL@_E(1W5Fhi~UobJcp7HjJFvEK( z_v@>(R*Se+@dPA;`+VopE0TIk(}z7fyT>*i6;i4#$Oup2`CDpIpW2(T(^m_+uB;#5 z&w24@*ssi>xM`-WD|GrJ(E|%<9=S;Ld_O1xcd!2J6+-^E=9&1PoUS=}G^2*OkUCD> ztLeh=DEd@s-}AeO=$Zuo6FlY-<(4kqHiXm*%5(d1{DtPZ6Pe-^o8weCdDrRgUGK*a z+}tlf&qX%(;eWEZ9;wCu)67lyPcygXznZxhrY9h`@1NUL_|fW zUH#=U2AVS37&pI1JuylCV8V?EE_R5#ZD zuPW|^>}h=ePxd@(tSc%07sI_M;S!(xkL=lOzI*du3AeNBpYK^*z3@G4t)1;&&h35k zo%8Ge?Rze8&%(;{_6wWy=K1*YzYOlH-WPrUGPp0_%)h#TKG|tKulo8%UiE$c_Rsf> zPX9OYS^5w0dC~QMmCwM)$nbv}xNrU^fcsDR{A=L;R{(cnsCi;~e5$(gpY`czp859o z|JlI3fIk1J-+sNYK69}Fb90OH1%KtBX&xPjkSG=TK|NkMUD_zu`jEF7zUz*1#u`&0%)QJIqDe?AM&4?buOqGp% zim2^KbLE?IT#0^anusu$b7N4};&49)mx3pi-JdMd@Z>Ynkdi@jeZ~?&nck0EWOJ9c zGT`g(%4l2N`!bVRJKwocF)V7r6>e5@L!`GSj}Gc!I*K%@yO($B!D>-NubW4E&TZ7$ zyz{2w`?H|Zrq2^K_cFUZ8U2xqYDC6b>&z4)qR*Qpl;u|weaaH}uGW#aUv1M!<$q}& z-#FDKA>IH*KA-USY*FX(3NP(XKmWfq&!1l>U;jI&OGYKKh6l5{{L?%YYvJ@PAK^3z z?SGob!i6sa{d;gNipwv+-T@3jt^)$;F6%@QD29xj68)ht8a*h&AMyf;#TY0*SNNCH zRp16BXo^Y_HCgWq*kL%E*WNHy^kS&)fb7EXWj!xHD@wA>!6i1%8z38S6 zZ;h>)P$+TF=VI$nE7d85VV0u@1LnfvD5wS2#wck{vby6#*R7`F{W*MWZrMNUAc?`T z)+B+6I4M$zGPuOE3pj>NIvjLbbTl$6R-^bo#SH+A`{2UE7=YQl`XR8}$J>WdFQ z*PAxp@?~L?|K_lx9>RQel|S>|G8)TkAaB_NGQZ`1rKeIXN9HZc>MeQrv99jDzEwv3l=sa?EzU zZMi~fn%9!Q z_L}D({@Q1yjsJDUhTGrEXzqFr&QXRX|H0(HEFkgfV5pzT+)u5h!nz*z-1`yz zl7bU~68OqIk3_v9Xg)$Nr;K9eHh|1=NDuAh<_Dm%mx*V=sAQ-_+WG;CrP zi5-DQI*)7=!f6+}IsR#$u_8L&){EDt^=J&d_&=Hlx$7RSYgo*fG1M=lbVS6(6*HIX z4v1PG#aNCNv$hQlNCq8Yu&@n=SGt4J*++3zZm5_JcOQK1AJm5Sm1BoZdBK%j``0%&oEVPUxLL^>t`K6yow{tr)N z6gZn);FSE@4~CTJTbW?0V?E~@FP(%L0pVo@9pkjZ03I~_|}I;B%rA)lDAXhX37-4C+2{)8-6JV^-AR}?ABY~ z)UopN$e|4rmcJvbA6|G-p8t)xOyhMveDkGg0cDr~Rse~^L1pt6no9)@>_Ml0QYe1B zv6uU#Si+CP=RQ+WN9f~34WBg@PPE^{-V98>nZQ`mvAKc81scV4rmFeY2xy=0jNpa9 zr6BC(YfRQ}NOrCXu#!!KX#Ilt)>&k=f`;HU$B6mbEXVgfC!-^dw~skB3;G~sC8VgogF7`Fwq>?BW-UI&l9Sw#Be83E0s3bqe#5OQW*Dy?%t2_q7ESdZ3z&q8p z)DHx1f%%!ewRCOi8!eq>)9XoFQ+F5~W1|hPHfGY2ZeNK_vhbJ_>YC1z(af0}%eD~6 z=N@vtJY#8D!zx7koKmPp-X{DU?x?|}>i*OtY$1GGU7)DK&2(2+XNB{oKpm}~msKN8 zX~KwoTc#E}EOmKiP!4bI0LGje}LQ;>oR=1<%i;bp&n(EgCPShS8v`c7da+GB}jNHx6;7FGy= z@OWqzn@4&zmiB@9ByOYPsGXl9@D>XuTn; z9|Nf#UA!$WZ;g^(8_f`lPnO+7zUk%x%E{vqShga@{Xi)Vx5M{c91--&c3`1g>`weU zB|e4(%DPh!MD1b=qkGP${8}Cf=l@~q*Wv)f6qI2`TWpM$XFNsc#+Exl;LXH>4D<0V zl7qbFRLYR_)YFjt=^Zwr?70Y~dJQ#GE007t1#ykTUTxemdZAC9)vJVR-Q(v++SLkHJ%*S)HXF?k zjBKBD+xkLCvh{aaUeQvag~INoWITs4D?0XEGKF?!xqkjeJmfBZo}rN$B4Gc1b0#bQ zQF+EVawrqbsTqo>HkSFsV{vE6JlgjSsaSw_p^HOq!e{*|nB4`bSdq3C_nz)}TK9^P zKh}$?@3H@WE~~uOgo+mdt~9f!cLQR4z`#juE1HH3x-Y&ua7R;kfdi{j(N`b-)jE2G zwnue}pGG!7w1ZEoP;SD8Hif6~L^kQX__NLiE5Y9SG3RO1I!!T{1E->t@a^c*GUuab zFMfTyv~zTB%ESHXjiK5O(<$N1JB7wdMSYQlPyYK&kKf-&B&7Bm)f1DDWS)YE52eoD zUGt2L8JymOT0bLnq3wA10-o*!k6;gD+{RB7k~4XPF&&aKk@OeK8M@IfdBQGYh3fC_OXoi3yAiC=sm~4DJ&U6Wn{}!4NGrRdcck&nHkH8F!17_*uLne0WlSsF;(p`Pq$%%hcSZ~ zcyE1l{~GM^w#P($3=PAB&XUOCdianBO^OTW4F7d71J?6c=0W)5=VU^2O_0oEaa{-b z7Hy*eh2VvD-^ysl9Ck(<;cJP9kU}!3OERPi9p8EbSENZUNTyeIelF~Dw(_CQky+=4Sc-~ z2a{mdh`NE(f#_3tq$8wKJ{M6&WpZLax>5yFF%rYU*bJ&2xSw8-#}4D2PmF*9V;?E1 zhj4>e4#!-S-sC};bpX3x<}R$ayB5e;Sbq^o_IZ_&kgu* z9Ttp(W_DAD0Fkq$nX&Z{q9QzXhaq+wUbBc$MaSK0&JqZtXp8jcW{5KDk78wr2}ZhS z)nu`;kpBBDc2+n@A6AS|_0E0@KD&|m24Ug)}_h;YYInxkQ| z^$>G3n0}E8CYq;v2UIpi<=jn;C4;JTgO+v#o4P?wXt4L8g%B2jA8m%Pc! zvzvjNV?bSqa*Z|0%x;hd1|+6{P(|jJkY}Hro8V`9DqfV7GMNyrk5Cf>vo&O3Mx7A% zHMm_p#L}8_xC16a22@>zqz8c&F5aZOsqqUAcJ?J5>_sz|i-OVcScI+TQq|Mp%92PL z^C`GHzQnGu3{mAp-B8f4pqc=FqB;YZi7@b|U1$4FPKC!YdKjc>l2dQ#Go$s{DD~Fo z;Zrm@#buG%*#!4BsC7UgzCBUpW@5=(ct1Wxk-hE=KrGzghVSqXk-;CaMwa)$tp#u; zS?Mr`#3QA;@2-hW9?wo=>V7KK9YgEB>Nh|iBfj6{L@v6a8U58P5lJM@Wc$ZfPW5yj zbab?GzX1p)*R^-(qb+LN8Ljjjw*{N>ui6!_>0MlmIeP>;(7R4-lqQ^B?W%;29DycZqcS5 zjj!>%Qx}*aAKU;ftfzTVok`ad-J{G@soY}Nkmt>;|I9|2GOhK&1B6{p%gqND!`@`o z-^k0A;U@JE0vh62#n^v7Rr&3{cf&{MkTtZ~8nG#cU$M#&GkHF!Y^)D^LCMz+GI?>V zix@yto1m%gASk`jh}Yeqr;AjDLD@QFMWs1qZD?>Ht`MRz){DMJ40 z=(FM1>Q+$0s~j|SNO%5yc2FP!%%B9<>88Fq@}eo5VAM_Ryhdp>1;(yX+I7RaT>C6{ zdu0(7U%Fsb%RR5Z_0VH0gQs34UL^^=K&YQ&^RN?gGtoE z`k>%5wE<3$JD!5Znvu(`zsafgB9-f<^4jMXVQHCK*%}s7*oj*beA)q}w1!^QsS7U5 z9>>!J4^d~HPYI5bV7N2rYkNrST4@(@NMmm>7*rX`VR|+@od0{ckZUB*ki4rEnnTL0 z#=*YCG;l08{tl=+ZD+J14DS{VFF1}?Gz^|ASl84Za5)rHVos;~{kr*}rEy$hkSXzD}{DgoQTLj0UJdd3Prqgw=Bs`08qBMNcQ zPbV5x2BdEe6_J2s?C-S)^T= zytVQ;?5@!VXvQD5*Bh&?|u#Fn74F~BBmA@Mpo=x>ta*G*+{ONRCrEs4ACl-TdF0=OU-;df@h8^<%XCmV2l} z@Ar?Ms~ zS!(J2va#1J#B_J{yT{tXNg-16vqgVW_P#=*1XL%2G`x1;p)y^GW(YD$z2Q;)#AfvJ zlHR$nIdivLrhw^msCoN0eVPu~BBv<~lrll0B$YmoPSvHcAWelD2~X?5<@8{0s8YU} zrCr>kX+{fTK+O1>u~wtKZTKT6UGLe0s#!e|5=r{*zFsP2k&}60Y2)Hw-Nx8`_EWQ; zsrU^wiO@|W##d;{CuYvwwIcSiQD*vMrMqjZPPOL|`(#4L;0{-w{E8 z<=Xdo^d#upcYLTyz+Y6$G|$+Ge+7fP&_T1!g0rf@na3DCXI&S{G~wn;MYHkHX)20_ zA!HL&&42$Zp`U9O&2wWHQ+_*Z_~XNCKYech^n3C%px|fFtDnJ-);d>z;(1RFj^}$+ z-`z)0-{ecLFgc03_AWe8!}K=y$~v3{cbfPFQ!j&Ht3S>8Le7Im#6025nmlDgBMM$g z=zD((oRH+foRvK}Ga~ZfJ=&I$VYo}@7g^Wg%y2*o)5n|yxGf;^@LBdX7xqDTCNDMtG5eu(#gyV=&E12p#? zO={($AS@~UAfIG3YEMX#>b%if==93}ETr+WgJpQ*Lq zc<7h2IDwBMDnPNtcLtiZ8vTYYW{3Hr^qf7O3I_{cm+{!tHyc?BAe1#xZp!h9XY0|E{gWPX|aMttoVWgI+f?+YLyuJRr&l z>8M;yn<79@yG@YarSkD2D0ZB|Cz zNF5%=T&hlw5Q?JrP!>mJIWlR=Id3#z==zTUhES zJd+OfZ7!Mpc2dv9LkZe%WLj)bXWrkYjJ>8fMJ326B&5`rB)Bn5u__(LrS#>Bc1IXl zbV>e|^9C~NiTe%$YzP@(sF=DE!KVq<(6Snt@N4$j5T#t#w;Vj?JN;}VSuz_dtFEaQ z8ZLm~W^9iaNY);GfVV4_W+*~7CE1CmzL3o@20VmO7T@$PhEr3UX|Sa1lt>1B9rVhO zOxTVSv(xU0c3o}qmBUmA{ZD}g$x0xW_rXIme%pwQ+?@3b?ct&qeptPX#Kq|9zbnHN+@KQ#_75OWuvF>g&yXz|wN z%fn7)s+$!+Ib!Ghb`b`SEP<>cfacLI$(~y2i~)bc5%Go zb}TNiQ!U+~YK%JD8hR4y_%8Y#5;FSdK@@+WeKfup43ZHhas+RxhPL%yKewKvSA}D% zZG|6s20;X^xP(p`7x+YW-Hqem4E<^mgG?Mf*pPKbt|y7iF9+D$Wc5UFsg$J?=qt(l zD$0VRGo3e%aH%D`B<8cX0pMo>=^LLfQO?#})e28SIS1#;zNe#naGsJJBwmr>{9=gv5m} z5`&GsFLizU38^J9vO6p)d;7i6qTLt#vfkSd7RE)rwy_Vzk?4-Z&IM*p)|#I$aU8DH zvg|0^zczB3?7F^XY(0m>>IyP2d9=0TrU-Xqmsk0pEL3cq>;SUP+5|I5{?vDp2%IZ| z;YjAT44#tcVw0tzZ)4Xb!w{p<->>S>I`G1h;x08C3YOZaUOZzQ&CEUPsjD%Sr0%J2^2P)En6ND53C$aM%K5hV+q?cI~tl!ytl_G)wywX0!qk63i)S$23!4=Qo-4Z0u`FSpn!vlM@D%AsY= za0!&=N|4bgREw-v<64TJV0=}%20JAJ#R$cFS!ped5~UumetMHk2nFonK#CU?-61hA zGje~4c6S?`DpRn(1{593tcqdYXI|>{2FRFGDShOhAt-zdhcn(Xw?jc-~z=j+(J?;mcy){Cbj^Cz;d{0 z9HtcbD)m)a@-cHIsDQA3F}x=IPz+PTi43$93%1&0b02P*3xCnc$3T(PY5|7w{ccIv zmL@M%(a5bRX@9{ctrQs$A+kx+>Ivb_>ba%DYuqp9VEBT@6bGL!#|j|>pe z(*B@gY6cPhsuk@bj0hmfn_KcHuQ(o5!L=M$!Y=4+C@x6JvhExQ7Xjx!ixd!6kTjV6t}AHf7Nv#wC~aZ4PbV zjP@$#8Zk2sfg3F-9A2r{BMvdqkjW2uMX4$ynZJgGmDE<945)U52^|vA%Miv0$d$PE z{B1A_kd3zQ{LwkG8~`vCqGAmr`l^ZV9j0H`Ni;Wnm)6fsG25?zIaeD0JciHBqDx5u2f2P zl{!x8=_pUa!o_yan0PuU282gS% zs0nK&E*HB?`Qh8^#UO~z-c!5o-rNThsyhT8d`^6~xWQqVj~QM~r9kAA#|C~~bFGVr z2WOCC5vOBBobJ;e-Q)*X8#ZDN1HlcY(B}~om6>EOFNp9a)_%5ccmo2C2UbU4U5kZK z+N;2fVk%Q1mvPzw7hihYN21p#qwT@YK7k@5UzdNBawgz?R8y zu0PAX=PVFz9*O>gX$l9Q+A7_Mh!u$6XCk)t`n&ppmpBE!ZFG8;spx=y0?bk?Y$&`1 zimo73E)WDEi>oIy)oYRb5F_Emo85fp6fM$W_GG6-Wi*9FmzWv7;OIgcpE!g#xO+jrIrD?{No$DqtX)8}ic zixSm?$^wI)MA1Ij@(nS~Zqe9v-zZ0OLS+BDv>m2M8-g`rY?O|;OoX*1pBlAoH2~|Ew zL7@i;RADmZD<^;?k4BTfEwL&sv?}nmrTIvdSzD=E(5OWWKgYztV%H3-p9&-Z+REfZ5UVqE7vkg8JqKGkuQ{2qu6W$|`J`urfCwSJ zovd!bq`+P*8X0EvPMsbS_8J`X&J@J;5GM2E|4?^dK}|6F-tU0~5_&@K1PHzNB47wD zROub0H>m=Of=US*dgw(!dI#xJL}?;jnn;)4K|nx7kQ1M^*1PxFGiPSsoq1=t%nUQR zNC^3T{~zK7=$n@5srciFWp$1yK8FeeJgEeDm(mySNQ^``^?C#!Pr}stkeS#prE;Jt zPYp?7{hCv3n~=V^$vEDU9R9oGH8rdl2x;pk4`|P26$>V%r}==SGMaR9lGOMhr%a+? zh5@#&zgR&^``pD9AGaTT{S;oHr>II13^P#E#B>1-<_O1v=U-&u%{;NwdH{CP))#&N zE@DAMW36t==l8ERRCCCUWYQLkqAtDK-uP`Qqkt6dkjG<&4)GP%TmAG>8`H&tFN2Rd_zdxHosJ=j9UFD}1tF{2l>* zV?@UK+$zDq;5n6A1-=aeyS9Yb{qfk%IdD_%XXfumq%A?#ZM2@e{4+`fk%=B97phh1 zN73nR?5*0pda3Jqens>~)+Vbs!A%s1$HRNk#uE1=>gU$Tdl5Py1(&pDG^o4>|enRiqTcJJYbnVP52n>o1ye!Cw-3AskV-EzY z4#2y4QV`h_+7HwyS82S%Hs-^43q0_+eKaJ7aE0;V>f5=4C?sBFWs`v0&%HI`{paG_ z>3r>MzmA%icZ<8cv$IJw4-WbDW10QDs8?MQ2Ato{Y#h~x7sq05%WZE`%RaO|2x=w; zJ;j_Hcj(z2Jd$`lJbTyaz$4iL%(3Hl;FDQ8lY$xllvVGL1@(<`-HDNj>Ey1N;1Q3= zrDFN9H#@e&)QAnSnX2*=?CtVUbj~>3ZI+BYrE!u2KLf*H+7j5!;^y7C*7@ypOd^NB zO}&qsJw9*#!Oi0ke=Z60Eda@^ts3*EY1s^tQ;isyIrw)T?^T}IoGTM)21%KOpPF<} zJi<5fcs8D4;O$c|BZJ}eIev*JT5je3ayjnFw%C|yn5Y`I@Cn^7Sdk=<70N4{t~m zSpD_=7suvYr{vmS$#q^unD46wTc#NF`(<1NqQrCzAGWMz2Jni1<+lvV@3LgJau1-i zHn|;RX^yc1#aKUcRb)SnjR}hSRa5DA@S(Ne;U;=d3H#OV!n;GxEkBHX&Z!_E-~Bd8 zHg~o@mf!~Z4D9(3eA@uYvjJAKpw@pgo_7QkGD*AZYr8}k^HB6x`gJt1VT?kU=L8Wz zb_-}MM%a1pVUgUU3)Anq)xII0zS(I?82tLa&UjXdB}IS@qF_IBNqOCV;sKROOtS*b zO=G?s@RucExSH22c7q4ZFhmAvzPv238Rb;j^WdO>`-zzJJ3ovc0$;j4WPR~)Q^~7% z4fBXyIPd+=t2Z2cCzU;q_L&##is=pVEC`+H8Jpa7U7j6lx$?P{DfRItJ}--Lg@j`Z zMs9ZoI@+Wcw8!bMUeY!Kr^j+vg3+2QuFA?3q0j8o?ml_`NQu3q_EG4EpmJaHvEAmZ~G<>N2=r(8+2CmX_LojOWx$UTlqB8BB(UC>iWZ za1mk>ZF~-ZhK7Sg+>%JXia|>j1d!QMSFVA3Fpe@5@48hSIvTGlr))1-M-9!^2kHCI zfO`qjl;!vqNyNFP^BIE_sI$cd7F+MHM`V+V7u%*$Hfs<%nYn1jKy$e#b|$h!G4_i$ zLW%>kg?&AMlmp@5@vMmsazWWV3+R1~G0s~gCf{X6_om0Nl|E7`JX&fE_Y{nsnYX)` zErkdoj?SbNpEdQ4uS`0Q|CxEY)8{aop5~l63T5Uo{UIUDusm6+xFiig{7GC zK#|Te!5I;Zbl^->mKMKD^n+2g@m#Y6nhgY|9GokukYs+lXzg8rWD60T)1ckpLc z<3qqn%jXq(ZM1|RpD$?=Gdh}UjL3T$CLH7>z z&Ss(s({2-eQd&)$2m`cVxFm=LMxf#%*8s}&(G@IJ?QJ&~3jf5!aI=!#Ei&LbLhPf4 z={XpM149(Q?&{L`aR;8FxX;ALxoIx^Px+abIFs3>x>eF8HR;n(?xd8Ph+Z##?xinTR#H(cbrh&l zQzLpo$lv-AbX*A;e0q!e>7EN!%ae6ZZUf1ocU94EjtztIZsz~YSkvg(Xv;$IDuImc z!JqJHkq9@47+rr?lqXp$6koeSgxPWhK_%DKW`Fz)s6r&6P}V&iIR4CN(t681qQ^jw zLU}nhmN-X6xhFRfwj0UbxR?QCc^Bs@56A3Wj7xwj&<}V#ReruFUOAzySZ}lvicsQch0GaPL>j!K;)x9hxyAX#>C-qdf1&eeZ|FXJ&rfTZtVu=)*@)0YBqMLQtsuQ2O<^Cy-*$t?-1}LZR{GBu z?{itTs)`i^62ppnI0wX#aB%WSxEcYNTZmXBbtleN03Hoegmcky5;;^7rGE+J4&fuF z*O?#Dc5zqxqj8#P2k8b7XMSDx+JUgV6O#Zq+GN{bsQxBSP2(2lRG_ZJ%59NZr>zsJ z1gemIKKo=vn`^u&qHP#;-$Z2ZfHcSctTY~54ONRJ)u=6FkcLrMh*>Y5vzV)9LZ@F4 zaf4}d!t1jiG?gh|^BY78m|)uliiMiUu4xJfQz{1;v*Tv$)B;-F&W&H-9TsSNR1QTj z1;ON(cFkT0%+x10SG(rIFXCbblTufsq;3K{>)K5kEA(qC(Z9-!U8970OQ-_M4=N?! zRYK60i2+`5IyVBKx8Vnl^#_CHTAo=w(^3FxY|Tvbnks$R>}c-$AF}-P$S@l!JwAC4z*T!A8i0Z6d|v*?R65p$SQZ0mu*8& zbHjOy@2IffroiXrne#UUF#`V5Dbv`Ww5da*pDc+c-x5dvXgYN8j?}q7_i?fSp2?tv z{+!}KcBiEi;Gx>0Y@9^AP*Mmd^1KN>C!oKK0lvouoY z_?n{XksfavsoDlKlqHgHD~JJp54&)Oi|aYqFyOszD&ha`8y65~%6qT*V~#jjaAUd> z_KkedRar87%0_9fKlZhu!-+=z$V|WPqtds9;@Jo7)&l!-ZRy`n6JKntopSv^1y}^f`C?^rN}D3gg@vz029L zj0h<;cxO_UY4*^svqK$eZwCE0*pDp4U;VC#?r7jxng-O|~jTT70u z;|jyNe;RZ=THJ(Roz9^)J=DT(^u$w$FKdfjW!hzpA}Dc-ZC;0mS}VCnk3K~?zp1q? zQb&458O$$GdI;WiKLj5sIp5wDj7$TOEZz_?%s_qx{y<)PJ}z3YIjl`b2_2C=GQOHE zmpLlzeB$OQ3g==kn0&va;2G}B=Ll&SVCq8Tx~LDqYz%(plc$ut-&Q@thGFo}L3I{NmDfa0Z^JYr2h0BjB5d~3+$7_x! zT%hE8>-AosX2=PS9Wz$>KPI%QmtV_QCHTF#TtVr~F*ZBPdU^Eh{iI}!UBn{iJ{RMY)XDuhO~t3^ z{Usk;GJ-#b0}s6kv_`^RSEG^T>{rtH0G?$nNcy%3aC2!;S25xu%7Vle8RP;ZVpFXQ zp4H9idrZFasp%`AG@m3pOEn3oT99ueW#(jxZgihklkXKPk7yQK2{|C3^JX9$8-1Or z7T{nLY?^v}3`^Q&>kqn_4k276(ct)=_2B{WXP?FCUT7a)UK&0hUZ55S!}9_QEmjt1 za&|mBC`BKXj6j7&MXQd|$&{W(J6eM2m*+cKG+ zYIX3Gc3_v`)QZDM!iNy3LQaK9X1fAOdq-x88L_%m1TdVJLXFR}kSo2AKhLoRwT8+G zhbMFHB=tc@I0VKxh4TtAgxHTO`5#uQQhf|EGsAu+-7+sM#8yD{MvxEqjq)d^d zGMAJ_k(54{v{{j~9hZ!2k&F+Q?1LiNr|T28v2rm*>Ml!id0YymMGCd+auG#m1zd~u zMT%owN;5@D%QsxgTSdx8T(>WZZvQD#ZZASmz*XpqRoLK2o?@g3Tvf(d)h<<)l~c_p zUDfKV8mBdZcBY0IJZc1uUhLWNxB1qmc2bUh@ra@&wTtsU{LEwV&}Ahg4M-DZEd^QLpxM>OC!8ZEnK^>3zQ!QG${m zFME{7`?$1>VWz~slDA!}ETo@T^0cI3&@EfqO;@1oNoke`&z6CVtI<(eMR!>kotcLK zTDyVSUpwO|g=wS_ySu~E6FT=w?irhMILQ_#m+}lkkzkWBoU?XDWIBo&S%~&@e>k{> z0(Nt3MG+qMyVbF8wmHBmIZ;FU8VY4_C|?v$w)55px2IijtxpAd*oNVYpQUZM`E z2)}SIa99p8S<_Z7Z_m;Rb1Z3VomF{o8^=#JP>FD3DX9aZ5+z5gbXq$(s z-nHL-cU1LWX8%3Wf%rvL7hQEX)4@HCSAweqtn#Xo^000;Ax&{l@#luz5F??seTxzT z5ku7E2j>Ls1JU+{lad}*6QtPNZf19b0IDolonTc=_1dUjUmh)uDUxq|qBn1D_`%&& zDT~qcs@Cj%RDR{B$5ri)&Mg$eQ$}Wz42M$!f|L5fBW&I+VLed3!oW*`no_#F?8^R1 z5{aCYf@XHl&($OCRP!VU^QAQl6gvz3!VE1ni!;L66E#a)HA$<7qV0LhRPe7eYixfG zrHMpV*^U+s5bnv9;@ZM%$|4&YM^IsRYNpx^yQ7=~{w<%Q@0KFlPha_XrdEEA5ZTR3 z+o`>`TY6;C?J-$dyMIaJ)pE2yRx5~4srGC2y${==1aq_in#b|p=fWcm2;hWH^u&{4 zf=Kj*OwF6iZUOgK<09TiD!!*%AK1x`o+pT?z^aaqL{bN=pAS@C@WgGKefoa+>DN&F z(c^Coh9aMb^nNw?CiZimK<=ISzrHf#+J7esad>@}4f(^9dP8C=>}>xh+w%Vigh~Ht zmd)^A@FERxk@7!`jxTpZw?c=I?(RRGr)|BZ`_s&QaoR^`97z`V3HTu_|vW`_%ki>ey_M#QBR$eoo}C8`|ANtt>LO+Tq*p%B)_Yp78eNr#Q=wf|2D!kb$#zT z{+7a1i+$67CBXj{2!H&`0Oq6)kM{qU1h}}4lK@A@C;vvl9nF)UTK;yy6|eqh8oc#S z7d$inW#n%Zyzs9g_#Xyv@jp56()_?*{cmM?J=$gcANudV+`pawguq+45cm)m0^=&+ zqwc2v3H|*?`TKo#_J0@d_y0F8_`mx7xMrD9o#}tyEOY$NX8ExnpF_DjCxwV|irORq z3ZjfaTrb-Er&-Qrg1*QTQcJUl?^E50=G98ZW6azD(zD1xvhh57gfgg;^qp7z&+?;D zHVKpQA!lfV4xl{zQDJ!HYA^0+H%=hjop0CLyNuHD>qQJF_3&KjU?oz?c~a>{v>phj zh9mTIP_bB22;ZId8E@T=mcIfa`$ck_w{xMQZfZOW{kP~^%LbT~w)vf7s2qCPl%ca) zU&LPTK&o8xr!}==YV6I7-oFGwH@G%dDI{tg)c@kn?bXop|F345OlD^#@;}Y;Y7~QO z`Ra2+hyK+Uu;+Y*sHynB&2lLQ`$C{)XDyaK0dGA{YNi|(>#UyqfdZDBnv^I*q_tr9 z7_ZHe>aDHwMz|$7=&Q<|2q^^I*ht6 zR`V~O7k3QI%-|KdUHC3ZYW|F#%s;u;^{hFYO75T5-$<1r6E!>q^&a!#(^2raWBaO! zy=7m~J4{;cBR(dV(NYXe5N5od3jY{co~z7ZQv#2u_Aj@~?g5HSf`M{A|B>+zsZfKJFpYXbPPm z<@CKyK9Ds&Kj~+A(-B_C`aKOU1)eL93sF?2dC#`V)YhpFEBt2+R9fp%E@ z$AP3qj&PrKH*g|!9JJOyk0ti-ub;7=%#yA#Q0Tq<{@FtHjK1@d^9)J3O4Xz>sZI^7 zR?&)sSy>bQ5@Rq|h0w^Fr@MOpSR%9}FVlj=-#i%~*RE2ZY5G{FVLn z^(Bpl=M%tl1LUl&laC~_ke~2g&f}|n_(t)<;lthXGF-D<9l(cSulrZCto(bcX1f;G zEdMzAjcb-gua5iZeXmXicwgh1W!Z06->KpSm5#>EeXq}F7c6R3rrkbWC41++`(C|E z(YJmft$(9%x%}p}0sb1bNf#+q0pXCiS_@;EzzE@*Wp~{o4YF<`>Glb;kl-Sg1=AP(82<#{YNuycW?ke< z&_n@GClvw?Dw#fiey3YY5d1+Dai;@^wqeYfz}ZKQrvp%+JOKlR7EHt9G=6_Ld%Va@327>s&nhZ`h|iE>domXwRwPoZ>MmzrM*pQ* z>kz0ki>0yf`5>Q>=2|3F?7Zeq)SezS6`(2tzvkzzlPcQNApJN9_StL83PeL#T5DhG z=Ur)2qHWHK?jl0iVqw~TGKE&@;v}6r_QYp1sF6TIabc7RvynN^%DE=gyF|AS1kYB2 z%0BZ(X*aerG~f8paTy}K+{haum{z(<`N7@#L6AtaoLM7u@Jkmb6MJ}H8ECY|{EtM& z{GKvNCc8Rxm(e5P(1N91y1qzim2Zz1elP#j2Xc0?L_5eLDel91 zJ(?NDPt`8C!j@6ds%tM~g2wI&)ZRrAgoQg;U#&5GYVDUDJ4q09UMF6aRl$7$MfStJ zI`L+ik@h@o2~}>@K^{$Iv92X0Wd7)tl7?2_9g*bvN8P0NEC9)UQ;mGeJCMeic&g4N zEGr^wSIbdBWknIIPP(>9EiSLt4G>d& zPaSg?Y{VLx^An;IuXUPglTyz&+!Uo0)LT}7yk6a~31!p)S2sv`Amog)d*dLWkw{$o z6n+mPA7rc?s`XKRm>c>8rED)X`Q`Y$Ik9galne$Pb5KRMJ{^Rf5OEl=|EBRn-Y^aw zUf)m4xsdJpb6)Z6I+cR}dU^r4B22zUfgNUyb^G?;Y!5EoS_6cQD-OMJf^%5tN~tgL z0{3Mh)-VDj49sv$pr21503$Gh5X-{A=0JRx72vWaekhE9t&WgE>FamuT0cRZ{8zPcn#W~au;JXs;Yagk;0_27f-VzH*7{@0qQ+zQ)HD<1g zwfDiUI0KR*X^x3R@rXI|38E2bHk=mO1r~roHnyE}9{>b6z(06_SUiHsZ6G%Pi8z?} zRu_o2oB-*EOP<57%?LRCo`}{(8Nmo(EBKb~5H0txegM&SJ=*eS1L!Lz;w$zf0!9!W z_JU>{uv>XfiEFkt|b{jv*9<#ZPFKa*qGa$%F0o$j*r?#J% z>;S3qsZw{s^d3O8GC>n+29$JQ|CGdf~S9gzS6gvG{0;1OSf+~zFq z`!l@o&5s9mgShDvu6e+#m;~Ja>3c7TRx`l|txvHl`f~%IZvzQEKk*aXHPuybCzf&i zJbysZjr`4pr;!R#hZ7JL#2;fI=b9n*MBYpsp|F!@yBtBnli(-=Fm;_5K?S556T_#H zM8im%^d=+@`rxB1C-^xil8%^uJZK|adpHuGWer?*6RenK2B9BEvqwV&rEou~942b` z5y?GHZuDW^w<|d3b`ek1xtS2kZrP%v9Jm&!4DgeIMNQ0&--XcyBw|DS2 zXLg82qQ0}6wTZ|3;nPC^l74=U#8gohkngf0s7K7lWs2NE8A8zHqwJQHSg=bM zXp;zxTme2B&lI)zTi985fl{@o(jR4o!9~^cf$m~Yun2r4UM!~=2!_qk+j>$c=f&p- zsEQ_lh2bmV5m;b=Nyh}DEBFk40D&6>{#qN=d*Yn?Kw>L=UhE2?aUYm74E%Z* z1o~YdbLSV_cwj6xJme>lljPG$5I9#Rs_vIL`Ch&UO%%qXz#Zl+uMtAPFPmK? z9aF@I|7>cjP+!ZBW5R>0tY~{R9;wajJE){r$M#I~?gD=+^Tp(YJ({w1>v8$0k5L`r%b3jDyo6aXKK8qW z`M7h6bd}qsK%=@!_j)Gj2A8b(Q(rh0~8~RX~9O zbwt`92#)q@r9Kcy831l|5w$*ktyf3rD+US`0|gim1t36y1|i1TLETLN@1E+x`RYFo z0W>PU>qfV%>j2cl6}K9RjE;%a#cEMvAf{Vrwx0wph|1T1TcInU=8T4M1yEfPC=vp) zTmeYjYLv7F2Hil2{Q+5sKS2daM;+%{9j&2n5?&Kp z46GhTgp2nX_~fm{K8qH5wrrl~&=0AjQ@B zmS>Eo@_+mouW_&d7-9el!oGP10mqK}0>sN6#kA79wPGgj4{x$_Ye8S@K)!thV;0JM z6d*B`<@7%~x&$Fd+a-^Gl?mX#4HJw98hR^QK~N+eqsARvDxIYAUYrh{lef5ZIy#4^ zJC|>m->uzxx3SNO2Yk2r^4(s?y91px{e^dH+#S~34#(E-FGAk`eEI&e&W|BNU5j=$y+NA@6%B!!oiiYK}vln2CYz;i4V5A3Kk<& zE<(^os{ZpTRf42`;u9;CIfZPuI@?H5c_I%%%g~VCu70kM{j!i-AO{yh-TWW7zMS{o z+*H|wR(~X`>cz4QCMyo6+6<JKMV7J5lsJ(82a*Zh z&u{UW3_eX)L%!xfmkvhvZDi>SXr@j^SzufdI3RFX=>>d@s(`5oDeya#faiGRhc1K+ zF^uQPNSiwmv54UN0-cwDP#S#VWTmndgD4w}P#26t#p#Gt0@(^M&Sq4Vp%8-`JicBQ z=p6#%BnTM2f!TNq6H^~9;D8C~K~&>qIc*taL4ue z1aj+y?~W0D$oLe|$rPERy*RZLh2tmdYly8q9&R4&sJZm0j9EX4>8S=NK}->Gtk5rpZ7aZ%@t-@_m#SEiP&(KD`}C?aNfO_kI8>t zhkTxC<&g+2^ba}I;t&$aB2U7x^w4nWtBeGb{RFT9pN@5v*@(fqA)TRq8R)P=$RPj} zfqqz0;vHX-@}A=;7$z|!Bo|)>aV%*Y;4wX2VpU!5SX}-UKA8j?=JVlz+fi})Km^zr zmXT0(R^qZlLcci3N9ZSFeCAzNYFiPip@LP>^;J@%2~LSg;k*@5=x3nHf_VZ&PZ<*P z6IiE5{e)bL4myhnWqZy7tI65g_MauHUx`z3kVt?i+^|tiy@lW8Dj&&g)T!4Xvt zUVOuy@jTpLl)FYgN2=ZZBqwv-d6EaU5Ur=sOCPAeGR<6z+Tv4=*`sa7M2yk{QXCuP9Q#BC;wQS_R@fvAZ@TtdeApy?AvIUW(I@Dr`eT};jXR@b z)DFiC(C;MSrxXr{jL;MIXRC5g#|5`t)~@i#Z?ADV5GIM8Y$!vr6CfsG=RomIZFZ>b zHwQnvb8r$-Qr!rp%Er+sH1nG6?CFfp4STjBTiQ0&l`_;Up9shf4Y~_4K@d9Jg*4fI z2Z#S8yA5?SyC8KqV_ub={_`XKYQ($7Nfn3xiCzE;&dF4MS;k)w8?G*rLj%@-CiyNQ z4t~8GrHQYFSmAk;=j}cJ`s>FM)Hd;qvfw+7xNP`c$gT*Ka2%+y273GTatr!}_~S1C z$0hH#tFRMj0N|3l092lMwIlwUqWcPSbNUG^K1W#an>75qlL|U7B1?6$L_D#(aQ_cB zPL%%Bypt|GzFYtS4{;?Ov}l_X>g~QhZMx7o5^hiiB3|G z6DZ$S(ZC6W32@8F4Xspu(^}`b$xR(xvz&e9K8YrZ3V|^3xfjAA5w=9iSry08>d9If z$}DqYRK{3EgIYsy^NwjX;j5nrrhuxh8r#OPP~@}=U9FR)E52j;3Uvt&VSP^3Of9m4 zlb>QkjI%f`904LBjHNDlP7iKlpkl{gXQu04s=g11 z3{NpGWGgRj!rhHlc~xE2aB*{Qkwcw&@g=kl(M>?CNwD_4IP+x;<6Ul6i3cEbZ`7Sb z2l*dC>0}0<(kqmb=?}OqHJK=z4$q=lAP68Wvn+ zqlMJMQ=7&$u$4`xI?-$+-->wwjZn=(0%HFDZd3&45Y~pY;!Rv0wU&N3Cz%Kb_h%rr z?)0$`iL~$y%dpNtKEqAL(0r!X;6%NGkT>OR?g*L!rUl?V@l2|?;;t%%NOB~X*%O9;0WkW4l!2@GmZeX2&&@sSSfVIC#It!06oeJh=;WEaRkg=c)42shB8 zGJ?NBWCs=lGLW_XBFm4cpezh0*+ zz{`?`Sdubw1m6hZPTW%)J>Yn#IrOmgxfFsUdDtvDkS{`~!;Hg_cx@FQO+3UI+eeb! z;ux+BZicCtOWZIZAC%F|!r6za6nc4whVKob>?vA4h{SaUZJ`^Q<;(McdynAc`ocSd z?wV^-r2`WCP>#puqdh+5ww{)WyurtrC2%$JDnIsMDPn*2F7HWB(Gi)77Y&juOz=UF zQ3rPm{tfZb8K+iZq!lTrHD??I_f_%mzG86T2Prvx$CAeKHovfN`lmn1=tV0ws|hkZ zzCGqX4J=Sf*_z{Cc4OBHDAH+{xxj|5uny(Fpa(u$8Q8Vq%y%Pq2!#XCnlfUo-9|{(jXk^kS??CyeeyM8h0PiU;#mCtxa@t* zFZ>W5_?mi5uo~JP3%{!~^Mr_sk+E+at{s{}1lXd_?9+HOTS%|oYMxXgEktFe=E&Hs z79pBl2h@`+()NBuAlTnJ=eYQO$i%p6Q(IwE57fv*J zC-XZ6Fva7fl&b-V^;*l;XmLW)Y!;328;GKkJ>YGKaZ0EhMBHzi>xHf}yl!V`wR0st z#mkUMrvWYVZY3;WwS*+95s^Gn&&?3Wb$8Z+3LOvOmQf5Bz5(@p$+-{1qd@@?$phv$ zB+gF`6nKR1StiS5cKaq_A`ANEu>tS;GHBNg#R-!UNnZD17GlI86WrU7iljoz)E6zk zR;(n85r>XW#Azx+Z4d>eG|39PiUoZ1Oa60dljFD$DdUbPn0Dcf+5knM7JWFp$?+%- zs77n_F>tH`h6py|H{_f|AKTk;Xmuf&#u?p^#3DTBTgMMF4L{cdi;@`dKFpM00oZLf zp21yfgHy?AL_mfP3IF4#Ry4c2ZWTgFZrWqGGY)$Jl8UGVwd!#YNO1=r;UU1;h(&*2 zeC?>@=S&PW;})qQgRjKs8fqd(Pkz$s(0L6Sa7SeGZUjYg=*5YJR6;V70&jTXbH(i1 z>dBp1AF@O~N4yB`ngT1Wh(pc7Sg={_X`e=VwYh6z@ywU-QV{eRTgS~2$EVZPytM;L4e1z>lx_E zqif1rA9NJyitOv&2^@?>Z_o(znZrbC++^x?k}bVWUtWx&=<@K;ANZp9J}LR8&>2fj zAHOL?vknANubJodqq`b6GZA6nDXtkhORkCS(b-#&rzL6+@AwVTaGo$%y(4mOd->2xjZY}QX%2W1Ji!Bhx?;6}c7%88x+%C_uw{}{WgfVNET z?lJfg9G4wsnI|Mr|=tL za!3ZqxHEmN> z$@Nz)*P{(ctd-ll#Gj+4J|(b>EiJ-AoSM z$=yuQL=p+%w>79Ac%{VIB$B6No_#k(YR+Am3BQVN*6cY$57DIEm^)K z`q2>ck}Ci9m1d?4XGh|@kDLNZHslZG`y4pWM}gsc05yx5-F~Og_vrmDQxrskBIh;b z4{o^rz}Ho3Z{}#8)zcQzh1j)=jIL|x5Z5bY&vLRa;Gr8oKHkc&V4o~V-gk`1<+G{Q zpF?gRPBv3QJ*@8bSj^du5NDks6cR;qZf$Z5DGnZn-1zuB;{{F?-qxb=p*)-%raiBC zKeVUQ)9K*5b^bcMP4}^7z-yTEB^CbzRklgrJkZnQHJO-kc{Zw|l&8NEb3(pnSa)2! zM!Y7dc&FV$>2)k+!u?bwnK-x-#I};U{i{9$MX)s(+pv>^HX!lfjEC2;D7kZI7?AwY zg5ar@0a-9_#qdv=F>pNcKUfkai^w-tWCbe(N-G4$!x*sBy9hs?GF2Q&9DihmLAA&H z)*;Sb=&lsNRN%SFjXu{HH(pyCOb>pLp24%r5K0Sa0ikZ z_NIpQ%Cxuh_r-{&cK`j$!IzFx<6=-pI1_7@_vr|MRd?`yukWe6V{>t3n+0GaJhjGIEh80E z;x*XbhqPuIQnAsAz-qHgy~dsb<^pIr#IzRpz>kM8bu{_XQtX%IdgZt# zaX>d~c4Y8GYLQI;W;O2CJ4v~`K8ocy;;&wBSH1MNZQ9r21)K2bji!EV=op>2-oc{q z5=;JWsKT7r`$IIbgXQQ+>hO+G{$XQcx1Kn^(5q{C65CR9)W2cNCrub-h^s5wvqGdVYo-)gn~v{uO}t44a8WDC4`M7 zm5inIjD<(3Z>m)=g6ES}<&!hhLtsNH;fb*^IG7u1EPZI)&y~?{l3Aro)!aHIG?)_s z5lO6{s>gdzqk^#*G`^iXodZwj%!$2)0V+d^zWt;a5Q_OYO^3QRNy979|7?tkGS;>= zT?GzCVbqn$M^uzXA0|z&8>Uxq7Fd|-etG*Yxz1GV(bV*aev7lIlXTMTz_j&heX2pn z?Fz>Cie?^5EihCBpP`u}Ev704?QM&B3qf1Vna&Sj)?d!B(tcr9HMbIenFfgX>Y?K{ z8Xseg0kjExm-^z(l>=?BWOd|X`^_KhU>3@15z$Gztb<`?;0R|mL-XMW30q*|EmAOF zR+21kVmmEtpIF2#StJ}UQ~0@Wl9(1oOkE3S``Xg6)9O2>sgi9T9tZRl|8X4x1E2LYgJieRn=)# zJ!)06WL0};^{&{Io}9mRMEfmBotWaCvMUE@$+^RPXBZ;HS>ms8Ots(kzJxexj#E8iJ!o zg{?=P*8X~c>`yW+MYPZ8QVQxTg=@4AEp@mlG)=Iu9pXS(yZX!9LGaP4ys4>q(rW#g z!D!a!F9@S+^3jGf>)JRS)APs`^2Fb?j$CAGoat|bH28#llDH|>zw?i#wbDp!ncmEp ztdL$Ti6o5k=1s^hf4!<%mq~X5@~q$f<*2k}hx+M+c&8_J_q7h8RD$0ncz&MG39XZ5jF5pS7Y#NyrUk^kii%^5AOX!E`qB(HANS= zN-VBO^w~(n$k79gM{dvlxP?*d=mwaEi|kaR?ndgn`9gpUfI1v^C9x$xbHQ5#E(cM2TZ36nW2ACAQAHi@hT5LZGw%;%YZr<_?cfZ$UhH2T_Ya`lke0uNA#a?6WetXM) zhyJ~HTlZSn4jPvCTJc*iY09r^AmraD^{7K3uu}bB z1Wm|af(9qgI7Fp5M8EtOIOFna@PC*yzSUpYxq4^_U|7tT`!^ORyOI~J|d_MVSC0dT7W^l+%#pw9d=;Hd=_~=AO^WPcir#DlhBU4k;Q(rfx z4u4O5|10e%EX8zx>%=qBK=jp$;%=+bj@iPCmWzLu8`~STsJ^V+N`E#?m zv%mGeW$W~Od!l#m=xTp^_g|_EZcKW3etG!k=KIm%_w(Q1FVD};&d;x|fBds2{XN!) z+ml{hon0Rt+}zy!ucng!H#`V8=d?Wk-_JSuj4S^eL1WCr68W0!v=HUa35}NTfE;*K zmQEDmj;Q`6XpCcJL%ONvV^O)`4q&R?3hcfa^7gX_1y*9bLP+FCGuq3Pf;hV%PsLoF zH?>P0!QXk*bqx5b>i{8V5#re6UKC(qhQo%&p&}ezdqJXFEQ~}t>`iM`y=mP3l&>1w zatn1&^u5UkvqM5U(%$-vB z`4>TRzCYV|@9S7+$B%C-y|Fj!cm6f!th)Q@UFYu~$Lqtd?tJB_4u_roo1nR5H2aDp zXnrm~0fO^aBK|e!{0Et#aa+O7Id@ov5Rf`5vL7CNID&@Y1xyEbRC6sxXeOvoh59iH z8`s&#R}?QZgMnaNpv8nJUKbkYShYR%MT7}?n}G*C|F5N_acSO(SV;v$IDmpotqY&X z{}CkKif*HTERmLG&eV{Qu~>wSc5*neQ_gZDr^uU-A%$e=3?&+@uu+_|{8__*)rN7J z&yk79K2D?y@ z#mxn^i`sxaqssFr{N5Unp%xZEO}DX$kc9yW%1GjOJyd+Piy&YgTr z-bla2vPIbaLIq)!^^2`Ni`)DpdmgsaOoA=(d+rcIQr4G{(w7fB$Gx37)b*7YTo-*bIg{o=rdITU;mB za^gKgIrX?#YFpZGlrmazyol{lxv09>y3pA;k-{DpuanOLJ4wc`b2eo#HOP?(Jh_4< z8oJe-V>s4!&cE2dV6Dz5@bSKwdtC_x(7}ohFBbeh3jbIP{DPZv?y5)sSPt#I`BJ9A zBI>q?FyCGJv5J{8nI8dMKY>te@X#CHL5G#lTE%eJ{@UU)trkNX21Co52v^&LksT)_ zUp$;4)0c(b0XTvN0^R<(O(!h!NcE6v;x;#Q->!eGy!gZ^Sel9>Xm-k8D_@4ke*5$L_@n5})!7%{o9mz3uW$Zb z{rHA^wIR#L1ECNHGzVdag82mW16@SOLwmA-e4xt%$YvI&6*KcdA`ArwCMQNxlNG2k zU?D_m-Ci)70uttALb=qe`cMt=5j9PYI2>c?5wQ4e*2T} zqedc}WVcW_N9E2!$Hp{)fA;|ix(I})LO{uc_d-t*n#TfY`8s6*SE`SB@8ejst~_9t z9y)+O>Jtc>Qn=Dkpw{Pt5Q!ZRusJUX&vw=%yXuW{6wUv(ST-QfL`W2`(&l(OA17lw zm55cGU>ylaE@(T94A(Du$o9Pl=P8l^m*Yh<>I}(W&ICZa(W>GWLxygGj2VIiaV;HT z6SA??GW4VntbW)wUMjuTBZ>d+FDc9KAO^$oD5iTuBZ=!N$m)1)Ay~msQKkd%9GF4} zmlqgiPxBUWXbYy+3piQ&p}YGCVxLXY3OFW}M%qfESMA_t6_FXvvcrabL*p?XDEWxAFxWKgZD@>KO& ze`H~Dv4`$-3ov#eUIgE&GNiHCo?R`0)YYX|Yn!SPc@M9>!rBZvHIi5#)vCcug9jZX zRd06%Iu!;DRrtuLEq(a@p$S@7t&ZG9gqystV`80Nv!-A>QFeS8u<+@T3}`iyqx;&E zc42$QdW(5OjeGt^5H$_sz9`fUvnh>L+wbKW@wmO}W| zf@Ulws$0p#0TUhHIuX9!YAIO`jLrgu?(>IAjaF-s=X#y6of>wXZYQ7ZDQ|XB)nLU-ht*o6>*%EWLXk#jFJ++9nfU>J1pE+W`KeK$M z4SDVBM8V3|H$spL%CqIYVE7f6gR?44`b{v`wkDXO-h&!L-(fZHQT+N_bw)+speVU? z8BA>@Tz`JP9YdnGSxaVxemqAd+QY6UJ^U=5ZF#;=6LG!Lp3HDT`gn`mmb%M3oA8@g zA-RzzsLl&|of#bld2?OQq$6_hLy4cB8z>WlkNt1X8TXl#CeX-F8I z%hi90Z?ocgdwFzWrQDE4`FZJi)&eH?b!((h`2;f)N2K(iL~dzA43F!#kyJI06e`fo zn|C2&jZD2t*|5)fNB4Tz3!vY56%sVU!?_rae#7J*p)HXZl2-txQ?OOO+D#14rXF&~ecyaDIjx zwPS>GDC^|a9L5dQ|7zd9u9|oSn0dqokVuE92ILVw(r$vmQ?66*Z+J^d-1bqE!#-(8 z+Fi}Vf>kXc_9l~WA=oZ=x}q?_@L*J3P|Pg3z^tMSA6AVdQ~?EOY+(!duw>yT4HDYI zKjqZAAelZ`aCexToh7}gAxCBit13m6gv8!kimL!x?V(9K(zImVLpI6;bO(^t25uwe z<@ijmc0oV{6TtxBo(~9|3>%VsgvM|teCF&K@EUZ!!Fc0#Lmpgl(sNx#UY11y6i(iN zC67ghLewb?<|%_%1Y(JjGJJLcKO&^o+7sa#jxLtz|cDHc?yD*S34bJJYW`$sT~l)1LZsI^WxX z2sS)WQuod$6*39H9vu%pBC$7pc-udwvCN>d0c1GG+Rzk_F$p`Hi7%4%Fl9)Xb}^mJ zR2gfEiw5rdcT>oa!i-)gTtRd4E)Uc+5E=yOpRTFiU$r<6JY+SkIVe6 z%Jh4RYKdsHD$)OPY89)qNJyk3eej7z44>z7QN}E2VHG7I%Z|F+qVwkzoRWdpclj2hlRJGYm9n zfxry9gzs1YSPXcNS)h#{qDZ`@j|3FEBB9+d988=`-F1JgeXgzvm1SGrN?BE>|`<1 zXHV~_YD&T_24V9Dt!7L$iu?Tvx_YjDLMJ^ z*2Q^3?*zuO3gufe_ni@Jvg9mZqQHYC5w&=I+!IR)ve=B>-9NzLP1eeWm*ccLzrkunbTs!V~w9Z%ZF zWx3tAwYyVTaDMGNlrme-s$n6tHxgFfhqjPExvo_)vR%=1rsUXCdHY>u2U}H-d{tkz zu%KDhV0P7TOV#KXtFFZ=YR3xQNQIZs>baom`RwY&mg?oj>eaLA^)Jd3Y%kNUzTC{# z{uJ~QoA&a{;>&}xm)erK$MQ8NmNnmlYJO(dK)z(1E!O-!t07^})?}`QSk;mR*TSFG zs`qJ9EY;Hdt_9p{4(00@tm>G8>sX%Ev03pbFerU6sSbYxtT+OH?vHNGl_O zaBX;o!;q@-I4__tB~83&lC$(ti;P7m@M%>cgWL0-WCR%Gv4pTqr3O^o2w_lBdq#(0 zM@*SC%%5q2jvA7S;)mcWdJAZC1_|eqEK{^Vi}YRb*EdEsp;vb;RX+!RlNS2`s!?dX zcm3^4cB{rm!HogW8iQIJLzWuDmN@Os8gZ@F7Lu$m<0hFn=0hCtN2fi2H@5f;_Df2%ef} zz)J}%qi-uJU$1Qh=xhaEE>U&|Ge1`V^7I@q5+tCvl!zB^c+-8`)9pn( zlUwM+-BI)`N*6xuQg-0^CCUc~^t+LVC9UF*&9wLY1vfw(=N(L> zloLyo2@*X#%ZM*MKrzsRUZ!+K_T*sdAyf9TZxECukn93LMjsHdMwm+WB;@s?^#!kC zwWarb;Q1~kL^tqJFGF`9<3=y6t~UU|lc#sV0E8Eb8==o%^L`gy5;@1>G#hEItiriN}KNKz>VA-)6W zOF-3VMBT`s{b+Yi74Xah$n-F!@f{&YWLRfQvu+G>`7-v`1Jw~?B~^mH7J%mHu;1PY z#nJE(^TQ5Fn-v@Dm;8=pI4d8wLp@Y%|`Hceit?l9`{6kfT6a0f6)} zbX*_UECyRCwll<_y0jk=~a1+MAye$xGJD$*&J90Xq| z;_^wTW$3%rN`%Qi5SsIjJh{i{{xGv=L-0q??Pbnn60on$92Yg0o&K!1WRiX8khU7) z^)!GKMF>p2kC}Q0k({S6kiEZxm}v#v?+;VdPLH+?Ybvp$Bc}+w?|fG{^WvPLzV8D( z-z`i_Q5(OF7y}4X@PvJ)f&u^^(gc@;Q<2O88w!HwZ8~G~vVZ6x--^eS)|gzb z0T)8?-ADT&1>*ap`1y2C;01CFmOMfyxjYpQ?8m>B+y|;JJQtuxE8gHdM1lD@=Tu0>q#6+_7te)NZ9h$+w%UQsC*qv>B%dG~6Bi-9 z?0Mp4ChLFx^m?r_@{LX}<^o~pUJ~0|h^fzdRWsuIKzpcnO!bP>PPv@o{A6n#{0n>_0r&>Ez<(G5nBseBj5iU-GBdIdm|166V#`m&mo!*bYp4 z9HmV5y|e|uHA9Cq+d?aIXuXAzfUnXQ-GR)iUulju$c^7JTnHiaN#fd<*!H&@r{4D~ zCcWTTWk9*A9DRLgXhwDUStcFxP=0F^{C0J!@?prygXiu?AOz=KAYpxbP!wTG`<=}G zsGaBmS_Q5FuV7g#A zHk_nBTB1js_Q=A>Z%$Cf{P@znLw3|lGY$xQ^oL6VaRxyA;gMm|FS_KPJV)|Mq`MGb za3jqxO5eFm=U;7gpV;lsSnPk0OP&QNBT}NjBmMv!wt#H)J0YcBg!l&Z2&^EL+Hlt{ ze0MV~?6&~t7aDJ1y!8qt;tYJz{hN+^%rohm%az~o?!%Y2fTJ>?{>3?%^e6t;d13zV zC2Jt)?h2Xe9$Ee=WgQq!3dHxE@R$?ra&a+1LRaVinV^C38Wx#L^03AhGq7Byy6n(N z|KXgDS0dYObK?mTCM9Vi7UPZ<0(=G$QohlV*Q7?ra2U<{0v-R)xrER(@%_TLJnA?l zC7kH|6mPO^0>yCcJl>8w9N29_mH}@4TH*z=Xw&ul$y|QPipZa?_xjl&ufseBkq39X ze2bZu?HC2(yJEzgaCP~1tEozy%pQfZAM9em)DHHp4X?I3o$Xhu;U>GbNd)724`taL z=JDCgo2qi8Y`ezfH%DocP6yry?s0SQuONxuZUsvJOvjJ zQEhnwZa0ed1Dn)%Ti0+Q5xpQzMb#FaDZL}VD?aPR|JMB3prG;9_`%4o@z|n{7!Ji9 zl?W!E?Iha+ckMTS%uTRbkzrtcvX_cy29&8RA=(4BqNYbfL@5YW-R0lfQh0J7rA)U_ zi%WR-rJ#)tbfq}I9JNO?aKsGRM)uJbynxq7zQNno)xBBKo~B5wq!5jnfRZn!j7d@Q z4M}1QdM@^`_^PX>>NixuuTYUvwS&47Iq`ZkotbAJZ{hr(ZR^LuiwCdaWutD1s=-?# z4e`s;gt0{I?9An4r<#;mlfEZm;D$)7nvR%QVG0t2V-y-W(qEjGr0r-B1SRn#Xx~0| zX_3B~8j=eiAhsR5>EUhp(vd!h(bOUyu@BTdG7rnkY;Xk6L94X1m7%g@7gXx9(`ohh z8ftz)RZG#}{5L%AsGbZp(`GRpt$NY3DO9j@p-ZCKR0ToQN=Isn=T!8}z#yWFQ?7-; zG1~Oh5-L87)Ym;WtQ}yhHv6R2?kWTGC2=rdm*$%*e1T|F3Yt zMG-Rx_cI#1c&~5sMUOwm7QyT|AG|_Y2)TL9MbEhrD(eHq;jlfrV%Pf-wx52@+qV6k zM7E}iEV?AZKeRHJbIv_pYRY3<&aZr2z`PPea$TC|^sk@2S;YAG)1o`zZ;D$F^*jlF z&8ooxjp8SXB73v+>hMP+Tr%3}LG%LTIxDw1LiyjamI@y4<&4MfMvp5gis0`Ee-s;W zk$J|m!OhbLo%_^lRx{uF<8N@}SZgse#>Y~rD1}sEBw&!8Vx=>BuA~exlFA&TIOudV!M}%is#~` z?Q9YGjNj`j7|Vvi&aC$w4D( zJJU~j!Xc_fx`6I%0drj5&_{i@vWzeT2kHc4Yc^le`eA&mbTX-<;|ICI#7!9wG`X^~ zLqwHCl+Y@r2v~t_8t}!C{o3uX<2ri^rb^~X%o5}c$8-apBp2WW#dJn79#*^~Pd(!l zNY^=|Kdb91j{wyNPW59grvcgs>LXneYMz?ps}A?=vAfQ~YVTPdc6%4(e&M36d|!O^ zG}K1tcvo&$mo}Gu@?KTV&|6tIOytNO9d5x@{*Ry`HluwL&SPa?Oy$f*# z%I4FNWnzQW8Cfsq1`c0KooaKs1#>LFsp7SbdzMXBU=v3b*?4xWrVzDDe1Uq*Q)?uy z28CXau*SEn-)7*=C0QpvVs35Eti2aWCq!0z$rz{*=I5`kvGGf#>Y1#5 zZ4c1lt;;nOjZr+Ai%Aoyi;W-YBgYR;WXLc0s`emn%B{k4^Lp6iYy6Fo%z?e6BZNnB z{OlsPAmY48?L5l*%Z6xYvS?5&!1+znh$6^}tO z3NiMj|9&(5Iv^WYqN6r;*0E5}F!qXP%a!kgvRv!!1l=pqle@UhiDtR*L4Qg$%ZD~v zQ$Cy3re(W=HaFP>`b0lvcRWBz)Hu>O2Te)UIp5t**Ld^Pcu&K!eP`FU73t#@Q&p#i zw0yr9J;D#a6|+RCaifT;jcl(*pdR}`B~r58j^hIO>CwF(mL_8yCY<(6Oam7{J@=mN zIGwbRMDdOl+BC-7(wwK$K;e5c#j&6@ zh3ygpKpfqH_6#Ew#DxW<3M!*pAg;MA7b*`Q(`1gAe?DvBePAS~CA#^M?o_{)hjB4l zp$u^p{s{`NB7#>@~uF2l+iZu-qd@Yl(&USttE3U%W#+u?ha9XRcXSKZBopI|%H_J{y!VpGNWOmmGI z&53%;&tPE#r2Jj0m$t-6gLz0PPdDxIt3?II-+pa#3gl$TZTh>NskO;}?5K0dFn2G_DxA} zS$w^fjluV+Y?N|DBjIJ2X4MWSK9v zRO!kliL)x9|I(QkLAa1IQpZUo`YCq(4lJ8;seV)i_xa73usnDpk}z9Xb}#>};;S1Y zU6&_8T45qBd;~$no*34HnkiDs8PXdvs=*RMsQ8%mM>=VJu|=L2Zak~?kd(yeo)~G) z^ISNIs(pX15w>bd{jn(AYA-6`=K#KTSZgzGmKRxe-pit>t)4uT(xgKGA`p?qPZ+cX zMHHF)G`dm-tRCp}@G^N>tCu+D<12(-^Nf&ew%N`Lr6NZXHS)0zZ`*i>)_xA#3SvwA z;eDewU?>fow%(l8h&aI~AE{hM~eLs9gOhce*rmw_$`yRJ;9Z`P*cT ze!Ft181~XBkqev=?$iWV*NCY#G z8TNXwCVj;*<%-D?Je9TNeOUz3(?N?=j;p+cUN;)D(-*p3l|+^|uLED)*%(Xj{e9nRVkpX!IEUpq9lo(IWvk;{<0!x5SF z#cub{&vNNR*=9!I%-VbWB9V`HR{!( zI{(JUp6FB&jAnoPn`+sZ{+XR~&7FrpA-N-1W`^s!rN?gOM4gc$Jd+dOPK`#I|LnZD zo@?;iU&DLFJa2Q}6KbY8%rHra!V{ULO_Go8pixjNm3PffxipKL6Ja56W6~+;$7-gn z3FgptFTQE-hd5g}i1-iZTvvlhYZwPnAyZIZAMYE%X8?P-Bw=6q)rt*z)a2VD*g2Tz$ z3wQ|%MX?&4?I_CtNLTwn>M6gWj;OP?*L8%>-ErO_lD}O zG2<+h?Vg0~V1(t1s6{768~sR~*P&W1rwi^0v$ZRC|K^&WCNLiA4|yormaItsq$dAG zt$S9znApFjnPAnpzx+4Xj$*a-f>FN9ZY{>=ZY+rn#A#{DW*r_auLVt=thQq?+$d?W zBTJ;D)>;*;TAR(inzO1f!i-w)LFo*rl*^JM5{>QT%ffC!SAtnh0C+ z<1aZ|?wcMsd0*#FDx1FZSN!q|k_8ZF&!^6>er|_Wn-Q$wT+SsTF+v&~w+0)2@x{i@&ZJ z)HMVF{aB9z;xvi2r~?-uMueM@l|{O&ZqQ2tFGuxFE0b%0tT zJ#cxX@AwIGPPmCg&xHf0fk?R6yim-n2VtFb^ttE7+TZ;@)mhoTp6lXX9}~ANmA$rX zy*_z)eGc>5PW0M&?)BxR*KUW`-niHPs@K7R*Vn&ZhcsUguk#*@f8|Gc9}9b*+IoNY z^8TUaeZ;kR`h5AvOYh$u-sj`qe^$N!9(Z5;^(LY9A^rOGr??MT#RqcJ2YT0s%-aX{ z#0UPvtzF6c?2*fU!eLE6(?G)BNUjeRE%^=rFnrr9)>@nU<5Qdd<=ZKL)T7Md*E4S( zJzFjDB9pCwmlN1u5IAleF(_Y&m_MRVUa=*4z}4s(YaYk217))#|Ij7fAbzaK4&lB@ z#Ul_Sj6de-P>`oC?vY#w>=6EeT^GiFz;MPbID`&zVsx* z2TW7Ll^-69oyI}A4_!0m3M(zRXp=VdM>&}f zt_^t_AdcCC9@<}__56xTHY#)#pl{TAxRUrN-ECR=J*Raiz%AuhJ-5f~ZDWw^a4X=b z(C{(4<&V|`GteU`Q&WE8%c{l6{dgcoPCBL4j z_{dF~MMwFP3AeJR`zt`t@|eX-uB7U*oS6oItwJ9c!nke9g5sW@mVCBPyKS#70nyWj z2x5Y+Ob5lU*(R++Y2GF#(f+#LX+xV7+*}i!*m;(l2dyOwOz{4l@PY;<>$!ROW7F3C zKI$myQy=}4vzIcb1F+9;lg|I#4;iXCuW1Y!efo8D?OdlgWc=d1?=WPNJM^tU=nTw% zN+tB&-9Ji6?sHEc~e^oZ;_n)wX;Ee5LbfPYY>zHr| zBa`F&$c8E-K&`9M+aj6cp>$hTK|gfe>k_5&86kO z?Dby8dOZnsm%Uz}w4#5Ky@YCid{ID7`6b&9CZzsb?JbFnjK;gz5%Q`Cm+julrr2ji zmu5RDG~geqUEY|Hk)2UgnNijM>{(7uMZ+b`e&K9$3A6LlQvb2pog>B1vM$5Dmn8e2 zc5m>5@`WG&s_eP{sO-y#@5`FH8pqo;nQ3)(HLu)k|6$neeXj{m{)zSWjyAu!q}MYo zZLeE;moN2otF6{Q`g&pG5?%i*uJis&T(_2A_Ii7cfBe(yy?k8~>&~YBfua86KLZDU zhWr05_5OFJcl4h|@5Id5?zgG7H~$jrH~%xxdr7SS+gHC^xNP(;?w|d`sxJe*-~KEw z%q_2eSpKm2PnvhG>EnMi^|$k_%P8;q!6*j@9m2)@&8ebOK_XXzpWHtP=&n88dIn9Np9g#auaJh(CPz%Gqs{;5?kf+JWG(YQg_jys8fMBj?7pwP zH}c%zKe683)&J7nl-!1GO-COGQ$_BMw>5wJJXt8fDAL|?sk=4F2LILFlq%T&*4?yX zVItj}$eT`SogEzu(!AY8nEz|~z z&emlu+HI@rE)Ej9O$@^imTssD9DHK7z#y6!jF_*N8O1`U2zKg>56XB==u9JL@J~H8 z3cY4oP2Zz5Y0@24WeOe<2Kj z3q6agPQRX-6La1F^Nq+aS(;_h8SPLQZj zwtIT1yIs7uKNq<+CJ@7}{HT1%34+N3A?~Fz-zNfFFZN~B$d;{%q|zL-s@WXh|2$q4 zpgTOo;6*lnuESVKY>Puv+MDL^#d?!bD$FNaQP0(Xz9@c|T=w(R`|H)s`GHAeLE5Zb zeF6zJ6JhN6w4a^_YgEj{pM7q5A=9h_o(lIaPTh6>^)b|BxU~Pxh3)xi{z~xV5nj=o z1lb3+1%6N|&6Bc06jdfWPAro`AM;nPwUZ+`=-#3X%M^&DrP7XpT!|mKRX1VD8|`1Q zd08x^Txb<=Rle>7?~BdvkKyF}eGm9=v4Uipo(8#FG{+3y3Qp#f`CksHn&UMA-V`?DX&Xq-6F>DsRR@RXbv#5gEYo1pC_jhcba<{UT-60xp=5GRn?;*_(5GujYO~6!ua#;6qz)8 zlo}#-KEqF2FU%Q$7^^YUBo8HJCa0Ff7hC#cNHZHuG6vMLW3H=l^NyFH?#st=6Fvx9 zpSeBlntAaTQ`(DvCms?Y{InQ%xf*2e#ot>+YT$Kw`B|9^lggN>y>PfQtwxx!lPF~}EU6{QbFwcfazhuxZ$n(8y0)3!%hM9F zQ%ob|Ei_NMqQgnTDZo?Rm==jq>g-pvis;yQs#p_38W|iM*p10v$Fsv#;aBszsSPbn z4DOp%)+)ZVc(Y?AqKcI)^SHbZYmX1!6jP(?X3DpsH5UnvhK zbF{qGP!UP(ZlG;NuLf>@6keO}I~7y!BTIc+kA9DSj#xSsOh2I)bH27`NPY||uYX-Z zG4%!RKY4pSUKq*{>+*zSn8k}NEb}Z7D`o~WN64A6VnKJMr1xj!c6aX!|Q{xx^_s_}(W3JI7! zVwva(rh|97d{}F7)F{EfnBm>m8>4b&uLt2&4KpuQDeeF&C;3(Kf>+eyv9|g04cXM8 zOC0@+>|rMBa561&yxdO^nFvHzbnuHRTdQFXS*A(*uKSpO-YUS|L(TIN&EDh==w2_P z6|(gWTG1kfT=2Eh?Sv=omXTf0Aw}^g65>tI=MY%)>*uU!^V=y4pK0!=Yu~BBNl$O$ z4l%)WLK@u5mO!=bj|=HN-dqn_Rn+qR%$BLDWT|e8!j2S*T49uzUA&@G93~wmeNX%L zf<6)9(j_f1d#G_Y+w2YXj@mPu;b%$K18O3X@I0=;rzu32XoiA{PuF@dlfm~VtOp&B zbyOK3k9d?}NuH^X4zB#L+KJ=pX^F6?Q0+OF+-ABDLdf=kXzKS8bAlk1?W9pRYIoi@ zh)|Zxjdr*&ObqEV2h!MkNB4(vIs|8wjPZOZJ@JA>ghXcQ0N1)8q&wA{R zW1zEV9~^=0f*Bs-*w5GDHv_s~*})UwJ%;WjkJ{S5FC;r2_Oq4$P{(EvF?q4(B;11} z7;Hq!v-3^Ci<`~EX3rn6H*suU-K`+*yy3H9tF!oa*xOWqQB@S=yd< z+nBtf|AS)K1~Jfu_>#WZqW-H3TA`Kv!Pr4+sru@%+Vz_(#;eW91cAZTT*tL=RT`Ag zw$$EZYA^T}r~1<*?N59Yh>^ej_YKv?*sYyl%04+CD`eop&@m?IBN?a?cH;?|N(-)* zc8n!R@j`nRZPjq4=p9O^=(F_86cztCk{v&e^O?qE7+230Azd+UKy7-vpclT-)(<+dmMTUEIb<5R0?7Jyt+{G8}9VXGH?hMt%o3 zU^|zq(Mm1rop?CZsNm_KtGmi)i;rQABJO+0E0`9JE zC&dRN2$YE%){^oQ)zb=MuKmE{CH%m~vWE!Q`vfU|BU$M~0v-uQ`oxC+yk?U}dXpuT zB^kC}sF+qy>Q4gFtR=NDiq<5?B(RVQB&!x{dx23PO%in;qX;<$*IyA}+7xwK9*JvB zak4~GtYB!aeb|7#4GwO}-lS^s0dnoL08@`@lG;0$!i04FjS z#*^!j4o`lT;+^dyFQMP3DOhMNE3-}<_zp|%+qV1)DAn9V&#|CoD9=oxn?TlB>y`7rW_)$3u~IH zb7K;EEt)A1ORu+Xd{>9wKIWRL4saE7uL{QE5re_YvU|H;Gjg!)-ApG*H#KS$huXsx zTrw@llg)3zHTrc&@(FkD!3`zEEo!0X0q`Jf(y!7dDXh>KSAchiZgoDx?pyF-T}JUo zkW(4V5Ce-oOj0+Bl{SJXV8Jh4i58QI7VFSA+OX1BWWk`Ed^x&8o$RUG*9?hJLnBCn z6o9KG#S*~$L@57c+=a0$%|dup6RCQaxGV;0iUqG+$N@ZPHEXAwm4=K_^2ZQTkUvoc zX$PONcwlT4fy5Z`U|_6R2wnm#-Sq;$4mynhv$;g$^HMXTo)0vD^=d(~DAaEdY}gf~ zM3N+Z`DRFxlMBe-?g?cK>i%FNzftr<^H?F{916GVhP9BPU!H&PQlM?3Y$hNT^jxSy zre@0TNEW!Zm>^S;c|%fIP?zEToQYOYk+xfr9~ry)S>bBEJlm1Z>!~6`3gL_6RIc!1 zw|v>)nPS@(dBwpjd-)P!mJ)TB635{PXZaFmH^9j<(>?ogU$Zm_Q+zv!-Ll30a#AZ~ zu~-d3W)D2JT8Bo;m-(7y;n*Hyh0Ay@=*e72%EBwkV&uzXS~9E-Srpg7*)8SIEFpLD z0*!!*JhloWAS%^@@4;R2UwwhDcZiY;l6b}X|dhAe810SevOqaEtNbo;D%=C zAxcLYfL>;|l>n$Q7V@C9a{NoBJpeUZzXH8w2_^+YNx=$4GTq64bhnBG#DYY-w2=&d zMCJ}?(;Xol)q(_Oz*duywH5636!cP$5Ri0O0Oo4XV$HCyHc57s<{_UtNtGs2&6gRf z!pm^?K@hcGP?q;eB8nm36L% zb<(`r{Q@K8$YT4c-R| zMxcqCnvX&7CnRvC?AMBoVUklSmxo_Ci6)0Y_<;bhUf3902?Peiqk${$C}4*B_y!lqWEQ6ym(iCa8UX$6VMCi4pxrd?-?`+8K_# zQ7*)N`i&V{1O$(TIsy!kaJxt{I?Nx0Mb{7+0wmEeyOauOIl-K;q?Asa%66nzJRdjJ zO_`TUP#BRaw9oXm0j8V?gFkcz33g-Fi1qgfc>UZ>l$}`uV6=~5S{XrXkg(Lwgzp27 za+$oxTCb=Mll!6p<9RSC$({Z8*klstOMvc)q?($e3m4052dKzQ!KClQeJ2nb^J@Eb zG^C3uf9S;W0H@GJGW++T)c{q=JYT+0LAx(6=@Qq*yql*4h4CG#sfDnW(OX!621)AV zxeyV)L`VSq5}3+1m+*O`QJ9rV8;qSb0$K}DT-cGaNX%2&zjxRN+H&c}Ju#M{PaoY_ zrmuU?Aqk&P03ruS52*Dai0OrW#7Z?lZbzD~w0Z@#%03m)JO(ImPEr~}bvCYagg(`? zStTXse4SIa^Xhwbx6h{cIe;PVRIMHPU#wgwAd(ZlxV z=NC2Rk9Xvc@P%lBD-g+!=%9-SpM;-)P^PiaY~jomkt zfrV?N$#@h#Ib9LYaaIi|CC-6X=~ysZtiGE<=c~8P2;O0RF3A(BYrReOaSI(f$4_qe@5))!khb z>9)t{^YPC$i0S96)BWeHmycp;eYYzU5s6$z$neddp@9E$gvd)o)Spdd&dv9RK*oVE z6LMr*aW98!bmx3WvU{8{9|S%6nCyub$)AW9L+IMD&vJr>71spw7Vm|^>uC@jFS#%h zGo6?2ii>?KagY3h-O~qnn*gLG__~j6P$%!x+aFQ+`u?CnOc^3H4n|E35fZClFQ13W zwg_+ym(uZ057kUp;^>!)<-_r05~YM~2;z`^YJnmQ0h&2l9b;9s1+)f47I>K1>W;tI zACjRyKRW?mnrJLuSO%)hU`#!Tl6+DbU0-jKsQIck<%%d6&A%Ri#eKjEO; zYV4jbGGO5i-g3Oy6E^2%woYeMD5URQgn{h}BK*h8#PzW?;I0W4X1`WREhLHh)szH8 ztewE~kJf1c{AH{+06v;83S|^`{8x8_ZfcmqqdsWjydg9ug59A1GuC_Tp!Sr7(bOk^ zm=~GMrR88(W@pbB3-i2wq9dWJU&I?I82Jk@Fex)eoyqpSR9y0Np)C6;FX}vI*Bgx6dO(c*`333(nKs{A*9F7E}}_L zMbv93T0J7%&%mK1e(I>JiCeuuOeg666w!dPBYn8LD4U?B$|U}?@zup_B#X;+jTvyA z+EQbbw4+fQ>8C+H6)B9-;m>@rULjo%a1&_oku*!E|gN5H=|D21?35oc|9bZO}ykvX|e2ss_B5sOC)UU)**^K zK>;lnFX6Y>dMr+5+(XXoNYh7P;TXSmSt71Oo^iE&?I)<&A&NM~r(L=TliJ#vY*F_P zy3_d8?G$i>OOk^X=%0tgPecya*3ZxBlKVdK&mI7yXZNN>m~YVe$S#Om^YC1el#eZt z4ir7qOF6WPkt2upR2igbh)C*;R-GSfye;rBLLP52)XR#Jb6!jsMrnf|6h+qmOqQZ# zcA&mi$0a7DA0I&cT6C4OKo||8JTpa7J@EfF79|mND__t_@ZmU}$~V8Fp*-vDS9}qh zy=@bN3a)B<8j(gwv0XInmDsDHWkNc+nqOw$QP6o-+1|v(%=BN4r~n9Uj4pS2fgnb{ zh9W+%!J{IMJ1F~!sK$9>74LVVk@rV+MV@?9rdJ%}sgH{qUsA_hPaeD`i;f$G?#!us z>BlS(=6YT9iG!ZnAE{xsgOlNtDGca}m%#_bYX&WQ=34owPvsA{Im=s8<(R~s_C#w9 zKj9NEV_0AbF2d4+Hic|)4;iTi(hRC=k*E8%zNz>!;Cq2`i#`+9woZZ;WFpm{It{|m zNBYB`ko}tGXzti+zk3`$ez0_j4m+?!6%<=46syYS1|exp+kd0om=`zPLtuC~|M?yn zwP$L@%QLTvdMKr#(wjv!7w(YS<$R8vgQ}g>rM9N-5ZsJ z7oXkU`I@G0R_;Ud>r;bIl)0IXe`Vl@Q1mo&c24_z;b8C4Qf1@cH`?XSJB971#}&Ua z%8bs6)+H)HltNgFp#k-byE}e_=WlHO?(R0;RejeWla78ze*EWPxxGx{z=~2Gc^Q)4 z{;GG-d>70qNJmJ}3Kv7ITXo4~P-;1ng-YujV)!m(qqWxqS$@%~GHC(bfkd7|_DoLV z4-CtIQS@J{p(TbHMjG3)U@8mSc>SJh#H(9aX|w}kD;-oVclZR*Vfv5M3YT!>y48_6Ss8<@15yUAj;the9sAO`aoQyx8g^Lo3ZiPuPNwl7!gJ${9G6p zR`+419I5#X!%7M!61NH5_IGX*U;OJ{g=QNXv+Pbfk1cj9y=weqhC~^!3*3ac4r?Of zhj&AIDC#9$7-ScNW4{A~cnu3tS&$Y2uZuN;FQC!nl8gc?sihcuDi6{`IsM-I<^yHd z(PPO&^t#-zPJ0z9f5hIy2 zVq9l~zEedH<{>Ue=49g%oxZypkkM4#3e%SRc(}|xZwmp)%O%?G4M8~2SwfT+Pmncq zwNgQq#}JRFJdPATCpY^TX@#hxG23o~x*1`Oi`ZtnO>)d}Jbnex`y z5V)`=a+Ia-dpnfBfoVF7Sc+9~oYaOpqmL}kB!ZH^T=)CuDs49gV}MuvIXB+04vvIm zF6ffRK*(*AGig7H@-TVh@Ax8F@)!>^A5g9nJ^msZzh?n^YO!uD7isD+2e}qy^ThI@%`>2TJkmkfoQZXRrJqPZO2b=U zn-E9d!A$d&doz-TlHP{Bq7KgyLt)}xoD3gkO>vb_pcK(Px1Vhkxdn;-$)HbPr) zF@u78H8!c7ovRqXs1K|1-F%!J>g{_xq<)^=22h z8xV}PJb8~sSafvoHFMCmCWv1MO}hWpYj?_qu&5g-SPY?! zUxeiOgP$6{ujXn)j5@ov_3s|up(Fr8!k6wP;$(G?*KArS-ZuA`_CplDUT zfpjK`8o9ofs#hB2KKywMV$Y{0fN9SvKlG$NS>TBP^hwR2#^#O8J_!8m?ur4BW%+D! zjL3VlwgPpH`=#9Igt^v2iieV}3KK`yhQ)o=E;2~UJizw_D7o#@|nf6@at znwLwMt_-aaAlGMqOB;~NCq2y43;#Ob8!KD67v&z-S@bujP@T`j=%q80Uh^m``wqlW z0l^A2i_eYu1Gzbbz|si9)c0Tuf;5+~!JPB9J`ae)&q$4{0CXZ4c)0yOlJ&*hxxn)F zp8M;|?NHo#+;Zs=|Gx4HH*IK=0pI7eCP&sEDH*InWe}$aBbu~rXIb7(P!m`ztWXLv zCh5fY)EP--wOvvWeG0eC&(6gKecFVBN+rMH&X{^u>E10>HMTxuI-CVn-0J1Ei9 zb5imW0+ZzUAp&@P#^_$C0^H(PfBe_B?>hQ8>0KC(>G7}G$A7DFTz^br6|`eKSg{{> zmZ3vxXUa{{TEA=lCUmHsGcQN9hm(C3t$yB@Pl%F;hZ9{N^bn!s&h6E)F^uC8jZMkf zdv5Gk`Pp18@q2?XWJ}{*Fmo=RV|+-KCPdvkP?BDjNkvv8ct?@GXfPK!6bp-gjx1=q zkRfy!YSt}fw~%AT){}~L{Ms0zv{!BsP6`DZ+2N#QiQzPIE*>EX}kq%i+!S=y8o8fEd`{8}JkzrPrqn1H=gCS7_NcQYz&I_h~ zr3v#ut5G1}Vu&*~gr)&PD?|-}YTvgX&1Hrm`6{)G5ulkTi80_syrw>1i{9a=dN#tO za@15zYfD<|2VI&mLd(h*bocH{tNv7{j8W;9f$U}$sPHh_hSuI7+2If?i`8=NS4(DA z%wPjy_sOs=-HAwTkIF%uDCmQ3FF~Mo>^$|^yaLBM%|Z(ivF|vMM-!$`I}`oVRYm8J zMk~ZYC(KvpL6lCoFBl-qkXFV9i%<3s8Pn#5h%Tr%&5y-3(}rSo;(VdPDne{1urlr? zLK!GMGJ(?t$*r-=@PX3Gw6AkYI~mU4P*fVnBw>sgGJ}uj3=ew_$P|O(_6THKN}mRb zl1nwqSHaLaAsF$1VXFEex_({NLwv@Su4%8%&kBlP?#Mm!j#v+wXY6|MQ8cjNVJ9pa z)l6i?mS)zf!{|Yac#kMO)H}$?9;nufjVV{nVrrR;buk|b2E&`^bvqGcizd~Yxaq0n z6qWp(N-@lM1c(6F)j1<&cs1~%AIE>HZ53bA+B{^fk*>2qogg!$`)gXpj3EtPKp%s- zM)JIcqo*qe(y0wn!y4@u8`&0d9`w(7wT&HY8ht%9 z`gUb>SUK0YGuK3De5zu6W?+2oVEn_^_-B;y1=jdivGGrO z?ab5bxEcT$m#UxCQAOVhxEtTA&2QgTJ7(*Ax|LAqxfJWI1r)zP{(P$=qG>59uwFr7v49q~e zSW&zXydKAPUYKpNz(tJVbe!X=*ZAX279XdTgd*bFefe3B?-gRPWMjUUWxgt93MXxz z)<68$Uhn$jGN&}LIb6n6p~PIN!Cd);xyr1$>Xy0Mk-7RGa~P$C28RV)eAzl}< zkwB;DxE$YWMusrgd4Uruv2bg*DBo1m&B-$ylfGLs_WQ1dfgkLa{5)qr2%SMk0*1Gj z;^Tz4iD%-Ui0#;maHf&#G!W#TeQ2>h7pVTjaUucWHpqv1p5>=mU=$f$EzitE+zSmU2JCdBqF92;R4Gz_*@Avt;+r@j;F!FvgW;Q@6+O4gA!x?X*j}6jGG5L^wcQe{ z5x)84%&w~6Vv^r7)6uRX+HS?q@wwJkmK0DkV0|TF%goTR1r|>)R95Nx(&@}>{Q0Qk zRQ2Q+jNR)M%?~9GSFR3xo=&eT9Y3Zn?Ugu9J##wXpE;Oy+7EC#DslLF^re$=T%A< zfW+kGi+K`Ly1cqbC%APlTPY_LbE+y zehc3#U+J=wW8*^7`J|42hdFGHMXe>QVdq(zeGLr_O{4x1T1gMbxmrx|KA|6JTNgk=%xw$kLDVe91;>5ivBkaya8P+ z@KI6Gk20EWK-Yizz&poMBW|KhF{$ql17p$HDx*T|b(@Sj$&ZXmC+ zF0XYquYWpkY$v~_Er05;aB%6S9=u5hZ%o&lXt1KLrLu40*~-bYjZan2YpUTK|D=Qe zc7wIUb9E1c>Ka$-#+K@4HtODexd{mC`^NtPU6;2TD=QisTbtZ1np)relMxQDwr%dV z`#80uAGg=n{>OCfSl;gVkLjvNe8al-zJ7lLy7qqj`cG9jveq}d-nX{ZfAsUert4Vm zz|!lN?xruFl@9e)-=v1aML8oQqa)L+BL`=rJzb+q|J!u^cGDP+O^*CGIGh^)hjksD z`XAYKX6DV-O>;PN@?-YZ;y<|S!tATr?tjX|-j2nyzyII(@PEp~(|={x^?zm8%YRtc z_0@k9#LNGm?E2#-M1245{Y{AY;qUeC+s)mZ=j7iUacBO^r;i7pzZ`tM`j6~-`1kr> z-1YM7%l7{rCH|Lnz3CEyMz)lX zr7+9-Y~ougCeopr$?Uo^WrLaj2i#f(O?+u)wJy70F#8l1PsZ_Y+Q%NvIqjKvC&&GM zxmxJyvg^uo<5?lq{DXYshKbsX%^E2y2Cn;Q`>?6bhK;U(4^tdpmN0BjdumNo8K?0r z?5@EI>yvb@Z$yfpu-1^-l-0EpZ!v$bgR~a(18T{~!AX~z9n6TXSHaDxoug1et!{wG3r>}?7{XK-Y{ zM)4&y43h$(THQ3{9_2KnS@-Vw<=`+x5D!8C!@P+JwIwI-Gw?kMkGSkyqlnRL8&2N% zJQ7N>@^YdKMblz%!#R%g@!Yj=or$mkvFZKWJNtBX>^%_<)|N;71vF|FG%5FqmZidx2%nu3yj&X)&>LZ3BL<7vtKup|XBkm{m1pM97rLgd-F zNOI&?nA*q0T8)Fon%1-~=6W~+nsU(sv$}j zjbK^1bG+Z@hT9n0``5ZA>s+(lKethL^7Wx&1JxJrvA2!N2&trOE_SmIUNdy&-?@QX ziysUSQ7Z2S1bwW`yZ?K?`g!B;FZEq>B`b{+63UT1-`6u%+den;IdpJ+IMpZvI6|Jh z3(ZPP?%Zpq9$mY3LY7wiw-}HIQiALQ_%{oXQg`j$Oz(r{ zw9?^N;(bTL+xVfl-KKabMHxs33FqW6<`EPtBeTX2Gxi=QNMXw;?jT24-yA0@%#=|* zz>jeLK2CyJ7)@U%<_|+zzoU@`ZX0n{>ikLz-0Hnh4K)Q^I7>saWELGwtktL>$#>v{ z0)UwxrWJ>Tl1~i6n8|tKVykKH7@U=}uX{tJWJ(``p-48mpb2?SO~MJ69N?E{T#@@j z27$#N*v}z_Ma8A5UW6ZjM2fgCzo?AJxIMV3Gm%=6yNrb@NTJZzV-LqN&`;PgeNi3i zhT}EaH6CfRMj-vf3*Cf=Vrb?Kd5G?~j3zm#LQ+&H1^lEkU7e7RxF{d5l1xBET*rTq zh`}kCp5|RGXmX~PwdwSl0{spvSaXB{&9SGB{uGtK#mN}D{_h37Ar)*xdtefw(}H!) zQn{A>>ry@!7o3+t9K;Bhtj`L>?W>G)p5u&QZ{q-wCSII?$=Z7&e0f(h-XSMUGq*&7 zp|r<&I;4aPsPe2E7}0}^Jkvy%PzL-^j8rB4+gekJAeW<*LD$dqm2H9h=XUbViR``6Wi&{J7#Yhh?Dupq(i zjwz(g>>O>H15yw#eA?;;Z1A70i$9)Pb+0~W9)TvhV5G6O6uHgjM|IAC6zdmCxhkpW z_gv`8J1uBBp~=zpUVZM?Gi0kg@niL-Sl7(i!d$-85-nTGA{v>NFlg-`j9^F@*yb8q z8UAto^IaX3RVQm$bNd?Jf|PB&FyLFf=Vn8Y;^M}*l@;$($3p`X>Et8|Q8aP zRb`W##qPuy7jk9NQlMtv-WKRVIv|l@5Mh~!^gm0>-SVtOxo8NF!+ZiL{>)YOpM-MM zBMK(T;NM-E+Q0HK#l3TiYkfrYL|6Lkz^M?z+f6{#{1r4QLdEt9+CR#NW}2aiTyNs{ zsW_&K$#kX6$}~_?@`xpcqufnmM`;3=Y~FQzprP|5j!+PYjAHJ*iC1y>5|~dr4x~9E!Gg%@IdREsy+YMGxqUc22P250aCagMybpeR1>Z$F=xHRlLYlr2{Z{Ax~`e`k5O>0wIs{UpDK z2OBKm1y)%%b4yt7xb`g?Ye{2V`$424q)95Ft;-sFLkK41gE$^V=TFSsC; zCSOVgbc*Kh-0$?)uiX%A*U?!G+w0+GRHq#gmHArwq_6kt5@klTx%*rEY?WySF=3vz zU0|9cq{l<}iYtR&TizOx_HOGhN^Mdrel$$<#nMdZ*ta zd`(z))}A73fcMi1#jfE|V*X#~0sqN)MR2!V_c!L!c@j5MGByq0-SLo@vD%9y{&k4p zuJ%V?wI2lxi`aegl{9@=6!?(THTvfd@}7CH6D02LHfjF0awoClOU6eZZvpY7?18iz z3YoyT(nr>x-KlM21&4yZeR5?K)Nr(pSDFYe&bTY&t~nln8i!EmtdS$vP(~Lh6Xpan zg#?Q=)Jp>JV_d@HK@heSJP?3l5^Ng#yOcQ7eV0gbXjCx)ZZ`RFKSQvFh*wCfAB(lN*oPlNd!iJXYj zk#jW;AT8mx`8XEK%ST8mm0W3)Tos;Nou6FWom{_`TrEWC3`*qu9z8bhtg-9tt-$n@ zKb8kbPTNc{C`1dE!j9Tt$HTGseC(7BmV$sB38Eb*c%<1(7#)zpEJRDQtlE#iqqLhc z$ZWtJNMr#6?%Je%vPrYRrG4p6J5)&fj0D=m5F6rvx+ZD5CO};nao0Ba6*Fz67C0J0 zQi^B!`M`z#d%U`|>qIl*qn|VzLQxYC2i}&boDhmOOQpBWSRf5{Xf%T^)}p%Nj-S_K zuiKDM55i`wAItM*3V~zUha4Ag<7mHYP)EoYb?8aFt z_&60QOarZ9FPmpu52rAWP$!lqSwD?yUXnE_fY=U-(8!T=1!U55TlJe|F}FC065x1g zazq3(_+rU00fLG>q$;+$u$tQgQe>Jv1cET2NI*7o03le4C<2@YX~~{6P3@-<9Vm|> zp~(RPa)ZJlx`P7#!}-&>E+Bx3xNB}UK>^!$&%#(TCCwNH+r0STJPKGg0!FL>0opJE z5rZVmG1;v9kVFi-O@PzW?=d`#@!l>4pPtJGmJ7hvb08XzvLmv1h8)G2X}e+z-Y3wy zoRTXJDOKxc%R3*|h^VEuB z7EG)8UY1x_^Fcu#Gn6o0j%d4*@HVcH!8N}*F8GE{a~G7GkRnTgxkM6>qdtdDY?DJK zO6lz&m7z~6L&2a33TiT%j$_RkMcQRqh!q2^3=917S1M74&PX+levSLLTV$t6YwM2qEdW!Jo&9m&E{xV8#*&(}(kj^9 zL5i$N5rPtgxQtZT#(1{qLKv>|5mI2M7c^Be*;U(I%R4So=rxpzfT_WMzzz^ zZDO!u0$K)lfe2odra)Z%BFQTtq>ev9%SvQ{L2*eTHzT9u+#(GVCMK^6>$eLbnMzCw zC!kzKp6)eVf3oIFB}jV@flfrWZcPS4u?Y+Tk^;yD5xJB+wU9;I{y}odW0u;WDlmQ1 zM7I$bN_eJ+MMO}HbQ3_>T4<)5X38EHm*skpat~Dj^^OVmZlN+YyY&@=H9Uq zS&eQ}gKdZJAc+hcaKD<+0rE_(uC2a@z*G3-{tguJyO5RHxO-I5$x$~%6aFV0hfefCar;iIC{Qa9M?xB` z2Kv@DM~@vp9B?czcROZPT}BdV;9h7nH(4JPHVYG4l#+h%cDI`@teYJCV-Hc0h1e)U zIzN(+wL?-Mt|QCTEJeq40`3L4vmIZhLMOO;Q=kY{a6<^_Ol=<4k=;2y=q13p3rDI$(5i8u)9fVs-Fj|mYCsaNJ;?PbTYYo7?D>dv3Gl|WfVo7A|xP^sKbs{q#n;f z-^A8psIN#8H%MH@jhTQ@*jPD6Zu(kCk>xqGK_;3YI>b&__b28jJ0PH>|8O&TXtGe<=I__ImG(#7OiO$j{$~lfwWQiZYV>E>?|9ir9Fz+MTSc$fya*SJ z0;||AtNdE2xN0HyhWrY46jP-Wb*vg3N|%^zK(uKEaJ;s+FraK-)-G9gA0)Abf@}v# zRNHdAA*Ajxq%n9|eevbnL#lqw{+h4v{T(6B3?R)^UC&m9Bud$rPYSMh%J)t}1VO`u zJ75|w0e8so-RM=#z&Bj6-dB4~yHl&p92>1$>5@w_afpeGHzMCvlu7elxq}cRf!6OI~@;;oK4J zSdAkimY3!FlG!OMTN*;=4}V;32$ygyyJV(mRfTlJ5FIAu3d5?t$I5Zrl1lp<&Bvv` zmR{#UL6@@)Hyf7|R^+JP_iZ@)DD{nE^N(5iO8 z!TqlN(ZNly|2*xWsOq5q@4*YQ!(p|<(fdk4(TDgahf@QGGj9*){vKA#NzSVsEjt~p z&K-(I9K9Jh+I)NT_V3Z;lcR05ue(lPKdBv!J^A`&;OpVruV4RuJ#KXD0({F# zoUSBge8#J^6dfsLE)){rc{aE4Ly$>TS4IFNSQaB3vS57%a;dx{AxGj3yp_4E4GuLD zA2TD0{m$_;p5v)DC_~?e-tzOAjx))NYYAiG3}PQXT^BxWq3b4Bn=r1_YDFHD|k0od;Pna>#|k-vfcTz^YLZ(w|(H#%l>zliQl*G2kZ=fBkAU6 zXOOrWR#zJMro`LqF_}R)Aw|d}^=H-@!s+sRI$bt3kb?Dk{?8UQA#{*Eb?1+D5Czoa zPw=ozpV1){_SZV-??iLsIL%)x8OZj#t9>|6^uQ-J0Hh^tj3<0%TLT4VkdVtyxq(}0 z_&@OonY`D+k_+3Z*ep~GCHIAR^4Tu#>Y^A-8$H%f+|t}xJ*I%t!`tF{ilJ_st^uE< zA$K%!*o;3idf$*yJyMNyq0MU-vcvNho!XySa-j4 z_}VmSh485=3QWIYGzq@gzC6pvzVz*34cxD+vu_Ga?G1Q;o=@G;H7BErwACRWiI?}k zf0+|(->a<^k78-Bnq8;~{e+ep?zk6kZTYH7l~wTCd`j_|*lq@V!kEkLh?pK- z8lrv~C`oYtBm^X6NhoMg^ON&^@#uA@Qp8ijDD0&B>8v89%l9LNzA;17b|7FrPWVT@ zVG{&iHNG?+k0lCvh^9cz1Z1d70OasF;8mAN48^qEsezoeOWOr3C7Jrxq6Gmgjs)R^oJK$keO*q*MrB43TE&<|#9yedOR&LO^PDij5Hrm6I9t zeH(z0@jHWZr|)SPl$#0BmdnX3?ht736+)Hcf6L(^*R&!lmLW@)w^yuQZ>5>qDsTE3 z#s3|}+X`BGWSC_ElNTx-f?IF%$bb$s@HSkF8sZg;0YnwdV$8fevT6)@%Mx1hLX=dS z=NIlc^LtDlsyLqeg8S7BGK;)=NNz;@-MG%5sN_Cq1@ zP10t#jeP=EqdNJ+Me{mTZ0h`au@as(spQev_cd}i-B``5rer(ywK9*6_fP_Jh|B8D zRgG2kr;>EraQ+sSOtuO;gW)E7v_f~-2aXs88=iB6Aa}x=7RN}71iJ)o9xf#{q(eu2 z<6$Wyy~u9xyoS2>y(azJFAOTU2rtiyX9Qj;3rl!wjCL6YSs1I?22~uTG9-b~)xe{1ylbj+Y?a;wwv9njI1$_%`y$Wqlk6lk9 zC3uCoA5SYeiPq*+D<8ni>8{?lS<;m-?9BLC=Z_+f}x7%edCuftbz<5iDD63>XU3uNAMTu81vL~ z&|1}RjZuaOIfC5UI~)}3n)Enjd{_H~`rl`!M4){))*-sAf&eL@2_aL>UV%=7FT2Vd zW?VBya2>~wb5I`Ss&sRL!3J=a;r0C!sB^mjoSs?F)MxabUC87%)uJ}l=~!F$a}{ zbDX2)9&CRX2vH!5FHX;!z<)Nmz~i6-Kmo$Qry9j!5Ym_f=xkl=bFwAF&@uwx8wyWS zX&>BNtZcEjilc~OoE9ozj~N%_sY^9Ay-A7BX9i>?^T4YdV#`axJ9qwidjS3dLhcK= z3Tkgg(6Gpi5^IV0z**fs91LcOmy1cb{3xn=@%c z^hUi_uCu5&ymi{XSdRyh)`DzpBebRRoHIP4G*fG~yvBtK z+pT1XmCxXWn0_!w-#O@scT?UH6;JbX+%qTo!F?Y$FFIX@z}&RridcG=O>J7Hfwl&r z>w*JmobaeWM>&Mh;hTxRL8c(@t_Xy)1)<;?o8dC*y=w`Q<2Dm=;%=#au)GF0>HTnW zw=I_YhTy=)kUtmcs`>4OKCGG$ud#iUkIAr+gDS6TxKveddY4c!tUaJ~hrgd~TliAT$Mln1 zyEG!G^r$av6b)MH3W#!OAMqma}Hb>#!W8JtyD8 zHDgosE3g^lWk}E}29|tX+Ce@_`4A?4YWO}Z!JG4vCZqZ@T(FmMH0EoqsLP&yG&YL2 z@)c<;7SY-H`9N-qLJbckB+=L}q9keNuyCzp}Rey5yxR}Vxw-{Y_sCoO}f zL8@b?l@cyWL%9=8 zF;!{Crx0Y7wRL3STh4`qe9e1f35iQ;;qmB>_@J0#J$kHEJoEO;4K~ngGDgi`bP|;< zYcSN!|2(3-0To^{lbh8o_b^Er-~?uVMMR!J0fq`bD%b-4Y&TM^54lgryRQerw}M&e zZ^y?Zm}kJS$0aNufW9fuPDd)R0rcubU92@SIl&{FnNXGS;AhavVG3plt35)^UQXF<{}1yt{a#F;ol2U;$sY3 zF-yvz3T3*!EKsW(2EL(`<MZRn*kyZ}I_8 z$BGn?*`=BZ+wu*763u+Q_-&%v7^MW{kP__+E;%OJa$X00bRG{Pxw7GxGKt!ZAiH8(;-|+|j|8%o_N(7Y^Xi&8jtTjK2~IArdW_tYdk1 zu#`d*gX8pT#Xy?1utHif2))VCQZ`MnMG*K-KN@VSk;tsU@7^Zi4zdZFLE%|-ijXLHC;6Y-$tVVLAhsT*N#aom||9Ru!|Q!slrA2p9(q zFoST^Mfp?6l%g+P3*i`cZ*&QZP6QG!*70curjy@`MIpK}p!5WcwH)y z4Iu|8R}9G|KiM!@HmQ<4oXMt0l^beL5u$zd5ad6d#}F~Tz(!Whr~h|T19LG=Xg{_t zM;5!6MRfE^^6tvlEVc^?2H&>tZ7j83QL}b5X(Va2OC+IEBHN(ELt8kXu?aX@ao>yl*g5X(`6Qk z2`W8)R>%FtH65rs$)w3~>ZOx-@(YE8Q2C~JEPV+!W`w6Ix6YYGx2(VI67hu-nRu2U zwZMVm7tqqe~IF59x53QGYub^&DI#At2=(0P^kWhU6 zF0Tm~pGq1t70R7v?zz5^_RddYhpL=(r5p#0sXf@YAoz(?k6lw%m*pAfU5Mt}Ipbwk9ztGpyNA*}8P) zVX$otgQ?}^>*vd>9+8X7a_ICTT^rVxxnJFx2pW?Z0kP)lo))?mf>%5|B8hi%|6uX4 zGH~66K$_&JjJ{+<8uOtU!~fT=@Jf(;kL|I)`BsKa-dPwwwRW*&t-2= zNMjC+W5%;B6q;DMjE?8ZAtC0?;K%8-4*r~trz|p(5vpkXn6^xj-rr|>aF}DQT$YZ_ z`mQ|K%k3S6ZL`dw!@VC(kF-U38-I_(>+Q`ZZEtKvfxdGu#Q<$@g~IGXG)7bka&Ux4jgUxx7g zWG=&wfTmLHso!i};9VQR2DL#6hYI#M7@g|ZSW%b@Y7ix@rJ;`xR1)WtQa*9@7Lu;`|cFcw`qm) z7F?-IFMMOe>YNSM9+yw*OxI;E_9Xg#?J&8jCLc z!A$XK|H98>t|QCHU3~I>TZG$ggS)=3@BLE^&#sX4S#4056PlOes8V?S&(S*qZGYJv zS7Wk+y~ElklL;H^e%8n8Grc;S_bn3Ik1SMldv1Z=32<-E9c0eU5x!D;CPx<(jPX$= z0S_pDL84P0-QjZpCEfyEJfxlc^!fH&Gna76l$VT>gzQh3FG^FnmBBK8s{0EYju#e^ zQMRlVx+ROZ{6Mx(NROaO12~HLgA^yU9Mr=+)33SgjR^3aJLK-u8Fg}1$ib?-1J!XN z!F|?2zc@aS*rp$Yc-EIxkL1&lr;4CIZ^8RUL^3h7*S{>#EZnkb1Sy9`JJ@RA&lP#H znCCNdU+I}rxB|`bX~aKc0`}Go)IUh2Ou2R=I-)ZcS6tI zB`7fjk@w3{;flCf08HM4^wSCT1-|4obi%LYx789kVwi*h3HrLRT+dSq_%XW!a>No~ zk{C4UowZ(Y@NTJj7P9z7tZzAgIVID|ra4+Y;1JR{cKaPz|CG0?GlO2|yP@X0ik0n8 zwuS1}Xy(UQePMFNTOp!AH-z8~1cia#Y1T_Gh7s&q7`q4~X{93`6t)fvQMXv8qm2wx zWwkzGZDPnJ9#CGgxHyA_civFwgvoxsBQ524?LW70q(CEBTA&MLNI^~;S_L{0p0NeW zTm=AHgwEQD+%6~2(a4`zALgL`G~DL6>{opKu;g}G>&spm zbu`IZSG+NZ?{^bPViZ+aq_Gp49=*Xn9HsCI6tY|F9VAEpD~jWL{5;bGv;t7`Zfrzi z;L1CeT>HPZ@CXd^-#?AfK58V21Zay1l21yByEX;xMS3}`3iB(2C@Mj-;ys_)A$bN4 z#?6a)-iefnx8XCEV2`mhA?sG({gaP_j4Cd}QF6H9$(+(OVx{rBr98=;Ful7NS?{vs z0$5KC$VZSRiH9Ph|76jS^|_qzxRO_!TM7q}qT(bt=#EvAQJQ7oPUYD2^SjArVh7E4 zwS>L8PLBG{S7C#XglpM-*UHA*B^a(>E(_^EHR3@Wy6wy~UX3X%s=aOwH1DP5`L!}P zy-z%MM&gONmV&YJ&Qvfe>nT7ce7Z#SarynhpkZmMhr$wL%HQ`}swaRLDOC;LDX?F< ztL4@rGiJRM&*@W>e+Z)@N;0mecQ4IwFa2cIuH0O+UJ}xF&lZJI6d4>ddiBw0w^uW@|_=GyC#= zcS(B7vYkr{at<`-7FMz-HaDT~#pWh&Sx#m5-SLKfC3tDm;&+ z^L&<~Nk+CeA4mIJc)df^)SJ7k>aGo~*4^Wp`p}lr+Crin&JV)|3>-54`J#U-K?6mc z6`G7}JENI^!blH?d?ks`rmUrn^irYPUw5tfy%h4?>W!<;rJCub`UA-9TdiN`4RX4} zs7_K-B&Oo|i)7l~DyCcu3aqet5F=Oh(9iEu-)D67cuS_l8k^AD9yE1k7$9R%O3^{n zM6}|~Tcy765SvP0qUcmRK>(EsH27GZUt`b*gjv*c-u?uX2%;s{Z>ycykfvkauGH}$ zn1`D>m?2j4?g9qmC$-2QF)!?O&Mfwb+Lje-TAu}AnKH$_gI}?Ixe|Ld0eNwfu>Mx% zOdCtx$hs)0;Zb9)yP>?mU8Lt=8YyZyOhhmr!S^NbK#>o`$~iPfOQ2fd_$^vD% zXQQ~7p9+Uk`V~mBn?0ZL0h|HVXi<{g+xMn7-3TO5KR;ab$vpw{%3{SV z@axru8(jzIU1nYRB#!+8gOcb1Ep}k#qySbDsgZh+wEErYfo8b8-kHS{&63C z>%4Qe?Nh{%aZ%hUr(jbIo9TU2kVIfycQ}QRw=2tvt$bKe3e#ad z*GOYg)51m5)vRRYHlACqh1T;q9Zh12dmQ;9WVtTf6l#=*uxheZcbBsARbgMvhi{g$ zkFuG=j%loZ4X?PHZ&f+cSnPx}IU>3`_7t54Q8P zU)-QdKR;?QyNjq`SlXL$>%6t=#nibd7Ei}F8*2K!8A0v z)cVD-s#F|Z{q~Qk2O(z-n|f0w`u(5scw|fbK3>?5$-z)jVt1u9@O4_JoE3uu3>4Qc zXmVONfwqch)34h1rENa-GV@m`BuYyFK4`xniIEFjb|G$i%1SqFitxf@un;pFvlp0( zrUl;B5bGwDY~!cICJ$}W57{c3 zEo))wM$h^e{t@5EX~gr4A32S0S`Elo=i7Dl(_u_3TCELKoPW>z56Gt5XYLtLM^13| zoaxvRl~I^XMZ(_3>Yk=;jJKeKeKt z_0CC`E00!Qdj1D8!9a*@Nx-pd_-?6K&s6*XYZ+aMjhOZAG1meA0_T)Zo}E2Q=E`0r zbO=qQ(IW#xr;zMEn+^Nx-hB{LX>!}{d(MK0+UKC^+{pfIw$@1GmTcipQ<4p!A(ME!-6}gZTOiqz=`NsSqHg$HU<>&K~ z-3PA(2Bu=QUkz!k1$lUl)_LaYh3TVDO5^nPi9d$5~dHKs) z4r1GWOLRe}@e|?D@7+pI<7YiVMKR2fCcfthrk?qL#9rKVj%x)Z{wB1&3_eT+Ut6JuDG-552sF{g4&7}E* zMv`YC5!@)oEL3!KUf|bwO^cA$iv@|B2~>YZ9`2}%mBMJUDI?7mQBK@UPLI;B_vHXn z0IPbcQDK5($()`S&_4=urZUMR<&Qe7B4r7eM8IQ6AoOp<^MAbQ*vnH!hIauVlU9943 zwr?odmgj{_kA$#=>mn-rWHNJXVee*|;P{vrJKYu6>}xmBst3KbUIri7tv>Cv?qB{W z&b72?<56SBgE6n9{_tFX!22SPz*jaUxSQ?Br!={tM4PFK4*j@23)(u)uKHyF0As37 z#>GvnQQ6C=zML1np@Pg8Icms(xcf`e(a|F1sH;|<2`b0YXz+>zAA$2& z+Yz&(3SJRAZfAqFNzP|GYS<`wq$f@f)2o|03`kzs@tx;5P|={O}LXn8(WGJ-=CZp4lhq z=K0On^33=6E#_BE{_x|-^Kl3POU8UlP5~={d@I-0+pt8D8v?ar0w`sHJc&hG^L(3e ziY>z>34BJbC0+=A(WQ#X&Zkyg53;odaZ}Z0#lTEduYWXJOMy0!N7@h^D^_qBwr&~# z6)n62CmGq(&JhjFdh)O;*zW5O0ej942T41-d;w&J?fP{JSxz$h8wIZNs_Q>O-4TJ% zBx~n+4!5O8Zt{W8A9R9lu46<6-K)UL*%Um!Rj80jS> zwqzT;WOZH7K1bHJ4iXITdkkJ)OEBHS@(??BFJ=;; zp6$?4NxpIU^qhw!sp?@Gt7W`#(ZXa=$~ZFOP;EVnmz`(n(n-Vbq>7Q865F95gn!lf zX^_eK=Ili68LcVf16A2Sn;PD@9N$=eP~qubS$FhTMQ1BjyQuw2?qn5A$_?k-NWyl~0A$W(x?H2WYG?MRnaU9fy+cr2@ERw!DB& zT0S`NuGh3cviQnV-9S}h24GXY54`?-X}HRJy@7lNGy5d+s-RX~tRtRN#Afr<^GUTo zO-uKMP$p}zqkG1UKhr~v_8cQTw!v1(HHA^(JW<&Kts_|znkg+!s_`rxEgpQ2$t^ps zCOP7VJMNVF+%N6^8B&&xdFO53cBH2Ms}45AKy3xQc%MvxEF8I)o^rfr|}umPPZFja(HQ&Ckhl5fPl5{{HmALzk@K8)AZs zd`-Wm@_*j%p{3-fBKx9T_MGK`o1C#DkLbAnir-2)Vt$O{7^uSiQ2HH{g!_1ZQ}J~9 zv!TUJ@n}n9zh`(X$oSSSVNtBIGW!T+JZE0kn=jfA7g-tKi8(15hHcgn~E-ela4C zf-Qdlrcg%laQ~O&HoRkh?ydBCq1PLBby7|LkR{t7rN(%jBYMWw=0<=D(MRj zX(8A$Q<_4f@7zbv9$lFf+`VM#6he-kLRZU2=(`Ilp^%I*Ae89ynBkGVva|0R{X z%F8R?hTCv$KSBYC1iZ~XJBC9zo_ER0}X#+;?c3uuPdXw=VQw||HTkb@1Fms zUb21sH()aNw_fs}Zppu(@PEU>C+FYxcK;U{e3>ix{}BbIxWF3`0|JQ;gF?f?BLdhY zBEtnp@d>Y9CnhCd!g%Q!Z!)v8b8_?Y3kr*J;)v)NHX~tS!3yDug!+mKbZM+nixFE~ zbYyMu$DZE4{(-?ypNED=a?nKKFKu<9jS?|o!flI7@e6^1@#`Oi-;M6>?H?Q-eLFtM ze=AY?rS3;tQ+cEg^jA=xvZz)SuJY&s6{UjD|AQ;8%I%H+Ke^)S{J~UNx2@UU>VnVz z%@yAQq966u6pa>ObF|V$M$lhMjH;j1*436wXithrw8)=M;g#)_Uj6Q?D=BvYUVL}} zc!;3vP>=Jz^-H=H#7&#A1)rX&6F0O@hhBS^Czjq|x>jnuo8UpRP@6J@soTMGIhljA+<*!=$ zw%^jdg6~wE3}}gJKfEacg%fc@gts5>%urQ_`YyE9a{A)cC`UYe;I-ktt?dn>zPLTG z3hQ>6hFT`xymqC#pGdJ$?s!e$9-cC+;V3S37u>!@Z~I_tzF7~Icrf$4vY-nU_7A^#jNqwfNaxW6vB?1|cz9Tdw7~Xg^ey*2g zDg&$gKqvZWq?K5aPBs46KnB>fl<#ZsMg0}KjIP*Oipw;b`11-wBosT==yO}6^^z;z zJ6k5He~Oz6Z+bLBZy?Te$rV5UGyoy9z!Fx&zEA$xOqU9M8TyCiqby@|N3{I%cS$($zOnuE=gi{+jdIgLJo1{xF_&J90qwXLBJA7e z=9g_3(95&8Ehhq%PYoI7mW82bmHny>!CQ3a-sz#OUu7k44U7UpPS_so^yS{}dDi}H z*k>|A76Vipz|&2tsP=D6P(3y-!haf7#fu7pltl?hS$r#>>p>V)#EO`wfF!p|gfR$# zU^lYybRxseYV_eg*KJgjnrxIsGsS}-Cfr+hhB0>%Feq_s5QOruBkC9#sw&5^W24@D z(3We-?Qs#zuK;b5lI-9 zWm%E^u0lOYeSNeSxZbj|)tqeLEAtz7fjg`SN)V2ZzVW_z#0H!)v4w;zNm8b9&%B6Z z>CF|`m+4x)JFK&RZYA=44T${{o{)y675UKe8v;6VzFPM- z8sg;bizO)A;1rD}36#N?4Rd7>%m^dGZ>up%IVFt>lgvn$9tQJ6i6%xD_lwXreP1-$ zYl;L}fmFYe2km}F)9E3>NZrWI9&b9Wt%xdnYNtIjJ$+i&Fj(gFvVUg&=V^T_b-8nh_Usbt_lBOk<*teSvuosC zuZj3QhrvzQW^l+;=Z=&YVuU^L1#k62Z~Hmlf634XseP7+%{#@AG%;X;rPyY~1Zk zp&Lfj;mZfZ9+#*J>qu4KYq=X^Oi7$MMt>KGjtVsoFrATAs+U|Tib3&iAAnGP_34TeRfm~dcLFUc?XH03HX*mD|m3$ zwDT-AT(Es?7v0dEn0=(`d2>0SqK%qf5uWr94>ZZs zr|nUp^BMiqE@jl!wFYYhGi({D0EVR(ck&IviMEnzQ@PT0tuh=q~CP8 zFGEJnh_+*+EBm|VF9q5^g>i}Uoc3bOcl|DjSndnKdJ7#M*W1tI`8a7QJdO@zs6nn4 zT&%_Azagw|!q=bYozRE9*J8X)O->3NUd#B=CPV#G?UxBpzu-TXLm%k>Xs@0J0epuu zpLYsMK+yOD(m&x3*gH||e;(3$G5PkkJ_}KYz88e|*F)cu*Ar#!9UhKk6N7zzvI~_sbqz4uJ-gB~cS&cK^TeqI_p(6cKyjh+;@@`_G|6}$k(ogq>uQO}qe5|W&QJYDwyLG2G< z$+9e0Wohz+`0It>A)!>y1i}ya;8AC&VLN9*Yy>JcqU?*Ung*=Eldj)hJEDQD!GjV; zvM=$3QELSER`_IwMAn2*aVCbX)?Pqe>uq!k;Y+fx9|xhSS*|AZQ7P!?sSP$7rl7fT z#P2-Dtv2`5HUmX7Fn)gb@7S#SR$5%Pzd8Mg38FTt=J}*uRDN~S;1NC;0e+T4_I?z zd?NByIEJVNqqQ=I-rhte0bv_AOoGH?$4GFq0@l~KS67Q*p2BdOUZ~$D-7X*M`1JPX z8iK#hbA5=zOq15_^dd2QA&G}Oaj+uNfAe**IE#-LT*%my;xMKgnC#k36_pInEMgJg zOim?v-i%MS6Ns`7qsoK9a>C%1$#jk|k0Lblx@SsJYl^vEDzcHP+6&&=i*hiA#Tmn; zJ)?y}q0L3`_x8!3_0mWJDgNpyX|ZX8t^f22{A1D!elLf5AQyK}DSbjXZCx`Bsr=k| zIh_IxRYztJdt;wjW*Fh#1bDoe?4>&srq?j$$?01yrJ zztqfXNr2ZIk|S||dzw&|zGPxW);sRZKJm1CK=wz=SMzfJ0(j${Icty}x!V@0~yvY%Nb(=MZT?wQEkJAc=@tDBx zHPP;8`@cilRmegg>v?t9g7t$Tcbs3_Yd{@QcExKxzgroCS`nE_m#-u19V$;>B-c4R2;LyF}~`2wJ&O{IxiCA_gE4xxPdt-|-iGo!oz{-a7BC}p8W^VHyuj&SubA$JHH(>%gor*dO*x%xw4b)%)C zY!^(`u|{X6M)$l1%T}weP-|#f`@pBxD7Dt4xz=o^*8IE{I#OB0P`%g2`#OMM=#;0p z-rUE!a_Nh?qD|%6b&VH+0xZf-zxaim`(G+8S6_UAIr7zO^VH!?8-jfrLQ@;Un=emM z&oo4zH?%4@kQ5pdwi#@)LlR9Jo46ZO*x1spQ0G?H2pn3E(~)9qADJEnhLSKxtvBEY zg7UQJ`TK&|=N@>rM@6Ytwf*%Dcj^}YK5T|#h%et@W9}U{!a`con_C7-ng-8XhS=VX zDE!+D@p&f&ESvO!_4T9Lo8F}=6&to0b3)`7eBN)Q{&zCufbGN4eHuf}o$_UX87Qo*d&Q+n+N)XC z^HN+_a?8pC<6Eb08++F~U)L*1H=+%zXJF{?;(lPUkxiGenT4_aYZL1RGdI6S*2NY+ zS(bs9gG};c8(Ul7=qFE|9HUa62IT%t+E%waUFP9@i7tT&E}^9^3E6)oc4c4P+&$cU zI^2liZq2>!(W!rJc2>TgsYRYy-QE#tJ|Xd!PCMV6s()hM;xVFlTMK+h1U|Bp_$ntL zAn4L>_cwu?SM#sjE;p>G`LEorvOCiDQS`rZyZFivuTs)p<&?e3d3PzgONJ1|adm!i*GTc~X-Q5_NzHIc`(SBl*`@lfbYZP@ zX}j#*VA;S-+34b>1FyWL^KHJ(+o`XW_NJ9hb=9RMe|>npU#h2f{wnc0`fCQJYribi zc|5JFYpQ#HR5v+aA01r3ywjinYbf<;SpC*Cwb-%7+Vy)kjozc=# z-O|<2GB(#TyWO&XemPQosIF`+D{1W?Yx~gIF}>LNA?t5|cXYOM`}prpwY>jViT9zY zd!VCxdi!#->fQg-hm-B=?CkIE?H`@(Km6W*cyYO44a_Y5HRPRL3=aJb^L`o`7#$q= zyJan{jP9LZCV5AHT#S7h8k?9Nn_C)NJs8_M{<3^NUX(FjQ$9ZRWum=yYM^s!VrqJP zY#LmOaIx*!r9i)+1~EuX!he^_Wb1dQm6NS&HP^a>UwwoKl|z;e$ERUCSxts6VJ`6 zL^c19U5V!H)S`_Oy24^}zA{h_yQ+{+ezF-4(ReKyh@}Lv6>m?!PlgXpc}Wkkh(DUc z7eDI%kFV}a!%0esV-_c{DIb9pwDVAQSpsY7itBpRO*=ds;%B)x)H7N6L@kwohs9)C zx*JL0AbNpZrrt(RbP zllax+B=7I8RJXCDX3h|(D}SEZflzX&9E~!7ZuVG5f%Du(lx8;L5!T{a_DFe$Je6gI zU9+>L1j7dotFMe~i&kHod2FsG;(~?Ol5Ac(tR>s$7pox6qCO@v=1+`o0Q z6JU2s>twUwjm%z0^c#H!lZ`i_ijVEHn0Z)7v;1y!3n>LZsM*Mi_!GF9Z@k$loS)*K zQgkmnS{|iPNd9v%H|qLp5d|OkMaq-xn(-&wmnquf?edn>@RCgOqJX>f;`IMBMcYO0 z0+HGp5Z=@ zRNzs`s?w0JQ5Dn|(z&%-`^#!lzB_dNm=M9Jnj7HQ>^u1fSSR7u0f z<=gs^+>2=&8{}CJ5xyywvva z(HwHy>b|BZS?HCafzr562yXTSD4vEr0#YW3L8xpxDxg&U_zS-?D-Fx8Sz(#rdbyky z1InmRk?o&^r05cw*DF02A$#?1WI|`_jeea@6uy8idRKLl@J^2N1shZdvncz-vmBq< zzu=P%47>r&kq-UQr95&dKY_BL|B#ufd^vgA~`tt~HRTPc8hWDfWB)rEEdVT#Vm zh}U>9(?zy3xNW`pGYQDp3XmV*hO3}wD02@8 zLY}QODjL@G%GkOSYVhOxnM;b9+?4i)i>$Q`$RR6z(nS{tf3?#RM4_+J`Phle$v%sT zT`8J_`IDRMaq0z6m=d+g$c+g!r&SLr5O8Z*g?U6=$V|XBe=c5Au0M1aevbCKv{)c>%JcKsW)$L&BXOcm$y-Cj(CRLM!*#+ zAh}8fkv&!t=1x$O-U9tu}C>w^MeW}HCYdL-mt0|LWlSOFlW|x55 z%S@u0OZ*^?J<>grwIP*}E~P+9s8TO037=eC1{5!J0J1tu20T)VKKCRS&(#|l3sYrd zP=m_pOnuHjEq}t7Mc#swe3!szV?)7`41~9SDSz^U>q}}<+j|G$f|Oc|>YF7hh2bMM z!LPW#EQ=V`o{k4%b%3|UN=&|QmDjM2m5RG)zN?X!d}|(A!6GGUb*=lBpPKf4->99z zOabE{GmVN|9OmPV{;5yir`4&eOJqC9GJ;S|RpB6`wr)S^efoW^QA$-h+sj$$;@@3q z_vu?)$g|vkcO{b{C9@^(ntyktSCsb`<-a#xi|aGRk-hTPNR07KaKiEP^Y$r!Z(ax* zH8@?Qa%iX%*f=Pkn`E6oZF;G#rAHx%2U0%_CGl!f)7nsvM7_`JxPpeDJ~zcCd}lpt zJ?f=U@|VcA2(4&@^s0#p$P6bPM5F&<4@FsV%NeHB-N*8ip-&gX=X#WBvOGgL1+2Ao z7x>u=RVpIw*x9msh;&T9bG4>j;_Ue1;KXGz?o+u|0yz4Wj4Hd*4ZCSfBOm>J4N9qE zl~*@v+OBlY!d{#%5qEc=n4V8heyXdhAKZ2FIiFcT)Hi&*yXTsEKD#l0 zrEv6ayoI&ToHZkD%|wx-hr;wcRG>UQEfC>h#q$8COWHsTTh+7kd zES1i=Os=S4agFj3|A4!@TNR()@3zL0dA<0sw!7tj<<|<&1vi-FA|Bv3fFr*>gufDm z42PVTS~TTf9P{T~tIxvTGWxPAks% z^+-HOoz)VifFyRl-3uxTQ6iK1)xegYNzjmtWDo3N7drTOTrhKsS0M>4Y=nw% zkjO_e+8T@!j+sKXgJ-B;HmE4>BtSo0It8+nLqz?Dx38Y5JS}UB=9M{$`=B{5{8BcT zo4QxwfH*^w*uyqr@GVQ-Kp`RZYlqk)o@r)Dbt+zrb|pzX1yU zOteX?$3n#;-|^S}IU+IHjQ&Jw++vo}gUuG&$~{lJ$XD1JBFf^pE~T`p6htzL*I%cd zpaCf8qK3HunEsA9h|9!Z!B6YLEqMX(VF-b$C6gk#IbBwJ#mSVNUz}$Gr80r30UjGn zFKFrgWpaV+72wcZpaRLwoaFy)%ypOKR#|~RKcJ*_e&Iy&*LffSuS2!h(S2ZIXt?8k zF(Gc*3S=FEfwO>rq{yZh0GSKqQb@}6j})xpaCUs4%J@r}KmscUI)?^k;)2ed{pG$B zeE~s5FBK3&8e|f1jR25;7yrpPvi)IzoV^qODnPISj4{HnA{Ep%2oFL*51}^4VEE!k z1R~VqVd4ugfgt}K9~ua{gABIV(D1$ZC~yFv;Svag4C}VPM0$+`pRNH64?@=kfu{8| zv_n+U$QSDqm&b*H)2%=!G}zD6-{64qHXihJ-PLa$ptTGk*FY9bz7%63w={~N#Zt)P zLhY5q$O(~TN?~mugEN*4?Fz$~1!M&YN@1gjsS012diRwBV*R?ZIR?^;*MKaNM=#*V zWRWd)$e;k-U)3~$I6G@vUvf*DQ*q>}EX_A8;+GNP)INrS;P^=>YTbhV{ZOa`&ee- z1cu7EQ*5kYW2|GFJQcUA_SCDVZOo??@vEdbu`rYfEdC6WU~L?K^N{j$E1wd-R_y^* zX@}lE$j2P^C=N=)V~pq-in}6*AS*&Hlj7`zfg(9(FfV*tr{{lmMcPb%&PZ} zS9I^7?+06Rr*>pZC(vQJFE2O?izRgRDb}MAXMee_aUHjgc8@d9$dZ_N( zs;p|4C8ql3cCi9b`d&f3oX!gsHD=AR%eR~erd+;2yUS+ZL8W*rTSfU^WQT2UI9-Ae z&HeCHMeeX43kbY3oKH(CK}reoO12k`T;7n;3b+kkbl%BNuZ~UNVvMtH1-l$(c{@|i zh@j|>OC1ie2lg85`8Kq%f}`EE-&@NsgA-@sFqzBeoeR|VnYkx$)Ycd;#?^d^NsrkQ z(Se0pWP-2bzzfb$v^Ld8B+W6VOgkCj5kDfs+Y#OSejQjxWpBv4J=eHvzi_WG}8tu z%v598YT`%`V{vFFn#Q!rj+{zxedNtN0Y z9vxbZDH&5nOe11)yv1z5=i(6jiZZ#hW{^~J@kifEg?rKQa$&h8{)skdJLI2ux$+VX z3YWK9Y$$!nJQ*ByZ5B-fK#EktI6xwkb!>dSU3)XNG3C5E?IINtf~_$EX|8D?b0bu) z$y-V%$TlhD7AIyCRa#b(G(K(lZ)q3wPKQUlq;1KeQ4~>XFpyQB_60pe9-zw}n6ORA zzXckCY>NaHJD^7-)b^_kPf#B!am<7QS0S zDsk6fu`Th-y=|~Sd%W@w^%HK&AJM%(iIbb^60C)4XF23g>5c(3>lmpiC=!jqzWKG(o!jysopOsq$UZ~@3B!%CE7#=Al%lVc{9E)Pw8yo zbf7j_rfllnOlp4q{J|%f>%9E>aTe-6v|EN!KF#-zE>`NV*%wzX*R6NPhEvg=jv>Cn zAXr>?O;+4Imb?K;i;}r#(84mQ-G(An(>VjRuoP(vl*a(XI+iNl8ESR2+Y9|Zvk@6K z_Exn{R{y>?SWjP2qWyXnb!Q8BRQ4q(S0I{DcmLejnYdQ7El|@}rB~Zfd>G^l8)qhNcSu5n!w33MZe>9OP{q zP9ohnHC2bi1q4aH%+d&?q7YfQcXVJhRJ!^jYrqPz)mNR%?9G6VX=C zQ7r*WavcOegF-%2{zi@Et9t+Qg$i@=hMfqy*DW;G6(g_*FuJ>AT!)CQA<9PpQ1~-Q zA_-*bdy^>(ci1{)O$nh%=Q%C7{cT$oAq{EOLFS0aGUvWGM>pT#lbT(}G%U+Sev<_S zsziL#XdEqbpQgGto#VyPETYw{COht!GRlYwJF2MqmPNz(`yqX0kxb6)^K8Ty967oI zbR~0A4-c2em9xas93sCcm5f}uSRy}VqBPzm|2*VVmN*f#j8PMvHb*x7XvTa`(bBJS zcbd*18+LUr#e~|l-}$M&<(L~|VDm*bSuQdYqC;0zRCSz1vt}%{V}=^vxmtKcr*6u| z{s=x=HW|(Vw!jZfrC;8|bphz^G;Q!u36I#yYnQOnryP_}Ee-80Xk+?JbG)?k+}kjN zrmOEYvIm-1CUf$(A-iX?gB8A^e3`V;E|sm!3GQC}m5HBP7WOhJ5NwO!wpoPKq6|TJ z7tQdf zuHiX1aOL#xNQ=qI}(S=IZMWX%t?_JphAEqBVlO_H}9lrF_El2&pP$!7fvOz?< zAM5X*Z2qIW6*Ln0U%tA}8Hn^)azE^@;)+!wGcDSjDy4!V;t%JPt`z6t$m_gyl*Hy4 z03nmv%UQ{hSwVJ&qP&fD8Ej)bM9eL~-)vER!X(P8q{K{__mtCQ>29q#u^nUf zoZ57Iil`qq^{j7YyQMgs8rIJ-lXj)yl|wQPi?ly6)Ymi+nAbMMK7{u;^=hZ}oG0x} zr9&f$viPD(o$5KZ+KUQ%u-l}A>~)q+1`Kj##Tl4?gA)*lQ>wJqq`MukasZXdra9!F zgB;!C28r@x7bThF+n%g;+E2j61-F&QeHrX#8VAQM#S6iDl$Q9?P`5A-5+6NcJGd<-3nh!xg)-pltHgPlWPpTqnddhxTje5b^M?Ry1<5CXY! zDmT6U*g}+WPEXWNa(=_6=ya+XQ5!S#Uf!u48tWk*uNpCTdg}_b3Rf!5$l>+l&@rrC zeuYXz6#ArBC&-B}F1PVHJvSk6i(LmMLdOtdE^=x!J+?WTe|&nEmF&yb{S;YyVv6P- z#e)jnlg3dMv7M=mefz4JkDs31t8<#l&NH3Zd(`4}vb8)@|6Jic{x?FvEa`1W8P&JC z(V4TYcar)X_qwkPSxR*pvD{|R)I~R2oTSC2mWZqhpV3pVjgVq34DITKiZe_W3pUD3*-hCKO5`Aoc6t;p}JVd%EVo!CN_2VzH7 zh4M9W#nDD**dCn}k4Zs(5#M*C_XMi4=*tWfUyQ%^i{@U+uzTA_!FkK0)Wg)NvZ_X2 z2R51@tZu#?HX6<>smZ<6Zn{07gDeS3Gi#kyZwN~99^!VLpQWfYy7_zJ9&gR=shNe_ z<}3DRX16A%JQf<)Ieia+>*T(iwjx~5kMZi(q~_l@%sQqWUKhn@waa|9+c#F0B>fOA zL|~lV2{#e1MvfUfLx^j8;rK3)g4tc*Njdx4R6@S{YzYT1D?|US-9;W(}d?r|v_^E)_ zY}P@2ubD0;X19*a+QcO#rATb$7;PuH@A>QW9LB9;Ye>_tk{EN?{gv?%w?~uSw)=Q$ zzfZ>7>;Dj;UN^aZE@vR0`Mqq>cs_GH$`YCIa_L0*m~HSPLp5H~`72|FL1EEK!cxip zI~!rPi*1*lp!z>P%}D+=*ir9it4K*5i6m3k$Sh9Zv$ms0n;xAG>1|(125pW!bdRK-0VoBz9+?VGs53z4-~l6&w{J>T<7$!27gr%7s$#XC zQ6JvBF;MG<6XIQQ6pwmx_(d%#Oj6ot3R|<7c&L36N6c|M>U6hmF5S$mn9yNgWF;&( zKH{EIm-%@T*;txyu#5ZzPq*$;sud40jik}AO6CT)_HZWC zu~M|KJ0G3p0vQ*3*45mGVLrAZHgqF@k4nD&s{-v@B4bgA&PLnKOPy>S^GLbkVkdgu zOH)&0BR+vtfY^nqTy1HkJHhE;3(X!&r6<=t5a@~A?*R+p$lpF zA0;m*B)Db-vN;Efrc4;~-JM@V*b*b93;67ArK?gurWInG?pbdecSskhEazM)%&cB= zxEEObF)hB`_|qTZbbM8G=CO{w8l>}WxcxHAXVM+@yvpGy?-~|feh1CF^7!wsn?E;m156AHS{w^iC<8J%w{ke=m^ZIQJ{dFPyI-Vz>xn`7&$0Y9 zQ1J(it!pcoV983Q64N;mE}cVIMezO7H<_J+j@npa`S)oKss)^ z88of97x=uOGT$^nc?;{BO;L)-Gk1@~YUQwm|K5;FIgHSWY`;K#a8?z_(4)Ks7G+E> zR1>>%7}52In0Mvb9kG-}s)v{EA8x1;!Yq|+d_42=EL>Z~5wZ`;eWaEx!KwIzxxh%zXWV^)E2vapaBh=%w zK*_x=7I*g?UTGIAQ!XoRw>&ML%pS<~$;13SSrq*y&*6(U$+@k3qpqf2PTY`Hy0`mx z=Md|ULMg*xx}8gcnMFYwk<-@ho)1`W38)IBpdwz@1StKyczhJO+K#ZrWWzuL6$Dh; z!aa5s<9RdfyOm3%OA&s%j&WaLa=;Qpf$`u=m&%B5l1bj3Mps7w5Va>tUpiu)>3Mn~ zdd<}q&pLUSMjGf9=3VSnxqkNM$sH@!5#SoWN-#}KyTlW=2R4ypoL)Jaw-N>r_sD|# z?GLN&BkFAp&kGF%Y<0aq1>ReGt^e#_z z#lkD@wVLZE0_w~{heFR=89i#tb`vPPxOtp5#=J$GzN^O6) zw2w6OzOG1S-rn*nU7!$E!}t=a5y8v0<)(HBmx|68`e(i)!WCXay=SY>^6egNo349L zy!-Q_BIMDIwV=<`pua~=!K2;&s_)Zte@^XoDfiq8&a2Ejwwl%-?SIhxGWY$@%T~&s zecUzs1gGrB1-`3d|9B19nSV>U7G)`O;WZRuew-8H>>#b? zJyu|TQex+~t@73DvO#-VUGRHLY{zqU-TZs=y5Iibg}LWfim!*ynEW&G7xYU^7s(&% z``i;OxPm>or3!9C)UxzIhuU~pPpS$v42gG3<^X-Lr~B?OL&_7hi1v!2ipoe=S*QkXM7h;`CsW>^>DGK+4HpM1I%R><203-x%#}h7l z&MH!~K+9nTMR6r=p-#~q8V5j|Fjkq~vzP^UAqF-^$g?)WOu`AH`-|H_6SJm z*V{{Jhe=Tc9RNQ3(xwq7_%Q?7@wuH66dc%4Mxz101MRj1AS$!nP(=G(=?(q^ydO?% zkP1kPCNSIc3^x)7W_8AS2!5eJ7L0)F6Rl1_f1jb0;Q@g53@}YapqZqg6(^vW;loNn zpJsJtrSD#_Xb=Onv?j1gr~tXSN%FO)pPq?_xQkP4>QHR8Q2Jph)Mv<3G$`CNb@xg? zt$T*JLn)4^DE57I_jN*AWD8$nDb@mYw-R*MpMKhz4R*$a=#f#rpQSkZrTb0#-hOW6 zG&ICdZRC___3FCq2+??p;c1t^OkF8{&5dI|msuz>DApiN}CI z<4J-`5BX!GH-1P8wq5*f=mXzdQ}MTq{2m8OiyJ4@jz5-Vc3TMKJRA7T7f}C{BPEJ} zA`$#rjdL76Kk?Ml2%N27_>e$;KX};VaQn0S_a~>z<{+>6 zFSYjM7$`ZaA>8gUoMoZ41Q|??hm_9++2aGXoo5~;1t~(w_h&+a-d?FIol ztssd8upEi(DhcFqovi(SXxZJMvbl#+3X~5QKwOg)_4grf?*^1VCf9~SB+g5bK$ zfHTsh6UjgxAM|JvQps=XsKG$G&P-(lE`RrEc5trz5&5Stb7c(V7xqFX0*&N$&cXg= zoOS?myM}k9qF_HRGSJz{#VpgR_qo=E~HJ$LE3;{02)}b)_aLv=2~QzoVF1iEV@PLP7+|sA)fO zL?N@KUqv7-+G6m!MP(FuDeh~&vxO);P;?wOxEh3M2)rnt3sIaTX9on?E`CKh!CycZ z^vF`AJ%K?70dlglosS=iHaz@z7Xm$9YO26-Y=DgLX5){i5PxR>Bv}V(fG93)WL1IF zyVF)VSG&fq+ef{|uVZs?cbacMnziv;lPKJ4lHVAiD;Z{z}nIc@s$!RW4;kNBNkW+C353~LdR$A9zZNxE#4o4 zp2b?1LdjWLf%hN7Ghw4I=1p9pLBbUv2~W6kG`S?;E8TJ+ssa2lZ{w<`sYV6Z5=rnG z3JKPyWLy9aM;Qg-gD)SU2Qbb&Ga_EcjRk#L&M>ko(Fm%XUz}%n8idCU4%$a~z@wcW z2bU;5!Cn1Wu}IPVB>#SZ0FGdy3qn-zB+iF$h7t$-Ol>#F^quFV@$1DL3m;<*I2XPY zcmmblKeBtUJbwKN;}7nd_$uFRN}EPnSf{9z?2bbhb$`}2VcX1-rK^TH4^*Pp0;|xBd)Icj?Z!E zR^yz5uz=v-qMUZnAS^Uk&+%!@8p^U2uaAYgy?-hU807*(1Jg^uCwzK|L~U^0Qm;XbHBA2r+{aL0W?LnntNe4gbapU9>k$tF5l|+H2w!g zXX428|Htvo4r9aI=E&x180IENHuqJC2x;cdkz7&K%-r{Vq;iK!?vQFjZgSshRFWu4 zQu^lS_fLF2@7L?~cs`zSl1Ws7w@bZ2Uv0GJA2r5tPmtVK*Q4J;xca?^vOTYUq=n`$ z_ybtP(cd&kP?e(C{jY3+d$E#C$ghIUWSMQ-hHt>@W5);%sI-9t?<4I&Rj)(Z?pyD#-KrT-@xv&8FKf&BiTqn*jLJ zpqO@A;34p$&}FtOP(&8Q^DA4jIxD{xi@Xo?Tn8}FHzB?tuuR~`a{f1!%u7G%+4Bn# zHcnVyvhS-86Dy*zCS);tfJ6M|D5Dj0rakoHsa=-Oae^nkfyiyJ;68@3uHvvP7sMVg z=;@}oGktsiGAzE^Yp14`iuDCOrc;t?T-4fkj*lQeohK+&GU1Q1Wn_v6w@^8sFsfVuJ9X6`Uj1Ch(WejQ|$+YtCiKGTzR( zO^UMs@NJ)0$pR$t%Kp=_-6MsFhxE_)vjQ!%_G3s;M6gTT*Zt*labAZI4*KWS1ooK7 zSpC6U^l<32dH1Xv5K9{man`M}`&aLp!0}^03$9(ZOai-Mr;2>oqu#M{Pk57FLBZIY zg6BZq!B7sNI`N9e4wgf__(wZMe}_ijW8&>)ufg-Hy9f&+2d{&uY}Q!afc3{;L37%3 zTxe^aT?%*Br~AlVT~>HtGJ|dmnqaO-X($3(DzZm$Pwu%`JUsD@FZ-xch zinA;HI1W`G;XG;Hfvi$n1lD1)s_wi0aLve6n1W^Ke1q3EsX6e=fx=2h$fv35!*i=h z9;t))O_xSvxLi0Zuj2NB1%pfc&vC*blL5|eW1rnoZF!TkHVPN(hdAIb;>I99Uu=?_ z(KW^w`x*sQjZC@FK|e5;ee2?epJ zyF7Ly_68Og7_Chs>Z%{?_zjo-_8_432G35p>@BLjGh?@XR_ zBr9}voJSsE3&^mWZH<}Qy$%tJsSs&aL7(t!$r63BziSS%N2DoXf4jykBc7w}i2^0Q zwmqu3*Y!Rt@haGl84HCbuVW5FPIuCX%28PFMM0%qJ6_Z0UnL!Jneb#7kJF?S0eV?^6!@t?>viX}V)N((=N)z+x3QXm!LUs%zf1>H zors+t)k1`O*qgZevCTP>FImW&Uj5l2|5W-de;-+Gt|OD}g|Ov3|0(dJA~&f%bWuiu zd%J&G5F`p`*r!1CB&3qcP5hMr*)bx$qeQ#O?8eJgB`SEd}Ci;JJ!fRb0Pg-m2 z@eIX`0G9j=aWI}^YyMNAjy8C)ZogdWsOtr&{E<_ejV3*KU8cb}v~BH4>sOZaI}2z2 z+jj}YT2{LCWw5KyK?v(WwshrN@1Zo$=kHrD$%lQNULa*zSXWCWvk8zXUk13(WQ`Eo zOl@a+`|^T*f4#7$e@4dm{sQhBR_XVAoL_x(QUN`j7;Y_ev-$Ca&VA2DOEr}aDXdzx zZJMvO(6#U;x$ag%p*C(*C8S!WvUCn%usF+*?g3C~Z;xo}-qhT01T)pBM{H?ggx!$V z$u^0={VD6adM~DzXV4xVW9{@f)fvOU7jEKemX8surX!WVe05$RUe?*LTIST@SWNsw zbfYP&;CdV~tKSez%T{|6)oCH@RPpJB?16=N?Skq2RU_(&1fSPFdWpa3#7Ljc`*FSy^?Olq(an<;HDJ^_0PVy|uO2}$|O(`Qd_6FZ?h@9MhhnM~6 zb=lI>de1^mjC<024Pg(WH+fH6!pPFyz0$^J*+932buC1>HQ}(o;Vr&az{M1t5t&jVjy>9V-LJeO$Y7Cp*FwTJHTEAQXG+{Cj;^HpI__g6C7cdtoO zv}%dBfozB(PebXSS@A;6+}=qf>+4OuFyXiMJ-3EAKd zN4+YFRmr%N6*S0lW3L=;@80Ef*R18yc#LA$rwY#Iip-n-o*t=GJk4?3g1@>*US`vV z1zk(8RH~a=q%szBi{e9Lij1#CM2WV2mCT0NnzC)sxi66-Fgn$IAF$?=HonY?Vq6kT zb3Iws_5&&eOHexHXpyS?CK;C<@0vqWUC0lp$)-S5_Zu@8?klhxuB{yFm&7*2*wfV> zT8t>UBH?TGvV6|jRjSL7u?k!DF8zOdnGanqe(@f|RLDE$8Z0n8cH5lS|2iPYb>0OD*d@*j0|>h@w}yb*Fjymhtv~fuiN|JY1_^+j(nS zX2#;SY%g3GoW1upJnAEoThYQp(nAEd%?gJ8;tqA(Vt1_39Xw1(Ze;(=E9+UuGObbt zS6i?!8gTVa=^}#UF8;7=Y>IvIH=!DlZNkN_ZpV9O{Mwbee&+hIMBFK@pf*)csI_|& z!Vyp?QRU}aE3Bm&VsNvT-6B;@%Z9b#>w96(q}f5hMKu>lH_kT}TF2WE{H^%MjJKuw z)1)}qwce~3cQy?=_lL9OeUHdpr+fj9-$8G5(=gK$YAMxwJmEk)ThX=nW^J-J9}T+1 z*Xd~CWcSqn3-bz(2IjRiDqY@{S5d-gJ>-Ge$1tT{l-eEh+v-z8=f}5ET(xyoca=d3 zHXno?=sY-0>)=z8(QDpkkD7$tH0(#b%s!NTBjJ$&dU2537H)mHTJ&pI4ou10RPp?2 zfPtXW#5^SX^*K#Dj?=G~T2$pK;x^PWglx`lW%E_g<}P*{ZAIF;y2innMpI31N2>4Q znG>hFji6aQ7hMIqifpBJ=U)7t(;ubl;rrAF!R)quHMYz><@wq`Lu@cr{=;BWcbuvL zixfD{bfSzS#Tic{VvEju50-He(|@$R*63i7q8<0B<7ld|a#i}`rA`r7H4wIOI;$$* zd(+-GfBC=`j5`D%KX6&iBqK3?_2$jp+AL09X4pq*7U3>0m25 zq=*jPG^iv9s$yeVb^GjLE+fMBeY>XUO zF}4xE$a6Z2aNp@I5zMd(04s$dj5~TjjbmGc_04}+BWpHA#l~Mf31#}*P_a+7-_lQ!%ba)e=Sn5D-W#(&fAaa2hf!S612gLsZDKL(>wv!1t8L_Or|E*BU}O(O&03-0F0r_*Y#ZM^TKKM z@q?)^_S_WGs8FFd>Y}iWKxYNHF@=nz<$RcG7M*q1_<(POiw7!2dSh=_&0<9tNT>Vg z7wR_>2$AV-hwCKWhhbMI546TEz3kKYU~uyf1mp^c`uZB?%Hd+=VN#r4;n#O+iXA-( zgeOrXci!u-q&i|#ezUoe+lvdE-VqxO{#&G--Y>i<%i;A0W3ET!bf2*-{ji1NGp6-G z0Sh!~-yhLPS9=0aTL+4C@tY9~y++_KRu|cLh^fYheOy6vVFO zl5L@;Tpz!BLP|7+W#W^Ykq;sIw4u#AqRpx|-y(clVDDqUzAKS+&>(%znIOb@1GOQN zAR1IrQwB@CV=(nv3-UykCY@DrY*P~st}~_eAkyNzzs3olkr+>+chab#j|C<^LL0)) zxhAn+vSLPe*PL{om6J2NIz%n;M!2Fl*ghjOr0)XEkL_zI5oc&p%A0u|++=>~J zlBA!Lb5FZ#mSEj_Tu z01ypuQbVNqVp1d0Oj;y4gSg9{;wdsmT8%W?L%$(TI)x?ClP_}N8VM{ zR|d@x0rctd*W78Jo+UhL8Km^;7M?jYxF^u(raM9kNDq?(mt;IimBJXi+RpD9lSgGe zlKc^y04pr$Tsq6~tk;=rQQt`E%Or|8+L3FJ(y7)*WER|Ml(wP@7@XNsK^zbE!Upt9 zU1gjHRhR(!pTsUKi9LBS%zhxe${0%$QhXdB)5P`pdY^{wrl2b$RFvsMUdVCN1~B|TUr*AJBA8?UT7Khw)zwKzdd~2U%uhE+yh|0V+BG{ z)!rv(rmWITp#Z{%F@{`UsGgDrMyJ;_7M8c08LaPuLJaVC{>O%(=@mPygGJ zUkmZ*w(GkPRPE+UX+DgPSz@@%P<^mpUH=aL?TTMg^W^oiLiSPK-kT>L(v4qoHN>vG zRz%(=`VvNo8%?R*yOZl$8#VeLhQ<|nil{s7@ndSa-C6!T`&{{x$B(5FR=3(>cbeka zx8tlBIdA%F@t&r|x-{|bHx_-t3LR9$D9bq>|Ex1lMD`bn04j25*iGa7Ec9}%?V}?B znomHZ58t-vH5>8m-gG`1n^BW@Z5$72lGO^}pl{Hmwx|-3|1-&!kVYxGExoe!s7Px! zD;=w}^+k!pcsAJf6~h=eQO!^0P{kX3J-4I#vzl!{`rS_4W)_WlO6KWx@Z<|xN_v0b z1j`Q^JM1O+DrSOou zI;8%Zw-v)uG%Y2&)TdU~HMl3ehz{E}yd<2UokbA8Mh98B7%DY~D)gcSQxRsB?oN`Z z$q&=5r>$r`KPl7tx-6RVgr*_`gcMM|w@>Z+=fxuHjX;Q8E?BIO4$=(_tStx1Y*L+z ztw%A&DE_^-tzL5UNlvD*Q+8(6MMU1Aw?i<#j)dwKCh9_E~lx3 zcpRh6hMg_(X#iD9D54s8I!9HNLiT*SuocCE7VJ~XBJhl|=z{!ACqhXAeGfN7&C#EL z#O!0z6K_w9VXYI+=}KEjxvOh0qKkU_!?SSce-2am9Mr??LyKxO=FqM zQnSKgP6rcRp@spV$1acKCAC;s&!+1evD{k=`?10+(FkBgHhp4hpf);q+0QB~s_Exg+p+h?Fg z53e3=^LJq7{HW~HHi9dwCjxpaBZ;KkJ<@Zc45YXUuBf`Gyj-dO>A9eo{>*xvO91;kVH0R`vw`(O+g}MXn<}*69T= z@qJIs+qxg`=u@s^VUa~jgSyXq^nDGIx_dz#3+m65_YYg*Kw&2~O~J@m$-&N!=kaHf zScLE_tu3EGzbvfg!_JtCm$n>3-XZ?D^bK&^Q$imc>fn2}+- zexzVuLEJrJS2PM^iq|T|NjtHqjRLTZ0RutTU)NJl@7rN@4I0}N&Er|5l8jtn)q{F! z#sHuoEbhCa;17LHZPh^@7%=QZ z_5iCIv!;H>xVGrfa`za3?$8w(Xfqhg@el7)p%He{65hou>z6edJ~F`LZ|SoB_p9Ky zzFF@qM&qpi=%wwVmQ$kBTqZhUhTW!mXE0O@p5<-Mb8Hb|E_1)@tgHWp`US>}=yorC zKEXwyK1AnCsZlRiu)=_hF|-77%Wx zFWXkH2kg^#Xgpxph3}GDrQ8qH!w!SR;g*apgi-C)`DVpB{P$)l*qoyG$lz$?VMQt< zb+SIoul7wwif`=(Qny3iNhG_$^*?yewPs_HF*pbsEY_p>YH?pf4y*e7$NBx__==B$NPbFm-l4nTAahXw=aZ@ z6x7oiXI@(3v_+S3T)=Pg>YvI&wKNGU~K8Z17 ztaH#Q6+Hh^ZM5i8if52`ZnVKusD2=~yBhy1Q5j$en}BJYgkfiMn0dZEm4!`0Z!i_X z^K=WpJ(B#VVo*)=MijU%rC3!5JE3l0NU({>VC#MLxJN?xJPU#S^u2<$A%0QO>zmo! zLWFO%i<}qaBp*U86!d(TxDoPxWMF(R(pWURueshlmHX1tO}G-jphv-_`_O*>W@uu@0#aY&82` zb2*^bTJvr6a(_DND??h|(y0hn=X*OcDN(LW$M=kP{d2{-1n97xrSdDgb3*Q6-_PkC ztf=}HlK|Z1t-fPe@NX@ZqqmB)G6B(YgiDwpkUR6bK|IkPq z_LMo!F>Alx7aueFV)*S)g#`?zCz=uquLvNAoZr6R%*RXysn5x~nlCj$Kc%ou>pR})jDz}Zf6;vO*$ud1$1?Hb#x1Q%>Io7uvJ z65HAOQBSGB8hu9ISPCC*!zmT#L+R|tsQ!f+3HZz`LWTUmy&G50cfCwm>>gZNDsFmb zYr50;tCLkef}CCG+&Bn~?{N8?QWZBe*sR9ylyTyhNmz*fB!>8FbHn^+Y4k6dbIrpw zn_2#mGI8N2Q}iT3Vw2Mh;aNuE_mkMD7D zM$7cDizQ}Ojt3C8#_}Uy-EQB@fp&c#GmQvw&c9?2!&S&fpW~VVU0$Oh?z#MGRj9#@ z{_|^*vz2LePzT+F7+<=OC@M^*Ds69JMs0e=Pc;?#=6PS^LYW|S8vzJWj1wul%#dXg zsZ3|GoLVsDa3)b>0GK!*ciOuGX-VN8GcoCvM7ErXwi}3ER>hUXtyU_h{%$#iGgjQm z0H_@(J&8L=8F#vGm!)V%CnJBmjjL-=d{a}0;+=pz38bptkj$H-HmaEJ>@KBcnKYWp`@QYY|R(NjL<#DNFZN+QNn#T zL(V~W!QXFN(!2mvcE!cS({hQOsb(r-I{qM4U1iok)foF&g zZ!w{M1kdCv#Rcu)g@X6|@eZi5`(H_zB-Vg(R}OdRv#wgHhZ$xn!FtKEqNaf z+Xurr8jWv1_Gd7b2ROf8PkEfjwB%c-jZ>9bERm3lsjV5u0|)O0yL*uJlk`w0OYhTbk$S^A{Up~4dOqQv@zbZm7jE`uY@EdZG^@wA`JkgXJD3C z`^fQ_NHi>!VxV)n3;=Nj+?&=-b=WQD58wWg;B1>H*Bur6`YWC<`#-w2IWlhe3{5L$ zk+l{h$VTN!2l#D1# zB!=yaUHiJgftiTQ<)SVaP{!e?W>mn_iZeL1{D^DpZ52E1BgA0>oiq<+4ItfqBi1qKuz z}Wz(U05%objb8Qtl(QZ?wMq zizBiss=h#e>VKF3oj2-{iK;&*Rm47Y40rdHzA{M=mRW%w27T|jtZt8um_UjnFfRld z35KKGpr9!B-BU1Cxc#)V>2y+VD(_kQ9vZ%l0I2VDX14bIe%HYPaf(=8 zj%g){OTrXY?)bYV0j4oQ=p3H-s0V+s*0L!V)!<1FUndyFLMbWys(&a`aE0^GxInY0 zU$&~T+ooqmcnR~t`o)V@&Q@up%pjHT+zv`W!6$E7GjSj9DI`+@9XooSq^js`iFRbK z01qq#D)Kq;RFv#<)K6!boJ^ZzuG}u)1AW93zW8W&@d*;cZ0V0hP$J8TMZHgl*!1Cf zPc%`h30YS@88nh>Cid-ZVhW2p3lHUFE?7D278#_PQJCHf6R4hSc4hUAn&2)~AB zpb7%(S&xQ18FUHs1HR(KFTg7r^W0KD!q}3lKDqbVs6}S6$tAaf%=XU3efl1d)~|_d z^dQwXXo6!=lwQ6xumo-Gh45z&MXZ0$NrVVEANhIvP--U{tlL+qH5kXY-XI~jEmN`f zHKN>R2_WqK1hh%oIXZ%&njXsxS`nRJUWDovNs6AeiY146kIC92!p-Y-)x8UM2Fz_>dV*Jxf= zfEeK;C&$Hh#C>UWeN`w{TbM zC;!1w05=|}qy-e38Wyc`|A-z|j2`9PM@k$b-~XNXtrfKYRwk&SLZm8|{a5*6gM>hh zjA;*<=U1#S8S}S~>M~q`f=eJpnOzo4pOs7v=9^DQGU(eiadcpe7V!p;1lu4}>k4)IMyPU-?5M?*eeB|KvxE?y zM8XntyZpgzli+2NNU(wNup#=dT?EeEdz%DqcZd3uy|xm?PBO|o4XlF{KD7&;w5)z# z3s28#@i#>AmjO!9L_S>xFLh12BbW^`)qGGcJVWOaiq#lkk=S_;e{lYHfs*ksnLB!0 z@;z0;T}s&`dBSz7{U6fgV2vZC`u;dEuSC8G=RR}$1baVkNs8r@GT2P<5kJE`HnFjl4S6ComA4-e90-<6@oF7#a$41k`$I)V9T2z43iOWQFxM!w?gA2^Gao2u;i_DY9yX1j6XBbi_vvI{YFCY=J(TFgKjq&YD!czZ4HPfXRfTz zZmJr-zsASf^XekIJQb}$wvJdrLkA62raf>FMxdB?(Iek`72e$3Q-En(rpg}AJ$&}=WM zkYVZa0oN18RrpPMr_w6?i&eaXQB}TU0~#jP@7NM2Xav|j#Ui+0?p+c1=`aswNPW@Q z`VC3;TA`Va29ge1Z2#jG{N)a9J;!RtqU#qYsI|sg05s5;W%(cx+y3!`^y)?}K)G%?@FuN-qC zL>(iF7t9QlI4F1m-FD)f89f%W5-x$$2)cvCSXq%xe=d665sdjgLA6v*wRmQ3^$W;* zz;Jcpx%^O7=Fzmpin>vafaBk%ZhJJre~-SMPxa(?B=oJF9$@q?;bkxO^O{ij zgtKe}3v5UF+@E52y(#>S6(9qN(7g3SdjkQDiylHV7YG;6$yPGPPsk>wCszw`ANEYUQGq^QzEYY_sL}EqUrrjOv-oPCl~y*Jl6@qiG1;o>16)X#SnIFmFTL_z&#-#(O@Oev*x;d5SagM z{euAAvpL9LDn^9toWNsLDu|Pbi18e!a5-(zRrxEbCS7}ZR7f{_a?JtlE5vmwa(-y{ z!l#@b0el(U0&tGE4HxLK^=Epk0mygkZNPiz{Z|xUXFu##;eO#q$ox%(jOY(j&fmpk zE=noRNXS@A^6*OCjMPMzgC%;efD!~L2AmocxQc|&okBrcxoVUYhl+y%b8u@l>5?p+q{r5isac+wYZq?^hE8OWe-g;t;Dta3GU-nHRM2t1Gl`HOhjx=q>s zrVY^^^=)aDmWt;qp^9zarL+j!zRMn0}QdVn4hep48MGQvqQozG&+bV^2YSE8Jl@9iiGcB%^`uO%52!r`_vT~ zN0o!3NxL>Pxa~c)+^JJ_J(NKpb`bLM03*1?;`f7?K0-}jUAWbvX&xSW>-oI=_Teo< zSmts<=9r^`6PLhXq1G{n2xoE3>b(AARVC5iP3T37xq_UZLph7;eyhYl^-kyg;-O7) zaR1ZLcpIX9EVuA`%vDDHa2@qQ5H&_o?(;XfQg@UFGx4>mumu_)Q>H+;0wYW) z5M~PWO{Z$q8U)XT92b>4W)`NV?ouQkVh)P2U)Hs!oo>Eo`iWqwJ|1d3Qa9ZYD*v** zDiQlrYN|Z@CkCJ`@oRoaQ8=6b_ba>R%3sJT>BZYeHkU1z+E1|voD2y6iq+$iQ={9e zsIefqVfDYT#}{UwvlIyORa`mMgYsl}@4r#?1puiQ>PX|lvG25B1cj$PFJ?C9p%v2> z0AP|ru~J+%j=1wTUk>Pg4o$W@C{J8A@R}&moBMN$qgqd;j0IT^QIg;|MOsklDXkW| zcRgP)0|3mR8Q8u=CB_`Y61VhT-WM`TNQecR$`0!~=i}5B)eLc%XFFKNL+1 z#8d7}Y!@0(L4V3os?rm>GoirvT+C2!e!zbew9d4E2sg8J)gx|-gE9W@AB<+!Q7n=s zCrBxAWkASXnQEZMqujJ-FLlofDi3LOvep*r6B1{?(}<0W=g=J61-jb?S96YG@065Ssf$!&~42<7&YKdHFupyb>=}FGcTLkO1UMOuv{caUU@!H!hOwTIZT(h`V8kGG4gCGcby9-oV z;Y(vGbQk6SFcq5aP2JJeiEv*+O9;Nq;k)fQ)s7ju;6Wm9VHyZ-wje`Fx?mRocr2qQ zSJ*vbxgc=8iPxF2EWQrQKrdBVfAfh2Cs)+ef1(d7yt}gkHfD~j&;;j1bl*n}9j!3^ zC_w5(Vg@&G3C*EvZjkr4PwEtZWV!B|VyblDwtuj1FYmP8?MpLM?x}T#`OEY;F&t+x zcYT{vs`*_}mW}fO$z1OpzWg;dQRV!`|hd#b0ZND>krDx|&?s}mvvA0O|c=dXz9cvHqn5YV& zOUj9tzs#90zRYPdIeC3=l1yl&8d@&>vNJti6Rw@?;h}yb{#ps_YRtRyqCPjh;IqP`aPN2bl6dWm*|eKK4CTqY zyi7w?pRv6r^5zbeOC$nQw1${Lr+|#{8JN2vEy&?&hy8(%qaYP(X2psqD9;Nz4?2yDY z*TQA^W%ShQjkR>gQ$lHF4~rvyHaS+{ktA+$udf)pD_&a@jnw17H3Mjh;BmPW+H=L( z4pZ=7_|;2syW=9x`YL2CPQ9beP$lp0X@=iCe-lmK6zv1LGu40X!@n`|h72=%rJ-p& zz1gx>_@1K$f7yN>!*;yI{vc?tSi)cT+92Q4(PqD5V!tev_1r<7U#(Z_CG~F%nY;Dv zF`b!@8liFSCoGAWHOJBBFaVm=z4j=A!I^r`d-nCGd!Ec>)B90J20A|e)9r%yYkxfP zFUB4bq8eJW%U45ILOcrID0`KDaMAU!lE_?*bdh-@Y+IVnMkgNRkP5R$zrE9|x)#`~UEnY6K61Gb9TT-STQIR`$&&&qPCnVp#PfSr7nj@OZE63@ADI3OYDxZnT$2o}xotR35 zP=zTNlo9I4w9bn?HHVF3%gt7SkEfAx7y8!lLeC)1 zoYLR1Ao-wY$?Dtw;&9QoUKVCuTw8FJ8f={IcT5kf2{bvEg6S6UZ30_xs}wCI)@(@{ zAoQ-?DT*5SRXg9}0JPS;gQO`?@`}H`ARyn6c#lQQ06+wt!ddV9Ze~SLW2aBa;)nm- z{I+I0PhBOS_m?Zru$7!{0KDprkh@)++ON%~M^s;L;m`S z=dG~no~#1S<*TUtqE~gVM+^-CEZjbnCFYxTT7Yd;$aPhwr_Hr9oGoO?=j^McGLv)U z+?2h42wVG<4V=9elkHQ-;}NvJn|L;9o&U-g>+$>jietM}PA7b?_{=Yr16u{1x*=il z&J9!F>{_+MyF!9*pyp3r_=p2tIe@pk=+P3PWnhI`0$0ieO)k%Fn085k`-9b8e!G$+ zfQR~>8q}(;DPKC0ChZy9e-Qmtf2a9Aig_G575292YE)lIGxM|hY`{=T?B7ZKuYP7M z|7AYl3iR_S6R^3b7*=bfP;Z-=Vqc+=7X?hksyV8TZH@JpeA|8dRCp4$MtP#*=IUtP zR4$j7w_bJc_pHU@XS?5w8SU>36LnwZ`!|>P9%`J>aKMFWlYjOG5&2}r731P7Wi(-q z?{A8bMx1=an#)ghxAptLsH@wC&AS!Z9#?)_h8S!bl*CAT+sWo#5v@fP=0hz?fWkKq zeMEWp$K)|!%yFb-dzQJEPV*#UIHJBSCnmvDTum}B>;2PbqwzjUh83P^b*Ouz@k!n$ z8KiS_XDdb_!Q81leE)tv?YVd2Q-q_AKP@}NryFpumuJ226;I$Mdt{Siji7vYq)n5>A91{I*AiGU&eHI; zB6C%O`;isUOxbB?@aIZYhLDAdot0wV-|zwX8k0=r)^(u)A!*D;12y6KItKos;ALz` zVIq#qof|1$C1&yP;^7+dnNXkPI3$mMe@*_C5Ff8@NGhQ`ol9rESDv%QF~ix-y9X|E z6_9`P$GlrzPlejTbgiE-;oXy~$Np6Xq|f?2DLlO8vms*H|73*S zW4&1^@4M36CTCGW_i_c>kqJpzJ|0hLLVP)1d!ES(D5$kjzYzI)nxE&k*PG%A>GHf% zcilYi$3?F*?pc|K-7O{+I*rfZRa!n-DIVv2=qSA2-V{IPEp+~fzm<|7TWtKird3Z~Ix=nOWYh>j>!( zVI7~=N_P&w6ENn(yirum^TF?f9nr7;lUAo-LbtT5mol~AL_K=5zm+xMTzliA&l6id zj`ru9a{#?F7yU21cig|%!haW(RYT^^Fa3Oyb8T4Ny12Wt>Hr(xc`5YxSA^WiFSqvs(FakHe9~?|^)>Y; zvc*xdf_H*E!X^e(-EYLOCE37gk0~6RQHuj+-Sn8OwHUomve|R0VUD*W9)=W_-#((> zR+_(|qDkr2jQq(OeRw+hk7+b$UExKencuof8lEz4DqbifTKtKkQ)GaXQF3EKvnR>l z*MoI^X~NHRH)i#Ciq7-HZm7k@)>Xt3JZ?9Aiv2>oRX=rG5_YF%;~dE34y1s3y^Z>< z@y^mZH3=LCFq61s95MH33o29@VRBiD(4^+r+> z%)!|7A#G^@esA)8rj%_O{Z1}JVVyPkbRz4I+1LVGj!#ndq>rNIQ2SRo?6VjciI|TPJPcpVJu0Y~+vRT?uBM7Su3L+^kp_4XL zAheFe_zo^CI_b4dRVfO9^YXZfA zE#dZ`KG40s|-sLPtP_A;?ylLJa|jYS z#fxPo8>7q79GhjR`+(dkG<$oK!>a=)jtWkLWPTY{4mJVy9ANGNfxUpjzbYW1Uo70d z2Y*$=*@K4V`5uemFNvg)*xK>=4s56%K(6lRY%_EAQ|j3_!f>`+DpFjfldEc%wR|F*T!6xK=G+}BzL%U{ z?#{Vvz&nC2nb`GLmE_P`zvMC?EHcUQZkBT+m_tpOW0G0&iYf80iD(qUQPauw4kB#7 zS0a(axq&a4M{-V(O2+U;OA*dk?z?K&IkYzlpLBAs;Y$|kN{<@3&ngo(vPwr}Ew=G8 z+hv?Borw22_tbzKD{LI|XpT2@&K}Qn`E9)@2-3S|iJ`)F?e2 zEU?3Ke7C}!7hzGdAS<*G#W5r8dSHSo`CN>uFE1SmW^Hp(RCAU?fnNq2plJAiN_s@YBw{oG^FFgy+(Hc_uy~wdz=H&F- zDW^Pe1%lDuIMumpX&2`7frQAORLuPDKJohU(=fQXSEaT^jn`IjB~qeog1os4e?;G)wR0sGQX0A&A!!Q|RaSejnf&0`% z&C!JCD`>6wML1lOZ=LRaORmP7y}rCFXNT^Swdeja3lY6ui}>Y{!w9&L5Hu*s(Kd1H z(FTxgDyyjs&h22o=U#CAZ$ZwF9I|@~&od-^bAqGY;yRTd{v?YW>P$oV*n7y;&t84P zZf04c>cmt>eGjoTSyI_77KGl}H=N(x1I{A2zBA#%|H(fA#axsVf7YtR?#^uXS zHkQ8DL}$fjv&|-%9pS-hOg|)*Jj8@DuG+|MK$_%G6g)t90TjGydAZzbL>54?yvOhIL^H_XaCn=FGX+Oam-*hSks1MxpRqC5zcN5zs@ zHHz7Wc57+RZMIAZkbF0#(aJu80n{P}VPZG!FDvgdFISMfxX?-qn+&>m#N`q(AO zU^Dxp9ajdPonQtV{?f8E!8Tv=ynE!u>PT^;G{;mHyzq0)kxiK)cZ-M!bZUa5NzQ3$ zf}W4BWcwm9gQ-ddK6sWBR|@su-&7C=vBt`s#^7` z2lQ&D^=d!v)fw&8+wMJ!=#x+5tfO%f0{TqT`ph5qS&sIZrEv-d^w{EFU$A=Z5bzrC zH@&U;wd3gP(<`s9Ao|^L{WFOsCKi_WjT`o;m&J7ZgZ%rSy?5^U`HET6uQSu1Lj#!^ zaQ;Eo&it&M7NS{AG@1k_l|TlvltHoyob6{Iv+$-PCPbC~MyD0x*`J>MUriYSuqF4&+>4pS>>$Jq~U1vkj@EgRtBUN zaR@hZd7+1R04EFwT#G)UN&*X`hukTk69e{uJdj9XxzGsGDFf2d(vo!3|Fawk5`mu; zf#-B5b|c6eAxY1>xn4yl4R(OsNMP0Av_;)?`5GWGEAhwUL{-u_u@UqGH_8b>ZIDN? zSz}KEhSo&!o*SKe0cqGK5I`Y4PaU#93Y4;(*bf+sO=8Irr3p8JiO6Ohz|>JAI2$fn&m;_rzRP7s{0pewj(Crfx%0KrSlB+244kDYg5jy@K^V63;Zi#0i_G+I}4dF7-<}f zxz>yMfs2Ldi^WeC?~X0r+gW_Tu~dFJ25I-IB5>(pI_7o~PYrHb!LY)IgTV$~F3-+s z5yP`mrSjdEfxT0;tHqcN=*M+P@4c5hDGxIh7LEBIBUhii9INmYo6~BqcpifqvX-3* zM9u9`5KhyobRZ`aGE83wY0qSqI{de$W0=_H4N>B4tB zBd2>|4cnx=0cne_m_f6)HV zW-riwHDX5Wt~c!a=)=b&u`txhnet`_cw@c$rSjwvAU(UA%N{vv+4yX87j!v04LixN z(+EC`?kcxbwtLQ%!Z|dBOAi7hWxwPKM?zJZFt>>}vL>AF2C(p5P!NTs3Hin?19M^b zvI!ny0!T73IEGnp%(*e=Htblj__h{H7-|ei!-EX6H?V|u)m=o^+g4H{b6;gc;x}iZ z-~ZUVuc#&-zQN-VTIe&Oh8~(U5d@@bLT@5XK|tvU2uKk`iV|w*geJZB4$?t-FVc}N zAW9Jt5D@{%;`4u=_w3ny_w3c)ZB8zdlSyVKxk)nL`F*+$B9LQH48f%hqvbdgK+a#W zIKa3ZYf3U<7nu~f3x$D?*Pwiz9Q=MeNm?Ic5;s&t>g#0o$8Hfl7TNs*8;`9VjYZ(k zj%>XpClkYq+FK*;WrnkVdz%Dly*szXhaw_hnd9psS!N6BcaB7ae3b=)rY4&Cuv3p+ zB7Z#AsY-~Wj7Hktp0D*gIu1Ar{JcjPja-SP8Z+l{RS~_kAe@P9R~CjdutmM#ee&hV z5TV%`8@Zl{qEg}Dv|kp!qxtCCLcRv)L(A?eeD~^`X|9wCIA}v@AyJ04_6W&M+m#)M zs=LD#vC5l;yF0q~j;@ZSEB@5rbvPQDKFT!wwH}PAuAu(L$;oH^>A3sHkE8yhM-{i( zmqT%@US@tT*q5GX{i+v&kGq&wrL8hCSq?xEvO4dx*BVn52a;Z+H)Mo{+;RMmg zg;o7URc8v<1`dvXmz%9rN5#7Z_&*4U_q%?sZy1!=kz3}+jFXKaN+(8-WQ`Y z{LH|1>mshkW0L((s+DI7;?J{Nf3kS~EWDPTy$7HA{)e-C%`9|DZ7NG9j_b?4rKJv! z8Fr7k@jvIV%U45}i++FBC2;z*r(}`HLFykD-_NaBer3MIT?jl2Yw=g>CXhh3b&&_#Pp=lSc3%c{6h+_KoMA*@9X@n>l8UE6+n5VyPDbL(RWk^VFG7I$#h!BITw|bD=oLqvARi{!m2W!vUW$ zKhj}e>B;K&`^47a_T)jFS;)0&(n36{v}{tQw;!k9P!}TM=hSe9 zed1^&mD*!W?cU95qAj(~bY4(dbzMIqoslf` zry%F1b$IPp5%`Oz0VhU06l}C(CJ1LIee}c-ca)WQnvgTA7UQ26<4-bmnfolR0C#!H z?%{KB>EGvk$mD4{aA{NJ(Ng7MqIxtv-hYUD*!1yi;?BkKoj;dd7uo`CCQ-=XS@wmN zk5QT@L=sfL^t9F<_#sOzC9Aj-Vyirt^c_gKlb0>o@=U}t~hP~-oNoIv`T*A>f;fF{~~wRx!Uc4cQ50~JpOd7 z{jl_CzgOtwV}zNw z#Nkwb;w~kxw&0^b%FC#RgHS|exySD~FEwZMp5N7KCkWbl5G=LygO&zKOcCfbG7j7 zi^=)=zV_G4?d;vnA~XMWd*YTD#mBdLBcJ{IQbyUCSVA#X&8h8KU4|bhUQk)uw-Vrw z|K?f9|K)OpGW@-YJp?c*=a zBxhnLDVl+xPo|hmO%pB|_)ay>?d`h*z0UeI%EX($#@8r~Wpf*kQ_E81Y7dTPzny=( z3$KfQM3hJsEHg4pomUwJ7je+JaYLDV7l&P^Y9Mp|`2Ae?%;P2BMqCXJKc31-W`x&a z>GBTzkdpF7mVecd^W{C>x^L&Xi~AKf;A9&wl}U@aL=Ye)A~{I7y~ogy7}sf!Zud}i1p*nA&`F~ zi5NT~d^`x=D~LXRsE)4Qm2YV48+FARUYUkhpy9tM!=MEB(1I(q&^x@qCp_IZ@9pb| z{wt{vjco`>$iI>bF;`OIKTKhE`9Dlye0;){PWUD~JoQQ*{1-u(Uel2^`tb@M% zYYzSc4zBK8X@jL{$)$bMrAxp53WICAe}%#6^@`H`D_-zFu%Jzijp5s}|B!;qoAu8f z{$hd+EmweGbA@lq^4EXUfqkQY-M}j=@cUW2wO;3y4_K1dv#{Qqo$@ataHVfxr0?kR zKRDp-UmWn$-q7aJ(B980C2(XM_b(st-#Fl37I5qAF9^7@G5zg-0s%KR|Iq;dW&h3o zm;JYVc=DJ0+t~bv{QFZT?U^pMI%nbIn>O4-6Dm-_}FK1*0qlBH{U0UjZ?;wJaKS#glnz@dA&A>q_*o zx33ohhh65(5%&XaD=?dZ6XBXcyS^F?z6$q zGk%_3#AG~@dAIeJ9$ka`*VVDK>-(#nf#mGbN0Nu12IB?q*ro4`HjU(IcBr|^On(7T z*%T4bs-NH2D0gx4+baUkS7|$l!4~d)!>D=bGrWhF&c6;$f5d-ezxdNtfkC1t9_Uii zepC=;LOVdx{;QvbfgJrnKxrR18a$OE+*7{HlZ@F=K|V>=VW8$Ow;Dk=~g z7Oo<&gPJY)JeBIDU2311;=H?4lpP|lTb!Tduv=1GSh`zU-mtq{R^5*i_*(uSB(bd6 z8?W|jRn|WKUUe#&=3WiY0v-<=W*fct_DM7zVcm=yAu>^AdCReW_I-&?(H-ZJZ%qia z=6>^bVVQHwhoss4mV?}rePh<=;P-dgHfa-W-@PTjE8`Tzt6-<}kq7)=hRalwO4@c1mgTWrL zE#K5C{*>|`<5};P#Sln_DENEjmB^%K70DI)se5Bm!1GlZCy8D^S_Rq}0#d)9A6~mw z)Z5aZsB?WV|7u!`RF(2jS#&82KGDB{WcjsX6Lo!p*jpASA-U>*ZEWr%n&H*dB0)|p z{d$Nb6>QS#8di8b`o{w|L;y$b>BGn#zgYzR?11BE2q+)B${gE1M{f&SwsZyARd{`T zI$Pnb2e8cCYWL^3Jo%RWuttYUoYu^jDsK9Ayh4Nj`-@is!WF6W8ox779JhH$b4PK)(^l|4vZylPZQ~$vA@J>lL^W9)YG>tPy(3pC|!C!$@l@h)vu) zWssM1?<^=WluT^Yc}Kv4y;`Li=8B!-4sp|w2IKx=r*PKGQLd%^*a^(j0(@IB_83in%Ai(_$S3@ zv%-6JPOwBgvzxhjP+KwWtdH8%VpP^Z4aX^h(xp~s%|-Xj@R{k3u5L4`L#waRza z`tc*$`DTbG!piZ9MZ}j6eKIFCu~FsL*JM*~57{Zpx&_+qqyVG)gKrZkza?7MLMAuH zYJVa_DH-h*31>Fs&PE9LC2zsM^4!@61joNW3 z@XHC()oqjiSxhhkm-W*(p~{1<*s|qCnO{N+8I>tPvb1ov-V$PX8vAgr&SB|O>;0%I z-!09LXNxcR{0G1L{TlgrdG@OVkE+`LYQ6}B`Lq+NT^+zMx^^{iybFk~4!WkbPG)j? zMd?(BNRF;k`JDD}P}N{mwKiaBjQ7W^llzJFGU-g58Z&-=9w{nI4$6IJiHPTA_A3nim4ywtrDoGIP<`8r@Tl{JKJ5JT-73sFRy zPis#NYQqDDV~y~l2%7Orh+r#my|A0~*>345nmryX?|b3eLks{m;1Po|9`VCloJ_|= zy4QMV;5iUZOg8HcvR=YPeo{!@m?K)Pb&f-Qf+1fXkUlo%9=WW~EPcuN+^P_t6BENv z6t@>Gm9{))E2-Jtwr|g6xq@3&^SQ3478n5q*B_|UZO8+j>^_K$7WF>xXg^lR6hTC? z$gM~KalVoNksBA*NK5#N)?R;UQApH)CUwmTtt5wF=ujhciNb`vSz3nF{6gWGYbTw* zL@b^R4xk>_VFN>mC?zqTv=!Uwf*A`UHw=~O4GwKO()oh=qsVNXV~Zp5$w*WQ#tSkI z5}3Ig`5t;JL<)-)1%^Ncnxr}Dt??6Lls?m|hJPTLI_cx+j2L;`io&}Nl-*ETn~=k_ zNpijjns{X6iHlqyvSjIa+WUiqVUSj!0~}xu+CpYgci*`gPik;oID9;O^?H_D{WBIW zvwfhML{B#uSmezA`0iB_^4W+B31`ap(b2StbR#qClc|Q2P5rp+N@m}chpOtPr8fX> zE%r@?Cu+ET^ySx))^~he9q)pKbbM8*36BZX+n?O}?t=DTCnxVm^R=4bQ*)dclPDX2QNghH^rY*0K0RR-VA87r@Z~Jh<1_KHo8y;h7om zip=#juxEF#aK7~%k z(v3WEBLJNb48b=H&!&D61s4UftiKkNB9enX+vKIatMvNXp{pb&z_2lx3W_F~^#6#( zV?KpDojT=U9oaE2pp!2y`=4V(yzdmjoL&UxKH)QN0B{YCkEH?%_cB6?HCDx*86A|2_BIUyz=I%GM6f0UhM~*N_!QL9308d*5_B_Asu6_Zp~Idy zPc>lBajGJc5sF|0=_zY@B0y^Hol=7*9U7J<>Yg?qPKANC+J;bIpHrYij4*zqO~67C zV9MYfocyHjNnjJ>3z~V?VySSfTHv)@+xrcGK@!kg3?CtJeg7*AQsZ`qBvM|=Yw8r7 z>K6~1R~AIM+!=6=w|fmoxIDE1z6}7k8Dl5Gplp155e)D(8LnB(+9b-J*#I64c-|fa zq`mA&T%X$8#Rv_8lA>YZZ=(3IewM|rD6Y15yz3HqF&Ajmh$ZiGx88P|l!_zh^RS)|zOVx=h+}Rg6BA<{V!YyW z-as6rh&djH=kx-mv;<_T1wJ{NZEwDh`-V?we~`CT%*Xkl;4ts zjWxW6OuhlIjzQ{)B$BBtx(WPE;R09;#{VfI)U(YqgHbf?Bd!DxCiVSP9F9~>FVj_1 zLJ~HThP_mCom@yG(e?6>PUXb_v!O|f@IariS2#W=yK4j(bK;2Kk*!4`zh7oNO3BQz z$gp3C#sEnSU0IYQ;h%41m8!lBl*~{Y0@WdjpI-vmL)o=_!2MWaFN^H00p|{D7_2E( zEH5+bFcXUM#<6YD{1{jHR%^@8{3u^M++M#wkp=ljZ|JOY)DG ziTFk?RXJkf!%PaKAiH@wCOePcC4r@e`0BWvqDBVaWV}W=)JO+38A?R{%3pm6X7_Wh zGyyO9i=4xWUY!-)6c966gwJ{bFaellX{dfG=#GPUU-_>r_(b^TU{&!OD#Ied^?V&N zlI#2#cEir^B!LwB0+P~#x1dL6G5{nOYcdouTIQZd;3X9%)(CKnG zwE!|Ld|SQ)hV#U@U= zTn@WzUh@;ujr#RFC)O*qpfveD+?&S#-p`jcHDQ_eWn$&L3!MU3r*#%@@*|fpD<-ET)yA6fTO7 zkU`(KsyNc{$Kb!^7PJqssN$}PSIem-aIK~23Q5payHyHGeyzT1Cdd4oD=nnH zfl$SvOjjL-)UCV4=SymlZYvNSQlbk*;8nj2X8l@%?yBV>&jr>iox18F=q7g2AeEeY z`~aws3HXH%E+&~v(p70Sf?+%NI!O-o(X3!e1B%5f84%jaBN>w_BpV4@8!08t&1oJj zH5!M0q#SrEg+OpCeROM+9y!>0Ud1(O8wfU#in_lpOR-9=V8(YJN(+EU#+e;rh}Sd7 z>|3}|HqQk!Mm&k=p8}bOoE(Xos@8T6wjB&I)!tuB>`ZfDPvg{2=oVr zq~jrLF;}q9`0#T|<9bD~?UktQdO^oea*);qd@Re@;oU|#(9{HXK?`CAq3w2M38(M^ ziuF1I{D^t}XhsAPgK1+1bK{LPfYh*^4qdYT+x@k1A9|P}roWLxx9NzS@oG+c?1OT+ zsO>%59z}GRn1#KPmrbuMobnpPHWFx}_plsJq1!5D#HLfq0%|&4&~w~!Kwu=`M;_psX^VPaqcgF~Gr9t@$;-OQ+=4oz5Z6Jch9wL3WAgy;=g zCKNUw26P7~=6hLmyL=*n$ZNnW??jsPB(@ss5V;zHl(!LDui{S!U%_i$i*`F4@dcxZ zi`DrwERwPh(L!@zWm_nI36G@o$a~Wfzq3M2by1)rhP8&!U~VLSK9qC|#xyWUj~ewC z9Fis&L#%fM3pK>114AZbpI?9_GQhr1?utgkpLG9bmcpOq;Tja+h5hr#)wVZ#-|IR~ ze0Ln>Mvcn{4D%tzk6jtrr6x@62O!waQg6UujeVW5j6!Q%zZ z7fky7_FTTc&Xnz@d3}!3x2&VxT?-?93mbS{OU**DbAAg|NEf#u$ z|2cZ|^(X+k6jZ+Q(LBJT7q!2|;!BIhd;fb;afBI9I}gC?$KbvyUt!FNlm~2;Ao;;K zv+fs+2q8UcS)1N|;&wH}jB(_}ctTVr>@`gDbuQhTDc(bT_UgkDs@4K0Xa6whs9f)G znaYhJJh9Q5pY6<(8XY9-%BnHY-iQ2@46o#<+d9jJ0m+WI>nklE5T-ft-RB7p-?+>p#LfGifSHZ7;1H6yY4Y_??W0F+n)7)Jg*?o z=^21~48ExPkukT;xc3U`N`RhU7X10_2@M^ZAx{G%R&%PA z8ERM&z6^f{srktWuKe)+{gDE}68jsjd(wj644vd?!Wo=tu6$`P-N3}2k>;@WsuS+2 z$5Re$RgSxq6*6kHi?kNJmM(Xc(|qwRB%wrowx1fn0M|jIiR{iBWKZ&loE8aiInsRA0QqUYz$$5djd)eQ=c`HMQs`q0(w7b(TLtZO@0_llq*VH z0_C0;+THNZ|t{odnSA2Z)o88Rr{bT~bqDuhAb1y-t2x{;!wqTZq13cVZbm1Hi z(jR7%Q#|Y;N?;*;oL}rhimJZ(PH$8So1>EW1bl^->asAZ@=jwi7#01bOe~qr0SWwh zXxf;m9MdnA{9LW<@#9*k+>a*{0S3C4gx+)|INeeW!P^y#9=n^UsL9CjsP18f;qo@`i>J@1s#{_E>=0gwHFxi*vs> z%7-1JC5t>y%N~pINxm@`+il2%I)+Jx`?{-l{o$nDCLlF~MF>UdSPte-2&KQz*+o9( zhXB<_?`=Q0r5r^Kx7Kz** zT9_r*Efd(9C<{Tx&ESYzi9@QU%Cq#m+=>;0lQ<3!y$0Tvin?pOPCq>R1gZ!$ZLEc%3DP=FP;7nie zI-VORPzEOZzu|PRkbo|8^|6ZFa;L0K;7gc_a{Ck@BeAWYV8HTnE9v6+rxZmW^IY~5 z>2&ozYSu-GP0IcAS+gl&H={gj@FDJ2!DA5nE1y~zVr2Ddg}~=F4LIicM810JVO?Ca za_``RL6SkXn{=+7X{ycbSX;ECFmx+^?pDeZUGP#g*xSZoB)jjY(4743e!v1eKzuhyykH}|cE2j8##R_T3q z8^CYlTsD+s;}waw`m>nN^Q<_ekQ!3q^(mYz(tB#0N|pzS&-$n?l87v3uS{nDz{~65 z_Q~`0kFRJ2=^x>(pCla+FX@kqdz9uN0a7ckaGhYHc||kD`K^@Euz~xiX}!vX6L}>@ zl=yEA#%k{)B5`cx&H3kEv zC_}ByJMv2*6Vangh2zaQZ{@G`deZ2_qm^qP!2l>$*X`fI=66qX-B%a2*+Js+WH&f)uZRxNZ_xWB7 zy-9$9_NSfR=5a$Q80+{%+F5SWWNx`LZ4Ob|r6HC0t9`q!cOx?8iJh3#nmR&2!PgM{ zHZS?99+f(sU-)rtKzJRe7OyW%+DjeygVuqmkNUKvP{INNRbsJB|AipDzO_9%-2{Ly zl}J<0++(xUbcs|-jNZHP1Dc}Np_%-XYmevd5OF|A6z6*Y5LKDlte<-g3@TpaPYu`O z&ZDmwL{z#>hWOKh0rT4~N;0}Bo$=yF`A>$;-;4+DP4jh|`rjeqEU?I|PRWgvB1y3(Y6@UHK%gTHS=lFUu@%js`0_Dc~AEqfowA2v? z;K$3eC6iv+vWY9fQtpsDa2S?7_o#)q3fR~vKu7d8i&eewZRHgg3fVS^{P>_`n-lS4 zY=lH`4*_KjS*G#ZN!A{BcOI>r=(YZ~)_HKqoMQLGFn!mh$Pn(R3|x&^Bi1gi6)kcm zpC_5~mS`oG-tp|PT7;s1$*#(Wc~vmqTkQ`jXyLYe96X|m)rV^Q3Q67>sCMPu`(kC}90wX`=+@c?T zYU`f%LCD5RZ=v9{_2|A(!Dq59hJk0an|?l8w*C#|z4pAvI=nl!O4p1hVZmY#9z+_> z4F%iM*QF2$lR;9-}2yyl1t@i@@B^lb#_?`CJm^=V)E#)m3Kiv1hv6E@M(KRoDJJWqNe$F0Q!< zep!!Pqjy-QlU?}4`=Ys{eh(*pZZe*99P&-h!ofspqA^;%vTyXMqT6|gBCmMO*q>+q zByzL(dM|JhW~@$m%PHOU4W91o3Ev)_pH63fdC^4h$~BVRXH7{!igJPSsVD<<)ui&I zEi26F!p(T&?8K#ypL0KQ!1T*CmBu=OBZ3oepP2aea0y)L(~Zw^y;t?Nx?1&wAN8X# zBJ}UkjLYNZ#VN5T+NTIrnsQx}#Q?f>u@Pgv0m*j4Eor(Fj(Y*x#aBpTUApz$6HetA zH48pMd$;@fO}jj&6|n{})a9S1Pf+39ov4%WLWch$iCN96>aYJIiBezg`+dDS9X{pGOU;x}zi&>j&4+hx{W56r z`|gLso#*beC2-Rd97Mgo7@lVPJwmOwn2ht?_E9+%N`Hk1PWo>N!=W0OSHIppizVc3 zlB$*yrRjM6>bOJe_jZ*U{rt1@U2^NQ?vH+dKE8f^5%VhITG$=VGqc#!rH%_`B*e58 z7vB*s)d?|05<4PEe38&dBxyR5tQ<++hNKupQZ6H@_K?&UNPq$bvY=o>C>l8wtrm*T z6h-fdV(>*VMxx;9D5i20a~q0fw2LT`jdc&jt`xL|^(bi?DBfLGy2sL}eW9c~+N&$1tgl3hOzzb;RenILJoi-DC{p=hy0US( zvW(+3p0~=6xNG9bx(8$endX%(SX3;vsvnOk6ZrI5vMAe_syy*kv5Qo(Pgij$S9#i| z;%G|iG_1m6&^Jxq$Ehgme4(%)DB;R7P=--_?i=QAs``SK@|hgQ(^u8IT-B#d)pu0Y zZ&~%#p6crhReuUKG|M3K)sS?#LBsTcH+KDNK#74VEw;Od#tPz67w*PA$T1wDs$8Nr zxuzEB*d;bYA968>I_8Z_SBSajk5_umL0nPL1)PFTJ>8~ROuIibSDt z=KubxSJ4b9DT`WlcIRyH%8Nkgm7Y)QC6S`nIO-wS{A8 zQtrFULvM@5vyc+Q+_c<-$ULgVe0=Ey#MNYyJdF&E`qJ4lqdT{GN+iJ5gI zXY{p4Xo5f2@{qzX+OqHw$G7WG<0_3IcXC%|58Z_7?1W>@Loh;1hYgzAL6R1Js zMLNjB!K@0WutBc>4H)4L5~}TxY32mq-73_Z9psN~+)0?o%H~?6tk>UV6=PJi?38z1q=RU-#Zl+JMXv<+o0<#iXyb2LnCL`dV7bE02mN1l8To_J>#bxt>(~}F<<%@DlVQPw zPWo9QU6L2{y`L0Z9B4(l09Dh;R1j5Cgw$);!RjjF3mgt`ShdhJ&<2J-8{`{_5Z1m{ zw0ATjG9dJ0RQ!YEk1?sO@*nTze(n7jN0MAWo={?NI-XR!R&hM)r6c>TPE(cghqbTP zt&|y~P{*Hh4_`d8Q@j(>nNJ@yikc+!bpBBL!I37QT7_v|eLaTJI;X_LLrq;_$@c~> z;Z_d8w%wEEpr9z%by)6Q8&4$OjuO3}>TP^1nS>UGDd|SD*JrGIn)Fr%&A`BR9*u(2 zHpgA(311!UtG|4UKd8vC>k@mozE`=Key~+@gF(uG;6MvOd8ZPuRpG_2%q6_-LZ?_N zI-28bVuGRTlfxRduU5eE0-7Vt`a`Q68&x&Z;${J2il(X*r`37M{K^F{o z*Bg$hGuW|bR|Yft1rmBi9{UpneViaZxTTPOgAjVIhM*751W0|El)K{fqWiJU8w`&>V zyMqTc9#}_5)eX`8!Kh>fq2ma;bedM549Qag06G?OuhJ-}oVF&R+7U{oyHH}ZcvJXQ z_Ge-;XhLV~QPOZN%U8Ln+hIEIIV+Yx13PItGf2FNq6`bJn7hD&x13|rfH$L5`mW<+ znv|7eb>X*7BgM29#LDKIVkrghdRXJN8GW9}I^~baN!wXSq!-=8L*V+@)o28i?Fu>{ z55aZVo+Y1oCl-b`%Y;1q;RS@n9?o(0y3M&|P$J@txG|Hd=6cryyuXN!%}u67V&Cw5 zrufEW0J{%^0A$u-T>9Z@kog1-X^sHxFpfZ$V!ezE*%A{%4gCxyBnJ_rnjTTybjGkh zRLjGDkkLWa;IcFK>2Did$=aEK=k+DB9uD^ud${DrNUh+420c^WMIS80)PP6JzUhs3 zIhuc_!Ezlq-5(~$I^X98n@SYgndZ8Ok;FNof~bju_iw#_R8SAI%CUCqyvwAk+#FHA z`VmRraru+$(Icn@`BS4_4g6ww&79?HOX=CweU!oVFJz=Q$31bSNexXNyp!2>R9QXvosVY{vhqbf2N_&2TP$|8PnN?4ajxP%rI`og+fN8Z(j?-+mO@Vlkk292*%o6P*w zNq%q06x=1rp zCflsdwUW?x6enJiy7sGy@6#fFDCVr| zSPN`0--#gng)pOdUK}`QG74>;(Zh;P`KQysH1nsDP7HwEx2m=l98N057;=YRN$7a5rS`wu;C;wcvj;pcBz3p(IGyOSNg6AqKn2m{em?<=Iro34Hj2 zwO|0Ri(EX}2fBd_5aPZ~6{Omed2$=dG1EmVIDuvmq7LdICxkLwO)5^R4&d61B4!*+ zXNpjH+P8+k@A?D*7()pue39DhMksoY5BTD-7C#0F#X|H!|;lqE|Q6xZ~>L7*yajHWi zK7)Vhkv#tA6MN|S$JbPs46oh&U%UDf6GHtjB>f5a{QnHRzF_b_C<2%c+=4B*e-Rc%gH$k2;%D*MJ%KM_~iOc1GY(9#{4;hyJ{sJv0!lYft~yqyfWtLs~}hzJbW z=I(CL7$ITxj0mM}9q(482==H&Qq*|!cF9H;M@j}tyMy6R3W%Q~Z&}um_~6laioaN7 zWEk>-9W@eu;}hXYh>oa zM4a%$Ky!w8@rUu4eB()+UA#Tg;Ugx%TT2?SDUPssC`(@=_oSIC;BDe#bc)<@M$a8K(@RRsHJ^L`5@aMrjP=V&@nj>ot)}%hk)b425zV*i#=q|Xyb1?>HNaH$0$Jk-eFwnN0n`X5 zs%9!Ps?HC0P>=Fvg1VGh=mE5NDF8@Raz^8vT0+rP!h$A%;B)X)b8@cZ4K5ZEVe?#v z!3u{GPTk_Tmb`jn^_FnDguo1W5kmg#A};*$F5?mc(Nf}?(jfEf2c>!9OwN-$S1m>* zC0LleQBoiPQe{_O4JVRoNk&*yd`T^iC{tC#CADdm{N%> z%5yb9xnX?1DF7_vA+D(k@}@y(mK7va7abNrun^9*YKC<@_J}-Ycd!T7lCQBV#}vUs z>q-v+OUYboVW?VgJ)i4oEj6~7Uz0gA6}&53!j7(*G_H{{Dd#{GvwQ`Wd@3Spi`3H! zxDaXbd9{L?z&#%jNnS54P{)ogx!(%Nj+9Zk=5@7L(h345rTNZG;O&S^u&Y7qsJ!y5 zUQRdbP@$m^zoa!4)H1H-lC7|>1D_bz(~smaT1L6b))AnIG-UGMo`E8*`L=iv+0y*0 zASQsk>5gV;kUs?CTI|$Pu`K$w3*Dq|(L{u({G|c93X}k?!nEt<)S`v@OF;5haC)&h z%?IXPmJiVkqY}+8Ed!;!i$hb3zcld|ox{!TTN_Pi6mhW)Am~nPQF%pyT8V&r!!4IQ zV60CgfolVqXbsI|o2)}!AbI_S<~z%3;EN1#Z7ct=EYt4pyZjtW!oymTmN$?ABkkmdEvmt;oW9p%DU9FB@yCW*T$j1(3#4=g2Z5 z7&0YU)&VC6@5@XUr{}y98hVB^sTCTlC$M;DQ(D)s%S=c%ec&_AAXjG~I74s(=tnl< zy{H@08ZU7m987Jek1AXpovbRGmK&?+$Qj`MGpIiY*mic^|JI-)U)3-;<4F$kcFtzW z<>}mo>b(P}DY_r0O&etpFN_p7PZDhTc4@V|7Z_J4q{Z3B}OvzSF-)^RM= zYMKn32&!3RL@%Z1EU}{|2edJOA~?>e5O z$V&gC6}!^P?z<)AXpv>V+P-i7ADtLCS(zQ*0bf>@*enJ^CqFPg0yOYuh-w!5my=a1 znk7v?8f(2PcU)l>Eq#8ykVCr$vO*7NgPY1w!P|5@QQ(bsusuVl5V8Jq1iZOaxNx_| zTxdJL)o-8`AapKGk-1 z;AbO?^-A0xpub-lt@XT+a_h+@xZ}6^?Rx2}M7#yc?ug1}4)b0V^XDU18Xy)gtsQ^> zc*Ni*$DGgXy1R^BpUHA|z16_?@GqIBppAKyMFn8BGCNp4A-+6=Ygyef>yK8Gfr`+BS8T157J;nRa_}<3ThddF6^+%{M~Swv)vtI_$SDwtdG+ zaPV?s_%75hVxLU3x#;eJxYJiw)D9I`I!D&5mAS=zu|u-tVpg$uYk7^vHSf9Xr&RnO z;<)!9#T`1FJUBVDw`Ed#6SoRvfSFW#ELlkul;2s>Rv0buIdOv@UTr|IT~bV)6(xq; z{Y!VlX>U#z$WD$)EYYO2Jtgk?nS=hc)?P1t8Pa+22`?Tz9o}aW-9fAle?KSMN#F6h zJ$vuj5vSceO^D zTN`M@Bk{_t=_z`dMd*}Pca02nVHbX858)2Gu}2{KMe`oi(40`w?6Go8;kZoRT^u#& zX|@wiJ<-WDaK4Hy&;2O_UhLD+m3{hbCHoU*FVq93BK}mUGTh zEo;=9+vH)@g{k;K)E3r4R9M@z(ON^OguSrq+%?Q{zQ$(!La?;~w*kDhV2^$%^JN=D zOBx;vO{}qb2NiwOyEpYhsnCj*ObRJMm9E<{SHZ=E@tZ z=dt6VOwW7`*O1VO8{-!NnT5wkzQZxV@q_?WRzU_@T{Nu|zR@*%;O!(&Cdh&z$kDdj z=gO)+s^a)5ByOhwnmIVvYzT!zsgh}f_ysn1-N4%wb`JM)f8F}(+>*K|Sl-E)BBIvR z$muN-4%IZ!tH$?f5k=r9<$n`K@Nn03pF4Z+_b^aYA?ZdOhulFc zUs+V?=zH$UY|X%!w#tNBCF#TPo9OIZ?m_=BJo1_%-e0shvb$-SJ~w4WXwo`)Hq`V) z+yCqx`KxR)X4DKyor{y@R&5S%Yb)y)geit`oE{fSkU(g!9TD=(aOi%MG2le0y4|1c zw2ac_6f+$Ll_4M?sE0iUNYOMYxt({uoP|e=<*-S_#+q*BO&bL3)PKEi{w?kX0@|No z7q0q|g&(bC4^!}e?37os`e63DVT1c4&KQ(!k5Da#gII>TSpZ|_^8vi`>oa$6lDEv5 z%0$q-FjJm2;kff4Mhvr@8kCV(NK9OMKbNqD)w=i*SGQ!Y8TnLv_qeajgM2Ph1wHeF zNUP*>G;myEUZF?O$g$sM(^MY7o5&xP7Am3E=j9rQ8<&mLcUmx4IQn`kw?dhznU|fo z^w)zM%6hqvQo4n=Z31(Xjy`s7D1D?;n}jnz|uN9%}HBh-ZyMEpc+;iT1pXJs6U=0qtjqUP-fw(HQNk z1Kv^Luj&2=VQ(1~_5b(l(#%lK0MgxEf`ov8bPl0}fPg_GAkrWV0}S2W-QC??LpM@N zrzjxEobmVj-}k-GK6{<*W1hLzcfsd%y{}6z?!hiM<$lzMxml4}W6)LKX%n%VcnhR3#uFsZa#8aAJkx#8}93v4S7hM7hceGS=QN3`ciV z2VtRa8h#ia@-GIn%dlWkTVIN6(t+(Bj1cOI0?|(=-+?^bp3QN9dqJ8Nq)$lY(Hf({5IuVIXdhkJ%bbq&nPiGNri-k zTve^e7wCXF;_Q8i?UeHmOk!+ErXE1mKFgDDEiHA@NM|zPv;ZwaIjwq6br$vuyuNC# zYFk09LY>bclmvJbL)Nc2c+r@ia^tP&{DxuXua}KzzK)wyjZfnoSTY1U3wtbR3TU#b zbl(^1y!|!kMGZWS40?um5>IF-d=l=~ki2Z*@QZc)x|Fqw%`Kw|;6=$PBs z>h#!NcBx?nUhm4KCv4}9b0?1oNoeyZS@Aa5WSTfu8(#h>f8UUyi%CtSxU{9GDVb4gD95Mj|`Xl3)%3BK-GNVteMYX}U zvFXuV4SS;={cKx4oMj+|w7c}zFBSY%^h04K@e0;eB zG*SKWJoVwiXS5`WDa#DGk;7d?Orx%KdxS~gj=N-P5 z-@$n_03-%L4QTkg6Gh$6+ zUMoDh^$n?Wo%|GVn zypumY=k+uq^Mt?6jEZymyvZte2dysEFvAU>VMOj}NZv?1ZPriN8zJ(nCz0Dk=ktNw zKt1Ior5WGf3m%+g-nXpy<`ggw6Q4?wWXA5_ZJs^AvGR&8R^{)%>s#6bryAkgqOKKBx(GYU!MROrWmoD|==q6gB%va()%P#Vh3LHu|?`Qb~SN%@~P4$BI%^ zx?;LzvJ9RNxD!5N>B_F|z9YdS3I`IB0twoQ3DZGfVR!<1;=@r0@>v@iO~>3@X)59F zESYXirbpN?$z-c;T<>Qw(cKAk_}e>@ta`Cg+;DQ^UgD6RWDc@`WZB+39vb5|ntt*9 zyhi%;P6iqjr``$Zm!_tHTin)Sz~r9Vy+De->!y|zXVqoq7MA;&-M()tO{*tOC;vq5 zMvjhKPLM`UPV&iVI}1 zTcK(vufsFY;U%92@7EHBtMtn%#AmCu%Ra}F7a@_?j47?@At;Zr-&JgYiDP`xhGRov*z+Uc4JHzAt`5qZmW1D7UF-59?KxfBLaiF3*uW zFIqf~5k`k0Csv=;mMz{kHu$kW`Q~8I-%8}8Fx)#`$(KjYBOb`-F@SGFoxSgmnJXRA z{UQL;t@rHdvl;HleI?|wQpj8rNjw0_wnUeSq%elxr}sq(qv@QEO3m%lmmvgq|zXx zF^;2Y?lcSMBT2>Fc`UGfr+|z#)yn$luw&I~0<{_%wOSsvI!U#97II1Ndlr5-$Rc{7W&v~{g z=WQoYJM3p!!N8jO+&~B`;=_~bF$=WT>iQj5~P#Ew`Hvwp^(I=^~Qa%9# zK^eML=KG%`!qu~)Cwycnke%vrdL9v=C5=^e&6m@i=Qo{jPmOQklRhm^2<=3$Yn~sB zYo4&EnX`bGuM}UcYF^Mx)#?RAB@<+rJ$8^+X~)}`nd9Q^=2tlWXVDLgPr65=u5Ns0&jy(j|2LgzI05c$X6%hOm2*Ct|a2-N)0>L62 zKf}~~wBF_^jJFdW;tf;(8m~?;K@5dwy|P7}>TCN5!-3h;V0-x@;8bCY619DUN{e=C zvC{d)H2G&LnhFGPn2?1P#*#tmz%%1Hu7pb0=NQh={Cwu!ug&&Zhrgo>#4$q^0if|A zWaI^WRG;C=03t<9bam}!mr3!&KI=+U=sxSvm7LI(TGy36(S80$SB6kemR3)WSMP9Auc*N1$_h>4APk<+=cIlyj;HO^bUQgQvmudOuH*Q0~ZDm4ilQw z0)Wadq1BpD2+#WrG#kPmL4|2B0Xmg|e__nrqi$fjbgbN3s8i=i%$gC`+1*w{TRnZHCliz?d*{{0Ck)FY8H+B08PYxiM5-kNE?&b zBOK(XgZ#Ws?)sQOL*kW}v4(&K;H(@pFF)xGoAjp;zt~&~Gcmlomr3+l&Jdm@FL<6@ zv7CM{lh9z8v2K`oVwm;EFlOduHmy-EuTh@V%0WJ)P<};c+>n$8T=dgG`0=A~{HKKx zkPjwN#R^N21ydCrM(gK`CK>vn_baKJijPQN8@?}{khfH2S909KqT^I9G5I z#$LbNiv7Cl&+BeN;~rY$US8uqDdT>PwOSta0fjOAU4(_bu@33%;|#-*jA%EWMazE^bANHUzmBPy|0d@C1?5musoK`Y zzm(j_{9jORe5HQpIkd0r{^v>Ob13e^I#W-}jd%NF?(A&TIYOegYTiX9Ep@1qN8dgM-4t zBO;@sV`5QkVq#KqN@`kqMrKxaPHtX)L19sV2u#f)${KZUt5;m#(Ad=6(%RPE(b<)0 zW+PJ9SJRi@8&)?IG0}~fo|&DSUsznqsp*}vp@WHt=!UJwefz$AaCmfla(Z^SGyKCw zXm~4VFY@>1Eo(T%O%FASC;Ka5BC>fu98Sew#V6=3tR0&iiuZq%Fpbm}j3o)Y9ZgrM z`-dls74Dne%FdMLMWZSs!gETYUGXFO*g- zF?FH#uY_s!fQOgB4!JX$;WblHX@J~6T)!(e5LCh7UiTY0sTxpr)#{lLG0@$Sjk;A; zZ0WByep$ma8yD|BgRfm7Y#C|?ug{|{WG~}`8%_`_k?``XOjrxpN4&atJX%&5%uv2b zMt!J$E_kvUP0sjc!g#%gsy!`CvmxY$m#aV3)-ue=EB`dH{A=u9N4x9!cg7H{sm=~B z)1$9rSz7dZ_mJzOqpwk9>XF8`7wnsU#@Nc6{s6XOkSE^L{mlT7A_t?KUbN^|AVn$m zpkUQPgJ} z6~IfHXk|9ecqErxVlNX*g=EQYyq+sOEMD(J$^X~FR9NyIWnnt_p5{2nxtHz&&DG0r zFV!8)^gd15%X)`WXEMD*v)NAy!1Gk341OvRn(&*^SyAgmR&X>xL@k>&+Cf#gPZHGyPdnKrhJ#hgvUr1j!4G|c6VsT@oN8>*_+HVn4q z8hylV<(!4fuU4X`Hs;C;=1(n*8`mz2{Hb^WLKqF}huGHkFyTZlw!OroQ{y4luu~0# z&a}POsQ$DKinqnn{9R~2Y|pwc@n$M*&@saYdx7}s0@>A_VjAjrR4he2B*XP~JQF=!L*?MHj&8f^$2N1^KPF-4VM1KO_!iC+m4vw# z!DN@^E-b=G?-^nh>WZL1S$_MUy%OuzKNlWe5r!`s2Wv#k+DOX$;zRoJ{t75jIa28t z@8wlq6)os+4f;JP#ap%-``VEsW`tJgsq0s%x0T&^MCBW?48Dlvpf}9e8Kh%9pmo6R1h)5t*plAO5>RwLs+hL_9q zp7&KTD4$F*ojrTWjo6eV?8CQcPYV6S^jl<+|Bc#@DYr*|uGs8fOCfhMw9=|>B^*pw zZsM+_5l1UKy&cz+N?AJf{<_3>tlme+vdU&hddW@l=dZ`3e5aUuF66agHdtfM-*lB8 z+I67Ek0GRk%ydAIRhLHcAQs8Huh>ckaA$%?{)iuD_3EN*wGF2}WGp$Xe%F94dxRGr zfdXcS4BNMYfVWujTfDGfnb)@vI9<+`kdRZ~={JNt({4XFra6W(dD{=6yZPwVOp{9Z z+0(o#X|3fn$hl=Oc61%XK9(gtwSS$7 zJrlZ`@_e&u0KaHte{z(}_wHZpTE@aMoaiABnf+x#-K-~)b;GA*0?O-P9| zOPW=E74QE5;S#FOK7hHe-^G{o!^;9EFwWVGvSE_)F5#vX% z^#REunjVznCU2u#=N@n2B{3aYP*S%%$YPX@;2nGrZyTK%kVy~s;$l=$8~B0+Hq3qu z6aMIDB-4^^3>;Y`SQ}TQ{@!S~dGxYfC^4(#8}DB2m}%t*H;UwivXzcsNdpOY8)A@{$6OF zY^c1LQ%{6pCbcCR<^^aR8}G%i4*5nY*dhgE!jhdq4k0rN&cE!`^!k^fj;;-y=8x^( za9VCI{NiXQjIbwB?)0MM#ax(hP=qysyF*xc39u5sqL8|F#QH%ZAjGh~7DW4Nz@g&8 zA(k{+f5wOIXdERqnRZQb>kt4xaNfes%NbV%dtc@zy(T^V9 z@Gaf%ZnD#t7+j2w4si4v(Iz557N5x-MhIB4ukiu;0x+-wn%hRs2Cq$bZ7R6{UW{nZ zT~+(N4q(W@9bP9#H5PP|Ju^uzO-LY)%O=<}O8)rmD-Y9~IZ~8lZjZgjOIE=9S32a+ ztS#fca{2>tNmu`(ECid7<}qnEKY6RIRxDvLBia}KfirCId8(VmRl;ToZZ(sep8RwA zB=`*p&Bg82ST;Y$a>ro{#hTstDp zt@XBD!UVps^q^t~z`H#!DB?@L02Wm-zU&@hngCNcxmUp+fL0m5FOdi(Ln2-Rrz!z{ z1q0t-6K-Au@C{JkHB?f@yZM|@V}_A@*iWranb#dZED$a08rn)85Dp2j$#!bI z^6$e1iW}hRfjq+z0YRIXsR&=nVL-+!sLVcqbqT;eOr~T-Y-@!d_RaN)pSyq<-V->G z*FA7+np%Amz%7Q?%kJ%u9u%G(80{Do?if%y9mJ9Yr|f|h`h7{>bbd+!baw|rh65U+ zg9@s#AYz}6d*Dpyp=W4*fegWE3~(4)NQYx!hAXfb0F)5`tg{103PaLl{B{w*Mlpfh zWDx&NXtddvQZYPo%fLoBRs@4KyxBj@EUXRyY*U8aPX{xZQ+B{XlAG{k$AG?O`~+oS z4Lf#SHxeV&(L0`jB^6)?L-X$54>{R#IZOtF#AtA8J{BMX`1fH6kl>{1@Ib`p2*2P8 zWx((a;DvJ7yC&^Kw4gfu@H9|_jgwu_aL}U#qWq=sbq?T3v+JN0OX_)erC?M7$YlUG zmZBIZb_tMSsW!C-1dWhwF??e1r;S3xQFR1GkOdnBe_^r)(33}LEiucK;K0RV3OAz= zizY?qvEMA>Oaw7gEn|}z0!P__8B6Z!DMW^b0DP>_>SjkpphYKEd(ny|Mli&QDS5zp5bdZj*1g@9uTxayt;RT zpz%Ns@~~V6x|V|oxe^@Orv_odfJ~L(o)-K*($sGyIMUUb$Ks&clw?*IzRNOjN`=tx z7BHCdI5Z@P5(qTo(CrmS4{!{WNy$PrE&kws-n2~HEy+AS2*gBBGoDU&b&nHr%8K;M ztX|BD@^c{#O-R~|PD;rPN5n=Ihs9gw2>NHVRA;nyr{T(eo_2SvE5hWULK2&b1A|(~ zezX9jMr@vL<+h;ZMLNdJ%Y4qU&PGoT!DGw`Y^FV1rg-K__!Q5lkHQpP0>GI9ls5ti z838krAdT^P2mp}r7mzbKPt}I7R;4hGf$n)JJ|~CkE2^M0h7gsv=_akfEo=ONCO=&x zKm&(J6(`_PYbMOGupkkPSrW9OLx?d7JmJWXbWB(lO|4Z9IsE{jS^<=&I1L1+boS)B zmIlPJ7umxsKB-3izQ{b3DUFdyhAWpeRTp)kmBoTe69qE0IRN=oUbZXYof3rgK;YDQ z4%T+*VzyH=7jU(KuHFdf6I!x}D92OI%{r$d>MkEv0YuWK@B}qkyFzmKvGB zW>8!fq|&vSdA++5*SsR4yG$`OrXZC5ZaGE(n$?Mib#(|tUj?+b+H}|eAU9==2xiPQ zp-~$`ipA%|{aE*EaZ%@NK@4DD-%i zv;smn({cg@>JssC0|b0x1@N7?@UW@zu(NTVf-2(>C2FBCHVmA{+*yDgX&T#)e4KSD z0(D}_pN3=TV_KPMJ=22s0beBmQqS--(4fuLrLVQ^RjD(IOF@clfORqTYl*r&%Q6RU zprINN<7eH8DnLc13a>Dgjhb0UG{(9NpZghM@N2-d5fb0UHlyvlC_x}miW4jFH)|mU zothVZ$TPweZa+O0JkL=l5F%D&zc8{pwHNg*w2UZv2K?R}AB0xzZwuTpYZP&6v083v zK;)S^HI40~XC2{3q=EkIrTnst6hrvTas>o+f2J@Z8?A1M@M}xRZtFo%wtEqaw#E0f zg{q4?)>r%e1lEQ5wcDIG)RMQMd1W0LI3uubPnk!~MtyyaDZnIl;) zV~-OF;d`vk4M=y77+znQ*WxDnuj^Q?ZFI0P5>I_IAMX|nD9^em@s>riKX;6t!6%?m zcg0={v8RsrN+T3&j|8jt20HeUwgWH(0A$3CBDZ}{uK}c7{c8&V14%+H?o7UtUjCK- zdQgBf&{ue^%IpZJBT4zpE?5!dX_h^J<&UB8djN`tMitZl-n%A7V2J8&!0_2%YPOq| zaj6)BKoWl_Y#e$w3fP^7rY zq`a#|Tgk6&fXyx~FYE#%vqvP$aWahK=wyd8MS*$Y_`C!JY$*jroaHDU3xMcmaThqt-dIIlp8d7aLh?|C>2;|rX4bb1bjbCzHy47FUZ8UeNA#5}17yh^yAPHOU zqbM$?HZ#GzWXGa${tq>P(FKOUA^|!M&dSmRgCtVS{c&+0jnZ_ivw9(M}9GchT(TLH6?p!qM z63U9^-g4mMVjND;AQ>$&Xabl!gf+9c}(A&%B8FY^rLb!dS05a3J-3 z{-Y8;m;M|>8~8mTo>c{Mp&qdib-s`hGP9ygb0oXiZnyZ!d_L)XMj$lo9Bs*!D|Z}# zUCQYU%dQNGpoo(M`oO2+AmGT8sk>VY>pyc_>44K-#svy_RXt{cIc+_eo10I zcmi_;{{?Q#3wz&O(8yk16~6yc9WSukE~UyO)MIIGmaspXVG$~`+(_&1h29Rm2k@H= zXKgzB4b_{TbVs5|Dj%!`uKV${B~JeV7HO;}nXOmYBdR-wRwhcLHrH*?HWF!jam?5F zjW)&v8f|2-YFFpOy3^PWvkK3{$xGJ0EqA9uEGVEQig`b|io(1MI7^;kn+^hnJJtopzYMGvk*=b2~0W2Q<*`m;3_`j`+&w5Pj#f zo!q^|L$~>WzvFNMAnHL+klOK_UOlItesz?pa#|oCiT7e}OG#~kd2*N47w?*iUWac( z@8PQg)lNh-j#)I85#0v2?=pdASM(5|L}f5uW;Vug<5kM=dpe-iMmCNArtK;4R%&>g zmY}49uH57sTI7sIC!Omgz+Dqy(ESadw!|pdW!kx@Lhf_(G^Eh99F41~K5Jk z=LA!?$n=Ts6RC2SQ==2R(zbSouOpgWIeu*dX2&n3_tvBq@6*wt=h*p?>r+yA^SV1( zGJ*GW2M_oMKZ$#LyWOl_gJak2W2bjFgT8hUoqTT{6;}gFEKkm6 zSZEQe^B;(PIoQs@l+AX0ZW)?+dRp!CGxq%8HT@4Z+RIMIUm0ka)=}G|l{gaJ=N@N2 z!ex*@4Za-PEg!t9{OKQcZBljZrL`kkwWM|SBTo8?l>b^r{W^mGr`wma2Mxl)GNSii zQ{#=VOtnRj&iGGvUO9*mdQSm;Ki+mt0#eRyUVa6@Khjb>U)TO}liIZ%{pBjL$R_{0 zRw5Q;-um4_{@Gl;!91msRj9^zR^Oq(T^i&rGv@*peW&x>Y_ zJ#YSaz7Q?Ju__k$_NQIC=wm;&x5UvC=4DH77!X57#04{gKdC7m_<^O zz>{b8(?eeONs5!?ZB$M_ zY)bRzCHEY^Uv!pDpQ$H$sr=e{k;SUfyxHq}^(Sc^O7L`_fgSyq92^?PBWN0!sF7?g zT);Y;!vH2?8wsR_iY;*^nE4L`@HFl->8*BfFbjVex7vvi`(C^giPGlpM9D}$QH+)+ zv)+vv`aE?KUS{D4=hIjN&rKg7$r7}%I$LwQTHAzoM}EYrAL+Rjjl(G9XQ;_ z)sY(78(-!MtaBMpIn_`Xz>3@_^>eRmPa2l~>jJoGGYEA7yqjqIk2e3b^|g$H!S<}<=6l&$=l!pvvo5qV1I2DEa&HLc3iuL@nM1;+x}{4KZ=^3f{(Kyr^ewg1 zppaZQe2C_{wWg0T$?h_d{aJ$IC{NS>?*%Z4x6MBnz%%NiCs(tODD{y-zICLkqA;9i zi|0v{Dq(|OxzN4{GbvOuVwt|o|5w%&1DC&$-WS>rYf6>0rA0Ps??o%oPfSKIqRXWQ zn0?3Asn*e_g?}Y@YmLV*f@cYj)WWD8#E0N|zPI09j7r4!vd2=yt8wcu6}ob!?J--jtZvA7q?JF;Hi9;4^~b2X>` z@z2jC%c?)W*4)niTyF+H4@um9PW|@kn8?t#VZZ9k_xVYm^!eS@;z#74o4qRJ!~OLc zY8WEOM$?^_v=5Asg;Qt0om7&rGuih;C}#^xvk?B|bX2sc-t1$!As{kku9iqU->j6s z>7gHZL}|hBb*=J++y|Lz*rJDdWWB5`MJX5PKOPLf|7Ex1ajX?{uUGdh)bvPtB;ypH>x@dsxVV0ThPp(ip(GgI-ag)ep{QXG1`GP1cuZRUzbcHdnn9Ee z12yuY7Cw{^167eps-8+7`0K<#wPez3Iy1Ag^8W68|CliFaA+p46gngiTOu% z@lPaXw7>svC+44RZ+vy@KarS!eHZ^kV*W0C>)UgvNX+i>-1p15!>j+j6N8%i_D)c> znEzS(R+s;)7V}qsv3q&x?X&=Y`zWI%Zs zwz{SKNG1Ny9)`d15~4XK$ac?j5c8|}{TT+e$oKj2+W&eO0`O@6iI+V7NY&2lXxSrx zQNVB?AZIDdhY^exY8cJglcos{Quv>E$*X)FsBQ8F+HO65AUUfdNd5)lJ(0f5doz9|F$KB_=jXr%O8P~?$^yT_g-V~kG?QYiDDrz_D z@>MBBP0LGNZ=NHO==Z4I40FZu?`~$G?fvg==GmXEnx$Zc+Rc7FHGhGTuJ&mFp8Mq1{%WoGCYkGc`^cI zbMNB(HjAfYDE}x&WBD13K)^;g2k$>}xgJc1SPTwYn9}3HV6s6u=L<3_#4LW{SX&(5 z&~bRhnM@dea(qZK`0Wl!c|(S0m>P8H0f`~$P=Ta79|8+xXcw&CDm>Fp*)L3YZ8cL& zuz@Y4gg)$|}6ot^Ik8zB-`3!UK$|sIRclE4Ca$UM~dx^X9bE_AAr+xIFxt zHgM<9Uq>HRwtkZ?Xxu;8p7#LQ%g=iWM32w=KuSCp{iOPK7XuWQauuf zxsLjE?y66d1m$7a!22ZyLCBMsAfgno*3lQBn5WI&L6|3y-C&Y;VrxViy!$)pj}~Qj zvp+ukl8qPD^URK59>S&ftM2@LROYtvWZs-wuT`exwKU|kzvuMstY%E}GNdVss$H=P zzsegr^2O!;645l|sWPGT(Z_j8_sgGO0~%j-f2{>a>Lusz&Lzl zm!UF~`m5;;6ZuYG!2Z*g%nhO%6696lMl^1YF3|0WQ`d69{`Vo`}v%NyVTQYNiV z9{6>E6T}yg0^#bHdf38=ct<)+B2fDxbH3)OV>t70CLs1%?m!gbNFLp{PomPXh>(WW znf=`bF}BW$Xy8>Q72WJWIKVj?=Do|v>8uc*j9_9{fA<^BgG@?~IL?N#z-s10KU1k~ z+>a7}F74%*?F<++7{Z5|L+~!KvNbX0c$OI4L|qOhH^7 zh(7BveMJa@ZDVc0V&imdsl?LUC+u)SIN6rwLgb_68hB^oD)iocvojzSO?@Iloyry+ z+KrriZe0?mdC$hPm!fLbc%J##JWrJ^Bu%IXEl`7{7>AKdn>BHkX=F9mIxz&IM^&FU zam%5ME;|rIyoG}XEctZ;r;ImR5vJki+X>MK&xEIe%51$|26jusC4z9Et|!rZ|~TRX+1w77s^ ziPvJ2V5qJ3_i)Qr^UCo@2T!iA2#n&+4H4wr`Rr59R`Rda-yAauL#R%yEOlCE=*6FG z@I@R%TD3Z)pI#|SYcxT^QiT?u{4CL*IQ&2CW^NNlrgy&=8yAcyG7`Ua{Uk&%CtN8T zw+r%Qyu>0lNDpI;4uH3G%?Mb39{oY!mWA$9mdpA1zeJy9i)Y4B{`6FL< zaMKJK*p3`GnU|}&t){?g99Gi2j7_`W)FUCDGqy}S+POiC;8z75 zPpGkZYPisjJVz8LNC+Jy6Fnp2Qgs)H@-SDhk1SU?22#HrIA^?-3R8QlyA$8@x_%4Y znMo`9vHa#q&JbXe@Y0Kw^bG@n!5^ezq`0RH=nF&t*G?6R- z@?ZIfY2;_H{5ifb>N9+H`Qg!wj?vNtTD}IaCw(FE_of1SKNM*>d;&Z5LJ}=eUnI~k zCGec3?~lDNKNN|-y5WE}vFy7+O~K$ld;a9go*2VVv2Lh2(E#M#=o}*G^?Rrwibm-o z$u~FOeRhAUm;js}$f*$L1ulU525hPHWp2?kPM>(-njC`>mtfkL3jpQa_vCMWDriM& z_DO$r&I`jFojlr4!pd`_$dh^>q#*`Y1Ni%8`%?NpmRAN54YNGg_SCWh6C#2%WIauy zF+U>E1reav24L@D5PGxJ8|1#4Bs(!Znk!1>V726_#(-lI4afHP{vrmZ-S>ZR!*(eK z+b0`pQSejllY{}Fq!%8#95@^hBWzh${2C}S7!+Z^p)jM@x3~r(DUUmnq7l)Z_Vqj^1ye|q2Ukb#X3BYhd z?=+x3R1N@Kz&p3l$j-svio(Z-)$n72340i1tbD61BTjljHV~XMus4RaZ%;FLRT;D{ zOgylMVF98d0EaqSMWVqY!(N#+Twp%ar%~DiT`o~mMx*I)fKr-6oDJN|_dL-ZVIL$q0v%TlrHaw~ zS{#PBiCs;$+0}yLWu5ewn>5rz zbY6yl3gA%#Nzp+`;hrNt1^RJn(b4#_i3$cdF8c`tF-fEsU;6dq9tOcaD&$rvU>lD} z8K$HnMt%nso){;6TB{^=V2lj_Ae91Ezre&72M36Q0y!!D{II-KKsQNXzh+R*Qs`Sl zPp}fm^V%mINIYN}gKZvv(!=B)o7R!zk*-3WFAlN{4(R6u`6Z>k4DsePh=GRq8jRR^ z>bo}~#Yv+*uunwO2|V8J8>W$uKvOxHoO;u11TnH&KvODIJQx_<5YW%&$9Ps52`L^} z%gIFk*eZbN4a&5Y!U!z!Oj4&PtXE({Q0(b}|MPRqePD7J6PzdnbOHyZq{Nu&WcA4A z;yPv3Ir-f!gA)LO=v=;(=pKHK*+`0rppr0484dH2aIR^zEyJ9EkQ}y)T>Oh1TyU z0f`pCvel*xK#Wg37pNWpF!C#~2rUV+$Zxseb#pAvIwW}uC>U`|eObzeX$1O+Tb7Rt zFn}je%KA*OR4_H?0X)IsDd8=t#4YY1J4&emReG88{KprOv7PtUrzvq&x5-4){=Fr{JEJ}+Tu=5qY5Y{H3->AoMADr^DfJF3OqL6BRYAsx zh}zr=teDanU}E=m6_HZ<;XxcbuzWGD`WL$E{YsVB@7y9!&}@IQj!{hn(yfZjzf3B| z&(a8tKL%&zu9Q`&#HD`1K}D&g29j+Gkmq7^vc!?(Dy+1uq3)@oS&i*>OMlN9%AsA& zw+|n=$ctz#=U>Hs{tR>v_uEzV)KdeKa*1K6kxCs^#8K4~SC`?VV|%tWU5iz4*h;CS z5r1YS_3#Awjn>;!xmcHdUZ?UGE%nFEVbU)H^BQDobJzJ=g5HT&%iT2%pg;CQltgH= zD5#NM0$K}fUtkn~{q%itsfbl-1Bz4JeO|++noHG#z-ohKW+C8}QR0NV;;ZYlHS&5x zLy+ZBe4&1u@e+lPoeBX00tj^^QV?4}vJ&c&&tb^tv1*4n{dz@ma4U|0Jd(n}-Uv`%kg=yZ&{@A@zy!e|MI8ma@=65GKxZSWU-2DhdQeAUPogClN&ZJ63 zL=y+Wr5_9h_YhNGT(=T1_QXka+8<*3s)9aRmEug79Njh3t9`kZXrW~6{XN=1gx+BH z8)M(P%yXsd;kt|6shh%|BFBQp=$`9II4CU?glblWGPc?OE^ke)2?a!qaSV_ud*(i? zkOa3|aF&poH*lp8Yiu@5v{5LQgH0ses4fQBE&@f2zmy_hQgJTTq7C;YTK4qky6GLq zBW)^dRh!UW4>7Fvo2K}Y$e3>(<{%GRd@P8A2)Oc`vP#s6qlE^e-AOeJDc=PT`V$Ob zI(bF%)CQLHCp`mkRM$Lm2a}DYxu+LI2&F**Lm79OtYFg$J8+LqG2><6^u3c3V(Innud$-s=l6q-LiCaM;Hlf* z_h1}s8PMifhVaDwU;b-?h!j<2Md~Lv1oXlW31z;m*F9=%Ll_mtO}3s)3|@ zz+SY~c2eWmIoMj{Q{!t5JmYgyl6@+nb(5~pFs|WftYB;{l4_5L z`;4QHtSr$~k>pHsUbr5w1z#1t#*+elLXNhWqz&S{o?5|Jo1-G-n21rz>07%^P|#24XhaD%Q?R z1Ih?Xn5NP0eTdDJre{5ex+FoZC*?P`)2V4eh2ea7n*L3Tn;hs{VLfXkJsWKrJtWdg zcB}3ui|DL&lL|h=pN1=CY(Uv*Q>5Uo<4|FqhcX=V1%{K=^4Q%!fSpC^!CyHOL3cC4 zm4ne~J-T5#Oy*xY$7`H9x-iUFaHn%+G(lPD-)vT(8t31?H!V}it=BMqn;T;S-cw7` zl^JMu(h~u!pOrifE3`WWnZz$eA|vAHG(nJ_DslG^8O;e#8;}a*z{z*Hy9ZPC0w*=1 zxVIFn=Euw_&2&$Uv(Ci0D$3%a3C?)nm>MGCez~8K_HCci1wK7*qPf52wJ}ugBiXTK z+qREs{{0i6|FqZ7*R8kUc$_Hr!0()nLk5>KW?9J@Enp3tB_6NRdH9Qx-Z_(>{IN&a zI_RLk*|x37_hELjIkJ@_J2Cxe&S>AG)C2B7%#VnF#}~MrF)~7q!|prUd4VYk?r^r= zaFGTr`hpFT&rf~nhXqgTGEWyqVi`I?Dw6vb4y(`9Jrs1#ShdGaXo#gc&UE(A#!ne) zg3&CzCrr?HQ2&+Bht7GCzBNfYAbEDGL5<~ozK!Pg)6r3%52j!7Jaf3$YT6(69&0Cj zv}~s^Ji@}8R66^@q6MnHPiE7aden;@y3);5f>kiQX{gRAgya(DN5e7$8Fx_tLEFDv zOAH_S`VF__zebHISJnjU{Ny{rj!6^1-hDS2ab~=IvkHyJUBz?%*%84I9UGuNJt}_k zc)VdMdN0I5yFY18%o!LEYghi)?4lAgV9S^lGxFn(=CyZlt*` z^68!PL)e*ENiG=3O}te!gezP~ih$((XM@MxKb%I;z|I(@j6d5-1r8|Yrg~b}TFr(c zlVg#Bxp=5w9Pld(c`8Rmoh}8&${W)|`^Py`yQ^9-W*fb%tdztz`l*n3OadRSRZXa7CgHJp34!j{awsQ%C{P}UW+%)Da*5xI z)auGU`%ysO$ugxoD=-gOf_6sWv3`Dk_=-VDH^EKlq_cK`+5Ap!gs(n-09cHV!_xSo zCH~|{tbwSFNzUXA$uO@)32*Vx;3+NK_{?{GVP;l1g3~zJz1zK(=cACTo}QLXQ+**p z_~E+8^uXwnf?=xeE1B&%j&O7==(Z)crE2pcRC3d1bJ{`3perQRhquD}*=U7-eSREr ziGiT1AvrhZ?J048f)vJbU8RZ!WkIZpTuZiYpK08C%!r?EGym zG~@j>2mSgnDDTnAZ-&KHWi&CUpzc)Lu zO@ZEx{}Nsv>GD)IV#wl>H8MGedD2!_mI6+RL3Cv2*KLY9n;;eIqGg}!wJH}cgM5Aw z5yT+z1n%R@mXUVC^%S>+vi2M&*;fIFNiRD4W99oCCRWbi+dAbbWs6v^kbbwN<PQdv>jI1U-)*kFaj@~!)xHSJDp;WQ}r|MEU zUO83`0N!+ZFaV*O2{D?d0Vwl|I!s(`J>%8joR%tMv-z=XGb|Yf#XyY!q;Va?%J_F- zsa}m)Kaw=s8dg0=72eMy;4g}7g>)$;YPv6HVViS>AAS?b@>(HG=wQG%;XCRMwdyb{=Wr1AguFtF zZn5IaQr!qjW$W$PI`nx@9CPT)qXWc~(YR3ZdoBZQdF|4|mld|}k9fUo)Py2jps$7W z-^Ck&YASizOnLKGR&2C09vTY#|5%z~k5x9YkrvbC92q`wpAnM&hQw7z3n7Wy)=R9M zRi)l3|9@CJ%dn;&|6kK=BSuRzxGpKjwa@#y@7K-kwXxvfaamU_7;3HJK{9Q`USA?SW-A%L zs9CEAK_rD)+eAoo9L<(Ru)p;(s}1r;NadMY?&}IfXvAOy0e?mw+G9#7i^QIOVM}|Y zXLyjUYbnApdl<@HZTDuXBd~R4#nHy@z%Vd!&aOEKsHaq@(*KK!14$X`#H3=F_*7WZ zT5gc`z*8RsUmv+)UQJDzI<(T=*eDeh=0iiUU>@(rf%{?7kF{;>lu*BiZriC0MBiV) zaor8D;#Z|7)VP(`>x}Np@mCscBOcK27i1&|(&gCj=x^+OEb7d`oVhtd`?2%+c4oAx zsyQ3yt06F&u{PSWd+EVd!GKkki4nN_B^`NlHS^_EeEaQ>$8Q&gnBJf8{}4~$=DZj% zCpry`@%oWze>1E+#GiWTy+a(~(UmN$n6;p~f%cuMK6jl^$&m`IQ8)a3;{&FzaTr+)DVge~E@s^(kjU2N~Es z2ZsZvMQvLvr`b1$oZq*?PYiRo`kn=dUu@xs>~d4LsI(vD@{~>Pn_-B5Lt%;S50ILW zLcG3na8l3>v#;e>l@P9l);7gbt6WLXSWvo1CdBjcTq$j!Mx1tDf45)$*m?IiUShb0 z&FPNrB8n#KVKiJPc>BzQVVvdSx%cx;2lHOK`*_J$PH_F*QJ!e_D$2@mi==!RdaCgzcE70>8T z+{a52oaXRfU3c5NJ*t+IzWa`F@aSv!FP=6mUv3u*awDRXe)4-df z_r+c-hrS=%cHSKS-C?-<^AU+}gbLvFUMKqG-pgrp67kl1lL75Ms9*+_p{LVOiesr~JFy za?x9P=SZ+Vj2eyou^N z{nP&+;rTzd^M6=~E!1BY;@);%*|@KMENq`H9$frKX5Ls@*joP!HvI3L$G`USKN!RH z(c%A;z5L(V&Huxn-^U|F@;SJyYce&7CI=-s_6{olnm{z4!BqIdk}Ryc6w%+ZWzbxDIBK#Vbbu=Uft zy*dCKzmr38aW9NJH%r+=S(rw5Ba}tR7Z)G~C}F8Kih!t5HdIWN$tfo~;81GKlBuJ= zs%K?P?6K9ytQPrjby5k;qj3$l{RcionD|1x^f)q z%8UjPiE|-e=Km3UYc#f)4^#JJZTPpo@t!rZ@-Ouf=tsbGblPjD8x+QCOq?llPkrR8 z+}Ah$qIdW8jqw%o-J`W0-tP}P+HTC;XP+E@}bei?XuviTPm;6MhZJO9jtHqDQ86-Dr zGNb_@+makl7r<_G%EMoixxvKD+y$W=zt()EHs(Wp9bER4<&#{@N(u{tg>1QG2o3hj za`K*Vmm}mU%F1iLwZxXS7uX(DJzgI^sJ;e>;XLjjd%}wtEYkjoprg#NuZ#zs{H)I@ zDAZh*CwnWneN_jDuvcczhCK{2br&f@h<$Fq&{ z&7zABwN}C_AIPiQdOSpFEN?35_&GHN`cR(xKEL?UBGT{-rtSlNN|hGZQoPg7`|@gW z%bsGHz!$(k{I@}Q7w@6r)mZ$Bo&Y4|jC*aWtxnnj z+k~XCgS$m*s!s!OzXyoEivDKXG8vQOD;7>Om%qQ3+pGR7JQ#fhKBV(EQaB2Bg~#g=ANM6u_}G1tZ5^mF@8}2 zj22=T&C01!7EzmWL;_gpm~oC_+k=z)^W?1nu?;Li9JAJ@%N}EB4fnIm=)pe)a_} z8Y)Q{yc^>-dqts1@TO74qUH&8RYkBN@`~)U4;fPpp*i=mJ5d{{cG|>k-{X9xF&g%| z^!cB?2emg9Mz%c}%UfjlJxb~tICYt`^qlfPL&iU7#iZer4XE2=X?)y9$iDTYrY&r0 zw^>ZE6(OTzzrFdYzitMPyFXK$`Vad*s>GRdEs^C^o(wlQ&!ZkIk-w0dh?)XCU^omu zli1QyOEi7n6?L?lnQmn`%lTn1ZhB50cJuy-ADK0|?Ii9XFju~53*O3h(aroQKz z8cbbZNzWjCTU#8}3`NA`dop%G5F|Y6`E;VlCatRk@^$EVm0^DWW_cS(z=8>`%$ZPLtw*-61R9p;VNUeA2Sw zq(-+<_emD&UQ9e@ztcbFt^<)4Zp(Ce4@_7(@}6O`Tm1su^7MAB@CD(i=6+YXen5_u ziUX(XGFE8f0|;>Wqd_Fol+v(yCj9MKa?W}a1&VnxnyNrI^2zljKbBszntRLk6obUD z=>by}PPkN!Nox~XpSg##G)votY40^PJ4bKSLIyPhKI@<)alC^bxMH?N;{u=Tmbl}|=!mvkP8zU-PSsCjewk2wsJImp9 zLQOxJR)*j9+I76kwtE1==AedtXNblmgu|my{e7LGCn-L;JLJYROnGk@xj7^O>LO<2 zQ7G49pu?W{@8pgvXnB#3={{>hIvF>~g_MDhjZ#JWgL?H|KM&Q-m%OQ8>EncJVRxiY zVp!$^G2B>F(VBr&(7dV7un*iAQBh*=D==96gsN~?fcS)FxL+?X!~%T??H*r!`;5Q< zLHvGx3F=;mfj?Cbm87?2?OkP-65+&ym^yi-E`3HdvTpehdIzvfZU{X4K$5+oQ{M`h z8pr7p&qX;>q|O!cU%3bwWgS0VSP#c=?G+F>G0?!p`NfFa%sdV>O}VGWJgx^HpSY+^ z&}~19yXlnEd@oH;yVKx&oE${){iVIZGE`xxMo)UUfK< zt@`X3izchiWdFb!WW$m7(RI0v-dmxS1><;4N<8lX*F%CiIXk{zLjfbZa{x4cWDd{w zM9fuOOB}#uUEza^R|UY~Vn}@Anuv)+XOvyR3b` zm#P!}NQd7Ld8|rVkYL%;>n>*mZzCoInP5VA+)&&OB*l&Zp9ThP97SENmr% zZ)kw9HE^xbg$iJYMENnB3NOa_%anj&UjmYH0+Znu>?EqZ?u5M@0hh7*bEbhncdr6u z;Q0V>kSZuD)@>^=Xm}ECWbIju3P`{R-i8K+Ne63VhQvcX3lT1YbAjnO!RiA*vyXxE z%pqR2ALWq21|h*kIU#xUFVf(Ir-7~_2I-A;CQAg76a42;PnC9MC7 zAZOR`5B$?4J3Mrdp!C`*90Hdfq|I*v8oJYeCh?^7^UKWnkd4qcx(rp=VNTX}>_TEC zl3-v?_-9~X6ixbmGl`^-!puckDt-ugQv$BmXK|bd^y)_rmH@{U0bkq+zbm2v_Y?sI zbyUon&ybZz6x?GUY7fwlULnPXeTj-UiChT<4(of3>Jx4@k?cH!L;9mrp`j$qF@!FW zIjETTZ-aYLF|Y^T)TSXgN}xkrP?Uc7HYvusH3%f?Q#2WejZa9DMn=&bLi3UkZ-Jov z8Ra%dd@{l@1{&6#6Z)Mba>e8mfX4QABA$|)`N@!DW-4_c!gf2^g=sw@%PGG3K^Rj_ zJTqoe8%bgrJh4YAR5{K2kks;9PKfv`cbtA;O%svcD~7@3r1h6V?WiO+KbH*taKQWs>OAemZ zVwyQio!s(@=#x}RMOpMx!wD;}BzpjwG!xM=xP30z-sibi_rX1p=xrhN*)J`C5RlTWDXU z1HZ81D3y61#1V0qwj>T(SlJ0adx~r{Lru4iPAW z@Y>bzwHDBfRF*>O7+N8BJVPD=A%jTv6&lM5#kS}Gh@;{J9r--zV8I7JQ zB(8QubuEp&ep+2n7-8|#F;EkWT=+y8nsl!g8WGVnbDqu_^hnLj9}?a;YhIBcu6Kmr z-0#%9zWK@S`WXghiLe@wVRAZT((tgBfkZt!<-AZR6!tHm=HsmO=4wU3WTW4xLvm5o*~%$}O$!XEj`) z_de^r8k%y7gcpiw=WRV*EkA#Epy)bJ#XHYmcV2pRUaKJ1GCCWX1(HrWDH=L&z38@k z^s(tp(%g^}cA%Fm$gJ{~J>GWq9#&#QeTG?NrXA-zidrA%)r&2bwG50u0bNNZ*dUnQ z_6W^Ytx^VDg?3af8&OXLYu{~Yq)t!r|YN!sz?7B>Hp=`-abZH<3jP@S>?C>*k=oR68P{h_-m#t{<@e3Cw;boi1)S zgBm)*KU3{ga?1 zDEgsziJ?Tpp=9r&)XbszfZp_nF9cVei_yI>W#@O^Tt;e{RY8BM&|h@@7zrS6HL8B%{;O#UI*R3@K^*_T7;)rHVxZF zrrQS;*cZ(^*gHCeRy+K8?O5OK>=WqXljIVR=@M4?A3^ASK*IaP{P!7U_xpctq4^$p zeO^HkUXhvJ-oD=W!BF1d_>7Rkn$Vbp(8Rn@#8jB$+px^y zu(H;O@W{y8o>;V3eAn7vo2aTYDLFm)elidpkQx?}+BTBb{4>40KD~B4_XL3z=q@`mDy`=_q4qIm6+!UTXce(zBDoID_t8-0b~+*t>Psdvez|Fxl^MH8kt-Et2vd|->(>sE^m!)osNB-9-AH=TmL!s^L+d_`s>c`sWbHS_}A&_ z@#)3M>BHYMC7)-eXZ{v{mp5lNk7s_PXV-tsZvCD;IG;nd-Fr|Ahrbq2|18Z+FWo=; zhf6=tmM43cSMIkD50?L+|J^>^{6~V?|FLy^{#S*XoBC@*EiY}~p?4SCcX##oCf*BFH$$5WuvMu4zqd4*5PT+eGE zQ0tiR1)~gin`-`Rj?BLT6>qEDx)AqECK2l&qGi(|{j=Taa^w5q!Qbzbu66C| zEZ-TZYjVtL8dhpDsQU;h3=3y-QxLGaVUQ8|JIr*2ih0cBj!Dj*kb)7N&o-5J7|pccX#lc4QHnNcIi&G$)c!*yzd`TQVG9t(X>pG z8ynIr=-7gFZmc}dUP0o$#aftZRkn98Q0K+2ecq~LRW`7g>7dEann8~8`;aZIN+7r)ad_vi#_C|*b2){?#CAP6 zZ2V4(aj&uZdLgj{2{QKzo3ypX))8Km~K91Z;OSqI!S@LPNn~0{_H} ziKPMQrmTWsOAbN^rJ&uE{wOF7gqhGZC#4or&&kmtx!nO^x9C!E~x{{zx{MDXG_d04KUW7U!uo=0^pKfT#1QXgcLbL2VIc z5mp5_9Iib?yCqDlY%T;Iz5diS?qo9t1F<{80zm$PJ{FE%F#GAIt6)Jl$EaTr3KDBpz_5%il?w!6XMLJh&Z}$!$Suz|TPGB+|QU8cn4$xWWi; z>X$PykB$HoiTYkgvpn>VhEgyP>86azQTW+vjar3oVFGTLOYm!~u?0AKVqee5G8BXY zg!;e4(qc_}*1hh%$f?2ipD+U(%wto=!_hTtrMX-xeg7i>!W zzAazzxMW4mZn%x*qFzy$Piud5T|NV^ym&D{UX5KLXr@Lp112{qnp_ZVOMgf=@ho(m z?3B19u3LgqDN7Vl(~zycTLhT2ISkg+aFCc)`3?ydD-xSa&%|bA^dAr&caF9jy`W!i z3N~UEAyvdvkGCZ-X`f1d5+9a>aUO1uK?e!IduVUUZOJaWX+UTT4an5@7^P1X2?!Clop<7bIcBDkH2F1I)7sId6c7rIV?3 zIKSk~xEVDb#+T}dtA9+ah-Mbo&UzZ`O!VHJMSs*JcqiDIzyT>kcXKXFl#|<?L^3Pi{eLF(O>Ep z%yp}CH)(&%3?`fp1@k=2BU|ODr>~Y8FfHhze{vqksdyscONdPy%E2T8>Z-S$8IVq} zCgEH}f-MkMFW%bpaPT<)u%WwM%fDf{owBj?(lfQ|dZOh6bkXjaRb+W%r6@Mj74yz} zlWKXbpN~-RrK7hDLmwJ8kSZL7N^V`|nIGSmu4>zgvAF&5?CVX^R*hvmo52ng{3~p9 z{UncWWmopauSvV%^Sq3JAJQ=`GsWr`Wv}n{^}n`!YaG9*^13@P0k_T%s9)A*WU-wh z5Q}piCV_~%L#NNr`Zm?CT9)2)J9f6NUX6czqu|_tW$M_lW_nWH8DJ#>Zu#zk?~ZJZ zK$ZUz+X5e7hQuBZ;C>x+YG}S*Aq`iAeVr~<#l4&qi6K%c={}AB6>VpokGF{GWmJ?3 zQclHw{}FQiZGX9LA9q$!sYHt5BZgeb2Vd(V4SfVz=fxJeEJ4IP=8Jj+77v9fuF@Ku zvkXb-@G}SCrHF;TEQJLeA46{qVxb4mP(Hfa`FPtUeisp6J;D_xZ#0a2$Eu@0?ZzO< z>Jb=r=unSl*X9Tf?5dbiha2w_$CxoTsWH7)f zbUpXT<}J_fw{F)1c;D*8z9`@>Du5>Vt#A2tCSam-D57I|0>-y*pUQy}>#&4mtdHSD zQ>^}%1LEw1k2nXt=L6J;NWCN#*xu^-f85ebnj@{Ee8XBIpyJNQdHo(|9mwm1-*hJ0 zy9Nw`DX7c{%JGY**S&RPv##9)qBty!OWwZ$SnI?(P}kt6DX`_$k?u_3J;4c*b7Azj zro0Q{>q4^x-@=IuOnmHN*ajGQ;z&F>D8WVw&Nd83_&Qh^=`S3MBS#{0t%D7uwulIQ z&zee155rM`V3KQTQ|y>AD3Cn0q&`MrNSa5qTw`dk8vsakNUwAjQ5e`IzBsu=LUs7O zsL*^|+Dd8z+)GN+P;*H(1#zULl9Ox#wa=>_JaK-76@8rV`U)Y61iVO#*3qK; zL9BW`fITEK|AhE)8l{bbX+|U2IVzN2$&ES8iPf6;>>MKvhC|+jRlk;$W=;H@8&i@M zGXja(2*H$t;lh;I07GE$9NgPjoUWG|`Aw>5>W6x-;yjda$<}~L6VWpYxMtk67D_>S zlg4NK;0xXKl2_?iR+M&1Y!0Gs?>wAN6jPOA)99V>#ZjN=bKv$UA}}K6waO{TXM($3QE7`&tuys=GZ6Rip|?H$zv1C zD_IETA^p5V<906U@Fta14;VyU1E79}CDy{S4a~brO6M~GZ#WewrWYuC7F?_mU+1LX zQs&!pdoaWt{4g*G6hbh4-v z&{JxCReDWQX01$ohCyaKT-2^ye8gXR*;l4b8`QgI)(a(?fjjh{Rrp*!D(?YX$VO?e z2a1N275bRIRG&P zp=olbKzl5Y*U))qUs%%!`0>-Rm$L zAl`GXTAh!Z&Z1j;5(nlAp~S=J=lT=LpgHn&O4YfW`9Lwto!_V%H zl0`+sK}fQvHw^-1vVs0q|p&}7r%8PDC+@dL+r{ofxS@ChJ?<;si6Ba(=kf) zWe=V_i)j6ss_41cD{av_^SAY^;>Bof?Ygsw7j2Ttu9CbJq6sph$0*5+>6}LFkP_^7 z^{8MGE>VVX@%jJ_k!OQ{JSC-i#j;yE=}p1)<=|hjAn6I>G5tRF6LOmtkcSiTn+gx( zWp9lLveg8c8gmT`C4zHA_h(_k?;Mi3r=J@LQ*O%cv?zw2`@2s z8AH{M5t|xc=77%-#9}DI9a69d0@Rr~-c{jdDM3d5R>vFU-01EltZ2(pNs5aP9)o~f zA-Jk=tPu#Ic`T@V4RnBpfgiTA1MVJyR!C|L!D9RbyQcMaaH0oqNcSuJe|obgOcKK2 z*yN}gauZBCeu7dGpxzy>F&wuPL3oX17kxuo-7NU*OFUyuVc2z@V`E|2kKsD6`|csw zVhsl`igCbod zlJ&NqxM`k$*!>(^Cp(QF=|trmGjHy(Y_8xY9M~WzzG$9r!pYq- zMrXUp-G`(KZ`|nGS<2wp{tU~0YV*22^C3~Q;ZUUB6aVk#V!W;zYB~YpaM>1f;=O00 z6u%^aijpgWs)J}1+z_Cob)brCAkl}=%9}vh;~Bw4JF%vMp8L0$Z}s60uCl*mC0Xnx zAG(Im1+++_ESvLeZ0P z7R47`Su2u|v8kHTBbl)I`G`a8BCv%)x$MniZ!JT;G;)3487X2pC%CxgPWOZ76iC63 zNx`_RDLLEcvp#T#Ymu}3;6yK5hNJ}h`MV>%3i9W!(Id&6wNG%Y1%<-C7K^^9ko@sX z_1VL)!%JduG(TaAj95p3<2gh3wU8`^t^!n6_H?HI7O5&Fq#F91@KIo8?U`d2mQ0>Jt-Dbq?9V~%qa_SgJd0So zLqDP-3__5v@q?}(fH-mFd6eyn3*BQ{2K0&l-ArEah0JhZ|Z}nxPxzm6| zrf5C5%$+2pf?oQ)*;XZaN_H~w)_0y}{HIKB0C69#)zFyNKtRW3Y0NojB_yRcoize{jtq<6Qm|JtPmmRh?7TSV|r{ zj-eBdek+_4`4N4tBN351BCC-Nutp%k{f=)Ah+Xp)?$$rW0uKjZ%1#(0 zpPf`wO}eni-ES!#SKRhk)4+cHmeofBKw`!{1o-~zr#&APSuO#UUGk6y>Vs(x_sKGy& zTu)(g-C40GP|#OoM^*jDBW~4nG)(*3XJ4|Q3*xvc6#5!YCx zvRo~Ll)4Hk@yredX4_Qn>&xo63Ua#o$*rlBj!O400eWMp>QljGm4Tii$#FT8R29Oc zhO!ye-_G+Ig0aUtw;@4g~=Cpip1-9C%%nxYj#Nc+cSE9o6OBJG9P`Lr27b0 zNt;B;?bza3nvUzk5ZOp#(DGBQK-qsx4ig49OZ(H{n^n2P( z@~|4P;WN|c6IO{Vae#@KH*aLx13&zBXi_R@GRq%XRb+gXDnAw?W->B{2s*0K#eeei zGKH;&ymQp^lB{v+dj^RLt>~|&2+sWT> zVQ?>xH`Qh#?LTyPRe`Rd-xST-;z+a460s1za!!c1pKxA3GlUCzS^i17mCGE%n4 zQBuT5%ej}5shG$IoiYQfp&ZO8^Nd?rSt2uUbMi(Ao`9osKfk}G8@2`Ove5@7?Ow?V+DAoKVh&6 z+*6g2O7slpPdcVBBh|H5_oAX^;*a$QnUKVMYQe@cSe6PIMS<0H@^EE+aH2uEApsa1 z{Bo&S-ucZkj2r_bJSAX}GbG;AQ+R~?&r#O)pDe}Dmyu@ZOaZDsesdag%_!Smf4a@B zV6jDa^_=z^;|!WS22pd6e=~XLnIXWf|3^jT+9`uvla@ZokHm{ioHuYYJnork#;nv$ zr6B3KRyHN3gKK;>gJ-PVE=m!!`fo{tu1zTirGuoeV>y+Yf}}HXX!&z&lC-)ap4v_n zif`ehbk!0oei(`|>X6|-BT3~p6p&sMmBK)aUDvBQFgtyaNZ-tHSn}R8D6uY@ky*zl%ry1uXCjn zV*=%xOdZi*K&$D)jkAV>&XV-VE#>_p=Co|(`gOzLXO^tGHiPo-oT)6uELu}N-pK@$ z*2WevLyszsUXhj<;=T*)LL~7y)@$Mzc$+5?pkGNxIw!=e$k#Q(?i@m1cw07k*j50N z8D*^UvQ71ggtR7bxAT6Sge{@8hCSpa*2zArngRUz3e4Fh-TGhT2zW~3 zse<^)KS?-;u&*Tsp{C@SktEwz4t>m)q00s*yXN9wk~I-Y20^LL^Wx_}i0AY_vpu0V z%hX#i%O;yNN8Ijf=KfM-{R5CJ8sM{D^Ynv1@_$+aFD!Lc5VLDhN32m!=PKh$+4B!n zpPff1VudpWaXHk5=4J^O1`rkG(5K4|CG_%8iLIr%7J7Kws0zZSJ5=+;t$fP7du7Ow zu=(IZF$wQ`f$I16y+9T94$DPUtNs#zmS8I(skBGH*quSj@euo`GZx^F#3U+5urO12 z*W7g4_1lJATmzo1$;UcBSmvjG?j>qGe9>k?RF*fa%-<7pwg4#ny102!)M_u%5b`*V z3&&}9nfWBSS8!j=l9=Glp1AQNE5a(a+(;i?GN2a_AE&T$l zimy?tt|{Xk`H%HygNxfn0K~Hak9+Bh3)a0NEZgrqjd=Im-|c<>P4qQm^*p0keqSTf zbNUnZW#RX>{Wr$Ha0_#zll2hl(ddLx70-yzNhuT?Qt@DKwob+k{ecJWayQKrcmO(=vi+=sEVz>e*B%~A4r7HFWIAqD_yhFXAxC|0Fzgp9oB14{9f95WK&KW7q zq1qj+f8QU5;`vJpSafn*0MMcHA-n~h0{VDQoFqPm;~Qe&nOFzl-AMBr%0M4BJ(VRC zl#muug$NV&jyIKhlZ4!4ykJbl(t!j>4&vo{;oA@PFt=r}=*U9ZWP%Y5d}7`2sO9#5 ziEB_0$@g|CX7+gQA`hk!<9nSS{h-*YazC;Af)EW?%yQahZ@ zz|162c`%?&EX1F!APJg+d!FwvL7r>?tiUFDY7#7t3gphidbI%-6itej5OK3tVj~=i zVH=7f0hNx*l~pv1w&KEZ0^R4U{UsteOT*JiVz{KqFO;HrQb9b>Fm=x+Q5ApXrl89b zEKZkUW7Qs$QRQ!o${*{MJ0p=P4`t!?N*>gYgAfr3keDs^_#>ys=unovC-{pl1w_jA zu9(=i2$gJDQn5r|3BBqYtWh@#)v5E&?w`ZT)@tzHA-vPfK>!g3Yu@{171^I7Gh3l4 zhB7l2olzz2=pU1K_DyoLLSu)5eKYGJ?x7)Q-dxvZ#i^fa0=Hv|U3mF}z&(k0Q!aIH zf$kKcXUmaD842jh^4J#|wbFWZ+8fXqc4vN9mBbVEN}aE5{7pte-KRR4va%YFYc=95 zzEUqpJZ{Cq_IZq5h=&{1Wo27L?Jb3UAGN&?*+xy+!KLuqlRHWTXbr~>DZ~PP!y@-I z(DhF+Du>l&$?o@oGDuZ+bH5%OjQ#e^fo2oow0!xrL~3Ja0EcV5rfWQq*5|v$wrl^%UdSXFUlsYR z0%jB``scEQqd?}7J&@|IbG4q)AqQr=8xE|j#w`q1&Iyue!p(-`nd#$bk?1&z>u4dh z<#l0C%J9sau<2o#lt@gKb{+abKN=X0DiT}cZbm~FTbL{0B|KPS3}p3e_S?u~+V0@H zVbF+&?ugP8Ye-OFeo!_Pn2rImO+=naXbVwJLJg-eb(7a6s#y!h)w_5qHgYDIc^un< zlo6kmoA3+(gEEza($v8%s)g@LaIDnu7wG1k@9&}xcrRdBs_irM*M90IxUdTyP4)ow z>mV0uZQ{i??3Jl&gV2`raDJ6%iO&eEPvU=TG6jGH%cvvrkwk)gn){K`X1IE)5&G!$ zMG|)itK$fc6$UmjOOR`c-V>H!*QQ{JYrNRXK|5Unjy+dKGJiMq;?D6>rjJ!9v^)g8qHY>q&2{FavntoCq#>dv1nZ9 zb058Us3$^{ZQiG50#{m4r!_X$d|IzH>yz{ z--N06z09^8p|gBbm2Hr%ZuDH5=g2ZL&eF^=``S&xeJ%4N#+#|YD2wOYri4~DU&dZv zj_`$Vm$z@*_7j;u-_{);cG8ozKHBD7W_<7X)tGVA{<-!%^;g$Nw6@W2Evn2eaEabt zs&va~dp@!n_uKIukNmJ|+BQuVxvO(08xiOUG+W+T~)(edizk1Cj0v1@)YEFl5c#A(l+xSm(pADn2Ov;x>SUlGK z%YPbZOEA6K21rc;C?Q9*`u?=~n0#w+xp_ZQXtTWb5xe`*RuL9)PBhDPFeS2uZ4J&& z?N=Q7?2Ouv(w&?5xkZlH0`z|E>33k1c3I5K|iN2z$M5f5jv zmgnYl#Q5%aMNGh0?B9{>a%Y7Nj7>h>uHaz8#CjkqZFh=hi#?**2@%)#8>92HvS_8m z2;gFJVhnL%tj25^FCj7Z^Tu=O`JLnnVd_3QVEx1m#5nwweAF9%y5)QB5edeD2Q!pl z-Ep8KHHy&NA$ylNKtk=!9PXG;iCNZRJiIakTm<|YXtN@eE02}vsCJ_<>azJ4CRKjQOwyx;HF z>-Bs=Hy-?(<>a{e=nhG3V4TyhpQF56t$LF)w{`4SN&3UJ2S*xhl1Qd}l=iQ~gcB~r z?TsV>|EqUwzNbhWC4WWjSbb${dQ z$-GG<#M<3=mzX*(Fg+B;M%Dv)lbGI`M!#i`7Sbina`(S=o_|ii`}!+>V3qv>iir=! zG*am>n!&^?uOJi;w2~y&q271r-_ODa?v5FJTad6dwzZ6yaGS(iRWX~tg}W*2K}r9GG{*e6 zz+R-PTP9H%bQlw)n;2I0AG|xJpZMSU1@?{0iEB^p?_Ib*(*y}a$^E^M_?Gy8Cy$S<FN)s4Zk`ZTB1F)&`oqB#-du&H*dzc~|er48_La zs!*Qxtkyzjg1WcXf69#&rv*<-lQc~r!UbfFz>WRu#*ff07QUcBq{^kHrt3dh0%hzY z7w`yMujyJi(qOvIAY@gh^)`qvNHD7#?4cIE5%955$D%-x#lGe5E1OTSc(u|KNdN0Q zmN|M+n}9F7!|2w~v8A_V2U6v2&-Zd#(Klo`d1TKI38|OFCFQn9eI7y|XCrllE{WKG z(P)GEqgiQ=28WCT`tb2Q*Hd3_jpZ}vda&R(6c;Q;Yp(D6clU##0HqGIbvlu%rR9pIid;Sk|M=|+5qgy3VJ-8 z5+h|Z7sV$g&sbqcbAApbDx9|LdTI|C0=YfcJk6!-4nyL_coVpK6l9B$C)V&XmT<5J zvT&_byo9=zs&X&5(J<@mfE1Go1j=wx4m#Ya&@^uB7}8upJwRMK&ht&nOVd-dR7-2T zK3GbrkWbTF<;(d-WbL;H^X!(7F(W6#qBe*`=~o1gn(S-H(B$SRJxwEF zYPYlix)jWhAQom8NB}cb2Fw=KLR}&WrLIhcaqk{N6eEOn7*|KFRaT zJlI}z*=h2oF48S@fG_yaGhUqCGNN0m5j_{I=Hwu;E3E1)0_k~(7O_&jiM$207}b@} z&;l8?Q~Gx%7a2TLjWCdo!Ip$3?qI1uqiOQY?5)w-ceD_tv~)@RanHMf+P^>FJuxs` zbJk1}Ne_n39~9L5xMA+U?;GGGmu|0{`P9BS=mjz+sHjUB52sf)uSg7Ssb$xNd1 zzg(G0kd|K;=zksWeEhpgabi1p@(S`y!{w%m2;0;z$FjObxSqYD9~VNlRy_3^*a-w* zWcLGaT+mJ&myjjSgnIQ~9*U_WcPp(J$O>{YYXyW_-VR@*r{+g!M9xszts)*s>5ruZ z*zLJ<=a`5k1JcR(u_yeQ?9dn+OdK*$_MNT3x zX;3GO!4^4y#~n7rQ#Q<1cjn`?zAdYm@X{WS=9r$a3EEe8?w5arn5fm8O+5`ACtQcf zIWrWechWKnuWfPYnQw5^<{1h%og_IvCj-e!l!tZgQRl=6f;%_`QPL`L>Dl^;bggo;F%eXCYc;$U^dhwCd zw-8^TUd;-c$MpI6SVgqVuOs;B@S&(=al<4aIQjiK3?9SNmvdP=$d+05e71O-4bNze z-c+G~v!|;_{*BnI>4q3vv8g;~<@}z{mFA`Vg;mBCeXc#B8=Pq&24fDLK(co_4*m`ZfmT zLa|7t9pkgS{&0d`Cu?SjA78nt!KT0c-5u>-a{W+-a)tor^9&hmhw?)mRt{Dkg~GZD zfv8DZ#ea%V1;`w>kh_giO=zaHL@=U#v+TkZK=VOt|1hnqRl8|BjlJpPrpm00Yvu2yEmDtF^p5zs- z(XuU^Z_BQDjC4h#nyV3B8j(gcFVn49^^yjly>fM1P%BeA6=I-ptzp3Zcmwz46?_@7f^Z!v%Z_L(Z%gZX2#<|H{ZMjW9BJ z4j@Md^}UOEgXM=@#2ch8P<6QUKvlF3E$L|dSvQ#YvDbrH~^Gk(4yYju;uqY zRZh{cp;>XcO6cvveTOezw@HoeF$89zF{&})?H9h6UIm{GY!kV0c;1rsN>)qtyZ4qn zS(_Pu4dn9v6nwZlofq&=?(a&Xy0qSaZQfQe#Ras(U#*!y56~hum%G5{DJC~A8bHFJ4S~C0_0`Sh@yW%+PzNmUvg}!h_W|yETR)A;eSq~1&tf}XRAB%1GC>WJbHWY zVo_w;+1ja>1|rV^#@TeR!qkV4&Kz7-P#y<*FDT!%J55GkZ0Q$i=^x-~B&Ae=1dn5= zId2SE0C0uDipI z_~Z^lcupK3W(-H7ME>it0^mhkic*nAOy57BQwCP$qpK~lU2anUTaWsDjfej1KkoBao z`~#^8q$K_MRLvnw31w16YYfGap$-5JHe`kQ+N+81+Bnm}^;ymPIGzo+EvpHRCI;__ zu|fw?JAmoAMAv>11nfq~JQLAzzzRx#)a<^9YIW7f7q@D#6snls409B&IJqizI~iw& zWk<4#FFt|t8lKl+6*=|>loViql7$PNQCcA5u}-nDFGuq8SK90e=o0L4(SQhpbIQ@6 zni!J?NZ}~B&~J!>exs2Vg_m$@!Teprtepmsesr994TqIE|GEO73Yo65fyWtvMdBFn zp|WeN9%XrE=s6G7C6A}ukTNvVCV)g#hwNVbwtLnPU5`1d{KQzlKr;e4Zk+N8bO~K6 zty51zDt=UPNS`XAjZvQ1dpt7Gh?ju*L`^b%{zU`K0t{!%Ew&`Yi-n=}mr(;BD}1C3 zCuP2>$HS%PD47#7Nmy17e4`s?S;o{nA*)kGq-AJPBPI{Ke=>;eg39Q|ayOtbxn^+} zAA)W(BnjB8!!lJbqDTC|ueon-%(+*V$zjhqeM1 zX$j%tV%g(xY7tD{j&a^0OKAR)IAaf;xlWx$$@=e8*(u~SJ-CNMr4(4fp1~NF5 zey=kQ-p*v9LF+-u?VUA*w*%oSEQ$wYb)(9Cm6IgBF--VF--*vSZgde=`Qt5@p`S@l z_M3cvrB>#?xmHOvoc&XZe=C~T88`P)yqzZeg-`Y^EmwG=yy)H+R1%DsJSHt<36mb= zH2R8DmQNx+EE1b-F(N3T@+3u#9Dd=%iGElXr0E1D>0z;IFtfTeHXvOjN!O5V4W~vd zKkDw}8RFLXCCl}n?8`&yrG0=5BrhXqNVo~agT!TS^a<|+w<0HBxG_Tkh(>cpxxeA> zWkcn{oS#-jr;d@dsP*RU)yEa4noAhK+f!#b{l!7t>&L?XH3N{7IRz~Og?dWnr-Z`= z)46uMk`>+^x+da=;sNB7qa1jVq&&ol|Fv11(tK6CSe%OPRW%}cu|Jc0OLmY@Xtz$* zax>%_V+8eARO(+=V~O>QSFGu;s-CWDMh`8~9WAPu!w(25|JHUr2l;cDG|}Q~<$WB; z`4?T}>|AeEGed0xuiLMFO{a`li%$=GWP}H*TRooIhsE+G4OGpGj#YF$dSC(G$A~Vi z-TNZky0LnIH+E9?@|txyF}wV0>9LqYKVKYxhj(rcBKL3=XWTsDz0d1Oqv}<`!$5lDCx&ygok?+rIC> zkPQH;H>qqNu;_FFzgtKP7BNkV;ah_;KD^;ON9QXtI4v_*H5eX6>|^2&vQ;|)XY;Qr zt&yb=xNESHC3in8UJ9qn-(3IjyGF67+4ttI`2{n>FHQ_jeYdX@(tlPqIeFQ2f`O1@ z5=c;dQ88%KUwQwJk+vK0$RkBXJ#{%0$8|_v3H4F}DcJHG=?0P3V3QV#%*Q`jyo{5zq~)ZV&ci|*+u`h8x-dTGqc1HOb`g2&9z%NK55RX z;Pc!KmTc-L#V#Jq$rY9t0Kr@kW7E@C2zLCnz9IC%6Rbhu`1E)R-P;rPiCj;8^{Dg$Nigyh8l2lb#V?k#OwNpEG zmE#6m+%jV1wvw-n`d==rsFzM0=lt#a!a`;DzpfX{TdyEr) zd6rr8fJF*fU*zPw+|!^n*`Y*G#Ypg^Sjb)22Q;znDf{n$!kFA_A*q2CSI(TKRF#hY zeU|S1S?zGL_oe&8=#jgPzPr*or01V71Wji(D+`UVKw~~gJ`J6%pmDw0?oS0ZQ~Fti zsbI)-D z#!D9c@LYpfgVhIvkIhjjRIO-3E@`@nM3=O*BXqTvuepCXd|m2>yY%1-hm7$<&~uqm zaoLwUmugK$CzXiY9x?8i`hV;28x?xsQ3Ru0Q)*Ia)9agUikPO6N>Y~UrDysz=pQ}73*6v? zKA~@b8dVUX+=NNoK8aan;f|f?qx1>;Z$Aw#X$Oqna(oeNSS&)d_OT)uUTMya-MYdh z+9X#1Qs^hcA#~Q6(9q~4{ldw$iDAV`PckgUyhLi95C7$p(K zKrgbC<(Z&6myPFI^nK`%w)|TH8^UXy&C0j0+)Y;E%&-grNOwAdJA1^$pD=U^ zJA{!Dgv$)kR3fXWQ3E~2u{`wY8*3-yh#QaOCaMfot$=bqZTG^M<+N}rT81iCxCpwZ zc5tUOuVM5_9F^x4&Hfk4x!I!65P7RpoS&uS(yR9?Nly4OiQC=PcjEVIdfUk8GyS;J z1TA<=9oNwcAF|uWtSRrUaOi@IHZTcH2V0fn7Em2e(L*vJq&|RDxCdAcJ zLs$x+R@ZFx#W5BHj-byYS08Q81+vDD@O6SPgIAtE)T*7&@5OHC}laW5+P5 zoqBxkxs7^_TW6HwznRKIu%IMCXcN<$v+?>JBu**@gds9xh;*H2AFE?|yD;?Uf`>;e z@?|dc_W)6fMh#xq5XnGPxo{d`b*Rju_~X3DASu-@u{duN6YZqH$HJZOWfKsi4g>Oe zed0tSG;HmO;+^jAuhQVwHMc#^>1JaAli94X!TD|8XTo0x-ysMyOHFp1lRkS9_omrM z0!NKyZW7^h|BHP3@SL@yuDr1oq*XZX+(Ns0TVkXp1^0>p4J?UNo83bfGNi|d?WXb) z-wc$MSzNSUZf*p;d-?Op>-t*#{JVw1oMB3n^D@>1A~4|OEgOoJGj%eee7&u|*O}Q^ zwQRMmxg*eDuTs;fX;$324C9g~+&l{y>Qzu7Fonuj82mQ6csulss**x8S)NGTe|rdj zMB_IQd#-d(Ei~Z0xRJQ7poW5B@V}*3ACy{@Ur&z`&qTa2E*r^y#=o8VhB+F~pc+`b z{C(3dMZ0y+(#)`Z&|oC(uI3CGV!=>ZGDrd#=|W0e`NF14xi7>YC-gtn?8>MmKO?i= z^?v$T-Bnvd#jS7gLDvH*^M{4Vp^w63Dc>|jq}A-%49)A)OTVopMha)CANT**OXx|S z_K`Vqm9nZ+G0WQawqe-GDhaQ$dRo|Zr_(m*gk&u4#CWDuAurfnp0{?q^i1;O@J+6w zX6!W)_ooV%EM`j-wJ@NkXN>tG!3!$U*Mb&G44U*eCjZ=C`BuA!iKK*YHe}nm3n=n_no54x}x!78D(x;c-vM<dCNxT(5ZZxh1Dg{3?X1F$G%4+NGdIPCr%dGi0IcH)-qbxe&|*rFWUzhye@I6 zY7D2rC7>aj@Gcdnh~@hSBFTfwk}YCOtb>e|F!7hk zH|kyyvMLKi_BA+xpk%v=8h_9gGvP}XKjYG7P1^g-wO(eerU@8LP&7w<+L)5~Oq9~Z zNk*CSjBNRkuI5~rYnkk^rO&-sSzz!i^e4!lRsdY^IW+McuIQ*$E0=WTZ3E`$3xAkzEn^|v3f8Uq-4 zYf0aZDjYU4q3TR~1(lO-*2k|49KF_>35saL~#m%W9<;uZgY(0(QJ`dv@H z+RkM0hqAMFhR$S? z8MS%9S*0w0|4l`5d0DkZy_$#~N3o5%p(*!c)IwOOIZhOh2zrQSWWFgLkZ3081Im|jmj6!x zlkB`9Gu&W|?wDp%qznhxQ)z5|i+OB6KuJF+j;MEZWEdpA`S zA56++g9{??XFSa^K)g4DrBVHiB8jMAp3^K4$Rx@4nZI4G9jpSK1;(JgIEpzv ziR7Q4n&xY=g*#ZaP)3pe{(}BZ#Sw)r1#Va|9*q$MqC(9^LjNh|{b4H6m~3GA=ys8# zRLES#I@mmBPEts@%DB0YqX(qE$nTJ6u1%n5hR`N1iyk?xPdoNZVi`Qo>_J2L9{A&D z@KWPrjuh7%w2+Z`)#EX8FgB=UaqpIi&f67He+4M%8fh+=RpK(KHkUH)2$a{@4 zOpbPSu4{p3-sB`=S_syd<9QvAR;CvvRYP^x(Ng!Sx?yD;HGptt<`%H1cALuHp1bO@U1MyVm>FlA}}W;{ttb&~T@ z@EWyirrgwvDRvvPe}$GUzdmVf(wDa@>WX(C)2F3*<}nK)r+Oq`C7KuTdV>_kg5aDB zm-zZixz3K&v55qec$? zuel@({Z_dwYI3Asl7=>Z#834RS6TVX6W&GUEkJX(x6&V&PnHNZ;Nwa@o@?+A@Z#>W zF}-_ZoZZ^2bRs3yF6SCB!z;jxXVUDtwr&H5*L+(xUeccH`K%NtyBX?8kk}K5 z*2CIq!BjYIV(QT`$0OFvgd5+Yn%#!%>{v4cEtYAn+}~zy3~$A1MZ2YY4l!h@0D9;U z2dAJ?8N2!0Pg%q7m)QL)9MXYp$98Xs%_HJg9R4&x30pZn3V^^>( z&xc2)ahX-Xg0p}6#hrTv{QPmc`aPR)l?~`;ywH+_z@Moln%BYJ9WR$$!N0nZHyC-} zM32JH(&O|)Ja`sZUKeqk@B?F&W}I*IIpv$RUi9bxDHZZ5voFXQV-gwRqCLY_`}CDM zvpt|q_Q5$5-Yc8#r%KhstiU^;wI)-<0tV$K2-sUS$0O0+kzdPMV+;6jAIL%{W$dZW zX6m(QmiS7+mx9$s+PY&`WzC`&O`pCJd5kwOgpI&sbajiEIvB z`RULMbNH3wT#Vt{HtltNU*-44AMUPjC{zC?T1sW`vqzGb$?h^zP~Er4E2 zxOUH1eEh%Qv;Tr(i}>ws)u>D0`*yIrBg&bdDx`628O$El><1QxZa-3nx*J`qO43t& zI})KIKlWrPKz24!9|;7I&V|32dHxc^alVEv9M!WQO`vk;47>T3s1QSQo7{ z<|&{N%#0mjUXXbjM87M^condSj#@;|5q=eS0G4YtT|E)59MiZyK}C7Du4+jPohzTT z9ru8P?RvL=>C%|&v%|9AdqEOGwwj7$j#~k}ub3c(#54Pr%_n}{f?nPdtqZ`13duE| z-0~^MnAJMs;+ctH%{f)xeQ1)!4IUHxxR7UjN4MYxm7O0b=!*X|wskVSCFDoEZQa57 zD*1U>#o|QBLQmhW*f-&!g=R%ANn@C97?#4Jt%H5_GQ)F4HNvb5o)?uuE}O@X09hh${S@%C_Q} z??;ZC91u+C@K2Ut29XMCedW7toiM#~L`lwC6f}*kX%7Cq@VT(ACo6Y9G)YZ+pqwiJ zFX1o2jKK=ZCpt!X4p%L(4JD_f%i?Bx4OHAKRj5LfnRV2ahxfxiVB_g--o{H`` zkIuv$y$SREr-&Imi{V6xRdvfzR$(*-$QdLXmmn_hIoG)?qaY#MTPkog|1}^Bd7tBV z$uqvKdgW9C3>>Gck#r+8K)#3x_DMp4qo>oN6DH%w?K}@Z{C2SdROsdFXwk?QN=u0L zavjSY*TK9KASe+hM3Scp80Uo})g#9j)US!FhC+CC`7j|JCm@QUu3V&(^r8Z~n;z@F1N zE?s;ibhBsu7DZP3lB5!eg1l)XEz7!aQr83aAkOhxZfKOl3nln<0lLp_N`!8IhpajA zmp}MA5lDPLY}*`KhD=%or@)X%_s3h0h-yqvEj(N1IB{Z7&%!w zlLk5TC?qzOWbkSJYch@Xm?|9x&E=)+^4g&-ec&~iw4+;iVySQ^lc;29o%N|0lZ|Ok z<{3rV=s-P)%%WopryW>N1IWA`#A!(_4KrrpA*L0FALeM3v)^)x1uoY_0xXTM(4FMW zN>z)6Y2UYP9P2kqTjMvVbdzPOx^ndGe^rYz)?zppniYvkeq;A(KI%rNM9$ zas$sc@qjCecyaZ;njn|Pi^Ur10*v32Wp~ni3@ZSlb6I$ztGbXiBrHdQa571_Fb*?L z4IlPv>v>{NP^3ozzd=?`P)h8=FA-JXqoQIyqb(4k0O<&jKMg; z!~REQD?vWlUvFn$t~6t>50Z_ZAQK1@#176fyED0T$F&tT_feD|#`ii7h4$idkwJc` zv-^Uv$i)hs$a;dmbLm=3xjV^#8%kgpfO~J4`^Ri9Ka?n2DHJ8iQ5r~~uekyH!uUfa zs5FFG|J4&m9*_hAL$bxv-x4vE^El2LGFuDEZ`i9Y$Mfe-t?(X@8QsCI>uF*pRx={`RJ&=r4;@Y(~6zJ^Ep$X0duDlBsZ5VcO>3j?8FX+CNV>YQtT|k9qPg0iu@a{8{WE zi|M3xOcccnY;}OtZ}2o%RWqXk8{;^le)|(mmF+N`Q45@naV&Z$#hkeLd;w7uJ;@Rq zWtyhYDFM*~0QK<7p-g58iEL{`@fNvoemcE}U2}L99lCh!Wr+siIzio#af%rrkXK{Y zPc_Bs|9l)jDP9Sj&pnhl90~m_Yb@kEFU)oa(RazfOAF_xC0Ym&iEEC3pyv4OfW^9( z?HEs{*9NNSYEvE%p=7zh&inZbu7>Q&;Q{C5Jh_bw#e#NS(n=NXkAais<4>lv6NbYQ z?qj}0QDG~Nntj~`Q$vdrLy0o`>Q$axD66EqaY<=;++%c3vZ=Xihkrhh(otghuw-c( zEL!2rZ0RH>lpx>e%$x<6r>x35ba4BiEY~8Kcss62nxuWyMa<>NicHy(@wDDf&Mgon zsnSdzC`_Pf9Z(Ud0E(!sQWH!soDFTjU{xhza-d$1S^{cC&vo2vvn&ss{4PkZ z6{^$Ay`9rF2Z%9PY-rcJvK@QQ#963godv<*ve3-+djU&@NLKtQDjdrf#RjDIJy^^4 zxEau@s`~u?p^u2xH6~#V;y3P@k43TUl>wL^(GLU$oTE+%^X&X-UN{m0g!Pqq{ltK5 z3={%t5m{>v<+ccx*Ijg2 z^Cv;5`-m#=$`d|AG;CvqrEa4DB=Lz$7d$2lko3UbhJsj$o@hzVB)~hYv-9k@U`Idb zkLO|Xk6Tfm4-RSU%2=ystN`B`E`r_NOY@0^0q6N_47wt3{SvaWab;X;Wn|3o2XQJ8 zsRv_NUf!rXfC`L^5buar@^S}Pp0ijB(WFtA`J@H;Lzc3X2h zp9LraPwy%Gbv|dY#7zJ0_^Bh-**#m_r029p;=L;R@EX%CZgItBN16o@jqhP<cnHB>bflHd;i+@6GD~(8_^MA(q*ash6Xt&*gPVSwdJn z*N*T+co6cZG_x2sflLP{5XEO%h(H3zJLONhNzSbjJjp2C`=^Utl|T#ew>a(sz-()6 zh5Wv}dEgpa2qgRcKz9a>Ofa^1BP*~}C|>`GTxKsiA;CP5Q@86x7yJy@U2wlaV@)N+ zm|soJp%FvhaWRpfbdXrUuxL31jUEqypNR&kdtoE@#%y!s>lfwEk}Udps_JH&GnmKY z--oS?mU+#gOJcjY9QxfuPnLB3T@dc|N|)ukB?WCg(CU{*3fsc`C{LWH=IK1uWB6`w zk((Cx`Wq&3Vbg3yAz{!G{Tt>SAvG0sC>{T=B0_OJ32A4@oTXP0MJ{V=jE1k&K?k`84Dvkln3@VjXg9^`n#gnpZGXwI0= z`{_A)FJQ-h@td=fOQX(9PX2*Q&%c%hY7hRZ5O`^&RNP!}=<4*Xr|2$I34Js<%PqKU zG-zrFNp+2h$jG{Q@77Vzi1kpBJUp%(Uv}{hY-Q+@JYzWE4Tp)Fc$*Ou+XYoO`bUK~ zg41F;U)}J9S~qv5ktg?VBCkQDn)f}2IM%dqv05(CcU&LHMy*&~Pf$N7&|1Y$+PI_7 z^X3`xxodsH@hTW{$TvItNa+cOvy2+b(s<2OFvf9?C=HG{*hP}A-A5z2qJ{Ta@atg- zBG&@6lBCqwB8LR+7maL;(cw*wm#@Y*%edHENZDqx-P5#^DIUwUNmrjm!r0b}%m@L3 z4z>u*Tm_nuTKk{d;)If^-&LLi_2>#r?QS-ht#P+U@FukZl>xtG(~9>VX3;5(?~$k! zQ5I?6bIYei%o83o?ssy4k0A@j@}HmeJ&9O)oak|F0=fYKKf4$QV=Hl%A0QvD_ddD* z?2Hs%)UZpy?1cQok z3?7<&!#Y+6N9L8 zDy-D3sVR7xo-GoD_GU>~yJDhRTEIv}N61mwAQ*{SA5x`IQ-R2a>}sk6FHW&2i?z9S zsx3f9F6<_VRbC$?%n7yNpGM+D_kw}8ao61CLoX+sS%M&!I+G7)-I*>sxDRw9}E|9x!sn=}_q=kHg`Xe_S z#3M@ZFM_S?Y3q*|!RuKgp^LIly3NxIeLw(?=}H}0s8o6|7BX6;%-Xg9yquD;ejuYz z@Ay1aGvz``t&m~iL=}j7jxmJ8 z26Z)S4lqkG;}61&Bq*Bj$F+70<*RJ0$R+3nnT zO*&`mt4W6ctWJwV$_kw#DnqJvlH@nco{hfDUF-CyymBBn{Mce-AT>l5^rq%0~_&& z8Uo{cspTJN#IuuNw&5Qc9gR+Md2yL+aSFg``?K4Z4{ppf}ZrNq5c|~>C)mM zJBFXr82Mm_yfD<-7(>OvbLL%1w{2Ul)~WR#POl40`^XJv#)EFJ|T4((0CG;hp&M3Du++`GaxS{x2 zm~Nr_D4aTQzKvL=VT9?64o<2Wd13U zPamg&us3}`HVk4eI~2k{1tuoOR{5sQ)&i_2KmmKd}zDu)l~X>&V1V`<8^M2 zw1lOk$5{d}GhO%QPp8}OSGgT4D=Kc9Y^7ZNhf7gBdDgOjA1io+KBSjvt=t_cK%RF< z_}78_v%79~KIle0m79gsb5?|g?Y|v3>)7Lm)}`eKJQ^u$&>i#C)0DF2Oxr2U%Cp8RZ7u~5t7fCNnVSIzxVl39+h zc*FaSMB1%mI4qccW7sV8>tY*DUfd%@LgRoM7M6~34-0>;bfai9b9FA3rN3BV{r~(R4BN@s)Ni`!K+<13>{$sFhl6wSlCkyNs55!2Km-m^ z8K5!-qK!egxzFL8ZHD3iS-m!GmqTSFZ58e$@pc=?hQv>V%iNwM$VkNtNnBr(flhQl zH_Po*e!4$OfW=UOqJW^wn0rkoT&5EVYuYj8`v$jW>@Ts$t95$?C{JOZ)5UJ{<@0NQ%O zyD8w!rj#NY2PY;rOH+HFl&sTpx!;lHnLL6z56slQnXn7u++lBSRZf?%-YrR~m)CAY zz%C%H%GiX}W?YW2zDA%Eu@c|dU=-6!X69)wYit7k) zjJG|!l?kT_6jKDWxgG7w3kMY(U)r#v>&*sGMeogvrmh#gSAf0=1=}ry?{q75MkYz#?3rQeqyuQ^1MLy+m+Nb+Oal&9e!GkkOCfKhu$1FfRl< z`~l1e1C$xJ483$9h0+7891j1Asn z0KA(MzTfd|9{}&&sCmv=+v3NyM}aXE;XlS|*OG15Uu87Zz?LnZ?FGYXYHDf+Y9}{% zzbnGm^lCTq>lih#Kb*DilWn(NJ%2G!w{7v9k*~Ej`}`+o?UrK0KgDuk1@|=+*gdQK zN;22odUlUl8FGD|T_60_Jkw>Him$gIq#Zu!Eor|{d!z(rnvZjX!YqoZJT38p?65pm z3?oifs>j}2n`f3q6)?H*eAbb53%Qz3tys16(t$Hpe*DxSa5mqS^BY zxSBC&ItPI^P)@40=w^l)336@Qz<^A!i@xyr`j&URFPS}Go>F{(w(wtLE#2>5veDpy zuU}qoY`OIs@tyKA`o_yYsF%$4u;$R#C~#Z&l~z{u)|CiJ-amx5ko(cElz19kU7=5oS^UShV8>gi@(ZP*xJW6T=2O zhAa-kw_daVv_br$f|3z0k0>4c=jc9oPPRG3JccdV20l2?^4{j%-%sy;cD&0&vmFh- z6g@Us+I-7hh}VtgEB(|^krE$DeYN6j=Z^Gf0KfRknn2vUMMVHbJ6&)u7O`o_HTO&i-QJ!SebhV3~(>d!osklBRs#>gUE+F(5GBXvAm;>Q+I0`ECdav46J=yg~Gv(=35@Q9gI4L4_RWZh6kFpapgU=Y9mw z<#KZMxqlrRoBQ}?t~wbpi-!%NKM&c!7{MoF>UN)Jp5T;n~Ae4-L|LA5H5untFcz$noEVqr%4%^3KEWDXr3Z=qPv9=oTEfV@o1!D+p&PhjtvX-e8SOK%*bS@7 zHA7sBsB;6aaHJsC2DJsgzPT_qzZM^JvdTbgj@7frzP->N?{<#_jUjEUiE!O(SkFyg zzdO%y^x{JC4vh7C=wP{w8K7(4D zfWEDnbZBay8nc>6ZhIy7rcpuVwf|9hug-F#-?GEF%pcI)6^{y!k@prisw6+l*ah&s zH2AQ*`eAbDdTAF|C8C8yeRFREvaaA@=sm-&zH#@<_C2~=S@K$r9--%1q1*_fOwsX< z$KsIV++B~Y!N9fgXNBIqTX#qB8qYTxJ-+N0xrse-(+ph|$=DnebnG@*C@HRy87;>? zS&gFazCOPV;vy6S2m|Yzr@Y_pKPS6V8|#c6&bQM)2RJsk8g^sF4xCQbO-t9!)f_j| zxK{87xUYL6PYQ>%e`%;W{uetXuJUm+X7GOijX-k0Hj-19t>mn`+44?PNnVcku66nD zCArz}Lu*}KzS95+=BGyR*=y#pIn>aLbq)V8pPwey8we235fgt$B*O{Vn$-vv6&bZk zGGZ67pCcLN`n7+Nvd?F)@6=2q&$R!0HG=zW?EAV;{9;$#{7el%dmq_F?)R0gbP#R<(NxL{M=8*xYX`$= zQaEUom_VG)l|))G&_#pjjs-g7=$lih6Q^!fhZSAKK%g{wm7{RfAc+taKDtDeYtLgt z9Tn_|u43F#5`&&m2#KyEWF7hX1-!8*+fpLYSzBD~AUa)f9L17%FyX?64Y}&PL-`?1I=FX8le@YZe)M(1fi<|O8T2?Amt60OO4$aRiSg~ZIo-LJ@ zXE?TQyY7k`l&&1Ra`5U6{g`Ov|BZqro+%6*v7A$j8*^0u*YR45maPer!x7D-dx|R1 zL{o?%hXR2}B0Vk{N;Q>q!>vLKFJ$Q>-Z12_Lkua5X~X?~J4`s0iVN_#Z`EELhdOR(Q>Z4x4@HYyzMB`U1R9vLV;ok23!N6mT<542%w; z1WRM^G>R<3XhM)YB(qG|wDH88VYJZ(8h&Ugf}cgSFb5l2%rU1;XohjqOh5n3aLnCK z@(rlqiaHUq6sMdx6YPR8nLR1Q1sdgE>(@1)~Vyt*K{E3Y7tds4r^jEwIvCGFd< zFDUWjZ>uQ-9I&S=133`6|IrjQO`BMM!JVAWEA3;yV(!K@`&D5u%#ZsHa}!pu|)sHMy57jxM9J zR&+E0Iae)7^U=$~fECjtZ*T6FiXC*;g3fmq*+I@dkWIqcqM<1wPMnu66Wo-{$&FBS z$X#eI6N$4%<4Jo8rCpHWRZ9~>WVQFzi>X)s-V-|Dud>Ode+za-^I6NDibH|0r3PRF*%}+nR;wi+Q0(Mk!gI=nR6I zB&V51-9k2o;RjFCwQ2pGkF*gtb=ze--6S+wKS~~Hh;l@ikU1fybbeqr2>IhbLJAZ| zh##w`TnKRl6kYn|q?nLg_Xv5;9Qo`T=B*jNcv7b)#QJ_?A!ar1-zgoPT)>Y-o6yj4 z27F3{2S1lkLe7OQ=qEnpbfbKwdk6C5p$z?9FJ!`_1R-+aJWj-dM#oD}H^9e5k2`4qJr1R2vR~8Jm)#Wf7G)c{Y0mcVWi1)g1TK0g*Zea z4$5XNVH4|Q|7Q-_HPMMqREIhSLJ(<0;~Uq2#uAC~4tTtS8BBZ!G?=K4ZVZGQ)W{+{ z)WHoimQfntSRp*%p$%#*F^y{+$T!3&J1M>q8d-b?I@oANg1~Vcvcm@L5(r2(L;MLc%0c(J72IZnw9EOPObR{Uix2ht5TvT}-U4!%wVm7t8 z&28qcB=4vuH^nK=(Fsc<+Mq@4yg5#Gw$q&!TIW0EIZv9zlb-j)XFk6PL_k5ZO=^0_ znhXMs|8ca5bdb!3M}`qb*lA;nkfaSXIth(-3?m)TKpsZh@r;iE6rv722SlOKLEg#c zp9{sPLHY4WFP3f?V{ubHAo<7EEfk`~vZp?Ex>I`Qv_kTL1}%m`3~Jnh7JK>zHHa|` zQrxK=@9;!W`N5}G1XUY+ifTz?a}845f*DFB1yZ50)J%9n8){nWHE!`HXn2Ad)!frj zl?NMh(Bi0T^29LsbX91)q7Y&n>n)(M2!8B|6wFwYU@IY2obr>WkA-Yc9qXs8Vig*< zu;@2vaf@r16@F%QlU{`iNzn?GHisPsEvVrMYUuSHk4$Y?14;{KnDtGmwd++yJJ;8w z|2C*?-P4)^It*CkHGxLG#UkEeC!zX6O{pEmS{sYa$X3_7;`C{S#F(d2Ca`p8%@gUc zVY4tE4{G7fVnp$zjf*_a&@$2%J~C6K=1ZCyh{Lc1eo@x9Ak zp0RQ#I&_Q|WQ#MLbvJsKg#lo5g25BLv4#v_zyysjV-ak)#v;tI2RH)?O-FrnpG3k4004kn z{O|=8?yv}L?12qcs9l+&N@_OjA=UYmGo1}mP-c*1mn|WMC+4VWSqF-`_)&*3BIAid zXk!u8+yk%uw9sQiV-IcWA=@6|h2!vp6r{LDvWHQLCKJmOpp7a?)KP^WATYYl*2Xt< z?X5}kX|S)xXRKxY=r)^y4VfSX7-*qyD%@fZZeDVm{cH|46oM97=rik}L4{IMVG*}r z!?kZwh(eG;3t8^<5#f!`9cJ9)#F96ieX)o=jJgnaV1uExun2>LK?|cM|9Pv;+UlMa zf(>#!c$+F=^GEMt4`8?jF{m)+k4Np-MMrwlXA|-{tLcx>KqETq`bT15Hl@%2LnYGj z4J}wywS6)wKioS?3?CIww74MBnXYuUw_PM_cRNSqoA$V`1nzamd(rQncfN;fvV8}9 z-uE7O!kc99g-5(T51)9(YrOG~*ZbcgKY7+jp7NLH>EbcZcg=6!^Qi0m=iMH9(U+cB z@^BFsO~3k_;K}u`hkfj2KYQBO-uAc0eeQL?d*1in_rC{z@P$8o;ujzG>DWj*jK6&5 zH{bcshko>%pN?Ry-ulK_P5{t?}vZ< zE8_6KG%qD&U72pn^R}f@f=rMc@D`NI{D- zC{I`cFz_g@TLgw9Ej3wzA4medGO}6=LG05Fb8tbz`lEmnqaF&HB+!N=u#+%SK_V*x zZ72e58-^7mv6NbB<7=}0z#Z0ULLJUO~N zLq^Uv+M7Tnyhinrz;1<~NE^O!%+NptI|9HVg@`!2zsFY%px(YA&i5*A+ zFqr&2RNMifN~Awx#H(5ag*>mi3L|U?C^i_V>o@|{vfx*H;N{mV# z6#S<=sWhjw4R1;>m4F=(q{}3<%Z+ml1>8%VA-%wK%E2T|cQVYwG{wYJOzbki#)Qm$ zI=aa0HO8b&0<_G_9HPwBOzz{%&a|D+1WhG;%+bs|14O4`AS^aJvokYIfE3NwgfRnD zK`p2OZNNz_pn_K8t~v9|ZwV2@>ktj$2YN70dN39+^0nWT&3js>pIO0!!%3WUwNlau z*^$g^8VT&o&bLdoR|8MsG@bAKPVv-E@9fUE|1;0+{3h~j&-Cnw@SH3*@WtJ9ODZd+ znc}V3Y)%C$P53#hCo+irGAHwHPUqCP4BVd5={CSrPa`$a5M7B8eb5$lQJ7d!7#&U-H99M;JQOX> zrQ^~cebA1A8gLS_LvvC=5f^B1LBJ9&O>?uANC!crk()XqH%kH{8!3ZOO`<~yU8IvO z+XHi8hJb<^Q`>{%$)YtuwLLpFNcx66|7k0)3=v8DN0r(LVvnBK%a< zYqOW!PAaHV-6DmnI;*pC6H+JyPpE=wLX(2iqr%bxFiM_<`M2$dvfTC8z=_NP=$+#1$w6epmue;MH{n1A^QEc({W; zTmm9of|A9HA!lD+__}inLyRArNb!Q(rpb} z?6uYzjSYvoOJ{|ND>?^k|A3mHGA+rh9jK{MPjEE^OP=e^jeldpKVmaXW1=JosGq5( zZ#y&EeVXy=*x0Ef0z0##eAUAC>jFYNTLC9rrOsi zTQZG}A|7I_J<*paA$~Xq+DU^I{Ksp0wYqHyHPOKB3|k?_5CXg6lCWZ{O`UZbtU(i+ ze>>OXam*#oUhd^uH-^xc*oJF}hYsS0G~ifeWz!F(F#|kCWGS^J+f7p26Y?rQFd9EZ z7QZu1WcX9$@OxzN|BK`&n&c*`eJ_H6rrO+F$;Vu6<*$6-;UMR-HIf!7OFFOJ)~! zq6a-rdXS@OmZNAEmSvt0Y;I2hWoB+ZW+mPTUKVCHZV4`)WpcjO@BQI%2F`8$W?F_U zxD#h|_BCKGXBB1VBhF|4bmytvT6lgZd0uCF7GrGYvb`1}8=otOyl8ESnp6H5}Xp7Ehj&9I>z7Ql1=_@^Fn%FXo`Y~fe zp1dN~Z;R=f|JX8X;*&u0kaAdtcHjqa2xHr^hi6#MnHXtsE@^`{X(L`~jhYHhY zG$3k?fIt`pPpD}q1umVuJ_&OsXp%;0eWq$6#_9@j>76z@aXB+AOXJ!Y25#YMesImg zqO=ikmff6UGYPcHMZ=5Z5PeVtQ&cxiYr&edFzUsyn?s`7kbUtpY&gu|VO)Bt&A~5Wi=%FL?%7iRSq_L|(J2?3LlY}%j zTBy-X|KkvPVC`jC2176fzs_H6dIjTYt8gn*5BxXk&dq8m)IxsdMqXu8?r#lAWB^Y; z1{Oa9Uu5$m@cIMHMP6`APGwLgKLiJG3YX;fd+;X8aO}KfRL*b&+Ue6FI4ana>b?m` zQc73F6F#xzC;Sr?Zyhz6=L%^DaL5OKu!o({N^P14j^GpaJ&E(ut37Fx{d(&;lo?DGE;sIu*79B+3FPeOi)QmQuX8$w^XZavG5-@X?{g+U^P2dEwY~FA z|1EPrFYY9!@|PZT9HVr+HgplR^Gq*L=U$1>D5dc=Kt5;aVgB<+k5WOu^h5Xb0rkx) zKlPXhjdNHkWHt3v-||^^Y)fx-Ap)0$%T&EuO}nxy-kEXMi}c+H+gzXYy3F&2{&mEh ztRz4HrO9ld#LdCwO-*g)HV5?FK;mx?_i|TtPkztw?DT0R_v}=dF6g~H1}wj&uHE-hY@HNm9Y6ZuJ~nV?44)%p3ixM`1zAIcYIG!lPCJ)-Vj>Y zmM~uWg>L#pe|m`5-myPuw8!(Q-}-I=7q9onln8sXNA;k0`lz@1I>-6iNcgqa`nJan za9IR`RQgS4dp);%vJYlSZ~3c-_H~zbz{m7oJ9;xL{EA!ID1Bi3+>GCDam@;S5tZ8$mNs}Jmtyr<6 zBrQ*SXzeMwXpg6k*j(y7*_5R`b2oQRtt!*xw_(si%2WB2<~MB6wteiH@+(NRWjmfD zrp@X~Y{ZDcWm>W>-n@GE^6l&QWzLYaI4laOc56$uR9zAzcCD)7mh}G8jJ&X_Jh5gw zZg%QbWoODA9S{4AH?Zi`s#mja4f!reHY2pSM9k8%Wsn4+*$xde(>G|>{3fT|+*azy z;52=wHH}hUJZxlBzteWkIb77jw{!3Aov(I}i$)Y~X&dA=Xib5?JojyFWt-=afB$%{ ztGrm(Zoy=36?bv+TyqUE?7>AGN(KT3TYU{W_#lMI@l!$*6DAcokXg-3{p;)pA<=;4bezUU&0G=nrW&@CX@jI03rDV1quNC z04x9i004jjRsn|@L|7Wb11w2cHFB&qdb>Dyv_X5cM0ln}WOznql1YZVP*GD?X?0h7 zp;%>}ScR)uTV7duj#_2MTV%Ogl*M0keqn@@WMyb&iLGUdnQCU6YJQ(p?igS*ebaZxgy~}u;s(PccdxVO6 zhnIVdrhI&Ue3G4iO+9~MSbt}4fQ!O|j+calg@vKKg|gCylc|WGtcawuh_1bfnxl)0 zjEs?%kN(!wxqPjrNYprrmCjh=BI^!r=V`A zot&tx=BeH3s+5kZ+VrcmzpJ~$tI6D~tgNiT%&f-LtmEyivbC+!@2%YCuCB4Jv#GDA zqOYu)v1VGa(Co6u)w1XFv#oTqv$V6*;IrK2v*6~my~MQ4+qB{9wL1y5tgN-VzO}rs zwbb;swz{^&%(mFxy4mBqySux})Vs~xyVl*i>hrto`@G)ly{4nRzrwx6y1ryo!r<-0 zzQM!I)WnE;#KgqJ%F4vj+{D)7#M$7)==8+#{l%S>#m36UtER@`{KoJ7$Gy4Aw6e;@ z#LCac%G%+|@BYj2|I7IQ%*@Tq)7;GA=FQO4&Dj6V;q1-k^3KuC($me;&dt-))YI4h z)8XaQF(R?_1p9P+}`2b;^p1Z%iY%1-r?Qh+Qj6kk>uC8*n0s=JEFF=jrO=&Fkmo>+kvO?CtFI`|SSz?eg^Q?(*-#z3=(-@z&Av@A35X_4M`o z^!oAj^6mBe{r2k5_vGOB?d&dLi`!t0)3)=WwoKa2oqKo_R=IuUnrZu4v#QmrShH%~ z%C)P*Re+c++qNtbpsA~XmCLkj*D79}%<)>K4d=mlU0}gdlW7|-r?8d*gLbeSAYh3S z?SchtTPI%T0vFV|EX}fVtGslAHK(1|&!9t#9!7=?DmF7^)CyOlD2)9`mtEtfi75lBy1tsnn z#n@^>T9of1S{;Y!8$_APeRtJ?6O?ZDp9h`x|D1@=0sw^0N7?*K(^d=>+QGR zCg4CPg+^=cx#-qP?G^nko-@9-EUKmR4D*V9$?MCgKbkNEU!Cdjo z?Zs10Jl~W9Og!$GIM7ed4g`%a!Nn{yLCGYO?9pR(;}gXM@f;Dx?$TR;0v}L7fdcwI zKtvWh3~+$hRZt){wg-%Tzy||V{Vu~^_{&TtiNFE~CqFktPA=s1|Gfz#?c~x9HiBc5 zbTZQ@o%BBBFw%D}*c6CO-+dF_PBMn`@yg@aOtU%7prgl3Vx8~>NG85KN{}qD$nr{- z=$PnoLD(>|PvD$u;aM_QY{K{}Z0y~4%b1G^&4rnS70)irT&YdYJSEaeGrTMVh&jMq z=}UA4Q62BqA7EVt*9Sb1MFUx2K*SCqm=XdJA?!fJ13P3v!4_3~;5OW$GP6rFnK*|m zmcpccBqMb%yFw8d!3H+`jSWR$gBJL}h%0E04;XBq7W!5M3SMD?ub`k78psAl@Ieck zkl-eAQ9^$3qX@|eoeV*vQUuXjr5}}Q4oY4`EFoGkF z0|hVSXBh|aUdOhTwErzCsJRSRpookU>VwvUUnIVKPvd3`Tg7 z9Bg1=2xmx4&@4j@``HhI;&YdQoFfzaKu0$~xsPs8B8CT1Wjjtu#on=DAe->rK1%7r z5i&vxs?>s*w6O|gqHI6qF@l2j(G2OeK@C)B1cnl^|B5tFlOTG0R{os7Ot!QkTlqraJYhP>rfor%KhT zTJ@?}eQGkcpUcG(lcBj>@WGUTW5hpM zbdI}0LmSK(ol}U`BpW4yM~$e9HWJ|rXpEw07b}?C1p0x>QovmWcmUfzK)>*X&ukwc z0@ijw&;ooQUX?TlLEOO!y$t9j$;ib+=!(r^|JqhGq;gi!s`(7=iDVO54X$v9%hZ4h z^lI{ITgSA;v3g-kWT@RJ)NV^%n(4N>7Kv=ezK5^LDhy$jjK^-VOWukBt-Kdm7j!$; z-Fty7UwdRPz4#|y^x8LKKbh`*6+*2;9H43;3$TC(TrUHpjR9@ghdJEQjs`pU!4GCI zgeOel3S0QX7|yVUH_YJG|IKh_GD2XsC)n6|8|An&p3A}KKKuF4fX;KD zedZ8*^sF6(j?j}6z33+w#L@eWw50#k<%zTm!sK}H@G?C-2WQ&Tm;UtZCQa&6gDxJv zB}jus(hmKa`qi)wRE>O*iPn8d)lAC>I-pkOpY2H}<%p82V@>R0t0*27S_U(GF^cZ2 znsFyN2|8TH=}Sjwmxu`G;zT`=T~B6D``Ay6*s_*g>;n*hSVbl}v5O<2I@iXIx4cP{ ziMc6;XqLS6KENSCJ}i(AY(NJ#z&HgL$|7~aV`~Iu%T{sj;~Z3pM_FpL4LfEM3XW() z7gn*4E<7ST$I&_A4n_M&?|6N8V%&`iRulgAPzk(7n_zK=>L9d9&MQ|v%3C+ns zw&Vz>kjN47QCNW}nb-~>W|M}^z(R<`NenF3n1~LY{OVZeN;g*ijc(wrAkSvQ6{dMP zz7cV9_IO3)raX#dki#C`IEiPTO>~2NNfz;71}w}{may(4dpIGIFDNmztQ-FDRZ;nX z`1I`Jb)@cykG$m9qpAkWc-WKAyym;&4$67{^PmqsIi?-@&71!8q%m=$C5-ykyZ-gC zkG2{`R=fz3z9<``-J0-tkDW@P|))3_rT~$WMNUkFWgZJOBC6w=nagPyOm! zU&9favG%u*)t_ljxchM7cqea<^Sj^u>F39?gaq%`d&Y$^dB6Vm z&;R}t_x|#yEcB;)0LVl+M^fLk2|;H|xARgmqjq4|K7vxAc%V$Xb(X!2TA}9D;Ae;hF=`9ZGKMFDd;@lxGZ2Jh5qyA(uK0_aj0fRw zk$44*cm+8C1`AXKaA-pNFowA#jnXKOM_7O4m5$vwkXZ!{9k2orpiU972_1kCh_C__ zF$W9K0T2KN2eCz6A&}sAI~+z6>}U{tkOMj3gFzqzBbf_DunE$bG&wLrMevd)DMdw~ z1wS~F+8BQX|Cy67#s&~z56RFOY>)#};0}y11vwx=Igm6m7X;JPkee`)Lc$0TxkPRl zMzYY7T7V9tkOM^kj#@B@oUj1CFiSa5a|>_*(C`XeSzA@1kut`SBnA^7NjnM{TkY@) z(@-F4M-H#BJ7H8)d^tJHSUfo(Td(GpI+>VG^$Z6&1=H3$7r+Qg&;fj~05li`o3H?k zkOMWi0?81WGJsS2zy}aH5Gycq5b&8`palz%3<)_0;-m#GxDPVG2cytH7k~|4*bXHm zk~ryqzxjP|iDKu_4(mq}b14$!SZau=n9eDPd?^Df&<#o;1Q4Kw>U06?^&DUB!^RZfx)SL z!>M8L0AebUoVC}S&$*yP1qL#J4O-9vJo%Y?K#J`E0l-w23-Ah8umTJz3w%gH1HlLv zU<}644HEha3jm%Cv;fb*2C^WXS+oMaa0Tpn0VuQp?GT1#$VLBYfdLw0!PjB%P^3j_ zpe2Ezw5Om9+N9(lhaI4HCRu}0)DAh&IK2Y_InV*QU<~J}1uL)up!5m{8Kt=prhKpu zYH6d`Fa;|h17yXJ^C?@T>4xs`p-NzqN)V*_$EU+JpbuuG_b{l0dJpw*sEAq*g?bN0 z|7v_Ap`^3Nq)pnS(84r~(2y_l5K2Ik7ch4bL4O_Sr!v-HMM|jkAP=Y-4%V=$tlFy9 z5DuuSsPKRfjv5k>DtnSTsk*9E(_lLmu}fNz3e@FLGZcC`{X10gtVIS?UBvP`S11Y4}|aInm}u<&{f_yDuwa1SxN zu17jyIBT*Afeu8I3%S4~19EUJ<3ob739s-97dU`T8@F=HL{B?hQERBnDh>=g5Lc@a z$pWv^Y7OFmu{WC${R$0);|sX}4F{A9&(K(Va}MMnxc~_#Z*>)LJGYw4v~`g^-gX0<4&|vPsv+WQZ=ck&2C*AV zuq!z+#8Q{DK?9*Q26Pggvk&ORz{yx3EQK_grZj`Yz?Ty_wsVV&vr8X54eHcWYFY%B zBf;44ROLHW_>d3uAP-{D1oJQx`Y;W2APvkbzpZ|`Z71W3kbP`kaRzVfUE_6aSXF@c2I}-#$ zVmF4WL`C`NO(+xuE$mb;998&05A-k(O+W+0KoiGX33Tua73jG?|7?4(SQA2wRVD>Y zzgUESR~5tgP!Bac4`+}HILryZkPU}S zVaFLWi#!kv_Q=23$Q=Q;!;C~e2@NM9TkfEC=&)1W5IKqL%}qtbX-YxBqdVgi#|i{I zy^~U`)Ij^YMLvj+7!(AaaY9}cR4(N?s}xieq*rY_MKSbBQbdz4Uv009D)k5D+HA_izSHa1Z++4h|=mF_gpZ{|mnm=ELI5$o2aXEQOc3 z;8JquJBDKnm~$RUBMX~A3E1!olrWeR0nbI1X#^qFQvGaGt)6o?YFe$HFY~>sHap<> zu#6zW*?ZND$R44(viB;9x;Kd6ibO?Krw_3 z&#*VEoD9!kiL$^ql%RHOxnU3i)lK-$<;T`cCBykJywb20@Tv-ia1K~Czpe+)8i6^J zBbWxn%}R3;roERJ44BVCX#3y}+n@`e&97v-(5}cV+0JR%OXbJwPy?sn z74J|9rx3p=t=G89*IH4zcE`=L-~~4@0ottr9gq%p|M1=4tqG*C4y1d(WunK*ELAZa zyiIThpP>)uKnF@=RifQ`&>M`(PzDm<0NUN(8ejwIULUeV8==iq+kPm`x!d?X}J5TBL2M6 z-5$zt1QIX-5^&=p;}JLx3h#xO_Rauz!a3pd=La9 z1aLDMLz?qV>bXEFd2_GyL9T9uEEGeT{7oSqRS(w3E4>7y5#RlL(-2|kr?<2is0-QM z=#4%Bj}GbLeg{~f3G0y81QENpbJ{uO84_G=vork78FH|BRTXQLJRcMv?Q9rq&ssLiDIW$QDi~9 zNw!63Qscy-EwfY$PE`01!|6~1=S~`)|4rylh3%%N?fw@JhrsCG-rp180Nm}};632t zF5p;% zA*Aw!?qKV!31Uzh`XCPOi`Uwm-bA%Uz!c$`hx7aw4~y>YH?G|d0Q5Xy1zg|_q96*I z0NzF4GEO`JF1{SqgRPPUW$+L^2wBv}zYS8@!^ z+0^M%s8OX(rCQbM%%MTGZsmArf&{Q(Cpd7hVU#tDcu1rPpc5@b8X?eNi?*M!(r$dUKytEB2(V#H6g@~fE(=}|V4MUN(3+Vs@T zgjH{h7tdL#2?@lG)sSag|5SZy@3e)x+p*!*!L{aXhfOlJy!(>NTwW9TO>)nj1K)^{ zdeG}27pH3i@AP+@(+r(Exf%R<^y$@GO)Xq_JafH%JehT4!dJ39v{{`e3hrAhnwTd$ z_X?ya8FJc5#yD(V35}eEa)FSKeUh1`LWYvjOF}+g>Wdr@bIC;uY}iO1fPKt72!$>W(c;$*c z31UPGKD5}xPc5$4|D=dy7*UiBMmB+zphEeubdw;kL5f0hjM{Y2D~4iY#Z54c^vFoB zV8qf~UI`)>M;Fbd!#x*e<4_Z0QZ*S%Z!My^y9mq(vnS`7>r2w~(T5XGFw3kd^N^Kx zTAbXZRxe@k)QX!oLO{aI9}ZbV11ls`RunnilIt;T4csKDBM)VSoY1DRw4Gbu)dEsR z_Sth^n2v<0&nr4~u$_wZVgp}%Rb?YDSs8hS5q^2)gAF!VePt7TjeHnm2vx;~k5~LG zav?4Dx%ic;!t@B9eCSE1270cIOds)_-Rq`kv2w?q#C`@^Xrh6}jA)&cR(ffsn|AtX zsH4`|B5GZ3|Mw*LkYT}0aDNDd7qrZ!M-(h}GaCyr=(*ZGj18Sep*|mEgb^E)@e|{T z+quHXK_w1NWr|C+dsZ66-&lujH6Ya3?cG_P99k@2-Q6wITDV7bQ@xI7#LKXHq z%$Bh7|3DB1M}HyYh&dqfzuzSyJ@?Q=0Cs~g<`TzwaWHF0f$i_R~p%1Aktu@$^i9S>! zh9wZ9hEN0vRxl_U8fphIH%x~O@bMkJNkNb3&$EKqAa`N_#BOCRXLhdsQ(NlaqoDGQ3p#GV2oa*jp?BWHd0xgjIoF!5zzvy z_%M`K?I{^K*u;Sxg23rdK|ax%q=Q1D6B5YRnNGlggP z!WVYY)M?%!j%ap+kUu2~N6^s?SbS5dvXF%@WYLXt0HYi4Bx_mCdRDX+O?zDeYDjiD z&(Y8$6>E$kMX#WzQPt`dMNrf}^aU%slA}+_pv0kcnu|H)Ko)$+1x3&?SQ2fN{|!Zu z7$x>4STOWx6d~Qm6;@!JIf#xDb3+P=`Z7{12w`tmP(pH=YMN=Nf)jL@QDRifv#M@Hk-$I)FrEQP z?`p#r-+jh1AUW2wrdPe|E$dpjLp%uKa2#Y)~v2D!S|@ zd@+X-fq@OLV#8v!@C=ag!8n9M%G@p{Q_&Sc7JmbSFPe+7Rq;Uy1)GCC_JrE;aWom5 zUFZ}dMKV|cYG5mx8#QZ~7<@cQ6jM44I&x5mfhF#_PBla}oORvj8PX%>|Ge)L~r3gmx63r%P}nuIZk8@XmqF@5$T3Z3!Qfb49L0~uy^mZ3p&faH$xY2%9A6liwc}p%|GbL8vTkHAA?`Rx zbP%MWnb2bi;^210YnN=rWEwo=P=XSQpoNNzx-{x2@>DIYYKxrH;vjT&P^709ij0mQ zw!RpN9)&1AP>iF>xho=Q^(Q4T;#U=7k)bH$3yLn59EH-;Cgw1OB5cCNlG4yZH!+Gi zFaqj6FD*?ZPVtq89Zwi=Uwl5=cBg+ z^K!ou#Gc)52U3FIAi;htUzt+Qs4O+HO%!Yte;e7XO0-d&%2cL&um>M#3Whu%sievA zqdRIo2WS*w!TpN(#JT;fDaXEkHwNyLNMTIbL&fcI$2L{x|DJo`2jBObY>q*2o#lRU zE(k>!5ug-;4Slzx8;pPkrKeywEy#jyeYt|&?%J0`B?Amf2sAk;fuku7Q9Wcs36hZ5MJPkO%Xc~{WOR{b&Kn7$$`05D2BM66x z2?$XLh{%P_X%&Rv16eQzfsh4(5D~6w6%Bj^S;&PG6bKUxL2?5@5)_dSEI|`QL2?Vh z5cIktus>G2n8O2<5Th8!@xRrmAt<>ABdmvXz=9oWz?#UJ*Eu34jKV2yF^nUR(1&!0fy=vEKtlTtv1`#0Wji#n=fV zRSZVKC_{O0L|2RgEXapCgeEl@q~04oUyMfdz(bAbMQL;%Va!IZh@gC^2TO3pNTh*v z@P<>kqXs;OX?O=)s02Bj!&{U_cpMFC^u&0iyS&gwe8j|$P!>&iMMrLhy=xntVoxv#u_psP2k9T7^P@*FS^UbBFKSOdl9fcsJ$%TEc)57+Dqr{o zUoc6i7@wvH%F}4cmz>I=+C{3YrhN#4<-39_2!bn+fgG5E75Fuwj7Orhh?hGDIA9iL zNgQ(M7m0Wgd}}OyMi#FvjlBJWB41=*!!K;I~tHenUsr*ZqJj<8F${i`Z zj50GbYfOf8&0C5dO7I0r;DmEv8NG-)|B&MhL-7-V_)L?Kl%&8IHN%(^0Te&Ef{#nh zX(R`GV9l$1%+}0A3bf6}#7&{lO*jAqS=a|za1(mLw?R1+2YD2j$e3Gc2Xv#DoO=m2 z;4MhWn07ck8Gty|v`*|4Ozo^ltn^L;1<#jjhqdeiO4tR=gb8ubi@tb;1X+j*i3t%A zHN8NH%=n(Xunq>HlD@dk0Nu_K4T%EP3troY6-_nGh`qhM%>f0xZt#U}Actvy$^snG z6D80ArN|ULj~&So9bJ!Hz!4&8NCYiXknGDI#YgZ2QtmvD+Uz%+M3#i)2mMphA7xTE z47VSBQcQ}{d<@d>K#-W&5r$Y(|2Az?hKLR~jZ-4W8m}n6h4Gb{FM*tO5Z6s4D zol@{XQ&BsSy*pIQfDoA=OUDchdq}uAg;a)+RBWJBY=8!az*IMd22P#R^I8UA;Dulq zRZ=BYP)&w#paxZ4)m4p#XpjaRq0?vRJDO-w<^WUGLI)HfBS7`jO$yUMeMj}!Hx#kc z_bCXN2v)#w2XuIbWH5#vQYsPgg&gsPTu>@&J&4_;gi-J+Mvw(gc!f~_!Ewb_X*E}+ zf`w7YDn#Ic7`Op=jn^B9ff&Gn95942$X9*c*D(mlZ?#qsG}mO1Dw${`>3ar-kWh3; z*nOid!a|ILAS{Sjh~x9s|NZIJY&26m3c)LtmIgUel#EiKK?e{4k@GUXSHRY8$c1q& zgiW9XN~lpr7=@XYH?ER}t2!^8Juhf@25r!WZCHjtxB(uJ*LdZDARvZ4*n=@x+NI6c zGq8hGK#=ny2WNFwO(j^EFosJJS3PToIWPzc)xTUohh%7^nau@6$c5=c5W2Kj{J~gZ z)K~)zSztAqb}(3U*aTVF1VrFXMsNqELWgmMhEX5~ci<|edImnAR#|X|bGWKX|GI0B<3+9a?Brw!dbFa&B4hs0X+~Gg%uPC zY|uU&f!m7();|^0|GE{*UbTmxk)3wv+g!kegW#AQdD&+;h?O<4XK+@U1zEgBr0X3T z>~)9M$XrM80?y?DA^2R;Jq2qB2YAqjpgJ|7LA6>XpCly*l0^%9um@dLj*{fv2J+pE z1zsV2qoHt~?3tc~ZB#Kykm^DU`9<7BZ3lZm44|pSt%wJA(1vBm5pjryX}AV)fCqDg z3Dt6664hUAdVI*d`BnC`jT@OiNRBFkQcbOPQpi5da;3dvtvD0By#BAG`@%y@y{x~iRYMxC8?!5MB(7g(>WewEUROS z$Q2S9w}&7HMFtTCxh+?6oCZONT)3;Z1QE?S&S3@QKrUlK{$waJ+TP8_s z&ShNP3oMek`5)I}`r@#^j2b4uEr&qk6{%=s*# z$f345pXZok%`rp{Aqj0xIfsx$%~>Z=DxKcGKG*gAA6`GauKRi4k4JZ<S$*^#M7fd%bG`IZOEzk-+r; z(@f^Te3R1+aA5JMO<~ykd}3g!RHXv@cvknD(wXT@5^`W)qV$3viu7-*FHPH zuekNT(1gH&yK?_lP(w~o5;}h?r1bbxJxZ`aRj^hz z^wq7muLYE{zXC00 zwq$NJj1Ni*v2ss%C9*H`U9#)A18O7W=dc%c^P!jzOvq!AtCbNx^&b>=*k53lH zlh3^%u@kCwS32Y;!q7 zN4b!VBafLf!#+!~qeVfmN9eW|G?B=|A8Gv4)%X>eZT70s)o(mlBL`&GpDhckbUjE3 zSstr6-CohKnJ5eR5nZM5>~n)1wK;)5`QPZz{Pf-%%H-tl6NBYEmw+>=?*}iTbT?_( zQ4-GuXP%r71^MlVCu8ylPXt;nv;T~@+8I~l2}Od)P=unk-m`0kY));nz2rU>PWMCl ztSo<`N=5>KTR*KAP~)7$TG-~RguZ{|F|KuiM0~yi77Opi(_`qf4cklPEg6|?D!v98 zZE`m~KV6coD_y=mpNHg?925KSOKj^&Y#TDJT{NykIquPgxK7)+E|0kGt8tHS$MxLv zug!_;ZH>#N5T3sHlN1OG0j-1{$I(vy-0Lci`Sj=61s2-L>w9M&WbKH2oQ)fMR#(5w z5?yzB@>#qHjdWCOGVv__MeAi@3Ug0#+LPS)(&F_9#_4Swn4JdXCp?W&U=?*rSkWS_ zq>}hzSbD5EPHwIUyxjd7c!P;Ug_I=&QBf#A#R;9U8^kL`+^v!R>UZ$hqBmu2v( z4tSZqKx@XoGLkCX&h&epuv4M;3#3|CrfiT}R#=iRWgjp_H8Z-YHaDWP_G5i0rC{D9 z&hcm7%cU_(p$0zn?i%SCaf8#rN|&tQq2lUeF4@r{%f>U${=Xrw%oqsB6YO)SPD&q^ zvN)j;^U_qd#`2{v){o1xYz(IgU3mEEmwG@V$+SQz)J0h*WV~K-vux@MW5QV>r145z zHX9H222<%EgU8biz8T6T2IY>}>I&-m#T{~KgfA&u(Wk)(x)qAbPi*3uny%UIIz7#i zL*0R5O$|^ z@d~pJHwsVkvfB@%=swCFGxm)%acdl;vD;RU_vlbGQ}M=qbfVJyVCK2|uVZT5+fk#L zNQvV;aimzXrbM3c{-Y_BL`d6d>H-m~&9h74MHV^iCyEz4dkK_rDTSb(-*Khpog~9d zN&@Ryvp9+;!v~#cu!@$>!3mX_E!?DPpG1cREJ^a>6$9lhKxuhD&3sptC@vw zStwJdiqPq1Y^8>>n8s)QnZ75At8X@3Cix;nT3S?gF!AB^xIh227$mlbb@CC%hhsX4 z^8ZEaN&6g*-U^_iSOqT}a2&FgV7><%-aOFr9~}ybpNeh@N?f=HFTF@-#=I;vWg8RD z2u3TuZ1h)GW~j-Yuej>N&Louyey1PSIcp*Fow+i3%URf~bI$A;pw7qoF~xXcXd$CP z{H_LBR^REWQ8GYF)!~!))tBZ!G}Zdls#jRkzfI|P`k=#Buc=#{JYEamP1xVCdHEQ? z*+yj1qk6b_Y7dKXTsiYT&GZLvF1$pHvkS*`+hI0QeI2V?{szJsPrTrpJ>xy%yfVhw zf#9Yxgp=OeE9aP;dxJ2veKQ7>ia9-@1`ILDINiaeu_lXdjc^AakQ+)KGpi?&dFBjV zl1g?U><~=co1r3ckvZu5q+BTz0>E*`pAyzd2XzRtyq-7&nb2%qEaQfu4#m&@R<(z< z^awTm_X+4`4jRKDFAGj1O z9lD`gG^*`qz>m)rYcw>|i^(H%Q^UoXJ^(rQdpcI0D4d|)(14;*V@mE6G_#~vnnp9o z(wRI6HCNy{I^8Kc9t}dcYO>A=dMe7>d`7j?ocWAFN!+z0u^%$Ug8N#US|#GFApx5! zd;WbWUDeY4KG!pU9xI*~R8vl9me&9F>p4yhe~)O+BJQ5Y7P94a`m3vbV}(k$$@{>e zn?@>)jU;)_4M!ga(78G{vAYFW!qqg~)8pvOw-NzMAsLi&rZNo5ESg zs{QkW5u8BKzi6`!zFxj4c-pi5&uF7^QrLvAjcHoX36N{Q`4$t?-UNLzFYFs(YcQZ= zA}4&cVh2CSvyVbx1(HGyD+=sh!fgK=kGLCqG9=CMPx94RiMQ}>_?p|dpxT(i8et|7 z`~us1+h>%THpjr{IFwY@pJWU--(P#-yLhs?^E${)e944TXE&EVUo*ok>uguZiiVK5 zWV2KKtZ_=kPZW@=07KM*D<&NcW-^PP?YlVC5JgHBi^fVN9-m5^_+N$_Qydh9Z{EFNosgsJw0Ik0hW z38qN%dQRc_5iK9im`H2r2t?!8y%v&!_T%%W^T13j_YMfJ;MLjOK2a5KWQJjbLeDy+ z#6{$2Z*RUYaX;z5bnSBtv!*6#*;>MoIrrv~M&17J^(>ViD>DFjo z7qGD&Qqw43@0KMKxt<=tfxNYCxOl5}2$d$$bs+d#C zDu2{>L;M*8Zih27(hev1OnuMGLOj@Szx5`d?wMMZvQ1uPbAOn%b;@}@U2;?UV3p%D zTzdBAP3yX!j_jg^Xyt5oI5dlR*+{fk*c3bE4n~0KACl*R(p0Wn9EKRJWle8;5;6<_ zS|wvRdOGH1URSDg2XoeH^Ns6lgVj2hd!e_LLLEdZfSGJZv8k+8`LN&Alv1uYPJV@p zs=Dnk<0`q*m7voTEn8^}1-of`>!ErUAT=QkSv2}FnKi0*F+qa~NDh$w6Mv0#(@4H@ zk<+zr-O)7G+tOwm#Mn6gm*KPUWaih~%)0^uuM)r*^^7?4rOaWzwY`5`*O)WwJO&+?F6>uT&@Cp04Z&A# z^>08YjkpMB+!{&b(!0A^N_2;mEjqjf*$FcUOyR;-N?-@v=QBIL&?0U2gXFgoiz$Y< zLY`V$v*)W9bkw;y*r`_9^d=i@*27>y#2`G8*=5Ohro(jYQ2TKrGtB zqBIdgJRwW>xEUOS)M++wy7~M~0}%(0a{@dS+CxX-9x$qqjIU5Ncn||I6q2DYt0p0} zN$M1ujll4-q9L;|&ufh#wJ6$O^GxN13YW&kPqT>rCtMY)u4pI~bjw7qBoV2xvU%QX z%bL_F>E&LU$gYQxA_Ke+u-R5F%q%mwkU^<PTtxGodSX&I5?*s@4==zqm`O#Gy6Con%dDV(S|hUNV2X1FS<7(*Kr zNa8jiA&uVgsI8r9sUGK5_)xGNodq3kcGVSCO)X+_zqr+=h$hXV$tsBgRaag|oeVwd zto#cYl1zJv{%>6^d%7=SlS=@D7Q;w7rsy01Ai`9Xm6yTqOi4{2j}XksVd6HB9h2u( zyjmdlWBE)r0b2Z)1xnvBW0{+ zs}>q^cAET>tuh;CQgp&93mYzkCMgFD?VfR+xAS=E>A~kh`e0oSbDLZ|V<>t|S7{z( zi+^JlPQx4-AbqxRc!){^*0pNxJTFOO&)XR{r286nuFhF+yRQH2kglEby3XLJ6!~YbrjyCu~?H13WeoHP7EDf-hJ%yNlo^) zN^$(6Go;yveI+?;F`gds+ef{4hzD;rUCVtGD5~NmuI~0iz`9QBzs+v##AZ7aod)76 zMeJd`FQSTQhe^`$p-CQrxGDGa1dXJRXs&OoG_8QDvvmfa3`SpD_gB7hAI(-d_SF~j z@iIw~79QRFY-}^K9=BqtB4OgO#jU`-ENxN0F>I)~P&22&3*BekHY*;xPGlqPyeNGw zI954vHqlZL*V^Z1utkEl`8_^U=VzRK@XrTNrpr#1XjGdCISHMD;WxyRlob+T$G8f( zp}Ndkc-VUPkwJvrsM-|GLif()-z1fQds?4nHGQy(Z3aRdCugSl!RYW;+B)K*2c(z` zCgs0ag=?ODb@xx&q}|qb-F1LaVR!hJgBD5l-V>k~)*YIL<@@Vv;=YPI&Yp3D9|1hP zv&TbAh)5?KYlDYkwOLo^RIbQSCACcbXz&`lZ9pRlxh%nf9<=i-`R|EC=9!_)D|;bz zgHt!XYLfDS{hUu`c#zmN%~!m3EGht!@H8xvC9txOsPSpm>z|`|h0iYmBfc1W zbT3I=4J5{&hzNp&%ZdL-mve2re`l#6u3FZ*Fp=*#Z7UtXUQ0h~5L`HHDEK!mmqru* zYh2+dr~`3O+H&=hoVtQ}z@@s(+=WFtECpkRTlG%t8%te8z)Vg595E`g24h=9J!|E( zcQBD8_K59I@b$?yDM>Tn^yxX`$^6SU^08Pw4q#~CP26D5u>Y=` z`@DrBZCj;nP<-zLZmbqZa8N!PoP9DsuCu1r&0B9jNd3g5+VH%;nR_Ib^lU#-S$l9U z^b?Pt7;fOASS&Wt#6*yy@YG_uQNp4l{^WzO6F0|bGpiLwA7H9SquEwws8FU=HHKus zq!_Ouxo}#S_L}I2d;QSrV!*!tkva^P3HFc)pBspQv9$d=_JGWqa1v!>bGz&9c=|UUl=6pnYWH{^U|U zFHUPtDxMV_Rs=s^l!Z1i(@rX#GLm*nR34@`JiJ0YUnn|^G0s)JhztX3VCjdQJSUo0 zVE&mu(gm#}(eT0}M^UOm$SSXv)rXP&g}rjL0{{0NP(jDa`JB z#LcvcJv-JR9R7ZuccpIQJ9^;&b8Sd9-EKK0QUXDuJ@ znzLR>wuP$rYf6dj>R2H1#D=+()Kl_F z!5mbhFa)b5e{jO`bb&z91f;(KbM29U@gwCiBKH`-L4_gQ>5TOY1nj{GzCp=?dkM$Sl{13*QfLB|}i7hNRw8SXiW5@R<~m zB=G}y#j3rY{$6TC=5Mu0Rf#ph&xRUCyJi7dw!r1Ps9lgJye#M)sl9X@zhJGK63ANl%zM?R2#Q^cFSJq0oK?KJsa;)jHY!Vqu~a zV0cUCvt|fWQAnbPreaHIVqxKsCVWza`BbiXOw=0I%t{O>WYHl4MFXIiIf1YBnBHN- z3*8uO2dK}T=KS(OR0L6Ub=t0Rb-?~pHHgbur>QyX$jo8#HM7q(Cf|7|iC0D|@fYP0 zq~Jz}?TzVFl&9aDC^WVG$iDTBx7v4C<0*IuMPNZjk*avi^|ZauCU7TQ?e{y#!bX%?Z^|@fc#$oha2GKz&Cwig}vp9A5q0sdoqgu$vfN8FI-gMf!r_*AG#6sEmt&J z+6j0=;jzYmpovz2OOQV^MXFja>QYl%&zORb1_fc{ubBTt}||lR&}=hsGjnHA=;v}-@p+jPKH<6 z`3QM59qxb)&n?6CWcRq*NhPvXI{Y$O{v06n?QJz@P~>+@;7zGoI@Kx8!gE1j@fa6n z06sF{BIREqn>6&h?dpqkndc^E3;;JidSFOPLB-&i zbdshDV31Rfp4)a)ppPs45A08LFW|fX-fK;j+Rd|NU|y)AnI432f(1q00%_2^dK%{@ zV*RuUHskI7A%^h1WG@O0EJ&%BHqvp!NJ+8OT+-jLLvnO6VGc;lp!o-q=X4)@(|tf> zb?BUZg(UqK(Dp)mY`+^vjLOOU^+Ix+S^5)~Q1rYc8P4rHymHqs&+?gClE(X1HH;AN z#@FjZh>QAvO`J$5@Sxw5^G}26tFCHLwnXJ@opOLthGv3G7i=WRNm1*08GWU*dQCr_ zv-}d_I?CH5TS!&p!T0UzMzS~?yEkvHheeURb9dDEi?>pmtx`*!H`O<$({n6J0Kh^2 zbbb};dyOXby9M{qf)e2$xQ(Fv+P!DGVtIlc%eUi?{{{}849{w~gz8#Ac@^ROYwq3G z|7iNk>)aAKb!t4gZ_$S43{h$C07K=^M($e{TVgad!>RP^fBD1ucx_#-Ei7Bqp?Q>9 zJ{svAqEg+(tbK(wr>qro!%UFDJ5}MN{p@GnbirJFgv^gvrMHGFSUekG>4c7rGPW zB2+CuknneQW}=ikztOxn#y&=ZLXJ8GF*}9lkwnUi#XLJFVI3jjxmYjB{;VV&sM;9E zx*>0eRK{m1EsKCgFseztT`Dr_V1jg?s)lR&L0HW@F)hzYr$1<|RU<#wa0JOI@DreU z=6ANLCm)u_fHLa9f_SJoe^U6aQJe(EpDTUkbrLG7%qqRYr_GK_hpOX7f^>;A?&bIJcbj$2WYae=U)bD#V5zFDPBGj7#%w6&}Q)lkK=d68dwzH);c_7}ug_ z-z2NHcE8Q7$y-8F{e{&|QK8mNUt0RF^j%#u?dAf%E0OXI%)-4dp?Aut$6|d~(hakV zlboIgl=JC78lOwp2plDcbj4-QnchBV^-KE1b~e}UjPrJ~kNsIW5zp!$g++e&w1{dY z3M5v0S8rVWa@psZu~OO5UO5p?J%Mh#cNfdqP>+lQ>*QmV56loFsSZdCQ8fY)%G1)55|grw-VA?N6XKUBX1s7C*Aw+dJ~Cw^VCJm zc$Bf5c6Y#nlS3pBm|53oWpkz@dwN0nW;I+7~jsM55X9*Z^5?##TN$U8_KnF~U-EUA8WJ)|15)ZWMgoUf5O z45xD$L@PYJ8Ok#+SZ=3}67H03k~yn7$Tv7tl{uCjRwc9+UV&py$(t6IMdU^=ll1`D4Gf?{K4BR44HRa6OZdXGJeFMMo>%b7d{}to(On07Mh{t5oMrS;o=1uSbp793JZ3l`$JJUW38%jPK@XGe-1eUR_Un6Gs+BPpb)qi|1c{XKSgtWaVTrmkZ* zQLlF+s3cuo=bPXqbtjV{9RA(MF=B0a#zJ z&S_f3&KJ&jit;98oyhNasa6&;!Sw$%q9)eU_(RZj5;UMfh?;VU+xqEzGw6>#9h>GS zVe5gXGdDRFIIfH$lVEN^K{qFrtZ;Wa(@pg>&&u$EsyI|Z)nuzjXOk433rxEi^DT2s z2d?;B?DnbRF!AK#+zPM!{$x?>`l6V@_iEI+a~YsZ;qdDnFH>sC((*Y~*?bf`%naJs z*F`nUs4x;UKm_rCCt&2ILF#iNvqCSGxg4<0rlI%oiG`M3cKlrR=aR$$seHD)MpQy; z&qJve`y4AQ9dd;shwjRQ$UBK40=3Dgd9*|2Ks2V$ED_ZVfP`{43!nDeV(w@-K3Czf zs7Ypyd3r)gw^9^G>@tI0g$>#Dn_oQpoMDQ#QF-`irx7Vf0D!ONUnnuRIQQQJu`4|G zRo6C_q@G5(=-o=mO4m&sPzANe!=FwK>w|cSJ!J3P`Fl3NF-Ukr`Z+nugRrorvD)!8 zT>hgBrz;~(^~Qcd?{v!i0+^T=)}DhDr!s8%h*xCallWw!rRSNWdm^#zMg+?0wwGD; zx({=dVp%4}4cLtmW7TQHaaj z(#4MwMy^~uU#_buiOlG~iqC40)hczf3~5wD zflow)eAUFSF|GuY*;(8S9**GDwC_yWxYKszJoZS1yB}tZ;fY;NKg0uWy%uvZ^2a<# z!-?qAhu_F|9eNFoLXz z;}Hg_-2lCF?TWYESuWlO6nd11D;ImXy3XU4admzGY%nPFb!ER*M8gdp87yuB`S0C* zm2+@~=y*}mhmMsdUM1U@jgq2kUWO5$NDwtN?r!A}dLn)$nO$Z_e>UPyrW`3a~(%jK~;ggWTT-tgzW+`N2G zE=^Ctqt=rj6r|WTC+|8}M)ei6rxN@Cz@_p9bO5-rp-b7G4%>msp;=>g>?jOYw=9jM z(Bcmhq_+1`ee@R_xbCmDpc-Z7{mH;vqs5f*ov#Fb!c`$3A~I}N#>es@2Zog?-vY{1>`E8c&8o!$x=Fh3SB9(xy+ji>m_tz>UifHCo5XDd2z5@Pk{x- zI3a}zOmY*J>60SE9B2ZAFQx`jy!ONr2?GRyCj3R}?ehM{hv~Pyo{?^*A}>1LO#ubK zbdftGQ?#+@uWKmOet+KwSSRfOGA~ITT|moiqCHzq^jnMam5Y4>zZuMuh=i*u^MSlo z%x2Z%UEw26`xi9YC2Z$WdY(dsXsF{?DUqr-8iNAvRE3{FRx02%OrF1JN-c$S&x9=~ z2`7+lER#!;DexBH#Ibw=*{fmwqU!j1srMwvtg!^4hOeu4A-uXkR*)s80RUM#*eGUG zP&8Dy_*`U%i0H(=>ja6+sX?cKbF`OI3-%mS1k`GTDI*_n0eBw(^?Up6RPe|EaiRos z&9OUi5t!@xbWkt6x@3wwmIz$2!03J2?U1y+aiC&q`02(2yQ3zAHnXk8oB$DhvoK$F z2+ER5m++WF>3Rxv64%1RMSnMCR&QfYJh2FhuXafOBNc;T&1#fSPDlV9q~}ms(Walq z`6f$^%bg+an`zi~u+2#~`AGubBFIf!!;93p>ZxfGAV?NgcRNe>rK-YfRF+B7zMHAC zB8*!}jJKppb7KAc_|CT_?wBiHYS4f=8XytOSkS5N@arA{-${>S9?4yrFJOGrVe0xfaDQh25*%qL!th0h< z`iT=XK>pd<-EJVlDx~av>NR}ctKp8gI!Va==SGcyfPg&%J~)kT1g$SE$=*v@pOnHdQ>f-VN9N_Ezk(##Z|HpjjSb>u z^32|{rNFYvpG$^*=4ZCvyL=&V)t3NzV8A*gmIl$S68%L-Wf58X06d467!W1$)H+)f zfXRS{U>wO!h#}({gj~8XW}V|M4IIOOfaq*7G>D*>wP%vZpD+RNS=zCbNCq7WSn|0x z;T1<^oo5WJkcIh42o^OXn#4u~a8PQ8jkan3c@*segrU(~3b~h3#Do81UCfcv3F@>n zc)@zSYZD=^lV;7Wh)s6y0W?r(KVyfGuEy5?PHR<}l{TopX`asxS56+QyP|Fo`oUcK zlAyt&YWT4j=inuRqD|4oOA@YhJH%HaE z{zp-EnjZhC$RN6K4A!g@ocuV1VnqZ~VDej$k_KYe*B(jL4@V23K{1^2O29lb1{4Ei zD&zwPNdQ4CEIC(Ws-t6_mm0^UL{jKr2EVBTm4AWXi$G8?@FTPV;mc^ND;u!IIXC!* z&2IqEeGgl?!>LBVYfft%zuL+d=d+U#Xd1luk4j86GMyB*SdWhL&lmPYM6k-}nq1(j(G{L55G<9HdHDp?X`oC3+MK-&0)l-MgG`%m zcX{(GjbQ6Yh3$qCIW{_Xrx0?@DQq8$N@dl{tAz5YKdgQxgk9s;Umstfvfe7y?0>Ik z=4CQDA|Syf%PC!Yu2dlO(FbxBiX%p}W2rdkce7=!Fo9UyantQ&@)Gk?9LbEjY7~*S z9U5txFEQ`jsELEtQ{79o?`{?f)xJVHFy*CS3Z^{o;n0$`22c@Qat}#q|1k57y0xoH z^xGbw5%u@OYWF0cYWXtd3J}wv0r(cPEcTBbrK;v8E*IGAX)Z_!wy5a3|HzY|0!u`( zNW}A#knx&Ue^O+FdkeWWxUpi)_%PA0tj6ajp?{*UmEo`@^>P(rAiu>Zy`z+$bZ9&v ziLGul2G?|coxi&ZGAu<6y~dw>@OsKqv;hG7%}5NkZ+?|-Z{f71w4lTETXU(*l-0B} zMhvAZ=D4w5gpJX5SvU9>AmB%6IJaIh)53>&j3QU%oNUrjehe<9$88AL+xO(%FQy82 zS|Y`tX4*z81(9NQ(!g0n<|m$rTYTWJ5SFjX(3|B-@vf3q^iF@JuG?B5%@w&O|I>;q z!ipp-$jGh2s02wG+aBED>yk1)oOk zn?M0}PgVsi*uIJF*n0Kc@0wqv@t=o2n_@@{z(gE?zmqH-{|ZDL7&IC8vPLds(lej z4T|Tp5n1Ml$BA~8G}4Q(HCypmI$KKQC7Nbwuv%9*q>xLDUymUqnD_4}eVG%;q90%J zN03*L#0&WNn~JSqpb= z9w;r;-Tn_gCK@+jR!tv%570E_LnGY@#U-x4HOeb#`tZz?7oV;8 z)_(4R)f|zLD+8Z9E{Q_MOEzLBfc6g@yVJF}_v)A0bNf@czSQ}_Uivs!9i#Ot#D_($ zOgU4w`i|SYNfKvvi=LONo8HaImbW)@agez{@qGLlo+cP6OD+=4c^OmL%sF<7ZZL8U zMd+BWs@$cbi=^d_)F>xHqs-b_LeKN0)3Ho-_dyDSP5`PbykmYsT=|pt2%Otb!%e1n zc574>L!XBzhFaBv;sobzxKa$1{0qoBpBD;(EtJf;1MbT5AhiZHhF%t2Z2z7roG?2$ zt-0-%;(Ym*9_NyiZ|NMXx}$++y^ntK#&gW|vm?dm2))5q1$H0AQiaK=ALC`KGWBB> z!Ci||c7@r{dWWdOLB+|9+Icd$E_ZtlluUOD5Q-2g-t|-o)mAse-18ya>(QReH_+1t%(0mW zc45S`HFFBRMN~f3fE4fj4UlNWao)U0F}sn`p1%{zo2!zcH&|Mfv%|bB*~R@~($gzn zw%E>JKfm~H+5j_mMZ}F84V9T&B@sG;=DwSo^xTo%tyV~zkx^2)VCjfUXY*(AaVRX=$k;eStje*kexmFz}mJaGm z=m1UkhR$=tiyFl|&aYVdzB5=aP{}mP^+9xj)O>!?+yVvRhpIvynZIuWg`gzPMsrp?^!8Pxmz?8H) z&LHCU4ushg43str>`bsxxpzF95-(n=H(6w^WY|c1H^%AF! zdtR1X2&gr0YXM>@Q$QOS)~P?{ffRi$*X$&Sle6nrN;WxCWZDbn38R|aoUiX_)ba|4 zli6bJgzhx#Yk%ThC z@Ke;M4Nh<7jXRNYB|_ew^Bl2uI4~OJloiW2pVxeiUjj>p*{tNByv=wV?Gey&)zjrN zb*fPK>FTgXzUND8&rfz25KZ{ULB-X)oQ?m!P1rAPI5g|FJKb8I zumfV#-Z$$P(?(^%HGWYZczm6Np%A@|Xq@mSld}QGNC}Ci6lt+zWbwl=^1Bz zfqkiN5kRX$`Jsl&rIwZZ&9{2!Hw~;5`}}2|Wqr5heS5lKY+gU<>KZa|b^*RJ=;!!Z z&D+UHJ|~9=U9$N&_twpbSuK4zMq@TuD(aKQp*VOQ<}7rNfqexiD{${bgJ>G4)~s(@ z^A=AkTOkIhrHyp1!bses2o_d3qOq7}+Pyp4<$3jsnM!7_d%f6EblLqE{=p0+d})dH0`Jm~jpa3uE~4F#Jn~~7&{*Sm-&;5#xmk3ajkmzrNfEdg@srIjUBE;w7JOF@%aQO3!#D{7kXYEv#>*4_c+|#U* zX;qPP(g`(E7Pz10?s;bJ+xj=?33grlEWF6f113cx(3W_q2zViFJ*ulX#QyQEr%Si| zjBg$6Ui#{vK(V{c1iqZZdE*ubEN_Fge->U8!wxtWa0RAh7!xn2aaB=`D%!Z8F#I|m zqRgVw0(LRb2y?g=Mi`XR>A3lT+a~L;(AB(Kqvo zmAl$4eVkt70< z;Q-zP@ZVk559{!j1GQUD=OgAV^u^PBuX`4Grm?1^4LRPnyLLUhByy37KaW57_JQiu zfnY)xwzbXc4p~sAv7liNu}uJ*v>^u3g@)#Z#({-KPY~JwR&`VM@-`UHEZo$&u&4ym zHw*8hKs^S;b~ym%?R0W#QzkUX7A8~~6U zKqLU_z0F#z5k(#VeD38@-h8-4zukR$!DT7hQPy zW}TOH9=x1-LS>tv)~LWL0FVJZ`#WqEw+lO;OO-%Vm7ohd4G*cHz{JX6 zrG5Zk>uOQu?@}czSi4KRa}$Q(hQTWdbyyenj#-3K)BUyZ`z{%^gr?f_jff6sc8l05 zuHG6FtoC{n!t4~kl~LibtWM!zi6CCWzsxObV76L_{3U4td@qy00C`uN{k_ch?a9gA z$|!yh28etB(ZGS;3EV{xfC-$zS5+LV@DFm=;ffUIS5IzLX{244W8313#@n+^Oymjw z;CVP2u5fCe$v7J%A>`oxes2M?zzI9?)kWFkS;_LDKET9;0QI zA&20}vS6;AX5a5z-qF%8Gn#EVSVEFpnEiqb-=t~rJp8Toa46`Z)w;y^?1`nYW$ted zL@k=#Q4Lv(h5uCP_I=9pjR?EX(e^90JNzl~2n(-OK^_rd4JycwXxOj{^es9eHWRiJ z(LH?7jg(jOvV@T*x!+=8bAYxup|)czJc-ur*ukE64mpfvz2^Ejy8JQG5_X@0{6lO_ zV(a~xj10CcAOs7Fuyxe*M*7BdGz&WFGd;*V>i8!6s9P>77Y#pTFunZ+K!gJnRrrTo znxDh2m(S(>_|~j{%`unOSqFxhT(BeN4Y>}NKaik7ueQvA`)%O#mwa#A zzy(C)hsgmuRirtVg{i!C-<9=i8PbOW-k>1;!&!pffc@LRTEi!iM|iLgp~n)-;*VwF zWNU5U06(7Po^J!+2eferxBVuDo-ut0KTJ)1YB z&l3l%Fi)#2p8AYMo}_jBy<`#F_Ed>YMx|Wx%`a{yO{u{)WFH3;F9FC(1Ugfr{w(+5 z{-k~h>^u}Ow+QYR)U+HbZZYz#6y+UoIyZ3gq-!^BNcbaSp7JCChnz?EEEC`iD(`1B zVm`e6V1hj=zC8|(JZ^h_tb&}!!kfh^XeaTzSOuEcXU_oU45N4{==U zy}$+mPX04m{B;!g5i!Ss$e9|8|NHP&`18Gd|=rgN3_@*$+Q5+#5BM$zM;zUX1Si#ndt%6!dzsc|>p2{m$)w<^#L1 z$xW-7?U0$>teM&3A+e_d-3n?w6&?T14qu(0)TdvHz_Z<%WzD6im5?;>Udm0t%j#`gQ#d|bajH~S@lW0dcs$h>G+XPf$Xg3Wf$B$+0IDPSmr#1yWU#%w-4WQ zelWWIG`_D;(58~RQA`*APvDR+u6bXuHJG~*cY#lijC&Rn4%L$CB}P@lj4)WxeSK z4?n~MI*-4fU*1`K7Psv3xA{c#=Q{Y@5Yo(S_$cl!pL|nBv5#3tjyZ#qLzINm@ zo%8dnRrD>8{!_BFnZSbIGd9p!2OB&32a^Ypvjh4}0~GYB{^nU&ip&=CWpS!n9BtVd zd2Ah7XOTk|*1WdPJX4f@xz0SpY-0yl$AuXDT%#uLSg$3(wR1?0^+E`{@#gJ_jngTE z%=Z-U-AxIopS|534W!(tMNrV!80<~aw1u0WJvM#tYn?!B!$iWAG<0LDi|nt*M(YCZ z7FbI339^|(K^%|EWZ0G=#+9SY32fJ4p1d-|>jc#63cM_AHRhGG>nC?M%;r+~#I{H( z98Py>|9G2TgqYq7_2+sp!Si6Hm36wfXzpTiu61I?<}<0D6jR@WnIVsv(PPH^aMeJj zmz#`hdc@>2)(cBH@4`2e@c;2Q&+x7QpI46V1gL{Np+0T_>b| zre0$}USWDfzrK;<#znhB*zKn9ef_j}^f=W(D&EvE*Ny%YE~8|9^B7Otj-XR`?S}o% zob>5XW%IDZcJo7`IV5)*>pE6dTU8i&izFQI6t(;Z|5&7|j;+28Ji?g7q8v1vO6`Kpo zy)}m4&)Rm*Dt*pm8PD~63_9t~xsA3M@0F<3pFjS$R3$<6P_!g^g<7WPJSfCKul}=u z*BLL(xtP}&?}u~N1Ouu4Gp@!T_j)!N?)@-$w{-WN!4v%U{d*TeAMkYZGs|e@bAHte zt`BGYwP)~?1%>wDLzR`FEtNf7gzdlY_F{T%f3tsdNBlctkbW@el6Ugba~1!6zMx3u ziQ(ygvHLdWYvj{2$A$C>4!I#JGlQaoFXhiTJbtAm{K}~PrIvqbQ^T)&O;$Pc${)Wg zs66d=?_@#eBvN8tX6j1*!Rot{J!_F`-|kmvn%T(dsi67gU5 zCcm<3ZziU1rV_Gqo>3b<8ZNB;-CkveT4-?a6ll9$+o+8QdN^I%bKEj;*^h&4O~2dOXCe_8U~ zlyr6L6cbefQC8XwRw=$O71}HOXgUur4=338kBQ1lD(`OYwxhyhqS_L9BpegZ7djrn zlSSqy>6Gi##kExN;FLVlS_`!Zu9{_jMvbc|;|Sqsgg8Xh_A4R*esAbP6Kl3(VwlbI z3nm|FdtOK@cV|LE;ch#0uKEmf6>oEWGN?0r!I+!xx40f)l7|5x%L) zAzjWl$&V5)!9Fk*RZQkX9>1E$PXF~~_mkI$={k!jI^k00#}#|}{c4mIDFjX5Z0usP z*=#u@6P-#DF>LOadL*pwvSY-oZ$+KJtN}FI7KLuIV{xWD+xh5WD+kHcp}e3#r$nQf z%@f)I*LJ7kJBiXdNjm=~YErd=#yyI(0*EaWb%OP1YP2M4&fBeiTUe&2{w;If)q2tH zl=v{u{&s(~;VD}FC2!PMn6cAcD`?dVh4y66vPV{XPsS}j?HKv%-OIH#TTkyPP*lt0 zv#+z-Db9K#Tg8x^V||utvtZcf)k7wE?bSz$7s273&SgY>h93Bp`uL?s@iN$EMmeWF zmG2wQ2}nBA;&OL#8@cn!maHq=#XpLe$uie%B-TR_?=l$~Y+Rp3wgV&;VZ$AAR4z#rk)bjJgCJ^7aIM94ZJ5Wm) zxj1;%H=G+1t6(E~9th<-KRqs8^|eUyVb8MpVnVUwPe^Hm9pG+ni?C`jQMKy@g%m21 z{=l}zm~%|Mu3H&8{$dh;lIRs&&-!d9ua&~JjazL;S6dRMDbLU{gTCi(FD5(7^4Y>& zT(93g$(@Pr&i8>ka+CHnq7fQ*$t4ukc(@V}_|k#*oDz{b(pyyQdz$=05_+mf2Cznf zK@Nt*XfOGEvp!9AzM6N@n7 zMz!wGyK(xu7qEi9n!{Htr(Yf!m#bh3ntU;7vI3qq?S*q_I} z5dJ#U?O)_wC$_*PsL&!~`uj=3-T%@A72c2Yq6Sk-ct}S?D#s_g_u@)3c3nl=YnQ6T zD{Ijn?lcAOZD$-Gke+;yFtF*IA*HmOuBRgI{YvmM5ci&aq_}p;>Z5vPX zoVB+>wp_)5oYNU3D-2b3B=quJ`zYl%6?Q(I(jUyA-hGoFK-Cj=KGq{t1$$417^~m9 z%CsbbGkda$MChFB@|cfgnl`PynxWiph+$kTkB9+^Q@E#7UxbM`3JM-RXMI;` zs_k?z>}5L|sdGlY0s4`JCzuCGmmIE?SCC|+U=O9zSK<_IuhiFvw9j&(PrS$*W4&D< zr|`MBYUh>-w-zR6(+Qbo#4-0DUs6uz*smVldvlM~bb^EoUdWMrZpKD5!{LJw>WxS$ zQ#&H=8gX)!9d)uMl9uW*H8K^18igH>h}DLhLY$2S+N3?``zsIaG^s|hgL&Q3+~wi< z0n_%8eor_li$Yw$kGB18p$L-%`p9#O{FU|~ll2&>_K_o9H-~5KK6Z7so^WN2B%qgA z#hY|U$_}g(&`;m(9U-^6NfQ|`$gAQLZN9q2I1(@{)9n-gW_6pLG;mZ)#WyK!btm+e z<8e3S9L+k1jS0sGPCBdjWqw}WlN$;A^t#(G_iA-tl{9Dut@5hiw$`qrqr<1l)lnq( zclZ9Apar+PuPe;g4$Vh`mYTa?*SuN#_KfuH@{r19)%1<%nXAp0#hS|@Ue9B%$hWJz zDsMVIuYG?r@^<}a_nYpkwUc+G!8qcctGv#xWw>RJnnp;ygjgWEBU=wkP%))_*c;l) zAKb+{3T((5Y)TgedX31mP3G36|XnSh9SMh1Z-&~Af^S|BO&!IT+cx4cUZJ1{e* zjtxtwZ;TQQK-15lC~hHJ=_s;9r2jJZmeVCWN+^Dd{Ce9P=hw=HsUS3CFayMS(9dP3#vIVX*V)U4z)~1%C6l9w%X(QR z2|0~X!fgcZc0`Z^1eXAaMPxussgJB3Mcvk~uuA&okCtkRrX}5wNhg(|Qm%4P zrU+S4G@K8E%nwA4f>j2kA);*{sc*ub1?0`)&03)Jpsk7rc5$4J-6oAn^X|2(vo$6f z4;Bmh?oZyn!#IlDL-dO7zfS#6;f+~?)pJdpacv?oP<2MynoY_$oKxZwo9HdamcoJn zcfXI#P7Q(}FhD|@20tC`C>hQ&&R9%sOhR@BskehMi%nE#JB8zT>)zP=^_qep?b~tv zeTith@T>5+^%TgVPhtF4UHxi`1i8S?4kP`GLjSU8P-0NK2Z@t<7 zu0$>(+4ICn>N``u-^89YG2uG7mv|m6a!qrH&YfLMPrVe44Zxb$$>@H?a_M5DY)p=H z`#AEzj_F}+y7fOQ;e3!kVLGWFQ+Ub@z0XuSO)7c+0a1WXLE| z0gJqsL!@cZDl8zaEZO)vi^w5)Zmptp-66#sKq(m4nBzy`g34@X$tiw?;cVh0vhZ-> zHq@SPVE`qFvkhb=jCxiGmR%kSAs{j|l%)cP(G!HR+0}BThq-8kbHKwHjtG2lM4S+i zH~RzNS+m3L?S#co5k{l2!V6d)XY9MTV{;3T z-4yPnS6{v`i9SP+%*9GbD$2>CI zyGrvmwmn1G$FJiZN=ZxOY}J&gF87KJ0-G&EwC5>-i(u-M|h7TutT zm&mhfzKGo*=d)jPwc@+8d3I#SY}!7RZMWJu+rCQ5T3q;`FP^q!^WzOB49@9#%0uY* z1spGf5JH71Kap9}HK+YFmxtR4w&Dx5<-bgR@c_D`wR!d!8Zf&dy652G08pHznZX<% zJ(|HQmlH%3cK^pIBld}}o12!f`(w6YzxBt@c@ynQ%1W}L<1Y=@{!FOkPJSkG8Y!Y$ zU*(iGae5iyE9bP`9Kz;TN39=Z?9jo6DPG} zNU|FP-__gWmU6Lmr^oTOEOClDo0=J0QacL{LmrAjf`G24M?6p zVb}-79cVM`mGQd7i0_f)%e@srrPGOR-){=BEYS=!MRg8yP^UDZ2c5W^UDLsj(<4pc z#5zg5RZ~W{i0_mnTr8eIY>O*0YO*=y^})`Asc`77$6ZmnF$V3Z>OdET*?_bPw75-xgsjGsjxoHBiu zMZRDP&DVGGtO{;-W*L!W9r5H>tv=#2;z`B4NspjM`|cH=e*-_{+Gz2&KoVoSElnki zMSJx)w|n+Z(H4$q<1?W&Gx;}us{eh}8TPXJzI5NqPuxqM_NY=KNKP=s0N@;(6DpoH zcr`dNv0{DEkLOW-%%x1M+^JJ)sO@#3e^0qY^hnJp+px3~+;>6G{yG#;p8Ymu+_Bx# zcrj2pL7(}`xOBp-)zSEo^75&l=gUa3SpE?E3iG;+clK0aDpN`c&J&K?j#r+3pMEmD z9K72))-`-~6Yu1VKl{UGd&PI=+;hVC?9}CXy?GmfxCeKGqyco_Td>vsb(;9AcRTKA zAKEJ~@1A^1eLV`c%wt}i z&o^Z}qN9$gdl=()igxeiM7sX|c-yS3d25*-@u@t2@bb^0C)Ml^499)aggkpzR?D4^gVL*uwwK@~Y$z)=b*zw*Isc%w0-&rZ<`>nY#wI#&|std>#{ zj8o@qz4TA`+ou}=e(e}}b;BqGVm@^h_b(37JO0t)z4F{=>+=qlJ+?{ww=&4nrs3~@ zJpna~vw@lBZ~7uhs!5`DpV#l1g9U64)134`g!m5m(h1WS}#SCAg}8}<|g0$U=Mtv z4|`U}7Bl=W>-oD%5C&>ULd^!V8w60~j0|)ZSR57#q33gg)E8*+X^2~`rk`!<#Bpkc z#>&@o>qH1XiMP=+DbS9hrs(KoYTz4uFX!_@S|PdMQRip{Nwf38qJP157=LU5t% zQR$=V7e6;K2m;PuU}AEDeF71J+aN$s2qT%b%tds~rGh%8-!#kkRw@RzsK0H}@-NkX zp7__7OtoJ~m>(+o)hqvi!j{17^0(p9 zZzI#*#*_pHhXyC*yt90OaP>q)w<2S2-LmNLl;Vh_tjPSP$of&thpMRf*{+R(u?&_;OJ>wo(-y zQgxe#rmCjys=mpp;f1R040RX&YX)s2l!jU82uU4xAy zi;a^jjjOv&A3K{izcqcmXueO@Tv5={($VtYdh6h1drx!6^3KQGj4yor^yTBy+Q-8m zofF%g>qlKZ{ar)t-A<4DiVOOC`ulOmgSVMl7@S)jT-qM|vN?EgF?jZOC_8y*cx-5V zeE8(=NLTx4W%1a_zwzkc@#cn!p}~ny!xLXNC(iJblT(xPtCO31Q`7TPn@3Z7=bz@L z=08o&PtVQIFU)W5&F_4h|M74B7k=UM%EIdQ!uI*X(a(kBKa2g{iz|yuyTAVX{NI=3 zKP$J{JzDwtedXxq%8$RRGn1=ZyQ_Ho+S20M`sVuP+U9@VJGVL9**W^Lb9S@y55K#) zzPtZzZ*^tw>~cRBb+G^SaQoA@{oQXTzmATMk1qZk{lg!hUwrTH{Qmv??DO=GvY3nG zjf;z)7eD`8{67DAe*E*#->V(m_3_cKtKT+<@-Ahbd@qjmWMkpQ=Twr+jFPz;mQi`CKk!jS|Hjc7K#hN7`#0n-Ybv4-M_ zG;zoA>@mP{*kK<-B~9uB)wYoiBfq2HR5n|vo6NOy;bPb17nGU1Ej{yG*r*lq=!t+c z?!A`$olnRL(nYxQzEzH6iuh!2^?s&6jzMe9+Q)z&EjtV0$+=cUKk0-cig0u~y3yGh zkFKX!vq%&?6k3Um*;I6K*?;DX^qRwhAfCU7o>Q>NI~I*9x7|NgXbp0l$bIm!<+woQ z=Yfy#lZ2G9YW0b~+`DnP#wt+BBv??);aD(K+pqF%L+)6LJ^Rt&;`Q+fZXgEF{!nF8 z8WrQNuKmuls|opmw!ljIc5h@fJCxV(A&_bmF?!2r3j{N`;*b!&G8~Fh_5c?KXbWtH z)0w$$qM2OEHX~YIZ*N9&M2v1?c;35iMM)to5*0*RM!BNJhh2^3$lI3-Vp&r2x8s#A z4;&My$WYr@O$N6jLNHIp4uPT2*PUcz?O!{DluT~BsTK~9Ap&9uZa2+Na;!L=7~@t# zKwR`6Z@TMU1j65PSa3fZtlqbm6R=m#pYCa-w*LWv8Z^!0_Xyl40Ar#`QeMa&3S@bT z$t)^-L8MUSr|au-tDWS`PZg6Qt!9GExio~dvtUjKX@-2>MxZ)symzmHa<(54At^5C z6LA|~AiSm#hTTg`yxXMf>SYLmiMKc%x`#<0YX8UO#q-9vm=t| zsqmE5N9`k+!*C|AEnUWPFkhe&J3=0KUe85xhP{I8AK;&!Zv=VFJ~o{cMR}-2^6MOy z69>LEV&C7%&Udmlc3xvwb+5Pb%Oq_<->q`JdZqTAoZv)3?~^q_^*@&Ud&`U$c7$|) z&Q~;ONa6J*1Vg#pLQhmI74vlanWQCgqZ52>51{--$2_t37DOV$4-!*fo^TFOsD-<; zTfN<&h5c11&N4Cvk$y1hg%gcT2v^sv;|>pl`HsrV#?W)Y=Qq|02b1&P*fqyLSFFjD z6By~!ri~94^OTc4x}?nmP0!2|V`VdHw}hdUjTqwcavy^=C&u0PJ&O;Z z!xdkqkEr}UOF&Q-as1p${>xmf5@vWy8tYF!$$!bG_Cw>z0-0JU%sFC3s(&@<`NsM(}l+i9^(OeWRj8cIe$t{Z4eX&G$ui;)S@{t?i zGYhdHl;w8xc^ln9N-<-Ur4y6Oa9`X)>E2PLeO#r@eh_b#I(OdCMAidnl6lA6Orbz? zI?eCB$HI_H2l{y-8itt0?O#t&idh&U63K;d(4tpm)3QU{epo{beN93$Oj_-&;oWTV zCUCvmj~9E(eunCVMD>F1Wc^F;@Se3C0Tdo3p=wCK*!LXrIo0bfFR||(C}~L4z9~fL zucE7xQoJrg_bIzjSV)De7Txz+%&MO6z>ex!bxX~pK_*umf2PXi(wl z^ThyW9EGj>c_(nXybrHJQ-MY;K6mSwbyE7gr|Msb%8WNO#ALuh(OeRzAtoXIq>xVQeI~pp5uLXWwO};e7~cLcXC3 z?5WVe<4_;@x+*}HT@ycHMXi%rjf|7{OdRX{>4&bF5|%MCW0)zbF%fC=Jkxc8k2ZN3 z?mla%tZ2pMDTaxB7E2}1PBg;U=Ud!$w8g1t$rth${jceDjZRi3_apx^1+F-^_`(0C z_wS4g(mmzL$mxjKz}3sRh{PxN{$l$mK>T2tIHMZ|o^CbrR}Wx|H|(@y6yY3^CEp}L z3j9gyg-bl`WJ*MQa$?(P^Jd8X3-fgcQGMw4=OAOF_52XNCc5cU+vN?;uw$l*H@)Kc zOQJCH`?#(=`0zRLKM4|2nHIOW)xJgj$F!|aa7M)|@B(9iq!7H?rP5C!WPjpTsK)TS zrgVsFMGAG0!a;|}V+M$FvD^8wyQ0h^@@9r7eokt%5}YGE`Vz4T+=FW&3$lSc$m(a( zjkD9^8H2Rn7g51|TY#FVo8WuzJZderjcaX&_|rJQ0B(URl@VF>cqruU%!+Sjpgb30 zm@SRg#6Dc^KPU{2S_t7NXknhCNBK86K4tr)68&CoGooEi^MF_ZUB9V|HO%Iwtkc!qJ&KYG9z>ZP#^Ru{zyzMW6JWhmDiA+KeNH z6bjz6$Xg_(zIwv)gLuf#SE1Sbbl5kDR`U1_>_5QM^0p)?5ppR9D@=R$i;?ip2;hbV z+lmJ=&AuU*K)l+tcm^Q3lFe>aTP%%I--vyzhI~c$A4l6s9GfGVB>cAERQIry0rg~W zXOP^;cO1)ap#+2_kwF!5!MOc*=jL~Jbr2kVC?flpM4JfOS&~Ku+6{5)O$3=Og0V#o zHgV3O5Uv#)2<9;H7=S@b&lOOT-%VFYq-yhcNO z@eo4h-rGlYDwkd_*pb6+5rI4UrK#;i^qw4{L5V7a}Ok_~LGrEq<@e0aB6c*1wND9ON1n5zE=*}tCBUfPa zbCkeb#GSJ!@l{P;mIbuS4$Mj*Zap6ha6~b2QoqN>5SySZdt+LBeDh=yC`iMD8qJ>$z1npKyk*P? zuZV3&J@e49cO_hUF$wq0--S2@@-zstii7d;;ywsMFth6pKnBqRcwOU~@q}XQ1*UnD z2rMnM24c=p9;#FCpvi>k3!wfz3iU4%fBRU+c+6xTNS!xMHM2~WK&FaG=n$K{kZ2(P zd!9hhNaQmEon;~$DGlO1Al5DCD8+`F$pJaf0b2~98VJ1oX$FxXA|q9J{YzdG8qFfW z>RlTB#{!CHdM{8%q|5P?PR*+|Jx1==9UFP5&;gL909}@+TjhAm#>Bc(mlF9E=mOq5 zM1iWIu;&&iJvf-s(!`O3Xhxg$ek)m_AXI?kJ!@ThJP+)-Yp`D4qYjb~?mlwT`Zx51 zlxT6-nf(g{0;~b#%(fE`)KRT)c&ylQe{ti+*-^WMKev4!sfq6;VM4npX;X=xX0i}I z9?=BM2y8hxGr8=AM!vdwlf0qZn98N838i`OgYu42RJ@(5XuGUylf?ddRTIP zGj^&YncG1k9Fn!40R-> z^h9LSow2VbJycq0?=?Kp5FDY*0L?y3L~lyFeQbZ zGmzaw5R3kXD&&F9uog4Kuq<)14|;+e_OCDzZ$|UjOBxFQTvP4naR~2wYwXIkl*Ea= zDJr6q&>$8Ymj=}9?1=64r->hgkc$;M=JRldCweEa<9!4jXZ1M}6Ds9___0FKGb)R` zT!#JPue~JCu}kj9m@BO0vfe_+4IX{D~fZ-AKbr&uAG*cIhAXiQK@-9suF@x zUq7KIDfAOBZwWHp$CbnG3o#ao5*D+&6#*OK>APc&G52BW9Jd4Q6gp0-MgO;|0l;xo zEWnpncUX|rD*^hAB0H-R;H{ovf%Vh{Wd8;%T=JZU<3Q%2yQE^dzst$(i8Y3vV(l%e z2kj1jn+W{=&{Td~I(Ta~^eWU(sP2oByvE}Rv?2CKa-BX9FmA{j1hjq03qU3zP(BNY zx<<9U3;hr|tF&KEz?V6teDRl}m7<_f~ds9ELWt`J%4M^BGA^PQ%_Y? zmyLQ!7yifCs)f?WpyeJMY;jr`z)6t>uS}>6x4I1JVIu3>Z~gGLLvz#F7T)o4n3J29 zJ%icg3&?jes)M}2BCHv#gtKEHCP_a1Xkm~7n3T5|ux34xNScw;7f+*I1ltjixQZJ+ zicBOmkt)%&8((M|%3_Rf&LDG6TE<%e0eRr(r?pHOU7H`fhA2q9P8&A*Yqu1E@H!(z zMfc?d&@If^3v^PRrST9`ufjfF8L;k&YjCl0uD|6tl<1{g?WMly1t_6>EPZr0YTJ$S zqe0M@9VPvUS2f}QoX=5BHtQ%H=)q=?+4KqS7Eqlj<-CycF|GQ|P4>YK82;KYO;5xO z5Gkz=DBBPz;YiHI2Q_U5%@OUg1LRXg1*LPzA~uymO6D)40a;G6TzDncMCzOLi{tt} z+w2nBFj}9P0ZHRwmr0NkK=HDU#Jq0!rP83KHz`NpjhBNVh9;{h z2soeWn}kGu3Hu-NA&UCZ+kZ_Z8=^#|u>)DhO0)4c5rO6{1&{%{>NiI|_5yqTO~o0?OaTCkZ~x_Q`-aPW4P`)t$a=3OZ&PqRj82gEGUs; zwsOb4_1=D%iCrzkB<;(`PZu`Rm%-E5+0(x}r*BrL|J_Uz+?fF>&w!uKkc7-Ya%Q%c zv%kz_PiOb%v$c~e&(h^60aVa5^-lV(*|1l$Y=7HW^`Sqi`upuZQ4vlb`oB?81o(Sf z2(P>p0;o^Wzz%*Z8-%-8wi0v1mV9v)?c;m%DTK38&cwxQ=IWBQRd z^E$Sy>7&T!&}w=KR*I)(ua})fqDW;gHqQry8C++KP!BLvYG=IOSYUAGh!1m@;e# zP9##dwz{?^g2&G9B(ANmtw|dbDHs=hR#uaMgO1kLzvsjU2Q$h7AmUjOl&2OJk6z`qb`Rk&m>V(xdf_O}Nh@a+26gHLEv?0}(ft zu(BJZdb+hu2(HW}yh{L*A^4_mzxIZ3Rto_#&f`u9rDi`R8Z-;%MjjusoZh4T-UH%3GUPw1tXzPXU>#yY_!=uywoV+KxJT?qoq|0&3Z)(~f@;(e z?azFlFaqA;AT!d`EJi?b-ZK)D=%F9C66@pr(<3T-$_b;BqwZ761b|BQq$!^?0AOKJ zzWZ^u8@CCGA|QvMK-!4!#HJ)%2%@2XL~Phh$m}uE?A|!_*}gal*#49b-$!`T4Funo z!Bqk0|IQ^<0aVR7DfBD(CIwL+DVI036&%?6e(*K-^w{ARpogXJ@qiaL#LZ zl57D`-Is7kxGZ~k`oin7?``>UZE(4ZzXCbglwCJ-v=rQ_=fy_2l6d?HMUMUL2D4?k92mPqMSUJXNLP z1VAh1syyM6wEnU;?#D6eJD2Jo)x5tHK7YV{>FLu)K{UWVxL?p;ECn7;Mla?x>W%3& zNCOWmFq-7$Iw-*2|2C`0R|nXqbJVZvw%WO#MrVgL7;_E!sb*rF(vN8dG53VKJEOd_ zbt2YWvnd7ufd)}}f7zRs(=<4pqTiu=`uy(W80luu-7kyZ%yo?UNC+LFqt07?sXKVe(ECl;c0V+TJ zTB0GXL{m_`+hsmX>f4;(yX)+2g5&+$53^7vdQ24=ertX|{C4TQl{4uM|3|AQ7@0TL zJ7cMS$1SVB{0?S|xgQIiiW&$w$A;&{ILbcQAXhEh{4;m2-$AlZwnidqFCaYHM6PA4 z@T^fLWz~(NnyDdTLxzhbFFboKLW7YuinR`cq(Bz5{%jOAQ@=pTBLj3YTC0 z2NpC=G94>5+g8bv?Wx7kBQzS}w>x5Zbunr3eB|I80Oh1!p7MAhF8=##cAJ0 z(TezSUklU9Ysw1Czat3a8g1%qz>e6B`)ym6g6_tk-Up#-cwi2kI zPYk*b2G*JGn@)d1f}b3<>m3exJ}D7o`}l6{SC1)vVRf4@t(JYEL`oApGozX<-5V7H*esc(55|EIyuNg$kQ z%uB+mbmi(I``BUJ-eVC8V``P1J#SwAZeFjeGMqy7hC**uA>ay%>pW&_{)5pJ-=hc0 zIE6<|C(orNd;K^{7-ftHaW+YKKqBOUpxmEHw;3L#pB@P$8(B89!)g6>=`_L7(TTFI zDOBgmR4~PGE9M1k2D?%nr==n(?C>>TA{$s?x{{&#)p;F<=CHff*pPzyC>F-a;~Aha z3#(a5#R4LMpv~~`n_(=C$Vm)DVOyafmDTB*z}e4~ZN0@AYSW8-8!4n-u=-O>n^!Nv z{+A<#-(a{}O&RU}fhK?MQrJ-nlA@&YOHZA=IE+sdW9^f*$#DJ=9ed11V+t~sN2!I& zbMfpOBXvXHWQsc6J39?$;b8?U-ppFFz9Yp2@cJT;x9&KQgDG z;0rCeh8mMo#gWGrla)5;f}_we=X$#LW((;o%BI4+0Lx3)2BKb>WEYsnj8tp8v>P2K z5!_KNKHAr$)}0P}7vRxd>?f5C{9&GRh=O>FR|qG~8+xF$l7UAP3D*vs*4TWrf26%4 z#4g-6FLWiLpb~|trVn&Yjus^Pm2uKe;ZzERbY@9pc_|(5ywsh^Txw#gjN0%0tWY2+#QR0hc#xUM4hAze3oIeqURX}u<9^Hw0jH87 z%QVZH05j=ieC!>?^^uMSO#Z7aSd6Bvx=0yW7&#BL>TM33k4FTps~#V6E@b|6PB*oG z(bwJ%Wbgb3`h^QtQ)*{m6+L6xn!QcJGcVIvK259iC_}3 z7Qv3Re!*jW&@CBUb;_-J5$)3qBVl=kg88LlG`BeVzKRaM;opQy!zANrTpq%dTp|3+ zO}60#Z9>N~n*m;L?ZBnYtuFRk57Adh{ZOZRLv`Icwu;m<8w*ZTWt~?!>BUydpJL76NC9XvhS?FC7uJ1iWIS0;{XwP@1c3mC!D0Ssql24c=EPu zO*CFPKgu@IPC&14lDH7N`gbkxB0-VY=(9*n;8NkKmg z;6Wq}rTl&76RXx)EnwJ{_4kR{0zB8x-M*Rp>oE0U^C&u7mKuEbTmk3^}`fjL?FcbNF@$$adrmdDV&XqMv zcgjiEzcQ+eA35VQ=~pkhs{JTigkgE=k&#aw(XOao{SvUheMg9OEeP7DkXi{O`|M6Cj*Tj+!5%u*2XlT*Z&lxmQAg?$%nW}0nbG;n zre@{_W>PD`{_5N{(|r?tt&Amo&%f?>is+$`Ak5|aUf=cZ&h`-YiJCh^W4yAM>2l~s zp{XlXz-dtgr4hqjF_3D2fUOGF{LJWC(V&y}HTB?on|f$t^W8%vGcVEC3LT zE}`fYG@J@iBEYix&qwa?Kq3Aq!;eS=@%hMO(P-~bh8a<}Jk_)Ip09Pp%>jy@_Eib2 zwFWD($pFzKM+_gpT;K>H=`E7@qP&pEy+KRH+9nhQQ9Q0}i)&XvBfz&ZRL^f8qY)}d zru?5@aUahNm`S%=_S+St4(e$#ohaZyhnB7I_RJKs0v1;S_mf09jH~dQ?uxLm;hh z0~>X0uy0_lGM1YbjG&*(7Hg`m(FJ=n5P&VTz!nI7!Sdp$Fn^!4Q|1^44019*1v(?@ zLnx-7n4-#}4#4HUyR}AD)Y0Gw{#jSu{Nh-`k^8Zz_K&eQe}oJL$)BZvB;sr)zfQc= z$KaUDFhI+fY9}vJ!%jy8|l)Y}m&0Wzd=!c9FydRt(@e3OuJ``?I=vPLf?pEWd ziNT(Z`l`p(prXv>2hnBfQ36tEPf(>(<&CGPXyM8~ecleJZ4P1eZ1D zjwYvaU9SS`pw}2-a$!_tl+rsP*%&PN4OnK%BFh+?TB@mJYS9^fTI=B_`p`zNiDS5F zhA(_Zl?E|YEB=8RFfhwbLA=U#fKS*sA@T8aG3o_;fnRmpZ)-?~6V0p9CbP^w%wVdQ z6?CTt2&mjM4U9QJoIQiC4ahWNLcfnKzk>tvR=QLL8iyAKpU0HVLq-yCAK8I{aD?91 zmC3>;j46ie?6hO`V{I4#vJI(^l*gzQMxB1^uBaRDRiY4v>(#-B#sm#U%5-aV)z_*f zBB}@vUa_&drn#xJs{<5c?FO&g(J_V)l4adyFyZfDHsWG3TvGYRF(YI^SK8?W)l2p% zl!iy(h!eN$+Qh&`Cx^RXappqZnZ0xa^5f42NDix1x1(lHGUgflL3R0i_A-9&YjEk! zSh#M^=t5Pv?hM)|8SJd`{c8k%w2v=SIK~RsAL}#}=YW)J&K54>>|BVJ6`i1$CoO`d zLFF@{c}U@u64fBT}F#h9oCYatnv0=6)musZw}M^$UE&wcsODx+nTH*xMQhGw()whi6c!bDy>PN z62PYLu_2$_r<+iqb8=o%UW|6&NQ2tZAqhwWXGwVMDz!7>RPB(I0*pZVQn)e5ehuns zf-V!*lQp?5nv7N2M5`{4f6$DBYc=Rq4_{=HnLHJ_fp%*VBZWe;p6trL4IbNsKH801 z%wtMUBM=G4rAB;h!H3T*I-f5VW0jh&K`WXuS{UV@FDaDmKztCQFIFhVwG8WJ5QiP8 zSRuxb?Z4vkVm@(rfdz^;fQaI0Cc6XAQqh>-^=w%OIgezWnO5E%@h36zcSvKKvy>v` zj8X6YLL6<#VMV!WO3PKJ;u&;g;}(1tUEtT;!%*J`c}=-?dKj`vog=sET?nym)%}hk z`RBXQobob5fh=-X8eI)CZBJ(s@`z2PKqaY|7-sQ@cZ%ieRqvL4iEtI0Dl;ctD9B<> zsq)qv8hW@}juEoD<2A`+lt(D<9X@AharjlCb=9G!RFWIMP!QJ_ zcPyfRCpRLG7(eG%xW!c5To0q){Oor+ccjjH4M_=yLdRg5^lsS6W@8>WDC$tLP4Rz> z-E~ycfBfiiV!)`e(aq@5Bc#C%28@(Wk(NeUz#=vnJwgc)=>|umfD)raq(np{rI8X* zR4(6pe)o@i|GN8g=j`l!cJ{~T^M1cykEiw;kbh1+A)}5%Cl(XhkW59) z0x320Ms!Ap_x_iBi`JDJi??WQZ~RE4@P*a}epM=Z_Oj{r{Y$2p1xx7%?DS_}!kBS< zw$JfnNnO+A42N)o+ko2+Lvvx;>m&ng@gkZl`VAfOSFsZ78+aGf(yt)|rx^Cw@&PA- ze?W)8cxH8%n1z*rN4d}OPoWPMX|rPC!LmCVyu2GUst|{RytM*(BmNMmO)_gz#B}^h z^e`h%=P0_x?#n*JK=EyxS{Aty*JjHClF)+!ch&S5LxyZErQL)`mH)v9Cm1Wq+Npw5xs%x`YL3d&eiPBWCDD&7|VbLSdn-nX*qn-tE z72L7LGTIEh_n1r?o3&w~rpK@+#VUV^AC9@oP2DJ~H4s_9+cXtl2k_hidrBcj8=+f` z&Mv-v#ho{3XB;MkO97~60fu0~i~QL?qbeykZg|#h!#UgeySE(ASu9URDD7BnK06AF zYzse+k(D3yUc@^!BoAFpPdx`bu6yYwa_=VIl8UPk^ElBh z&Uo1hm{qll^&*R_(0gWG&~OKtu9={23KS_Kg~c5=cYUslMBK5sKm_zhPT)u~$zC<%76)ETq1TUI&Dpi0RJN9ID|qi+W$aOf#pwp%=bOb<**4v`{>I|DA#T(Ie-V zQ5wh7`%TKGVrpIOMu!3<{gQOF{=QB;U8J;x=n&gz$kBBD#dm)0Btuv%h3)k_S~l+4 z^6bfXpyU%wKz;rg$VHXrv<~bx4m7|lxN9|Tf=fz!_1@8VK*NK{mrp)&S%0AamPW#D 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 KSe)KjbS^2bmOUGh`W^abj((l7;UT}5F2 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�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 Date: Tue, 9 Jun 2020 10:43:24 -0500 Subject: [PATCH 02/19] Updated the Writing documentation section in CONTRIBUTING.md (#68434) * Updated the Writing documentation section in CONTRIBUTING.md * More changes --- CONTRIBUTING.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bf659345d387..959c12af90463 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -661,18 +661,23 @@ To build the docs, you must clone the [elastic/docs](https://github.com/elastic/ repo as a sibling of your kibana repo. Follow the instructions in that project's README for getting the docs tooling set up. -**To build the docs and open them in your browser:** +**To build the Kibana docs and open them in your browser:** + +```bash +./docs/build_docs --doc kibana/docs/index.asciidoc --chunk 1 --open +``` +or ```bash node scripts/docs.js --open ``` -### Release Notes Process +### Release Notes process Part of this process only applies to maintainers, since it requires access to GitHub labels. -Kibana publishes major, minor and patch releases periodically through the year. During this process we run a script against this repo to collect the applicable PRs against that release and generate [Release Notes](https://www.elastic.co/guide/en/kibana/current/release-notes.html). -To include your change in the Release Notes: +Kibana publishes [Release Notes](https://www.elastic.co/guide/en/kibana/current/release-notes.html) for major and minor releases. To generate the Release Notes, the writers run a script against this repo to collect the merged PRs against the release. +To include your PRs in the Release Notes: 1. In the title, summarize what the PR accomplishes in language that is meaningful to the user. In general, use present tense (for example, Adds, Fixes) in sentence case. 2. Label the PR with the targeted version (ex: `v7.3.0`). @@ -681,9 +686,9 @@ To include your change in the Release Notes: * For an external-facing fix, use `release_note:fix`. Exception: docs, build, and test fixes do not go in the Release Notes. Neither fixes for issues that were only on `master` and never have been released. * For a deprecated feature, use `release_note:deprecation`. * For a breaking change, use `release_note:breaking`. - * To **NOT** include your changes in the Release Notes, please use `release_note:skip`. + * To **NOT** include your changes in the Release Notes, use `release_note:skip`. -We also produce a blog post that details more important breaking API changes every minor and major release. If the PR includes a breaking API change, apply the label `release_note:dev_docs`. Additionally add a brief summary of the break at the bottom of the PR using the format below: +We also produce a blog post that details more important breaking API changes in every major and minor release. When your PR includes a breaking API change, add the `release_note:dev_docs` label, and add a brief summary of the break at the bottom of the PR using the format below: ``` # Dev Docs From 7c0f838aaf196d94fcbdc09b840f2cd0b974f843 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 9 Jun 2020 11:48:37 -0500 Subject: [PATCH 03/19] [pre-req] Convert Workpad Config and state to TS (#68615) --- .../canvas/public/components/router/index.ts | 1 - .../components/workpad_color_picker/index.ts | 1 - .../workpad_config/{index.js => index.ts} | 19 +- .../workpad_config/workpad_config.js | 169 ----------------- .../workpad_config/workpad_config.tsx | 175 ++++++++++++++++++ .../workpad_header/view_menu/index.ts | 4 +- .../plugins/canvas/public/lib/create_thunk.ts | 23 +++ .../canvas/public/state/actions/elements.js | 2 +- .../canvas/public/state/actions/embeddable.ts | 3 +- .../state/actions/{workpad.js => workpad.ts} | 34 ++-- 10 files changed, 231 insertions(+), 200 deletions(-) rename x-pack/plugins/canvas/public/components/workpad_config/{index.js => index.ts} (63%) delete mode 100644 x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js create mode 100644 x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx create mode 100644 x-pack/plugins/canvas/public/lib/create_thunk.ts rename x-pack/plugins/canvas/public/state/actions/{workpad.js => workpad.ts} (54%) diff --git a/x-pack/plugins/canvas/public/components/router/index.ts b/x-pack/plugins/canvas/public/components/router/index.ts index 5e014870f5158..fa857c6f0cd3c 100644 --- a/x-pack/plugins/canvas/public/components/router/index.ts +++ b/x-pack/plugins/canvas/public/components/router/index.ts @@ -11,7 +11,6 @@ import { enableAutoplay, setRefreshInterval, setAutoplayInterval, - // @ts-ignore untyped local } from '../../state/actions/workpad'; // @ts-ignore untyped local import { Router as Component } from './router'; diff --git a/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts b/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts index c6dddab3b5dd1..abd40731078ec 100644 --- a/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts +++ b/x-pack/plugins/canvas/public/components/workpad_color_picker/index.ts @@ -5,7 +5,6 @@ */ import { connect } from 'react-redux'; -// @ts-ignore import { addColor, removeColor } from '../../state/actions/workpad'; import { getWorkpadColors } from '../../state/selectors/workpad'; diff --git a/x-pack/plugins/canvas/public/components/workpad_config/index.js b/x-pack/plugins/canvas/public/components/workpad_config/index.ts similarity index 63% rename from x-pack/plugins/canvas/public/components/workpad_config/index.js rename to x-pack/plugins/canvas/public/components/workpad_config/index.ts index 913cf7093e726..e417821fd4f67 100644 --- a/x-pack/plugins/canvas/public/components/workpad_config/index.js +++ b/x-pack/plugins/canvas/public/components/workpad_config/index.ts @@ -7,28 +7,29 @@ import { connect } from 'react-redux'; import { get } from 'lodash'; -import { sizeWorkpad, setName, setWorkpadCSS } from '../../state/actions/workpad'; +import { sizeWorkpad as setSize, setName, setWorkpadCSS } from '../../state/actions/workpad'; import { getWorkpad } from '../../state/selectors/workpad'; import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; import { WorkpadConfig as Component } from './workpad_config'; +import { State } from '../../../types'; -const mapStateToProps = (state) => { +const mapStateToProps = (state: State) => { const workpad = getWorkpad(state); return { - name: get(workpad, 'name'), + name: get(workpad, 'name'), size: { - width: get(workpad, 'width'), - height: get(workpad, 'height'), + width: get(workpad, 'width'), + height: get(workpad, 'height'), }, - css: get(workpad, 'css', DEFAULT_WORKPAD_CSS), + css: get(workpad, 'css', DEFAULT_WORKPAD_CSS), }; }; const mapDispatchToProps = { - setSize: (size) => sizeWorkpad(size), - setName: (name) => setName(name), - setWorkpadCSS: (css) => setWorkpadCSS(css), + setSize, + setName, + setWorkpadCSS, }; export const WorkpadConfig = connect(mapStateToProps, mapDispatchToProps)(Component); diff --git a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js deleted file mode 100644 index 45758c9965653..0000000000000 --- a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.js +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import { - EuiFieldText, - EuiFieldNumber, - EuiBadge, - EuiButtonIcon, - EuiFormRow, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - EuiTitle, - EuiToolTip, - EuiTextArea, - EuiAccordion, - EuiText, - EuiButton, -} from '@elastic/eui'; -import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; -import { ComponentStrings } from '../../../i18n'; - -const { WorkpadConfig: strings } = ComponentStrings; - -export class WorkpadConfig extends PureComponent { - static propTypes = { - size: PropTypes.object.isRequired, - name: PropTypes.string.isRequired, - css: PropTypes.string, - setSize: PropTypes.func.isRequired, - setName: PropTypes.func.isRequired, - setWorkpadCSS: PropTypes.func.isRequired, - }; - - state = { - css: this.props.css, - }; - - render() { - const { size, name, setSize, setName, setWorkpadCSS } = this.props; - const { css } = this.state; - const rotate = () => setSize({ width: size.height, height: size.width }); - - const badges = [ - { - name: '1080p', - size: { height: 1080, width: 1920 }, - }, - { - name: '720p', - size: { height: 720, width: 1280 }, - }, - { - name: 'A4', - size: { height: 842, width: 590 }, - }, - { - name: strings.getUSLetterButtonLabel(), - size: { height: 792, width: 612 }, - }, - ]; - - return ( -

- ); - } -} diff --git a/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx new file mode 100644 index 0000000000000..7b7a1e08b2c5d --- /dev/null +++ b/x-pack/plugins/canvas/public/components/workpad_config/workpad_config.tsx @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FunctionComponent, useState } from 'react'; +import PropTypes from 'prop-types'; +import { + EuiFieldText, + EuiFieldNumber, + EuiBadge, + EuiButtonIcon, + EuiFormRow, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, + EuiToolTip, + EuiTextArea, + EuiAccordion, + EuiText, + EuiButton, +} from '@elastic/eui'; +import { DEFAULT_WORKPAD_CSS } from '../../../common/lib/constants'; +import { ComponentStrings } from '../../../i18n'; + +const { WorkpadConfig: strings } = ComponentStrings; + +interface Props { + size: { + height: number; + width: number; + }; + name: string; + css?: string; + setSize: ({ height, width }: { height: number; width: number }) => void; + setName: (name: string) => void; + setWorkpadCSS: (css: string) => void; +} + +export const WorkpadConfig: FunctionComponent = (props) => { + const [css, setCSS] = useState(props.css); + const { size, name, setSize, setName, setWorkpadCSS } = props; + const rotate = () => setSize({ width: size.height, height: size.width }); + + const badges = [ + { + name: '1080p', + size: { height: 1080, width: 1920 }, + }, + { + name: '720p', + size: { height: 720, width: 1280 }, + }, + { + name: 'A4', + size: { height: 842, width: 590 }, + }, + { + name: strings.getUSLetterButtonLabel(), + size: { height: 792, width: 612 }, + }, + ]; + + return ( +
+
+ +

{strings.getTitle()}

+
+
+ + + + + setName(e.target.value)} /> + + + + + + + + setSize({ width: Number(e.target.value), height: size.height })} + value={size.width} + /> + + + + + + + + + + + + setSize({ height: Number(e.target.value), width: size.width })} + value={size.height} + /> + + + + + + +
+ {badges.map((badge, i) => ( + setSize(badge.size)} + aria-label={strings.getPageSizeBadgeAriaLabel(badge.name)} + onClickAriaLabel={strings.getPageSizeBadgeOnClickAriaLabel(badge.name)} + > + {badge.name} + + ))} +
+ + +
+ + + {strings.getGlobalCSSLabel()} + + + } + > +
+ setCSS(e.target.value)} + rows={10} + /> + + setWorkpadCSS(css || DEFAULT_WORKPAD_CSS)}> + {strings.getApplyStylesheetButtonLabel()} + + +
+
+
+
+ ); +}; + +WorkpadConfig.propTypes = { + size: PropTypes.object.isRequired, + name: PropTypes.string.isRequired, + css: PropTypes.string, + setSize: PropTypes.func.isRequired, + setName: PropTypes.func.isRequired, + setWorkpadCSS: PropTypes.func.isRequired, +}; diff --git a/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts b/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts index e561607cb101e..0765973915f77 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts +++ b/x-pack/plugins/canvas/public/components/workpad_header/view_menu/index.ts @@ -14,13 +14,11 @@ import { State, CanvasWorkpadBoundingBox } from '../../../../types'; import { fetchAllRenderables } from '../../../state/actions/elements'; // @ts-ignore Untyped local import { setZoomScale, setFullscreen, selectToplevelNodes } from '../../../state/actions/transient'; -// @ts-ignore Untyped local import { setWriteable, setRefreshInterval, enableAutoplay, setAutoplayInterval, - // @ts-ignore Untyped local } from '../../../state/actions/workpad'; import { getZoomScale, canUserWrite } from '../../../state/selectors/app'; import { @@ -75,7 +73,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({ }, doRefresh: () => dispatch(fetchAllRenderables()), setRefreshInterval: (interval: number) => dispatch(setRefreshInterval(interval)), - enableAutoplay: (autoplay: number) => dispatch(enableAutoplay(autoplay)), + enableAutoplay: (autoplay: number) => dispatch(enableAutoplay(!!autoplay)), setAutoplayInterval: (interval: number) => dispatch(setAutoplayInterval(interval)), }); diff --git a/x-pack/plugins/canvas/public/lib/create_thunk.ts b/x-pack/plugins/canvas/public/lib/create_thunk.ts new file mode 100644 index 0000000000000..cbcaeeccc8b93 --- /dev/null +++ b/x-pack/plugins/canvas/public/lib/create_thunk.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Dispatch, Action } from 'redux'; +// @ts-ignore untyped dependency +import { createThunk as createThunkFn } from 'redux-thunks/cjs'; +import { State } from '../../types'; + +type CreateThunk = ( + type: string, + fn: ( + params: { type: string; dispatch: Dispatch; getState: () => State }, + ...args: Arguments + ) => void +) => (...args: Arguments) => Action; + +// This declaration exists because redux-thunks is not typed, and has a dependency on +// Canvas State. Therefore, creating a wrapper that strongly-types the function-- and creates +// a single point of replacement, should the need arise-- is a nice workaround. +export const createThunk = createThunkFn as CreateThunk; diff --git a/x-pack/plugins/canvas/public/state/actions/elements.js b/x-pack/plugins/canvas/public/state/actions/elements.js index 47fbc782f90d3..e89e62917da39 100644 --- a/x-pack/plugins/canvas/public/state/actions/elements.js +++ b/x-pack/plugins/canvas/public/state/actions/elements.js @@ -5,10 +5,10 @@ */ import { createAction } from 'redux-actions'; -import { createThunk } from 'redux-thunks/cjs'; import immutable from 'object-path-immutable'; import { get, pick, cloneDeep, without } from 'lodash'; import { toExpression, safeElementFromExpression } from '@kbn/interpreter/common'; +import { createThunk } from '../../lib/create_thunk'; import { getPages, getNodeById, getNodes, getSelectedPageIndex } from '../selectors/workpad'; import { getValue as getResolvedArgsValue } from '../selectors/resolved_args'; import { getDefaultElement } from '../defaults'; diff --git a/x-pack/plugins/canvas/public/state/actions/embeddable.ts b/x-pack/plugins/canvas/public/state/actions/embeddable.ts index e2cf588ec20a9..a153cb7f4354d 100644 --- a/x-pack/plugins/canvas/public/state/actions/embeddable.ts +++ b/x-pack/plugins/canvas/public/state/actions/embeddable.ts @@ -6,8 +6,7 @@ import { Dispatch } from 'redux'; import { createAction } from 'redux-actions'; -// @ts-ignore Untyped -import { createThunk } from 'redux-thunks'; +import { createThunk } from '../../lib/create_thunk'; // @ts-ignore Untyped Local import { fetchRenderable } from './elements'; import { State } from '../../../types'; diff --git a/x-pack/plugins/canvas/public/state/actions/workpad.js b/x-pack/plugins/canvas/public/state/actions/workpad.ts similarity index 54% rename from x-pack/plugins/canvas/public/state/actions/workpad.js rename to x-pack/plugins/canvas/public/state/actions/workpad.ts index 167c156dce998..47df38838f890 100644 --- a/x-pack/plugins/canvas/public/state/actions/workpad.js +++ b/x-pack/plugins/canvas/public/state/actions/workpad.ts @@ -5,26 +5,28 @@ */ import { createAction } from 'redux-actions'; -import { createThunk } from 'redux-thunks/cjs'; import { without, includes } from 'lodash'; +import { createThunk } from '../../lib/create_thunk'; import { getWorkpadColors } from '../selectors/workpad'; +// @ts-ignore import { fetchAllRenderables } from './elements'; +import { CanvasWorkpad } from '../../../types'; -export const sizeWorkpad = createAction('sizeWorkpad'); -export const setName = createAction('setName'); -export const setWriteable = createAction('setWriteable'); -export const setColors = createAction('setColors'); -export const setRefreshInterval = createAction('setRefreshInterval'); -export const setWorkpadCSS = createAction('setWorkpadCSS'); -export const enableAutoplay = createAction('enableAutoplay'); -export const setAutoplayInterval = createAction('setAutoplayInterval'); -export const resetWorkpad = createAction('resetWorkpad'); +export const sizeWorkpad = createAction<{ height: number; width: number }>('sizeWorkpad'); +export const setName = createAction('setName'); +export const setWriteable = createAction('setWriteable'); +export const setColors = createAction('setColors'); +export const setRefreshInterval = createAction('setRefreshInterval'); +export const setWorkpadCSS = createAction('setWorkpadCSS'); +export const enableAutoplay = createAction('enableAutoplay'); +export const setAutoplayInterval = createAction('setAutoplayInterval'); +export const resetWorkpad = createAction('resetWorkpad'); export const initializeWorkpad = createThunk('initializeWorkpad', ({ dispatch }) => { dispatch(fetchAllRenderables()); }); -export const addColor = createThunk('addColor', ({ dispatch, getState }, color) => { +export const addColor = createThunk('addColor', ({ dispatch, getState }, color: string) => { const colors = getWorkpadColors(getState()).slice(0); if (!includes(colors, color)) { colors.push(color); @@ -32,16 +34,20 @@ export const addColor = createThunk('addColor', ({ dispatch, getState }, color) dispatch(setColors(colors)); }); -export const removeColor = createThunk('removeColor', ({ dispatch, getState }, color) => { +export const removeColor = createThunk('removeColor', ({ dispatch, getState }, color: string) => { dispatch(setColors(without(getWorkpadColors(getState()), color))); }); export const setWorkpad = createThunk( 'setWorkpad', - ({ dispatch, type }, workpad, { loadPages = true } = {}) => { + ( + { dispatch, type }, + workpad: CanvasWorkpad, + { loadPages = true }: { loadPages?: boolean } = {} + ) => { dispatch(createAction(type)(workpad)); // set the workpad object in state if (loadPages) { dispatch(initializeWorkpad()); - } // load all the elements on the workpad + } } ); From 91e4fd46f46e6fc2df229bb51ad9e7cf432ea0c4 Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Tue, 9 Jun 2020 11:54:37 -0500 Subject: [PATCH 04/19] Enable exhaustive-deps; correct any lint warnings (#68453) Co-authored-by: Elastic Machine --- .eslintrc.js | 1 - .../workpad/workpad_app/workpad_telemetry.tsx | 16 +++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index c33f4de15b919..3cac46e7d2605 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -91,7 +91,6 @@ module.exports = { { files: ['x-pack/plugins/canvas/**/*.{js,ts,tsx}'], rules: { - 'react-hooks/exhaustive-deps': 'off', 'jsx-a11y/click-events-have-key-events': 'off', }, }, diff --git a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx index 47b461f22ad65..3014369d94857 100644 --- a/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx +++ b/x-pack/plugins/canvas/public/apps/workpad/workpad_app/workpad_telemetry.tsx @@ -69,6 +69,7 @@ export const withUnconnectedElementsLoadedTelemetry =

( ) => function ElementsLoadedTelemetry(props: ElementsLoadedTelemetryProps) { const { telemetryElementCounts, workpad, telemetryResolvedArgs, ...other } = props; + const { error, pending } = telemetryElementCounts; const [currentWorkpadId, setWorkpadId] = useState(undefined); const [hasReported, setHasReported] = useState(false); @@ -87,27 +88,20 @@ export const withUnconnectedElementsLoadedTelemetry =

( 0 ); - if ( - workpadElementCount === 0 || - (resolvedArgsAreForWorkpad && telemetryElementCounts.pending === 0) - ) { + if (workpadElementCount === 0 || (resolvedArgsAreForWorkpad && pending === 0)) { setHasReported(true); } else { setHasReported(false); } - } else if ( - !hasReported && - telemetryElementCounts.pending === 0 && - resolvedArgsAreForWorkpad - ) { - if (telemetryElementCounts.error > 0) { + } else if (!hasReported && pending === 0 && resolvedArgsAreForWorkpad) { + if (error > 0) { trackMetric(METRIC_TYPE.LOADED, [WorkpadLoadedMetric, WorkpadLoadedWithErrorsMetric]); } else { trackMetric(METRIC_TYPE.LOADED, WorkpadLoadedMetric); } setHasReported(true); } - }); + }, [currentWorkpadId, hasReported, error, pending, telemetryResolvedArgs, workpad]); return ; }; From 45c81ce1ab778488d839000ade4e1eae8181c342 Mon Sep 17 00:00:00 2001 From: Spencer Date: Tue, 9 Jun 2020 10:41:41 -0700 Subject: [PATCH 05/19] run page_load_metrics tests in visual regresssion jobs (#68570) Co-authored-by: spalger --- test/scripts/jenkins_visual_regression.sh | 3 +-- test/scripts/jenkins_xpack_visual_regression.sh | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/scripts/jenkins_visual_regression.sh b/test/scripts/jenkins_visual_regression.sh index c6fefd45b005d..a32782deec65b 100755 --- a/test/scripts/jenkins_visual_regression.sh +++ b/test/scripts/jenkins_visual_regression.sh @@ -11,8 +11,7 @@ mkdir -p "$installDir" tar -xzf "$linuxBuild" -C "$installDir" --strip=1 echo " -> running visual regression tests from kibana directory" -checks-reporter-with-killswitch "X-Pack visual regression tests" \ - yarn percy exec -t 500 -- -- \ +yarn percy exec -t 500 -- -- \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$installDir" \ diff --git a/test/scripts/jenkins_xpack_visual_regression.sh b/test/scripts/jenkins_xpack_visual_regression.sh index 96521ccc8f787..e406bb3e6106f 100755 --- a/test/scripts/jenkins_xpack_visual_regression.sh +++ b/test/scripts/jenkins_xpack_visual_regression.sh @@ -13,9 +13,11 @@ tar -xzf "$linuxBuild" -C "$installDir" --strip=1 echo " -> running visual regression tests from x-pack directory" cd "$XPACK_DIR" -checks-reporter-with-killswitch "X-Pack visual regression tests" \ - yarn percy exec -t 500 -- -- \ +yarn percy exec -t 500 -- -- \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$installDir" \ --config test/visual_regression/config.ts; + +cd "$KIBANA_DIR" +source "test/scripts/jenkins_xpack_page_load_metrics.sh" From 14410e0c79bdced1e402c3a303729f7328207efb Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Tue, 9 Jun 2020 13:47:00 -0400 Subject: [PATCH 06/19] [Endpoint] Re-enable Functional test case for Endpoint related pages (#68445) * Improve Policy test service provider - Added `getFullAgentConfig()` to Endpoint Policy Test data provider service * enable Policy List functional tests * Added Policy Details Tests * Add test ids to policy detail Max and Linux forms * Added page objects utilities and moved `clickOnEuiCheckbox` there --- .../pages/policy/view/policy_details.tsx | 14 +- .../view/policy_forms/events/checkbox.tsx | 17 +- .../policy/view/policy_forms/events/linux.tsx | 1 + .../policy/view/policy_forms/events/mac.tsx | 1 + .../view/policy_forms/events/windows.tsx | 1 + x-pack/scripts/functional_tests.js | 1 + .../{host_list.ts => endpoint_list.ts} | 43 ++-- .../feature_controls/endpoint_spaces.ts | 76 ------ .../apps/endpoint/feature_controls/index.ts | 13 - .../apps/endpoint/header_nav.ts | 55 ----- .../apps/endpoint/index.ts | 11 +- .../apps/endpoint/landing_page.ts | 29 --- .../apps/endpoint/policy_details.ts | 225 ++++++++++++++++++ .../apps/endpoint/policy_list.ts | 46 ++-- .../page_objects/endpoint_page.ts | 17 +- .../functional_endpoint/page_objects/index.ts | 4 + .../page_objects/page_utils.ts | 30 +++ .../page_objects/policy_page.ts | 59 +++++ .../services/endpoint_policy.ts | 163 +++++++++---- 19 files changed, 522 insertions(+), 284 deletions(-) rename x-pack/test/functional_endpoint/apps/endpoint/{host_list.ts => endpoint_list.ts} (84%) delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts delete mode 100644 x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts create mode 100644 x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts create mode 100644 x-pack/test/functional_endpoint/page_objects/page_utils.ts create mode 100644 x-pack/test/functional_endpoint/page_objects/policy_page.ts diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index f4c4b36ce153f..d1f7da91bd6fa 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -68,11 +68,13 @@ export const PolicyDetails = React.memo(() => { } ), body: ( - + + + ), }); } else { @@ -116,7 +118,7 @@ export const PolicyDetails = React.memo(() => { ) : policyApiError ? ( - {policyApiError?.message} + {policyApiError?.message} ) : null} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx index e5f3b2c7e8b7e..9ceade5d0264c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/checkbox.tsx @@ -5,23 +5,25 @@ */ import React, { useCallback, useMemo } from 'react'; -import { EuiCheckbox, htmlIdGenerator } from '@elastic/eui'; +import { EuiCheckbox, EuiCheckboxProps, htmlIdGenerator } from '@elastic/eui'; import { useDispatch } from 'react-redux'; - import { usePolicyDetailsSelector } from '../../policy_hooks'; import { policyConfig } from '../../../store/policy_details/selectors'; import { PolicyDetailsAction } from '../../../store/policy_details'; import { UIPolicyConfig } from '../../../../../../../common/endpoint/types'; +type EventsCheckboxProps = Omit & { + name: string; + setter: (config: UIPolicyConfig, checked: boolean) => UIPolicyConfig; + getter: (config: UIPolicyConfig) => boolean; +}; + export const EventsCheckbox = React.memo(function ({ name, setter, getter, -}: { - name: string; - setter: (config: UIPolicyConfig, checked: boolean) => UIPolicyConfig; - getter: (config: UIPolicyConfig) => boolean; -}) { + ...otherProps +}: EventsCheckboxProps) { const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); const selected = getter(policyDetailsConfig); const dispatch = useDispatch<(action: PolicyDetailsAction) => void>(); @@ -44,6 +46,7 @@ export const EventsCheckbox = React.memo(function ({ label={name} checked={selected} onChange={handleCheckboxChange} + {...otherProps} /> ); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx index d0ddd5cb6fe2f..d7bae0d2e6bad 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/linux.tsx @@ -73,6 +73,7 @@ export const LinuxEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx index e2d6b70d33415..37709ff608857 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/mac.tsx @@ -73,6 +73,7 @@ export const MacEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx index 23f33cb6fd86f..3c7ecae0d9b4e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/events/windows.tsx @@ -113,6 +113,7 @@ export const WindowsEvents = React.memo(() => { setIn(config)(item.os)('events')(item.protectionField)(checked) } diff --git a/x-pack/scripts/functional_tests.js b/x-pack/scripts/functional_tests.js index 4392299a78e72..c120e1f780761 100644 --- a/x-pack/scripts/functional_tests.js +++ b/x-pack/scripts/functional_tests.js @@ -6,6 +6,7 @@ const alwaysImportedTests = [ require.resolve('../test/functional/config.js'), + require.resolve('../test/functional_endpoint/config.ts'), require.resolve('../test/functional_with_es_ssl/config.ts'), require.resolve('../test/functional/config_security_basic.ts'), require.resolve('../test/functional/config_security_trial.ts'), diff --git a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts b/x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts similarity index 84% rename from x-pack/test/functional_endpoint/apps/endpoint/host_list.ts rename to x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts index 029953f113a9c..c5338e2a35765 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/host_list.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/endpoint_list.ts @@ -13,68 +13,71 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const testSubjects = getService('testSubjects'); // FLAKY: https://github.com/elastic/kibana/issues/63621 - describe.skip('host list', function () { + describe.skip('endpoint list', function () { this.tags('ciGroup7'); const sleep = (ms = 100) => new Promise((resolve) => setTimeout(resolve, ms)); before(async () => { await esArchiver.load('endpoint/metadata/api_feature'); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts'); - await pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.endpoint.navigateToEndpointList(); }); it('finds title', async () => { - const title = await testSubjects.getVisibleText('hostListTitle'); - expect(title).to.equal('Hosts'); + const title = await testSubjects.getVisibleText('pageViewHeaderLeftTitle'); + expect(title).to.equal('Endpoints'); }); it('displays table data', async () => { const expectedData = [ [ 'Hostname', + 'Host Status', 'Policy', 'Policy Status', 'Alerts', 'Operating System', 'IP Address', - 'Sensor Version', + 'Version', 'Last Active', ], [ 'cadmann-4.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.192.213.130, 10.70.28.129', - 'version', - 'xxxx', + '6.6.1', + 'Jan 24, 2020 @ 16:06:09.541', ], [ 'thurlow-9.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.46.229.234', - 'version', - 'xxxx', + '6.0.0', + 'Jan 24, 2020 @ 16:06:09.541', ], [ 'rezzani-7.example.com', + 'Error', 'Policy Name', 'Policy Status', '0', 'windows 10.0', '10.101.149.26, 2606:a000:ffc0:39:11ef:37b9:3371:578c', - 'version', - 'xxxx', + '6.8.0', + 'Jan 24, 2020 @ 16:06:09.541', ], ]; const tableData = await pageObjects.endpoint.getEndpointAppTableData('hostListTable'); expect(tableData).to.eql(expectedData); }); - it('no details flyout when host page displayed', async () => { + it('no details flyout when endpoint page displayed', async () => { await testSubjects.missingOrFail('hostDetailsFlyout'); }); @@ -108,22 +111,21 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await (await testSubjects.findAll('hostnameCellLink'))[1].click(); await sleep(500); // give page time to refresh and verify it did not change const hostDetailTitleNew = await testSubjects.getVisibleText('hostDetailsFlyoutTitle'); - expect(hostDetailTitleNew).to.eql(hostDetailTitleInitial); + expect(hostDetailTitleNew).to.equal(hostDetailTitleInitial); }); describe('no data', () => { before(async () => { // clear out the data and reload the page await esArchiver.unload('endpoint/metadata/api_feature'); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts'); - await pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.endpoint.navigateToEndpointList(); }); after(async () => { // reload the data so the other tests continue to pass await esArchiver.load('endpoint/metadata/api_feature'); }); it('displays no items found when empty', async () => { - // get the host list table data and verify message + // get the endpoint list table data and verify message const [, [noItemsFoundMessage]] = await pageObjects.endpoint.getEndpointAppTableData( 'hostListTable' ); @@ -133,12 +135,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('has a url with a host id', () => { before(async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory( - 'endpoint', - '/hosts', + await pageObjects.endpoint.navigateToEndpointList( 'selected_host=fc0ff548-feba-41b6-8367-65e8790d0eaf' ); - await pageObjects.header.waitUntilLoadingHasFinished(); }); it('shows a flyout', async () => { @@ -168,7 +167,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { '', '0', '00000000-0000-0000-0000-000000000000', - 'Successful', + 'Unknown', '10.101.149.262606:a000:ffc0:39:11ef:37b9:3371:578c', 'rezzani-7.example.com', '6.8.0', diff --git a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts b/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts deleted file mode 100644 index 27fabb515757a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/endpoint_spaces.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getPageObjects, getService }: FtrProviderContext) { - const pageObjects = getPageObjects(['common']); - const spacesService = getService('spaces'); - const testSubjects = getService('testSubjects'); - const appsMenu = getService('appsMenu'); - - describe('spaces', () => { - describe('space with no features disabled', () => { - before(async () => { - await spacesService.create({ - id: 'custom_space', - name: 'custom_space', - disabledFeatures: [], - }); - }); - - after(async () => { - await spacesService.delete('custom_space'); - }); - - it('shows endpoint navlink', async () => { - await pageObjects.common.navigateToApp('home', { - basePath: '/s/custom_space', - }); - const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).to.contain('Endpoint'); - }); - - it(`endpoint app shows 'Hello World'`, async () => { - await pageObjects.common.navigateToApp('endpoint', { - basePath: '/s/custom_space', - }); - await testSubjects.existOrFail('welcomeTitle'); - }); - - it(`endpoint hosts shows hosts lists page`, async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/hosts', undefined, { - basePath: '/s/custom_space', - ensureCurrentUrl: false, - shouldLoginIfPrompted: false, - }); - await testSubjects.existOrFail('hostPage'); - }); - }); - - describe('space with endpoint disabled', () => { - before(async () => { - await spacesService.create({ - id: 'custom_space', - name: 'custom_space', - disabledFeatures: ['endpoint'], - }); - }); - - after(async () => { - await spacesService.delete('custom_space'); - }); - - it(`doesn't show endpoint navlink`, async () => { - await pageObjects.common.navigateToApp('home', { - basePath: '/s/custom_space', - }); - const navLinks = (await appsMenu.readLinks()).map((link) => link.text); - expect(navLinks).not.to.contain('Endpoint'); - }); - }); - }); -} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts b/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts deleted file mode 100644 index da0919d7c39f3..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/feature_controls/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ loadTestFile }: FtrProviderContext) { - describe('feature controls', function () { - this.tags('skipFirefox'); - loadTestFile(require.resolve('./endpoint_spaces')); - }); -} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts b/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts deleted file mode 100644 index 48cdd6aec5b1a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/header_nav.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'endpoint']); - const testSubjects = getService('testSubjects'); - - describe('Header nav', function () { - this.tags('ciGroup7'); - before(async () => { - await pageObjects.common.navigateToApp('endpoint'); - }); - - it('renders the tabs when the app loads', async () => { - const homeTabText = await testSubjects.getVisibleText('homeEndpointTab'); - const hostsTabText = await testSubjects.getVisibleText('hostsEndpointTab'); - const alertsTabText = await testSubjects.getVisibleText('alertsEndpointTab'); - const policiesTabText = await testSubjects.getVisibleText('policiesEndpointTab'); - - expect(homeTabText.trim()).to.be('Home'); - expect(hostsTabText.trim()).to.be('Hosts'); - expect(alertsTabText.trim()).to.be('Alerts'); - expect(policiesTabText.trim()).to.be('Policies'); - }); - - it('renders the hosts page when the Hosts tab is selected', async () => { - await (await testSubjects.find('hostsEndpointTab')).click(); - await testSubjects.existOrFail('hostPage'); - }); - - it('renders the alerts page when the Alerts tab is selected', async () => { - await (await testSubjects.find('alertsEndpointTab')).click(); - await testSubjects.existOrFail('alertListPage'); - }); - - it('renders the policy page when Policy tab is selected', async () => { - await (await testSubjects.find('policiesEndpointTab')).click(); - await testSubjects.existOrFail('policyListPage'); - }); - - it('renders the home page when Home tab is selected after selecting another tab', async () => { - await (await testSubjects.find('hostsEndpointTab')).click(); - await testSubjects.existOrFail('hostPage'); - - await (await testSubjects.find('homeEndpointTab')).click(); - await testSubjects.existOrFail('welcomeTitle'); - }); - }); -}; diff --git a/x-pack/test/functional_endpoint/apps/endpoint/index.ts b/x-pack/test/functional_endpoint/apps/endpoint/index.ts index 296ee45ff181c..199d138d1c450 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/index.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/index.ts @@ -9,12 +9,11 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('endpoint', function () { this.tags('ciGroup7'); - loadTestFile(require.resolve('./feature_controls')); - loadTestFile(require.resolve('./landing_page')); - loadTestFile(require.resolve('./header_nav')); - loadTestFile(require.resolve('./host_list')); + loadTestFile(require.resolve('./endpoint_list')); loadTestFile(require.resolve('./policy_list')); - loadTestFile(require.resolve('./alerts')); - loadTestFile(require.resolve('./resolver')); + loadTestFile(require.resolve('./policy_details')); + + // loadTestFile(require.resolve('./alerts')); + // loadTestFile(require.resolve('./resolver')); }); } diff --git a/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts b/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts deleted file mode 100644 index f2a55df56421a..0000000000000 --- a/x-pack/test/functional_endpoint/apps/endpoint/landing_page.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default ({ getPageObjects, getService }: FtrProviderContext) => { - const pageObjects = getPageObjects(['common', 'endpoint']); - const testSubjects = getService('testSubjects'); - - describe('Endpoint landing page', function () { - this.tags('ciGroup7'); - before(async () => { - await pageObjects.common.navigateToApp('endpoint'); - }); - - it('Loads the endpoint app', async () => { - const welcomeEndpointMessage = await pageObjects.endpoint.welcomeEndpointTitle(); - expect(welcomeEndpointMessage).to.be('Hello World'); - }); - - it('Does not display a toast indicating that the ingest manager failed to initialize', async () => { - await testSubjects.missingOrFail('euiToastHeader'); - }); - }); -}; diff --git a/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts new file mode 100644 index 0000000000000..25fb477b5a99a --- /dev/null +++ b/x-pack/test/functional_endpoint/apps/endpoint/policy_details.ts @@ -0,0 +1,225 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const pageObjects = getPageObjects(['common', 'endpoint', 'policy', 'endpointPageUtils']); + const testSubjects = getService('testSubjects'); + const policyTestResources = getService('policyTestResources'); + + describe('When on the Endpoint Policy Details Page', function () { + this.tags(['ciGroup7']); + + describe('with an invalid policy id', () => { + it('should display an error', async () => { + await pageObjects.policy.navigateToPolicyDetails('invalid-id'); + await testSubjects.existOrFail('policyDetailsIdNotFoundMessage'); + expect(await testSubjects.getVisibleText('policyDetailsIdNotFoundMessage')).to.equal( + 'Saved object [ingest-datasources/invalid-id] not found' + ); + }); + }); + + describe('with a valid policy id', () => { + let policyInfo: PolicyTestResourceInfo; + + before(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + }); + + after(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }); + + it('should display policy view', async () => { + expect(await testSubjects.getVisibleText('pageViewHeaderLeftTitle')).to.equal( + policyInfo.datasource.name + ); + }); + }); + + describe('and the save button is clicked', () => { + let policyInfo: PolicyTestResourceInfo; + + beforeEach(async () => { + policyInfo = await policyTestResources.createPolicy(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + }); + + afterEach(async () => { + if (policyInfo) { + await policyInfo.cleanup(); + } + }); + + it('should display success toast on successful save', async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + expect(await testSubjects.getVisibleText('policyDetailsSuccessMessage')).to.equal( + `Policy ${policyInfo.datasource.name} has been updated.` + ); + }); + it('should persist update on the screen', async () => { + await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_process'); + await pageObjects.policy.confirmAndSave(); + + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + await pageObjects.policy.navigateToPolicyList(); + await pageObjects.policy.navigateToPolicyDetails(policyInfo.datasource.id); + + expect(await (await testSubjects.find('policyWindowsEvent_process')).isSelected()).to.equal( + false + ); + }); + it('should have updated policy data in overall agent configuration', async () => { + // This test ensures that updates made to the Endpoint Policy are carried all the way through + // to the generated Agent Configuration that is dispatch down to the Elastic Agent. + + await Promise.all([ + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_file'), + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyLinuxEvent_file'), + pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyMacEvent_file'), + ]); + await pageObjects.policy.confirmAndSave(); + await testSubjects.existOrFail('policyDetailsSuccessMessage'); + + const agentFullConfig = await policyTestResources.getFullAgentConfig( + policyInfo.agentConfig.id + ); + + expect(agentFullConfig).to.eql({ + datasources: [ + { + enabled: true, + id: policyInfo.datasource.id, + inputs: [ + { + enabled: true, + policy: { + linux: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + file: false, + network: true, + process: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + }, + mac: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + file: false, + network: true, + process: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + malware: { + mode: 'detect', + }, + }, + windows: { + advanced: { + elasticsearch: { + indices: { + control: 'control-index', + event: 'event-index', + logging: 'logging-index', + }, + kernel: { + connect: true, + process: true, + }, + }, + }, + events: { + dll_and_driver_load: true, + dns: true, + file: false, + network: true, + process: true, + registry: true, + security: true, + }, + logging: { + file: 'info', + stdout: 'debug', + }, + malware: { + mode: 'prevent', + }, + }, + }, + streams: [], + type: 'endpoint', + }, + ], + name: 'Protect East Coast', + namespace: 'default', + package: { + name: 'endpoint', + version: policyInfo.packageInfo.version, + }, + use_output: 'default', + }, + ], + id: policyInfo.agentConfig.id, + outputs: { + default: { + hosts: ['http://localhost:9200'], + type: 'elasticsearch', + }, + }, + revision: 3, + settings: { + monitoring: { + enabled: false, + logs: false, + metrics: false, + }, + }, + }); + }); + }); + }); +} diff --git a/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts b/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts index 11b1b8e718ff7..9f87f884b327e 100644 --- a/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts +++ b/x-pack/test/functional_endpoint/apps/endpoint/policy_list.ts @@ -8,15 +8,15 @@ import { FtrProviderContext } from '../../ftr_provider_context'; import { PolicyTestResourceInfo } from '../../services/endpoint_policy'; export default function ({ getPageObjects, getService }: FtrProviderContext) { - const pageObjects = getPageObjects(['common', 'endpoint']); + const pageObjects = getPageObjects(['common', 'endpoint', 'policy']); const testSubjects = getService('testSubjects'); const policyTestResources = getService('policyTestResources'); + const RELATIVE_DATE_FORMAT = /\d (?:seconds|minutes) ago/i; - // FLAKY: https://github.com/elastic/kibana/issues/66579 - describe.skip('When on the Endpoint Policy List', function () { + describe('When on the Endpoint Policy List', function () { this.tags(['ciGroup7']); before(async () => { - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/policy'); + await pageObjects.policy.navigateToPolicyList(); }); it('loads the Policy List Page', async () => { @@ -34,10 +34,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const allHeaderCells = await pageObjects.endpoint.tableHeaderVisibleText('policyTable'); expect(allHeaderCells).to.eql([ 'Policy Name', - 'Revision', + 'Created By', + 'Created Date', + 'Last Updated By', + 'Last Updated', 'Version', - 'Description', - 'Agent Configuration', + 'Actions', ]); }); it('should show empty table results message', async () => { @@ -47,13 +49,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(noItemsFoundMessage).to.equal('No items found'); }); - xdescribe('and policies exists', () => { + describe('and policies exists', () => { let policyInfo: PolicyTestResourceInfo; before(async () => { // load/create a policy and then navigate back to the policy view so that the list is refreshed policyInfo = await policyTestResources.createPolicy(); - await pageObjects.common.navigateToUrlWithBrowserHistory('endpoint', '/policy'); + await pageObjects.policy.navigateToPolicyList(); await pageObjects.endpoint.waitForTableToHaveData('policyTable'); }); after(async () => { @@ -64,26 +66,24 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('should show policy on the list', async () => { const [, policyRow] = await pageObjects.endpoint.getEndpointAppTableData('policyTable'); - expect(policyRow).to.eql([ - 'Protect East Coast', - '1', - 'Elastic Endpoint v1.0.0', - 'Protect the worlds data - but in the East Coast', - policyInfo.agentConfig.id, + // Validate row data with the exception of the Date columns - since those are initially + // shown as relative. + expect([policyRow[0], policyRow[1], policyRow[3], policyRow[5], policyRow[6]]).to.eql([ + 'Protect East Coastrev. 1', + 'elastic', + 'elastic', + `${policyInfo.datasource.package?.title} v${policyInfo.datasource.package?.version}`, + '', ]); + [policyRow[2], policyRow[4]].forEach((relativeDate) => { + expect(relativeDate).to.match(RELATIVE_DATE_FORMAT); + }); }); it('should show policy name as link', async () => { const policyNameLink = await testSubjects.find('policyNameLink'); expect(await policyNameLink.getTagName()).to.equal('a'); expect(await policyNameLink.getAttribute('href')).to.match( - new RegExp(`\/endpoint\/policy\/${policyInfo.datasource.id}$`) - ); - }); - it('should show agent configuration as link', async () => { - const agentConfigLink = await testSubjects.find('agentConfigLink'); - expect(await agentConfigLink.getTagName()).to.equal('a'); - expect(await agentConfigLink.getAttribute('href')).to.match( - new RegExp(`\/app\/ingestManager\#\/configs\/${policyInfo.datasource.config_id}$`) + new RegExp(`\/management\/policy\/${policyInfo.datasource.id}$`) ); }); }); diff --git a/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts b/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts index 7f78bd6b804f7..3234169e7265e 100644 --- a/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts +++ b/x-pack/test/functional_endpoint/page_objects/endpoint_page.ts @@ -7,11 +7,22 @@ import { WebElementWrapper } from 'test/functional/services/lib/web_element_wrapper'; import { FtrProviderContext } from '../ftr_provider_context'; -export function EndpointPageProvider({ getService }: FtrProviderContext) { +export function EndpointPageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); + const pageObjects = getPageObjects(['common', 'header']); const retry = getService('retry'); return { + /** + * Navigate to the Endpoints list page + */ + async navigateToEndpointList(searchParams?: string) { + await pageObjects.common.navigateToApp('securitySolution', { + hash: `/management/endpoints${searchParams ? `?${searchParams}` : ''}`, + }); + await pageObjects.header.waitUntilLoadingHasFinished(); + }, + /** * Finds the Table with the given `selector` (test subject) and returns * back an array containing the table's header column text @@ -31,10 +42,6 @@ export function EndpointPageProvider({ getService }: FtrProviderContext) { ); }, - async welcomeEndpointTitle() { - return await testSubjects.getVisibleText('welcomeTitle'); - }, - /** * Finds a table and returns the data in a nested array with row 0 is the headers if they exist. * It uses euiTableCellContent to avoid poluting the array data with the euiTableRowCell__mobileHeader data. diff --git a/x-pack/test/functional_endpoint/page_objects/index.ts b/x-pack/test/functional_endpoint/page_objects/index.ts index 8138ce2eeccb3..5b550bea5b55d 100644 --- a/x-pack/test/functional_endpoint/page_objects/index.ts +++ b/x-pack/test/functional_endpoint/page_objects/index.ts @@ -7,9 +7,13 @@ import { pageObjects as xpackFunctionalPageObjects } from '../../functional/page_objects'; import { EndpointPageProvider } from './endpoint_page'; import { EndpointAlertsPageProvider } from './endpoint_alerts_page'; +import { EndpointPolicyPageProvider } from './policy_page'; +import { EndpointPageUtils } from './page_utils'; export const pageObjects = { ...xpackFunctionalPageObjects, endpoint: EndpointPageProvider, + policy: EndpointPolicyPageProvider, + endpointPageUtils: EndpointPageUtils, endpointAlerts: EndpointAlertsPageProvider, }; diff --git a/x-pack/test/functional_endpoint/page_objects/page_utils.ts b/x-pack/test/functional_endpoint/page_objects/page_utils.ts new file mode 100644 index 0000000000000..daf66464f7e1e --- /dev/null +++ b/x-pack/test/functional_endpoint/page_objects/page_utils.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +export function EndpointPageUtils({ getService }: FtrProviderContext) { + const find = getService('find'); + + return { + /** + * Finds a given EuiCheckbox by test subject and clicks on it + * + * @param euiCheckBoxTestId + */ + async clickOnEuiCheckbox(euiCheckBoxTestId: string) { + // This utility is needed because EuiCheckbox forwards the test subject on to + // the actual `` which is not actually visible/accessible on the page. + // In order to actually cause the state of the checkbox to change, the `

@@ -19,7 +24,16 @@ exports[`CertStatus renders expected elements for valid props 1`] = ` class="euiFlexItem euiFlexItem--flexGrowZero" > - OK + OK +
+
+ for 4 months +
+
diff --git a/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx b/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx index e7a86ce98fa3c..ea0a49a4a6c5b 100644 --- a/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx +++ b/x-pack/plugins/uptime/public/components/certificates/cert_status.tsx @@ -5,45 +5,95 @@ */ import React from 'react'; -import { EuiHealth } from '@elastic/eui'; +import moment from 'moment'; +import styled from 'styled-components'; +import { EuiHealth, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { useSelector } from 'react-redux'; import { Cert } from '../../../common/runtime_types'; import { useCertStatus } from '../../hooks'; import * as labels from './translations'; import { CERT_STATUS } from '../../../common/constants'; +import { selectDynamicSettings } from '../../state/selectors'; interface Props { cert: Cert; } +const DateText = styled(EuiText)` + display: inline-block; + margin-left: 5px; +`; + export const CertStatus: React.FC = ({ cert }) => { const certStatus = useCertStatus(cert?.not_after, cert?.not_before); + const dss = useSelector(selectDynamicSettings); + + const relativeDate = moment(cert?.not_after).fromNow(); + if (certStatus === CERT_STATUS.EXPIRING_SOON) { return ( - {labels.EXPIRES_SOON} + + {labels.EXPIRES_SOON} + {' '} + + {relativeDate} + + ); } if (certStatus === CERT_STATUS.EXPIRED) { return ( - {labels.EXPIRED} + + {labels.EXPIRED} + {' '} + + {relativeDate} + + ); } if (certStatus === CERT_STATUS.TOO_OLD) { + const ageThreshold = dss.settings?.certAgeThreshold; + + const oldRelativeDate = moment(cert?.not_before).add(ageThreshold, 'days').fromNow(); + return ( - {labels.TOO_OLD} + + {labels.TOO_OLD} + + {oldRelativeDate} + + ); } + const okRelativeDate = moment(cert?.not_after).fromNow(true); + return ( - {labels.OK} + + {labels.OK} + {' '} + + + + ); }; From ee5284e7fd6c04d24416fc04f8362c2bc0046982 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Tue, 9 Jun 2020 14:24:47 -0400 Subject: [PATCH 08/19] [Component templates] Table view (#68031) --- .../plugins/index_management/common/index.ts | 2 +- .../component_template_serialization.test.ts | 94 ++++++++ .../lib/component_template_serialization.ts | 86 ++++++++ .../index_management/common/lib/index.ts | 5 + .../common/types/component_templates.ts | 39 ++++ .../index_management/common/types/index.ts | 2 + .../common/types/templates.ts | 5 + .../public/application/app.tsx | 6 +- .../component_template_list.test.ts | 174 +++++++++++++++ .../component_template_list.helpers.ts | 95 ++++++++ .../helpers/http_requests.ts | 52 +++++ .../client_integration/helpers/index.ts | 15 ++ .../helpers/setup_environment.tsx | 45 ++++ .../component_template_list.tsx | 75 +++++++ .../component_template_list/delete_modal.tsx | 128 +++++++++++ .../component_template_list/empty_prompt.tsx | 43 ++++ .../component_template_list/error.tsx | 38 ++++ .../component_template_list/index.ts | 7 + .../component_template_list/table.tsx | 205 ++++++++++++++++++ .../component_templates_context.tsx | 63 ++++++ .../component_templates/constants.ts | 10 + .../components/component_templates/index.ts | 11 + .../components/component_templates/lib/api.ts | 44 ++++ .../component_templates/lib/documentation.ts | 16 ++ .../component_templates/lib/index.ts | 11 + .../component_templates/lib/request.ts | 31 +++ .../component_templates/shared_imports.ts | 15 ++ .../components/component_templates/types.ts | 17 ++ .../public/application/components/index.ts | 1 + .../public/application/index.tsx | 18 +- .../public/application/sections/home/home.tsx | 29 ++- .../public/application/sections/home/index.ts | 2 +- .../server/client/elasticsearch.ts | 11 + .../routes/api/component_templates/get.ts | 34 ++- .../index_management/component_templates.ts | 10 +- .../apps/index_management/home_page.ts | 17 ++ .../page_objects/index_management_page.ts | 2 +- 37 files changed, 1436 insertions(+), 22 deletions(-) create mode 100644 x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts create mode 100644 x-pack/plugins/index_management/common/lib/component_template_serialization.ts create mode 100644 x-pack/plugins/index_management/common/types/component_templates.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/constants.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts create mode 100644 x-pack/plugins/index_management/public/application/components/component_templates/types.ts diff --git a/x-pack/plugins/index_management/common/index.ts b/x-pack/plugins/index_management/common/index.ts index 3792e322ae40b..4ad428744deab 100644 --- a/x-pack/plugins/index_management/common/index.ts +++ b/x-pack/plugins/index_management/common/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export { PLUGIN, API_BASE_PATH, CREATE_LEGACY_TEMPLATE_BY_DEFAULT } from './constants'; +export { PLUGIN, API_BASE_PATH, CREATE_LEGACY_TEMPLATE_BY_DEFAULT, BASE_PATH } from './constants'; export { getTemplateParameter } from './lib'; diff --git a/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts b/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts new file mode 100644 index 0000000000000..eaa7f24017a2f --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/component_template_serialization.test.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { deserializeComponentTemplate } from './component_template_serialization'; + +describe('deserializeComponentTemplate', () => { + test('deserializes a component template', () => { + expect( + deserializeComponentTemplate( + { + name: 'my_component_template', + component_template: { + version: 1, + _meta: { + serialization: { + id: 10, + class: 'MyComponentTemplate', + }, + description: 'set number of shards to one', + }, + template: { + settings: { + number_of_shards: 1, + }, + mappings: { + _source: { + enabled: false, + }, + properties: { + host_name: { + type: 'keyword', + }, + created_at: { + type: 'date', + format: 'EEE MMM dd HH:mm:ss Z yyyy', + }, + }, + }, + }, + }, + }, + [ + { + name: 'my_index_template', + index_template: { + index_patterns: ['foo'], + template: { + settings: { + number_of_replicas: 2, + }, + }, + composed_of: ['my_component_template'], + }, + }, + ] + ) + ).toEqual({ + name: 'my_component_template', + version: 1, + _meta: { + serialization: { + id: 10, + class: 'MyComponentTemplate', + }, + description: 'set number of shards to one', + }, + template: { + settings: { + number_of_shards: 1, + }, + mappings: { + _source: { + enabled: false, + }, + properties: { + host_name: { + type: 'keyword', + }, + created_at: { + type: 'date', + format: 'EEE MMM dd HH:mm:ss Z yyyy', + }, + }, + }, + }, + _kbnMeta: { + usedBy: ['my_index_template'], + }, + }); + }); +}); diff --git a/x-pack/plugins/index_management/common/lib/component_template_serialization.ts b/x-pack/plugins/index_management/common/lib/component_template_serialization.ts new file mode 100644 index 0000000000000..0db81bf81d300 --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/component_template_serialization.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { + TemplateFromEs, + ComponentTemplateFromEs, + ComponentTemplateDeserialized, + ComponentTemplateListItem, +} from '../types'; + +const hasEntries = (data: object = {}) => Object.entries(data).length > 0; + +/** + * Normalize a list of component templates to a map where each key + * is a component template name, and the value is an array of index templates name using it + * + * @example + * + { + "comp-1": [ + "template-1", + "template-2" + ], + "comp2": [ + "template-1", + "template-2" + ] + } + * + * @param indexTemplatesEs List of component templates + */ + +const getIndexTemplatesToUsedBy = (indexTemplatesEs: TemplateFromEs[]) => { + return indexTemplatesEs.reduce((acc, item) => { + if (item.index_template.composed_of) { + item.index_template.composed_of.forEach((component) => { + acc[component] = acc[component] ? [...acc[component], item.name] : [item.name]; + }); + } + return acc; + }, {} as { [key: string]: string[] }); +}; + +export function deserializeComponentTemplate( + componentTemplateEs: ComponentTemplateFromEs, + indexTemplatesEs: TemplateFromEs[] +) { + const { name, component_template: componentTemplate } = componentTemplateEs; + const { template, _meta, version } = componentTemplate; + + const indexTemplatesToUsedBy = getIndexTemplatesToUsedBy(indexTemplatesEs); + + const deserializedComponentTemplate: ComponentTemplateDeserialized = { + name, + template, + version, + _meta, + _kbnMeta: { + usedBy: indexTemplatesToUsedBy[name] || [], + }, + }; + + return deserializedComponentTemplate; +} + +export function deserializeComponenTemplateList( + componentTemplateEs: ComponentTemplateFromEs, + indexTemplatesEs: TemplateFromEs[] +) { + const { name, component_template: componentTemplate } = componentTemplateEs; + const { template } = componentTemplate; + + const indexTemplatesToUsedBy = getIndexTemplatesToUsedBy(indexTemplatesEs); + + const componentTemplateListItem: ComponentTemplateListItem = { + name, + usedBy: indexTemplatesToUsedBy[name] || [], + hasSettings: hasEntries(template.settings), + hasMappings: hasEntries(template.mappings), + hasAliases: hasEntries(template.aliases), + }; + + return componentTemplateListItem; +} diff --git a/x-pack/plugins/index_management/common/lib/index.ts b/x-pack/plugins/index_management/common/lib/index.ts index 16eb544c56a08..c67d28da2c24b 100644 --- a/x-pack/plugins/index_management/common/lib/index.ts +++ b/x-pack/plugins/index_management/common/lib/index.ts @@ -11,3 +11,8 @@ export { } from './template_serialization'; export { getTemplateParameter } from './utils'; + +export { + deserializeComponentTemplate, + deserializeComponenTemplateList, +} from './component_template_serialization'; diff --git a/x-pack/plugins/index_management/common/types/component_templates.ts b/x-pack/plugins/index_management/common/types/component_templates.ts new file mode 100644 index 0000000000000..bc7ebdc2753dd --- /dev/null +++ b/x-pack/plugins/index_management/common/types/component_templates.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IndexSettings } from './indices'; +import { Aliases } from './aliases'; +import { Mappings } from './mappings'; + +export interface ComponentTemplateSerialized { + template: { + settings?: IndexSettings; + aliases?: Aliases; + mappings?: Mappings; + }; + version?: number; + _meta?: { [key: string]: any }; +} + +export interface ComponentTemplateDeserialized extends ComponentTemplateSerialized { + name: string; + _kbnMeta: { + usedBy: string[]; + }; +} + +export interface ComponentTemplateFromEs { + name: string; + component_template: ComponentTemplateSerialized; +} + +export interface ComponentTemplateListItem { + name: string; + usedBy: string[]; + hasMappings: boolean; + hasAliases: boolean; + hasSettings: boolean; +} diff --git a/x-pack/plugins/index_management/common/types/index.ts b/x-pack/plugins/index_management/common/types/index.ts index b467f020978a5..81a06156dd291 100644 --- a/x-pack/plugins/index_management/common/types/index.ts +++ b/x-pack/plugins/index_management/common/types/index.ts @@ -11,3 +11,5 @@ export * from './indices'; export * from './mappings'; export * from './templates'; + +export * from './component_templates'; diff --git a/x-pack/plugins/index_management/common/types/templates.ts b/x-pack/plugins/index_management/common/types/templates.ts index f113aa44d058f..006a2d9dea8f2 100644 --- a/x-pack/plugins/index_management/common/types/templates.ts +++ b/x-pack/plugins/index_management/common/types/templates.ts @@ -49,6 +49,11 @@ export interface TemplateDeserialized { }; } +export interface TemplateFromEs { + name: string; + index_template: TemplateSerialized; +} + /** * Interface for the template list in our UI table * we don't include the mappings, settings and aliases diff --git a/x-pack/plugins/index_management/public/application/app.tsx b/x-pack/plugins/index_management/public/application/app.tsx index 10bbe3ced64da..bfd99de6949e5 100644 --- a/x-pack/plugins/index_management/public/application/app.tsx +++ b/x-pack/plugins/index_management/public/application/app.tsx @@ -5,10 +5,12 @@ */ import React, { useEffect } from 'react'; + import { Router, Switch, Route, Redirect } from 'react-router-dom'; import { ScopedHistory } from 'kibana/public'; + import { UIM_APP_LOAD } from '../../common/constants'; -import { IndexManagementHome } from './sections/home'; +import { IndexManagementHome, homeSections } from './sections/home'; import { TemplateCreate } from './sections/template_create'; import { TemplateClone } from './sections/template_clone'; import { TemplateEdit } from './sections/template_edit'; @@ -32,7 +34,7 @@ export const AppWithoutRouter = () => ( - + ); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts new file mode 100644 index 0000000000000..830cc0ee6a980 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/component_template_list.test.ts @@ -0,0 +1,174 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { setupEnvironment, pageHelpers } from './helpers'; +import { ComponentTemplateListTestBed } from './helpers/component_template_list.helpers'; +import { API_BASE_PATH } from '../../../../../../common/constants'; +import { ComponentTemplateListItem } from '../../types'; + +const { setup } = pageHelpers.componentTemplateList; + +jest.mock('ui/i18n', () => { + const I18nContext = ({ children }: any) => children; + return { I18nContext }; +}); + +describe('', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: ComponentTemplateListTestBed; + + afterAll(() => { + server.restore(); + }); + + beforeEach(async () => { + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + describe('With component templates', () => { + const componentTemplate1: ComponentTemplateListItem = { + name: 'test_component_template_1', + hasMappings: true, + hasAliases: true, + hasSettings: true, + usedBy: [], + }; + + const componentTemplate2: ComponentTemplateListItem = { + name: 'test_component_template_2', + hasMappings: true, + hasAliases: true, + hasSettings: true, + usedBy: ['test_index_template_1'], + }; + + const componentTemplates = [componentTemplate1, componentTemplate2]; + + httpRequestsMockHelpers.setLoadComponentTemplatesResponse(componentTemplates); + + test('should render the list view', async () => { + const { table } = testBed; + + // Verify table content + const { tableCellsValues } = table.getMetaData('componentTemplatesTable'); + tableCellsValues.forEach((row, i) => { + const { name, usedBy } = componentTemplates[i]; + const usedByText = usedBy.length === 0 ? 'Not in use' : usedBy.length.toString(); + + expect(row).toEqual(['', name, usedByText, '', '', '', '']); + }); + }); + + test('should reload the component templates data', async () => { + const { component, actions } = testBed; + const totalRequests = server.requests.length; + + await act(async () => { + actions.clickReloadButton(); + }); + + component.update(); + + expect(server.requests.length).toBe(totalRequests + 1); + expect(server.requests[server.requests.length - 1].url).toBe( + `${API_BASE_PATH}/component_templates` + ); + }); + + test('should delete a component template', async () => { + const { actions, component } = testBed; + const { name: componentTemplateName } = componentTemplate1; + + await act(async () => { + actions.clickDeleteActionAt(0); + }); + + // We need to read the document "body" as the modal is added there and not inside + // the component DOM tree. + const modal = document.body.querySelector( + '[data-test-subj="deleteComponentTemplatesConfirmation"]' + ); + const confirmButton: HTMLButtonElement | null = modal!.querySelector( + '[data-test-subj="confirmModalConfirmButton"]' + ); + + expect(modal).not.toBe(null); + expect(modal!.textContent).toContain('Delete component template'); + + httpRequestsMockHelpers.setDeleteComponentTemplateResponse({ + itemsDeleted: [componentTemplateName], + errors: [], + }); + + await act(async () => { + confirmButton!.click(); + }); + + component.update(); + + const deleteRequest = server.requests[server.requests.length - 2]; + + expect(deleteRequest.method).toBe('DELETE'); + expect(deleteRequest.url).toBe( + `${API_BASE_PATH}/component_templates/${componentTemplateName}` + ); + expect(deleteRequest.status).toEqual(200); + }); + }); + + describe('No component templates', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadComponentTemplatesResponse([]); + + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + test('should display an empty prompt', async () => { + const { exists, find } = testBed; + + expect(exists('sectionLoading')).toBe(false); + expect(exists('emptyList')).toBe(true); + expect(find('emptyList.title').text()).toEqual('Start by creating a component template'); + }); + }); + + describe('Error handling', () => { + beforeEach(async () => { + const error = { + status: 500, + error: 'Internal server error', + message: 'Internal server error', + }; + + httpRequestsMockHelpers.setLoadComponentTemplatesResponse(undefined, { body: error }); + + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + + test('should render an error message if error fetching component templates', async () => { + const { exists, find } = testBed; + + expect(exists('componentTemplatesLoadError')).toBe(true); + expect(find('componentTemplatesLoadError').text()).toContain( + 'Unable to load component templates. Try again.' + ); + }); + }); +}); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts new file mode 100644 index 0000000000000..8fb4dcff0bcea --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/component_template_list.helpers.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { BASE_PATH } from '../../../../../../../common'; +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, + nextTick, +} from '../../../../../../../../../test_utils'; +import { WithAppDependencies } from './setup_environment'; +import { ComponentTemplateList } from '../../../component_template_list'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${BASE_PATH}component_templates`], + componentRoutePath: `${BASE_PATH}component_templates`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(ComponentTemplateList), testBedConfig); + +export type ComponentTemplateListTestBed = TestBed & { + actions: ReturnType; +}; + +const createActions = (testBed: TestBed) => { + const { find } = testBed; + + /** + * User Actions + */ + const clickReloadButton = () => { + find('reloadButton').simulate('click'); + }; + + const clickComponentTemplateAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('componentTemplatesTable'); + const componentTemplateLink = findTestSubject( + rows[index].reactWrapper, + 'componentTemplateDetailsLink' + ); + + await act(async () => { + const { href } = componentTemplateLink.props(); + router.navigateTo(href!); + await nextTick(); + component.update(); + }); + }; + + const clickDeleteActionAt = (index: number) => { + const { table } = testBed; + + const { rows } = table.getMetaData('componentTemplatesTable'); + const deleteButton = findTestSubject(rows[index].reactWrapper, 'deleteComponentTemplateButton'); + + deleteButton.simulate('click'); + }; + + return { + clickReloadButton, + clickComponentTemplateAt, + clickDeleteActionAt, + }; +}; + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + return { + ...testBed, + actions: createActions(testBed), + }; +}; + +export type ComponentTemplateTestSubjects = + | 'componentTemplatesTable' + | 'componentTemplateDetails' + | 'componentTemplateDetails.title' + | 'deleteComponentTemplatesConfirmation' + | 'emptyList' + | 'emptyList.title' + | 'sectionLoading' + | 'componentTemplatesLoadError' + | 'deleteComponentTemplateButton' + | 'reloadButton'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts new file mode 100644 index 0000000000000..8473041ee0af3 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/http_requests.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import sinon, { SinonFakeServer } from 'sinon'; +import { API_BASE_PATH } from '../../../../../../../common'; + +// Register helpers to mock HTTP Requests +const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { + const setLoadComponentTemplatesResponse = (response?: any[], error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? error.body : response; + + server.respondWith('GET', `${API_BASE_PATH}/component_templates`, [ + status, + { 'Content-Type': 'application/json' }, + JSON.stringify(body), + ]); + }; + + const setDeleteComponentTemplateResponse = (response?: object) => { + server.respondWith('DELETE', `${API_BASE_PATH}/component_templates/:name`, [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response), + ]); + }; + + return { + setLoadComponentTemplatesResponse, + setDeleteComponentTemplateResponse, + }; +}; + +export const init = () => { + const server = sinon.fakeServer.create(); + server.respondImmediately = true; + + // Define default response for unhandled requests. + // We make requests to APIs which don't impact the component under test, e.g. UI metric telemetry, + // and we can mock them all with a 200 instead of mocking each one individually. + server.respondWith([200, {}, 'DefaultMockedResponse']); + + const httpRequestsMockHelpers = registerHttpRequestMockHelpers(server); + + return { + server, + httpRequestsMockHelpers, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts new file mode 100644 index 0000000000000..c1d75b3c2dd9b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setup as componentTemplatesListSetup } from './component_template_list.helpers'; + +export { nextTick, getRandomString, findTestSubject } from '../../../../../../../../../test_utils'; + +export { setupEnvironment } from './setup_environment'; + +export const pageHelpers = { + componentTemplateList: { setup: componentTemplatesListSetup }, +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx new file mode 100644 index 0000000000000..c0aeb70166b5b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* eslint-disable @kbn/eslint/no-restricted-paths */ +import React from 'react'; +import axios from 'axios'; +import axiosXhrAdapter from 'axios/lib/adapters/xhr'; + +import { HttpSetup } from 'kibana/public'; +import { BASE_PATH, API_BASE_PATH } from '../../../../../../../common/constants'; +import { + notificationServiceMock, + docLinksServiceMock, +} from '../../../../../../../../../../src/core/public/mocks'; + +import { init as initHttpRequests } from './http_requests'; +import { ComponentTemplatesProvider } from '../../../component_templates_context'; + +const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); + +const appDependencies = { + httpClient: (mockHttpClient as unknown) as HttpSetup, + apiBasePath: API_BASE_PATH, + appBasePath: BASE_PATH, + trackMetric: () => {}, + docLinks: docLinksServiceMock.createStartContract(), + toasts: notificationServiceMock.createSetupContract().toasts, +}; + +export const setupEnvironment = () => { + const { server, httpRequestsMockHelpers } = initHttpRequests(); + + return { + server, + httpRequestsMockHelpers, + }; +}; + +export const WithAppDependencies = (Comp: any) => (props: any) => ( + + + +); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx new file mode 100644 index 0000000000000..41fa608ef538b --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { SectionLoading } from '../shared_imports'; +import { useComponentTemplatesContext } from '../component_templates_context'; +import { UIM_COMPONENT_TEMPLATE_LIST_LOAD } from '../constants'; + +import { EmptyPrompt } from './empty_prompt'; +import { ComponentTable } from './table'; +import { LoadError } from './error'; +import { ComponentTemplatesDeleteModal } from './delete_modal'; + +export const ComponentTemplateList: React.FunctionComponent = () => { + const { api, trackMetric } = useComponentTemplatesContext(); + + const { data, isLoading, error, sendRequest } = api.useLoadComponentTemplates(); + + const [componentTemplatesToDelete, setComponentTemplatesToDelete] = useState([]); + + // Track component loaded + useEffect(() => { + trackMetric('loaded', UIM_COMPONENT_TEMPLATE_LIST_LOAD); + }, [trackMetric]); + + if (data && data.length === 0) { + return ; + } + + let content: React.ReactNode; + + if (isLoading) { + content = ( + + + + ); + } else if (data?.length) { + content = ( + + ); + } else if (error) { + content = ; + } + + return ( +
+ {content} + {componentTemplatesToDelete?.length > 0 ? ( + { + if (deleteResponse?.hasDeletedComponentTemplates) { + // refetch the component templates + sendRequest(); + } + setComponentTemplatesToDelete([]); + }} + componentTemplatesToDelete={componentTemplatesToDelete} + /> + ) : null} +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx new file mode 100644 index 0000000000000..bf621065842b5 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/delete_modal.tsx @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { useComponentTemplatesContext } from '../component_templates_context'; + +export const ComponentTemplatesDeleteModal = ({ + componentTemplatesToDelete, + callback, +}: { + componentTemplatesToDelete: string[]; + callback: (data?: { hasDeletedComponentTemplates: boolean }) => void; +}) => { + const { toasts, api } = useComponentTemplatesContext(); + const numComponentTemplatesToDelete = componentTemplatesToDelete.length; + + const handleDeleteComponentTemplates = () => { + api + .deleteComponentTemplates(componentTemplatesToDelete) + .then(({ data: { itemsDeleted, errors }, error }) => { + const hasDeletedComponentTemplates = itemsDeleted && itemsDeleted.length; + + if (hasDeletedComponentTemplates) { + const successMessage = + itemsDeleted.length === 1 + ? i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.successDeleteSingleNotificationMessageText', + { + defaultMessage: "Deleted component template '{componentTemplateName}'", + values: { componentTemplateName: componentTemplatesToDelete[0] }, + } + ) + : i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.successDeleteMultipleNotificationMessageText', + { + defaultMessage: + 'Deleted {numSuccesses, plural, one {# component template} other {# component templates}}', + values: { numSuccesses: itemsDeleted.length }, + } + ); + + callback({ hasDeletedComponentTemplates }); + toasts.addSuccess(successMessage); + } + + if (error || errors?.length) { + const hasMultipleErrors = + errors?.length > 1 || (error && componentTemplatesToDelete.length > 1); + const errorMessage = hasMultipleErrors + ? i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.multipleErrorsNotificationMessageText', + { + defaultMessage: 'Error deleting {count} component templates', + values: { + count: errors?.length || componentTemplatesToDelete.length, + }, + } + ) + : i18n.translate( + 'xpack.idxMgmt.home.componentTemplates.deleteModal.errorNotificationMessageText', + { + defaultMessage: "Error deleting component template '{name}'", + values: { name: (errors && errors[0].name) || componentTemplatesToDelete[0] }, + } + ); + toasts.addDanger(errorMessage); + } + }); + }; + + const handleOnCancel = () => { + callback(); + }; + + return ( + + + } + onCancel={handleOnCancel} + onConfirm={handleDeleteComponentTemplates} + cancelButtonText={ + + } + confirmButtonText={ + + } + > + <> +

+ +

+ +
    + {componentTemplatesToDelete.map((name) => ( +
  • {name}
  • + ))} +
+ +
+
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx new file mode 100644 index 0000000000000..edd9f77cbf635 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/empty_prompt.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiEmptyPrompt, EuiLink } from '@elastic/eui'; + +import { useComponentTemplatesContext } from '../component_templates_context'; + +export const EmptyPrompt: FunctionComponent = () => { + const { documentation } = useComponentTemplatesContext(); + + return ( + + {i18n.translate('xpack.idxMgmt.home.componentTemplates.emptyPromptTitle', { + defaultMessage: 'Start by creating a component template', + })} + + } + body={ +

+ +
+ + {i18n.translate('xpack.idxMgmt.home.componentTemplates.emptyPromptDocumentionLink', { + defaultMessage: 'Learn more', + })} + +

+ } + /> + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx new file mode 100644 index 0000000000000..aa37b9ce5767c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/error.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiLink, EuiCallOut } from '@elastic/eui'; + +export interface Props { + onReloadClick: () => void; +} + +export const LoadError: FunctionComponent = ({ onReloadClick }) => { + return ( + + + + ), + }} + /> + } + /> + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts new file mode 100644 index 0000000000000..84ee48d14bb8c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ComponentTemplateList } from './component_template_list'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx new file mode 100644 index 0000000000000..2d9557e64e6e7 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/table.tsx @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { FunctionComponent, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiInMemoryTable, + EuiButton, + EuiInMemoryTableProps, + EuiTextColor, + EuiIcon, +} from '@elastic/eui'; + +import { ComponentTemplateListItem } from '../types'; + +export interface Props { + componentTemplates: ComponentTemplateListItem[]; + onReloadClick: () => void; + onDeleteClick: (componentTemplateName: string[]) => void; +} + +export const ComponentTable: FunctionComponent = ({ + componentTemplates, + onReloadClick, + onDeleteClick, +}) => { + const [selection, setSelection] = useState([]); + + const tableProps: EuiInMemoryTableProps = { + itemId: 'name', + isSelectable: true, + 'data-test-subj': 'componentTemplatesTable', + sorting: { sort: { field: 'name', direction: 'asc' } }, + selection: { + onSelectionChange: setSelection, + selectable: ({ usedBy }) => usedBy.length === 0, + selectableMessage: (selectable) => + selectable + ? i18n.translate('xpack.idxMgmt.componentTemplatesList.table.selectionLabel', { + defaultMessage: 'Select this component template', + }) + : i18n.translate('xpack.idxMgmt.componentTemplatesList.table.disabledSelectionLabel', { + defaultMessage: 'Component template is in use and cannot be deleted', + }), + }, + rowProps: () => ({ + 'data-test-subj': 'componentTemplateTableRow', + }), + search: { + toolsLeft: + selection.length > 0 ? ( + onDeleteClick(selection.map(({ name }) => name))} + color="danger" + > + + + ) : undefined, + toolsRight: [ + + {i18n.translate('xpack.idxMgmt.componentTemplatesList.table.reloadButtonLabel', { + defaultMessage: 'Reload', + })} + , + ], + box: { + incremental: true, + }, + filters: [ + { + type: 'field_value_toggle_group', + field: 'usedBy.length', + items: [ + { + value: 1, + name: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.inUseFilterOptionLabel', + { + defaultMessage: 'In use', + } + ), + operator: 'gte', + }, + { + value: 0, + name: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.notInUseFilterOptionLabel', + { + defaultMessage: 'Not in use', + } + ), + operator: 'eq', + }, + ], + }, + ], + }, + pagination: { + initialPageSize: 10, + pageSizeOptions: [10, 20, 50], + }, + columns: [ + { + field: 'name', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.nameColumnTitle', { + defaultMessage: 'Name', + }), + sortable: true, + }, + { + field: 'usedBy', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.isInUseColumnTitle', { + defaultMessage: 'Index templates', + }), + sortable: true, + render: (usedBy: string[]) => { + if (usedBy.length) { + return usedBy.length; + } + + return ( + + + + + + ); + }, + }, + { + field: 'hasMappings', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.mappingsColumnTitle', { + defaultMessage: 'Mappings', + }), + truncateText: true, + sortable: true, + render: (hasMappings: boolean) => (hasMappings ? : null), + }, + { + field: 'hasSettings', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.settingsColumnTitle', { + defaultMessage: 'Settings', + }), + truncateText: true, + sortable: true, + render: (hasSettings: boolean) => (hasSettings ? : null), + }, + { + field: 'hasAliases', + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.aliasesColumnTitle', { + defaultMessage: 'Aliases', + }), + truncateText: true, + sortable: true, + render: (hasAliases: boolean) => (hasAliases ? : null), + }, + { + name: ( + + ), + actions: [ + { + 'data-test-subj': 'deleteComponentTemplateButton', + isPrimary: true, + name: i18n.translate('xpack.idxMgmt.componentTemplatesList.table.deleteActionLabel', { + defaultMessage: 'Delete', + }), + description: i18n.translate( + 'xpack.idxMgmt.componentTemplatesList.table.deleteActionDescription', + { defaultMessage: 'Delete this component template' } + ), + type: 'icon', + icon: 'trash', + color: 'danger', + onClick: ({ name }) => onDeleteClick([name]), + enabled: ({ usedBy }) => usedBy.length === 0, + }, + ], + }, + ], + items: componentTemplates ?? [], + }; + + return ; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx new file mode 100644 index 0000000000000..6f5f5bdebd6d0 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { createContext, useContext } from 'react'; +import { HttpSetup, DocLinksSetup, NotificationsSetup } from 'src/core/public'; + +import { getApi, getUseRequest, getSendRequest, getDocumentation } from './lib'; + +const ComponentTemplatesContext = createContext(undefined); + +interface Props { + httpClient: HttpSetup; + apiBasePath: string; + appBasePath: string; + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void; + docLinks: DocLinksSetup; + toasts: NotificationsSetup['toasts']; +} + +interface Context { + api: ReturnType; + documentation: ReturnType; + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void; + toasts: NotificationsSetup['toasts']; + appBasePath: string; +} + +export const ComponentTemplatesProvider = ({ + children, + value, +}: { + value: Props; + children: React.ReactNode; +}) => { + const { httpClient, apiBasePath, trackMetric, docLinks, toasts, appBasePath } = value; + + const useRequest = getUseRequest(httpClient); + const sendRequest = getSendRequest(httpClient); + + const api = getApi(useRequest, sendRequest, apiBasePath, trackMetric); + const documentation = getDocumentation(docLinks); + + return ( + + {children} + + ); +}; + +export const useComponentTemplatesContext = () => { + const ctx = useContext(ComponentTemplatesContext); + if (!ctx) { + throw new Error( + '"useComponentTemplatesContext" can only be called inside of ComponentTemplatesProvider!' + ); + } + return ctx; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts new file mode 100644 index 0000000000000..3e763119fa9fb --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/constants.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// ui metric constants +export const UIM_COMPONENT_TEMPLATE_LIST_LOAD = 'component_template_list_load'; +export const UIM_COMPONENT_TEMPLATE_DELETE = 'component_template_delete'; +export const UIM_COMPONENT_TEMPLATE_DELETE_MANY = 'component_template_delete_many'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/index.ts new file mode 100644 index 0000000000000..e0219ec71787f --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ComponentTemplatesProvider } from './component_templates_context'; + +export { ComponentTemplateList } from './component_template_list'; + +export * from './types'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts new file mode 100644 index 0000000000000..351e83c6c0cb5 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ComponentTemplateListItem } from '../types'; +import { UseRequestHook, SendRequestHook } from './request'; +import { UIM_COMPONENT_TEMPLATE_DELETE_MANY, UIM_COMPONENT_TEMPLATE_DELETE } from '../constants'; + +export const getApi = ( + useRequest: UseRequestHook, + sendRequest: SendRequestHook, + apiBasePath: string, + trackMetric: (type: 'loaded' | 'click' | 'count', eventName: string) => void +) => { + function useLoadComponentTemplates() { + return useRequest({ + path: `${apiBasePath}/component_templates`, + method: 'get', + }); + } + + function deleteComponentTemplates(names: string[]) { + const result = sendRequest({ + path: `${apiBasePath}/component_templates/${names + .map((name) => encodeURIComponent(name)) + .join(',')}`, + method: 'delete', + }); + + trackMetric( + 'count', + names.length > 1 ? UIM_COMPONENT_TEMPLATE_DELETE_MANY : UIM_COMPONENT_TEMPLATE_DELETE + ); + + return result; + } + + return { + useLoadComponentTemplates, + deleteComponentTemplates, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts new file mode 100644 index 0000000000000..dc27dadf0b807 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DocLinksSetup } from 'src/core/public'; + +export const getDocumentation = ({ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }: DocLinksSetup) => { + const docsBase = `${ELASTIC_WEBSITE_URL}guide/en`; + const esDocsBase = `${docsBase}/elasticsearch/reference/${DOC_LINK_VERSION}`; + + return { + componentTemplates: `${esDocsBase}/indices-component-template.html`, + }; +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts new file mode 100644 index 0000000000000..9a91312f83294 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export * from './api'; + +export * from './request'; + +export * from './documentation'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts new file mode 100644 index 0000000000000..97ffa4d875ecb --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { HttpSetup } from 'src/core/public'; + +import { + UseRequestConfig, + UseRequestResponse, + SendRequestConfig, + SendRequestResponse, + sendRequest as _sendRequest, + useRequest as _useRequest, +} from '../shared_imports'; + +export type UseRequestHook = (config: UseRequestConfig) => UseRequestResponse; +export type SendRequestHook = (config: SendRequestConfig) => Promise; + +export const getUseRequest = (httpClient: HttpSetup): UseRequestHook => ( + config: UseRequestConfig +) => { + return _useRequest(httpClient, config); +}; + +export const getSendRequest = (httpClient: HttpSetup): SendRequestHook => ( + config: SendRequestConfig +) => { + return _sendRequest(httpClient, config); +}; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts new file mode 100644 index 0000000000000..863b00b353c49 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/shared_imports.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { + UseRequestConfig, + UseRequestResponse, + SendRequestConfig, + SendRequestResponse, + sendRequest, + useRequest, + SectionLoading, +} from '../../../../../../../src/plugins/es_ui_shared/public'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/types.ts b/x-pack/plugins/index_management/public/application/components/component_templates/types.ts new file mode 100644 index 0000000000000..0aab3b6b0a94a --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/component_templates/types.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +// Ideally, we shouldn't depend on anything in index management that is +// outside of the components_templates directory +// We could consider creating shared types or duplicating the types here if +// the component_templates app were to move outside of index management +import { + ComponentTemplateSerialized, + ComponentTemplateDeserialized, + ComponentTemplateListItem, +} from '../../../../common'; + +export { ComponentTemplateSerialized, ComponentTemplateDeserialized, ComponentTemplateListItem }; diff --git a/x-pack/plugins/index_management/public/application/components/index.ts b/x-pack/plugins/index_management/public/application/components/index.ts index e6d836c0d0501..7ec25ed5583b7 100644 --- a/x-pack/plugins/index_management/public/application/components/index.ts +++ b/x-pack/plugins/index_management/public/application/components/index.ts @@ -11,3 +11,4 @@ export { PageErrorForbidden } from './page_error'; export { TemplateDeleteModal } from './template_delete_modal'; export { TemplateForm } from './template_form'; export * from './mappings_editor'; +export * from './component_templates'; diff --git a/x-pack/plugins/index_management/public/application/index.tsx b/x-pack/plugins/index_management/public/application/index.tsx index 8da556cc81fcc..5d1096c9ee24e 100644 --- a/x-pack/plugins/index_management/public/application/index.tsx +++ b/x-pack/plugins/index_management/public/application/index.tsx @@ -10,9 +10,12 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { CoreStart } from '../../../../../src/core/public'; +import { API_BASE_PATH, BASE_PATH } from '../../common'; + import { AppContextProvider, AppDependencies } from './app_context'; import { App } from './app'; import { indexManagementStore } from './store'; +import { ComponentTemplatesProvider } from './components'; export const renderApp = ( elem: HTMLElement | null, @@ -22,15 +25,26 @@ export const renderApp = ( return () => undefined; } - const { i18n } = core; + const { i18n, docLinks, notifications } = core; const { Context: I18nContext } = i18n; const { services, history } = dependencies; + const componentTemplateProviderValues = { + httpClient: services.httpService.httpClient, + apiBasePath: API_BASE_PATH, + appBasePath: BASE_PATH, + trackMetric: services.uiMetricService.trackMetric.bind(services.uiMetricService), + docLinks, + toasts: notifications.toasts, + }; + render( - + + + , diff --git a/x-pack/plugins/index_management/public/application/sections/home/home.tsx b/x-pack/plugins/index_management/public/application/sections/home/home.tsx index 9d4331d742a25..0ddf4fefce466 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/home.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/home.tsx @@ -21,9 +21,16 @@ import { import { documentationService } from '../../services/documentation'; import { IndexList } from './index_list'; import { TemplateList } from './template_list'; +import { ComponentTemplateList } from '../../components/component_templates'; import { breadcrumbService } from '../../services/breadcrumbs'; -type Section = 'indices' | 'templates'; +export enum Section { + Indices = 'indices', + IndexTemplates = 'templates', + ComponentTemplates = 'component_templates', +} + +export const homeSections = [Section.Indices, Section.IndexTemplates, Section.ComponentTemplates]; interface MatchParams { section: Section; @@ -37,11 +44,11 @@ export const IndexManagementHome: React.FunctionComponent { const tabs = [ { - id: 'indices' as Section, + id: Section.Indices, name: , }, { - id: 'templates' as Section, + id: Section.IndexTemplates, name: ( ), }, + { + id: Section.ComponentTemplates, + name: ( + + ), + }, ]; const onSectionChange = (newSection: Section) => { @@ -106,13 +122,14 @@ export const IndexManagementHome: React.FunctionComponent - - + + + diff --git a/x-pack/plugins/index_management/public/application/sections/home/index.ts b/x-pack/plugins/index_management/public/application/sections/home/index.ts index 3a29ef4e58555..b53910748aedb 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index.ts +++ b/x-pack/plugins/index_management/public/application/sections/home/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { IndexManagementHome } from './home'; +export { IndexManagementHome, Section, homeSections } from './home'; diff --git a/x-pack/plugins/index_management/server/client/elasticsearch.ts b/x-pack/plugins/index_management/server/client/elasticsearch.ts index 65bd5411a249b..b51f7d924dba7 100644 --- a/x-pack/plugins/index_management/server/client/elasticsearch.ts +++ b/x-pack/plugins/index_management/server/client/elasticsearch.ts @@ -10,6 +10,7 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) Client.prototype.dataManagement = components.clientAction.namespaceFactory(); const dataManagement = Client.prototype.dataManagement.prototype; + // Component templates dataManagement.getComponentTemplates = ca({ urls: [ { @@ -60,4 +61,14 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) ], method: 'DELETE', }); + + // Composable index templates + dataManagement.getComposableIndexTemplates = ca({ + urls: [ + { + fmt: '/_index_template', + }, + ], + method: 'GET', + }); }; diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts index 87aa64421624e..f6f8e7d63d370 100644 --- a/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts +++ b/x-pack/plugins/index_management/server/routes/api/component_templates/get.ts @@ -5,6 +5,11 @@ */ import { schema } from '@kbn/config-schema'; +import { + deserializeComponentTemplate, + deserializeComponenTemplateList, +} from '../../../../common/lib'; +import { ComponentTemplateFromEs } from '../../../../common'; import { RouteDependencies } from '../../../types'; import { addBasePath } from '../index'; @@ -20,9 +25,25 @@ export function registerGetAllRoute({ router, license, lib: { isEsError } }: Rou const { callAsCurrentUser } = ctx.dataManagement!.client; try { - const response = await callAsCurrentUser('dataManagement.getComponentTemplates'); + const { + component_templates: componentTemplates, + }: { component_templates: ComponentTemplateFromEs[] } = await callAsCurrentUser( + 'dataManagement.getComponentTemplates' + ); + + const { index_templates: indexTemplates } = await callAsCurrentUser( + 'dataManagement.getComposableIndexTemplates' + ); + + const body = componentTemplates.map((componentTemplate) => { + const deserializedComponentTemplateListItem = deserializeComponenTemplateList( + componentTemplate, + indexTemplates + ); + return deserializedComponentTemplateListItem; + }); - return res.ok({ body: response.component_templates }); + return res.ok({ body }); } catch (error) { if (isEsError(error)) { return res.customError({ @@ -56,11 +77,12 @@ export function registerGetAllRoute({ router, license, lib: { isEsError } }: Rou } ); + const { index_templates: indexTemplates } = await callAsCurrentUser( + 'dataManagement.getComposableIndexTemplates' + ); + return res.ok({ - body: { - ...componentTemplates[0], - name, - }, + body: deserializeComponentTemplate(componentTemplates[0], indexTemplates), }); } catch (error) { if (isEsError(error)) { diff --git a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts index a33e82ad9f79d..64bf03a043b55 100644 --- a/x-pack/test/api_integration/apis/management/index_management/component_templates.ts +++ b/x-pack/test/api_integration/apis/management/index_management/component_templates.ts @@ -61,7 +61,10 @@ export default function ({ getService }: FtrProviderContext) { expect(testComponentTemplate).to.eql({ name: COMPONENT_NAME, - component_template: COMPONENT, + usedBy: [], + hasSettings: true, + hasMappings: true, + hasAliases: false, }); }); }); @@ -74,8 +77,9 @@ export default function ({ getService }: FtrProviderContext) { expect(body).to.eql({ name: COMPONENT_NAME, - component_template: { - ...COMPONENT, + ...COMPONENT, + _kbnMeta: { + usedBy: [], }, }); }); diff --git a/x-pack/test/functional/apps/index_management/home_page.ts b/x-pack/test/functional/apps/index_management/home_page.ts index e985e338122e7..cca0a5d1ad1bd 100644 --- a/x-pack/test/functional/apps/index_management/home_page.ts +++ b/x-pack/test/functional/apps/index_management/home_page.ts @@ -47,5 +47,22 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(templateList).to.be(true); }); }); + + describe('Component templates', () => { + it('renders the component templates tab', async () => { + // Navigate to the component templates tab + await pageObjects.indexManagement.changeTabs('component_templatesTab'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + // Verify url + const url = await browser.getCurrentUrl(); + expect(url).to.contain(`/component_templates`); + + // There should be no component templates by default, so we verify the empty prompt displays + const componentTemplateEmptyPrompt = await testSubjects.exists('emptyList'); + expect(componentTemplateEmptyPrompt).to.be(true); + }); + }); }); }; diff --git a/x-pack/test/functional/page_objects/index_management_page.ts b/x-pack/test/functional/page_objects/index_management_page.ts index d12186f2e2189..9bfcd79671b4d 100644 --- a/x-pack/test/functional/page_objects/index_management_page.ts +++ b/x-pack/test/functional/page_objects/index_management_page.ts @@ -44,7 +44,7 @@ export function IndexManagementPageProvider({ getService }: FtrProviderContext) }; }); }, - async changeTabs(tab: 'indicesTab' | 'templatesTab') { + async changeTabs(tab: 'indicesTab' | 'templatesTab' | 'component_templatesTab') { await testSubjects.click(tab); }, }; From 5d8de7a162a28dd987804e15dd33eac185df2070 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 9 Jun 2020 21:40:05 +0300 Subject: [PATCH 09/19] Use Search API in Vega (#68257) * Use Search API in Vega * fix PR comments * fix PR comments --- ...-data-public.getsearchparamsfromrequest.md | 44 ++++++++++++ .../kibana-plugin-plugins-data-public.md | 1 + .../vis_type_vega/vega_visualization.js | 44 ++++++++++-- src/plugins/data/public/index.ts | 1 + src/plugins/data/public/public.api.md | 46 ++++++++---- .../public/search/fetch/get_search_params.ts | 18 ++++- src/plugins/data/public/search/fetch/index.ts | 1 + src/plugins/data/public/search/index.ts | 1 + .../search/search_source/search_source.ts | 15 ++-- .../public/__mocks__/services.ts | 10 +-- .../public/data_model/es_query_parser.js | 41 ++++------- .../public/data_model/es_query_parser.test.js | 26 ++++--- .../public/data_model/search_api.ts | 60 ++++++++++++++++ .../public/data_model/search_cache.js | 48 ------------- .../public/data_model/search_cache.test.js | 71 ------------------- .../public/data_model/vega_parser.js | 4 +- .../public/data_model/vega_parser.test.js | 18 ++++- src/plugins/vis_type_vega/public/plugin.ts | 2 + src/plugins/vis_type_vega/public/services.ts | 14 +++- src/plugins/vis_type_vega/public/vega_fn.ts | 4 +- .../public/vega_request_handler.ts | 33 +++++---- 21 files changed, 289 insertions(+), 213 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md create mode 100644 src/plugins/vis_type_vega/public/data_model/search_api.ts delete mode 100644 src/plugins/vis_type_vega/public/data_model/search_cache.js delete mode 100644 src/plugins/vis_type_vega/public/data_model/search_cache.test.js diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md new file mode 100644 index 0000000000000..1923f0e2e4ea1 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md @@ -0,0 +1,44 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [getSearchParamsFromRequest](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) + +## getSearchParamsFromRequest() function + +Signature: + +```typescript +export declare function getSearchParamsFromRequest(searchRequest: SearchRequest, dependencies: { + injectedMetadata: CoreStart['injectedMetadata']; + uiSettings: IUiSettingsClient; +}): { + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| searchRequest | SearchRequest | | +| dependencies | {
injectedMetadata: CoreStart['injectedMetadata'];
uiSettings: IUiSettingsClient;
} | | + +Returns: + +`{ + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index e818fb009fb19..bc1eb9100e85c 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -40,6 +40,7 @@ | [getEsPreference(uiSettings, sessionId)](./kibana-plugin-plugins-data-public.getespreference.md) | | | [getQueryLog(uiSettings, storage, appName, language)](./kibana-plugin-plugins-data-public.getquerylog.md) | | | [getSearchErrorType({ message })](./kibana-plugin-plugins-data-public.getsearcherrortype.md) | | +| [getSearchParamsFromRequest(searchRequest, dependencies)](./kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md) | | | [getTime(indexPattern, timeRange, options)](./kibana-plugin-plugins-data-public.gettime.md) | | | [plugin(initializerContext)](./kibana-plugin-plugins-data-public.plugin.md) | | diff --git a/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js index 6d6eb69e66792..485390dc50a79 100644 --- a/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js +++ b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_vega/vega_visualization.js @@ -44,7 +44,7 @@ import vegaMapImage256 from './vega_map_image_256.png'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { VegaParser } from '../../../../../../plugins/vis_type_vega/public/data_model/vega_parser'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { SearchCache } from '../../../../../../plugins/vis_type_vega/public/data_model/search_cache'; +import { SearchAPI } from '../../../../../../plugins/vis_type_vega/public/data_model/search_api'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { createVegaTypeDefinition } from '../../../../../../plugins/vis_type_vega/public/vega_type'; @@ -205,7 +205,14 @@ describe('VegaVisualizations', () => { try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaliteGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaliteGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -227,7 +234,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -243,7 +257,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaTooltipGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaTooltipGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); await vegaVis.render(vegaParser, vis.params, { data: true }); @@ -285,7 +306,14 @@ describe('VegaVisualizations', () => { let vegaVis; try { vegaVis = new VegaVisualization(domNode, vis); - const vegaParser = new VegaParser(vegaMapGraph, new SearchCache()); + const vegaParser = new VegaParser( + vegaMapGraph, + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) + ); await vegaParser.parseAsync(); domNode.style.width = '256px'; @@ -324,7 +352,11 @@ describe('VegaVisualizations', () => { } ] }`, - new SearchCache() + new SearchAPI({ + search: npStart.plugins.data.search, + uiSettings: npStart.core.uiSettings, + injectedMetadata: npStart.core.injectedMetadata, + }) ); await vegaParser.parseAsync(); diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index eb3f937a4168b..301ff8d3f67d8 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -358,6 +358,7 @@ export { ISearchSource, parseSearchSourceJSON, injectSearchSourceReferences, + getSearchParamsFromRequest, extractSearchSourceReferences, SearchSourceFields, EsQuerySortValue, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 7054575e8ef9e..bd3ec0d3f2294 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -30,6 +30,7 @@ import { IconType } from '@elastic/eui'; import { InjectedIntl } from '@kbn/i18n/react'; import { IStorageWrapper } from 'src/plugins/kibana_utils/public'; import { IUiSettingsClient } from 'src/core/public'; +import { IUiSettingsClient as IUiSettingsClient_3 } from 'kibana/public'; import { Location } from 'history'; import { LocationDescriptorObject } from 'history'; import { MaybePromise } from '@kbn/utility-types'; @@ -641,6 +642,23 @@ export function getQueryLog(uiSettings: IUiSettingsClient, storage: IStorageWrap // @public (undocumented) export function getSearchErrorType({ message }: Pick): "UNSUPPORTED_QUERY" | undefined; +// Warning: (ae-missing-release-tag) "getSearchParamsFromRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function getSearchParamsFromRequest(searchRequest: SearchRequest, dependencies: { + injectedMetadata: CoreStart['injectedMetadata']; + uiSettings: IUiSettingsClient_3; +}): { + rest_total_hits_as_int: boolean; + ignore_unavailable: boolean; + ignore_throttled: boolean; + max_concurrent_shard_requests: any; + preference: any; + timeout: string | undefined; + index: any; + body: any; +}; + // Warning: (ae-missing-release-tag) "getTime" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -1851,20 +1869,20 @@ export const UI_SETTINGS: { // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:236:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:375:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:378:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:379:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:394:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:398:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:402:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/fetch/get_search_params.ts b/src/plugins/data/public/search/fetch/get_search_params.ts index 60bdc9ed6473a..f2ad243ce72d0 100644 --- a/src/plugins/data/public/search/fetch/get_search_params.ts +++ b/src/plugins/data/public/search/fetch/get_search_params.ts @@ -17,8 +17,9 @@ * under the License. */ -import { IUiSettingsClient } from 'kibana/public'; +import { IUiSettingsClient, CoreStart } from 'kibana/public'; import { UI_SETTINGS } from '../../../common'; +import { SearchRequest } from './types'; const sessionId = Date.now(); @@ -53,3 +54,18 @@ export function getPreference(config: IUiSettingsClient) { export function getTimeout(esShardTimeout: number) { return esShardTimeout > 0 ? `${esShardTimeout}ms` : undefined; } + +export function getSearchParamsFromRequest( + searchRequest: SearchRequest, + dependencies: { injectedMetadata: CoreStart['injectedMetadata']; uiSettings: IUiSettingsClient } +) { + const { injectedMetadata, uiSettings } = dependencies; + const esShardTimeout = injectedMetadata.getInjectedVar('esShardTimeout') as number; + const searchParams = getSearchParams(uiSettings, esShardTimeout); + + return { + index: searchRequest.index.title || searchRequest.index, + body: searchRequest.body, + ...searchParams, + }; +} diff --git a/src/plugins/data/public/search/fetch/index.ts b/src/plugins/data/public/search/fetch/index.ts index 39845ec31bfaa..ab856d681ba12 100644 --- a/src/plugins/data/public/search/fetch/index.ts +++ b/src/plugins/data/public/search/fetch/index.ts @@ -20,6 +20,7 @@ export * from './types'; export { getSearchParams, + getSearchParamsFromRequest, getPreference, getTimeout, getIgnoreThrottled, diff --git a/src/plugins/data/public/search/index.ts b/src/plugins/data/public/search/index.ts index 53686f9be9b4d..1b5395e1071c5 100644 --- a/src/plugins/data/public/search/index.ts +++ b/src/plugins/data/public/search/index.ts @@ -44,6 +44,7 @@ export { SearchRequest, SearchResponse, getSearchErrorType, + getSearchParamsFromRequest, } from './fetch'; export { diff --git a/src/plugins/data/public/search/search_source/search_source.ts b/src/plugins/data/public/search/search_source/search_source.ts index b926739112e0e..a33cda964bd1d 100644 --- a/src/plugins/data/public/search/search_source/search_source.ts +++ b/src/plugins/data/public/search/search_source/search_source.ts @@ -77,7 +77,7 @@ import { filterDocvalueFields } from './filter_docvalue_fields'; import { fieldWildcardFilter } from '../../../../kibana_utils/public'; import { IIndexPattern, ISearchGeneric, SearchRequest } from '../..'; import { SearchSourceOptions, SearchSourceFields } from './types'; -import { FetchOptions, RequestFailure, getSearchParams, handleResponse } from '../fetch'; +import { FetchOptions, RequestFailure, handleResponse, getSearchParamsFromRequest } from '../fetch'; import { getEsQueryConfig, buildEsQuery, Filter, UI_SETTINGS } from '../../../common'; import { getHighlightRequest } from '../../../common/field_formats'; @@ -204,13 +204,12 @@ export class SearchSource { */ private fetch$(searchRequest: SearchRequest, signal?: AbortSignal) { const { search, injectedMetadata, uiSettings } = this.dependencies; - const esShardTimeout = injectedMetadata.getInjectedVar('esShardTimeout') as number; - const searchParams = getSearchParams(uiSettings, esShardTimeout); - const params = { - index: searchRequest.index.title || searchRequest.index, - body: searchRequest.body, - ...searchParams, - }; + + const params = getSearchParamsFromRequest(searchRequest, { + injectedMetadata, + uiSettings, + }); + return search({ params, indexType: searchRequest.indexType }, { signal }).pipe( map(({ rawResponse }) => handleResponse(searchRequest, rawResponse)) ); diff --git a/src/plugins/vis_type_vega/public/__mocks__/services.ts b/src/plugins/vis_type_vega/public/__mocks__/services.ts index 1bf051232e4c9..4775241a66d50 100644 --- a/src/plugins/vis_type_vega/public/__mocks__/services.ts +++ b/src/plugins/vis_type_vega/public/__mocks__/services.ts @@ -16,10 +16,10 @@ * specific language governing permissions and limitations * under the License. */ +import { CoreStart, IUiSettingsClient, NotificationsStart, SavedObjectsStart } from 'kibana/public'; import { createGetterSetter } from '../../../kibana_utils/public'; import { DataPublicPluginStart } from '../../../data/public'; -import { IUiSettingsClient, NotificationsStart, SavedObjectsStart } from 'kibana/public'; import { dataPluginMock } from '../../../data/public/mocks'; import { coreMock } from '../../../../core/public/mocks'; @@ -34,22 +34,24 @@ setNotifications(coreMock.createStart().notifications); export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); setUISettings(coreMock.createStart().uiSettings); +export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< + CoreStart['injectedMetadata'] +>('InjectedMetadata'); +setInjectedMetadata(coreMock.createStart().injectedMetadata); + export const [getSavedObjects, setSavedObjects] = createGetterSetter( 'SavedObjects' ); setSavedObjects(coreMock.createStart().savedObjects); export const [getInjectedVars, setInjectedVars] = createGetterSetter<{ - esShardTimeout: number; enableExternalUrls: boolean; emsTileLayerId: unknown; }>('InjectedVars'); setInjectedVars({ emsTileLayerId: {}, enableExternalUrls: true, - esShardTimeout: 10000, }); -export const getEsShardTimeout = () => getInjectedVars().esShardTimeout; export const getEnableExternalUrls = () => getInjectedVars().enableExternalUrls; export const getEmsTileLayerId = () => getInjectedVars().emsTileLayerId; diff --git a/src/plugins/vis_type_vega/public/data_model/es_query_parser.js b/src/plugins/vis_type_vega/public/data_model/es_query_parser.js index 066c9f06fc109..387301c2c7de9 100644 --- a/src/plugins/vis_type_vega/public/data_model/es_query_parser.js +++ b/src/plugins/vis_type_vega/public/data_model/es_query_parser.js @@ -17,11 +17,9 @@ * under the License. */ -import _ from 'lodash'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; - -import { getEsShardTimeout } from '../services'; +import { isPlainObject, cloneDeep } from 'lodash'; const TIMEFILTER = '%timefilter%'; const AUTOINTERVAL = '%autointerval%'; @@ -37,12 +35,11 @@ const TIMEFIELD = '%timefield%'; * This class parses ES requests specified in the data.url objects. */ export class EsQueryParser { - constructor(timeCache, searchCache, filters, onWarning) { + constructor(timeCache, searchAPI, filters, onWarning) { this._timeCache = timeCache; - this._searchCache = searchCache; + this._searchAPI = searchAPI; this._filters = filters; this._onWarning = onWarning; - this._esShardTimeout = getEsShardTimeout(); } // noinspection JSMethodCanBeStatic @@ -59,7 +56,7 @@ export class EsQueryParser { if (body === undefined) { url.body = body = {}; - } else if (!_.isPlainObject(body)) { + } else if (!isPlainObject(body)) { throw new Error( i18n.translate('visTypeVega.esQueryParser.urlBodyValueTypeErrorMessage', { defaultMessage: '{configName} must be an object', @@ -167,7 +164,7 @@ export class EsQueryParser { if (context) { // Use dashboard context - const newQuery = _.cloneDeep(this._filters); + const newQuery = cloneDeep(this._filters); if (timefield) { newQuery.bool.must.push(body.query); } @@ -179,34 +176,20 @@ export class EsQueryParser { return { dataObject, url }; } - mapRequest = (request) => { - const esRequest = request.url; - if (this._esShardTimeout) { - // remove possible timeout query param to prevent two conflicting timeout parameters - const { body = {}, timeout, ...rest } = esRequest; //eslint-disable-line no-unused-vars - body.timeout = `${this._esShardTimeout}ms`; - return { - body, - ...rest, - }; - } else { - return esRequest; - } - }; - /** * Process items generated by parseUrl() * @param {object[]} requests each object is generated by parseUrl() * @returns {Promise} */ async populateData(requests) { - const esSearches = requests.map(this.mapRequest); + const esSearches = requests.map((r) => r.url); + const data$ = this._searchAPI.search(esSearches); - const results = await this._searchCache.search(esSearches); + const results = await data$.toPromise(); - for (let i = 0; i < requests.length; i++) { - requests[i].dataObject.values = results[i]; - } + results.forEach((data) => { + requests[data.id].dataObject.values = data.rawResponse; + }); } /** @@ -222,7 +205,7 @@ export class EsQueryParser { const item = obj[pos]; if (isQuery && (item === MUST_CLAUSE || item === MUST_NOT_CLAUSE)) { const ctxTag = item === MUST_CLAUSE ? 'must' : 'must_not'; - const ctx = _.cloneDeep(this._filters); + const ctx = cloneDeep(this._filters); if (ctx && ctx.bool && ctx.bool[ctxTag]) { if (Array.isArray(ctx.bool[ctxTag])) { // replace one value with an array of values diff --git a/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js b/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js index c519da33ab1c9..fd474bef73b8c 100644 --- a/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/es_query_parser.test.js @@ -94,28 +94,36 @@ describe(`EsQueryParser time`, () => { }); describe('EsQueryParser.populateData', () => { - let searchStub; + let searchApiStub; + let data; let parser; beforeEach(() => { - searchStub = jest.fn(() => Promise.resolve([{}, {}])); - parser = new EsQueryParser({}, { search: searchStub }, undefined, undefined); + searchApiStub = { + search: jest.fn(() => ({ + toPromise: jest.fn(() => Promise.resolve(data)), + })), + }; + parser = new EsQueryParser({}, searchApiStub, undefined, undefined); }); test('should set the timeout for each request', async () => { + data = [ + { id: 0, rawResponse: {} }, + { id: 1, rawResponse: {} }, + ]; await parser.populateData([ { url: { body: {} }, dataObject: {} }, { url: { body: {} }, dataObject: {} }, ]); - expect(searchStub.mock.calls[0][0][0].body.timeout).toBe.defined; + + expect(searchApiStub.search.mock.calls[0][0][0].body).toBeDefined(); }); test('should remove possible timeout parameters on a request', async () => { - await parser.populateData([ - { url: { timeout: '500h', body: { timeout: '500h' } }, dataObject: {} }, - ]); - expect(searchStub.mock.calls[0][0][0].body.timeout).toBe.defined; - expect(searchStub.mock.calls[0][0][0].timeout).toBe(undefined); + data = [{ id: 0, rawResponse: {} }]; + await parser.populateData([{ url: { body: { timeout: '500h' } }, dataObject: {} }]); + expect(searchApiStub.search.mock.calls[0][0][0].body.timeout).toBeDefined(); }); }); diff --git a/src/plugins/vis_type_vega/public/data_model/search_api.ts b/src/plugins/vis_type_vega/public/data_model/search_api.ts new file mode 100644 index 0000000000000..c2eecf13c2d51 --- /dev/null +++ b/src/plugins/vis_type_vega/public/data_model/search_api.ts @@ -0,0 +1,60 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { combineLatest } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { CoreStart, IUiSettingsClient } from 'kibana/public'; +import { + getSearchParamsFromRequest, + SearchRequest, + DataPublicPluginStart, +} from '../../../data/public'; + +export interface SearchAPIDependencies { + uiSettings: IUiSettingsClient; + injectedMetadata: CoreStart['injectedMetadata']; + search: DataPublicPluginStart['search']; +} + +export class SearchAPI { + constructor( + private readonly dependencies: SearchAPIDependencies, + private readonly abortSignal?: AbortSignal + ) {} + + search(searchRequests: SearchRequest[]) { + const { search } = this.dependencies.search; + + return combineLatest( + searchRequests.map((request, index) => { + const params = getSearchParamsFromRequest(request, { + uiSettings: this.dependencies.uiSettings, + injectedMetadata: this.dependencies.injectedMetadata, + }); + + return search({ params }, { signal: this.abortSignal }).pipe( + map((data) => ({ + id: index, + rawResponse: data.rawResponse, + })) + ); + }) + ); + } +} diff --git a/src/plugins/vis_type_vega/public/data_model/search_cache.js b/src/plugins/vis_type_vega/public/data_model/search_cache.js deleted file mode 100644 index 41e4c67c3b2ad..0000000000000 --- a/src/plugins/vis_type_vega/public/data_model/search_cache.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import LruCache from 'lru-cache'; - -export class SearchCache { - constructor(es, cacheOpts) { - this._es = es; - this._cache = new LruCache(cacheOpts); - } - - /** - * Execute multiple searches, possibly combining the results of the cached searches - * with the new ones already in cache - * @param {object[]} requests array of search requests - */ - search(requests) { - const promises = []; - - for (const request of requests) { - const key = JSON.stringify(request); - let pending = this._cache.get(key); - if (pending === undefined) { - pending = this._es.search(request); - this._cache.set(key, pending); - } - promises.push(pending); - } - - return Promise.all(promises); - } -} diff --git a/src/plugins/vis_type_vega/public/data_model/search_cache.test.js b/src/plugins/vis_type_vega/public/data_model/search_cache.test.js deleted file mode 100644 index 92f80545ce1b5..0000000000000 --- a/src/plugins/vis_type_vega/public/data_model/search_cache.test.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { SearchCache } from './search_cache'; -jest.mock('../services'); - -describe(`SearchCache`, () => { - class FauxEs { - constructor() { - // contains all request batches, separated by 0 - this.searches = []; - } - - async search(request) { - this.searches.push(request); - return { req: request }; - } - } - - const request1 = { body: 'b1' }; - const expected1 = { req: { body: 'b1' } }; - const request2 = { body: 'b2' }; - const expected2 = { req: { body: 'b2' } }; - const request3 = { body: 'b3' }; - const expected3 = { req: { body: 'b3' } }; - - it(`sequence`, async () => { - const sc = new SearchCache(new FauxEs()); - - // empty request - let res = await sc.search([]); - expect(res).toEqual([]); - expect(sc._es.searches).toEqual([]); - - // single request - res = await sc.search([request1]); - expect(res).toEqual([expected1]); - expect(sc._es.searches).toEqual([request1]); - - // repeat the same search, use array notation - res = await sc.search([request1]); - expect(res).toEqual([expected1]); - expect(sc._es.searches).toEqual([request1]); // no new entries - - // new single search - res = await sc.search([request2]); - expect(res).toEqual([expected2]); - expect(sc._es.searches).toEqual([request1, request2]); - - // multiple search, some new, some old - res = await sc.search([request1, request3, request2]); - expect(res).toEqual([expected1, expected3, expected2]); - expect(sc._es.searches).toEqual([request1, request2, request3]); - }); -}); diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.js index f541b9f104adc..cbfe2a6ede4f2 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.js @@ -46,7 +46,7 @@ const locToDirMap = { const DEFAULT_PARSER = 'elasticsearch'; export class VegaParser { - constructor(spec, searchCache, timeCache, filters, serviceSettings) { + constructor(spec, searchAPI, timeCache, filters, serviceSettings) { this.spec = spec; this.hideWarnings = false; this.error = undefined; @@ -54,7 +54,7 @@ export class VegaParser { const onWarn = this._onWarning.bind(this); this._urlParsers = { - elasticsearch: new EsQueryParser(timeCache, searchCache, filters, onWarn), + elasticsearch: new EsQueryParser(timeCache, searchAPI, filters, onWarn), emsfile: new EmsFileParser(serviceSettings), url: new UrlParser(onWarn), }; diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js index 1bd26b8713044..a40ef31260b6f 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js @@ -78,9 +78,25 @@ describe(`VegaParser._setDefaultColors`, () => { }); describe('VegaParser._resolveEsQueries', () => { + let searchApiStub; + const data = [ + { + id: 0, + rawResponse: [42], + }, + ]; + + beforeEach(() => { + searchApiStub = { + search: jest.fn(() => ({ + toPromise: jest.fn(() => Promise.resolve(data)), + })), + }; + }); + function check(spec, expected, warnCount) { return async () => { - const vp = new VegaParser(spec, { search: async () => [[42]] }, 0, 0, { + const vp = new VegaParser(spec, searchApiStub, 0, 0, { getFileLayers: async () => [{ name: 'file1', url: 'url1' }], getUrlForRegionLayer: async (layer) => { return layer.url; diff --git a/src/plugins/vis_type_vega/public/plugin.ts b/src/plugins/vis_type_vega/public/plugin.ts index 1bce7ac92e564..b3e35dac3711f 100644 --- a/src/plugins/vis_type_vega/public/plugin.ts +++ b/src/plugins/vis_type_vega/public/plugin.ts @@ -28,6 +28,7 @@ import { setUISettings, setKibanaMapFactory, setMapsLegacyConfig, + setInjectedMetadata, } from './services'; import { createVegaFn } from './vega_fn'; @@ -96,5 +97,6 @@ export class VegaPlugin implements Plugin, void> { setNotifications(core.notifications); setSavedObjects(core.savedObjects); setData(data); + setInjectedMetadata(core.injectedMetadata); } } diff --git a/src/plugins/vis_type_vega/public/services.ts b/src/plugins/vis_type_vega/public/services.ts index f2fddb41cf72b..7d988d464b52b 100644 --- a/src/plugins/vis_type_vega/public/services.ts +++ b/src/plugins/vis_type_vega/public/services.ts @@ -17,8 +17,13 @@ * under the License. */ -import { SavedObjectsStart } from 'kibana/public'; -import { NotificationsStart, IUiSettingsClient } from 'src/core/public'; +import { + CoreStart, + SavedObjectsStart, + NotificationsStart, + IUiSettingsClient, +} from 'src/core/public'; + import { DataPublicPluginStart } from '../../data/public'; import { createGetterSetter } from '../../kibana_utils/public'; import { MapsLegacyConfigType } from '../../maps_legacy/public'; @@ -34,6 +39,10 @@ export const [getKibanaMapFactory, setKibanaMapFactory] = createGetterSetter('UISettings'); +export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< + CoreStart['injectedMetadata'] +>('InjectedMetadata'); + export const [getSavedObjects, setSavedObjects] = createGetterSetter( 'SavedObjects' ); @@ -48,6 +57,5 @@ export const [getMapsLegacyConfig, setMapsLegacyConfig] = createGetterSetter getInjectedVars().esShardTimeout; export const getEnableExternalUrls = () => getInjectedVars().enableExternalUrls; export const getEmsTileLayerId = () => getMapsLegacyConfig().emsTileLayerId; diff --git a/src/plugins/vis_type_vega/public/vega_fn.ts b/src/plugins/vis_type_vega/public/vega_fn.ts index 6d45e043f7cee..a9c915fcfb636 100644 --- a/src/plugins/vis_type_vega/public/vega_fn.ts +++ b/src/plugins/vis_type_vega/public/vega_fn.ts @@ -54,8 +54,8 @@ export const createVegaFn = ( help: '', }, }, - async fn(input, args) { - const vegaRequestHandler = createVegaRequestHandler(dependencies); + async fn(input, args, context) { + const vegaRequestHandler = createVegaRequestHandler(dependencies, context.abortSignal); const response = await vegaRequestHandler({ timeRange: get(input, 'timeRange'), diff --git a/src/plugins/vis_type_vega/public/vega_request_handler.ts b/src/plugins/vis_type_vega/public/vega_request_handler.ts index efc02e368efa8..ac28f0b3782b2 100644 --- a/src/plugins/vis_type_vega/public/vega_request_handler.ts +++ b/src/plugins/vis_type_vega/public/vega_request_handler.ts @@ -19,14 +19,14 @@ import { Filter, esQuery, TimeRange, Query } from '../../data/public'; -// @ts-ignore -import { SearchCache } from './data_model/search_cache'; +import { SearchAPI } from './data_model/search_api'; + // @ts-ignore import { TimeCache } from './data_model/time_cache'; import { VegaVisualizationDependencies } from './plugin'; import { VisParams } from './vega_fn'; -import { getData } from './services'; +import { getData, getInjectedMetadata } from './services'; interface VegaRequestHandlerParams { query: Query; @@ -35,12 +35,11 @@ interface VegaRequestHandlerParams { visParams: VisParams; } -export function createVegaRequestHandler({ - plugins: { data }, - core: { uiSettings }, - serviceSettings, -}: VegaVisualizationDependencies) { - let searchCache: SearchCache | undefined; +export function createVegaRequestHandler( + { plugins: { data }, core: { uiSettings }, serviceSettings }: VegaVisualizationDependencies, + abortSignal?: AbortSignal +) { + let searchAPI: SearchAPI; const { timefilter } = data.query.timefilter; const timeCache = new TimeCache(timefilter, 3 * 1000); @@ -50,11 +49,15 @@ export function createVegaRequestHandler({ query, visParams, }: VegaRequestHandlerParams) { - if (!searchCache) { - searchCache = new SearchCache(getData().search.__LEGACY.esClient, { - max: 10, - maxAge: 4 * 1000, - }); + if (!searchAPI) { + searchAPI = new SearchAPI( + { + uiSettings, + search: getData().search, + injectedMetadata: getInjectedMetadata(), + }, + abortSignal + ); } timeCache.setTimeRange(timeRange); @@ -63,7 +66,7 @@ export function createVegaRequestHandler({ const filtersDsl = esQuery.buildEsQuery(undefined, query, filters, esQueryConfigs); // @ts-ignore const { VegaParser } = await import('./data_model/vega_parser'); - const vp = new VegaParser(visParams.spec, searchCache, timeCache, filtersDsl, serviceSettings); + const vp = new VegaParser(visParams.spec, searchAPI, timeCache, filtersDsl, serviceSettings); return await vp.parseAsync(); }; From 5260c32706316c80982cde3e5921187e6a24e3d0 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 9 Jun 2020 12:50:33 -0600 Subject: [PATCH 10/19] [Security] [Cases] Attach timeline to existing case (#68580) --- .../cases/components/add_comment/index.tsx | 32 + .../cases/components/all_cases/columns.tsx | 274 +++---- .../cases/components/all_cases/index.test.tsx | 16 +- .../cases/components/all_cases/index.tsx | 694 +++++++++--------- .../components/all_cases_modal/index.test.tsx | 140 ++++ .../components/all_cases_modal/index.tsx | 56 ++ .../all_cases_modal/translations.ts | 10 + .../public/cases/pages/case_details.tsx | 2 - .../public/common/mock/global_state.ts | 1 + .../public/common/mock/index.ts | 1 + .../components/flyout/header/index.tsx | 8 +- .../header_with_close_button/index.test.tsx | 30 +- .../__snapshots__/timeline.test.tsx.snap | 51 +- .../components/timeline/index.test.tsx | 14 +- .../insert_timeline_popover/index.test.tsx | 30 +- .../insert_timeline_popover/index.tsx | 35 +- .../use_insert_timeline.tsx | 2 +- .../timeline/properties/helpers.tsx | 51 +- .../timeline/properties/index.test.tsx | 477 ++++-------- .../components/timeline/properties/index.tsx | 39 + .../properties/properties_right.test.tsx | 4 +- .../timeline/properties/properties_right.tsx | 69 +- .../timeline/properties/translations.ts | 7 + .../components/timeline/timeline.test.tsx | 24 + .../timelines/store/timeline/actions.ts | 3 + .../timelines/store/timeline/helpers.ts | 1 + .../timelines/store/timeline/reducer.ts | 22 +- .../timelines/store/timeline/selectors.ts | 5 +- .../public/timelines/store/timeline/types.ts | 7 + 29 files changed, 1166 insertions(+), 939 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx create mode 100644 x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts diff --git a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx index a57fae8081bea..a830b299d655b 100644 --- a/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/add_comment/index.tsx @@ -8,6 +8,7 @@ import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; import React, { useCallback, useEffect } from 'react'; import styled from 'styled-components'; +import { useDispatch } from 'react-redux'; import { CommentRequest } from '../../../../../case/common/api'; import { usePostComment } from '../../containers/use_post_comment'; import { Case } from '../../containers/types'; @@ -18,6 +19,12 @@ import { Form, useForm, UseField } from '../../../shared_imports'; import * as i18n from './translations'; import { schema } from './schema'; +import { + dispatchUpdateTimeline, + queryTimelineById, +} from '../../../timelines/components/open_timeline/helpers'; +import { updateIsLoading as dispatchUpdateIsLoading } from '../../../timelines/store/timeline/actions'; +import { useApolloClient } from '../../../common/utils/apollo_context'; const MySpinner = styled(EuiLoadingSpinner)` position: absolute; @@ -46,6 +53,8 @@ export const AddComment = React.memo( options: { stripEmptyFields: false }, schema, }); + const dispatch = useDispatch(); + const apolloClient = useApolloClient(); const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( form, 'comment' @@ -62,6 +71,28 @@ export const AddComment = React.memo( // eslint-disable-next-line react-hooks/exhaustive-deps }, [insertQuote]); + const handleTimelineClick = useCallback( + (timelineId: string) => { + queryTimelineById({ + apolloClient, + timelineId, + updateIsLoading: ({ + id: currentTimelineId, + isLoading: isLoadingTimeline, + }: { + id: string; + isLoading: boolean; + }) => + dispatch( + dispatchUpdateIsLoading({ id: currentTimelineId, isLoading: isLoadingTimeline }) + ), + updateTimeline: dispatchUpdateTimeline(dispatch), + }); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [apolloClient] + ); + const onSubmit = useCallback(async () => { const { isValid, data } = await form.submit(); if (isValid) { @@ -86,6 +117,7 @@ export const AddComment = React.memo( dataTestSubj: 'add-comment', placeholder: i18n.ADD_COMMENT_HELP_TEXT, onCursorPositionUpdate: handleCursorChange, + onClickTimeline: handleTimelineClick, bottomRightContent: ( export const getCasesColumns = ( actions: Array>, - filterStatus: string -): CasesColumns[] => [ - { - name: i18n.NAME, - render: (theCase: Case) => { - if (theCase.id != null && theCase.title != null) { - const caseDetailsLinkComponent = ( - - {theCase.title} - - ); - return theCase.status === 'open' ? ( - caseDetailsLinkComponent - ) : ( - <> - + filterStatus: string, + isModal: boolean +): CasesColumns[] => { + const columns = [ + { + name: i18n.NAME, + render: (theCase: Case) => { + if (theCase.id != null && theCase.title != null) { + const caseDetailsLinkComponent = !isModal ? ( + + {theCase.title} + + ) : ( + {theCase.title} + ); + return theCase.status === 'open' ? ( + caseDetailsLinkComponent + ) : ( + <> {caseDetailsLinkComponent} - {i18n.CLOSED} - - - ); - } - return getEmptyTagValue(); + + {i18n.CLOSED} + + + ); + } + return getEmptyTagValue(); + }, }, - }, - { - field: 'createdBy', - name: i18n.REPORTER, - render: (createdBy: Case['createdBy']) => { - if (createdBy != null) { - return ( - <> - - - {createdBy.fullName ? createdBy.fullName : createdBy.username ?? ''} - - - ); - } - return getEmptyTagValue(); + { + field: 'createdBy', + name: i18n.REPORTER, + render: (createdBy: Case['createdBy']) => { + if (createdBy != null) { + return ( + <> + + + {createdBy.fullName ? createdBy.fullName : createdBy.username ?? ''} + + + ); + } + return getEmptyTagValue(); + }, + }, + { + field: 'tags', + name: i18n.TAGS, + render: (tags: Case['tags']) => { + if (tags != null && tags.length > 0) { + return ( + + {tags.map((tag: string, i: number) => ( + + {tag} + + ))} + + ); + } + return getEmptyTagValue(); + }, + truncateText: true, }, - }, - { - field: 'tags', - name: i18n.TAGS, - render: (tags: Case['tags']) => { - if (tags != null && tags.length > 0) { - return ( - - {tags.map((tag: string, i: number) => ( - - {tag} - - ))} - - ); - } - return getEmptyTagValue(); + { + align: 'right' as HorizontalAlignment, + field: 'totalComment', + name: i18n.COMMENTS, + sortable: true, + render: (totalComment: Case['totalComment']) => + totalComment != null + ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) + : getEmptyTagValue(), }, - truncateText: true, - }, - { - align: 'right', - field: 'totalComment', - name: i18n.COMMENTS, - sortable: true, - render: (totalComment: Case['totalComment']) => - totalComment != null - ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) - : getEmptyTagValue(), - }, - filterStatus === 'open' - ? { - field: 'createdAt', - name: i18n.OPENED_ON, - sortable: true, - render: (createdAt: Case['createdAt']) => { - if (createdAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); - }, - } - : { - field: 'closedAt', - name: i18n.CLOSED_ON, - sortable: true, - render: (closedAt: Case['closedAt']) => { - if (closedAt != null) { - return ( - - - - ); - } - return getEmptyTagValue(); + filterStatus === 'open' + ? { + field: 'createdAt', + name: i18n.OPENED_ON, + sortable: true, + render: (createdAt: Case['createdAt']) => { + if (createdAt != null) { + return ( + + + + ); + } + return getEmptyTagValue(); + }, + } + : { + field: 'closedAt', + name: i18n.CLOSED_ON, + sortable: true, + render: (closedAt: Case['closedAt']) => { + if (closedAt != null) { + return ( + + + + ); + } + return getEmptyTagValue(); + }, }, + { + name: i18n.EXTERNAL_INCIDENT, + render: (theCase: Case) => { + if (theCase.id != null) { + return ; + } + return getEmptyTagValue(); }, - { - name: i18n.EXTERNAL_INCIDENT, - render: (theCase: Case) => { - if (theCase.id != null) { - return ; - } - return getEmptyTagValue(); }, - }, - { - name: i18n.INCIDENT_MANAGEMENT_SYSTEM, - render: (theCase: Case) => { - if (theCase.externalService != null) { - return renderStringField( - `${theCase.externalService.connectorName}`, - `case-table-column-connector` - ); - } - return getEmptyTagValue(); + { + name: i18n.INCIDENT_MANAGEMENT_SYSTEM, + render: (theCase: Case) => { + if (theCase.externalService != null) { + return renderStringField( + `${theCase.externalService.connectorName}`, + `case-table-column-connector` + ); + } + return getEmptyTagValue(); + }, + }, + { + name: i18n.ACTIONS, + actions, }, - }, - { - name: i18n.ACTIONS, - actions, - }, -]; + ]; + if (isModal) { + columns.pop(); // remove actions if in modal + } + return columns; +}; interface Props { theCase: Case; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx index e3f4fee15ce68..bbb96f433d3c8 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.test.tsx @@ -151,8 +151,22 @@ describe('AllCases', () => { expect(column.find('.euiTableRowCell--hideForDesktop').text()).toEqual(columnName); expect(column.find('span').text()).toEqual(emptyTag); }; - getCasesColumns([], 'open').map((i, key) => i.name != null && checkIt(`${i.name}`, key)); + getCasesColumns([], 'open', false).map((i, key) => i.name != null && checkIt(`${i.name}`, key)); }); + + it('should not render case link or actions on modal=true', () => { + const wrapper = mount( + + + + ); + const checkIt = (columnName: string) => { + expect(columnName).not.toEqual(i18n.ACTIONS); + }; + getCasesColumns([], 'open', true).map((i, key) => i.name != null && checkIt(`${i.name}`)); + expect(wrapper.find(`a[data-test-subj="case-details-link"]`).exists()).toBeFalsy(); + }); + it('should tableHeaderSortButton AllCases', () => { const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx index 32a7c4078071e..d27f383fb94e3 100644 --- a/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases/index.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - +/* eslint-disable react-hooks/exhaustive-deps */ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { EuiBasicTable, @@ -72,7 +72,6 @@ const ProgressLoader = styled(EuiProgress)` z-index: ${theme.eui.euiZHeader}; `} `; - const getSortField = (field: string): SortFieldCase => { if (field === SortFieldCase.createdAt) { return SortFieldCase.createdAt; @@ -83,368 +82,373 @@ const getSortField = (field: string): SortFieldCase => { }; interface AllCasesProps { + onRowClick?: (id: string) => void; + isModal?: boolean; userCanCrud: boolean; } -export const AllCases = React.memo(({ userCanCrud }) => { - const urlSearch = useGetUrlSearch(navTabs.case); - const { actionLicense } = useGetActionLicense(); - const { - countClosedCases, - countOpenCases, - isLoading: isCasesStatusLoading, - fetchCasesStatus, - } = useGetCasesStatus(); - const { - data, - dispatchUpdateCaseProperty, - filterOptions, - loading, - queryParams, - selectedCases, - refetchCases, - setFilters, - setQueryParams, - setSelectedCases, - } = useGetCases(); +export const AllCases = React.memo( + ({ onRowClick = () => {}, isModal = false, userCanCrud }) => { + const urlSearch = useGetUrlSearch(navTabs.case); + const { actionLicense } = useGetActionLicense(); + const { + countClosedCases, + countOpenCases, + isLoading: isCasesStatusLoading, + fetchCasesStatus, + } = useGetCasesStatus(); + const { + data, + dispatchUpdateCaseProperty, + filterOptions, + loading, + queryParams, + selectedCases, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + } = useGetCases(); - // Delete case - const { - dispatchResetIsDeleted, - handleOnDeleteConfirm, - handleToggleModal, - isLoading: isDeleting, - isDeleted, - isDisplayConfirmDeleteModal, - } = useDeleteCases(); - - // Update case - const { - dispatchResetIsUpdated, - isLoading: isUpdating, - isUpdated, - updateBulkStatus, - } = useUpdateCases(); - const [deleteThisCase, setDeleteThisCase] = useState({ - title: '', - id: '', - }); - const [deleteBulk, setDeleteBulk] = useState([]); - const filterRefetch = useRef<() => void>(); - const setFilterRefetch = useCallback( - (refetchFilter: () => void) => { - filterRefetch.current = refetchFilter; - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterRefetch.current] - ); - const refreshCases = useCallback( - (dataRefresh = true) => { - if (dataRefresh) refetchCases(); - fetchCasesStatus(); - setSelectedCases([]); - setDeleteBulk([]); - if (filterRefetch.current != null) { - filterRefetch.current(); - } - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterOptions, queryParams, filterRefetch.current] - ); + // Delete case + const { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isLoading: isDeleting, + isDeleted, + isDisplayConfirmDeleteModal, + } = useDeleteCases(); - useEffect(() => { - if (isDeleted) { - refreshCases(); - dispatchResetIsDeleted(); - } - if (isUpdated) { - refreshCases(); - dispatchResetIsUpdated(); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isDeleted, isUpdated]); - const confirmDeleteModal = useMemo( - () => ( - 0} - onCancel={handleToggleModal} - onConfirm={handleOnDeleteConfirm.bind( - null, - deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] - )} - /> - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] - ); + // Update case + const { + dispatchResetIsUpdated, + isLoading: isUpdating, + isUpdated, + updateBulkStatus, + } = useUpdateCases(); + const [deleteThisCase, setDeleteThisCase] = useState({ + title: '', + id: '', + }); + const [deleteBulk, setDeleteBulk] = useState([]); + const filterRefetch = useRef<() => void>(); + const setFilterRefetch = useCallback( + (refetchFilter: () => void) => { + filterRefetch.current = refetchFilter; + }, + [filterRefetch.current] + ); + const refreshCases = useCallback( + (dataRefresh = true) => { + if (dataRefresh) refetchCases(); + fetchCasesStatus(); + setSelectedCases([]); + setDeleteBulk([]); + if (filterRefetch.current != null) { + filterRefetch.current(); + } + }, + [filterOptions, queryParams, filterRefetch.current] + ); - const toggleDeleteModal = useCallback((deleteCase: Case) => { - handleToggleModal(); - setDeleteThisCase(deleteCase); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + useEffect(() => { + if (isDeleted) { + refreshCases(); + dispatchResetIsDeleted(); + } + if (isUpdated) { + refreshCases(); + dispatchResetIsUpdated(); + } + }, [isDeleted, isUpdated]); + const confirmDeleteModal = useMemo( + () => ( + 0} + onCancel={handleToggleModal} + onConfirm={handleOnDeleteConfirm.bind( + null, + deleteBulk.length > 0 ? deleteBulk : [deleteThisCase] + )} + /> + ), + [deleteBulk, deleteThisCase, isDisplayConfirmDeleteModal] + ); - const toggleBulkDeleteModal = useCallback( - (caseIds: string[]) => { + const toggleDeleteModal = useCallback((deleteCase: Case) => { handleToggleModal(); - if (caseIds.length === 1) { - const singleCase = selectedCases.find((theCase) => theCase.id === caseIds[0]); - if (singleCase) { - return setDeleteThisCase({ id: singleCase.id, title: singleCase.title }); + setDeleteThisCase(deleteCase); + }, []); + + const toggleBulkDeleteModal = useCallback( + (caseIds: string[]) => { + handleToggleModal(); + if (caseIds.length === 1) { + const singleCase = selectedCases.find((theCase) => theCase.id === caseIds[0]); + if (singleCase) { + return setDeleteThisCase({ id: singleCase.id, title: singleCase.title }); + } } - } - const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); - setDeleteBulk(convertToDeleteCases); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); + const convertToDeleteCases: DeleteCase[] = caseIds.map((id) => ({ id })); + setDeleteBulk(convertToDeleteCases); + }, + [selectedCases] + ); - const handleUpdateCaseStatus = useCallback( - (status: string) => { - updateBulkStatus(selectedCases, status); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); + const handleUpdateCaseStatus = useCallback( + (status: string) => { + updateBulkStatus(selectedCases, status); + }, + [selectedCases] + ); - const selectedCaseIds = useMemo( - (): string[] => selectedCases.map((caseObj: Case) => caseObj.id), - [selectedCases] - ); + const selectedCaseIds = useMemo( + (): string[] => selectedCases.map((caseObj: Case) => caseObj.id), + [selectedCases] + ); - const getBulkItemsPopoverContent = useCallback( - (closePopover: () => void) => ( - - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] - ); - const handleDispatchUpdate = useCallback( - (args: Omit) => { - dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); - }, - [dispatchUpdateCaseProperty, fetchCasesStatus] - ); + const getBulkItemsPopoverContent = useCallback( + (closePopover: () => void) => ( + + ), + [selectedCaseIds, filterOptions.status, toggleBulkDeleteModal] + ); + const handleDispatchUpdate = useCallback( + (args: Omit) => { + dispatchUpdateCaseProperty({ ...args, refetchCasesStatus: fetchCasesStatus }); + }, + [dispatchUpdateCaseProperty, fetchCasesStatus] + ); - const actions = useMemo( - () => - getActions({ - caseStatus: filterOptions.status, - deleteCaseOnClick: toggleDeleteModal, - dispatchUpdate: handleDispatchUpdate, - }), - [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] - ); + const actions = useMemo( + () => + getActions({ + caseStatus: filterOptions.status, + deleteCaseOnClick: toggleDeleteModal, + dispatchUpdate: handleDispatchUpdate, + }), + [filterOptions.status, toggleDeleteModal, handleDispatchUpdate] + ); - const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); + const actionsErrors = useMemo(() => getActionLicenseError(actionLicense), [actionLicense]); - const tableOnChangeCallback = useCallback( - ({ page, sort }: EuiBasicTableOnChange) => { - let newQueryParams = queryParams; - if (sort) { - newQueryParams = { - ...newQueryParams, - sortField: getSortField(sort.field), - sortOrder: sort.direction, - }; - } - if (page) { - newQueryParams = { - ...newQueryParams, - page: page.index + 1, - perPage: page.size, - }; - } - setQueryParams(newQueryParams); - refreshCases(false); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [queryParams] - ); + const tableOnChangeCallback = useCallback( + ({ page, sort }: EuiBasicTableOnChange) => { + let newQueryParams = queryParams; + if (sort) { + newQueryParams = { + ...newQueryParams, + sortField: getSortField(sort.field), + sortOrder: sort.direction, + }; + } + if (page) { + newQueryParams = { + ...newQueryParams, + page: page.index + 1, + perPage: page.size, + }; + } + setQueryParams(newQueryParams); + refreshCases(false); + }, + [queryParams] + ); - const onFilterChangedCallback = useCallback( - (newFilterOptions: Partial) => { - if (newFilterOptions.status && newFilterOptions.status === 'closed') { - setQueryParams({ sortField: SortFieldCase.closedAt }); - } else if (newFilterOptions.status && newFilterOptions.status === 'open') { - setQueryParams({ sortField: SortFieldCase.createdAt }); - } - setFilters(newFilterOptions); - refreshCases(false); - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [filterOptions, queryParams] - ); + const onFilterChangedCallback = useCallback( + (newFilterOptions: Partial) => { + if (newFilterOptions.status && newFilterOptions.status === 'closed') { + setQueryParams({ sortField: SortFieldCase.closedAt }); + } else if (newFilterOptions.status && newFilterOptions.status === 'open') { + setQueryParams({ sortField: SortFieldCase.createdAt }); + } + setFilters(newFilterOptions); + refreshCases(false); + }, + [filterOptions, queryParams] + ); - const memoizedGetCasesColumns = useMemo( - () => getCasesColumns(userCanCrud ? actions : [], filterOptions.status), - [actions, filterOptions.status, userCanCrud] - ); - const memoizedPagination = useMemo( - () => ({ - pageIndex: queryParams.page - 1, - pageSize: queryParams.perPage, - totalItemCount: data.total, - pageSizeOptions: [5, 10, 15, 20, 25], - }), - [data, queryParams] - ); + const memoizedGetCasesColumns = useMemo( + () => getCasesColumns(userCanCrud ? actions : [], filterOptions.status, isModal), + [actions, filterOptions.status, userCanCrud, isModal] + ); + const memoizedPagination = useMemo( + () => ({ + pageIndex: queryParams.page - 1, + pageSize: queryParams.perPage, + totalItemCount: data.total, + pageSizeOptions: [5, 10, 15, 20, 25], + }), + [data, queryParams] + ); - const sorting: EuiTableSortingType = { - sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, - }; - const euiBasicTableSelectionProps = useMemo>( - () => ({ onSelectionChange: setSelectedCases }), - // eslint-disable-next-line react-hooks/exhaustive-deps - [selectedCases] - ); - const isCasesLoading = useMemo( - () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, - [loading] - ); - const isDataEmpty = useMemo(() => data.total === 0, [data]); + const sorting: EuiTableSortingType = { + sort: { field: queryParams.sortField, direction: queryParams.sortOrder }, + }; + const euiBasicTableSelectionProps = useMemo>( + () => ({ onSelectionChange: setSelectedCases }), + [selectedCases] + ); + const isCasesLoading = useMemo( + () => loading.indexOf('cases') > -1 || loading.indexOf('caseUpdate') > -1, + [loading] + ); + const isDataEmpty = useMemo(() => data.total === 0, [data]); - return ( - <> - {!isEmpty(actionsErrors) && ( - - )} - - - - - - - - - - } - titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} - urlSearch={urlSearch} - /> - - - - {i18n.CREATE_TITLE} - - - - - {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( - - )} - - - {isCasesLoading && isDataEmpty ? ( -
- -
- ) : ( -
- - - - - {i18n.SHOWING_CASES(data.total ?? 0)} - - - - - {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} - - {userCanCrud && ( - - {i18n.BULK_ACTIONS} - - )} - - {i18n.REFRESH} - - - - - {i18n.NO_CASES}} - titleSize="xs" - body={i18n.NO_CASES_BODY} - actions={ - - {i18n.ADD_NEW_CASE} - - } + const TableWrap = useMemo(() => (isModal ? 'span' : Panel), [isModal]); + return ( + <> + {!isEmpty(actionsErrors) && ( + + )} + {!isModal && ( + + + + + + + - } - onChange={tableOnChangeCallback} - pagination={memoizedPagination} - selection={userCanCrud ? euiBasicTableSelectionProps : {}} - sorting={sorting} - /> -
+ + + } + titleTooltip={!isEmpty(actionsErrors) ? actionsErrors[0].title : ''} + urlSearch={urlSearch} + /> + + + + {i18n.CREATE_TITLE} + + + + + )} + {(isCasesLoading || isDeleting || isUpdating) && !isDataEmpty && ( + )} -
- {confirmDeleteModal} - - ); -}); + + + {isCasesLoading && isDataEmpty ? ( +
+ +
+ ) : ( +
+ + + + + {i18n.SHOWING_CASES(data.total ?? 0)} + + + {!isModal && ( + + + {i18n.SHOWING_SELECTED_CASES(selectedCases.length)} + + {userCanCrud && ( + + {i18n.BULK_ACTIONS} + + )} + + {i18n.REFRESH} + + + )} + + + {i18n.NO_CASES}} + titleSize="xs" + body={i18n.NO_CASES_BODY} + actions={ + + {i18n.ADD_NEW_CASE} + + } + /> + } + onChange={tableOnChangeCallback} + pagination={memoizedPagination} + rowProps={(item) => + isModal + ? { + onClick: () => onRowClick(item.id), + } + : {} + } + selection={userCanCrud && !isModal ? euiBasicTableSelectionProps : undefined} + sorting={sorting} + /> +
+ )} +
+ {confirmDeleteModal} + + ); + } +); AllCases.displayName = 'AllCases'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx new file mode 100644 index 0000000000000..a24cb6a87de74 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.test.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { mount } from 'enzyme'; +import React from 'react'; +import { AllCasesModal } from '.'; +import { TestProviders } from '../../../common/mock'; + +import { useGetCasesMockState, basicCaseId } from '../../containers/mock'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { useGetCases } from '../../containers/use_get_cases'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; +import { EuiTableRow } from '@elastic/eui'; + +jest.mock('../../containers/use_bulk_update_case'); +jest.mock('../../containers/use_delete_cases'); +jest.mock('../../containers/use_get_cases'); +jest.mock('../../containers/use_get_cases_status'); + +const useDeleteCasesMock = useDeleteCases as jest.Mock; +const useGetCasesMock = useGetCases as jest.Mock; +const useGetCasesStatusMock = useGetCasesStatus as jest.Mock; +const useUpdateCasesMock = useUpdateCases as jest.Mock; +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); + +const onCloseCaseModal = jest.fn(); +const onRowClick = jest.fn(); +const defaultProps = { + onCloseCaseModal, + onRowClick, + showCaseModal: true, +}; +describe('AllCasesModal', () => { + const dispatchResetIsDeleted = jest.fn(); + const dispatchResetIsUpdated = jest.fn(); + const dispatchUpdateCaseProperty = jest.fn(); + const handleOnDeleteConfirm = jest.fn(); + const handleToggleModal = jest.fn(); + const refetchCases = jest.fn(); + const setFilters = jest.fn(); + const setQueryParams = jest.fn(); + const setSelectedCases = jest.fn(); + const updateBulkStatus = jest.fn(); + const fetchCasesStatus = jest.fn(); + + const defaultGetCases = { + ...useGetCasesMockState, + dispatchUpdateCaseProperty, + refetchCases, + setFilters, + setQueryParams, + setSelectedCases, + }; + const defaultDeleteCases = { + dispatchResetIsDeleted, + handleOnDeleteConfirm, + handleToggleModal, + isDeleted: false, + isDisplayConfirmDeleteModal: false, + isLoading: false, + }; + const defaultCasesStatus = { + countClosedCases: 0, + countOpenCases: 5, + fetchCasesStatus, + isError: false, + isLoading: true, + }; + const defaultUpdateCases = { + isUpdated: false, + isLoading: false, + isError: false, + dispatchResetIsUpdated, + updateBulkStatus, + }; + /* eslint-disable no-console */ + // Silence until enzyme fixed to use ReactTestUtils.act() + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ + beforeEach(() => { + jest.resetAllMocks(); + useUpdateCasesMock.mockImplementation(() => defaultUpdateCases); + useGetCasesMock.mockImplementation(() => defaultGetCases); + useDeleteCasesMock.mockImplementation(() => defaultDeleteCases); + useGetCasesStatusMock.mockImplementation(() => defaultCasesStatus); + }); + + it('renders with unselectable rows', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeTruthy(); + expect(wrapper.find(EuiTableRow).first().prop('isSelectable')).toBeFalsy(); + }); + it('does not render modal if showCaseModal: false', () => { + const wrapper = mount( + + + + ); + expect(wrapper.find(`[data-test-subj='all-cases-modal']`).exists()).toBeFalsy(); + }); + it('onRowClick called when row is clicked', () => { + const wrapper = mount( + + + + ); + const firstRow = wrapper.find(EuiTableRow).first(); + firstRow.simulate('click'); + expect(onRowClick.mock.calls[0][0]).toEqual(basicCaseId); + }); + it('Closing modal calls onCloseCaseModal', () => { + const wrapper = mount( + + + + ); + const modalClose = wrapper.find('.euiModal__closeIcon').first(); + modalClose.simulate('click'); + expect(onCloseCaseModal).toBeCalled(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx new file mode 100644 index 0000000000000..d2ca0f0cd02ee --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/index.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { + EuiModal, + EuiModalBody, + EuiModalHeader, + EuiModalHeaderTitle, + EuiOverlayMask, +} from '@elastic/eui'; +import { useGetUserSavedObjectPermissions } from '../../../common/lib/kibana'; +import { AllCases } from '../all_cases'; +import * as i18n from './translations'; + +interface AllCasesModalProps { + onCloseCaseModal: () => void; + showCaseModal: boolean; + onRowClick: (id: string) => void; +} + +export const AllCasesModalComponent = ({ + onCloseCaseModal, + onRowClick, + showCaseModal, +}: AllCasesModalProps) => { + const userPermissions = useGetUserSavedObjectPermissions(); + let modal; + if (showCaseModal) { + modal = ( + + + + {i18n.SELECT_CASE_TITLE} + + + + + + + ); + } + + return <>{modal}; +}; + +export const AllCasesModal = React.memo(AllCasesModalComponent); + +AllCasesModal.displayName = 'AllCasesModal'; diff --git a/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts new file mode 100644 index 0000000000000..e0f84d8541424 --- /dev/null +++ b/x-pack/plugins/security_solution/public/cases/components/all_cases_modal/translations.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +export const SELECT_CASE_TITLE = i18n.translate('xpack.securitySolution.case.caseModal.title', { + defaultMessage: 'Select case to attach timeline', +}); diff --git a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx index 5dfe12179b990..780de303c02d3 100644 --- a/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx +++ b/x-pack/plugins/security_solution/public/cases/pages/case_details.tsx @@ -10,7 +10,6 @@ import { useParams, Redirect } from 'react-router-dom'; import { WrapperPage } from '../../common/components/wrapper_page'; import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; -import { SpyRoute } from '../../common/utils/route/spy_routes'; import { getCaseUrl } from '../../common/components/link_to'; import { navTabs } from '../../app/home/home_navigations'; import { CaseView } from '../components/case_view'; @@ -36,7 +35,6 @@ export const CaseDetailsPage = React.memo(() => { )} - ) : null; }); diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 4af39ade70d25..3e84e4035e15e 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -229,6 +229,7 @@ export const mockGlobalState: State = { status: TimelineStatus.active, }, }, + insertTimeline: null, }, /** * These state's are wrapped in `Immutable`, but for compatibility with the overall app architecture, diff --git a/x-pack/plugins/security_solution/public/common/mock/index.ts b/x-pack/plugins/security_solution/public/common/mock/index.ts index bdad0ab1712ab..30eb4c63f40b8 100644 --- a/x-pack/plugins/security_solution/public/common/mock/index.ts +++ b/x-pack/plugins/security_solution/public/common/mock/index.ts @@ -15,3 +15,4 @@ export * from './test_providers'; export * from './utils'; export * from './mock_ecs'; export * from './timeline_results'; +export * from './kibana_react'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx index ab8a24889e9bf..8ad32d6e2cad0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header/index.tsx @@ -33,14 +33,14 @@ const StatefulFlyoutHeader = React.memo( associateNote, createTimeline, description, - isFavorite, isDataInTimeline, isDatepickerLocked, - title, + isFavorite, noteIds, notesById, status, timelineId, + title, toggleLock, updateDescription, updateIsFavorite, @@ -61,15 +61,15 @@ const StatefulFlyoutHeader = React.memo( isDataInTimeline={isDataInTimeline} isDatepickerLocked={isDatepickerLocked} isFavorite={isFavorite} - title={title} noteIds={noteIds} status={status} timelineId={timelineId} + title={title} toggleLock={toggleLock} updateDescription={updateDescription} updateIsFavorite={updateIsFavorite} - updateTitle={updateTitle} updateNote={updateNote} + updateTitle={updateTitle} usersViewing={usersViewing} /> ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx index 34a20e7215906..e5fc8b68b1cb7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/header_with_close_button/index.test.tsx @@ -10,22 +10,26 @@ import React from 'react'; import { TestProviders } from '../../../../common/mock'; import { FlyoutHeaderWithCloseButton } from '.'; -jest.mock('../../../../common/lib/kibana', () => { - return { - useKibana: jest.fn().mockReturnValue({ - services: { - application: { - capabilities: { - securitySolution: { - crud: true, - }, +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: jest.fn(), +})); +jest.mock('../../../../common/lib/kibana', () => ({ + ...jest.requireActual('../../../../common/lib/kibana'), + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, }, }, }, - }), - useUiSetting$: jest.fn().mockReturnValue([]), - }; -}); + }, + }), + useUiSetting$: jest.fn().mockReturnValue([]), + useGetUserSavedObjectPermissions: jest.fn(), +})); describe('FlyoutHeaderWithCloseButton', () => { test('renders correctly against snapshot', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap index 4ed0b52fc0f14..4e6cce618880b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap @@ -606,19 +606,40 @@ exports[`Timeline rendering renders correctly against snapshot 1`] = ` }, "filters": Array [], "uiSettings": Object { - "get": [Function], - "get$": [MockFunction], - "getAll": [MockFunction], - "getSaved$": [MockFunction], - "getUpdate$": [MockFunction], - "getUpdateErrors$": [MockFunction], - "isCustom": [MockFunction], - "isDeclared": [MockFunction], - "isDefault": [MockFunction], - "isOverridden": [MockFunction], - "overrideLocalDefault": [MockFunction], - "remove": [MockFunction], - "set": [MockFunction], + "get": [MockFunction] { + "calls": Array [ + Array [ + "query:allowLeadingWildcards", + ], + Array [ + "query:queryString:options", + ], + Array [ + "courier:ignoreFilterIfFieldNotInIndex", + ], + Array [ + "dateFormat:tz", + ], + ], + "results": Array [ + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + Object { + "type": "return", + "value": undefined, + }, + ], + }, }, "updated$": Subject { "_isScalar": false, @@ -826,7 +847,7 @@ exports[`Timeline rendering renders correctly against snapshot 1`] = ` } inputId="timeline" /> - - + `; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx index 931623d080198..3110129867628 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/index.test.tsx @@ -26,15 +26,25 @@ import { mockDataProviders } from './data_providers/mock/mock_data_providers'; import { StatefulTimeline, Props as StatefulTimelineProps } from './index'; import { Timeline } from './timeline'; -jest.mock('../../../common/lib/kibana'); +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); + const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); mockUseResizeObserver.mockImplementation(() => ({})); const mockUseSignalIndex: jest.Mock = useSignalIndex as jest.Mock; jest.mock('../../../alerts/containers/detection_engine/alerts/use_signal_index'); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: jest.fn(), +})); jest.mock('../flyout/header_with_close_button'); - describe('StatefulTimeline', () => { let props = {} as StatefulTimelineProps; const sort: Sort = { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx index 0a70413b7ea29..2ffbae1f7eb5c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx @@ -17,6 +17,14 @@ jest.mock('react-redux', () => { return { ...reactRedux, useDispatch: () => mockDispatch, + useSelector: jest + .fn() + .mockReturnValueOnce({ + timelineId: 'timeline-id', + timelineSavedObjectId: '34578-3497-5893-47589-34759', + timelineTitle: 'Timeline title', + }) + .mockReturnValue(null), }; }); const mockLocation = { @@ -25,17 +33,6 @@ const mockLocation = { search: '', state: '', }; -const mockLocationWithState = { - ...mockLocation, - state: { - insertTimeline: { - timelineId: 'timeline-id', - timelineSavedObjectId: '34578-3497-5893-47589-34759', - timelineTitle: 'Timeline title', - }, - }, -}; - const onTimelineChange = jest.fn(); const defaultProps = { isDisabled: false, @@ -43,18 +40,21 @@ const defaultProps = { }; describe('Insert timeline popover ', () => { - beforeEach(() => { - jest.resetAllMocks(); + afterEach(() => { + jest.clearAllMocks(); }); it('should insert a timeline when passed in the router state', () => { - jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocationWithState); mount(); - expect(mockDispatch).toBeCalledWith({ + expect(mockDispatch.mock.calls[0][0]).toEqual({ payload: { id: 'timeline-id', show: false }, type: 'x-pack/security_solution/local/timeline/SHOW_TIMELINE', }); expect(onTimelineChange).toBeCalledWith('Timeline title', '34578-3497-5893-47589-34759'); + expect(mockDispatch.mock.calls[1][0]).toEqual({ + payload: null, + type: 'x-pack/security_solution/local/timeline/SET_INSERT_TIMELINE', + }); }); it('should do nothing when router state', () => { jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx index ed4d742bb8b4d..de199d9a1cc2e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/index.tsx @@ -6,14 +6,15 @@ import { EuiButtonIcon, EuiPopover, EuiSelectableOption, EuiToolTip } from '@elastic/eui'; import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; -import { useLocation } from 'react-router-dom'; -import { useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { OpenTimelineResult } from '../../open_timeline/types'; import { SelectableTimeline } from '../selectable_timeline'; import * as i18n from '../translations'; -import { timelineActions } from '../../../../timelines/store/timeline'; +import { timelineActions, timelineSelectors } from '../../../../timelines/store/timeline'; import { TimelineType } from '../../../../../common/types/timeline'; +import { State } from '../../../../common/store'; +import { setInsertTimeline } from '../../../store/timeline/actions'; interface InsertTimelinePopoverProps { isDisabled: boolean; @@ -21,14 +22,6 @@ interface InsertTimelinePopoverProps { onTimelineChange: (timelineTitle: string, timelineId: string | null) => void; } -interface RouterState { - insertTimeline: { - timelineId: string; - timelineSavedObjectId: string; - timelineTitle: string; - }; -} - type Props = InsertTimelinePopoverProps; export const InsertTimelinePopoverComponent: React.FC = ({ @@ -38,22 +31,18 @@ export const InsertTimelinePopoverComponent: React.FC = ({ }) => { const dispatch = useDispatch(); const [isPopoverOpen, setIsPopoverOpen] = useState(false); - const { state } = useLocation(); - const [routerState, setRouterState] = useState(state ?? null); + const insertTimeline = useSelector((state: State) => { + return timelineSelectors.selectInsertTimeline(state); + }); useEffect(() => { - if (routerState && routerState.insertTimeline) { - dispatch( - timelineActions.showTimeline({ id: routerState.insertTimeline.timelineId, show: false }) - ); - onTimelineChange( - routerState.insertTimeline.timelineTitle, - routerState.insertTimeline.timelineSavedObjectId - ); - setRouterState(null); + if (insertTimeline != null) { + dispatch(timelineActions.showTimeline({ id: insertTimeline.timelineId, show: false })); + onTimelineChange(insertTimeline.timelineTitle, insertTimeline.timelineSavedObjectId); + dispatch(setInsertTimeline(null)); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [routerState]); + }, [insertTimeline, dispatch]); const handleClosePopover = useCallback(() => { setIsPopoverOpen(false); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx index 0f9e64082a603..6269bc1b4a1a3 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx @@ -17,7 +17,7 @@ export const useInsertTimeline = (form: FormHook, fieldNa }); const handleOnTimelineChange = useCallback( (title: string, id: string | null) => { - const builtLink = `${basePath}/app/siem#/timelines?timeline=(id:'${id}',isOpen:!t)`; + const builtLink = `${basePath}/app/security#/timelines?timeline=(id:'${id}',isOpen:!t)`; const currentValue = form.getFormData()[fieldName]; const newValue: string = [ currentValue.slice(0, cursorPosition.start), diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx index 9e74298f3aca9..00a0e57324841 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/helpers.tsx @@ -21,7 +21,7 @@ import React, { useCallback } from 'react'; import uuid from 'uuid'; import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; -import { useSelector } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; import { TimelineTypeLiteral, @@ -41,6 +41,7 @@ import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { NOTES_PANEL_WIDTH } from './notes_size'; import { ButtonContainer, DescriptionContainer, LabelText, NameField, StyledStar } from './styles'; import * as i18n from './translations'; +import { setInsertTimeline } from '../../../store/timeline/actions'; import { useCreateTimelineButton } from './use_create_timeline'; export const historyToolTip = 'The chronological history of actions related to this timeline'; @@ -144,23 +145,25 @@ interface NewCaseProps { export const NewCase = React.memo( ({ onClosePopover, timelineId, timelineStatus, timelineTitle }) => { const history = useHistory(); + const dispatch = useDispatch(); const { savedObjectId } = useSelector((state: State) => timelineSelectors.selectTimeline(state, timelineId) ); + const handleClick = useCallback(() => { onClosePopover(); history.push({ pathname: `/${SiemPageName.case}/create`, - state: { - insertTimeline: { - timelineId, - timelineSavedObjectId: savedObjectId, - timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, - }, - }, }); + dispatch( + setInsertTimeline({ + timelineId, + timelineSavedObjectId: savedObjectId, + timelineTitle: timelineTitle.length > 0 ? timelineTitle : i18n.UNTITLED_TIMELINE, + }) + ); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [onClosePopover, history, timelineId, timelineTitle]); + }, [dispatch, onClosePopover, history, timelineId, timelineTitle]); return ( ( ); NewCase.displayName = 'NewCase'; +interface ExistingCaseProps { + onClosePopover: () => void; + onOpenCaseModal: () => void; + timelineStatus: TimelineStatus; +} +export const ExistingCase = React.memo( + ({ onClosePopover, onOpenCaseModal, timelineStatus }) => { + const handleClick = useCallback(() => { + onClosePopover(); + onOpenCaseModal(); + }, [onOpenCaseModal, onClosePopover]); + + return ( + <> + + {i18n.ATTACH_TIMELINE_TO_EXISTING_CASE} + + + ); + } +); +ExistingCase.displayName = 'ExistingCase'; + export interface NewTimelineProps { createTimeline?: CreateTimeline; closeGearMenu?: () => void; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx index 952a7c104e19e..505d0b8cba854 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.test.tsx @@ -6,33 +6,43 @@ import { mount } from 'enzyme'; import React from 'react'; -import { Provider as ReduxStoreProvider } from 'react-redux'; - import { TimelineStatus } from '../../../../../common/types/timeline'; import { mockGlobalState, apolloClientObservable, SUB_PLUGINS_REDUCER, + TestProviders, } from '../../../../common/mock'; import { createStore, State } from '../../../../common/store'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Properties, showDescriptionThreshold, showNotesThreshold } from '.'; +import { SiemPageName } from '../../../../app/types'; +import { setInsertTimeline } from '../../../store/timeline/actions'; +export { nextTick } from '../../../../../../../test_utils'; + +import { act } from 'react-dom/test-utils'; -jest.mock('../../../../common/lib/kibana', () => ({ - useKibana: jest.fn().mockReturnValue({ - services: { - application: { - capabilities: { - securitySolution: { - crud: true, +jest.mock('../../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../../common/lib/kibana'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + application: { + capabilities: { + securitySolution: { + crud: true, + }, }, }, }, - }, - }), - useUiSetting$: jest.fn().mockReturnValue([]), -})); + }), + useUiSetting$: jest.fn().mockReturnValue([]), + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); +const mockDispatch = jest.fn(); jest.mock('../../../../common/components/utils', () => { return { useThrottledResizeObserver: jest.fn(), @@ -48,21 +58,44 @@ jest.mock('react-redux', () => { }; }); -jest.mock('react-router-dom', () => { - const originalModule = jest.requireActual('react-router-dom'); +jest.mock('react-redux', () => ({ + ...jest.requireActual('react-redux'), + useDispatch: () => mockDispatch, + useSelector: jest.fn().mockReturnValue({ savedObjectId: '1', urlState: {} }), +})); +const mockHistoryPush = jest.fn(); - return { - ...originalModule, - useHistory: jest.fn(), - }; -}); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useHistory: () => ({ + push: mockHistoryPush, + }), +})); jest.mock('./use_create_timeline', () => ({ useCreateTimelineButton: jest.fn().mockReturnValue({ getButton: jest.fn() }), })); - +const usersViewing = ['elastic']; +const defaultProps = { + associateNote: jest.fn(), + createTimeline: jest.fn(), + isDataInTimeline: false, + isDatepickerLocked: false, + isFavorite: false, + title: '', + description: '', + getNotesByIds: jest.fn(), + noteIds: [], + status: TimelineStatus.active, + timelineId: 'abc', + toggleLock: jest.fn(), + updateDescription: jest.fn(), + updateIsFavorite: jest.fn(), + updateTitle: jest.fn(), + updateNote: jest.fn(), + usersViewing, +}; describe('Properties', () => { - const usersViewing = ['elastic']; const state: State = mockGlobalState; let mockedWidth = 1000; let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); @@ -75,27 +108,9 @@ describe('Properties', () => { test('renders correctly', () => { const wrapper = mount( - - - + + + ); wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); @@ -104,31 +119,16 @@ describe('Properties', () => { expect(wrapper.find('button[data-test-subj="attach-timeline-case"]').prop('disabled')).toEqual( false ); + expect( + wrapper.find('button[data-test-subj="attach-timeline-existing-case"]').prop('disabled') + ).toEqual(false); }); test('renders correctly draft timeline', () => { const wrapper = mount( - - - + + + ); wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); @@ -136,31 +136,16 @@ describe('Properties', () => { expect(wrapper.find('button[data-test-subj="attach-timeline-case"]').prop('disabled')).toEqual( true ); + expect( + wrapper.find('button[data-test-subj="attach-timeline-existing-case"]').prop('disabled') + ).toEqual(true); }); test('it renders an empty star icon when it is NOT a favorite', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-favorite-empty-star"]').exists()).toEqual(true); @@ -168,27 +153,9 @@ describe('Properties', () => { test('it renders a filled star icon when it is a favorite', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-favorite-filled-star"]').exists()).toEqual(true); @@ -198,27 +165,9 @@ describe('Properties', () => { const title = 'foozle'; const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="timeline-title"]').first().props().value).toEqual(title); @@ -226,27 +175,9 @@ describe('Properties', () => { test('it renders the date picker with the lock icon', () => { const wrapper = mount( - - - + + + ); expect( @@ -259,27 +190,9 @@ describe('Properties', () => { test('it renders the lock icon when isDatepickerLocked is true', () => { const wrapper = mount( - - - + + + ); expect( wrapper @@ -291,27 +204,9 @@ describe('Properties', () => { test('it renders the unlock icon when isDatepickerLocked is false', () => { const wrapper = mount( - - - + + + ); expect( wrapper @@ -328,27 +223,9 @@ describe('Properties', () => { (useThrottledResizeObserver as jest.Mock).mockReturnValue({ width: showDescriptionThreshold }); const wrapper = mount( - - - + + + ); expect( @@ -369,27 +246,9 @@ describe('Properties', () => { }); const wrapper = mount( - - - + + + ); expect( @@ -404,27 +263,9 @@ describe('Properties', () => { mockedWidth = showNotesThreshold; const wrapper = mount( - - - + + + ); expect( @@ -442,27 +283,9 @@ describe('Properties', () => { }); const wrapper = mount( - - - + + + ); expect( @@ -475,27 +298,9 @@ describe('Properties', () => { test('it renders a settings icon', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="settings-gear"]').exists()).toEqual(true); @@ -505,27 +310,9 @@ describe('Properties', () => { const title = 'port scan'; const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="avatar"]').exists()).toEqual(true); @@ -533,29 +320,45 @@ describe('Properties', () => { test('it does NOT render an avatar for the current user viewing the timeline when it does NOT have a title', () => { const wrapper = mount( - - - + + + ); expect(wrapper.find('[data-test-subj="avatar"]').exists()).toEqual(false); }); + + test('insert timeline - new case', () => { + const wrapper = mount( + + + + ); + wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); + wrapper.find('[data-test-subj="attach-timeline-case"]').first().simulate('click'); + + expect(mockHistoryPush).toBeCalledWith({ pathname: `/${SiemPageName.case}/create` }); + expect(mockDispatch).toBeCalledWith( + setInsertTimeline({ + timelineId: defaultProps.timelineId, + timelineSavedObjectId: '1', + timelineTitle: 'coolness', + }) + ); + }); + + test('insert timeline - existing case', async () => { + const wrapper = mount( + + + + ); + wrapper.find('[data-test-subj="settings-gear"]').at(0).simulate('click'); + wrapper.find('[data-test-subj="attach-timeline-existing-case"]').first().simulate('click'); + + await act(async () => { + await Promise.resolve({}); + }); + expect(wrapper.find('[data-test-subj="all-cases-modal"]').exists()).toBeTruthy(); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx index d4c43c9929f0e..be79c0773bf88 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/index.tsx @@ -6,6 +6,8 @@ import React, { useState, useCallback, useMemo } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { useHistory } from 'react-router-dom'; import { TimelineStatus, TimelineTypeLiteral } from '../../../../../common/types/timeline'; import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Note } from '../../../../common/lib/note'; @@ -16,6 +18,12 @@ import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { TimelineProperties } from './styles'; import { PropertiesRight } from './properties_right'; import { PropertiesLeft } from './properties_left'; +import { AllCasesModal } from '../../../../cases/components/all_cases_modal'; +import { SiemPageName } from '../../../../app/types'; +import * as i18n from './translations'; +import { State } from '../../../../common/store'; +import { timelineSelectors } from '../../../store/timeline'; +import { setInsertTimeline } from '../../../store/timeline/actions'; type CreateTimeline = ({ id, @@ -87,6 +95,7 @@ export const Properties = React.memo( const [showActions, setShowActions] = useState(false); const [showNotes, setShowNotes] = useState(false); const [showTimelineModal, setShowTimelineModal] = useState(false); + const dispatch = useDispatch(); const onButtonClick = useCallback(() => setShowActions(!showActions), [showActions]); const onToggleShowNotes = useCallback(() => setShowNotes(!showNotes), [showNotes]); @@ -98,6 +107,30 @@ export const Properties = React.memo( setShowTimelineModal(true); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const [showCaseModal, setShowCaseModal] = useState(false); + const onCloseCaseModal = useCallback(() => setShowCaseModal(false), []); + const onOpenCaseModal = useCallback(() => setShowCaseModal(true), []); + const history = useHistory(); + const currentTimeline = useSelector((state: State) => + timelineSelectors.selectTimeline(state, timelineId) + ); + + const onRowClick = useCallback( + (id: string) => { + onCloseCaseModal(); + history.push({ + pathname: `/${SiemPageName.case}/${id}`, + }); + dispatch( + setInsertTimeline({ + timelineId, + timelineSavedObjectId: currentTimeline.savedObjectId, + timelineTitle: title.length > 0 ? title : i18n.UNTITLED_TIMELINE, + }) + ); + }, + [onCloseCaseModal, currentTimeline, dispatch, history, timelineId, title] + ); const datePickerWidth = useMemo( () => @@ -144,6 +177,7 @@ export const Properties = React.memo( onButtonClick={onButtonClick} onClosePopover={onClosePopover} onCloseTimelineModal={onCloseTimelineModal} + onOpenCaseModal={onOpenCaseModal} onOpenTimelineModal={onOpenTimelineModal} onToggleShowNotes={onToggleShowNotes} showActions={showActions} @@ -159,6 +193,11 @@ export const Properties = React.memo( updateNote={updateNote} usersViewing={usersViewing} /> + ); } diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx index 58927e7b236e7..e297a3cc595d6 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.test.tsx @@ -28,9 +28,10 @@ jest.mock('./new_template_timeline', () => { jest.mock('./helpers', () => { return { Description: jest.fn().mockReturnValue(
), - NotesButton: jest.fn().mockReturnValue(
), + ExistingCase: jest.fn().mockReturnValue(
), NewCase: jest.fn().mockReturnValue(
), NewTimeline: jest.fn().mockReturnValue(
), + NotesButton: jest.fn().mockReturnValue(
), }; }); @@ -62,6 +63,7 @@ describe('Properties Right', () => { noteIds: [], onToggleShowNotes: jest.fn(), onCloseTimelineModal: jest.fn(), + onOpenCaseModal: jest.fn(), onOpenTimelineModal: jest.fn(), status: TimelineStatus.active, showTimelineModal: false, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx index f9ab7fb2e69ae..a9baf73676ffb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/properties/properties_right.tsx @@ -14,6 +14,7 @@ import { EuiToolTip, EuiAvatar, } from '@elastic/eui'; +import { NewTimeline, Description, NotesButton, NewCase, ExistingCase } from './helpers'; import { disableTemplate } from '../../../../../common/constants'; import { TimelineStatus } from '../../../../../common/types/timeline'; @@ -27,7 +28,6 @@ import { OpenTimelineModalButton } from '../../open_timeline/open_timeline_modal import { OpenTimelineModal } from '../../open_timeline/open_timeline_modal'; import * as i18n from './translations'; -import { Description, NotesButton, NewCase, NewTimeline } from './helpers'; import { NewTemplateTimeline } from './new_template_timeline'; export const PropertiesRightStyle = styled(EuiFlexGroup)` @@ -64,54 +64,56 @@ Avatar.displayName = 'Avatar'; type UpdateDescription = ({ id, description }: { id: string; description: string }) => void; export type UpdateNote = (note: Note) => void; -export interface PropertiesRightComponentProps { - onButtonClick: () => void; - onClosePopover: () => void; - showActions: boolean; - timelineId: string; - isDataInTimeline: boolean; - showNotes: boolean; - showNotesFromWidth: boolean; - showDescription: boolean; - showUsersView: boolean; - usersViewing: string[]; - description: string; - updateDescription: UpdateDescription; +interface PropertiesRightComponentProps { associateNote: AssociateNote; + description: string; getNotesByIds: (noteIds: string[]) => Note[]; + isDataInTimeline: boolean; noteIds: string[]; - onToggleShowNotes: () => void; + onButtonClick: () => void; + onClosePopover: () => void; onCloseTimelineModal: () => void; + onOpenCaseModal: () => void; onOpenTimelineModal: () => void; + onToggleShowNotes: () => void; + showActions: boolean; + showDescription: boolean; + showNotes: boolean; + showNotesFromWidth: boolean; showTimelineModal: boolean; + showUsersView: boolean; status: TimelineStatus; + timelineId: string; title: string; + updateDescription: UpdateDescription; updateNote: UpdateNote; + usersViewing: string[]; } const PropertiesRightComponent: React.FC = ({ - onButtonClick, - showActions, - onClosePopover, - timelineId, - isDataInTimeline, - showNotesFromWidth, - showNotes, - showDescription, - showUsersView, - usersViewing, - description, - updateDescription, associateNote, + description, getNotesByIds, + isDataInTimeline, noteIds, + onButtonClick, + onClosePopover, + onCloseTimelineModal, + onOpenCaseModal, + onOpenTimelineModal, onToggleShowNotes, - updateNote, + showActions, + showDescription, + showNotes, + showNotesFromWidth, showTimelineModal, + showUsersView, status, - onCloseTimelineModal, - onOpenTimelineModal, + timelineId, title, + updateDescription, + updateNote, + usersViewing, }) => { const uiCapabilities = useKibana().services.application.capabilities; const capabilitiesCanUserCRUD: boolean = !!uiCapabilities.securitySolution.crud; @@ -170,6 +172,13 @@ const PropertiesRightComponent: React.FC = ({ timelineStatus={status} /> + + + ({})); +jest.mock('react-router-dom', () => { + const originalModule = jest.requireActual('react-router-dom'); + return { + ...originalModule, + useHistory: jest.fn(), + }; +}); +jest.mock('../../../common/lib/kibana', () => { + const originalModule = jest.requireActual('../../../common/lib/kibana'); + return { + ...originalModule, + useKibana: jest.fn().mockReturnValue({ + services: { + uiSettings: { + get: jest.fn(), + }, + savedObjects: { + client: {}, + }, + }, + }), + useGetUserSavedObjectPermissions: jest.fn(), + }; +}); describe('Timeline', () => { let props = {} as TimelineComponentProps; const sort: Sort = { diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts index e8b5ba68eecdf..c5df017604b0c 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/actions.ts @@ -17,6 +17,7 @@ import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/t import { EventType, KqlMode, TimelineModel, ColumnHeaderOptions } from './model'; import { TimelineNonEcsData } from '../../../graphql/types'; import { TimelineTypeLiteral } from '../../../../common/types/timeline'; +import { InsertTimeline } from './types'; const actionCreator = actionCreatorFactory('x-pack/security_solution/local/timeline'); @@ -98,6 +99,8 @@ export const addTimeline = actionCreator<{ timeline: TimelineModel; }>('ADD_TIMELINE'); +export const setInsertTimeline = actionCreator('SET_INSERT_TIMELINE'); + export const startTimelineSaving = actionCreator<{ id: string; }>('START_TIMELINE_SAVING'); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts index 97ac423cee653..03e9ca176ee82 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/helpers.ts @@ -36,6 +36,7 @@ export const initialTimelineState: TimelineState = { newTimelineModel: null, }, showCallOutUnauthorizedMsg: false, + insertTimeline: null, }; interface AddTimelineHistoryParams { diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts index 3666968e8ab92..5e314f1597451 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/reducer.ts @@ -6,14 +6,17 @@ import { reducerWithInitialState } from 'typescript-fsa-reducers'; import { - addTimeline, addHistory, addNote, addNoteToEvent, addProvider, + addTimeline, applyDeltaToColumnWidth, applyDeltaToWidth, applyKqlFilterQuery, + clearEventsDeleted, + clearEventsLoading, + clearSelected, createTimeline, dataProviderEdited, endTimelineSaving, @@ -21,12 +24,12 @@ import { removeColumn, removeProvider, setEventsDeleted, - clearEventsDeleted, setEventsLoading, - clearEventsLoading, + setFilters, + setInsertTimeline, setKqlFilterQueryDraft, + setSavedQueryId, setSelected, - clearSelected, showCallOutUnauthorizedMsg, showTimeline, startTimelineSaving, @@ -37,9 +40,11 @@ import { updateDataProviderExcluded, updateDataProviderKqlQuery, updateDescription, + updateEventType, updateHighlightedDropAndProviderId, updateIsFavorite, updateIsLive, + updateIsLoading, updateItemsPerPage, updateItemsPerPageOptions, updateKqlMode, @@ -50,10 +55,6 @@ import { updateTimeline, updateTitle, upsertColumn, - updateIsLoading, - setSavedQueryId, - setFilters, - updateEventType, } from './actions'; import { addNewTimeline, @@ -107,6 +108,7 @@ export const initialTimelineState: TimelineState = { newTimelineModel: null, }, showCallOutUnauthorizedMsg: false, + insertTimeline: null, }; /** The reducer for all timeline actions */ @@ -486,4 +488,8 @@ export const timelineReducer = reducerWithInitialState(initialTimelineState) timelineById: state.timelineById, }), })) + .case(setInsertTimeline, (state, insertTimeline) => ({ + ...state, + insertTimeline, + })) .build(); diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts index af7ac075468c3..a80a28660e28b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/selectors.ts @@ -10,7 +10,7 @@ import { isFromKueryExpressionValid } from '../../../common/lib/keury'; import { State } from '../../../common/store/types'; import { TimelineModel } from './model'; -import { AutoSavedWarningMsg, TimelineById } from './types'; +import { AutoSavedWarningMsg, InsertTimeline, TimelineById } from './types'; const selectTimelineById = (state: State): TimelineById => state.timeline.timelineById; @@ -22,6 +22,9 @@ const selectCallOutUnauthorizedMsg = (state: State): boolean => export const selectTimeline = (state: State, timelineId: string): TimelineModel => state.timeline.timelineById[timelineId]; +export const selectInsertTimeline = (state: State): InsertTimeline | null => + state.timeline.insertTimeline; + export const autoSaveMsgSelector = createSelector(selectAutoSaveMsg, (autoSaveMsg) => autoSaveMsg); export const timelineByIdSelector = createSelector( diff --git a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts index 1cc4517d2c964..aa6c308614287 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/timeline/types.ts @@ -16,6 +16,12 @@ export interface TimelineById { [id: string]: TimelineModel; } +export interface InsertTimeline { + timelineId: string; + timelineSavedObjectId: string | null; + timelineTitle: string; +} + export const EMPTY_TIMELINE_BY_ID: TimelineById = {}; // stable reference /** The state of all timelines is stored here */ @@ -23,6 +29,7 @@ export interface TimelineState { timelineById: TimelineById; autoSavedWarningMsg: AutoSavedWarningMsg; showCallOutUnauthorizedMsg: boolean; + insertTimeline: InsertTimeline | null; } export interface ActionTimeline extends Action { From f4cfa491d8a2acbcd0365952cb6a893bd534c55f Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Tue, 9 Jun 2020 12:11:53 -0700 Subject: [PATCH 11/19] Prefer using npm_execpath when spawning Yarn (#68673) Prevents instances where an incorrect version of Yarn is used from a parent directory containing node_modules. Signed-off-by: Tyler Smalley --- packages/kbn-pm/dist/index.js | 9 +++++---- packages/kbn-pm/src/utils/scripts.ts | 10 ++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 93152ef1b71dc..ef2b7e7c06a25 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -55242,6 +55242,7 @@ __webpack_require__.r(__webpack_exports__); * under the License. */ +const YARN_EXEC = process.env.npm_execpath || 'yarn'; /** * Install all dependencies in the given directory @@ -55250,7 +55251,7 @@ async function installInDir(directory, extraArgs = []) { const options = ['install', '--non-interactive', ...extraArgs]; // We pass the mutex flag to ensure only one instance of yarn runs at any // given time (e.g. to avoid conflicts). - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', options, { + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, options, { cwd: directory }); } @@ -55262,7 +55263,7 @@ async function runScriptInPackage(script, args, pkg) { const execOpts = { cwd: pkg.path }; - await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['run', script, ...args], execOpts); + await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['run', script, ...args], execOpts); } /** * Run script in the given directory @@ -55277,7 +55278,7 @@ function runScriptInPackageStreaming({ const execOpts = { cwd: pkg.path }; - return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])('yarn', ['run', script, ...args], execOpts, { + return Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawnStreaming"])(YARN_EXEC, ['run', script, ...args], execOpts, { prefix: pkg.name, debug }); @@ -55285,7 +55286,7 @@ function runScriptInPackageStreaming({ async function yarnWorkspacesInfo(directory) { const { stdout - } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])('yarn', ['--json', 'workspaces', 'info'], { + } = await Object(_child_process__WEBPACK_IMPORTED_MODULE_0__["spawn"])(YARN_EXEC, ['--json', 'workspaces', 'info'], { cwd: directory, stdio: 'pipe' }); diff --git a/packages/kbn-pm/src/utils/scripts.ts b/packages/kbn-pm/src/utils/scripts.ts index 728ac4287b1ce..6b1dc729906f2 100644 --- a/packages/kbn-pm/src/utils/scripts.ts +++ b/packages/kbn-pm/src/utils/scripts.ts @@ -20,6 +20,8 @@ import { spawn, spawnStreaming } from './child_process'; import { Project } from './project'; +const YARN_EXEC = process.env.npm_execpath || 'yarn'; + interface WorkspaceInfo { location: string; workspaceDependencies: string[]; @@ -37,7 +39,7 @@ export async function installInDir(directory: string, extraArgs: string[] = []) // We pass the mutex flag to ensure only one instance of yarn runs at any // given time (e.g. to avoid conflicts). - await spawn('yarn', options, { + await spawn(YARN_EXEC, options, { cwd: directory, }); } @@ -50,7 +52,7 @@ export async function runScriptInPackage(script: string, args: string[], pkg: Pr cwd: pkg.path, }; - await spawn('yarn', ['run', script, ...args], execOpts); + await spawn(YARN_EXEC, ['run', script, ...args], execOpts); } /** @@ -71,14 +73,14 @@ export function runScriptInPackageStreaming({ cwd: pkg.path, }; - return spawnStreaming('yarn', ['run', script, ...args], execOpts, { + return spawnStreaming(YARN_EXEC, ['run', script, ...args], execOpts, { prefix: pkg.name, debug, }); } export async function yarnWorkspacesInfo(directory: string): Promise { - const { stdout } = await spawn('yarn', ['--json', 'workspaces', 'info'], { + const { stdout } = await spawn(YARN_EXEC, ['--json', 'workspaces', 'info'], { cwd: directory, stdio: 'pipe', }); From ccb607303b4f5d76c13f941703611854f40188c8 Mon Sep 17 00:00:00 2001 From: Andrew Cholakian Date: Tue, 9 Jun 2020 15:16:14 -0500 Subject: [PATCH 12/19] [Uptime] Fix race on overview page query (#67843) Fixes https://github.com/elastic/kibana/issues/67842 by requerying during the refine phase to see if a newer matching doc has come in. --- .../refine_potential_matches.test.ts | 112 ++++++++++++++++++ .../server/lib/requests/search/fetch_chunk.ts | 4 +- .../requests/search/find_potential_matches.ts | 44 +------ .../search/refine_potential_matches.ts | 90 +++++++++----- 4 files changed, 174 insertions(+), 76 deletions(-) create mode 100644 x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts diff --git a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts new file mode 100644 index 0000000000000..283f5fb8909f6 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/refine_potential_matches.test.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { fullyMatchingIds } from '../refine_potential_matches'; +import { MonitorLocCheckGroup } from '..'; + +const mockQueryResult = (opts: { latestSummary: any; latestMatching: any }) => { + return { + aggregations: { + monitor: { + buckets: [ + { + key: 'my-monitor', + location: { + buckets: [ + { + key: 'my-location', + summaries: { + latest: { + hits: { + hits: [ + { + _source: opts.latestSummary, + }, + ], + }, + }, + }, + latest_matching: { + top: { + hits: { + hits: [ + { + _source: opts.latestMatching, + }, + ], + }, + }, + }, + }, + ], + }, + }, + ], + }, + }, + }; +}; + +describe('fully matching IDs', () => { + it('should exclude items whose latest result does not match', () => { + const queryRes = mockQueryResult({ + latestSummary: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + monitor: { + check_group: 'latest-summary-check-group', + }, + summary: { + up: 1, + down: 0, + }, + }, + latestMatching: { + '@timestamp': '2019-06-04T12:39:54.698-0500', + summary: { + up: 1, + down: 0, + }, + }, + }); + const res = fullyMatchingIds(queryRes, undefined); + const expected = new Map(); + expect(res).toEqual(expected); + }); + + it('should include items whose latest result does match', () => { + const queryRes = mockQueryResult({ + latestSummary: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + monitor: { + check_group: 'latest-summary-check-group', + }, + summary: { + up: 1, + down: 0, + }, + }, + latestMatching: { + '@timestamp': '2020-06-04T12:39:54.698-0500', + summary: { + up: 1, + down: 0, + }, + }, + }); + const res = fullyMatchingIds(queryRes, undefined); + const expected = new Map(); + expected.set('my-monitor', [ + { + checkGroup: 'latest-summary-check-group', + location: 'my-location', + monitorId: 'my-monitor', + status: 'up', + summaryTimestamp: new Date('2020-06-04T12:39:54.698-0500'), + }, + ]); + expect(res).toEqual(expected); + }); +}); diff --git a/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts b/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts index 77676ac9a6373..2a5f1f1261cb3 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/fetch_chunk.ts @@ -26,12 +26,12 @@ export const fetchChunk: ChunkFetcher = async ( searchAfter: any, size: number ): Promise => { - const { monitorIds, checkGroups, searchAfter: foundSearchAfter } = await findPotentialMatches( + const { monitorIds, searchAfter: foundSearchAfter } = await findPotentialMatches( queryContext, searchAfter, size ); - const matching = await refinePotentialMatches(queryContext, monitorIds, checkGroups); + const matching = await refinePotentialMatches(queryContext, monitorIds); return { monitorGroups: matching, diff --git a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts index a3e7324086073..ac4ff91230b95 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts @@ -8,12 +8,8 @@ import { get, set } from 'lodash'; import { CursorDirection } from '../../../../common/runtime_types'; import { QueryContext } from './query_context'; -// This is the first phase of the query. In it, we find the most recent check groups that matched the given query. -// Note that these check groups may not be the most recent groups for the matching monitor ID! We'll filter those /** - * This is the first phase of the query. In it, we find the most recent check groups that matched the given query. - * Note that these check groups may not be the most recent groups for the matching monitor ID. They'll be filtered - * out in the next phase. + * This is the first phase of the query. In it, we find all monitor IDs that have ever matched the given filters. * @param queryContext the data and resources needed to perform the query * @param searchAfter indicates where Elasticsearch should continue querying on subsequent requests, if at all * @param size the minimum size of the matches to chunk @@ -24,29 +20,14 @@ export const findPotentialMatches = async ( size: number ) => { const queryResult = await query(queryContext, searchAfter, size); - const checkGroups = new Set(); const monitorIds: string[] = []; get(queryResult, 'aggregations.monitors.buckets', []).forEach((b: any) => { const monitorId = b.key.monitor_id; monitorIds.push(monitorId); - - // Doc count can be zero if status filter optimization does not match - if (b.doc_count > 0) { - // Here we grab the most recent 2 check groups per location and add them to the list. - // Why 2? Because the most recent one may be a partial result from mode: all, and hence not match a summary doc. - b.locations.buckets.forEach((lb: any) => { - lb.ips.buckets.forEach((ib: any) => { - ib.top.hits.hits.forEach((h: any) => { - checkGroups.add(h._source.monitor.check_group); - }); - }); - }); - } }); return { monitorIds, - checkGroups, searchAfter: queryResult.aggregations?.monitors?.after_key, }; }; @@ -89,29 +70,6 @@ const queryBody = async (queryContext: QueryContext, searchAfter: any, size: num }, ], }, - aggs: { - // Here we grab the most recent 2 check groups per location. - // Why 2? Because the most recent one may not be for a summary, it may be incomplete. - locations: { - terms: { field: 'observer.geo.name', missing: '__missing__' }, - aggs: { - ips: { - terms: { field: 'monitor.ip', missing: '0.0.0.0' }, - aggs: { - top: { - top_hits: { - sort: [{ '@timestamp': 'desc' }], - _source: { - includes: ['monitor.check_group', '@timestamp'], - }, - size: 2, - }, - }, - }, - }, - }, - }, - }, }, }, }; diff --git a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts index e5e3de322cbc7..2f54f3f6dd689 100644 --- a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts +++ b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts @@ -18,18 +18,14 @@ import { MonitorGroups, MonitorLocCheckGroup } from './fetch_page'; // check groups for their associated monitor IDs. If not, it discards the result. export const refinePotentialMatches = async ( queryContext: QueryContext, - potentialMatchMonitorIDs: string[], - potentialMatchCheckGroups: Set + potentialMatchMonitorIDs: string[] ): Promise => { if (potentialMatchMonitorIDs.length === 0) { return []; } - const recentGroupsMatchingStatus = await fullyMatchingIds( - queryContext, - potentialMatchMonitorIDs, - potentialMatchCheckGroups - ); + const queryResult = await query(queryContext, potentialMatchMonitorIDs); + const recentGroupsMatchingStatus = await fullyMatchingIds(queryResult, queryContext.statusFilter); // Return the monitor groups filtering out potential matches that weren't current const matches: MonitorGroups[] = potentialMatchMonitorIDs @@ -49,27 +45,35 @@ export const refinePotentialMatches = async ( return matches; }; -const fullyMatchingIds = async ( - queryContext: QueryContext, - potentialMatchMonitorIDs: string[], - potentialMatchCheckGroups: Set -) => { - const mostRecentQueryResult = await mostRecentCheckGroups(queryContext, potentialMatchMonitorIDs); - +export const fullyMatchingIds = (queryResult: any, statusFilter?: string) => { const matching = new Map(); - MonitorLoop: for (const monBucket of mostRecentQueryResult.aggregations.monitor.buckets) { + MonitorLoop: for (const monBucket of queryResult.aggregations.monitor.buckets) { const monitorId: string = monBucket.key; const groups: MonitorLocCheckGroup[] = []; + // Did at least one location match? + let matched = false; for (const locBucket of monBucket.location.buckets) { const location = locBucket.key; - const topSource = locBucket.top.hits.hits[0]._source; - const checkGroup = topSource.monitor.check_group; - const status = topSource.summary.down > 0 ? 'down' : 'up'; + const latestSource = locBucket.summaries.latest.hits.hits[0]._source; + const latestStillMatchingSource = locBucket.latest_matching.top.hits.hits[0]?._source; + // If the most recent document still matches the most recent document matching the current filters + // we can include this in the result + // + // We just check if the timestamp is greater. Note this may match an incomplete check group + // that has not yet sent a summary doc + if ( + latestStillMatchingSource && + latestStillMatchingSource['@timestamp'] >= latestSource['@timestamp'] + ) { + matched = true; + } + const checkGroup = latestSource.monitor.check_group; + const status = latestSource.summary.down > 0 ? 'down' : 'up'; // This monitor doesn't match, so just skip ahead and don't add it to the output // Only skip in case of up statusFilter, for a monitor to be up, all checks should be up - if (queryContext?.statusFilter === 'up' && queryContext.statusFilter !== status) { + if (statusFilter === 'up' && statusFilter !== status) { continue MonitorLoop; } @@ -78,12 +82,12 @@ const fullyMatchingIds = async ( location, checkGroup, status, - summaryTimestamp: topSource['@timestamp'], + summaryTimestamp: new Date(latestSource['@timestamp']), }); } - // We only truly match the monitor if one of the most recent check groups was found in the potential matches phase - if (groups.some((g) => potentialMatchCheckGroups.has(g.checkGroup))) { + // If one location matched, include data from all locations in the result set + if (matched) { matching.set(monitorId, groups); } } @@ -91,7 +95,7 @@ const fullyMatchingIds = async ( return matching; }; -export const mostRecentCheckGroups = async ( +export const query = async ( queryContext: QueryContext, potentialMatchMonitorIDs: string[] ): Promise => { @@ -104,8 +108,6 @@ export const mostRecentCheckGroups = async ( filter: [ await queryContext.dateRangeFilter(), { terms: { 'monitor.id': potentialMatchMonitorIDs } }, - // only match summary docs because we only want the latest *complete* check group. - { exists: { field: 'summary' } }, ], }, }, @@ -116,13 +118,39 @@ export const mostRecentCheckGroups = async ( location: { terms: { field: 'observer.geo.name', missing: 'N/A', size: 100 }, aggs: { - top: { - top_hits: { - sort: [{ '@timestamp': 'desc' }], - _source: { - includes: ['monitor.check_group', '@timestamp', 'summary.up', 'summary.down'], + summaries: { + // only match summary docs because we only want the latest *complete* check group. + filter: { exists: { field: 'summary' } }, + aggs: { + latest: { + top_hits: { + sort: [{ '@timestamp': 'desc' }], + _source: { + includes: [ + 'monitor.check_group', + '@timestamp', + 'summary.up', + 'summary.down', + ], + }, + size: 1, + }, + }, + }, + }, + // We want to find the latest check group, even if it's not part of a summary + latest_matching: { + filter: queryContext.filterClause || { match_all: {} }, + aggs: { + top: { + top_hits: { + sort: [{ '@timestamp': 'desc' }], + _source: { + includes: ['monitor.check_group', '@timestamp'], + }, + size: 1, + }, }, - size: 1, }, }, }, From 696d71e13a436b536b518a3e3ff097c33596417c Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 9 Jun 2020 16:37:03 -0400 Subject: [PATCH 13/19] [ML] DF Analytics: Creation wizard part 2 (#68462) * Add ability to clone job * remove deprecated creation form code * ensure excludes cloned correctly and update clone action jest test * remove unused translations * update helper function name --- .../data_frame_analytics/_index.scss | 2 - .../analysis_fields_table.tsx | 2 +- .../configuration_step_form.tsx | 38 +- .../form_options_validation.ts | 2 +- .../supported_fields_message.tsx | 5 +- .../create_analytics_advanced_editor.tsx | 7 +- .../create_analytics_advanced_editor/index.ts | 0 .../components/create_step/create_step.tsx | 13 +- .../components/shared}/index.ts | 2 +- .../components/shared}/messages.tsx | 2 +- .../pages/analytics_creation/page.tsx | 54 +- .../analytics_list/action_clone.test.ts | 38 +- .../analytics_list/action_clone.tsx | 74 +- .../components/analytics_list/actions.tsx | 14 +- .../analytics_list/analytics_list.tsx | 7 - .../_create_analytics_flyout.scss | 3 - .../create_analytics_flyout/_index.scss | 1 - .../create_analytics_flyout.test.tsx | 42 - .../create_analytics_flyout.tsx | 108 --- .../create_analytics_flyout/index.ts | 7 - .../create_analytics_flyout_wrapper.tsx | 28 - .../create_analytics_flyout_wrapper/index.ts | 7 - .../_create_analytics_form.scss | 31 - .../create_analytics_form/_index.scss | 1 - .../create_analytics_form.test.tsx | 69 -- .../create_analytics_form.tsx | 850 ------------------ .../create_analytics_form/job_description.tsx | 37 - .../create_analytics_form/job_type.tsx | 80 -- .../use_create_analytics_form/actions.ts | 7 - .../use_create_analytics_form/reducer.test.ts | 15 - .../use_create_analytics_form/reducer.ts | 12 - .../use_create_analytics_form/state.test.ts | 54 +- .../hooks/use_create_analytics_form/state.ts | 27 +- .../use_create_analytics_form.test.tsx | 28 +- .../use_create_analytics_form.ts | 21 - .../analytics_job_creation.tsx | 7 +- .../translations/translations/ja-JP.json | 17 - .../translations/translations/zh-CN.json | 17 - 38 files changed, 236 insertions(+), 1493 deletions(-) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/configuration_step}/form_options_validation.ts (93%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management => analytics_creation}/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx (95%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management => analytics_creation}/components/create_analytics_advanced_editor/index.ts (100%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/shared}/index.ts (79%) rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/{analytics_management/components/create_analytics_form => analytics_creation/components/shared}/messages.tsx (92%) delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss index 5508c021d3313..140593cb17f6e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss @@ -1,5 +1,3 @@ @import 'pages/analytics_exploration/components/regression_exploration/index'; @import 'pages/analytics_management/components/analytics_list/index'; -@import 'pages/analytics_management/components/create_analytics_form/index'; -@import 'pages/analytics_management/components/create_analytics_flyout/index'; @import 'pages/analytics_management/components/create_analytics_button/index'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx index ad540285e49f0..09aea596d81e9 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx @@ -85,7 +85,7 @@ export const MemoizedAnalysisFieldsTable: FC<{ if (excludes.length > 0) { setCurrentSelection(excludes); } - }, []); + }, [tableItems]); // Only set form state on unmount to prevent re-renders due to props changing if exludes was updated on each selection useEffect(() => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 9446dfd4ed525..e63756686a4ba 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -20,13 +20,13 @@ import { TRAINING_PERCENT_MAX, } from '../../../../common/analytics'; import { CreateAnalyticsStepProps } from '../../../analytics_management/hooks/use_create_analytics_form'; -import { Messages } from '../../../analytics_management/components/create_analytics_form/messages'; +import { Messages } from '../shared'; import { DEFAULT_MODEL_MEMORY_LIMIT, getJobConfigFromFormState, State, } from '../../../analytics_management/hooks/use_create_analytics_form/state'; -import { shouldAddAsDepVarOption } from '../../../analytics_management/components/create_analytics_form/form_options_validation'; +import { shouldAddAsDepVarOption } from './form_options_validation'; import { ml } from '../../../../../services/ml_api_service'; import { getToastNotifications } from '../../../../../util/dependency_cache'; @@ -56,7 +56,7 @@ export const ConfigurationStepForm: FC = ({ const { currentSavedSearch, currentIndexPattern } = mlContext; const { savedSearchQuery, savedSearchQueryStr } = useSavedSearch(); - const { initiateWizard, setEstimatedModelMemoryLimit, setFormState } = actions; + const { setEstimatedModelMemoryLimit, setFormState } = actions; const { estimatedModelMemoryLimit, form, isJobCreated, requestMessages } = state; const firstUpdate = useRef(true); const { @@ -75,9 +75,12 @@ export const ConfigurationStepForm: FC = ({ modelMemoryLimit, previousJobType, requiredFieldsError, + sourceIndex, trainingPercent, } = form; + const toastNotifications = getToastNotifications(); + const setJobConfigQuery = ({ query, queryString }: { query: any; queryString: string }) => { setFormState({ jobConfigQuery: query, jobConfigQueryString: queryString }); }; @@ -90,7 +93,7 @@ export const ConfigurationStepForm: FC = ({ const indexPreviewProps = { ...indexData, dataTestSubj: 'mlAnalyticsCreationDataGrid', - toastNotifications: getToastNotifications(), + toastNotifications, }; const isJobTypeWithDepVar = @@ -209,7 +212,8 @@ export const ConfigurationStepForm: FC = ({ }); } } catch (e) { - let errorMessage; + let maxDistinctValuesErrorMessage; + if ( jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && e.body && @@ -218,7 +222,23 @@ export const ConfigurationStepForm: FC = ({ (e.body.message.includes('must have at most') || e.body.message.includes('must have at least')) ) { - errorMessage = e.body.message; + maxDistinctValuesErrorMessage = e.body.message; + } + + if ( + e.body && + e.body.message !== undefined && + e.body.message.includes('status_exception') && + e.body.message.includes('Unable to estimate memory usage as no documents') + ) { + toastNotifications.addWarning( + i18n.translate('xpack.ml.dataframe.analytics.create.allDocsMissingFieldsErrorMessage', { + defaultMessage: `Unable to estimate memory usage. There are mapped fields for source index [{index}] that do not exist in any indexed documents. You will have to switch to the JSON editor for explicit field selection and include only fields that exist in indexed documents.`, + values: { + index: sourceIndex, + }, + }) + ); } const fallbackModelMemoryLimit = jobType !== undefined @@ -227,17 +247,13 @@ export const ConfigurationStepForm: FC = ({ setEstimatedModelMemoryLimit(fallbackModelMemoryLimit); setFormState({ fieldOptionsFetchFail: true, - maxDistinctValuesError: errorMessage, + maxDistinctValuesError: maxDistinctValuesErrorMessage, loadingFieldOptions: false, ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: fallbackModelMemoryLimit } : {}), }); } }, 300); - useEffect(() => { - initiateWizard(); - }, []); - useEffect(() => { setFormState({ sourceIndex: currentIndexPattern.title }); }, []); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts similarity index 93% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts index 0579283c97d61..bf3ab01549139 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/form_options_validation.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/form_options_validation.ts @@ -7,7 +7,7 @@ import { ES_FIELD_TYPES } from '../../../../../../../../../../src/plugins/data/public'; import { Field, EVENT_RATE_FIELD_ID } from '../../../../../../../common/types/fields'; import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; -import { AnalyticsJobType } from '../../hooks/use_create_analytics_form/state'; +import { AnalyticsJobType } from '../../../analytics_management/hooks/use_create_analytics_form/state'; import { BASIC_NUMERICAL_TYPES, EXTENDED_NUMERICAL_TYPES } from '../../../../common/fields'; export const CATEGORICAL_TYPES = new Set(['ip', 'keyword']); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx index fe13cc1d6edfc..0a4ba67831818 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx @@ -12,10 +12,7 @@ import { AnalyticsJobType } from '../../../analytics_management/hooks/use_create import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; import { Field, EVENT_RATE_FIELD_ID } from '../../../../../../../common/types/fields'; import { BASIC_NUMERICAL_TYPES, EXTENDED_NUMERICAL_TYPES } from '../../../../common/fields'; -import { - OMIT_FIELDS, - CATEGORICAL_TYPES, -} from '../../../analytics_management/components/create_analytics_form/form_options_validation'; +import { OMIT_FIELDS, CATEGORICAL_TYPES } from './form_options_validation'; import { ES_FIELD_TYPES } from '../../../../../../../../../../src/plugins/data/public'; import { newJobCapsService } from '../../../../../services/new_job_capabilities_service'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx similarity index 95% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx index 17b905cab135b..a35a314bec985 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx @@ -22,9 +22,9 @@ import { XJsonMode } from '../../../../../../../shared_imports'; const xJsonMode = new XJsonMode(); -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { CreateStep } from '../../../analytics_creation/components/create_step'; -import { ANALYTICS_STEPS } from '../../../analytics_creation/page'; +import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; +import { CreateStep } from '../create_step'; +import { ANALYTICS_STEPS } from '../../page'; export const CreateAnalyticsAdvancedEditor: FC = (props) => { const { actions, state } = props; @@ -125,7 +125,6 @@ export const CreateAnalyticsAdvancedEditor: FC = (prop onChange={onChange} setOptions={{ fontSize: '12px', - maxLines: 20, }} theme="textmate" aria-label={i18n.translate( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/index.ts similarity index 100% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_advanced_editor/index.ts rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/index.ts diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx index 2dda5f5d819b7..8d51848a25f50 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; -import { Messages } from '../../../analytics_management/components/create_analytics_form/messages'; +import { Messages } from '../shared'; import { ANALYTICS_STEPS } from '../../page'; import { BackToListPanel } from '../back_to_list_panel'; @@ -26,14 +26,7 @@ interface Props extends CreateAnalyticsFormProps { export const CreateStep: FC = ({ actions, state, step }) => { const { createAnalyticsJob, startAnalyticsJob } = actions; - const { - isAdvancedEditorValidJson, - isJobCreated, - isJobStarted, - isModalButtonDisabled, - isValid, - requestMessages, - } = state; + const { isAdvancedEditorValidJson, isJobCreated, isJobStarted, isValid, requestMessages } = state; const [checked, setChecked] = useState(true); @@ -75,7 +68,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { { +interface Props { + jobId?: DataFrameAnalyticsId; +} + +export const Page: FC = ({ jobId }) => { const [currentStep, setCurrentStep] = useState(ANALYTICS_STEPS.CONFIGURATION); const [activatedSteps, setActivatedSteps] = useState([true, false, false, false]); @@ -44,23 +50,36 @@ export const Page: FC = () => { const createAnalyticsForm = useCreateAnalyticsForm(); const { isAdvancedEditorEnabled } = createAnalyticsForm.state; const { jobType } = createAnalyticsForm.state.form; - const { switchToAdvancedEditor } = createAnalyticsForm.actions; + const { initiateWizard, setJobClone, switchToAdvancedEditor } = createAnalyticsForm.actions; useEffect(() => { - if (activatedSteps[currentStep] === false) { - activatedSteps.splice(currentStep, 1, true); - setActivatedSteps(activatedSteps); - } - }, [currentStep]); + initiateWizard(); - useEffect(() => { if (currentIndexPattern) { (async function () { await newJobCapsService.initializeFromIndexPattern(currentIndexPattern, false, false); + + if (jobId !== undefined) { + const analyticsConfigs = await ml.dataFrameAnalytics.getDataFrameAnalytics(jobId); + if ( + Array.isArray(analyticsConfigs.data_frame_analytics) && + analyticsConfigs.data_frame_analytics.length > 0 + ) { + const clonedJobConfig: any = analyticsConfigs.data_frame_analytics[0]; + await setJobClone(clonedJobConfig); + } + } })(); } }, []); + useEffect(() => { + if (activatedSteps[currentStep] === false) { + activatedSteps.splice(currentStep, 1, true); + setActivatedSteps(activatedSteps); + } + }, [currentStep]); + const analyticsWizardSteps = [ { title: i18n.translate('xpack.ml.dataframe.analytics.creation.configurationStepTitle', { @@ -127,10 +146,19 @@ export const Page: FC = () => {

- + {jobId === undefined && ( + + )} + {jobId !== undefined && ( + + )}

diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts index 9221f8c500326..01d92d8e192c1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.test.ts @@ -140,8 +140,8 @@ describe('Analytics job clone action', () => { expect(isAdvancedConfig(advancedClassificationJob)).toBe(true); }); - test('should detect advanced outlier_detection job', () => { - const advancedOutlierDetectionJob = { + test('should detect advanced regression job', () => { + const advancedRegressionJob = { description: "Outlier detection job with 'glass' dataset", source: { index: ['glass_withoutdupl_norm'], @@ -155,10 +155,8 @@ describe('Analytics job clone action', () => { results_field: 'ml', }, analysis: { - outlier_detection: { - compute_feature_influence: false, - outlier_fraction: 0.05, - standardization_enabled: true, + regression: { + loss_function: 'msle', }, }, analyzed_fields: { @@ -168,7 +166,7 @@ describe('Analytics job clone action', () => { model_memory_limit: '1mb', allow_lazy_start: false, }; - expect(isAdvancedConfig(advancedOutlierDetectionJob)).toBe(true); + expect(isAdvancedConfig(advancedRegressionJob)).toBe(true); }); test('should detect a custom query', () => { @@ -207,32 +205,6 @@ describe('Analytics job clone action', () => { expect(isAdvancedConfig(advancedRegressionJob)).toBe(true); }); - test('should detect custom analysis settings', () => { - const config = { - description: "Classification clone with 'bank-marketing' dataset", - source: { - index: 'bank-marketing', - }, - dest: { - index: 'bank_classification4', - }, - analyzed_fields: { - excludes: [], - }, - analysis: { - classification: { - dependent_variable: 'y', - training_percent: 71, - max_trees: 1500, - num_top_feature_importance_values: 4, - }, - }, - model_memory_limit: '400mb', - }; - - expect(isAdvancedConfig(config)).toBe(true); - }); - test('should detect as advanced if the prop is unknown', () => { const config = { description: "Classification clone with 'bank-marketing' dataset", diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx index cfb11856670c4..a1f0448b819d1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/action_clone.tsx @@ -8,10 +8,12 @@ import { EuiButtonEmpty } from '@elastic/eui'; import React, { FC } from 'react'; import { isEqual, cloneDeep } from 'lodash'; import { i18n } from '@kbn/i18n'; +import { IIndexPattern } from 'src/plugins/data/common'; import { DeepReadonly } from '../../../../../../../common/types/common'; import { DataFrameAnalyticsConfig, isOutlierAnalysis } from '../../../../common'; import { isClassificationAnalysis, isRegressionAnalysis } from '../../../../common/analytics'; import { DEFAULT_RESULTS_FIELD } from '../../../../common/constants'; +import { useMlKibana } from '../../../../../contexts/kibana'; import { CreateAnalyticsFormProps, DEFAULT_NUM_TOP_FEATURE_IMPORTANCE_VALUES, @@ -19,6 +21,7 @@ import { import { State } from '../../hooks/use_create_analytics_form/state'; import { DataFrameAnalyticsListRow } from './common'; import { checkPermission } from '../../../../../capabilities/check_capabilities'; +import { extractErrorMessage } from '../../../../../util/error_utils'; interface PropDefinition { /** @@ -74,31 +77,39 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo }, eta: { optional: true, + formKey: 'eta', }, feature_bag_fraction: { optional: true, + formKey: 'featureBagFraction', }, max_trees: { optional: true, + formKey: 'maxTrees', }, gamma: { optional: true, + formKey: 'gamma', }, lambda: { optional: true, + formKey: 'lambda', }, num_top_classes: { optional: true, defaultValue: 2, + formKey: 'numTopClasses', }, prediction_field_name: { optional: true, defaultValue: `${config.analysis.classification.dependent_variable}_prediction`, + formKey: 'predictionFieldName', }, randomize_seed: { optional: true, // By default it is randomly generated ignore: true, + formKey: 'randomizeSeed', }, num_top_feature_importance_values: { optional: true, @@ -118,23 +129,29 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo standardization_enabled: { defaultValue: true, optional: true, + formKey: 'standardizationEnabled', }, compute_feature_influence: { defaultValue: true, optional: true, + formKey: 'computeFeatureInfluence', }, outlier_fraction: { defaultValue: 0.05, optional: true, + formKey: 'outlierFraction', }, feature_influence_threshold: { optional: true, + formKey: 'featureInfluenceThreshold', }, method: { optional: true, + formKey: 'method', }, n_neighbors: { optional: true, + formKey: 'nNeighbors', }, }, } @@ -152,22 +169,28 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo }, eta: { optional: true, + formKey: 'eta', }, feature_bag_fraction: { optional: true, + formKey: 'featureBagFraction', }, max_trees: { optional: true, + formKey: 'maxTrees', }, gamma: { optional: true, + formKey: 'gamma', }, lambda: { optional: true, + formKey: 'lambda', }, prediction_field_name: { optional: true, defaultValue: `${config.analysis.regression.dependent_variable}_prediction`, + formKey: 'predictionFieldName', }, num_top_feature_importance_values: { optional: true, @@ -178,11 +201,15 @@ const getAnalyticsJobMeta = (config: CloneDataFrameAnalyticsConfig): AnalyticsJo optional: true, // By default it is randomly generated ignore: true, + formKey: 'randomizeSeed', }, loss_function: { optional: true, defaultValue: 'mse', }, + loss_function_parameter: { + optional: true, + }, }, } : {}), @@ -332,9 +359,52 @@ export const CloneAction: FC = ({ createAnalyticsForm, item }) const buttonText = i18n.translate('xpack.ml.dataframe.analyticsList.cloneJobButtonLabel', { defaultMessage: 'Clone job', }); - const { actions } = createAnalyticsForm; + + const { notifications, savedObjects } = useMlKibana().services; + const savedObjectsClient = savedObjects.client; + const onClick = async () => { - await actions.setJobClone(item.config); + const sourceIndex = Array.isArray(item.config.source.index) + ? item.config.source.index[0] + : item.config.source.index; + let sourceIndexId; + + try { + const response = await savedObjectsClient.find({ + type: 'index-pattern', + perPage: 10, + search: `"${sourceIndex}"`, + searchFields: ['title'], + fields: ['title'], + }); + + const ip = response.savedObjects.find( + (obj) => obj.attributes.title.toLowerCase() === sourceIndex.toLowerCase() + ); + if (ip !== undefined) { + sourceIndexId = ip.id; + } + } catch (e) { + const { toasts } = notifications; + const error = extractErrorMessage(e); + + toasts.addDanger( + i18n.translate( + 'xpack.ml.dataframe.analyticsList.fetchSourceIndexPatternForCloneErrorMessage', + { + defaultMessage: + 'An error occurred checking if index pattern {indexPattern} exists: {error}', + values: { indexPattern: sourceIndex, error }, + } + ) + ); + } + + if (sourceIndexId) { + window.location.href = `ml#/data_frame_analytics/new_job?index=${encodeURIComponent( + sourceIndexId + )}&jobId=${item.config.id}`; + } }; return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx index 295a3988e1b58..72514c91ff58b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/actions.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButtonEmpty, EuiToolTip } from '@elastic/eui'; -// import { DeepReadonly } from '../../../../../../../common/types/common'; +import { DeepReadonly } from '../../../../../../../common/types/common'; import { checkPermission, @@ -21,7 +21,7 @@ import { isClassificationAnalysis, } from '../../../../common/analytics'; import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -// import { CloneAction } from './action_clone'; +import { CloneAction } from './action_clone'; import { getResultsUrl, isDataFrameAnalyticsRunning, DataFrameAnalyticsListRow } from './common'; import { stopAnalytics } from '../../services/analytics_service'; @@ -106,10 +106,10 @@ export const getActions = (createAnalyticsForm: CreateAnalyticsFormProps) => { return ; }, }, - // { - // render: (item: DeepReadonly) => { - // return ; - // }, - // }, + { + render: (item: DeepReadonly) => { + return ; + }, + }, ]; }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx index bb012a2190859..25e3a2808fc61 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx @@ -51,7 +51,6 @@ import { AnalyticStatsBarStats, StatsBar } from '../../../../../components/stats import { RefreshAnalyticsListButton } from '../refresh_analytics_list_button'; import { CreateAnalyticsButton } from '../create_analytics_button'; import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { CreateAnalyticsFlyoutWrapper } from '../create_analytics_flyout_wrapper'; import { getSelectedJobIdFromUrl } from '../../../../../jobs/jobs_list/components/utils'; import { SourceSelection } from '../source_selection'; @@ -286,9 +285,6 @@ export const DataFrameAnalyticsList: FC = ({ } data-test-subj="mlNoDataFrameAnalyticsFound" /> - {!isManagementTable && createAnalyticsForm && ( - - )} {isSourceIndexModalVisible === true && ( setIsSourceIndexModalVisible(false)} /> )} @@ -440,9 +436,6 @@ export const DataFrameAnalyticsList: FC = ({ />
- {!isManagementTable && createAnalyticsForm?.state.isModalVisible && ( - - )} {isSourceIndexModalVisible === true && ( setIsSourceIndexModalVisible(false)} /> )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss deleted file mode 100644 index e6c6ffafc446a..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_create_analytics_flyout.scss +++ /dev/null @@ -1,3 +0,0 @@ -.mlAnalyticsCreateFlyout__footerButton { - float: right; -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss deleted file mode 100644 index 668b35f8370d2..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'create_analytics_flyout'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx deleted file mode 100644 index dc91c955184b0..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.test.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { mount } from 'enzyme'; -import React from 'react'; -import { mountHook } from 'test_utils/enzyme_helpers'; - -import { CreateAnalyticsFlyout } from './create_analytics_flyout'; - -import { MlContext } from '../../../../../contexts/ml'; -import { kibanaContextValueMock } from '../../../../../contexts/ml/__mocks__/kibana_context_value'; - -import { useCreateAnalyticsForm } from '../../hooks/use_create_analytics_form'; - -const getMountedHook = () => - mountHook( - () => useCreateAnalyticsForm(), - ({ children }) => ( - {children} - ) - ); - -// workaround to make React.memo() work with enzyme -jest.mock('react', () => { - const r = jest.requireActual('react'); - return { ...r, memo: (x: any) => x }; -}); - -describe('Data Frame Analytics: ', () => { - test('Minimal initialization', () => { - const { getLastHookValue } = getMountedHook(); - const props = getLastHookValue(); - const wrapper = mount(); - - expect(wrapper.find('[data-test-subj="mlDataFrameAnalyticsFlyoutHeaderTitle"]').text()).toBe( - 'Create analytics job' - ); - }); -}); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx deleted file mode 100644 index b0f13e398cc50..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/create_analytics_flyout.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; - -import { - EuiButton, - EuiButtonEmpty, - EuiFlyout, - EuiFlyoutBody, - EuiFlyoutHeader, - EuiFlyoutFooter, - EuiTitle, -} from '@elastic/eui'; - -import { i18n } from '@kbn/i18n'; - -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; - -export const CreateAnalyticsFlyout: FC = ({ - actions, - children, - state, -}) => { - const { closeModal, createAnalyticsJob, startAnalyticsJob } = actions; - const { - isJobCreated, - isJobStarted, - isModalButtonDisabled, - isValid, - isAdvancedEditorValidJson, - cloneJob, - } = state; - - const headerText = !!cloneJob - ? i18n.translate('xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle', { - defaultMessage: 'Clone job from {job_id}', - values: { job_id: cloneJob.id }, - }) - : i18n.translate('xpack.ml.dataframe.analytics.create.flyoutHeaderTitle', { - defaultMessage: 'Create analytics job', - }); - - return ( - - - -

{headerText}

-
-
- {children} - - {(!isJobCreated || !isJobStarted) && ( - - {isJobCreated === true - ? i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCloseButton', { - defaultMessage: 'Close', - }) - : i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCancelButton', { - defaultMessage: 'Cancel', - })} - - )} - - {!isJobCreated && !isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCreateButton', { - defaultMessage: 'Create', - })} - - )} - {isJobCreated && !isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutStartButton', { - defaultMessage: 'Start', - })} - - )} - {isJobCreated && isJobStarted && ( - - {i18n.translate('xpack.ml.dataframe.analytics.create.flyoutCloseButton', { - defaultMessage: 'Close', - })} - - )} - -
- ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts deleted file mode 100644 index 3a25359373aa6..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { CreateAnalyticsFlyout } from './create_analytics_flyout'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx deleted file mode 100644 index 2f3c38b6ffe4e..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/create_analytics_flyout_wrapper.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; - -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; - -import { CreateAnalyticsAdvancedEditor } from '../create_analytics_advanced_editor'; -import { CreateAnalyticsForm } from '../create_analytics_form'; -import { CreateAnalyticsFlyout } from '../create_analytics_flyout'; - -export const CreateAnalyticsFlyoutWrapper: FC = (props) => { - const { isAdvancedEditorEnabled, isModalVisible } = props.state; - - if (isModalVisible === false) { - return null; - } - - return ( - - {isAdvancedEditorEnabled === false && } - {isAdvancedEditorEnabled === true && } - - ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts deleted file mode 100644 index c8e7a958f6d42..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_flyout_wrapper/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { CreateAnalyticsFlyoutWrapper } from './create_analytics_flyout_wrapper'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss deleted file mode 100644 index 9b4559f9e2cb2..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_create_analytics_form.scss +++ /dev/null @@ -1,31 +0,0 @@ -/* - The job creation form displayed in the modal adapts its height dynamically - if the content changes. If a form element changes to show/hide error messages, - this results in a changing height of the modal. If you type quickly e.g. - in the job ID input field and type chars which are invalid only for example - at the end of the string, this will result in an unwanted height toggling - effect. The following CSS avoids this by 1) delaying the visilibity of the - error message by 500ms and 2) animating the height and opacity to create - a fade-in effect after that so the modal grows smoothly and doesn't - toggle its height. - */ - -@keyframes mlDelayedShow { - 0%, 50% { - max-height: 0; - opacity: 0; - padding: 0; - visibility: hidden; - } - 100% { - max-height: 300px; - opacity: 1; - padding-top: $euiSizeS; - } -} - -.mlDataFrameAnalyticsCreateForm { - .euiFormErrorText { - animation: mlDelayedShow 1s; - } -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss deleted file mode 100644 index 66fa2c02e60f5..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'create_analytics_form'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx deleted file mode 100644 index 85cd70912b41f..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { mount } from 'enzyme'; -import React from 'react'; -import { mountHook } from 'test_utils/enzyme_helpers'; - -import { CreateAnalyticsForm } from './create_analytics_form'; - -import { MlContext } from '../../../../../contexts/ml'; -import { kibanaContextValueMock } from '../../../../../contexts/ml/__mocks__/kibana_context_value'; - -import { useCreateAnalyticsForm } from '../../hooks/use_create_analytics_form'; - -const getMountedHook = () => - mountHook( - () => useCreateAnalyticsForm(), - ({ children }) => ( - {children} - ) - ); - -// workaround to make React.memo() work with enzyme -jest.mock('react', () => { - const r = jest.requireActual('react'); - return { ...r, memo: (x: any) => x }; -}); - -jest.mock('../../../../../contexts/kibana', () => ({ - useMlKibana: () => { - return { - services: { - docLinks: () => ({ - ELASTIC_WEBSITE_URL: 'https://www.elastic.co/', - DOC_LINK_VERSION: 'jest-metadata-mock-branch', - }), - }, - }; - }, -})); - -describe('Data Frame Analytics: ', () => { - test('Minimal initialization', () => { - const { getLastHookValue } = getMountedHook(); - const props = getLastHookValue(); - const wrapper = mount( - - - - ); - - const euiFormRows = wrapper.find('EuiFormRow'); - expect(euiFormRows.length).toBe(10); - - const row1 = euiFormRows.at(0); - expect(row1.find('label').text()).toBe('Job type'); - - const options = row1.find('option'); - expect(options.at(0).props().value).toBe(''); - expect(options.at(1).props().value).toBe('outlier_detection'); - expect(options.at(2).props().value).toBe('regression'); - - const row2 = euiFormRows.at(1); - expect(row2.find('EuiSwitch').text()).toBe('Enable advanced editor'); - }); -}); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx deleted file mode 100644 index 64fe736e67b17..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx +++ /dev/null @@ -1,850 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Fragment, FC, useEffect, useMemo, useRef } from 'react'; - -import { - EuiComboBox, - EuiComboBoxOptionOption, - EuiForm, - EuiFieldNumber, - EuiFieldText, - EuiFormRow, - EuiLink, - EuiRange, - EuiSwitch, -} from '@elastic/eui'; -import { debounce } from 'lodash'; - -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { useMlKibana } from '../../../../../contexts/kibana'; -import { ml } from '../../../../../services/ml_api_service'; -import { newJobCapsService } from '../../../../../services/new_job_capabilities_service'; -import { useMlContext } from '../../../../../contexts/ml'; -import { CreateAnalyticsFormProps } from '../../hooks/use_create_analytics_form'; -import { - DEFAULT_MODEL_MEMORY_LIMIT, - getJobConfigFromFormState, - State, -} from '../../hooks/use_create_analytics_form/state'; -import { JOB_ID_MAX_LENGTH } from '../../../../../../../common/constants/validation'; -import { Messages } from './messages'; -import { JobType } from './job_type'; -import { JobDescriptionInput } from './job_description'; -import { getModelMemoryLimitErrors } from '../../hooks/use_create_analytics_form/reducer'; -import { IndexPattern, indexPatterns } from '../../../../../../../../../../src/plugins/data/public'; -import { - ANALYSIS_CONFIG_TYPE, - DfAnalyticsExplainResponse, - FieldSelectionItem, - NUM_TOP_FEATURE_IMPORTANCE_VALUES_MIN, - TRAINING_PERCENT_MIN, - TRAINING_PERCENT_MAX, -} from '../../../../common/analytics'; -import { shouldAddAsDepVarOption, OMIT_FIELDS } from './form_options_validation'; - -const requiredFieldsErrorText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.requiredFieldsErrorMessage', - { - defaultMessage: 'At least one field must be included in the analysis.', - } -); - -export const CreateAnalyticsForm: FC = ({ actions, state }) => { - const { - services: { docLinks }, - } = useMlKibana(); - const { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION } = docLinks; - const { setFormState, setEstimatedModelMemoryLimit } = actions; - const mlContext = useMlContext(); - const { - estimatedModelMemoryLimit, - form, - indexPatternsMap, - isAdvancedEditorEnabled, - isJobCreated, - requestMessages, - } = state; - - const forceInput = useRef(null); - const firstUpdate = useRef(true); - - const { - createIndexPattern, - dependentVariable, - dependentVariableFetchFail, - dependentVariableOptions, - description, - destinationIndex, - destinationIndexNameEmpty, - destinationIndexNameExists, - destinationIndexNameValid, - destinationIndexPatternTitleExists, - excludes, - excludesOptions, - fieldOptionsFetchFail, - jobId, - jobIdEmpty, - jobIdExists, - jobIdValid, - jobIdInvalidMaxLength, - jobType, - loadingDepVarOptions, - loadingFieldOptions, - maxDistinctValuesError, - modelMemoryLimit, - modelMemoryLimitValidationResult, - numTopFeatureImportanceValues, - numTopFeatureImportanceValuesValid, - previousJobType, - previousSourceIndex, - requiredFieldsError, - sourceIndex, - sourceIndexNameEmpty, - sourceIndexNameValid, - sourceIndexContainsNumericalFields, - sourceIndexFieldsCheckFailed, - trainingPercent, - } = form; - const characterList = indexPatterns.ILLEGAL_CHARACTERS_VISIBLE.join(', '); - - const mmlErrors = useMemo(() => getModelMemoryLimitErrors(modelMemoryLimitValidationResult), [ - modelMemoryLimitValidationResult, - ]); - - const isJobTypeWithDepVar = - jobType === ANALYSIS_CONFIG_TYPE.REGRESSION || jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION; - - // Find out if index pattern contain numeric fields. Provides a hint in the form - // that an analytics jobs is not able to identify outliers if there are no numeric fields present. - const validateSourceIndexFields = async () => { - try { - const indexPattern: IndexPattern = await mlContext.indexPatterns.get( - indexPatternsMap[sourceIndex].value - ); - const containsNumericalFields: boolean = indexPattern.fields.some( - ({ name, type }) => !OMIT_FIELDS.includes(name) && type === 'number' - ); - - setFormState({ - sourceIndexContainsNumericalFields: containsNumericalFields, - sourceIndexFieldsCheckFailed: false, - }); - } catch (e) { - setFormState({ - sourceIndexFieldsCheckFailed: true, - }); - } - }; - - const onCreateOption = (searchValue: string, flattenedOptions: EuiComboBoxOptionOption[]) => { - const normalizedSearchValue = searchValue.trim().toLowerCase(); - - if (!normalizedSearchValue) { - return; - } - - const newOption = { - label: searchValue, - }; - - // Create the option if it doesn't exist. - if ( - !flattenedOptions.some( - (option: EuiComboBoxOptionOption) => - option.label.trim().toLowerCase() === normalizedSearchValue - ) - ) { - excludesOptions.push(newOption); - setFormState({ excludes: [...excludes, newOption.label] }); - } - }; - - const debouncedGetExplainData = debounce(async () => { - const jobTypeOrIndexChanged = - previousSourceIndex !== sourceIndex || previousJobType !== jobType; - const shouldUpdateModelMemoryLimit = !firstUpdate.current || !modelMemoryLimit; - const shouldUpdateEstimatedMml = - !firstUpdate.current || !modelMemoryLimit || estimatedModelMemoryLimit === ''; - - if (firstUpdate.current) { - firstUpdate.current = false; - } - // Reset if sourceIndex or jobType changes (jobType requires dependent_variable to be set - - // which won't be the case if switching from outlier detection) - if (jobTypeOrIndexChanged) { - setFormState({ - loadingFieldOptions: true, - }); - } - - try { - const jobConfig = getJobConfigFromFormState(form); - delete jobConfig.dest; - delete jobConfig.model_memory_limit; - const resp: DfAnalyticsExplainResponse = await ml.dataFrameAnalytics.explainDataFrameAnalytics( - jobConfig - ); - const expectedMemoryWithoutDisk = resp.memory_estimation?.expected_memory_without_disk; - - if (shouldUpdateEstimatedMml) { - setEstimatedModelMemoryLimit(expectedMemoryWithoutDisk); - } - - const fieldSelection: FieldSelectionItem[] | undefined = resp.field_selection; - - let hasRequiredFields = false; - if (fieldSelection) { - for (let i = 0; i < fieldSelection.length; i++) { - const field = fieldSelection[i]; - if (field.is_included === true && field.is_required === false) { - hasRequiredFields = true; - break; - } - } - } - - // If sourceIndex has changed load analysis field options again - if (jobTypeOrIndexChanged) { - const analyzedFieldsOptions: EuiComboBoxOptionOption[] = []; - - if (resp.field_selection) { - resp.field_selection.forEach((selectedField: FieldSelectionItem) => { - if (selectedField.is_included === true && selectedField.name !== dependentVariable) { - analyzedFieldsOptions.push({ label: selectedField.name }); - } - }); - } - - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemoryWithoutDisk } : {}), - excludesOptions: analyzedFieldsOptions, - loadingFieldOptions: false, - fieldOptionsFetchFail: false, - maxDistinctValuesError: undefined, - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - }); - } else { - setFormState({ - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemoryWithoutDisk } : {}), - requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, - }); - } - } catch (e) { - let errorMessage; - if ( - jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && - e.body && - e.body.message !== undefined && - e.body.message.includes('status_exception') && - e.body.message.includes('must have at most') - ) { - errorMessage = e.body.message; - } - const fallbackModelMemoryLimit = - jobType !== undefined - ? DEFAULT_MODEL_MEMORY_LIMIT[jobType] - : DEFAULT_MODEL_MEMORY_LIMIT.outlier_detection; - setEstimatedModelMemoryLimit(fallbackModelMemoryLimit); - setFormState({ - fieldOptionsFetchFail: true, - maxDistinctValuesError: errorMessage, - loadingFieldOptions: false, - ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: fallbackModelMemoryLimit } : {}), - }); - } - }, 400); - - const loadDepVarOptions = async (formState: State['form']) => { - setFormState({ - loadingDepVarOptions: true, - // clear when the source index changes - maxDistinctValuesError: undefined, - sourceIndexFieldsCheckFailed: false, - sourceIndexContainsNumericalFields: true, - }); - try { - const indexPattern: IndexPattern = await mlContext.indexPatterns.get( - indexPatternsMap[sourceIndex].value - ); - - if (indexPattern !== undefined) { - const formStateUpdate: { - loadingDepVarOptions: boolean; - dependentVariableFetchFail: boolean; - dependentVariableOptions: State['form']['dependentVariableOptions']; - dependentVariable?: State['form']['dependentVariable']; - } = { - loadingDepVarOptions: false, - dependentVariableFetchFail: false, - dependentVariableOptions: [] as State['form']['dependentVariableOptions'], - }; - - await newJobCapsService.initializeFromIndexPattern(indexPattern, false, false); - // Get fields and filter for supported types for job type - const { fields } = newJobCapsService; - - let resetDependentVariable = true; - for (const field of fields) { - if (shouldAddAsDepVarOption(field, jobType)) { - formStateUpdate.dependentVariableOptions.push({ - label: field.id, - }); - - if (formState.dependentVariable === field.id) { - resetDependentVariable = false; - } - } - } - - if (resetDependentVariable) { - formStateUpdate.dependentVariable = ''; - } - - setFormState(formStateUpdate); - } - } catch (e) { - setFormState({ loadingDepVarOptions: false, dependentVariableFetchFail: true }); - } - }; - - const getSourceIndexErrorMessages = () => { - const errors = []; - if (!sourceIndexNameEmpty && !sourceIndexNameValid) { - errors.push( - - - - ); - } - - if (sourceIndexFieldsCheckFailed === true) { - errors.push( - - - - ); - } - - return errors; - }; - - const onSourceIndexChange = (selectedOptions: EuiComboBoxOptionOption[]) => { - setFormState({ - excludes: [], - excludesOptions: [], - previousSourceIndex: sourceIndex, - sourceIndex: selectedOptions[0].label || '', - requiredFieldsError: undefined, - }); - }; - - useEffect(() => { - if (isJobTypeWithDepVar && sourceIndexNameEmpty === false) { - loadDepVarOptions(form); - } - - if (jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION && sourceIndexNameEmpty === false) { - validateSourceIndexFields(); - } - }, [sourceIndex, jobType, sourceIndexNameEmpty]); - - useEffect(() => { - const hasBasicRequiredFields = - jobType !== undefined && sourceIndex !== '' && sourceIndexNameValid === true; - - const hasRequiredAnalysisFields = - (isJobTypeWithDepVar && dependentVariable !== '') || - jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION; - - if (hasBasicRequiredFields && hasRequiredAnalysisFields) { - debouncedGetExplainData(); - } - - return () => { - debouncedGetExplainData.cancel(); - }; - }, [ - jobType, - sourceIndex, - sourceIndexNameEmpty, - dependentVariable, - trainingPercent, - JSON.stringify(excludes), - ]); - - // Temp effect to close the context menu popover on Clone button click - useEffect(() => { - if (forceInput.current === null) { - return; - } - const evt = document.createEvent('MouseEvents'); - evt.initEvent('mouseup', true, true); - forceInput.current.dispatchEvent(evt); - }, []); - - const noSupportetdAnalysisFields = - excludesOptions.length === 0 && fieldOptionsFetchFail === false && !sourceIndexNameEmpty; - - return ( - - - {!isJobCreated && ( - - - - - - - { - if (input) { - forceInput.current = input; - } - }} - disabled={isJobCreated} - placeholder={i18n.translate('xpack.ml.dataframe.analytics.create.jobIdPlaceholder', { - defaultMessage: 'Job ID', - })} - value={jobId} - onChange={(e) => setFormState({ jobId: e.target.value })} - aria-label={i18n.translate( - 'xpack.ml.dataframe.analytics.create.jobIdInputAriaLabel', - { - defaultMessage: 'Choose a unique analytics job ID.', - } - )} - isInvalid={(!jobIdEmpty && !jobIdValid) || jobIdExists} - data-test-subj="mlAnalyticsCreateJobFlyoutJobIdInput" - /> - - - - - {!isJobCreated && ( - - a.label.localeCompare(b.label) - )} - selectedOptions={ - indexPatternsMap[sourceIndex] !== undefined ? [{ label: sourceIndex }] : [] - } - onChange={onSourceIndexChange} - isClearable={false} - data-test-subj="mlAnalyticsCreateJobFlyoutSourceIndexSelect" - /> - )} - {isJobCreated && ( - - )} - - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.destinationIndexInvalidError', - { - defaultMessage: 'Invalid destination index name.', - } - )} -
- - {i18n.translate( - 'xpack.ml.dataframe.stepDetailsForm.destinationIndexInvalidErrorLink', - { - defaultMessage: 'Learn more about index name limitations.', - } - )} - -
, - ] - } - > - setFormState({ destinationIndex: e.target.value })} - aria-label={i18n.translate( - 'xpack.ml.dataframe.analytics.create.destinationIndexInputAriaLabel', - { - defaultMessage: 'Choose a unique destination index name.', - } - )} - isInvalid={!destinationIndexNameEmpty && !destinationIndexNameValid} - data-test-subj="mlAnalyticsCreateJobFlyoutDestinationIndexInput" - /> - - {(jobType === ANALYSIS_CONFIG_TYPE.REGRESSION || - jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION) && ( - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.dependentVariableMaxDistictValuesError', - { - defaultMessage: 'Invalid. {message}', - values: { message: maxDistinctValuesError }, - } - )} - , - ] - : []), - ]} - > - - - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.dependentVariableOptionsFetchError', - { - defaultMessage: - 'There was a problem fetching fields. Please refresh the page and try again.', - } - )} - , - ] - : []), - ]} - > - - setFormState({ - dependentVariable: selectedOptions[0].label || '', - }) - } - isClearable={false} - isInvalid={dependentVariable === ''} - data-test-subj="mlAnalyticsCreateJobFlyoutDependentVariableSelect" - /> - - - setFormState({ trainingPercent: +e.target.value })} - data-test-subj="mlAnalyticsCreateJobFlyoutTrainingPercentSlider" - /> - - {/* num_top_feature_importance_values */} - - {i18n.translate( - 'xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesErrorText', - { - defaultMessage: - 'Invalid maximum number of feature importance values.', - } - )} - , - ] - : []), - ]} - > - setFormState({ numTopFeatureImportanceValues: +e.target.value })} - step={1} - value={numTopFeatureImportanceValues} - /> - - - )} - - - - - ({ - label: field, - }))} - onCreateOption={onCreateOption} - onChange={(selectedOptions) => - setFormState({ excludes: selectedOptions.map((option) => option.label) }) - } - isClearable={true} - data-test-subj="mlAnalyticsCreateJobFlyoutExcludesSelect" - /> - - - setFormState({ modelMemoryLimit: e.target.value })} - isInvalid={modelMemoryLimitValidationResult !== null} - data-test-subj="mlAnalyticsCreateJobFlyoutModelMemoryInput" - /> - - - setFormState({ createIndexPattern: !createIndexPattern })} - data-test-subj="mlAnalyticsCreateJobFlyoutCreateIndexPatternSwitch" - /> - - - )} -
- ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx deleted file mode 100644 index 46301a6f832e7..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_description.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { FC } from 'react'; -import { EuiFormRow, EuiTextArea } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -const helpText = i18n.translate('xpack.ml.dataframe.analytics.create.jobDescription.helpText', { - defaultMessage: 'Optional descriptive text', -}); - -interface Props { - description: string; - setFormState: React.Dispatch>; -} - -export const JobDescriptionInput: FC = ({ description, setFormState }) => ( - - { - const value = e.target.value; - setFormState({ description: value }); - }} - data-test-subj="mlDFAnalyticsJobCreationJobDescription" - /> - -); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx deleted file mode 100644 index 6daa72dd805b1..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/job_type.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Fragment, FC } from 'react'; -import { i18n } from '@kbn/i18n'; - -import { EuiFormRow, EuiSelect } from '@elastic/eui'; -import { ANALYSIS_CONFIG_TYPE } from '../../../../common'; - -import { AnalyticsJobType } from '../../hooks/use_create_analytics_form/state'; - -interface Props { - type: AnalyticsJobType; - setFormState: React.Dispatch>; -} - -export const JobType: FC = ({ type, setFormState }) => { - const outlierHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.outlierDetectionHelpText', - { - defaultMessage: - 'Outlier detection jobs require a source index that is mapped as a table-like data structure and analyze only numeric and boolean fields. Use the advanced editor to add custom options to the configuration.', - } - ); - - const regressionHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.outlierRegressionHelpText', - { - defaultMessage: - 'Regression jobs analyze only numeric fields. Use the advanced editor to apply custom options, such as the prediction field name.', - } - ); - - const classificationHelpText = i18n.translate( - 'xpack.ml.dataframe.analytics.create.classificationHelpText', - { - defaultMessage: - 'Classification jobs require a source index that is mapped as a table-like data structure and support fields that are numeric, boolean, text, keyword, or ip. Use the advanced editor to apply custom options, such as the prediction field name.', - } - ); - - const helpText = { - [ANALYSIS_CONFIG_TYPE.REGRESSION]: regressionHelpText, - [ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION]: outlierHelpText, - [ANALYSIS_CONFIG_TYPE.CLASSIFICATION]: classificationHelpText, - }; - - return ( - - - ({ - value: jobType, - text: jobType.replace(/_/g, ' '), - }))} - value={type} - hasNoInitialSelection={true} - onChange={(e) => { - const value = e.target.value as AnalyticsJobType; - setFormState({ - previousJobType: type, - jobType: value, - excludes: [], - requiredFieldsError: undefined, - }); - }} - data-test-subj="mlAnalyticsCreateJobFlyoutJobTypeSelect" - /> - - - ); -}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts index c42e03b584a56..a9eedbb2bc5e3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/actions.ts @@ -57,11 +57,6 @@ export type Action = } | { type: ACTION.SET_IS_JOB_CREATED; isJobCreated: State['isJobCreated'] } | { type: ACTION.SET_IS_JOB_STARTED; isJobStarted: State['isJobStarted'] } - | { - type: ACTION.SET_IS_MODAL_BUTTON_DISABLED; - isModalButtonDisabled: State['isModalButtonDisabled']; - } - | { type: ACTION.SET_IS_MODAL_VISIBLE; isModalVisible: State['isModalVisible'] } | { type: ACTION.SET_JOB_CONFIG; payload: State['jobConfig'] } | { type: ACTION.SET_JOB_IDS; jobIds: State['jobIds'] } | { type: ACTION.SET_ESTIMATED_MODEL_MEMORY_LIMIT; value: State['estimatedModelMemoryLimit'] } @@ -71,12 +66,10 @@ export type Action = export interface ActionDispatchers { closeModal: () => void; createAnalyticsJob: () => void; - openModal: () => Promise; initiateWizard: () => Promise; resetAdvancedEditorMessages: () => void; setAdvancedEditorRawString: (payload: State['advancedEditorRawString']) => void; setFormState: (payload: Partial) => void; - setIsModalVisible: (payload: State['isModalVisible']) => void; setJobConfig: (payload: State['jobConfig']) => void; startAnalyticsJob: () => void; switchToAdvancedEditor: () => void; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts index fc604c9f5eb0b..e6769a7b64e2b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.test.ts @@ -79,21 +79,6 @@ describe('useCreateAnalyticsForm', () => { expect(resettedState).toEqual(initialState); }); - test('reducer(): open/close the modal', () => { - const initialState = getInitialState(); - expect(initialState.isModalVisible).toBe(false); - - const openModalState = reducer(initialState, { - type: ACTION.OPEN_MODAL, - }); - expect(openModalState.isModalVisible).toBe(true); - - const closedModalState = reducer(openModalState, { - type: ACTION.CLOSE_MODAL, - }); - expect(closedModalState.isModalVisible).toBe(false); - }); - test('reducer(): add/reset request messages', () => { const initialState = getInitialState(); expect(initialState.requestMessages).toHaveLength(0); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts index a79a8fcf61ed4..1353a35d8ecc6 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts @@ -442,12 +442,6 @@ export function reducer(state: State, action: Action): State { case ACTION.RESET_REQUEST_MESSAGES: return { ...state, requestMessages: [] }; - case ACTION.CLOSE_MODAL: - return { ...state, isModalVisible: false }; - - case ACTION.OPEN_MODAL: - return { ...state, isModalVisible: true }; - case ACTION.RESET_ADVANCED_EDITOR_MESSAGES: return { ...state, advancedEditorMessages: [] }; @@ -536,12 +530,6 @@ export function reducer(state: State, action: Action): State { case ACTION.SET_IS_JOB_STARTED: return { ...state, isJobStarted: action.isJobStarted }; - case ACTION.SET_IS_MODAL_BUTTON_DISABLED: - return { ...state, isModalButtonDisabled: action.isModalButtonDisabled }; - - case ACTION.SET_IS_MODAL_VISIBLE: - return { ...state, isModalVisible: action.isModalVisible }; - case ACTION.SET_JOB_CONFIG: return validateAdvancedEditor({ ...state, jobConfig: action.payload }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts index 547a55da7438b..b9a9caadcebd0 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.test.ts @@ -4,7 +4,43 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getInitialState, getJobConfigFromFormState } from './state'; +import { + getCloneFormStateFromJobConfig, + getInitialState, + getJobConfigFromFormState, +} from './state'; + +const regJobConfig = { + id: 'reg-test-01', + description: 'Reg test job description', + source: { + index: ['reg-test-index'], + query: { + match_all: {}, + }, + }, + dest: { + index: 'reg-test-01-index', + results_field: 'ml', + }, + analysis: { + regression: { + dependent_variable: 'price', + num_top_feature_importance_values: 2, + prediction_field_name: 'airbnb_test', + training_percent: 5, + randomize_seed: 4998776294664380000, + }, + }, + analyzed_fields: { + includes: [], + excludes: [], + }, + model_memory_limit: '22mb', + create_time: 1590514291395, + version: '8.0.0', + allow_lazy_start: false, +}; describe('useCreateAnalyticsForm', () => { test('state: getJobConfigFromFormState()', () => { @@ -28,4 +64,20 @@ describe('useCreateAnalyticsForm', () => { 'the-source-index-2', ]); }); + + test('state: getCloneFormStateFromJobConfig()', () => { + const clonedState = getCloneFormStateFromJobConfig(regJobConfig); + + expect(clonedState?.sourceIndex).toBe('reg-test-index'); + expect(clonedState?.excludes).toStrictEqual([]); + expect(clonedState?.dependentVariable).toBe('price'); + expect(clonedState?.numTopFeatureImportanceValues).toBe(2); + expect(clonedState?.predictionFieldName).toBe('airbnb_test'); + expect(clonedState?.trainingPercent).toBe(5); + expect(clonedState?.randomizeSeed).toBe(4998776294664380000); + expect(clonedState?.modelMemoryLimit).toBe('22mb'); + // destination index and job id should be undefined + expect(clonedState?.destinationIndex).toBe(undefined); + expect(clonedState?.jobId).toBe(undefined); + }); }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index 387ce89ee4120..8a07704e39910 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -92,7 +92,6 @@ export interface State { outlierFraction: undefined | number; predictionFieldName: undefined | string; previousJobType: null | AnalyticsJobType; - previousSourceIndex: EsIndexName | undefined; requiredFieldsError: string | undefined; randomizeSeed: undefined | number; sourceIndex: EsIndexName; @@ -110,8 +109,6 @@ export interface State { isAdvancedEditorValidJson: boolean; isJobCreated: boolean; isJobStarted: boolean; - isModalButtonDisabled: boolean; - isModalVisible: boolean; isValid: boolean; jobConfig: DeepPartial; jobIds: DataFrameAnalyticsId[]; @@ -167,7 +164,6 @@ export const getInitialState = (): State => ({ outlierFraction: undefined, predictionFieldName: undefined, previousJobType: null, - previousSourceIndex: undefined, requiredFieldsError: undefined, randomizeSeed: undefined, sourceIndex: '', @@ -189,8 +185,6 @@ export const getInitialState = (): State => ({ isAdvancedEditorValidJson: true, isJobCreated: false, isJobStarted: false, - isModalVisible: false, - isModalButtonDisabled: false, isValid: false, jobIds: [], requestMessages: [], @@ -328,6 +322,14 @@ export const getJobConfigFromFormState = ( return jobConfig; }; +function toCamelCase(property: string): string { + const camelCased = property.replace(/_([a-z])/g, function (g) { + return g[1].toUpperCase(); + }); + + return camelCased; +} + /** * Extracts form state for a job clone from the analytics job configuration. * For cloning we keep job id and destination index empty. @@ -353,13 +355,12 @@ export function getCloneFormStateFromJobConfig( ) { const analysisConfig = analyticsJobConfig.analysis[jobType]; - resultState.dependentVariable = analysisConfig.dependent_variable; - resultState.numTopFeatureImportanceValues = analysisConfig.num_top_feature_importance_values; - resultState.trainingPercent = analysisConfig.training_percent; - - if (isClassificationAnalysis(analyticsJobConfig.analysis)) { - // @ts-ignore - resultState.numTopClasses = analysisConfig.num_top_classes; + for (const key in analysisConfig) { + if (analysisConfig.hasOwnProperty(key)) { + const camelCased = toCamelCase(key); + // @ts-ignore + resultState[camelCased] = analysisConfig[key]; + } } } diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx index 182e50a5d74d1..ac1c710e1d106 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx @@ -46,39 +46,13 @@ describe('getErrorMessage()', () => { describe('useCreateAnalyticsForm()', () => { test('initialization', () => { const { getLastHookValue } = getMountedHook(); - const { state, actions } = getLastHookValue(); + const { actions } = getLastHookValue(); - expect(state.isModalVisible).toBe(false); - expect(typeof actions.closeModal).toBe('function'); expect(typeof actions.createAnalyticsJob).toBe('function'); - expect(typeof actions.openModal).toBe('function'); expect(typeof actions.startAnalyticsJob).toBe('function'); expect(typeof actions.setFormState).toBe('function'); }); - test('open/close modal', () => { - const { act, getLastHookValue } = getMountedHook(); - const { state, actions } = getLastHookValue(); - - expect(state.isModalVisible).toBe(false); - - act(() => { - // this should be actions.openModal(), but that doesn't work yet because act() doesn't support async yet. - // we need to wait for an update to React 16.9 - actions.setIsModalVisible(true); - }); - const { state: stateModalOpen } = getLastHookValue(); - expect(stateModalOpen.isModalVisible).toBe(true); - - act(() => { - // this should be actions.closeModal(), but that doesn't work yet because act() doesn't support async yet. - // we need to wait for an update to React 16.9 - actions.setIsModalVisible(false); - }); - const { state: stateModalClosed } = getLastHookValue(); - expect(stateModalClosed.isModalVisible).toBe(false); - }); - // TODO // add tests for createAnalyticsJob() and startAnalyticsJob() // once React 16.9 with support for async act() is available. diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts index c4cbe149f88bc..2de9a1dcadd4b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts @@ -87,12 +87,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { dispatch({ type: ACTION.SET_IS_JOB_STARTED, isJobStarted }); }; - const setIsModalButtonDisabled = (isModalButtonDisabled: boolean) => - dispatch({ type: ACTION.SET_IS_MODAL_BUTTON_DISABLED, isModalButtonDisabled }); - - const setIsModalVisible = (isModalVisible: boolean) => - dispatch({ type: ACTION.SET_IS_MODAL_VISIBLE, isModalVisible }); - const setJobIds = (jobIds: DataFrameAnalyticsId[]) => dispatch({ type: ACTION.SET_JOB_IDS, jobIds }); @@ -102,7 +96,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const createAnalyticsJob = async () => { resetRequestMessages(); - setIsModalButtonDisabled(true); const analyticsJobConfig = (isAdvancedEditorEnabled ? jobConfig @@ -123,7 +116,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } ), }); - setIsModalButtonDisabled(false); setIsJobCreated(true); if (createIndexPattern) { createKibanaIndexPattern(); @@ -139,7 +131,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } ), }); - setIsModalButtonDisabled(false); } }; @@ -267,13 +258,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } }; - const openModal = async () => { - await mlContext.indexPatterns.clearCache(); - resetForm(); - await prepareFormValidation(); - dispatch({ type: ACTION.OPEN_MODAL }); - }; - const initiateWizard = async () => { await mlContext.indexPatterns.clearCache(); await prepareFormValidation(); @@ -327,8 +311,6 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { const setJobClone = async (cloneJob: DeepReadonly) => { resetForm(); - await prepareFormValidation(); - const config = extractCloningConfig(cloneJob); if (isAdvancedConfig(config)) { setJobConfig(config); @@ -339,18 +321,15 @@ export const useCreateAnalyticsForm = (): CreateAnalyticsFormProps => { } dispatch({ type: ACTION.SET_JOB_CLONE, cloneJob }); - dispatch({ type: ACTION.OPEN_MODAL }); }; const actions: ActionDispatchers = { closeModal, createAnalyticsJob, - openModal, initiateWizard, resetAdvancedEditorMessages, setAdvancedEditorRawString, setFormState, - setIsModalVisible, setJobConfig, startAnalyticsJob, switchToAdvancedEditor, diff --git a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx index 68af9a2a49cab..ebc7bd95fb0c3 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/data_frame_analytics/analytics_job_creation.tsx @@ -30,12 +30,15 @@ export const analyticsJobsCreationRoute: MlRoute = { }; const PageWrapper: FC = ({ location, deps }) => { - const { index, savedSearchId }: Record = parse(location.search, { sort: false }); + const { index, jobId, savedSearchId }: Record = parse(location.search, { + sort: false, + }); + const { context } = useResolver(index, savedSearchId, deps.config, basicResolvers(deps)); return ( - + ); }; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 5be46ce4bcd2d..76636779001e7 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9654,7 +9654,6 @@ "xpack.ml.dataframe.analytics.classificationExploration.showActions": "アクションを表示", "xpack.ml.dataframe.analytics.classificationExploration.showAllColumns": "すべての列を表示", "xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle": "分類ジョブID {jobId}のデスティネーションインデックス", - "xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle": "{job_id} からのジョブのクローンを作成", "xpack.ml.dataframe.analytics.create.advancedEditor.codeEditorAriaLabel": "高度な分析ジョブエディター", "xpack.ml.dataframe.analytics.create.advancedEditor.configRequestBody": "構成リクエスト本文", "xpack.ml.dataframe.analytics.create.advancedEditor.jobIdExistsError": "このIDの分析ジョブが既に存在します。", @@ -9687,22 +9686,12 @@ "xpack.ml.dataframe.analytics.create.destinationIndexLabel": "デスティネーションインデックス", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessage": "Kibanaインデックスパターンの作成中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessageError": "インデックスパターン{indexPatternName}はすでに作成されています。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorHelpText": "高度なエディターからこのフォームには戻れません。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorSwitch": "詳細エディターを有効にする", "xpack.ml.dataframe.analytics.create.errorCreatingDataFrameAnalyticsJob": "データフレーム分析ジョブの作成中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameAnalyticsList": "既存のデータフレーム分析ジョブIDの取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameIndexNames": "既存のインデックス名の取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorGettingIndexPatternTitles": "既存のインデックスパターンのタイトルの取得中にエラーが発生しました。", "xpack.ml.dataframe.analytics.create.errorStartingDataFrameAnalyticsJob": "データフレーム分析ジョブの開始中にエラーが発生しました。", - "xpack.ml.dataframe.analytics.create.excludedFieldsHelpText": "分析から除外するフィールドを選択してください。他のすべてのサポートされるフィールドが含まれます。", "xpack.ml.dataframe.analytics.create.excludedFieldsLabel": "除外されたフィールド", - "xpack.ml.dataframe.analytics.create.excludesInputAriaLabel": "任意。除外するフィールドを入力または選択してください。", - "xpack.ml.dataframe.analytics.create.excludesOptionsNoSupportedFields": "このインデックスパターンのサポートされている分析フィールドが見つかりませんでした。", - "xpack.ml.dataframe.analytics.create.flyoutCancelButton": "キャンセル", - "xpack.ml.dataframe.analytics.create.flyoutCloseButton": "閉じる", - "xpack.ml.dataframe.analytics.create.flyoutCreateButton": "作成", - "xpack.ml.dataframe.analytics.create.flyoutHeaderTitle": "分析ジョブの作成", - "xpack.ml.dataframe.analytics.create.flyoutStartButton": "開始", "xpack.ml.dataframe.analytics.create.indexPatternAlreadyExistsError": "このタイトルのインデックスパターンが既に存在します。", "xpack.ml.dataframe.analytics.create.indexPatternExistsError": "このタイトルのインデックスパターンが既に存在します。", "xpack.ml.dataframe.analytics.create.jobDescription.helpText": "オプションの説明テキストです", @@ -9723,12 +9712,6 @@ "xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesLabel": "機能重要度値", "xpack.ml.dataframe.analytics.create.outlierDetectionHelpText": "外れ値検出ジョブは、表に示すようなデータ構造でマッピングされたソースインデックスを必要とし、数字とブール値フィールドのみを分析します。カスタムオプションを構成に追加するには、詳細エディターを使用します。", "xpack.ml.dataframe.analytics.create.outlierRegressionHelpText": "リグレッションジョブは数値フィールドのみを分析します。予測フィールド名などのカスタムオプションを適用するには、詳細エディターを使用します。", - "xpack.ml.dataframe.analytics.create.sourceIndexFieldCheckError": "数値フィールドの確認中に問題が発生しました。ページを更新して再起動してください。", - "xpack.ml.dataframe.analytics.create.sourceIndexHelpText": "このインデックスパターンには数字タイプのフィールドが含まれていません。分析ジョブで外れ値が検出されない可能性があります。", - "xpack.ml.dataframe.analytics.create.sourceIndexInputAriaLabel": "ソースインデックスパターンまたは検索。", - "xpack.ml.dataframe.analytics.create.sourceIndexInvalidError": "無効なソースインデックス名。スペースや{characterList}を含めることはできません", - "xpack.ml.dataframe.analytics.create.sourceIndexLabel": "ソースインデックス", - "xpack.ml.dataframe.analytics.create.sourceIndexPlaceholder": "ソースインデックスパターンを選択してください。", "xpack.ml.dataframe.analytics.create.startDataFrameAnalyticsSuccessMessage": "データフレーム分析 {jobId} の開始リクエストが受け付けられました。", "xpack.ml.dataframe.analytics.create.trainingPercentLabel": "トレーニングパーセンテージ", "xpack.ml.dataframe.analytics.errorCallout.evaluateErrorTitle": "データの読み込み中にエラーが発生しました。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index dff26907b48ed..331e9d67c3897 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9658,7 +9658,6 @@ "xpack.ml.dataframe.analytics.classificationExploration.showActions": "显示操作", "xpack.ml.dataframe.analytics.classificationExploration.showAllColumns": "显示所有列", "xpack.ml.dataframe.analytics.classificationExploration.tableJobIdTitle": "分类作业 ID {jobId} 的目标索引", - "xpack.ml.dataframe.analytics.clone.flyoutHeaderTitle": "从 {job_id} 克隆作业", "xpack.ml.dataframe.analytics.create.advancedEditor.codeEditorAriaLabel": "高级分析作业编辑器", "xpack.ml.dataframe.analytics.create.advancedEditor.configRequestBody": "配置请求正文", "xpack.ml.dataframe.analytics.create.advancedEditor.jobIdExistsError": "已存在具有此 ID 的分析作业。", @@ -9691,22 +9690,12 @@ "xpack.ml.dataframe.analytics.create.destinationIndexLabel": "目标 IP", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessage": "创建 Kibana 索引模式时发生错误:", "xpack.ml.dataframe.analytics.create.duplicateIndexPatternErrorMessageError": "索引模式 {indexPatternName} 已存在。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorHelpText": "您不能从高级编辑器切回到此表单。", - "xpack.ml.dataframe.analytics.create.enableAdvancedEditorSwitch": "启用高级编辑器", "xpack.ml.dataframe.analytics.create.errorCreatingDataFrameAnalyticsJob": "创建数据帧分析作业时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameAnalyticsList": "获取现有数据帧分析作业 ID 时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingDataFrameIndexNames": "获取现有索引名称时发生错误:", "xpack.ml.dataframe.analytics.create.errorGettingIndexPatternTitles": "获取现有索引模式标题时发生错误:", "xpack.ml.dataframe.analytics.create.errorStartingDataFrameAnalyticsJob": "启动数据帧分析作业时发生错误:", - "xpack.ml.dataframe.analytics.create.excludedFieldsHelpText": "选择要从分析中排除的字段。包括所有其他支持的字段。", "xpack.ml.dataframe.analytics.create.excludedFieldsLabel": "排除的字段", - "xpack.ml.dataframe.analytics.create.excludesInputAriaLabel": "可选。输入或选择要排除的字段。", - "xpack.ml.dataframe.analytics.create.excludesOptionsNoSupportedFields": "没有为此索引模式找到任何支持的分析字段。", - "xpack.ml.dataframe.analytics.create.flyoutCancelButton": "取消", - "xpack.ml.dataframe.analytics.create.flyoutCloseButton": "关闭", - "xpack.ml.dataframe.analytics.create.flyoutCreateButton": "创建", - "xpack.ml.dataframe.analytics.create.flyoutHeaderTitle": "创建分析作业", - "xpack.ml.dataframe.analytics.create.flyoutStartButton": "开始", "xpack.ml.dataframe.analytics.create.indexPatternAlreadyExistsError": "具有此名称的索引模式已存在。", "xpack.ml.dataframe.analytics.create.indexPatternExistsError": "具有此名称的索引模式已存在。", "xpack.ml.dataframe.analytics.create.jobDescription.helpText": "可选的描述文本", @@ -9727,12 +9716,6 @@ "xpack.ml.dataframe.analytics.create.numTopFeatureImportanceValuesLabel": "功能重要性值", "xpack.ml.dataframe.analytics.create.outlierDetectionHelpText": "离群值检测作业需要映射为表状数据结构的源索引,并仅分析数值和布尔值字段。使用高级编辑器将定制选项添加到配置。", "xpack.ml.dataframe.analytics.create.outlierRegressionHelpText": "回归作业仅分析数值字段。使用高级编辑器来应用定制选项,如预测字段名称。", - "xpack.ml.dataframe.analytics.create.sourceIndexFieldCheckError": "检查数值字段时出现问题。请刷新页面并重试。", - "xpack.ml.dataframe.analytics.create.sourceIndexHelpText": "此索引模式不包含任何数值类型字段。分析作业可能无法提供任何离群值。", - "xpack.ml.dataframe.analytics.create.sourceIndexInputAriaLabel": "源索引模式或搜索。", - "xpack.ml.dataframe.analytics.create.sourceIndexInvalidError": "源索引名称无效,其不能包含空格或以下字符:{characterList}", - "xpack.ml.dataframe.analytics.create.sourceIndexLabel": "源索引", - "xpack.ml.dataframe.analytics.create.sourceIndexPlaceholder": "选择源索引模式。", "xpack.ml.dataframe.analytics.create.startDataFrameAnalyticsSuccessMessage": "数据帧分析 {jobId} 启动请求已确认。", "xpack.ml.dataframe.analytics.create.trainingPercentLabel": "训练百分比", "xpack.ml.dataframe.analytics.errorCallout.evaluateErrorTitle": "加载数据时出错。", From 0306c7a8cf1efc34360f1422690dfffa1b057857 Mon Sep 17 00:00:00 2001 From: Greg Thompson Date: Tue, 9 Jun 2020 15:07:40 -0600 Subject: [PATCH 14/19] Upgrade EUI to v24.1.0 (#68141) * eui to 24.1.0 * src snapshot updates * x-pack snapshot updates * euiPaletteColorBlind param updates * euiPaletteColorBlind ts-ignore * fix collapsibleNav close button click for functional testing * await focus * increase legacy sass build timeout value Co-authored-by: Elastic Machine --- package.json | 2 +- packages/kbn-ui-shared-deps/package.json | 2 +- .../collapsible_nav.test.tsx.snap | 211 +++++++++--------- .../header/__snapshots__/header.test.tsx.snap | 85 ++++--- src/legacy/server/sass/build.test.js | 2 + .../__snapshots__/new_vis_modal.test.tsx.snap | 2 + test/functional/services/apps_menu.ts | 4 + .../plugins/kbn_tp_run_pipeline/package.json | 2 +- .../kbn_sample_panel_action/package.json | 2 +- .../kbn_tp_custom_visualizations/package.json | 2 +- .../kbn_tp_embeddable_explorer/package.json | 2 +- x-pack/package.json | 2 +- .../__test__/__snapshots__/List.test.tsx.snap | 18 ++ .../__snapshots__/asset.examples.storyshot | 8 + .../asset_manager.stories.storyshot | 8 + .../element_controls.stories.storyshot | 2 + .../element_grid.stories.storyshot | 6 + .../saved_elements_modal.stories.storyshot | 8 + .../sidebar_header.stories.storyshot | 4 + .../simple_template.examples.storyshot | 1 + .../public/classes/styles/color_utils.tsx | 4 +- .../__snapshots__/index.test.tsx.snap | 43 ++-- .../note_card_body.test.tsx.snap | 43 ++-- yarn.lock | 8 +- 24 files changed, 263 insertions(+), 208 deletions(-) diff --git a/package.json b/package.json index 5bf39a57c1ac5..419edcf268356 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "@elastic/charts": "19.2.0", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.8.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/good": "8.1.1-kibana2", "@elastic/numeral": "^2.5.0", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 744a656c54a7f..2c9251b03059a 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@elastic/charts": "19.2.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/numeral": "^2.5.0", "@kbn/i18n": "1.0.0", "@kbn/monaco": "1.0.0", diff --git a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index f5b17f8d214e9..60963c0acb990 100644 --- a/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -1014,7 +1014,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
@@ -1662,7 +1658,7 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
@@ -3119,38 +3111,43 @@ exports[`CollapsibleNav renders links grouped by category 1`] = `
- - - + +
+
- - - + + +
@@ -4717,7 +4715,7 @@ exports[`CollapsibleNav renders the default nav 3`] = ` @@ -5120,38 +5114,43 @@ exports[`CollapsibleNav renders the default nav 3`] = ` - - - + + +
@@ -9277,7 +9273,7 @@ exports[`Header renders 3`] = `
@@ -9764,38 +9756,43 @@ exports[`Header renders 3`] = ` - - - + + +
@@ -14302,6 +14300,7 @@ exports[`Header renders 4`] = ` > diff --git a/src/legacy/server/sass/build.test.js b/src/legacy/server/sass/build.test.js index 46a898c30f84e..71c43ac010962 100644 --- a/src/legacy/server/sass/build.test.js +++ b/src/legacy/server/sass/build.test.js @@ -33,6 +33,8 @@ afterEach(async () => { }); it('builds light themed SASS', async () => { + // Increased timeout from 5000ms due to intermittent timeout failures + jest.setTimeout(60000); const targetPath = resolve(TMP, 'style.css'); await new Build({ sourcePath: FIXTURE, diff --git a/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap b/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap index 22cc873cbdb5d..53ef164685a1c 100644 --- a/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap +++ b/src/plugins/visualizations/public/wizard/__snapshots__/new_vis_modal.test.tsx.snap @@ -1264,6 +1264,7 @@ exports[`NewVisModal filter for visualization types should render as expected 1` > @@ -2772,6 +2773,7 @@ exports[`NewVisModal should render as expected 1`] = ` > diff --git a/test/functional/services/apps_menu.ts b/test/functional/services/apps_menu.ts index 969bddbd30f9a..aa7934d6b1156 100644 --- a/test/functional/services/apps_menu.ts +++ b/test/functional/services/apps_menu.ts @@ -58,6 +58,10 @@ export function AppsMenuProvider({ getService, getPageObjects }: FtrProviderCont public async closeCollapsibleNav() { const CLOSE_BUTTON = '[data-test-subj=collapsibleNav] > button'; if (await find.existsByCssSelector(CLOSE_BUTTON)) { + // Close button is only visible when focused + const button = await find.byCssSelector(CLOSE_BUTTON); + await button.focus(); + await find.clickByCssSelector(CLOSE_BUTTON); } } diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json index acd78cb4955e3..24b38fae96653 100644 --- a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0", "react-dom": "^16.12.0" }, diff --git a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json index 45d07933c4209..71a635c444b8c 100644 --- a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json +++ b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json index ca99e9b5995c1..78f0b42a6fbda 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json index 63dde0fa96dd3..6dbc9c71f2e81 100644 --- a/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json +++ b/test/plugin_functional/plugins/kbn_tp_embeddable_explorer/package.json @@ -8,7 +8,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "react": "^16.12.0" }, "scripts": { diff --git a/x-pack/package.json b/x-pack/package.json index b3dcde2194d3f..fb708ab09d841 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -190,7 +190,7 @@ "@elastic/apm-rum-react": "^1.1.1", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.8.0", - "@elastic/eui": "23.3.1", + "@elastic/eui": "24.1.0", "@elastic/filesaver": "1.1.2", "@elastic/maki": "6.3.0", "@elastic/node-crypto": "1.1.1", diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap index 3de725dc58ea7..6a20e3c103709 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap @@ -161,6 +161,7 @@ exports[`ErrorGroupOverview -> List should render empty state 1`] = ` @@ -575,6 +576,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -754,6 +756,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -859,6 +862,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -889,6 +893,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -958,6 +963,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -984,6 +990,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1089,6 +1096,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1119,6 +1127,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1188,6 +1197,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1214,6 +1224,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1319,6 +1330,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1349,6 +1361,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1418,6 +1431,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1444,6 +1458,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` @@ -1549,6 +1564,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > @@ -1579,6 +1595,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = `
@@ -1648,6 +1665,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot index 6601f570209e9..14791cd3d8b25 100644 --- a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot +++ b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset.examples.storyshot @@ -63,6 +63,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -88,6 +89,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -118,6 +120,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -148,6 +151,7 @@ exports[`Storyshots components/Assets/Asset airplane 1`] = ` > @@ -237,6 +241,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -262,6 +267,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -292,6 +298,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > @@ -322,6 +329,7 @@ exports[`Storyshots components/Assets/Asset marker 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot index aff630b21c770..1b8f1480759f6 100644 --- a/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/asset_manager/__examples__/__snapshots__/asset_manager.stories.storyshot @@ -422,6 +422,7 @@ Array [ > @@ -447,6 +448,7 @@ Array [ > @@ -477,6 +479,7 @@ Array [ > @@ -507,6 +510,7 @@ Array [ > @@ -585,6 +589,7 @@ Array [ > @@ -610,6 +615,7 @@ Array [ > @@ -640,6 +646,7 @@ Array [ > @@ -670,6 +677,7 @@ Array [ > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot index 6f12f68356467..408b0679c415f 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_controls.stories.storyshot @@ -16,6 +16,7 @@ exports[`Storyshots components/SavedElementsModal/ElementControls has two button > @@ -42,6 +43,7 @@ exports[`Storyshots components/SavedElementsModal/ElementControls has two button > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot index be0fb0573c394..1c506819df1fb 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/element_grid.stories.storyshot @@ -66,6 +66,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -92,6 +93,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -170,6 +172,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -196,6 +199,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -274,6 +278,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > @@ -300,6 +305,7 @@ exports[`Storyshots components/SavedElementsModal/ElementGrid default 1`] = ` > diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot index 03093b41300b8..04b2184f27462 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__examples__/__snapshots__/saved_elements_modal.stories.storyshot @@ -362,6 +362,7 @@ Array [ > @@ -388,6 +389,7 @@ Array [ > @@ -466,6 +468,7 @@ Array [ > @@ -492,6 +495,7 @@ Array [ > @@ -570,6 +574,7 @@ Array [ > @@ -596,6 +601,7 @@ Array [ > @@ -851,6 +857,7 @@ Array [ > @@ -877,6 +884,7 @@ Array [ > diff --git a/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot b/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot index 4d5b9570ee20f..16263aa7ea384 100644 --- a/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/sidebar_header/__examples__/__snapshots__/sidebar_header.stories.storyshot @@ -55,6 +55,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -80,6 +81,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -105,6 +107,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > @@ -130,6 +133,7 @@ exports[`Storyshots components/Sidebar/SidebarHeader with layer controls 1`] = ` > diff --git a/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot b/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot index 14466cab1a698..f8583d7cd0dc0 100644 --- a/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot +++ b/x-pack/plugins/canvas/public/expression_types/arg_types/series_style/__examples__/__snapshots__/simple_template.examples.storyshot @@ -169,6 +169,7 @@ exports[`Storyshots arguments/SeriesStyle/components simple: no series 1`] = ` > diff --git a/x-pack/plugins/maps/public/classes/styles/color_utils.tsx b/x-pack/plugins/maps/public/classes/styles/color_utils.tsx index 116e03096b0f5..0192a9d7ca68f 100644 --- a/x-pack/plugins/maps/public/classes/styles/color_utils.tsx +++ b/x-pack/plugins/maps/public/classes/styles/color_utils.tsx @@ -139,11 +139,11 @@ const COLOR_PALETTES_CONFIGS: ColorPalette[] = [ }, { id: 'palette_20', - colors: euiPaletteColorBlind(2), + colors: euiPaletteColorBlind({ rotations: 2 }), }, { id: 'palette_30', - colors: euiPaletteColorBlind(3), + colors: euiPaletteColorBlind({ rotations: 3 }), }, ]; diff --git a/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap index a2c7e72e51a9c..26775608637c0 100644 --- a/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap @@ -115,32 +115,28 @@ exports[`Paginated Table Component rendering it renders the default load more ta }, "euiCardSpacing": "16px", "euiCheckBoxSize": "16px", - "euiCodeBlockAdditionBackgroundColor": "#144212", - "euiCodeBlockAdditionColor": "#e6e1dc", - "euiCodeBlockAttributeColor": "#80cbbf", + "euiCodeBlockAdditionColor": "#54b399", + "euiCodeBlockAttributeColor": "inherit", "euiCodeBlockBackgroundColor": "#25262e", - "euiCodeBlockBuiltInColor": "#0086b3", "euiCodeBlockColor": "#dfe5ef", - "euiCodeBlockCommentColor": "#656565", - "euiCodeBlockDeletionBackgroundColor": "#660000", - "euiCodeBlockDeletionColor": "#e6e1dc", - "euiCodeBlockFunctionTitleColor": "#75a5ff", - "euiCodeBlockKeywordColor": "#c792ea", - "euiCodeBlockMetaColor": "#75a5ff", - "euiCodeBlockNameColor": "#e06c75", - "euiCodeBlockNumberColor": "#f77669", - "euiCodeBlockParamsColor": "#eefff7", - "euiCodeBlockRegexpColor": "#009926", - "euiCodeBlockSectionColor": "#ffc66d", + "euiCodeBlockCommentColor": "#8d919a", + "euiCodeBlockDeletionColor": "#ff6666", + "euiCodeBlockFunctionTitleColor": "inherit", + "euiCodeBlockKeywordColor": "#a184c2", + "euiCodeBlockMetaColor": "#8d919a", + "euiCodeBlockNameColor": "#6092c0", + "euiCodeBlockNumberColor": "#54b399", + "euiCodeBlockParamsColor": "inherit", + "euiCodeBlockSectionColor": "#e7664c", "euiCodeBlockSelectedBackgroundColor": "inherit", - "euiCodeBlockSelectorClassColor": "#ffcb68", - "euiCodeBlockSelectorIdColor": "#f77669", - "euiCodeBlockSelectorTagColor": "#c792ea", - "euiCodeBlockStringColor": "#c3e88d", - "euiCodeBlockSymbolColor": "#c792ea", - "euiCodeBlockTagColor": "#abb2bf", - "euiCodeBlockTitleColor": "#75a5ff", - "euiCodeBlockTypeColor": "#da4939", + "euiCodeBlockSelectorClassColor": "inherit", + "euiCodeBlockSelectorIdColor": "inherit", + "euiCodeBlockSelectorTagColor": "inherit", + "euiCodeBlockStringColor": "#d77092", + "euiCodeBlockSymbolColor": "#e7664c", + "euiCodeBlockTagColor": "#6092c0", + "euiCodeBlockTitleColor": "#da8b45", + "euiCodeBlockTypeColor": "#6092c0", "euiCodeFontFamily": "'Roboto Mono', 'Consolas', 'Menlo', 'Courier', monospace", "euiCollapsibleNavGroupDarkBackgroundColor": "#131317", "euiCollapsibleNavGroupDarkHighContrastColor": "#1ba9f5", @@ -230,6 +226,7 @@ exports[`Paginated Table Component rendering it renders the default load more ta "warning": "#ffce7a", }, "euiFilePickerTallHeight": "128px", + "euiFlyoutBorder": "1px solid #343741", "euiFocusBackgroundColor": "#232635", "euiFocusRingAnimStartColor": "rgba(27, 169, 245, 0)", "euiFocusRingAnimStartSize": "6px", diff --git a/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap index 391aaba17ae3a..22f89ffc6927e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap @@ -115,32 +115,28 @@ exports[`NoteCardBody renders correctly against snapshot 1`] = ` }, "euiCardSpacing": "16px", "euiCheckBoxSize": "16px", - "euiCodeBlockAdditionBackgroundColor": "#144212", - "euiCodeBlockAdditionColor": "#e6e1dc", - "euiCodeBlockAttributeColor": "#80cbbf", + "euiCodeBlockAdditionColor": "#54b399", + "euiCodeBlockAttributeColor": "inherit", "euiCodeBlockBackgroundColor": "#25262e", - "euiCodeBlockBuiltInColor": "#0086b3", "euiCodeBlockColor": "#dfe5ef", - "euiCodeBlockCommentColor": "#656565", - "euiCodeBlockDeletionBackgroundColor": "#660000", - "euiCodeBlockDeletionColor": "#e6e1dc", - "euiCodeBlockFunctionTitleColor": "#75a5ff", - "euiCodeBlockKeywordColor": "#c792ea", - "euiCodeBlockMetaColor": "#75a5ff", - "euiCodeBlockNameColor": "#e06c75", - "euiCodeBlockNumberColor": "#f77669", - "euiCodeBlockParamsColor": "#eefff7", - "euiCodeBlockRegexpColor": "#009926", - "euiCodeBlockSectionColor": "#ffc66d", + "euiCodeBlockCommentColor": "#8d919a", + "euiCodeBlockDeletionColor": "#ff6666", + "euiCodeBlockFunctionTitleColor": "inherit", + "euiCodeBlockKeywordColor": "#a184c2", + "euiCodeBlockMetaColor": "#8d919a", + "euiCodeBlockNameColor": "#6092c0", + "euiCodeBlockNumberColor": "#54b399", + "euiCodeBlockParamsColor": "inherit", + "euiCodeBlockSectionColor": "#e7664c", "euiCodeBlockSelectedBackgroundColor": "inherit", - "euiCodeBlockSelectorClassColor": "#ffcb68", - "euiCodeBlockSelectorIdColor": "#f77669", - "euiCodeBlockSelectorTagColor": "#c792ea", - "euiCodeBlockStringColor": "#c3e88d", - "euiCodeBlockSymbolColor": "#c792ea", - "euiCodeBlockTagColor": "#abb2bf", - "euiCodeBlockTitleColor": "#75a5ff", - "euiCodeBlockTypeColor": "#da4939", + "euiCodeBlockSelectorClassColor": "inherit", + "euiCodeBlockSelectorIdColor": "inherit", + "euiCodeBlockSelectorTagColor": "inherit", + "euiCodeBlockStringColor": "#d77092", + "euiCodeBlockSymbolColor": "#e7664c", + "euiCodeBlockTagColor": "#6092c0", + "euiCodeBlockTitleColor": "#da8b45", + "euiCodeBlockTypeColor": "#6092c0", "euiCodeFontFamily": "'Roboto Mono', 'Consolas', 'Menlo', 'Courier', monospace", "euiCollapsibleNavGroupDarkBackgroundColor": "#131317", "euiCollapsibleNavGroupDarkHighContrastColor": "#1ba9f5", @@ -230,6 +226,7 @@ exports[`NoteCardBody renders correctly against snapshot 1`] = ` "warning": "#ffce7a", }, "euiFilePickerTallHeight": "128px", + "euiFlyoutBorder": "1px solid #343741", "euiFocusBackgroundColor": "#232635", "euiFocusRingAnimStartColor": "rgba(27, 169, 245, 0)", "euiFocusRingAnimStartSize": "6px", diff --git a/yarn.lock b/yarn.lock index f7b310cca7590..cf9126b668e51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1332,10 +1332,10 @@ tabbable "^1.1.0" uuid "^3.1.0" -"@elastic/eui@23.3.1": - version "23.3.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-23.3.1.tgz#08516910d24eb148110f99d3bd7551240f9ef3d4" - integrity sha512-81N5xXeZwm8HEPE5RAPQFFUNUzYlTVJcNhW+DDN0EY8MlxVob9hgHy0AwshQGfrHlqhm+4gix110pW3n9Jweyw== +"@elastic/eui@24.1.0": + version "24.1.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-24.1.0.tgz#40593cc474237e8c464d182faa50c748b3f66822" + integrity sha512-Y7s327h0Z8dsO6MY7Sn1k5pOrf9ZjWH/ZE2gVtfBn2He5aFahS/+A434EBqFG0YV5W1VZtYiXtSj0AE1gjtrrw== dependencies: "@types/chroma-js" "^2.0.0" "@types/enzyme" "^3.1.13" From 2e3578602fcf999b279cf0de4091630cbb4649ee Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Tue, 9 Jun 2020 16:17:28 -0500 Subject: [PATCH 15/19] APM Storybook fixes (#68671) * Resolve core legacy assets in @kbn/storybook webpack configuration * Ignore stories in Jest coverage * Combine effects in Cytoscape component so handlers are always added before events are triggered * Add mock context to ErrorRateAlertTrigger stories * Disable TransactionDurationAlertTrigger stories Changing the Cytoscape effect behavior is necessary because the layout was not being triggered when the final set of elements is provided as props to the component. When this is used in Kibana we're always starting with empty elements and fetching them, but in the Storybook we're starting out with the full elements. --- .../storybook_config/webpack.config.js | 23 ++++++++++++++++++- x-pack/plugins/apm/jest.config.js | 1 + .../app/ServiceMap/Cytoscape.stories.tsx | 2 +- .../components/app/ServiceMap/Cytoscape.tsx | 15 ++++-------- .../ErrorRateAlertTrigger/index.stories.tsx | 23 +++++++++++++------ .../index.stories.tsx | 16 +++++++++---- 6 files changed, 56 insertions(+), 24 deletions(-) diff --git a/packages/kbn-storybook/storybook_config/webpack.config.js b/packages/kbn-storybook/storybook_config/webpack.config.js index 2dd051882bb4b..543bb47656df8 100644 --- a/packages/kbn-storybook/storybook_config/webpack.config.js +++ b/packages/kbn-storybook/storybook_config/webpack.config.js @@ -17,7 +17,7 @@ * under the License. */ -const { resolve } = require('path'); +const { parse, resolve } = require('path'); const webpack = require('webpack'); const { stringifyRequest } = require('loader-utils'); const CopyWebpackPlugin = require('copy-webpack-plugin'); @@ -95,6 +95,27 @@ module.exports = async ({ config }) => { }, }, }, + { + loader: 'resolve-url-loader', + options: { + // If you don't have arguments (_, __) to the join function, the + // resolve-url-loader fails with a loader misconfiguration error. + // + // eslint-disable-next-line no-unused-vars + join: (_, __) => (uri, base) => { + if (!base || !parse(base).dir.includes('legacy')) { + return null; + } + + // URIs on mixins in src/legacy/public/styles need to be resolved. + if (uri.startsWith('ui/assets')) { + return resolve(REPO_ROOT, 'src/core/server/core_app/', uri.replace('ui/', '')); + } + + return null; + }, + }, + }, { loader: 'sass-loader', options: { diff --git a/x-pack/plugins/apm/jest.config.js b/x-pack/plugins/apm/jest.config.js index c3ae694fe8e14..43bdeb583c819 100644 --- a/x-pack/plugins/apm/jest.config.js +++ b/x-pack/plugins/apm/jest.config.js @@ -31,6 +31,7 @@ module.exports = { collectCoverageFrom: [ '**/*.{js,jsx,ts,tsx}', '!**/{__test__,__snapshots__,__examples__,integration_tests,tests}/**', + '!**/*.stories.{js,ts,tsx}', '!**/*.test.{js,ts,tsx}', '!**/dev_docs/**', '!**/e2e/**', diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx index 1c62d3cc03db0..30031a05304bb 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.stories.tsx @@ -346,7 +346,7 @@ storiesOf('app/ServiceMap/Cytoscape', module).add( }, }, ]; - return ; + return ; }, { info: { propTables: false, source: false }, diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx index cb908785d64d8..c57d702b9a546 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Cytoscape.tsx @@ -121,15 +121,6 @@ export function Cytoscape({ const trackApmEvent = useUiTracker({ app: 'apm' }); - // Trigger a custom "data" event when data changes - useEffect(() => { - if (cy) { - cy.remove(cy.elements()); - cy.add(elements); - cy.trigger('data'); - } - }, [cy, elements]); - // Set up cytoscape event handlers useEffect(() => { const resetConnectedEdgeStyle = (node?: cytoscape.NodeSingular) => { @@ -223,6 +214,10 @@ export function Cytoscape({ cy.on('mouseout', 'edge, node', mouseoutHandler); cy.on('select', 'node', selectHandler); cy.on('unselect', 'node', unselectHandler); + + cy.remove(cy.elements()); + cy.add(elements); + cy.trigger('data'); } return () => { @@ -241,7 +236,7 @@ export function Cytoscape({ } clearTimeout(layoutstopDelayTimeout); }; - }, [cy, height, serviceName, trackApmEvent, width]); + }, [cy, elements, height, serviceName, trackApmEvent, width]); return ( diff --git a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx index 8f7ed54f91bd0..ebcb1627984ad 100644 --- a/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/ErrorRateAlertTrigger/index.stories.tsx @@ -7,6 +7,11 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { ErrorRateAlertTrigger } from '.'; +import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; +import { + mockApmPluginContextValue, + MockApmPluginContextWrapper, +} from '../../../context/ApmPluginContext/MockApmPluginContext'; storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { const params = { @@ -15,12 +20,16 @@ storiesOf('app/ErrorRateAlertTrigger', module).add('example', () => { }; return ( -
- undefined} - setAlertProperty={() => undefined} - /> -
+ +
+ undefined} + setAlertProperty={() => undefined} + /> +
+
); }); diff --git a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx index e2429d1225442..da9adbb8dfead 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionDurationAlertTrigger/index.stories.tsx @@ -3,18 +3,24 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +// import { storiesOf } from '@storybook/react'; import { cloneDeep, merge } from 'lodash'; -import { storiesOf } from '@storybook/react'; import React from 'react'; import { TransactionDurationAlertTrigger } from '.'; +import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; import { - MockApmPluginContextWrapper, mockApmPluginContextValue, + MockApmPluginContextWrapper, } from '../../../context/ApmPluginContext/MockApmPluginContext'; import { MockUrlParamsContextProvider } from '../../../context/UrlParamsContext/MockUrlParamsContextProvider'; -import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; -storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => { +// Disabling this because we currently don't have a way to mock `useEnvironments` +// which is used by this component. Using the fetch-mock module should work, but +// our current storybook setup has core-js-related problems when trying to import +// it. +// storiesOf('app/TransactionDurationAlertTrigger', module).add('example', +// eslint-disable-next-line no-unused-expressions +() => { const params = { threshold: 1500, aggregationType: 'avg' as const, @@ -44,4 +50,4 @@ storiesOf('app/TransactionDurationAlertTrigger', module).add('example', () => {
); -}); +}; From 938771a537dfd58fbf79a80a630db16b8b8bc785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Tue, 9 Jun 2020 23:37:26 +0200 Subject: [PATCH 16/19] [Logs + Metrics UI] Clean up async plugin initialization (#67654) This refactors the browser-side plugin bootstrap code such that the eagerly loaded bundle `infra.plugin.js` is minimal and the rest of the logs and metrics app bundles are loaded only when the apps are visited. --- .../components/expression.tsx | 4 + .../components/validation.tsx | 3 +- .../public/alerting/metric_threshold/index.ts | 4 +- .../infra/public/apps/common_providers.tsx | 47 +++++++ .../infra/public/apps/common_styles.ts | 13 ++ .../plugins/infra/public/apps/legacy_app.tsx | 98 +++++++++++++ x-pack/plugins/infra/public/apps/logs_app.tsx | 66 +++++++++ .../plugins/infra/public/apps/metrics_app.tsx | 82 +++++++++++ .../plugins/infra/public/apps/start_app.tsx | 80 ----------- .../infra/public/apps/start_legacy_app.tsx | 100 ------------- .../alerting/inventory/expression.tsx | 4 + .../metric_inventory_threshold_alert_type.ts | 4 +- .../alerting/inventory/validation.tsx | 4 +- .../logs/expression_editor/editor.tsx | 4 + .../alerting/logs/log_threshold_alert_type.ts | 4 +- x-pack/plugins/infra/public/compose_libs.ts | 99 ------------- .../containers/with_state_from_location.tsx | 131 ------------------ .../public/graphql/log_entries.gql_query.ts | 44 ------ .../public/hooks/use_link_props.test.tsx | 14 +- x-pack/plugins/infra/public/index.ts | 5 +- .../observable_api/kibana_observable_api.ts | 45 ------ x-pack/plugins/infra/public/lib/lib.ts | 94 +------------ .../link_to/redirect_to_node_logs.test.tsx | 12 +- .../pages/link_to/redirect_to_node_logs.tsx | 2 +- .../infra/public/pages/logs/page_content.tsx | 1 + .../inventory_view/components/table_view.tsx | 2 +- .../inventory_view/hooks/use_waffle_time.ts | 4 +- .../metric_detail/hooks/metrics_time.test.tsx | 33 ++++- x-pack/plugins/infra/public/plugin.ts | 99 +++++-------- x-pack/plugins/infra/public/routers/index.ts | 15 -- .../infra/public/routers/logs_router.tsx | 31 ----- .../infra/public/routers/metrics_router.tsx | 41 ------ x-pack/plugins/infra/public/types.ts | 25 ++++ .../infra/public/utils/apollo_client.ts | 85 ++++++++++++ .../public/utils/triggers_actions_context.tsx | 6 +- .../infra/public/utils/use_url_state.ts | 3 +- 36 files changed, 528 insertions(+), 780 deletions(-) create mode 100644 x-pack/plugins/infra/public/apps/common_providers.tsx create mode 100644 x-pack/plugins/infra/public/apps/common_styles.ts create mode 100644 x-pack/plugins/infra/public/apps/legacy_app.tsx create mode 100644 x-pack/plugins/infra/public/apps/logs_app.tsx create mode 100644 x-pack/plugins/infra/public/apps/metrics_app.tsx delete mode 100644 x-pack/plugins/infra/public/apps/start_app.tsx delete mode 100644 x-pack/plugins/infra/public/apps/start_legacy_app.tsx delete mode 100644 x-pack/plugins/infra/public/compose_libs.ts delete mode 100644 x-pack/plugins/infra/public/containers/with_state_from_location.tsx delete mode 100644 x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts delete mode 100644 x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts delete mode 100644 x-pack/plugins/infra/public/routers/index.ts delete mode 100644 x-pack/plugins/infra/public/routers/logs_router.tsx delete mode 100644 x-pack/plugins/infra/public/routers/metrics_router.tsx create mode 100644 x-pack/plugins/infra/public/types.ts create mode 100644 x-pack/plugins/infra/public/utils/apollo_client.ts diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx index 7a71bb68bc54f..d5d61733e8717 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx @@ -384,3 +384,7 @@ export const Expressions: React.FC = (props) => { ); }; + +// required for dynamic import +// eslint-disable-next-line import/no-default-export +export default Expressions; diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx index 2d9524ca158c8..da342f0a45420 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/validation.tsx @@ -5,7 +5,6 @@ */ import { i18n } from '@kbn/i18n'; -import { isNumber } from 'lodash'; import { MetricExpressionParams, Comparator, @@ -106,3 +105,5 @@ export function validateMetricThreshold({ return validationResult; } + +const isNumber = (value: unknown): value is number => typeof value === 'number'; diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts b/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts index a40cb1eaec50c..6a999a86c99d1 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/index.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; +import React from 'react'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertTypeModel } from '../../../../triggers_actions_ui/public/types'; -import { Expressions } from './components/expression'; import { validateMetricThreshold } from './components/validation'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { METRIC_THRESHOLD_ALERT_TYPE_ID } from '../../../server/lib/alerting/metric_threshold/types'; @@ -18,7 +18,7 @@ export function createMetricThresholdAlertType(): AlertTypeModel { defaultMessage: 'Metric threshold', }), iconClass: 'bell', - alertParamsExpression: Expressions, + alertParamsExpression: React.lazy(() => import('./components/expression')), validate: validateMetricThreshold, defaultActionMessage: i18n.translate( 'xpack.infra.metrics.alerting.threshold.defaultActionMessage', diff --git a/x-pack/plugins/infra/public/apps/common_providers.tsx b/x-pack/plugins/infra/public/apps/common_providers.tsx new file mode 100644 index 0000000000000..facb0f1539a10 --- /dev/null +++ b/x-pack/plugins/infra/public/apps/common_providers.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { CoreStart } from 'kibana/public'; +import { ApolloClient } from 'apollo-client'; +import { + useUiSetting$, + KibanaContextProvider, +} from '../../../../../src/plugins/kibana_react/public'; +import { TriggersActionsProvider } from '../utils/triggers_actions_context'; +import { ClientPluginDeps } from '../types'; +import { TriggersAndActionsUIPublicPluginStart } from '../../../triggers_actions_ui/public'; +import { ApolloClientContext } from '../utils/apollo_context'; +import { EuiThemeProvider } from '../../../observability/public'; +import { NavigationWarningPromptProvider } from '../utils/navigation_warning_prompt'; + +export const CommonInfraProviders: React.FC<{ + apolloClient: ApolloClient<{}>; + triggersActionsUI: TriggersAndActionsUIPublicPluginStart; +}> = ({ apolloClient, children, triggersActionsUI }) => { + const [darkMode] = useUiSetting$('theme:darkMode'); + + return ( + + + + {children} + + + + ); +}; + +export const CoreProviders: React.FC<{ + core: CoreStart; + plugins: ClientPluginDeps; +}> = ({ children, core, plugins }) => { + return ( + + {children} + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/common_styles.ts b/x-pack/plugins/infra/public/apps/common_styles.ts new file mode 100644 index 0000000000000..546b83a69035c --- /dev/null +++ b/x-pack/plugins/infra/public/apps/common_styles.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const CONTAINER_CLASSNAME = 'infra-container-element'; + +export const prepareMountElement = (element: HTMLElement) => { + // Ensure the element we're handed from application mounting is assigned a class + // for our index.scss styles to apply to. + element.classList.add(CONTAINER_CLASSNAME); +}; diff --git a/x-pack/plugins/infra/public/apps/legacy_app.tsx b/x-pack/plugins/infra/public/apps/legacy_app.tsx new file mode 100644 index 0000000000000..195f252c6b60f --- /dev/null +++ b/x-pack/plugins/infra/public/apps/legacy_app.tsx @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiErrorBoundary } from '@elastic/eui'; +import { createBrowserHistory, History } from 'history'; +import { AppMountParameters } from 'kibana/public'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Route, RouteProps, Router, Switch } from 'react-router-dom'; +import url from 'url'; + +// This exists purely to facilitate legacy app/infra URL redirects. +// It will be removed in 8.0.0. +export async function renderApp({ element }: AppMountParameters) { + const history = createBrowserHistory(); + + ReactDOM.render(, element); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +} + +const LegacyApp: React.FunctionComponent<{ history: History }> = ({ history }) => { + return ( + + + + { + if (!location) { + return null; + } + + let nextPath = ''; + let nextBasePath = ''; + let nextSearch; + + if ( + location.hash.indexOf('#infrastructure') > -1 || + location.hash.indexOf('#/infrastructure') > -1 + ) { + nextPath = location.hash.replace( + new RegExp( + '#infrastructure/|#/infrastructure/|#/infrastructure|#infrastructure', + 'g' + ), + '' + ); + nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); + } else if ( + location.hash.indexOf('#logs') > -1 || + location.hash.indexOf('#/logs') > -1 + ) { + nextPath = location.hash.replace( + new RegExp('#logs/|#/logs/|#/logs|#logs', 'g'), + '' + ); + nextBasePath = location.pathname.replace('app/infra', 'app/logs'); + } else { + // This covers /app/infra and /app/infra/home (both of which used to render + // the metrics inventory page) + nextPath = 'inventory'; + nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); + nextSearch = undefined; + } + + // app/infra#infrastructure/metrics/:type/:node was changed to app/metrics/detail/:type/:node, this + // accounts for that edge case + nextPath = nextPath.replace('metrics/', 'detail/'); + + // Query parameters (location.search) will arrive as part of location.hash and not location.search + const nextPathParts = nextPath.split('?'); + nextPath = nextPathParts[0]; + nextSearch = nextPathParts[1] ? nextPathParts[1] : undefined; + + let nextUrl = url.format({ + pathname: `${nextBasePath}/${nextPath}`, + hash: undefined, + search: nextSearch, + }); + + nextUrl = nextUrl.replace('//', '/'); + + window.location.href = nextUrl; + + return null; + }} + /> + + + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/logs_app.tsx b/x-pack/plugins/infra/public/apps/logs_app.tsx new file mode 100644 index 0000000000000..e0251522bb24c --- /dev/null +++ b/x-pack/plugins/infra/public/apps/logs_app.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ApolloClient } from 'apollo-client'; +import { History } from 'history'; +import { CoreStart } from 'kibana/public'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Route, Router, Switch } from 'react-router-dom'; +import { AppMountParameters } from '../../../../../src/core/public'; +import '../index.scss'; +import { NotFoundPage } from '../pages/404'; +import { LinkToLogsPage } from '../pages/link_to/link_to_logs'; +import { LogsPage } from '../pages/logs'; +import { ClientPluginDeps } from '../types'; +import { createApolloClient } from '../utils/apollo_client'; +import { CommonInfraProviders, CoreProviders } from './common_providers'; +import { prepareMountElement } from './common_styles'; + +export const renderApp = ( + core: CoreStart, + plugins: ClientPluginDeps, + { element, history }: AppMountParameters +) => { + const apolloClient = createApolloClient(core.http.fetch); + + prepareMountElement(element); + + ReactDOM.render( + , + element + ); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; + +const LogsApp: React.FC<{ + apolloClient: ApolloClient<{}>; + core: CoreStart; + history: History; + plugins: ClientPluginDeps; +}> = ({ apolloClient, core, history, plugins }) => { + const uiCapabilities = core.application.capabilities; + + return ( + + + + + + {uiCapabilities?.logs?.show && } + + + + + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/metrics_app.tsx b/x-pack/plugins/infra/public/apps/metrics_app.tsx new file mode 100644 index 0000000000000..8713abe0510a6 --- /dev/null +++ b/x-pack/plugins/infra/public/apps/metrics_app.tsx @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ApolloClient } from 'apollo-client'; +import { History } from 'history'; +import { CoreStart } from 'kibana/public'; +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Route, Router, Switch } from 'react-router-dom'; +import { AppMountParameters } from '../../../../../src/core/public'; +import '../index.scss'; +import { NotFoundPage } from '../pages/404'; +import { LinkToMetricsPage } from '../pages/link_to/link_to_metrics'; +import { InfrastructurePage } from '../pages/metrics'; +import { MetricDetail } from '../pages/metrics/metric_detail'; +import { ClientPluginDeps } from '../types'; +import { createApolloClient } from '../utils/apollo_client'; +import { RedirectWithQueryParams } from '../utils/redirect_with_query_params'; +import { CommonInfraProviders, CoreProviders } from './common_providers'; +import { prepareMountElement } from './common_styles'; + +export const renderApp = ( + core: CoreStart, + plugins: ClientPluginDeps, + { element, history }: AppMountParameters +) => { + const apolloClient = createApolloClient(core.http.fetch); + + prepareMountElement(element); + + ReactDOM.render( + , + element + ); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; + +const MetricsApp: React.FC<{ + apolloClient: ApolloClient<{}>; + core: CoreStart; + history: History; + plugins: ClientPluginDeps; +}> = ({ apolloClient, core, history, plugins }) => { + const uiCapabilities = core.application.capabilities; + + return ( + + + + + + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + {uiCapabilities?.infrastructure?.show && ( + + )} + + + + + + ); +}; diff --git a/x-pack/plugins/infra/public/apps/start_app.tsx b/x-pack/plugins/infra/public/apps/start_app.tsx deleted file mode 100644 index 4c213700b62e6..0000000000000 --- a/x-pack/plugins/infra/public/apps/start_app.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import { ApolloProvider } from 'react-apollo'; -import { CoreStart, AppMountParameters } from 'kibana/public'; - -// TODO use theme provided from parentApp when kibana supports it -import { EuiErrorBoundary } from '@elastic/eui'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { EuiThemeProvider } from '../../../observability/public/typings/eui_styled_components'; -import { InfraFrontendLibs } from '../lib/lib'; -import { ApolloClientContext } from '../utils/apollo_context'; -import { HistoryContext } from '../utils/history_context'; -import { - useUiSetting$, - KibanaContextProvider, -} from '../../../../../src/plugins/kibana_react/public'; -import { AppRouter } from '../routers'; -import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; -import { TriggersActionsProvider } from '../utils/triggers_actions_context'; -import '../index.scss'; -import { NavigationWarningPromptProvider } from '../utils/navigation_warning_prompt'; - -export const CONTAINER_CLASSNAME = 'infra-container-element'; - -export async function startApp( - libs: InfraFrontendLibs, - core: CoreStart, - plugins: object, - params: AppMountParameters, - Router: AppRouter, - triggersActionsUI: TriggersAndActionsUIPublicPluginSetup -) { - const { element, history } = params; - - const InfraPluginRoot: React.FunctionComponent = () => { - const [darkMode] = useUiSetting$('theme:darkMode'); - - return ( - - - - - - - - - - - - - - - - - - ); - }; - - const App: React.FunctionComponent = () => ( - - - - ); - - // Ensure the element we're handed from application mounting is assigned a class - // for our index.scss styles to apply to. - element.className += ` ${CONTAINER_CLASSNAME}`; - - ReactDOM.render(, element); - - return () => { - ReactDOM.unmountComponentAtNode(element); - }; -} diff --git a/x-pack/plugins/infra/public/apps/start_legacy_app.tsx b/x-pack/plugins/infra/public/apps/start_legacy_app.tsx deleted file mode 100644 index 6e5960ceb2081..0000000000000 --- a/x-pack/plugins/infra/public/apps/start_legacy_app.tsx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { createBrowserHistory } from 'history'; -import React from 'react'; -import url from 'url'; -import ReactDOM from 'react-dom'; -import { AppMountParameters } from 'kibana/public'; -import { Route, Router, Switch, RouteProps } from 'react-router-dom'; -// TODO use theme provided from parentApp when kibana supports it -import { EuiErrorBoundary } from '@elastic/eui'; - -// This exists purely to facilitate legacy app/infra URL redirects. -// It will be removed in 8.0.0. -export async function startLegacyApp(params: AppMountParameters) { - const { element } = params; - const history = createBrowserHistory(); - - const App: React.FunctionComponent = () => { - return ( - - - - { - if (!location) { - return null; - } - - let nextPath = ''; - let nextBasePath = ''; - let nextSearch; - - if ( - location.hash.indexOf('#infrastructure') > -1 || - location.hash.indexOf('#/infrastructure') > -1 - ) { - nextPath = location.hash.replace( - new RegExp( - '#infrastructure/|#/infrastructure/|#/infrastructure|#infrastructure', - 'g' - ), - '' - ); - nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); - } else if ( - location.hash.indexOf('#logs') > -1 || - location.hash.indexOf('#/logs') > -1 - ) { - nextPath = location.hash.replace( - new RegExp('#logs/|#/logs/|#/logs|#logs', 'g'), - '' - ); - nextBasePath = location.pathname.replace('app/infra', 'app/logs'); - } else { - // This covers /app/infra and /app/infra/home (both of which used to render - // the metrics inventory page) - nextPath = 'inventory'; - nextBasePath = location.pathname.replace('app/infra', 'app/metrics'); - nextSearch = undefined; - } - - // app/inra#infrastructure/metrics/:type/:node was changed to app/metrics/detail/:type/:node, this - // accounts for that edge case - nextPath = nextPath.replace('metrics/', 'detail/'); - - // Query parameters (location.search) will arrive as part of location.hash and not location.search - const nextPathParts = nextPath.split('?'); - nextPath = nextPathParts[0]; - nextSearch = nextPathParts[1] ? nextPathParts[1] : undefined; - - let nextUrl = url.format({ - pathname: `${nextBasePath}/${nextPath}`, - hash: undefined, - search: nextSearch, - }); - - nextUrl = nextUrl.replace('//', '/'); - - window.location.href = nextUrl; - - return null; - }} - /> - - - - ); - }; - - ReactDOM.render(, element); - - return () => { - ReactDOM.unmountComponentAtNode(element); - }; -} diff --git a/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx b/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx index 074464fb55414..ce14897991e60 100644 --- a/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx +++ b/x-pack/plugins/infra/public/components/alerting/inventory/expression.tsx @@ -336,6 +336,10 @@ export const Expressions: React.FC = (props) => { ); }; +// required for dynamic import +// eslint-disable-next-line import/no-default-export +export default Expressions; + interface ExpressionRowProps { nodeType: InventoryItemType; expressionId: number; diff --git a/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts b/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts index 9ede2d2a47727..0cb564ec2194e 100644 --- a/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts +++ b/x-pack/plugins/infra/public/components/alerting/inventory/metric_inventory_threshold_alert_type.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; +import React from 'react'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertTypeModel } from '../../../../../triggers_actions_ui/public/types'; -import { Expressions } from './expression'; import { validateMetricThreshold } from './validation'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID } from '../../../../server/lib/alerting/inventory_metric_threshold/types'; @@ -18,7 +18,7 @@ export function getInventoryMetricAlertType(): AlertTypeModel { defaultMessage: 'Inventory', }), iconClass: 'bell', - alertParamsExpression: Expressions, + alertParamsExpression: React.lazy(() => import('./expression')), validate: validateMetricThreshold, defaultActionMessage: i18n.translate( 'xpack.infra.metrics.alerting.inventory.threshold.defaultActionMessage', diff --git a/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx b/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx index 441adeec988c7..47ecd3c527fad 100644 --- a/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx +++ b/x-pack/plugins/infra/public/components/alerting/inventory/validation.tsx @@ -6,8 +6,6 @@ import { i18n } from '@kbn/i18n'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { isNumber } from 'lodash'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { MetricExpressionParams } from '../../../../server/lib/alerting/metric_threshold/types'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ValidationResult } from '../../../../../triggers_actions_ui/public/types'; @@ -95,3 +93,5 @@ export function validateMetricThreshold({ return validationResult; } + +const isNumber = (value: unknown): value is number => typeof value === 'number'; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx b/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx index 609f99805fe9c..a3a48d477425b 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx +++ b/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx @@ -236,3 +236,7 @@ export const Editor: React.FC = (props) => { ); }; + +// required for dynamic import +// eslint-disable-next-line import/no-default-export +export default Editor; diff --git a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts b/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts index 9bba8bd804f80..4c7811f0d9666 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts +++ b/x-pack/plugins/infra/public/components/alerting/logs/log_threshold_alert_type.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; +import React from 'react'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertTypeModel } from '../../../../../triggers_actions_ui/public/types'; import { LOG_DOCUMENT_COUNT_ALERT_TYPE_ID } from '../../../../common/alerting/logs/types'; -import { ExpressionEditor } from './expression_editor'; import { validateExpression } from './validation'; export function getAlertType(): AlertTypeModel { @@ -17,7 +17,7 @@ export function getAlertType(): AlertTypeModel { defaultMessage: 'Log threshold', }), iconClass: 'bell', - alertParamsExpression: ExpressionEditor, + alertParamsExpression: React.lazy(() => import('./expression_editor/editor')), validate: validateExpression, defaultActionMessage: i18n.translate( 'xpack.infra.logs.alerting.threshold.defaultActionMessage', diff --git a/x-pack/plugins/infra/public/compose_libs.ts b/x-pack/plugins/infra/public/compose_libs.ts deleted file mode 100644 index f2060983e95eb..0000000000000 --- a/x-pack/plugins/infra/public/compose_libs.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; -import ApolloClient from 'apollo-client'; -import { ApolloLink } from 'apollo-link'; -import { createHttpLink } from 'apollo-link-http'; -import { withClientState } from 'apollo-link-state'; -import { CoreStart, HttpFetchOptions } from 'src/core/public'; -import { InfraFrontendLibs } from './lib/lib'; -import introspectionQueryResultData from './graphql/introspection.json'; -import { InfraKibanaObservableApiAdapter } from './lib/adapters/observable_api/kibana_observable_api'; - -export function composeLibs(core: CoreStart) { - const cache = new InMemoryCache({ - addTypename: false, - fragmentMatcher: new IntrospectionFragmentMatcher({ - introspectionQueryResultData, - }), - }); - - const observableApi = new InfraKibanaObservableApiAdapter({ - basePath: core.http.basePath.get(), - }); - - const wrappedFetch = (path: string, options: HttpFetchOptions) => { - return new Promise(async (resolve, reject) => { - // core.http.fetch isn't 100% compatible with the Fetch API and will - // throw Errors on 401s. This top level try / catch handles those scenarios. - try { - core.http - .fetch(path, { - ...options, - // Set headers to undefined due to this bug: https://github.com/apollographql/apollo-link/issues/249, - // Apollo will try to set a "content-type" header which will conflict with the "Content-Type" header that - // core.http.fetch correctly sets. - headers: undefined, - asResponse: true, - }) - .then((res) => { - if (!res.response) { - return reject(); - } - // core.http.fetch will parse the Response and set a body before handing it back. As such .text() / .json() - // will have already been called on the Response instance. However, Apollo will also want to call - // .text() / .json() on the instance, as it expects the raw Response instance, rather than core's wrapper. - // .text() / .json() can only be called once, and an Error will be thrown if those methods are accessed again. - // This hacks around that by setting up a new .text() method that will restringify the JSON response we already have. - // This does result in an extra stringify / parse cycle, which isn't ideal, but as we only have a few endpoints left using - // GraphQL this shouldn't create excessive overhead. - // Ref: https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http/src/httpLink.ts#L134 - // and - // https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http-common/src/index.ts#L125 - return resolve({ - ...res.response, - text: () => { - return new Promise(async (resolveText, rejectText) => { - if (res.body) { - return resolveText(JSON.stringify(res.body)); - } else { - return rejectText(); - } - }); - }, - }); - }); - } catch (error) { - reject(error); - } - }); - }; - - const HttpLink = createHttpLink({ - fetch: wrappedFetch, - uri: `/api/infra/graphql`, - }); - - const graphQLOptions = { - cache, - link: ApolloLink.from([ - withClientState({ - cache, - resolvers: {}, - }), - HttpLink, - ]), - }; - - const apolloClient = new ApolloClient(graphQLOptions); - - const libs: InfraFrontendLibs = { - apolloClient, - observableApi, - }; - return libs; -} diff --git a/x-pack/plugins/infra/public/containers/with_state_from_location.tsx b/x-pack/plugins/infra/public/containers/with_state_from_location.tsx deleted file mode 100644 index 2a9676046d451..0000000000000 --- a/x-pack/plugins/infra/public/containers/with_state_from_location.tsx +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { parse, stringify } from 'query-string'; -import { Location } from 'history'; -import { omit } from 'lodash'; -import React from 'react'; -import { RouteComponentProps, withRouter } from 'react-router-dom'; -// eslint-disable-next-line @typescript-eslint/camelcase -import { decode_object, encode_object } from 'rison-node'; -import { Omit } from '../lib/lib'; - -interface AnyObject { - [key: string]: any; -} - -interface WithStateFromLocationOptions { - mapLocationToState: (location: Location) => StateInLocation; - mapStateToLocation: (state: StateInLocation, location: Location) => Location; -} - -type InjectedPropsFromLocation = Partial & { - pushStateInLocation?: (state: StateInLocation) => void; - replaceStateInLocation?: (state: StateInLocation) => void; -}; - -export const withStateFromLocation = ({ - mapLocationToState, - mapStateToLocation, -}: WithStateFromLocationOptions) => < - WrappedComponentProps extends InjectedPropsFromLocation ->( - WrappedComponent: React.ComponentType -) => { - const wrappedName = WrappedComponent.displayName || WrappedComponent.name; - - return withRouter( - class WithStateFromLocation extends React.PureComponent< - RouteComponentProps<{}> & - Omit> - > { - public static displayName = `WithStateFromLocation(${wrappedName})`; - - public render() { - const { location } = this.props; - const otherProps = omit(this.props, ['location', 'history', 'match', 'staticContext']); - - const stateFromLocation = mapLocationToState(location); - - return ( - // @ts-ignore - - ); - } - - private pushStateInLocation = (state: StateInLocation) => { - const { history, location } = this.props; - - const newLocation = mapStateToLocation(state, this.props.location); - - if (newLocation !== location) { - history.push(newLocation); - } - }; - - private replaceStateInLocation = (state: StateInLocation) => { - const { history, location } = this.props; - - const newLocation = mapStateToLocation(state, this.props.location); - - if (newLocation !== location) { - history.replace(newLocation); - } - }; - } - ); -}; - -const decodeRisonAppState = (queryValues: { _a?: string }): AnyObject => { - try { - return queryValues && queryValues._a ? decode_object(queryValues._a) : {}; - } catch (error) { - if (error instanceof Error && error.message.startsWith('rison decoder error')) { - return {}; - } - throw error; - } -}; - -const encodeRisonAppState = (state: AnyObject) => ({ - _a: encode_object(state), -}); - -export const mapRisonAppLocationToState = ( - mapState: (risonAppState: AnyObject) => State = (state: AnyObject) => state as State -) => (location: Location): State => { - const queryValues = parse(location.search.substring(1), { sort: false }); - const decodedState = decodeRisonAppState(queryValues); - return mapState(decodedState); -}; - -export const mapStateToRisonAppLocation = ( - mapState: (state: State) => AnyObject = (state: State) => state -) => (state: State, location: Location): Location => { - const previousQueryValues = parse(location.search.substring(1), { sort: false }); - const previousState = decodeRisonAppState(previousQueryValues); - - const encodedState = encodeRisonAppState({ - ...previousState, - ...mapState(state), - }); - const newQueryValues = stringify( - { - ...previousQueryValues, - ...encodedState, - }, - { sort: false } - ); - return { - ...location, - search: `?${newQueryValues}`, - }; -}; diff --git a/x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts b/x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts deleted file mode 100644 index 41ff3c293a713..0000000000000 --- a/x-pack/plugins/infra/public/graphql/log_entries.gql_query.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import gql from 'graphql-tag'; - -import { sharedFragments } from '../../common/graphql/shared'; - -export const logEntriesQuery = gql` - query LogEntries( - $sourceId: ID = "default" - $timeKey: InfraTimeKeyInput! - $countBefore: Int = 0 - $countAfter: Int = 0 - $filterQuery: String - ) { - source(id: $sourceId) { - id - logEntriesAround( - key: $timeKey - countBefore: $countBefore - countAfter: $countAfter - filterQuery: $filterQuery - ) { - start { - ...InfraTimeKeyFields - } - end { - ...InfraTimeKeyFields - } - hasMoreBefore - hasMoreAfter - entries { - ...InfraLogEntryFields - } - } - } - } - - ${sharedFragments.InfraTimeKey} - ${sharedFragments.InfraLogEntryFields} -`; diff --git a/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx b/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx index f9cfaf71036f6..d93cc44c45623 100644 --- a/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx +++ b/x-pack/plugins/infra/public/hooks/use_link_props.test.tsx @@ -4,15 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { encode } from 'rison-node'; -import { createMemoryHistory } from 'history'; import { renderHook } from '@testing-library/react-hooks'; +import { createMemoryHistory } from 'history'; import React from 'react'; -import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; -import { HistoryContext } from '../utils/history_context'; +import { Router } from 'react-router-dom'; +import { encode } from 'rison-node'; import { coreMock } from 'src/core/public/mocks'; -import { useLinkProps, LinkDescriptor } from './use_link_props'; import { ScopedHistory } from '../../../../../src/core/public'; +import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { LinkDescriptor, useLinkProps } from './use_link_props'; const PREFIX = '/test-basepath/s/test-space/app/'; @@ -30,9 +30,9 @@ const scopedHistory = new ScopedHistory(history, `${PREFIX}${INTERNAL_APP}`); const ProviderWrapper: React.FC = ({ children }) => { return ( - + {children}; - + ); }; diff --git a/x-pack/plugins/infra/public/index.ts b/x-pack/plugins/infra/public/index.ts index 1dfdf827f203b..8f2d37fa1daa9 100644 --- a/x-pack/plugins/infra/public/index.ts +++ b/x-pack/plugins/infra/public/index.ts @@ -4,8 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext, PluginInitializer } from 'kibana/public'; -import { Plugin, ClientSetup, ClientStart, ClientPluginsSetup, ClientPluginsStart } from './plugin'; +import { PluginInitializer, PluginInitializerContext } from 'kibana/public'; +import { ClientSetup, ClientStart, Plugin } from './plugin'; +import { ClientPluginsSetup, ClientPluginsStart } from './types'; export const plugin: PluginInitializer< ClientSetup, diff --git a/x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts b/x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts deleted file mode 100644 index 9ae21d96886f3..0000000000000 --- a/x-pack/plugins/infra/public/lib/adapters/observable_api/kibana_observable_api.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { ajax } from 'rxjs/ajax'; -import { map } from 'rxjs/operators'; - -import { - InfraObservableApi, - InfraObservableApiPostParams, - InfraObservableApiResponse, -} from '../../lib'; - -export class InfraKibanaObservableApiAdapter implements InfraObservableApi { - private basePath: string; - private defaultHeaders: { - [headerName: string]: boolean | string; - }; - - constructor({ basePath }: { basePath: string }) { - this.basePath = basePath; - this.defaultHeaders = { - 'kbn-xsrf': true, - }; - } - - public post = ({ - url, - body, - }: InfraObservableApiPostParams): InfraObservableApiResponse => - ajax({ - body: body ? JSON.stringify(body) : undefined, - headers: { - ...this.defaultHeaders, - 'Content-Type': 'application/json', - }, - method: 'POST', - responseType: 'json', - timeout: 30000, - url: `${this.basePath}/api/${url}`, - withCredentials: true, - }).pipe(map(({ response, status }) => ({ response, status }))); -} diff --git a/x-pack/plugins/infra/public/lib/lib.ts b/x-pack/plugins/infra/public/lib/lib.ts index d1ca62b747a24..93f7ef644f795 100644 --- a/x-pack/plugins/infra/public/lib/lib.ts +++ b/x-pack/plugins/infra/public/lib/lib.ts @@ -4,102 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IModule, IScope } from 'angular'; -import { NormalizedCacheObject } from 'apollo-cache-inmemory'; -import ApolloClient from 'apollo-client'; -import { AxiosRequestConfig } from 'axios'; -import React from 'react'; -import { Observable } from 'rxjs'; -import * as rt from 'io-ts'; import { i18n } from '@kbn/i18n'; -import { SourceQuery } from '../graphql/types'; +import * as rt from 'io-ts'; import { - SnapshotMetricInput, - SnapshotGroupBy, InfraTimerangeInput, + SnapshotGroupBy, + SnapshotMetricInput, SnapshotNodeMetric, SnapshotNodePath, } from '../../common/http_api/snapshot_api'; +import { SourceQuery } from '../graphql/types'; import { WaffleSortOption } from '../pages/metrics/inventory_view/hooks/use_waffle_options'; -export interface InfraFrontendLibs { - apolloClient: InfraApolloClient; - observableApi: InfraObservableApi; -} - -export type InfraTimezoneProvider = () => string; - -export type InfraApolloClient = ApolloClient; - -export interface InfraFrameworkAdapter { - // Insstance vars - appState?: object; - kbnVersion?: string; - timezone?: string; - - // Methods - setUISettings(key: string, value: any): void; - render(component: React.ReactElement): void; - renderBreadcrumbs(component: React.ReactElement): void; -} - -export type InfraFramworkAdapterConstructable = new ( - uiModule: IModule, - timezoneProvider: InfraTimezoneProvider -) => InfraFrameworkAdapter; - -// TODO: replace AxiosRequestConfig with something more defined -export type InfraRequestConfig = AxiosRequestConfig; - -export interface InfraApiAdapter { - get(url: string, config?: InfraRequestConfig | undefined): Promise; - post(url: string, data?: any, config?: AxiosRequestConfig | undefined): Promise; - delete(url: string, config?: InfraRequestConfig | undefined): Promise; - put(url: string, data?: any, config?: InfraRequestConfig | undefined): Promise; -} - -export interface InfraObservableApiPostParams { - url: string; - body?: RequestBody; -} - -export type InfraObservableApiResponse = Observable<{ - status: number; - response: BodyType; -}>; - -export interface InfraObservableApi { - post( - params: InfraObservableApiPostParams - ): InfraObservableApiResponse; -} - -export interface InfraUiKibanaAdapterScope extends IScope { - breadcrumbs: any[]; - topNavMenu: any[]; -} - -export interface InfraKibanaUIConfig { - get(key: string): any; - set(key: string, value: any): Promise; -} - -export interface InfraKibanaAdapterServiceRefs { - config: InfraKibanaUIConfig; - rootScope: IScope; -} - -export type InfraBufferedKibanaServiceCall = (serviceRefs: ServiceRefs) => void; - -export interface InfraField { - name: string; - type: string; - searchable: boolean; - aggregatable: boolean; -} - -export type InfraWaffleData = InfraWaffleMapGroup[]; - export interface InfraWaffleMapNode { pathId: string; id: string; @@ -221,8 +137,6 @@ export interface InfraOptions { wafflemap: InfraWaffleMapOptions; } -export type Omit = Pick>; - export interface InfraWaffleMapBounds { min: number; max: number; diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx index 1394fc48107ef..e62b29974674a 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.test.tsx @@ -35,7 +35,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -47,7 +47,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -59,7 +59,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -73,7 +73,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -89,7 +89,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); @@ -103,7 +103,7 @@ describe('RedirectToNodeLogs component', () => { expect(component).toMatchInlineSnapshot(` `); }); diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx index d9aaa2da7bbc8..10320ebbe7609 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx @@ -71,7 +71,7 @@ export const RedirectToNodeLogs = ({ replaceSourceIdInQueryString(sourceId) )(''); - return ; + return ; }; export const getNodeLogsUrl = ({ diff --git a/x-pack/plugins/infra/public/pages/logs/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/page_content.tsx index 2974939a83215..14c53557ba2c7 100644 --- a/x-pack/plugins/infra/public/pages/logs/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/page_content.tsx @@ -96,6 +96,7 @@ export const LogsPageContent: React.FunctionComponent = () => { + ); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx index 3b68ad314f7df..764eeb154d346 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/table_view.tsx @@ -15,7 +15,7 @@ import { fieldToName } from '../lib/field_to_display_name'; import { NodeContextMenu } from './waffle/node_context_menu'; import { InventoryItemType } from '../../../../../common/inventory_models/types'; import { SnapshotNode, SnapshotNodePath } from '../../../../../common/http_api/snapshot_api'; -import { CONTAINER_CLASSNAME } from '../../../../apps/start_app'; +import { CONTAINER_CLASSNAME } from '../../../../apps/common_styles'; interface Props { nodes: SnapshotNode[]; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts index 91cf405dcc759..9a1fbee421294 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_time.ts @@ -26,7 +26,9 @@ export const useWaffleTime = () => { const [state, setState] = useState(urlState); - useEffect(() => setUrlState(state), [setUrlState, state]); + useEffect(() => { + setUrlState(state); + }, [setUrlState, state]); const { currentTime, isAutoReloading } = urlState; diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx index 17fcc05406470..d2076ad6df502 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/hooks/metrics_time.test.tsx @@ -4,14 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ +import { createMemoryHistory } from 'history'; +import React from 'react'; +import { Router } from 'react-router-dom'; import { mountHook } from 'test_utils/enzyme_helpers'; - +import { ScopedHistory } from '../../../../../../../../src/core/public'; import { useMetricsTime } from './use_metrics_time'; describe('useMetricsTime hook', () => { describe('timeRange state', () => { it('has a default value', () => { - const { getLastHookValue } = mountHook(() => useMetricsTime().timeRange); + const { getLastHookValue } = mountHook( + () => useMetricsTime().timeRange, + createProviderWrapper() + ); const hookValue = getLastHookValue(); expect(hookValue).toHaveProperty('from'); expect(hookValue).toHaveProperty('to'); @@ -19,7 +25,7 @@ describe('useMetricsTime hook', () => { }); it('can be updated', () => { - const { act, getLastHookValue } = mountHook(() => useMetricsTime()); + const { act, getLastHookValue } = mountHook(() => useMetricsTime(), createProviderWrapper()); const timeRange = { from: 'now-15m', @@ -37,12 +43,15 @@ describe('useMetricsTime hook', () => { describe('AutoReloading state', () => { it('has a default value', () => { - const { getLastHookValue } = mountHook(() => useMetricsTime().isAutoReloading); + const { getLastHookValue } = mountHook( + () => useMetricsTime().isAutoReloading, + createProviderWrapper() + ); expect(getLastHookValue()).toBe(false); }); it('can be updated', () => { - const { act, getLastHookValue } = mountHook(() => useMetricsTime()); + const { act, getLastHookValue } = mountHook(() => useMetricsTime(), createProviderWrapper()); act(({ setAutoReload }) => { setAutoReload(true); @@ -52,3 +61,17 @@ describe('useMetricsTime hook', () => { }); }); }); + +const createProviderWrapper = () => { + const INITIAL_URL = '/test-basepath/s/test-space/app/metrics'; + const history = createMemoryHistory(); + + history.push(INITIAL_URL); + const scopedHistory = new ScopedHistory(history, INITIAL_URL); + + const ProviderWrapper: React.FC = ({ children }) => { + return {children}; + }; + + return ProviderWrapper; +}; diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index deae78e22c6a1..b3765db43335a 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -4,54 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; -import { merge } from 'lodash'; import { - Plugin as PluginClass, + AppMountParameters, CoreSetup, CoreStart, + Plugin as PluginClass, PluginInitializerContext, - AppMountParameters, } from 'kibana/public'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; +import { createMetricThresholdAlertType } from './alerting/metric_threshold'; +import { getInventoryMetricAlertType } from './components/alerting/inventory/metric_inventory_threshold_alert_type'; +import { getAlertType as getLogsAlertType } from './components/alerting/logs/log_threshold_alert_type'; import { registerStartSingleton } from './legacy_singletons'; import { registerFeatures } from './register_feature'; -import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; -import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../../src/plugins/data/public'; -import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; -import { DataEnhancedSetup, DataEnhancedStart } from '../../data_enhanced/public'; - -import { TriggersAndActionsUIPublicPluginSetup } from '../../../plugins/triggers_actions_ui/public'; -import { getAlertType as getLogsAlertType } from './components/alerting/logs/log_threshold_alert_type'; -import { getInventoryMetricAlertType } from './components/alerting/inventory/metric_inventory_threshold_alert_type'; -import { createMetricThresholdAlertType } from './alerting/metric_threshold'; +import { ClientPluginsSetup, ClientPluginsStart } from './types'; export type ClientSetup = void; export type ClientStart = void; -export interface ClientPluginsSetup { - home: HomePublicPluginSetup; - data: DataPublicPluginSetup; - usageCollection: UsageCollectionSetup; - dataEnhanced: DataEnhancedSetup; - triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; -} - -export interface ClientPluginsStart { - data: DataPublicPluginStart; - dataEnhanced: DataEnhancedStart; -} - -export type InfraPlugins = ClientPluginsSetup & ClientPluginsStart; - -const getMergedPlugins = (setup: ClientPluginsSetup, start: ClientPluginsStart): InfraPlugins => { - return merge({}, setup, start); -}; - export class Plugin implements PluginClass { - constructor(context: PluginInitializerContext) {} + constructor(_context: PluginInitializerContext) {} - setup(core: CoreSetup, pluginsSetup: ClientPluginsSetup) { + setup(core: CoreSetup, pluginsSetup: ClientPluginsSetup) { registerFeatures(pluginsSetup.home); pluginsSetup.triggers_actions_ui.alertTypeRegistry.register(getInventoryMetricAlertType()); @@ -69,16 +44,18 @@ export class Plugin category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { const [coreStart, pluginsStart] = await core.getStartServices(); - const plugins = getMergedPlugins(pluginsSetup, pluginsStart as ClientPluginsStart); - const { startApp, composeLibs, LogsRouter } = await this.downloadAssets(); + const { renderApp } = await import('./apps/logs_app'); - return startApp( - composeLibs(coreStart), + return renderApp( coreStart, - plugins, - params, - LogsRouter, - pluginsSetup.triggers_actions_ui + { + data: pluginsStart.data, + dataEnhanced: pluginsSetup.dataEnhanced, + home: pluginsSetup.home, + triggers_actions_ui: pluginsStart.triggers_actions_ui, + usageCollection: pluginsSetup.usageCollection, + }, + params ); }, }); @@ -94,16 +71,18 @@ export class Plugin category: DEFAULT_APP_CATEGORIES.observability, mount: async (params: AppMountParameters) => { const [coreStart, pluginsStart] = await core.getStartServices(); - const plugins = getMergedPlugins(pluginsSetup, pluginsStart as ClientPluginsStart); - const { startApp, composeLibs, MetricsRouter } = await this.downloadAssets(); + const { renderApp } = await import('./apps/metrics_app'); - return startApp( - composeLibs(coreStart), + return renderApp( coreStart, - plugins, - params, - MetricsRouter, - pluginsSetup.triggers_actions_ui + { + data: pluginsStart.data, + dataEnhanced: pluginsSetup.dataEnhanced, + home: pluginsSetup.home, + triggers_actions_ui: pluginsStart.triggers_actions_ui, + usageCollection: pluginsSetup.usageCollection, + }, + params ); }, }); @@ -116,28 +95,14 @@ export class Plugin title: 'infra', navLinkStatus: 3, mount: async (params: AppMountParameters) => { - const { startLegacyApp } = await import('./apps/start_legacy_app'); - return startLegacyApp(params); + const { renderApp } = await import('./apps/legacy_app'); + + return renderApp(params); }, }); } - start(core: CoreStart, plugins: ClientPluginsStart) { + start(core: CoreStart, _plugins: ClientPluginsStart) { registerStartSingleton(core); } - - private async downloadAssets() { - const [{ startApp }, { composeLibs }, { LogsRouter, MetricsRouter }] = await Promise.all([ - import('./apps/start_app'), - import('./compose_libs'), - import('./routers'), - ]); - - return { - startApp, - composeLibs, - LogsRouter, - MetricsRouter, - }; - } } diff --git a/x-pack/plugins/infra/public/routers/index.ts b/x-pack/plugins/infra/public/routers/index.ts deleted file mode 100644 index 71ab2613d8dc1..0000000000000 --- a/x-pack/plugins/infra/public/routers/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { History } from 'history'; - -export * from './logs_router'; -export * from './metrics_router'; - -interface RouterProps { - history: History; -} - -export type AppRouter = React.FC; diff --git a/x-pack/plugins/infra/public/routers/logs_router.tsx b/x-pack/plugins/infra/public/routers/logs_router.tsx deleted file mode 100644 index 8258f087b5872..0000000000000 --- a/x-pack/plugins/infra/public/routers/logs_router.tsx +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { Route, Router, Switch } from 'react-router-dom'; - -import { NotFoundPage } from '../pages/404'; -import { LinkToLogsPage } from '../pages/link_to'; -import { LogsPage } from '../pages/logs'; -import { RedirectWithQueryParams } from '../utils/redirect_with_query_params'; -import { useKibana } from '../../../../../src/plugins/kibana_react/public'; -import { AppRouter } from './index'; - -export const LogsRouter: AppRouter = ({ history }) => { - const uiCapabilities = useKibana().services.application?.capabilities; - return ( - - - - {uiCapabilities?.logs?.show && ( - - )} - {uiCapabilities?.logs?.show && } - - - - ); -}; diff --git a/x-pack/plugins/infra/public/routers/metrics_router.tsx b/x-pack/plugins/infra/public/routers/metrics_router.tsx deleted file mode 100644 index 0e427150a46cc..0000000000000 --- a/x-pack/plugins/infra/public/routers/metrics_router.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { Route, Router, Switch } from 'react-router-dom'; - -import { NotFoundPage } from '../pages/404'; -import { InfrastructurePage } from '../pages/metrics'; -import { MetricDetail } from '../pages/metrics/metric_detail'; -import { RedirectWithQueryParams } from '../utils/redirect_with_query_params'; -import { useKibana } from '../../../../../src/plugins/kibana_react/public'; -import { AppRouter } from './index'; -import { LinkToMetricsPage } from '../pages/link_to'; - -export const MetricsRouter: AppRouter = ({ history }) => { - const uiCapabilities = useKibana().services.application?.capabilities; - return ( - - - - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && ( - - )} - {uiCapabilities?.infrastructure?.show && } - - - - ); -}; diff --git a/x-pack/plugins/infra/public/types.ts b/x-pack/plugins/infra/public/types.ts new file mode 100644 index 0000000000000..8181da3301c92 --- /dev/null +++ b/x-pack/plugins/infra/public/types.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; +import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; +import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; +import { TriggersAndActionsUIPublicPluginSetup } from '../../../plugins/triggers_actions_ui/public'; +import { DataEnhancedSetup } from '../../data_enhanced/public'; + +export interface ClientPluginsSetup { + dataEnhanced: DataEnhancedSetup; + home: HomePublicPluginSetup; + triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; + usageCollection: UsageCollectionSetup; +} + +export interface ClientPluginsStart { + data: DataPublicPluginStart; + triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup; +} + +export type ClientPluginDeps = ClientPluginsSetup & ClientPluginsStart; diff --git a/x-pack/plugins/infra/public/utils/apollo_client.ts b/x-pack/plugins/infra/public/utils/apollo_client.ts new file mode 100644 index 0000000000000..3c69ef4c98fac --- /dev/null +++ b/x-pack/plugins/infra/public/utils/apollo_client.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemory'; +import ApolloClient from 'apollo-client'; +import { ApolloLink } from 'apollo-link'; +import { createHttpLink } from 'apollo-link-http'; +import { withClientState } from 'apollo-link-state'; +import { HttpFetchOptions, HttpHandler } from 'src/core/public'; +import introspectionQueryResultData from '../graphql/introspection.json'; + +export const createApolloClient = (fetch: HttpHandler) => { + const cache = new InMemoryCache({ + addTypename: false, + fragmentMatcher: new IntrospectionFragmentMatcher({ + introspectionQueryResultData, + }), + }); + + const wrappedFetch = (path: string, options: HttpFetchOptions) => { + return new Promise(async (resolve, reject) => { + // core.http.fetch isn't 100% compatible with the Fetch API and will + // throw Errors on 401s. This top level try / catch handles those scenarios. + try { + fetch(path, { + ...options, + // Set headers to undefined due to this bug: https://github.com/apollographql/apollo-link/issues/249, + // Apollo will try to set a "content-type" header which will conflict with the "Content-Type" header that + // core.http.fetch correctly sets. + headers: undefined, + asResponse: true, + }).then((res) => { + if (!res.response) { + return reject(); + } + // core.http.fetch will parse the Response and set a body before handing it back. As such .text() / .json() + // will have already been called on the Response instance. However, Apollo will also want to call + // .text() / .json() on the instance, as it expects the raw Response instance, rather than core's wrapper. + // .text() / .json() can only be called once, and an Error will be thrown if those methods are accessed again. + // This hacks around that by setting up a new .text() method that will restringify the JSON response we already have. + // This does result in an extra stringify / parse cycle, which isn't ideal, but as we only have a few endpoints left using + // GraphQL this shouldn't create excessive overhead. + // Ref: https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http/src/httpLink.ts#L134 + // and + // https://github.com/apollographql/apollo-link/blob/master/packages/apollo-link-http-common/src/index.ts#L125 + return resolve({ + ...res.response, + text: () => { + return new Promise(async (resolveText, rejectText) => { + if (res.body) { + return resolveText(JSON.stringify(res.body)); + } else { + return rejectText(); + } + }); + }, + }); + }); + } catch (error) { + reject(error); + } + }); + }; + + const HttpLink = createHttpLink({ + fetch: wrappedFetch, + uri: `/api/infra/graphql`, + }); + + const graphQLOptions = { + cache, + link: ApolloLink.from([ + withClientState({ + cache, + resolvers: {}, + }), + HttpLink, + ]), + }; + + return new ApolloClient(graphQLOptions); +}; diff --git a/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx b/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx index 1cff3663280fd..6b51714893a6d 100644 --- a/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx +++ b/x-pack/plugins/infra/public/utils/triggers_actions_context.tsx @@ -5,10 +5,10 @@ */ import * as React from 'react'; -import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; +import { TriggersAndActionsUIPublicPluginStart } from '../../../triggers_actions_ui/public'; interface ContextProps { - triggersActionsUI: TriggersAndActionsUIPublicPluginSetup | null; + triggersActionsUI: TriggersAndActionsUIPublicPluginStart | null; } export const TriggerActionsContext = React.createContext({ @@ -16,7 +16,7 @@ export const TriggerActionsContext = React.createContext({ }); interface Props { - triggersActionsUI: TriggersAndActionsUIPublicPluginSetup; + triggersActionsUI: TriggersAndActionsUIPublicPluginStart; } export const TriggersActionsProvider: React.FC = (props) => { diff --git a/x-pack/plugins/infra/public/utils/use_url_state.ts b/x-pack/plugins/infra/public/utils/use_url_state.ts index 7a63b48fa9a1a..ab0ca1311194f 100644 --- a/x-pack/plugins/infra/public/utils/use_url_state.ts +++ b/x-pack/plugins/infra/public/utils/use_url_state.ts @@ -8,10 +8,9 @@ import { parse, stringify } from 'query-string'; import { Location } from 'history'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { decode, encode, RisonValue } from 'rison-node'; +import { useHistory } from 'react-router-dom'; import { url } from '../../../../../src/plugins/kibana_utils/public'; -import { useHistory } from './history_context'; - export const useUrlState = ({ defaultState, decodeUrlState, From 4f2c199f0ed7cf461565cb021e7576046fd1573a Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 9 Jun 2020 15:05:50 -0700 Subject: [PATCH 17/19] Fix edit datasource not working following changes in #67234 (#68583) --- .../components/custom_configure_datasource.tsx | 3 ++- .../step_configure_datasource.tsx | 7 +++++-- .../agent_config/edit_datasource_page/index.tsx | 5 +++-- .../configure_datasource.tsx | 15 +++------------ 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx index aff764cb8ba3e..4263feb7cd8c7 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/components/custom_configure_datasource.tsx @@ -12,7 +12,8 @@ import { CreateDatasourceFrom } from '../types'; export interface CustomConfigureDatasourceProps { packageName: string; from: CreateDatasourceFrom; - datasource: NewDatasource | (NewDatasource & { id: string }); + datasource: NewDatasource; + datasourceId?: string; } /** diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx index d9cf0fbfb7987..5499ac287ff05 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/create_datasource_page/step_configure_datasource.tsx @@ -16,7 +16,8 @@ import { CreateDatasourceFrom } from './types'; export const StepConfigureDatasource: React.FunctionComponent<{ from?: CreateDatasourceFrom; packageInfo: PackageInfo; - datasource: NewDatasource | (NewDatasource & { id: string }); + datasource: NewDatasource; + datasourceId?: string; updateDatasource: (fields: Partial) => void; validationResults: DatasourceValidationResults; submitAttempted: boolean; @@ -24,6 +25,7 @@ export const StepConfigureDatasource: React.FunctionComponent<{ from = 'config', packageInfo, datasource, + datasourceId, updateDatasource, validationResults, submitAttempted, @@ -70,9 +72,10 @@ export const StepConfigureDatasource: React.FunctionComponent<{ ) : ( ); diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx index 4bb42faedf7f6..d47eea80da8b7 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_datasource_page/index.tsx @@ -69,8 +69,7 @@ export const EditDatasourcePage: React.FunctionComponent = () => { const [loadingError, setLoadingError] = useState(); const [agentConfig, setAgentConfig] = useState(); const [packageInfo, setPackageInfo] = useState(); - const [datasource, setDatasource] = useState({ - id: '', + const [datasource, setDatasource] = useState({ name: '', description: '', config_id: '', @@ -94,6 +93,7 @@ export const EditDatasourcePage: React.FunctionComponent = () => { } if (datasourceData?.item) { const { + id, revision, inputs, created_by, @@ -302,6 +302,7 @@ export const EditDatasourcePage: React.FunctionComponent = () => { from={'edit'} packageInfo={packageInfo} datasource={datasource} + datasourceId={datasourceId} updateDatasource={updateDatasource} validationResults={validationResults!} submitAttempted={formState === 'INVALID'} diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx index ebcb46c3fb5b7..db5196bfc4eb4 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_datasource.tsx @@ -12,30 +12,21 @@ import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app import { CustomConfigureDatasourceContent, CustomConfigureDatasourceProps, - NewDatasource, } from '../../../../../../../ingest_manager/public'; import { getManagementUrl } from '../../../..'; -type DatasourceWithId = NewDatasource & { id: string }; - /** * Exports Endpoint-specific datasource configuration instructions * for use in the Ingest app create / edit datasource config */ export const ConfigureEndpointDatasource = memo( - ({ - from, - datasource, - }: { - from: string; - datasource: CustomConfigureDatasourceProps['datasource']; - }) => { + ({ from, datasourceId }: CustomConfigureDatasourceProps) => { const { services } = useKibana(); let policyUrl = ''; - if (from === 'edit') { + if (from === 'edit' && datasourceId) { policyUrl = getManagementUrl({ name: 'policyDetails', - policyId: (datasource as DatasourceWithId).id, + policyId: datasourceId, }); } From aec0b976151415bee54f94aefc1a6a803264d5f0 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Tue, 9 Jun 2020 16:05:48 -0700 Subject: [PATCH 18/19] Surface data streams in Index Management. (#67806) --- .../helpers/http_requests.ts | 9 ++ .../client_integration/helpers/index.ts | 42 +----- .../helpers/test_subjects.ts | 51 +++++++ .../home/data_streams_tab.helpers.ts | 101 +++++++++++++ .../home/data_streams_tab.test.ts | 137 +++++++++++++++++ .../home/indices_tab.helpers.ts | 27 +++- .../home/indices_tab.test.ts | 44 ++++++ .../common/lib/data_stream_serialization.ts | 21 +++ .../index_management/common/lib/index.ts | 3 + .../common/types/data_streams.ts | 29 ++++ .../index_management/common/types/index.ts | 2 + .../public/application/app.tsx | 6 +- .../data_stream_detail_panel.tsx | 104 +++++++++++++ .../data_stream_detail_panel/index.ts | 7 + .../data_stream_list/data_stream_list.tsx | 127 ++++++++++++++++ .../data_stream_table/data_stream_table.tsx | 139 ++++++++++++++++++ .../data_stream_table/index.ts | 7 + .../index.ts} | 2 +- .../public/application/sections/home/home.tsx | 23 ++- .../detail_panel/detail_panel.container.d.ts | 7 + .../detail_panel/{index.js => index.ts} | 0 .../{index_list.js => index_list.tsx} | 8 +- .../index_table/{index.js => index.ts} | 0 .../index_table/index_table.container.d.ts | 7 + .../index_list/index_table/index_table.js | 40 ++++- .../template_details/template_details.tsx | 4 +- .../template_table/template_table.tsx | 6 +- .../template_clone/template_clone.tsx | 4 +- .../sections/template_edit/template_edit.tsx | 4 +- .../public/application/services/api.ts | 21 ++- .../public/application/services/routing.ts | 19 ++- .../index_management/public/shared_imports.ts | 2 + .../server/client/elasticsearch.ts | 69 +++++++++ .../server/routes/api/data_streams/index.ts | 13 ++ .../api/data_streams/register_get_route.ts | 34 +++++ .../index_management/server/routes/index.ts | 2 + .../index_management/data_streams.ts | 89 +++++++++++ .../apis/management/index_management/index.js | 1 + .../index_management/lib/elasticsearch.js | 1 + .../apps/index_management/home_page.ts | 24 ++- .../page_objects/index_management_page.ts | 5 +- 41 files changed, 1161 insertions(+), 80 deletions(-) create mode 100644 x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts create mode 100644 x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts create mode 100644 x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts create mode 100644 x-pack/plugins/index_management/common/lib/data_stream_serialization.ts create mode 100644 x-pack/plugins/index_management/common/types/data_streams.ts create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx create mode 100644 x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts rename x-pack/plugins/index_management/public/application/sections/home/{index_list/index_list.d.ts => data_stream_list/index.ts} (82%) create mode 100644 x-pack/plugins/index_management/public/application/sections/home/index_list/detail_panel/detail_panel.container.d.ts rename x-pack/plugins/index_management/public/application/sections/home/index_list/detail_panel/{index.js => index.ts} (100%) rename x-pack/plugins/index_management/public/application/sections/home/index_list/{index_list.js => index_list.tsx} (71%) rename x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/{index.js => index.ts} (100%) create mode 100644 x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts create mode 100644 x-pack/plugins/index_management/server/routes/api/data_streams/index.ts create mode 100644 x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts create mode 100644 x-pack/test/api_integration/apis/management/index_management/data_streams.ts diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts index 75d1b69eb6157..56d76da522ac2 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/http_requests.ts @@ -27,6 +27,14 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { ]); }; + const setLoadDataStreamsResponse = (response: HttpResponse = []) => { + server.respondWith('GET', `${API_BASE_PATH}/data_streams`, [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response), + ]); + }; + const setDeleteTemplateResponse = (response: HttpResponse = []) => { server.respondWith('POST', `${API_BASE_PATH}/delete_index_templates`, [ 200, @@ -71,6 +79,7 @@ const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { return { setLoadTemplatesResponse, setLoadIndicesResponse, + setLoadDataStreamsResponse, setDeleteTemplateResponse, setLoadTemplateResponse, setCreateTemplateResponse, diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts index 8e7755a65af3c..f581083e28cc6 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/index.ts @@ -10,44 +10,4 @@ export { nextTick, getRandomString, findTestSubject, TestBed } from '../../../.. export { setupEnvironment, WithAppDependencies, services } from './setup_environment'; -export type TestSubjects = - | 'aliasesTab' - | 'appTitle' - | 'cell' - | 'closeDetailsButton' - | 'createTemplateButton' - | 'createLegacyTemplateButton' - | 'deleteSystemTemplateCallOut' - | 'deleteTemplateButton' - | 'deleteTemplatesConfirmation' - | 'documentationLink' - | 'emptyPrompt' - | 'manageTemplateButton' - | 'mappingsTab' - | 'noAliasesCallout' - | 'noMappingsCallout' - | 'noSettingsCallout' - | 'indicesList' - | 'indicesTab' - | 'indexTableIncludeHiddenIndicesToggle' - | 'indexTableIndexNameLink' - | 'reloadButton' - | 'reloadIndicesButton' - | 'row' - | 'sectionError' - | 'sectionLoading' - | 'settingsTab' - | 'summaryTab' - | 'summaryTitle' - | 'systemTemplatesSwitch' - | 'templateDetails' - | 'templateDetails.manageTemplateButton' - | 'templateDetails.sectionLoading' - | 'templateDetails.tab' - | 'templateDetails.title' - | 'templateList' - | 'templateTable' - | 'templatesTab' - | 'legacyTemplateTable' - | 'viewButton' - | 'filterList.filterItem'; +export { TestSubjects } from './test_subjects'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts b/x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts new file mode 100644 index 0000000000000..4e297118b0fdd --- /dev/null +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/test_subjects.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export type TestSubjects = + | 'aliasesTab' + | 'appTitle' + | 'cell' + | 'closeDetailsButton' + | 'createLegacyTemplateButton' + | 'createTemplateButton' + | 'dataStreamsEmptyPromptTemplateLink' + | 'dataStreamTable' + | 'dataStreamTable' + | 'deleteSystemTemplateCallOut' + | 'deleteTemplateButton' + | 'deleteTemplatesConfirmation' + | 'documentationLink' + | 'emptyPrompt' + | 'filterList.filterItem' + | 'indexTable' + | 'indexTableIncludeHiddenIndicesToggle' + | 'indexTableIndexNameLink' + | 'indicesList' + | 'indicesTab' + | 'legacyTemplateTable' + | 'manageTemplateButton' + | 'mappingsTab' + | 'noAliasesCallout' + | 'noMappingsCallout' + | 'noSettingsCallout' + | 'reloadButton' + | 'reloadIndicesButton' + | 'row' + | 'sectionError' + | 'sectionLoading' + | 'settingsTab' + | 'summaryTab' + | 'summaryTitle' + | 'systemTemplatesSwitch' + | 'templateDetails' + | 'templateDetails.manageTemplateButton' + | 'templateDetails.sectionLoading' + | 'templateDetails.tab' + | 'templateDetails.title' + | 'templateList' + | 'templatesTab' + | 'templateTable' + | 'viewButton'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts new file mode 100644 index 0000000000000..ef6aca44a1754 --- /dev/null +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, +} from '../../../../../test_utils'; +import { DataStream } from '../../../common'; +import { IndexManagementHome } from '../../../public/application/sections/home'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { indexManagementStore } from '../../../public/application/store'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { WithAppDependencies, services, TestSubjects } from '../helpers'; + +const testBedConfig: TestBedConfig = { + store: () => indexManagementStore(services as any), + memoryRouter: { + initialEntries: [`/indices`], + componentRoutePath: `/:section(indices|data_streams|templates)`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(IndexManagementHome), testBedConfig); + +export interface DataStreamsTabTestBed extends TestBed { + actions: { + goToDataStreamsList: () => void; + clickEmptyPromptIndexTemplateLink: () => void; + clickReloadButton: () => void; + clickIndicesAt: (index: number) => void; + }; +} + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + /** + * User Actions + */ + + const goToDataStreamsList = () => { + testBed.find('data_streamsTab').simulate('click'); + }; + + const clickEmptyPromptIndexTemplateLink = async () => { + const { find, component, router } = testBed; + + const templateLink = find('dataStreamsEmptyPromptTemplateLink'); + + await act(async () => { + router.navigateTo(templateLink.props().href!); + }); + + component.update(); + }; + + const clickReloadButton = () => { + const { find } = testBed; + find('reloadButton').simulate('click'); + }; + + const clickIndicesAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('dataStreamTable'); + const indicesLink = findTestSubject(rows[index].reactWrapper, 'indicesLink'); + + await act(async () => { + router.navigateTo(indicesLink.props().href!); + }); + + component.update(); + }; + + return { + ...testBed, + actions: { + goToDataStreamsList, + clickEmptyPromptIndexTemplateLink, + clickReloadButton, + clickIndicesAt, + }, + }; +}; + +export const createDataStreamPayload = (name: string): DataStream => ({ + name, + timeStampField: '@timestamp', + indices: [ + { + name: 'indexName', + uuid: 'indexId', + }, + ], + generation: 1, +}); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts new file mode 100644 index 0000000000000..efe2e2d0c74ae --- /dev/null +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { API_BASE_PATH } from '../../../common/constants'; +import { setupEnvironment } from '../helpers'; + +import { DataStreamsTabTestBed, setup, createDataStreamPayload } from './data_streams_tab.helpers'; + +describe('Data Streams tab', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: DataStreamsTabTestBed; + + afterAll(() => { + server.restore(); + }); + + beforeEach(async () => { + httpRequestsMockHelpers.setLoadIndicesResponse([ + { + health: '', + status: '', + primary: '', + replica: '', + documents: '', + documents_deleted: '', + size: '', + primary_size: '', + name: 'data-stream-index', + data_stream: 'dataStream1', + }, + { + health: 'green', + status: 'open', + primary: 1, + replica: 1, + documents: 10000, + documents_deleted: 100, + size: '156kb', + primary_size: '156kb', + name: 'non-data-stream-index', + }, + ]); + + await act(async () => { + testBed = await setup(); + }); + }); + + describe('when there are no data streams', () => { + beforeEach(async () => { + const { actions, component } = testBed; + + httpRequestsMockHelpers.setLoadDataStreamsResponse([]); + httpRequestsMockHelpers.setLoadTemplatesResponse({ templates: [], legacyTemplates: [] }); + + await act(async () => { + actions.goToDataStreamsList(); + }); + + component.update(); + }); + + test('displays an empty prompt', async () => { + const { exists } = testBed; + + expect(exists('sectionLoading')).toBe(false); + expect(exists('emptyPrompt')).toBe(true); + }); + + test('goes to index templates tab when "Get started" link is clicked', async () => { + const { actions, exists } = testBed; + + await act(async () => { + actions.clickEmptyPromptIndexTemplateLink(); + }); + + expect(exists('templateList')).toBe(true); + }); + }); + + describe('when there are data streams', () => { + beforeEach(async () => { + const { actions, component } = testBed; + + httpRequestsMockHelpers.setLoadDataStreamsResponse([ + createDataStreamPayload('dataStream1'), + createDataStreamPayload('dataStream2'), + ]); + + await act(async () => { + actions.goToDataStreamsList(); + }); + + component.update(); + }); + + test('lists them in the table', async () => { + const { table } = testBed; + + const { tableCellsValues } = table.getMetaData('dataStreamTable'); + + expect(tableCellsValues).toEqual([ + ['dataStream1', '1', '@timestamp', '1'], + ['dataStream2', '1', '@timestamp', '1'], + ]); + }); + + test('has a button to reload the data streams', async () => { + const { exists, actions } = testBed; + const totalRequests = server.requests.length; + + expect(exists('reloadButton')).toBe(true); + + await act(async () => { + actions.clickReloadButton(); + }); + + expect(server.requests.length).toBe(totalRequests + 1); + expect(server.requests[server.requests.length - 1].url).toBe(`${API_BASE_PATH}/data_streams`); + }); + + test('clicking the indices count navigates to the backing indices', async () => { + const { table, actions } = testBed; + + await actions.clickIndicesAt(0); + + expect(table.getMetaData('indexTable').tableCellsValues).toEqual([ + ['', '', '', '', '', '', '', 'dataStream1'], + ]); + }); + }); +}); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts index e995932dfa00d..f00348aacbf08 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts @@ -6,8 +6,13 @@ import { act } from 'react-dom/test-utils'; -import { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; -import { IndexList } from '../../../public/application/sections/home/index_list'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, +} from '../../../../../test_utils'; +import { IndexManagementHome } from '../../../public/application/sections/home'; // eslint-disable-line @kbn/eslint/no-restricted-paths import { indexManagementStore } from '../../../public/application/store'; // eslint-disable-line @kbn/eslint/no-restricted-paths import { WithAppDependencies, services, TestSubjects } from '../helpers'; @@ -15,18 +20,19 @@ const testBedConfig: TestBedConfig = { store: () => indexManagementStore(services as any), memoryRouter: { initialEntries: [`/indices?includeHiddenIndices=true`], - componentRoutePath: `/:section(indices|templates)`, + componentRoutePath: `/:section(indices|data_streams)`, }, doMountAsync: true, }; -const initTestBed = registerTestBed(WithAppDependencies(IndexList), testBedConfig); +const initTestBed = registerTestBed(WithAppDependencies(IndexManagementHome), testBedConfig); export interface IndicesTestBed extends TestBed { actions: { selectIndexDetailsTab: (tab: 'settings' | 'mappings' | 'stats' | 'edit_settings') => void; getIncludeHiddenIndicesToggleStatus: () => boolean; clickIncludeHiddenIndicesToggle: () => void; + clickDataStreamAt: (index: number) => void; }; } @@ -59,12 +65,25 @@ export const setup = async (): Promise => { component.update(); }; + const clickDataStreamAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('indexTable'); + const dataStreamLink = findTestSubject(rows[index].reactWrapper, 'dataStreamLink'); + + await act(async () => { + router.navigateTo(dataStreamLink.props().href!); + }); + + component.update(); + }; + return { ...testBed, actions: { selectIndexDetailsTab, getIncludeHiddenIndicesToggleStatus, clickIncludeHiddenIndicesToggle, + clickDataStreamAt, }, }; }; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts index 11c25ffbb590f..c2d955bb4dfce 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.test.ts @@ -9,6 +9,7 @@ import { act } from 'react-dom/test-utils'; import { API_BASE_PATH } from '../../../common/constants'; import { setupEnvironment, nextTick } from '../helpers'; import { IndicesTestBed, setup } from './indices_tab.helpers'; +import { createDataStreamPayload } from './data_streams_tab.helpers'; /** * The below import is required to avoid a console error warn from the "brace" package @@ -52,6 +53,49 @@ describe('', () => { }); }); + describe('data stream column', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadIndicesResponse([ + { + health: '', + status: '', + primary: '', + replica: '', + documents: '', + documents_deleted: '', + size: '', + primary_size: '', + name: 'data-stream-index', + data_stream: 'dataStream1', + }, + ]); + + httpRequestsMockHelpers.setLoadDataStreamsResponse([ + createDataStreamPayload('dataStream1'), + createDataStreamPayload('dataStream2'), + ]); + + testBed = await setup(); + + await act(async () => { + const { component } = testBed; + + await nextTick(); + component.update(); + }); + }); + + test('navigates to the data stream in the Data Streams tab', async () => { + const { table, actions } = testBed; + + await actions.clickDataStreamAt(0); + + expect(table.getMetaData('dataStreamTable').tableCellsValues).toEqual([ + ['dataStream1', '1', '@timestamp', '1'], + ]); + }); + }); + describe('index detail panel with % character in index name', () => { const indexName = 'test%'; beforeEach(async () => { diff --git a/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts new file mode 100644 index 0000000000000..9d267210a6b31 --- /dev/null +++ b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { DataStream, DataStreamFromEs } from '../types'; + +export function deserializeDataStreamList(dataStreamsFromEs: DataStreamFromEs[]): DataStream[] { + return dataStreamsFromEs.map(({ name, timestamp_field, indices, generation }) => ({ + name, + timeStampField: timestamp_field, + indices: indices.map( + ({ index_name, index_uuid }: { index_name: string; index_uuid: string }) => ({ + name: index_name, + uuid: index_uuid, + }) + ), + generation, + })); +} diff --git a/x-pack/plugins/index_management/common/lib/index.ts b/x-pack/plugins/index_management/common/lib/index.ts index c67d28da2c24b..fce4d8ccc2502 100644 --- a/x-pack/plugins/index_management/common/lib/index.ts +++ b/x-pack/plugins/index_management/common/lib/index.ts @@ -3,6 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + +export { deserializeDataStreamList } from './data_stream_serialization'; + export { deserializeLegacyTemplateList, deserializeTemplateList, diff --git a/x-pack/plugins/index_management/common/types/data_streams.ts b/x-pack/plugins/index_management/common/types/data_streams.ts new file mode 100644 index 0000000000000..5b743296d868b --- /dev/null +++ b/x-pack/plugins/index_management/common/types/data_streams.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export interface DataStreamFromEs { + name: string; + timestamp_field: string; + indices: DataStreamIndexFromEs[]; + generation: number; +} + +export interface DataStreamIndexFromEs { + index_name: string; + index_uuid: string; +} + +export interface DataStream { + name: string; + timeStampField: string; + indices: DataStreamIndex[]; + generation: number; +} + +export interface DataStreamIndex { + name: string; + uuid: string; +} diff --git a/x-pack/plugins/index_management/common/types/index.ts b/x-pack/plugins/index_management/common/types/index.ts index 81a06156dd291..c4ba60573d430 100644 --- a/x-pack/plugins/index_management/common/types/index.ts +++ b/x-pack/plugins/index_management/common/types/index.ts @@ -12,4 +12,6 @@ export * from './mappings'; export * from './templates'; +export { DataStreamFromEs, DataStream, DataStreamIndex } from './data_streams'; + export * from './component_templates'; diff --git a/x-pack/plugins/index_management/public/application/app.tsx b/x-pack/plugins/index_management/public/application/app.tsx index bfd99de6949e5..92197bee30c88 100644 --- a/x-pack/plugins/index_management/public/application/app.tsx +++ b/x-pack/plugins/index_management/public/application/app.tsx @@ -31,9 +31,9 @@ export const App = ({ history }: { history: ScopedHistory }) => { // Export this so we can test it with a different router. export const AppWithoutRouter = () => ( - - - + + + diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx new file mode 100644 index 0000000000000..a6c8b83a05f98 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/data_stream_detail_panel.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { Fragment } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { + EuiFlyout, + EuiFlyoutHeader, + EuiTitle, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, +} from '@elastic/eui'; + +import { SectionLoading, SectionError, Error } from '../../../../components'; +import { useLoadDataStream } from '../../../../services/api'; + +interface Props { + dataStreamName: string; + onClose: () => void; +} + +/** + * NOTE: This currently isn't in use by data_stream_list.tsx because it doesn't contain any + * information that doesn't already exist in the table. We'll use it once we add additional + * info, e.g. storage size, docs count. + */ +export const DataStreamDetailPanel: React.FunctionComponent = ({ + dataStreamName, + onClose, +}) => { + const { error, data: dataStream, isLoading } = useLoadDataStream(dataStreamName); + + let content; + + if (isLoading) { + content = ( + + + + ); + } else if (error) { + content = ( + + } + error={error as Error} + data-test-subj="sectionError" + /> + ); + } else if (dataStream) { + content = {JSON.stringify(dataStream)}; + } + + return ( + + + +

+ {dataStreamName} +

+
+
+ + {content} + + + + + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts new file mode 100644 index 0000000000000..3f45267c032ed --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_detail_panel/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { DataStreamDetailPanel } from './data_stream_detail_panel'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx new file mode 100644 index 0000000000000..951c4a0d7f3c3 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { RouteComponentProps } from 'react-router-dom'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; +import { EuiTitle, EuiText, EuiSpacer, EuiEmptyPrompt, EuiLink } from '@elastic/eui'; +import { ScopedHistory } from 'kibana/public'; + +import { reactRouterNavigate } from '../../../../shared_imports'; +import { SectionError, SectionLoading, Error } from '../../../components'; +import { useLoadDataStreams } from '../../../services/api'; +import { DataStreamTable } from './data_stream_table'; + +interface MatchParams { + dataStreamName?: string; +} + +export const DataStreamList: React.FunctionComponent> = ({ + match: { + params: { dataStreamName }, + }, + history, +}) => { + const { error, isLoading, data: dataStreams, sendRequest: reload } = useLoadDataStreams(); + + let content; + + if (isLoading) { + content = ( + + + + ); + } else if (error) { + content = ( + + } + error={error as Error} + /> + ); + } else if (Array.isArray(dataStreams) && dataStreams.length === 0) { + content = ( + + + + } + body={ +

+ + {i18n.translate('xpack.idxMgmt.dataStreamList.emptyPrompt.getStartedLink', { + defaultMessage: 'composable index template', + })} + + ), + }} + /> +

+ } + data-test-subj="emptyPrompt" + /> + ); + } else if (Array.isArray(dataStreams) && dataStreams.length > 0) { + content = ( + <> + {/* TODO: Add a switch for toggling on data streams created by Ingest Manager */} + + + + + + + + + + + {/* TODO: Implement this once we have something to put in here, e.g. storage size, docs count */} + {/* dataStreamName && ( + { + history.push('/data_streams'); + }} + /> + )*/} + + ); + } + + return
{content}
; +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx new file mode 100644 index 0000000000000..54b215e561b46 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx @@ -0,0 +1,139 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiInMemoryTable, EuiBasicTableColumn, EuiButton, EuiLink } from '@elastic/eui'; +import { ScopedHistory } from 'kibana/public'; + +import { DataStream } from '../../../../../../common/types'; +import { reactRouterNavigate } from '../../../../../shared_imports'; +import { encodePathForReactRouter } from '../../../../services/routing'; + +interface Props { + dataStreams?: DataStream[]; + reload: () => {}; + history: ScopedHistory; + filters?: string; +} + +export const DataStreamTable: React.FunctionComponent = ({ + dataStreams, + reload, + history, + filters, +}) => { + const columns: Array> = [ + { + field: 'name', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.nameColumnTitle', { + defaultMessage: 'Name', + }), + truncateText: true, + sortable: true, + // TODO: Render as a link to open the detail panel + }, + { + field: 'indices', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.indicesColumnTitle', { + defaultMessage: 'Indices', + }), + truncateText: true, + sortable: true, + render: (indices: DataStream['indices'], dataStream) => ( + + {indices.length} + + ), + }, + { + field: 'timeStampField', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.timeStampFieldColumnTitle', { + defaultMessage: 'Timestamp field', + }), + truncateText: true, + sortable: true, + }, + { + field: 'generation', + name: i18n.translate('xpack.idxMgmt.dataStreamList.table.generationFieldColumnTitle', { + defaultMessage: 'Generation', + }), + truncateText: true, + sortable: true, + }, + ]; + + const pagination = { + initialPageSize: 20, + pageSizeOptions: [10, 20, 50], + }; + + const sorting = { + sort: { + field: 'name', + direction: 'asc', + }, + } as const; + + const searchConfig = { + query: filters, + box: { + incremental: true, + }, + toolsLeft: undefined /* TODO: Actions menu */, + toolsRight: [ + + + , + ], + }; + + return ( + <> + ({ + 'data-test-subj': 'row', + })} + cellProps={() => ({ + 'data-test-subj': 'cell', + })} + data-test-subj="dataStreamTable" + message={ + + } + /> + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts new file mode 100644 index 0000000000000..3922ca5c1d50c --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { DataStreamTable } from './data_stream_table'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_list.d.ts b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/index.ts similarity index 82% rename from x-pack/plugins/index_management/public/application/sections/home/index_list/index_list.d.ts rename to x-pack/plugins/index_management/public/application/sections/home/data_stream_list/index.ts index f03f483c0e821..e2f588cc2a0fb 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_list.d.ts +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export declare function IndexList(match: any): any; +export { DataStreamList } from './data_stream_list'; diff --git a/x-pack/plugins/index_management/public/application/sections/home/home.tsx b/x-pack/plugins/index_management/public/application/sections/home/home.tsx index 0ddf4fefce466..51deaf42cc72c 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/home.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/home.tsx @@ -19,6 +19,7 @@ import { EuiTitle, } from '@elastic/eui'; import { documentationService } from '../../services/documentation'; +import { DataStreamList } from './data_stream_list'; import { IndexList } from './index_list'; import { TemplateList } from './template_list'; import { ComponentTemplateList } from '../../components/component_templates'; @@ -26,11 +27,17 @@ import { breadcrumbService } from '../../services/breadcrumbs'; export enum Section { Indices = 'indices', + DataStreams = 'data_streams', IndexTemplates = 'templates', ComponentTemplates = 'component_templates', } -export const homeSections = [Section.Indices, Section.IndexTemplates, Section.ComponentTemplates]; +export const homeSections = [ + Section.Indices, + Section.DataStreams, + Section.IndexTemplates, + Section.ComponentTemplates, +]; interface MatchParams { section: Section; @@ -47,6 +54,15 @@ export const IndexManagementHome: React.FunctionComponent, }, + { + id: Section.DataStreams, + name: ( + + ), + }, { id: Section.IndexTemplates, name: ( @@ -122,6 +138,11 @@ export const IndexManagementHome: React.FunctionComponent + = ({ history }) => { return (
- +
); -} +}; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.ts similarity index 100% rename from x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.js rename to x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index.ts diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts new file mode 100644 index 0000000000000..35ddfc4813617 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.container.d.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export declare function IndexTable(props: any): any; diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js index f33d486520a29..c3acff087146a 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/index_table/index_table.js @@ -37,8 +37,10 @@ import { } from '@elastic/eui'; import { UIM_SHOW_DETAILS_CLICK } from '../../../../../../common/constants'; +import { reactRouterNavigate } from '../../../../../shared_imports'; import { REFRESH_RATE_INDEX_LIST } from '../../../../constants'; import { healthToColor } from '../../../../services'; +import { encodePathForReactRouter } from '../../../../services/routing'; import { AppContextConsumer } from '../../../../app_context'; import { renderBadges } from '../../../../lib/render_badges'; import { NoMatch, PageErrorForbidden } from '../../../../components'; @@ -117,6 +119,7 @@ export class IndexTable extends Component { } } } + componentWillUnmount() { clearInterval(this.interval); } @@ -146,11 +149,14 @@ export class IndexTable extends Component { const newIsSortAscending = sortField === column ? !isSortAscending : true; sortChanged(column, newIsSortAscending); }; + renderFilterError() { const { filterError } = this.state; + if (!filterError) { return; } + return ( <> @@ -169,6 +175,7 @@ export class IndexTable extends Component { ); } + onFilterChanged = ({ query, error }) => { if (error) { this.setState({ filterError: error }); @@ -177,6 +184,7 @@ export class IndexTable extends Component { this.setState({ filterError: null }); } }; + getFilters = (extensionsService) => { const { allIndices } = this.props; return extensionsService.filters.reduce((accum, filterExtension) => { @@ -184,6 +192,7 @@ export class IndexTable extends Component { return [...accum, ...filtersToAdd]; }, []); }; + toggleAll = () => { const allSelected = this.areAllItemsSelected(); if (allSelected) { @@ -243,7 +252,8 @@ export class IndexTable extends Component { } buildRowCell(fieldName, value, index, appServices) { - const { openDetailPanel, filterChanged } = this.props; + const { openDetailPanel, filterChanged, history } = this.props; + if (fieldName === 'health') { return {value}; } else if (fieldName === 'name') { @@ -261,7 +271,19 @@ export class IndexTable extends Component { {renderBadges(index, filterChanged, appServices.extensionsService)} ); + } else if (fieldName === 'data_stream') { + return ( + + {value} + + ); } + return value; } @@ -480,12 +502,14 @@ export class IndexTable extends Component { + {(indicesLoading && allIndices.length === 0) || indicesError ? null : ( {extensionsService.toggles.map((toggle) => { return this.renderToggleControl(toggle); })} + + + {this.renderBanners(extensionsService)} + {indicesError && this.renderError()} + {atLeastOneItemSelected ? ( @@ -523,6 +551,7 @@ export class IndexTable extends Component { /> ) : null} + {(indicesLoading && allIndices.length === 0) || indicesError ? null : ( @@ -572,11 +601,14 @@ export class IndexTable extends Component { )} + {this.renderFilterError()} + + {indices.length > 0 ? (
- + + {this.buildHeader()} + {this.buildRows(services)}
) : ( emptyState )} + + {indices.length > 0 ? this.renderPager() : null} ); diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx index ec2956973d4f6..807229fb36267 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_details/template_details.tsx @@ -38,7 +38,7 @@ import { Error, } from '../../../../../components'; import { useLoadIndexTemplate } from '../../../../../services/api'; -import { decodePath } from '../../../../../services/routing'; +import { decodePathFromReactRouter } from '../../../../../services/routing'; import { SendRequestResponse } from '../../../../../../shared_imports'; import { useServices } from '../../../../../app_context'; import { TabSummary, TabMappings, TabSettings, TabAliases } from '../../template_details/tabs'; @@ -107,7 +107,7 @@ export const LegacyTemplateDetails: React.FunctionComponent = ({ reload, }) => { const { uiMetricService } = useServices(); - const decodedTemplateName = decodePath(templateName); + const decodedTemplateName = decodePathFromReactRouter(templateName); const { error, data: templateDetails, isLoading } = useLoadIndexTemplate( decodedTemplateName, isLegacy diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx index 92fedd5d68f00..edce05018ce39 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/legacy_templates/template_table/template_table.tsx @@ -9,12 +9,12 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiInMemoryTable, EuiIcon, EuiButton, EuiLink, EuiBasicTableColumn } from '@elastic/eui'; import { ScopedHistory } from 'kibana/public'; -import { reactRouterNavigate } from '../../../../../../../../../../src/plugins/kibana_react/public'; +import { SendRequestResponse, reactRouterNavigate } from '../../../../../../shared_imports'; import { TemplateListItem } from '../../../../../../../common'; import { UIM_TEMPLATE_SHOW_DETAILS_CLICK } from '../../../../../../../common/constants'; import { TemplateDeleteModal } from '../../../../../components'; +import { encodePathForReactRouter } from '../../../../../services/routing'; import { useServices } from '../../../../../app_context'; -import { SendRequestResponse } from '../../../../../../shared_imports'; interface Props { templates: TemplateListItem[]; @@ -52,7 +52,7 @@ export const LegacyTemplateTable: React.FunctionComponent = ({ {...reactRouterNavigate( history, { - pathname: `/templates/${encodeURIComponent(encodeURIComponent(name))}`, + pathname: `/templates/${encodePathForReactRouter(name)}`, search: `legacy=${Boolean(item._kbnMeta.isLegacy)}`, }, () => uiMetricService.trackMetric('click', UIM_TEMPLATE_SHOW_DETAILS_CLICK) diff --git a/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx b/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx index 8bdd230f89952..82835c56a3877 100644 --- a/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx +++ b/x-pack/plugins/index_management/public/application/sections/template_clone/template_clone.tsx @@ -11,7 +11,7 @@ import { EuiPageBody, EuiPageContent, EuiSpacer, EuiTitle } from '@elastic/eui'; import { TemplateDeserialized } from '../../../../common'; import { TemplateForm, SectionLoading, SectionError, Error } from '../../components'; import { breadcrumbService } from '../../services/breadcrumbs'; -import { decodePath, getTemplateDetailsLink } from '../../services/routing'; +import { decodePathFromReactRouter, getTemplateDetailsLink } from '../../services/routing'; import { saveTemplate, useLoadIndexTemplate } from '../../services/api'; import { getIsLegacyFromQueryParams } from '../../lib/index_templates'; @@ -26,7 +26,7 @@ export const TemplateClone: React.FunctionComponent { - const decodedTemplateName = decodePath(name); + const decodedTemplateName = decodePathFromReactRouter(name); const isLegacy = getIsLegacyFromQueryParams(location); const [isSaving, setIsSaving] = useState(false); diff --git a/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx b/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx index d3e539989bc96..7cacb5ee97a60 100644 --- a/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx +++ b/x-pack/plugins/index_management/public/application/sections/template_edit/template_edit.tsx @@ -11,7 +11,7 @@ import { EuiPageBody, EuiPageContent, EuiTitle, EuiSpacer, EuiCallOut } from '@e import { TemplateDeserialized } from '../../../../common'; import { breadcrumbService } from '../../services/breadcrumbs'; import { useLoadIndexTemplate, updateTemplate } from '../../services/api'; -import { decodePath, getTemplateDetailsLink } from '../../services/routing'; +import { decodePathFromReactRouter, getTemplateDetailsLink } from '../../services/routing'; import { SectionLoading, SectionError, TemplateForm, Error } from '../../components'; import { getIsLegacyFromQueryParams } from '../../lib/index_templates'; @@ -26,7 +26,7 @@ export const TemplateEdit: React.FunctionComponent { - const decodedTemplateName = decodePath(name); + const decodedTemplateName = decodePathFromReactRouter(name); const isLegacy = getIsLegacyFromQueryParams(location); const [isSaving, setIsSaving] = useState(false); diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index d1950ae714550..5ad84395d24c2 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -31,14 +31,12 @@ import { UIM_TEMPLATE_UPDATE, UIM_TEMPLATE_CLONE, } from '../../../common/constants'; - +import { TemplateDeserialized, TemplateListItem, DataStream } from '../../../common'; +import { IndexMgmtMetricsType } from '../../types'; import { TAB_SETTINGS, TAB_MAPPING, TAB_STATS } from '../constants'; - import { useRequest, sendRequest } from './use_request'; import { httpService } from './http'; import { UiMetricService } from './ui_metric'; -import { TemplateDeserialized, TemplateListItem } from '../../../common'; -import { IndexMgmtMetricsType } from '../../types'; // Temporary hack to provide the uiMetricService instance to this file. // TODO: Refactor and export an ApiService instance through the app dependencies context @@ -48,6 +46,21 @@ export const setUiMetricService = (_uiMetricService: UiMetricService({ + path: `${API_BASE_PATH}/data_streams`, + method: 'get', + }); +} + +// TODO: Implement this API endpoint once we have content to surface in the detail panel. +export function useLoadDataStream(name: string) { + return useRequest({ + path: `${API_BASE_PATH}/data_stream/${encodeURIComponent(name)}`, + method: 'get', + }); +} + export async function loadIndices() { const response = await httpService.httpClient.get(`${API_BASE_PATH}/indices`); return response.data ? response.data : response; diff --git a/x-pack/plugins/index_management/public/application/services/routing.ts b/x-pack/plugins/index_management/public/application/services/routing.ts index a999c58f5bb42..2a895196189d0 100644 --- a/x-pack/plugins/index_management/public/application/services/routing.ts +++ b/x-pack/plugins/index_management/public/application/services/routing.ts @@ -6,10 +6,8 @@ export const getTemplateListLink = () => `/templates`; -// Need to add some additonal encoding/decoding logic to work with React Router -// For background, see: https://github.com/ReactTraining/history/issues/505 export const getTemplateDetailsLink = (name: string, isLegacy?: boolean, withHash = false) => { - const baseUrl = `/templates/${encodeURIComponent(encodeURIComponent(name))}`; + const baseUrl = `/templates/${encodePathForReactRouter(name)}`; let url = withHash ? `#${baseUrl}` : baseUrl; if (isLegacy) { url = `${url}?legacy=${isLegacy}`; @@ -18,18 +16,14 @@ export const getTemplateDetailsLink = (name: string, isLegacy?: boolean, withHas }; export const getTemplateEditLink = (name: string, isLegacy?: boolean) => { - return encodeURI( - `/edit_template/${encodeURIComponent(encodeURIComponent(name))}?legacy=${isLegacy === true}` - ); + return encodeURI(`/edit_template/${encodePathForReactRouter(name)}?legacy=${isLegacy === true}`); }; export const getTemplateCloneLink = (name: string, isLegacy?: boolean) => { - return encodeURI( - `/clone_template/${encodeURIComponent(encodeURIComponent(name))}?legacy=${isLegacy === true}` - ); + return encodeURI(`/clone_template/${encodePathForReactRouter(name)}?legacy=${isLegacy === true}`); }; -export const decodePath = (pathname: string): string => { +export const decodePathFromReactRouter = (pathname: string): string => { let decodedPath; try { decodedPath = decodeURI(pathname); @@ -39,3 +33,8 @@ export const decodePath = (pathname: string): string => { } return decodeURIComponent(decodedPath); }; + +// Need to add some additonal encoding/decoding logic to work with React Router +// For background, see: https://github.com/ReactTraining/history/issues/505 +export const encodePathForReactRouter = (pathname: string): string => + encodeURIComponent(encodeURIComponent(pathname)); diff --git a/x-pack/plugins/index_management/public/shared_imports.ts b/x-pack/plugins/index_management/public/shared_imports.ts index 8942367261511..afd5a5cf650e1 100644 --- a/x-pack/plugins/index_management/public/shared_imports.ts +++ b/x-pack/plugins/index_management/public/shared_imports.ts @@ -31,3 +31,5 @@ export { export { getFormRow, Field } from '../../../../src/plugins/es_ui_shared/static/forms/components'; export { isJSON } from '../../../../src/plugins/es_ui_shared/static/validators/string'; + +export { reactRouterNavigate } from '../../../../src/plugins/kibana_react/public'; diff --git a/x-pack/plugins/index_management/server/client/elasticsearch.ts b/x-pack/plugins/index_management/server/client/elasticsearch.ts index b51f7d924dba7..6b1bf47512b21 100644 --- a/x-pack/plugins/index_management/server/client/elasticsearch.ts +++ b/x-pack/plugins/index_management/server/client/elasticsearch.ts @@ -10,6 +10,46 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) Client.prototype.dataManagement = components.clientAction.namespaceFactory(); const dataManagement = Client.prototype.dataManagement.prototype; + // Data streams + dataManagement.getDataStreams = ca({ + urls: [ + { + fmt: '/_data_stream', + }, + ], + method: 'GET', + }); + + // We don't allow the user to create a data stream in the UI or API. We're just adding this here + // to enable the API integration tests. + dataManagement.createDataStream = ca({ + urls: [ + { + fmt: '/_data_stream/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + method: 'PUT', + }); + + dataManagement.deleteDataStream = ca({ + urls: [ + { + fmt: '/_data_stream/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + method: 'DELETE', + }); + // Component templates dataManagement.getComponentTemplates = ca({ urls: [ @@ -71,4 +111,33 @@ export const elasticsearchJsPlugin = (Client: any, config: any, components: any) ], method: 'GET', }); + + dataManagement.saveComposableIndexTemplate = ca({ + urls: [ + { + fmt: '/_index_template/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + needBody: true, + method: 'PUT', + }); + + dataManagement.deleteComposableIndexTemplate = ca({ + urls: [ + { + fmt: '/_index_template/<%=name%>', + req: { + name: { + type: 'string', + }, + }, + }, + ], + method: 'DELETE', + }); }; diff --git a/x-pack/plugins/index_management/server/routes/api/data_streams/index.ts b/x-pack/plugins/index_management/server/routes/api/data_streams/index.ts new file mode 100644 index 0000000000000..56c514e30f242 --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/data_streams/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; + +import { registerGetAllRoute } from './register_get_route'; + +export function registerDataStreamRoutes(dependencies: RouteDependencies) { + registerGetAllRoute(dependencies); +} diff --git a/x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts b/x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts new file mode 100644 index 0000000000000..9128556130bf4 --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { deserializeDataStreamList } from '../../../../common/lib'; +import { RouteDependencies } from '../../../types'; +import { addBasePath } from '../index'; + +export function registerGetAllRoute({ router, license, lib: { isEsError } }: RouteDependencies) { + router.get( + { path: addBasePath('/data_streams'), validate: false }, + license.guardApiRoute(async (ctx, req, res) => { + const { callAsCurrentUser } = ctx.dataManagement!.client; + + try { + const dataStreams = await callAsCurrentUser('dataManagement.getDataStreams'); + const body = deserializeDataStreamList(dataStreams); + + return res.ok({ body }); + } catch (error) { + if (isEsError(error)) { + return res.customError({ + statusCode: error.statusCode, + body: error, + }); + } + + return res.internalError({ body: error }); + } + }) + ); +} diff --git a/x-pack/plugins/index_management/server/routes/index.ts b/x-pack/plugins/index_management/server/routes/index.ts index 1e5aaf8087624..202e6919f7b13 100644 --- a/x-pack/plugins/index_management/server/routes/index.ts +++ b/x-pack/plugins/index_management/server/routes/index.ts @@ -6,6 +6,7 @@ import { RouteDependencies } from '../types'; +import { registerDataStreamRoutes } from './api/data_streams'; import { registerIndicesRoutes } from './api/indices'; import { registerTemplateRoutes } from './api/templates'; import { registerMappingRoute } from './api/mapping'; @@ -15,6 +16,7 @@ import { registerComponentTemplateRoutes } from './api/component_templates'; export class ApiRoutes { setup(dependencies: RouteDependencies) { + registerDataStreamRoutes(dependencies); registerIndicesRoutes(dependencies); registerTemplateRoutes(dependencies); registerSettingsRoutes(dependencies); diff --git a/x-pack/test/api_integration/apis/management/index_management/data_streams.ts b/x-pack/test/api_integration/apis/management/index_management/data_streams.ts new file mode 100644 index 0000000000000..9a8511b4331ea --- /dev/null +++ b/x-pack/test/api_integration/apis/management/index_management/data_streams.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../ftr_provider_context'; +// @ts-ignore +import { API_BASE_PATH } from './constants'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const es = getService('legacyEs'); + + const createDataStream = (name: string) => { + // A data stream requires an index template before it can be created. + return es.dataManagement + .saveComposableIndexTemplate({ + name, + body: { + index_patterns: ['*'], + template: { + settings: {}, + }, + data_stream: { + timestamp_field: '@timestamp', + }, + }, + }) + .then(() => + es.dataManagement.createDataStream({ + name, + }) + ); + }; + + const deleteDataStream = (name: string) => { + return es.dataManagement + .deleteComposableIndexTemplate({ + name, + }) + .then(() => + es.dataManagement.deleteDataStream({ + name, + }) + ); + }; + + describe('Data streams', function () { + const testDataStreamName = 'test-data-stream'; + + describe('Get', () => { + before(async () => await createDataStream(testDataStreamName)); + after(async () => await deleteDataStream(testDataStreamName)); + + describe('all data streams', () => { + it('returns an array of data streams', async () => { + const { body: dataStreams } = await supertest + .get(`${API_BASE_PATH}/data_streams`) + .set('kbn-xsrf', 'xxx') + .expect(200); + + // ES determines these values so we'll just echo them back. + const { name: indexName, uuid } = dataStreams[0].indices[0]; + expect(dataStreams).to.eql([ + { + name: testDataStreamName, + timeStampField: '@timestamp', + indices: [ + { + name: indexName, + uuid, + }, + ], + generation: 1, + }, + ]); + }); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/apis/management/index_management/index.js b/x-pack/test/api_integration/apis/management/index_management/index.js index fdee325938ff4..93e8a4a8d6130 100644 --- a/x-pack/test/api_integration/apis/management/index_management/index.js +++ b/x-pack/test/api_integration/apis/management/index_management/index.js @@ -10,6 +10,7 @@ export default function ({ loadTestFile }) { loadTestFile(require.resolve('./mapping')); loadTestFile(require.resolve('./settings')); loadTestFile(require.resolve('./stats')); + loadTestFile(require.resolve('./data_streams')); loadTestFile(require.resolve('./templates')); loadTestFile(require.resolve('./component_templates')); }); diff --git a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js index b950a56a913db..1a1517567eaed 100644 --- a/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js +++ b/x-pack/test/api_integration/apis/management/index_management/lib/elasticsearch.js @@ -3,6 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { getRandomString } from './random'; /** diff --git a/x-pack/test/functional/apps/index_management/home_page.ts b/x-pack/test/functional/apps/index_management/home_page.ts index cca0a5d1ad1bd..90bc3603c1613 100644 --- a/x-pack/test/functional/apps/index_management/home_page.ts +++ b/x-pack/test/functional/apps/index_management/home_page.ts @@ -18,12 +18,17 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.common.navigateToApp('indexManagement'); }); - it('Loads the app', async () => { + it('Loads the app and renders the indices tab by default', async () => { await log.debug('Checking for section heading to say Index Management.'); const headingText = await pageObjects.indexManagement.sectionHeadingText(); expect(headingText).to.be('Index Management'); + // Verify url + const url = await browser.getCurrentUrl(); + expect(url).to.contain(`/indices`); + + // Verify content const indicesList = await testSubjects.exists('indicesList'); expect(indicesList).to.be(true); @@ -31,6 +36,23 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(await reloadIndicesButton.isDisplayed()).to.be(true); }); + describe('Data streams', () => { + it('renders the data streams tab', async () => { + // Navigate to the data streams tab + await pageObjects.indexManagement.changeTabs('data_streamsTab'); + + await pageObjects.header.waitUntilLoadingHasFinished(); + + // Verify url + const url = await browser.getCurrentUrl(); + expect(url).to.contain(`/data_streams`); + + // Verify content + const dataStreamList = await testSubjects.exists('dataStreamList'); + expect(dataStreamList).to.be(true); + }); + }); + describe('Index templates', () => { it('renders the index templates tab', async () => { // Navigate to the index templates tab diff --git a/x-pack/test/functional/page_objects/index_management_page.ts b/x-pack/test/functional/page_objects/index_management_page.ts index 9bfcd79671b4d..5e5d0e7583450 100644 --- a/x-pack/test/functional/page_objects/index_management_page.ts +++ b/x-pack/test/functional/page_objects/index_management_page.ts @@ -44,7 +44,10 @@ export function IndexManagementPageProvider({ getService }: FtrProviderContext) }; }); }, - async changeTabs(tab: 'indicesTab' | 'templatesTab' | 'component_templatesTab') { + + async changeTabs( + tab: 'indicesTab' | 'data_streamsTab' | 'templatesTab' | 'component_templatesTab' + ) { await testSubjects.click(tab); }, }; From 80958568e75577e3b35f5307e6b88fab2fc16ac8 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Tue, 9 Jun 2020 21:37:37 -0400 Subject: [PATCH 19/19] [SIEM][Exceptions] - ExceptionsViewer UI component part 2 (#68294) ### Summary This PR is a follow up to #68027 . It brings it all together to complete the exceptions viewer component. This component is meant to display all exception items and allow a user to create, edit, delete, and search these exception items. - Moves ExceptionItem (from part 1) into its own folder - Adds exceptions_viewer_header component that includes the search, list toggle, and add exception buttons - Adds actual ExceptionViewer component - Updates the useExceptionList hook refresh function logic. Noticed that the previous version was creating some issues --- .../lists/public/exceptions/hooks/use_api.tsx | 111 +++++ .../hooks/use_exception_list.test.tsx | 79 ++-- .../exceptions/hooks/use_exception_list.tsx | 120 +++-- .../plugins/lists/public/exceptions/types.ts | 40 +- x-pack/plugins/lists/public/index.tsx | 2 + .../new/exception_list_detection.json | 9 + .../new/exception_list_item_auto_id.json | 1 + ...exception_list_item_detection_auto_id.json | 26 + .../detection_engine/rules/details/index.tsx | 20 + .../rules/details/translations.ts | 7 + ...stories.tsx => exception_item.stories.tsx} | 25 +- .../exceptions_search.stories.tsx | 70 +++ .../components/exceptions/helpers.test.tsx | 6 +- .../common/components/exceptions/mocks.ts | 21 +- .../components/exceptions/translations.ts | 90 ++++ .../common/components/exceptions/types.ts | 49 +- .../exception_details.test.tsx | 6 +- .../exception_details.tsx | 15 +- .../exception_entries.test.tsx | 10 +- .../exception_entries.tsx | 12 +- .../viewer/exception_item/index.test.tsx | 121 +++++ .../viewer/exception_item/index.tsx | 112 +++++ .../viewer/exceptions_pagination.test.tsx | 158 +++++++ .../viewer/exceptions_pagination.tsx | 123 +++++ .../viewer/exceptions_viewer_header.test.tsx | 337 +++++++++++++ .../viewer/exceptions_viewer_header.tsx | 204 ++++++++ .../exceptions/viewer/index.test.tsx | 168 ++++--- .../components/exceptions/viewer/index.tsx | 446 +++++++++++++++--- .../components/exceptions/viewer/reducer.ts | 122 +++++ .../public/lists_plugin_deps.ts | 10 +- 30 files changed, 2266 insertions(+), 254 deletions(-) create mode 100644 x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx create mode 100644 x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json create mode 100644 x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json rename x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/{index.stories.tsx => exception_item.stories.tsx} (86%) create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_details.test.tsx (98%) rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_details.tsx (85%) rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_entries.test.tsx (94%) rename x-pack/plugins/security_solution/public/common/components/exceptions/viewer/{ => exception_item}/exception_entries.tsx (93%) create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx b/x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx new file mode 100644 index 0000000000000..45e180d9d617c --- /dev/null +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_api.tsx @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useMemo } from 'react'; + +import * as Api from '../api'; +import { HttpStart } from '../../../../../../src/core/public'; +import { ExceptionListItemSchema, ExceptionListSchema } from '../../../common/schemas'; +import { ApiCallMemoProps } from '../types'; + +export interface ExceptionsApi { + deleteExceptionItem: (arg: ApiCallMemoProps) => Promise; + deleteExceptionList: (arg: ApiCallMemoProps) => Promise; + getExceptionItem: ( + arg: ApiCallMemoProps & { onSuccess: (arg: ExceptionListItemSchema) => void } + ) => Promise; + getExceptionList: ( + arg: ApiCallMemoProps & { onSuccess: (arg: ExceptionListSchema) => void } + ) => Promise; +} + +export const useApi = (http: HttpStart): ExceptionsApi => { + return useMemo( + (): ExceptionsApi => ({ + async deleteExceptionItem({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps): Promise { + const abortCtrl = new AbortController(); + + try { + await Api.deleteExceptionListItemById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(); + } catch (error) { + onError(error); + } + }, + async deleteExceptionList({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps): Promise { + const abortCtrl = new AbortController(); + + try { + await Api.deleteExceptionListById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(); + } catch (error) { + onError(error); + } + }, + async getExceptionItem({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps & { onSuccess: (arg: ExceptionListItemSchema) => void }): Promise { + const abortCtrl = new AbortController(); + + try { + const item = await Api.fetchExceptionListItemById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(item); + } catch (error) { + onError(error); + } + }, + async getExceptionList({ + id, + namespaceType, + onSuccess, + onError, + }: ApiCallMemoProps & { onSuccess: (arg: ExceptionListSchema) => void }): Promise { + const abortCtrl = new AbortController(); + + try { + const list = await Api.fetchExceptionListById({ + http, + id, + namespaceType, + signal: abortCtrl.signal, + }); + onSuccess(list); + } catch (error) { + onError(error); + } + }, + }), + [http] + ); +}; diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx index a6a25ab4d4e9d..fbd43787a822e 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.test.tsx @@ -10,7 +10,8 @@ import * as api from '../api'; import { createKibanaCoreStartMock } from '../../common/mocks/kibana_core'; import { getExceptionListSchemaMock } from '../../../common/schemas/response/exception_list_schema.mock'; import { getExceptionListItemSchemaMock } from '../../../common/schemas/response/exception_list_item_schema.mock'; -import { ExceptionListAndItems, UseExceptionListProps } from '../types'; +import { ExceptionListItemSchema } from '../../../common/schemas'; +import { ExceptionList, UseExceptionListProps } from '../types'; import { ReturnExceptionListAndItems, useExceptionList } from './use_exception_list'; @@ -34,15 +35,23 @@ describe('useExceptionList', () => { >(() => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); await waitForNextUpdate(); - expect(result.current).toEqual([true, null, result.current[2]]); - expect(typeof result.current[2]).toEqual('function'); + expect(result.current).toEqual([ + true, + [], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + null, + ]); }); }); @@ -54,27 +63,32 @@ describe('useExceptionList', () => { >(() => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); await waitForNextUpdate(); await waitForNextUpdate(); - const expectedResult: ExceptionListAndItems = { - ...getExceptionListSchemaMock(), - exceptionItems: { - items: [{ ...getExceptionListItemSchemaMock() }], - pagination: { - page: 1, - perPage: 20, - total: 1, - }, - }, - }; + const expectedListResult: ExceptionList[] = [ + { ...getExceptionListSchemaMock(), totalItems: 1 }, + ]; + + const expectedListItemsResult: ExceptionListItemSchema[] = [ + { ...getExceptionListItemSchemaMock() }, + ]; - expect(result.current).toEqual([false, expectedResult, result.current[2]]); + expect(result.current).toEqual([ + false, + expectedListResult, + expectedListItemsResult, + { + page: 1, + perPage: 20, + total: 1, + }, + result.current[4], + ]); }); }); @@ -86,13 +100,12 @@ describe('useExceptionList', () => { UseExceptionListProps, ReturnExceptionListAndItems >( - ({ filterOptions, http, id, namespaceType, pagination, onError }) => - useExceptionList({ filterOptions, http, id, namespaceType, onError, pagination }), + ({ filterOptions, http, lists, pagination, onError }) => + useExceptionList({ filterOptions, http, lists, onError, pagination }), { initialProps: { http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }, } @@ -100,8 +113,7 @@ describe('useExceptionList', () => { await waitForNextUpdate(); rerender({ http: mockKibanaHttpService, - id: 'newListId', - namespaceType: 'single', + lists: [{ id: 'newListId', namespaceType: 'single' }], onError: onErrorMock, }); await waitForNextUpdate(); @@ -121,14 +133,19 @@ describe('useExceptionList', () => { >(() => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); await waitForNextUpdate(); await waitForNextUpdate(); - result.current[2](); + + expect(typeof result.current[4]).toEqual('function'); + + if (result.current[4] != null) { + result.current[4](); + } + await waitForNextUpdate(); expect(spyOnfetchExceptionListById).toHaveBeenCalledTimes(2); @@ -147,8 +164,7 @@ describe('useExceptionList', () => { () => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); @@ -170,8 +186,7 @@ describe('useExceptionList', () => { () => useExceptionList({ http: mockKibanaHttpService, - id: 'myListId', - namespaceType: 'single', + lists: [{ id: 'myListId', namespaceType: 'single' }], onError: onErrorMock, }) ); diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx index 116233cd89348..1d7a63ba880bf 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.tsx @@ -4,12 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useCallback, useEffect, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { fetchExceptionListById, fetchExceptionListItemsByListId } from '../api'; -import { ExceptionListAndItems, UseExceptionListProps } from '../types'; +import { ExceptionIdentifiers, ExceptionList, Pagination, UseExceptionListProps } from '../types'; +import { ExceptionListItemSchema } from '../../../common/schemas'; -export type ReturnExceptionListAndItems = [boolean, ExceptionListAndItems | null, () => void]; +type Func = () => void; +export type ReturnExceptionListAndItems = [ + boolean, + ExceptionList[], + ExceptionListItemSchema[], + Pagination, + Func | null +]; /** * Hook for using to get an ExceptionList and it's ExceptionListItems @@ -24,8 +32,7 @@ export type ReturnExceptionListAndItems = [boolean, ExceptionListAndItems | null */ export const useExceptionList = ({ http, - id, - namespaceType, + lists, pagination = { page: 1, perPage: 20, @@ -36,20 +43,37 @@ export const useExceptionList = ({ tags: [], }, onError, + dispatchListsInReducer, }: UseExceptionListProps): ReturnExceptionListAndItems => { - const [exceptionListAndItems, setExceptionList] = useState(null); - const [shouldRefresh, setRefresh] = useState(true); - const refreshExceptionList = useCallback(() => setRefresh(true), [setRefresh]); + const [exceptionLists, setExceptionLists] = useState([]); + const [exceptionItems, setExceptionListItems] = useState([]); + const [paginationInfo, setPagination] = useState(pagination); + const fetchExceptionList = useRef(null); const [loading, setLoading] = useState(true); - const tags = filterOptions.tags.sort().join(); + const tags = useMemo(() => filterOptions.tags.sort().join(), [filterOptions.tags]); + const listIds = useMemo( + () => + lists + .map((t) => t.id) + .sort() + .join(), + [lists] + ); useEffect( () => { - let isSubscribed = true; - const abortCtrl = new AbortController(); + let isSubscribed = false; + let abortCtrl: AbortController; + + const fetchLists = async (): Promise => { + isSubscribed = true; + abortCtrl = new AbortController(); - const fetchData = async (idToFetch: string): Promise => { - if (shouldRefresh) { + // TODO: workaround until api updated, will be cleaned up + let exceptions: ExceptionListItemSchema[] = []; + let exceptionListsReturned: ExceptionList[] = []; + + const fetchData = async ({ id, namespaceType }: ExceptionIdentifiers): Promise => { try { setLoading(true); @@ -59,7 +83,7 @@ export const useExceptionList = ({ ...restOfExceptionList } = await fetchExceptionListById({ http, - id: idToFetch, + id, namespaceType, signal: abortCtrl.signal, }); @@ -72,40 +96,68 @@ export const useExceptionList = ({ signal: abortCtrl.signal, }); - setRefresh(false); - if (isSubscribed) { - setExceptionList({ - list_id, - namespace_type, - ...restOfExceptionList, - exceptionItems: { - items: [...fetchListItemsResult.data], + exceptionListsReturned = [ + ...exceptionListsReturned, + { + list_id, + namespace_type, + ...restOfExceptionList, + totalItems: fetchListItemsResult.total, + }, + ]; + setExceptionLists(exceptionListsReturned); + setPagination({ + page: fetchListItemsResult.page, + perPage: fetchListItemsResult.per_page, + total: fetchListItemsResult.total, + }); + + exceptions = [...exceptions, ...fetchListItemsResult.data]; + setExceptionListItems(exceptions); + + if (dispatchListsInReducer != null) { + dispatchListsInReducer({ + exceptions, + lists: exceptionListsReturned, pagination: { page: fetchListItemsResult.page, perPage: fetchListItemsResult.per_page, total: fetchListItemsResult.total, }, - }, - }); + }); + } } } catch (error) { - setRefresh(false); if (isSubscribed) { - setExceptionList(null); + setExceptionLists([]); + setExceptionListItems([]); + setPagination({ + page: 1, + perPage: 20, + total: 0, + }); onError(error); } } - } + }; + + // TODO: Workaround for now. Once api updated, we can pass in array of lists to fetch + await Promise.all( + lists.map( + ({ id, namespaceType }: ExceptionIdentifiers): Promise => + fetchData({ id, namespaceType }) + ) + ); if (isSubscribed) { setLoading(false); } }; - if (id != null) { - fetchData(id); - } + fetchLists(); + + fetchExceptionList.current = fetchLists; return (): void => { isSubscribed = false; abortCtrl.abort(); @@ -113,9 +165,9 @@ export const useExceptionList = ({ }, // eslint-disable-next-line react-hooks/exhaustive-deps [ http, - id, - onError, - shouldRefresh, + listIds, + setExceptionLists, + setExceptionListItems, pagination.page, pagination.perPage, filterOptions.filter, @@ -123,5 +175,5 @@ export const useExceptionList = ({ ] ); - return [loading, exceptionListAndItems, refreshExceptionList]; + return [loading, exceptionLists, exceptionItems, paginationInfo, fetchExceptionList.current]; }; diff --git a/x-pack/plugins/lists/public/exceptions/types.ts b/x-pack/plugins/lists/public/exceptions/types.ts index cf6b6c3ec1c59..286eb0570ebb8 100644 --- a/x-pack/plugins/lists/public/exceptions/types.ts +++ b/x-pack/plugins/lists/public/exceptions/types.ts @@ -24,15 +24,6 @@ export interface Pagination { total: number; } -export interface ExceptionItemsAndPagination { - items: ExceptionListItemSchema[]; - pagination: Pagination; -} - -export interface ExceptionListAndItems extends ExceptionListSchema { - exceptionItems: ExceptionItemsAndPagination; -} - export type AddExceptionList = ExceptionListSchema | CreateExceptionListSchemaPartial; export type AddExceptionListItem = CreateExceptionListItemSchemaPartial | ExceptionListItemSchema; @@ -42,13 +33,31 @@ export interface PersistHookProps { onError: (arg: Error) => void; } +export interface ExceptionList extends ExceptionListSchema { + totalItems: number; +} + export interface UseExceptionListProps { - filterOptions?: FilterExceptionsOptions; http: HttpStart; - id: string | undefined; - namespaceType: NamespaceType; + lists: ExceptionIdentifiers[]; onError: (arg: Error) => void; + filterOptions?: FilterExceptionsOptions; pagination?: Pagination; + dispatchListsInReducer?: ({ + lists, + exceptions, + pagination, + }: { + lists: ExceptionList[]; + exceptions: ExceptionListItemSchema[]; + pagination: Pagination; + }) => void; +} + +export interface ExceptionIdentifiers { + id: string; + namespaceType: NamespaceType; + type?: string; } export interface ApiCallByListIdProps { @@ -67,6 +76,13 @@ export interface ApiCallByIdProps { signal: AbortSignal; } +export interface ApiCallMemoProps { + id: string; + namespaceType: NamespaceType; + onError: (arg: Error) => void; + onSuccess: () => void; +} + export interface AddExceptionListProps { http: HttpStart; list: AddExceptionList; diff --git a/x-pack/plugins/lists/public/index.tsx b/x-pack/plugins/lists/public/index.tsx index fb4d5de06ae54..1e25275a0d38b 100644 --- a/x-pack/plugins/lists/public/index.tsx +++ b/x-pack/plugins/lists/public/index.tsx @@ -4,7 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ // Exports to be shared with plugins +export { useApi } from './exceptions/hooks/use_api'; export { usePersistExceptionItem } from './exceptions/hooks/persist_exception_item'; export { usePersistExceptionList } from './exceptions/hooks/persist_exception_list'; export { useExceptionList } from './exceptions/hooks/use_exception_list'; +export { ExceptionList, ExceptionIdentifiers } from './exceptions/types'; export { mockNewExceptionItem, mockNewExceptionList } from './exceptions/mock'; diff --git a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json new file mode 100644 index 0000000000000..306195f4226e3 --- /dev/null +++ b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_detection.json @@ -0,0 +1,9 @@ +{ + "list_id": "detection_list", + "_tags": ["detection"], + "tags": ["detection", "sample_tag"], + "type": "detection", + "description": "This is a sample detection type exception list", + "name": "Sample Detection Exception List", + "namespace_type": "single" +} diff --git a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json index d68a26eb8ffe2..c89c7a8f080cf 100644 --- a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json +++ b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_auto_id.json @@ -5,6 +5,7 @@ "type": "simple", "description": "This is a sample endpoint type exception that has no item_id so it creates a new id each time", "name": "Sample Endpoint Exception List", + "comment": [], "entries": [ { "field": "actingProcess.file.signer", diff --git a/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json new file mode 100644 index 0000000000000..3fe4458a73769 --- /dev/null +++ b/x-pack/plugins/lists/server/scripts/exception_lists/new/exception_list_item_detection_auto_id.json @@ -0,0 +1,26 @@ +{ + "list_id": "detection_list", + "_tags": ["detection"], + "tags": ["test_tag", "detection", "no_more_bad_guys"], + "type": "simple", + "description": "This is a sample detection type exception that has no item_id so it creates a new id each time", + "name": "Sample Detection Exception List Item", + "comment": [], + "entries": [ + { + "field": "host.name", + "operator": "included", + "match": "sampleHostName" + }, + { + "field": "event.category", + "operator": "included", + "match_any": ["process", "malware"] + }, + { + "field": "event.action", + "operator": "included", + "match": "user-password-change" + } + ] +} diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx index 43792e8bd19f4..0e527bf4dfc72 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/index.tsx @@ -5,6 +5,7 @@ */ /* eslint-disable react-hooks/rules-of-hooks */ +/* eslint-disable complexity */ import { EuiButton, @@ -70,10 +71,13 @@ import { FailureHistory } from './failure_history'; import { RuleStatus } from '../../../../components/rules//rule_status'; import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities'; import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; +import { ExceptionsViewer } from '../../../../../common/components/exceptions/viewer'; +import { ExceptionListType } from '../../../../../common/components/exceptions/types'; enum RuleDetailTabs { alerts = 'alerts', failures = 'failures', + exceptions = 'exceptions', } const ruleDetailTabs = [ @@ -82,6 +86,11 @@ const ruleDetailTabs = [ name: detectionI18n.ALERT, disabled: false, }, + { + id: RuleDetailTabs.exceptions, + name: i18n.EXCEPTIONS_TAB, + disabled: false, + }, { id: RuleDetailTabs.failures, name: i18n.FAILURE_HISTORY_TAB, @@ -387,6 +396,17 @@ export const RuleDetailsPageComponent: FC = ({ )} )} + {ruleDetailTab === RuleDetailTabs.exceptions && ( + + )} {ruleDetailTab === RuleDetailTabs.failures && } diff --git a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts index 9cf510f4a9b5d..94dfdc3e9daa0 100644 --- a/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts +++ b/x-pack/plugins/security_solution/public/alerts/pages/detection_engine/rules/details/translations.ts @@ -89,3 +89,10 @@ export const TYPE_FAILED = i18n.translate( defaultMessage: 'Failed', } ); + +export const EXCEPTIONS_TAB = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.exceptionsTab', + { + defaultMessage: 'Exceptions', + } +); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/index.stories.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx similarity index 86% rename from x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/index.stories.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx index b6620ed103bc8..8942832798a5e 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/index.stories.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exception_item.stories.tsx @@ -8,15 +8,15 @@ import React from 'react'; import { ThemeProvider } from 'styled-components'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; -import { ExceptionItem } from '../viewer'; +import { ExceptionItem } from '../viewer/exception_item'; import { Operator } from '../types'; import { getExceptionItemMock } from '../mocks'; -storiesOf('components/exceptions', module) - .add('ExceptionItem/with os', () => { +storiesOf('ExceptionItem', module) + .add('with os', () => { const payload = getExceptionItemMock(); payload.description = ''; - payload.comments = []; + payload.comment = []; payload.entries = [ { field: 'actingProcess.file.signer', @@ -29,6 +29,7 @@ storiesOf('components/exceptions', module) return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -37,10 +38,10 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with description', () => { + .add('with description', () => { const payload = getExceptionItemMock(); payload._tags = []; - payload.comments = []; + payload.comment = []; payload.entries = [ { field: 'actingProcess.file.signer', @@ -53,6 +54,7 @@ storiesOf('components/exceptions', module) return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -61,7 +63,7 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with comments', () => { + .add('with comments', () => { const payload = getExceptionItemMock(); payload._tags = []; payload.description = ''; @@ -77,6 +79,7 @@ storiesOf('components/exceptions', module) return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -85,15 +88,16 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with nested entries', () => { + .add('with nested entries', () => { const payload = getExceptionItemMock(); payload._tags = []; payload.description = ''; - payload.comments = []; + payload.comment = []; return ( ({ eui: euiLightVars, darkMode: false })}> {}} @@ -102,12 +106,13 @@ storiesOf('components/exceptions', module) ); }) - .add('ExceptionItem/with everything', () => { + .add('with everything', () => { const payload = getExceptionItemMock(); return ( ({ eui: euiLightVars, darkMode: false })}> {}} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx new file mode 100644 index 0000000000000..29cded8f69165 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/__examples__/exceptions_search.stories.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { storiesOf } from '@storybook/react'; +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionsViewerHeader } from '../viewer/exceptions_viewer_header'; +import { ExceptionListType } from '../types'; + +storiesOf('ExceptionsViewerHeader', module) + .add('loading', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }) + .add('all lists', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }) + .add('endpoint only', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }) + .add('detections only', () => { + return ( + ({ eui: euiLightVars, darkMode: false })}> + {}} + onAddExceptionClick={() => {}} + /> + + ); + }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx index 223eabb0ea4ee..7698605588e76 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.test.tsx @@ -439,7 +439,7 @@ describe('Exception helpers', () => { describe('#getFormattedComments', () => { test('it returns formatted comment object with username and timestamp', () => { - const payload = getExceptionItemMock().comments; + const payload = getExceptionItemMock().comment; const result = getFormattedComments(payload); expect(result[0].username).toEqual('user_name'); @@ -447,7 +447,7 @@ describe('Exception helpers', () => { }); test('it returns formatted timeline icon with comment users initial', () => { - const payload = getExceptionItemMock().comments; + const payload = getExceptionItemMock().comment; const result = getFormattedComments(payload); const wrapper = mount(result[0].timelineIcon as React.ReactElement); @@ -456,7 +456,7 @@ describe('Exception helpers', () => { }); test('it returns comment text', () => { - const payload = getExceptionItemMock().comments; + const payload = getExceptionItemMock().comment; const result = getFormattedComments(payload); const wrapper = mount(result[0].children as React.ReactElement); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts index 15aec3533b325..0dba3fd26c487 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/mocks.ts @@ -11,6 +11,25 @@ import { NestedExceptionEntry, FormattedEntry, } from './types'; +import { ExceptionList } from '../../../lists_plugin_deps'; + +export const getExceptionListMock = (): ExceptionList => ({ + id: '5b543420', + created_at: '2020-04-23T00:19:13.289Z', + created_by: 'user_name', + list_id: 'test-exception', + tie_breaker_id: '77fd1909-6786-428a-a671-30229a719c1f', + updated_at: '2020-04-23T00:19:13.289Z', + updated_by: 'user_name', + namespace_type: 'single', + name: '', + description: 'This is a description', + _tags: ['os:windows'], + tags: [], + type: 'endpoint', + meta: {}, + totalItems: 0, +}); export const getExceptionItemEntryMock = (): ExceptionEntry => ({ field: 'actingProcess.file.signer', @@ -44,7 +63,7 @@ export const getExceptionItemMock = (): ExceptionListItemSchema => ({ namespace_type: 'single', name: '', description: 'This is a description', - comments: [ + comment: [ { user: 'user_name', timestamp: '2020-04-23T00:19:13.289Z', diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts index 704849430daf9..23e9f64caf695 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/translations.ts @@ -5,6 +5,17 @@ */ import { i18n } from '@kbn/i18n'; +export const DETECTION_LIST = i18n.translate( + 'xpack.securitySolution.exceptions.detectionListLabel', + { + defaultMessage: 'Detection list', + } +); + +export const ENDPOINT_LIST = i18n.translate('xpack.securitySolution.exceptions.endpointListLabel', { + defaultMessage: 'Endpoint list', +}); + export const EDIT = i18n.translate('xpack.securitySolution.exceptions.editButtonLabel', { defaultMessage: 'Edit', }); @@ -47,3 +58,82 @@ export const OPERATING_SYSTEM = i18n.translate( defaultMessage: 'OS', } ); + +export const SEARCH_DEFAULT = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.searchDefaultPlaceholder', + { + defaultMessage: 'Search field (ex: host.name)', + } +); + +export const ADD_EXCEPTION_LABEL = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.addExceptionLabel', + { + defaultMessage: 'Add new exception', + } +); + +export const ADD_TO_ENDPOINT_LIST = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.addToEndpointListLabel', + { + defaultMessage: 'Add to endpoint list', + } +); + +export const ADD_TO_DETECTIONS_LIST = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.addToDetectionsListLabel', + { + defaultMessage: 'Add to detections list', + } +); + +export const EXCEPTION_EMPTY_PROMPT_TITLE = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.emptyPromptTitle', + { + defaultMessage: 'You have no exceptions', + } +); + +export const EXCEPTION_EMPTY_PROMPT_BODY = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.emptyPromptBody', + { + defaultMessage: + 'You can add an exception to fine tune the rule so that it suppresses alerts that meet specified conditions. Exceptions leverage detection accuracy, which can help reduce the number of false positives.', + } +); + +export const FETCH_LIST_ERROR = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.fetchingListError', + { + defaultMessage: 'Error fetching exceptions', + } +); + +export const DELETE_EXCEPTION_ERROR = i18n.translate( + 'xpack.securitySolution.exceptions.viewer.deleteExceptionError', + { + defaultMessage: 'Error deleting exception', + } +); + +export const ITEMS_PER_PAGE = (items: number) => + i18n.translate('xpack.securitySolution.exceptions.exceptionsPaginationLabel', { + values: { items }, + defaultMessage: 'Items per page: {items}', + }); + +export const NUMBER_OF_ITEMS = (items: number) => + i18n.translate('xpack.securitySolution.exceptions.paginationNumberOfItemsLabel', { + values: { items }, + defaultMessage: '{items} items', + }); + +export const REFRESH = i18n.translate('xpack.securitySolution.exceptions.utilityRefreshLabel', { + defaultMessage: 'Refresh', +}); + +export const SHOWING_EXCEPTIONS = (items: number) => + i18n.translate('xpack.securitySolution.exceptions.utilityNumberExceptionsLabel', { + values: { items }, + defaultMessage: 'Showing {items} exceptions', + }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts index e8393610e459d..d60d1ef71e502 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/types.ts @@ -5,6 +5,12 @@ */ import { ReactNode } from 'react'; +import { + NamespaceType, + ExceptionList, + ExceptionListItemSchema as ExceptionItem, +} from '../../../lists_plugin_deps'; + export interface OperatorOption { message: string; value: string; @@ -56,10 +62,51 @@ export interface Comment { comment: string; } +export enum ExceptionListType { + DETECTION_ENGINE = 'detection', + ENDPOINT = 'endpoint', +} + +export interface FilterOptions { + filter: string; + showDetectionsList: boolean; + showEndpointList: boolean; + tags: string[]; +} + +export interface Filter { + filter: Partial; + pagination: Partial; +} + +export interface SetExceptionsProps { + lists: ExceptionList[]; + exceptions: ExceptionItem[]; + pagination: Pagination; +} + +export interface ApiProps { + id: string; + namespaceType: NamespaceType; +} + +export interface Pagination { + page: number; + perPage: number; + total: number; +} + +export interface ExceptionsPagination { + pageIndex: number; + pageSize: number; + totalItemCount: number; + pageSizeOptions: number[]; +} + // TODO: Delete once types are updated export interface ExceptionListItemSchema { _tags: string[]; - comments: Comment[]; + comment: Comment[]; created_at: string; created_by: string; description?: string; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx similarity index 98% rename from x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.test.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx index 536d005c57b6e..c5d2ffc7ac2bf 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.test.tsx @@ -11,7 +11,7 @@ import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import moment from 'moment-timezone'; import { ExceptionDetails } from './exception_details'; -import { getExceptionItemMock } from '../mocks'; +import { getExceptionItemMock } from '../../mocks'; describe('ExceptionDetails', () => { beforeEach(() => { @@ -24,7 +24,7 @@ describe('ExceptionDetails', () => { test('it renders no comments button if no comments exist', () => { const exceptionItem = getExceptionItemMock(); - exceptionItem.comments = []; + exceptionItem.comment = []; const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> @@ -77,7 +77,7 @@ describe('ExceptionDetails', () => { test('it renders comments plural if more than one', () => { const exceptionItem = getExceptionItemMock(); - exceptionItem.comments = [ + exceptionItem.comment = [ { user: 'user_1', timestamp: '2020-04-23T00:19:13.289Z', diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx similarity index 85% rename from x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx index 8745e80a21548..6f418808b239a 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_details.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_details.tsx @@ -9,9 +9,9 @@ import React, { useMemo } from 'react'; import styled, { css } from 'styled-components'; import { transparentize } from 'polished'; -import { ExceptionListItemSchema } from '../types'; -import { getDescriptionListContent } from '../helpers'; -import * as i18n from '../translations'; +import { ExceptionListItemSchema } from '../../types'; +import { getDescriptionListContent } from '../../helpers'; +import * as i18n from '../../translations'; const StyledExceptionDetails = styled(EuiFlexItem)` ${({ theme }) => css` @@ -40,8 +40,9 @@ const ExceptionDetailsComponent = ({ const descriptionList = useMemo(() => getDescriptionListContent(exceptionItem), [exceptionItem]); const commentsSection = useMemo((): JSX.Element => { - const { comments } = exceptionItem; - if (comments.length > 0) { + // TODO: return back to exceptionItem.comments once updated + const { comment } = exceptionItem; + if (comment.length > 0) { return ( - {!showComments - ? i18n.COMMENTS_SHOW(comments.length) - : i18n.COMMENTS_HIDE(comments.length)} + {!showComments ? i18n.COMMENTS_SHOW(comment.length) : i18n.COMMENTS_HIDE(comment.length)} ); } else { diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx similarity index 94% rename from x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.test.tsx rename to x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx index e0c62f51d032a..10f11231ace01 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_entries.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/exception_entries.test.tsx @@ -10,14 +10,15 @@ import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { ExceptionEntries } from './exception_entries'; -import { getFormattedEntryMock } from '../mocks'; -import { getEmptyValue } from '../../empty_value'; +import { getFormattedEntryMock } from '../../mocks'; +import { getEmptyValue } from '../../../empty_value'; describe('ExceptionEntries', () => { test('it does NOT render the and badge if only one exception item entry exists', () => { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> theme.eui.euiSize}; @@ -47,12 +47,14 @@ const AndOrBadgeContainer = styled(EuiFlexItem)` interface ExceptionEntriesComponentProps { entries: FormattedEntry[]; + disableDelete: boolean; handleDelete: () => void; handleEdit: () => void; } const ExceptionEntriesComponent = ({ entries, + disableDelete, handleDelete, handleEdit, }: ExceptionEntriesComponentProps): JSX.Element => { @@ -141,6 +143,7 @@ const ExceptionEntriesComponent = ({ size="s" color="primary" onClick={handleEdit} + isDisabled={disableDelete} data-test-subj="exceptionsViewerEditBtn" > {i18n.EDIT} @@ -151,6 +154,7 @@ const ExceptionEntriesComponent = ({ size="s" color="danger" onClick={handleDelete} + isLoading={disableDelete} data-test-subj="exceptionsViewerDeleteBtn" > {i18n.REMOVE} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx new file mode 100644 index 0000000000000..784fc4336a5ff --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.test.tsx @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionItem } from './'; +import { getExceptionItemMock } from '../../mocks'; + +describe('ExceptionItem', () => { + it('it renders ExceptionDetails and ExceptionEntries', () => { + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('ExceptionDetails')).toHaveLength(1); + expect(wrapper.find('ExceptionEntries')).toHaveLength(1); + }); + + it('it invokes "handleEdit" when edit button clicked', () => { + const mockHandleEdit = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + const editBtn = wrapper.find('[data-test-subj="exceptionsViewerEditBtn"] button').at(0); + editBtn.simulate('click'); + + expect(mockHandleEdit).toHaveBeenCalledTimes(1); + }); + + it('it invokes "handleDelete" when delete button clicked', () => { + const mockHandleDelete = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + const editBtn = wrapper.find('[data-test-subj="exceptionsViewerDeleteBtn"] button').at(0); + editBtn.simulate('click'); + + expect(mockHandleDelete).toHaveBeenCalledTimes(1); + }); + + it('it renders comment accordion closed to begin with', () => { + const mockHandleDelete = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(0); + }); + + it('it renders comment accordion open when showComments is true', () => { + const mockHandleDelete = jest.fn(); + const exceptionItem = getExceptionItemMock(); + + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + const commentsBtn = wrapper + .find('.euiButtonEmpty[data-test-subj="exceptionsViewerItemCommentsBtn"]') + .at(0); + commentsBtn.simulate('click'); + + expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx new file mode 100644 index 0000000000000..386ab6f3c3c7c --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + EuiPanel, + EuiFlexGroup, + EuiCommentProps, + EuiCommentList, + EuiAccordion, + EuiFlexItem, +} from '@elastic/eui'; +import React, { useEffect, useState, useMemo, useCallback } from 'react'; +import styled from 'styled-components'; + +import { ExceptionDetails } from './exception_details'; +import { ExceptionEntries } from './exception_entries'; +import { getFormattedEntries, getFormattedComments } from '../../helpers'; +import { FormattedEntry, ExceptionListItemSchema, ApiProps } from '../../types'; + +const MyFlexItem = styled(EuiFlexItem)` + &.comments--show { + padding: ${({ theme }) => theme.eui.euiSize}; + border-top: ${({ theme }) => `${theme.eui.euiBorderThin}`} + +`; + +interface ExceptionItemProps { + loadingItemIds: ApiProps[]; + exceptionItem: ExceptionListItemSchema; + commentsAccordionId: string; + handleDelete: (arg: ApiProps) => void; + handleEdit: (item: ExceptionListItemSchema) => void; +} + +const ExceptionItemComponent = ({ + loadingItemIds, + exceptionItem, + commentsAccordionId, + handleDelete, + handleEdit, +}: ExceptionItemProps): JSX.Element => { + const [entryItems, setEntryItems] = useState([]); + const [showComments, setShowComments] = useState(false); + + useEffect((): void => { + const formattedEntries = getFormattedEntries(exceptionItem.entries); + setEntryItems(formattedEntries); + }, [exceptionItem.entries]); + + const onDelete = useCallback((): void => { + handleDelete({ id: exceptionItem.id, namespaceType: exceptionItem.namespace_type }); + }, [handleDelete, exceptionItem]); + + const onEdit = useCallback((): void => { + handleEdit(exceptionItem); + }, [handleEdit, exceptionItem]); + + const onCommentsClick = useCallback((): void => { + setShowComments(!showComments); + }, [setShowComments, showComments]); + + const formattedComments = useMemo((): EuiCommentProps[] => { + // TODO: return back to exceptionItem.comments once updated + return getFormattedComments(exceptionItem.comment); + }, [exceptionItem]); + + const disableDelete = useMemo((): boolean => { + const foundItems = loadingItemIds.filter((t) => t.id === exceptionItem.id); + return foundItems.length > 0; + }, [loadingItemIds, exceptionItem.id]); + + return ( + + + + + + + + + + + + + + + + ); +}; + +ExceptionItemComponent.displayName = 'ExceptionItemComponent'; + +export const ExceptionItem = React.memo(ExceptionItemComponent); + +ExceptionItem.displayName = 'ExceptionItem'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx new file mode 100644 index 0000000000000..dcc8611cd7298 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.test.tsx @@ -0,0 +1,158 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionsViewerPagination } from './exceptions_pagination'; + +describe('ExceptionsViewerPagination', () => { + it('it renders passed in "pageSize" as selected option', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsPerPageBtn"]').at(0).text()).toEqual( + 'Items per page: 50' + ); + }); + + it('it renders all passed in page size options when per page button clicked', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsPerPageBtn"] button').simulate('click'); + + expect(wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(0).text()).toEqual( + '20 items' + ); + expect(wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(1).text()).toEqual( + '50 items' + ); + expect(wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(2).text()).toEqual( + '100 items' + ); + }); + + it('it invokes "onPaginationChange" when per page item is clicked', () => { + const mockOnPaginationChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsPerPageBtn"] button').simulate('click'); + wrapper.find('button[data-test-subj="exceptionsPerPageItem"]').at(0).simulate('click'); + + expect(mockOnPaginationChange).toHaveBeenCalledWith({ + filter: {}, + pagination: { pageIndex: 0, pageSize: 20, totalItemCount: 1 }, + }); + }); + + it('it renders correct total page count', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsPagination"]').at(0).prop('pageCount')).toEqual( + 4 + ); + expect( + wrapper.find('[data-test-subj="exceptionsPagination"]').at(0).prop('activePage') + ).toEqual(0); + }); + + it('it invokes "onPaginationChange" when next clicked', () => { + const mockOnPaginationChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="pagination-button-next"]').at(1).simulate('click'); + + expect(mockOnPaginationChange).toHaveBeenCalledWith({ + filter: {}, + pagination: { pageIndex: 2, pageSize: 50, totalItemCount: 160 }, + }); + }); + + it('it invokes "onPaginationChange" when page clicked', () => { + const mockOnPaginationChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('button[data-test-subj="pagination-button-3"]').simulate('click'); + + expect(mockOnPaginationChange).toHaveBeenCalledWith({ + filter: {}, + pagination: { pageIndex: 4, pageSize: 50, totalItemCount: 160 }, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx new file mode 100644 index 0000000000000..0953a5c666c5d --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_pagination.tsx @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { ReactElement, useCallback, useState, useMemo } from 'react'; +import { + EuiContextMenuItem, + EuiButtonEmpty, + EuiPagination, + EuiFlexItem, + EuiFlexGroup, + EuiPopover, + EuiContextMenuPanel, +} from '@elastic/eui'; + +import * as i18n from '../translations'; +import { ExceptionsPagination, Filter } from '../types'; + +interface ExceptionsViewerPaginationProps { + pagination: ExceptionsPagination; + onPaginationChange: (arg: Filter) => void; +} + +const ExceptionsViewerPaginationComponent = ({ + pagination, + onPaginationChange, +}: ExceptionsViewerPaginationProps): JSX.Element => { + const [isOpen, setIsOpen] = useState(false); + + const closePerPageMenu = useCallback((): void => setIsOpen(false), [setIsOpen]); + + const onPerPageMenuClick = useCallback((): void => setIsOpen((isPopoverOpen) => !isPopoverOpen), [ + setIsOpen, + ]); + + const onPageClick = useCallback( + (pageIndex: number): void => { + onPaginationChange({ + filter: {}, + pagination: { + pageIndex: pageIndex + 1, + pageSize: pagination.pageSize, + totalItemCount: pagination.totalItemCount, + }, + }); + }, + [pagination, onPaginationChange] + ); + + const items = useMemo((): ReactElement[] => { + return pagination.pageSizeOptions.map((rows) => ( + { + onPaginationChange({ + filter: {}, + pagination: { + pageIndex: pagination.pageIndex, + pageSize: rows, + totalItemCount: pagination.totalItemCount, + }, + }); + closePerPageMenu(); + }} + data-test-subj="exceptionsPerPageItem" + > + {i18n.NUMBER_OF_ITEMS(rows)} + + )); + }, [pagination, onPaginationChange, closePerPageMenu]); + + const totalPages = useMemo((): number => { + if (pagination.totalItemCount > 0) { + return Math.ceil(pagination.totalItemCount / pagination.pageSize); + } else { + return 1; + } + }, [pagination]); + + return ( + + + + {i18n.ITEMS_PER_PAGE(pagination.pageSize)} + + } + isOpen={isOpen} + closePopover={closePerPageMenu} + panelPaddingSize="none" + > + + + + + + + + + ); +}; + +ExceptionsViewerPaginationComponent.displayName = 'ExceptionsViewerPaginationComponent'; + +export const ExceptionsViewerPagination = React.memo(ExceptionsViewerPaginationComponent); + +ExceptionsViewerPagination.displayName = 'ExceptionsViewerPagination'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx new file mode 100644 index 0000000000000..bdc99370a6293 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.test.tsx @@ -0,0 +1,337 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { ThemeProvider } from 'styled-components'; +import { mount } from 'enzyme'; +import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; + +import { ExceptionsViewerHeader } from './exceptions_viewer_header'; +import { ExceptionListType } from '../types'; + +describe('ExceptionsViewerHeader', () => { + it('it renders all disabled if "isInitLoading" is true', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect( + wrapper.find('input[data-test-subj="exceptionsHeaderSearch"]').at(0).prop('disabled') + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="exceptionsDetectionFilterBtn"] button').at(0).prop('disabled') + ).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="exceptionsEndpointFilterBtn"] button').at(0).prop('disabled') + ).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"] button') + .at(0) + .prop('disabled') + ).toBeTruthy(); + }); + + it('it displays toggles and add exception popover when more than one list type available', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsFilterGroupBtns"]').exists()).toBeTruthy(); + expect( + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"]').exists() + ).toBeTruthy(); + }); + + it('it does not display toggles and add exception popover if only one list type is available', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect(wrapper.find('[data-test-subj="exceptionsFilterGroupBtns"]')).toHaveLength(0); + expect(wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"]')).toHaveLength( + 0 + ); + }); + + it('it displays add exception button without popover if only one list type is available', () => { + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + expect( + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionBtn"]').exists() + ).toBeTruthy(); + }); + + it('it renders detections filter toggle selected when clicked', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsDetectionFilterBtn"] button').simulate('click'); + + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsDetectionFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeTruthy(); + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsEndpointFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeFalsy(); + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: '', + showDetectionsList: true, + showEndpointList: false, + tags: [], + }, + pagination: {}, + }); + }); + + it('it renders endpoint filter toggle selected and invokes "onFilterChange" when clicked', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsEndpointFilterBtn"] button').simulate('click'); + + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsEndpointFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeTruthy(); + expect( + wrapper + .find('EuiFilterButton[data-test-subj="exceptionsDetectionFilterBtn"]') + .at(0) + .prop('hasActiveFilters') + ).toBeFalsy(); + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: '', + showDetectionsList: false, + showEndpointList: true, + tags: [], + }, + pagination: {}, + }); + }); + + it('it invokes "onAddExceptionClick" when user selects to add an exception item and only endpoint exception lists are available', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onAddDetectionsExceptionClick" when user selects to add an exception item and only endpoint detections lists are available', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper.find('[data-test-subj="exceptionsHeaderAddExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onAddEndpointExceptionClick" when user selects to add an exception item to endpoint list from popover', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"] button') + .simulate('click'); + wrapper.find('[data-test-subj="addEndpointExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onAddDetectionsExceptionClick" when user selects to add an exception item to endpoint list from popover', () => { + const mockOnAddExceptionClick = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('[data-test-subj="exceptionsHeaderAddExceptionPopoverBtn"] button') + .simulate('click'); + wrapper.find('[data-test-subj="addDetectionsExceptionBtn"] button').simulate('click'); + + expect(mockOnAddExceptionClick).toHaveBeenCalledTimes(1); + }); + + it('it invokes "onFilterChange" with filter value when search used', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('input[data-test-subj="exceptionsHeaderSearch"]') + .at(0) + .simulate('change', { + target: { value: 'host' }, + }); + + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: 'host', + showDetectionsList: false, + showEndpointList: false, + tags: [], + }, + pagination: {}, + }); + }); + + it('it invokes "onFilterChange" with tags values when search value includes "tags:..."', () => { + const mockOnFilterChange = jest.fn(); + const wrapper = mount( + ({ eui: euiLightVars, darkMode: false })}> + + + ); + + wrapper + .find('input[data-test-subj="exceptionsHeaderSearch"]') + .at(0) + .simulate('change', { + target: { value: 'tags:malware' }, + }); + + expect(mockOnFilterChange).toHaveBeenCalledWith({ + filter: { + filter: '', + showDetectionsList: false, + showEndpointList: false, + tags: ['malware'], + }, + pagination: {}, + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx new file mode 100644 index 0000000000000..92a8830310b51 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exceptions_viewer_header.tsx @@ -0,0 +1,204 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + EuiFieldSearch, + EuiFlexGroup, + EuiFlexItem, + EuiPopover, + EuiContextMenu, + EuiButton, + EuiFilterGroup, + EuiFilterButton, + EuiContextMenuPanelDescriptor, +} from '@elastic/eui'; +import React, { useEffect, useState, useCallback, useMemo } from 'react'; + +import * as i18n from '../translations'; +import { ExceptionListType, Filter } from '../types'; + +interface ExceptionsViewerHeaderProps { + isInitLoading: boolean; + supportedListTypes: ExceptionListType[]; + detectionsListItems: number; + endpointListItems: number; + onFilterChange: (arg: Filter) => void; + onAddExceptionClick: (type: ExceptionListType) => void; +} + +/** + * Collection of filters and toggles for filtering exception items. + */ +const ExceptionsViewerHeaderComponent = ({ + isInitLoading, + supportedListTypes, + detectionsListItems, + endpointListItems, + onFilterChange, + onAddExceptionClick, +}: ExceptionsViewerHeaderProps): JSX.Element => { + const [filter, setFilter] = useState(''); + const [tags, setTags] = useState([]); + const [showDetectionsList, setShowDetectionsList] = useState(false); + const [showEndpointList, setShowEndpointList] = useState(false); + const [isAddExceptionMenuOpen, setAddExceptionMenuOpen] = useState(false); + + useEffect((): void => { + onFilterChange({ + filter: { filter, showDetectionsList, showEndpointList, tags }, + pagination: {}, + }); + }, [filter, tags, showDetectionsList, showEndpointList, onFilterChange]); + + const onAddExceptionDropdownClick = useCallback( + (): void => setAddExceptionMenuOpen(!isAddExceptionMenuOpen), + [setAddExceptionMenuOpen, isAddExceptionMenuOpen] + ); + + const handleDetectionsListClick = useCallback((): void => { + setShowDetectionsList(!showDetectionsList); + setShowEndpointList(false); + }, [showDetectionsList, setShowDetectionsList, setShowEndpointList]); + + const handleEndpointListClick = useCallback((): void => { + setShowEndpointList(!showEndpointList); + setShowDetectionsList(false); + }, [showEndpointList, setShowEndpointList, setShowDetectionsList]); + + const handleOnSearch = useCallback( + (event: React.ChangeEvent): void => { + const searchValue = event.target.value; + const tagsRegex = /(tags:[^\s]*)/i; + const tagsMatch = searchValue.match(tagsRegex); + const foundTags: string = tagsMatch != null ? tagsMatch[0].split(':')[1] : ''; + const filterString = tagsMatch != null ? searchValue.replace(tagsRegex, '') : searchValue; + + if (foundTags.length > 0) { + setTags(foundTags.split(',')); + } + + setFilter(filterString.trim()); + }, + [setTags, setFilter] + ); + + const onAddException = useCallback( + (type: ExceptionListType): void => { + onAddExceptionClick(type); + setAddExceptionMenuOpen(false); + }, + [onAddExceptionClick, setAddExceptionMenuOpen] + ); + + const addExceptionButtonOptions = useMemo( + (): EuiContextMenuPanelDescriptor[] => [ + { + id: 0, + items: [ + { + name: i18n.ADD_TO_ENDPOINT_LIST, + onClick: () => onAddException(ExceptionListType.ENDPOINT), + 'data-test-subj': 'addEndpointExceptionBtn', + }, + { + name: i18n.ADD_TO_DETECTIONS_LIST, + onClick: () => onAddException(ExceptionListType.DETECTION_ENGINE), + 'data-test-subj': 'addDetectionsExceptionBtn', + }, + ], + }, + ], + [onAddException] + ); + + return ( + + + + + + {supportedListTypes.length < 2 && ( + + onAddException(supportedListTypes[0])} + isDisabled={isInitLoading} + fill + > + {i18n.ADD_EXCEPTION_LABEL} + + + )} + + {supportedListTypes.length > 1 && ( + + + + + + {i18n.DETECTION_LIST} + {detectionsListItems != null ? ` (${detectionsListItems})` : ''} + + + {i18n.ENDPOINT_LIST} + {endpointListItems != null ? ` (${endpointListItems})` : ''} + + + + + + + {i18n.ADD_EXCEPTION_LABEL} + + } + isOpen={isAddExceptionMenuOpen} + closePopover={onAddExceptionDropdownClick} + anchorPosition="downCenter" + panelPaddingSize="none" + repositionOnScroll + > + + + + + + )} + + ); +}; + +ExceptionsViewerHeaderComponent.displayName = 'ExceptionsViewerHeaderComponent'; + +export const ExceptionsViewerHeader = React.memo(ExceptionsViewerHeaderComponent); + +ExceptionsViewerHeader.displayName = 'ExceptionsViewerHeader'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx index 7d3b7195def80..cc8e8111064bc 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx @@ -9,108 +9,120 @@ import { ThemeProvider } from 'styled-components'; import { mount } from 'enzyme'; import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; -import { ExceptionItem } from './'; -import { getExceptionItemMock } from '../mocks'; - -describe('ExceptionItem', () => { - it('it renders ExceptionDetails and ExceptionEntries', () => { - const exceptionItem = getExceptionItemMock(); - - const wrapper = mount( - ({ eui: euiLightVars, darkMode: false })}> - - - ); - - expect(wrapper.find('ExceptionDetails')).toHaveLength(1); - expect(wrapper.find('ExceptionEntries')).toHaveLength(1); - }); - - it('it invokes "handleEdit" when edit button clicked', () => { - const mockHandleEdit = jest.fn(); - const exceptionItem = getExceptionItemMock(); - - const wrapper = mount( - ({ eui: euiLightVars, darkMode: false })}> - - - ); - - const editBtn = wrapper.find('[data-test-subj="exceptionsViewerEditBtn"] button').at(0); - editBtn.simulate('click'); - - expect(mockHandleEdit).toHaveBeenCalledTimes(1); +import { ExceptionsViewer } from './'; +import { ExceptionListType } from '../types'; +import { useKibana } from '../../../../common/lib/kibana'; +import { useExceptionList, useApi } from '../../../../../public/lists_plugin_deps'; +import { getExceptionListMock } from '../mocks'; + +jest.mock('../../../../common/lib/kibana'); +jest.mock('../../../../../public/lists_plugin_deps'); + +describe('ExceptionsViewer', () => { + beforeEach(() => { + (useKibana as jest.Mock).mockReturnValue({ + services: { + http: {}, + application: { + getUrlForApp: () => 'some/url', + }, + }, + }); + + (useApi as jest.Mock).mockReturnValue({ + deleteExceptionItem: jest.fn().mockResolvedValue(true), + }); + + (useExceptionList as jest.Mock).mockReturnValue([ + false, + [], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + jest.fn(), + ]); }); - it('it invokes "handleDelete" when delete button clicked', () => { - const mockHandleDelete = jest.fn(); - const exceptionItem = getExceptionItemMock(); - + it('it renders loader if "initLoading" is true', () => { + (useExceptionList as jest.Mock).mockReturnValue([ + true, + [], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + jest.fn(), + ]); const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> - ); - const editBtn = wrapper.find('[data-test-subj="exceptionsViewerDeleteBtn"] button').at(0); - editBtn.simulate('click'); - - expect(mockHandleDelete).toHaveBeenCalledTimes(1); + expect(wrapper.find('[data-test-subj="loadingPanelAllRulesTable"]').exists()).toBeTruthy(); }); - it('it renders comment accordion closed to begin with', () => { - const mockHandleDelete = jest.fn(); - const exceptionItem = getExceptionItemMock(); - + it('it renders empty prompt if no "exceptionListMeta" passed in', () => { const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> - ); - expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(0); + expect(wrapper.find('[data-test-subj="exceptionsEmptyPrompt"]').exists()).toBeTruthy(); }); - it('it renders comment accordion open when showComments is true', () => { - const mockHandleDelete = jest.fn(); - const exceptionItem = getExceptionItemMock(); + it('it renders empty prompt if no exception items exist', () => { + (useExceptionList as jest.Mock).mockReturnValue([ + false, + [getExceptionListMock()], + [], + { + page: 1, + perPage: 20, + total: 0, + }, + jest.fn(), + ]); const wrapper = mount( ({ eui: euiLightVars, darkMode: false })}> - ); - const commentsBtn = wrapper - .find('.euiButtonEmpty[data-test-subj="exceptionsViewerItemCommentsBtn"]') - .at(0); - commentsBtn.simulate('click'); - - expect(wrapper.find('.euiAccordion-isOpen')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="exceptionsEmptyPrompt"]').exists()).toBeTruthy(); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx index f4cdce62f56b3..ff52e395c3b1e 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.tsx @@ -4,96 +4,412 @@ * you may not use this file except in compliance with the Elastic License. */ +import React, { useCallback, useState, useMemo, useEffect, useReducer } from 'react'; import { - EuiPanel, + EuiEmptyPrompt, + EuiText, + EuiLink, + EuiOverlayMask, + EuiModal, + EuiModalBody, + EuiCodeBlock, EuiFlexGroup, - EuiCommentProps, - EuiCommentList, - EuiAccordion, EuiFlexItem, + EuiSpacer, } from '@elastic/eui'; -import React, { useEffect, useState, useMemo, useCallback } from 'react'; +import { FormattedMessage } from 'react-intl'; import styled from 'styled-components'; +import uuid from 'uuid'; -import { ExceptionDetails } from './exception_details'; -import { ExceptionEntries } from './exception_entries'; -import { getFormattedEntries, getFormattedComments } from '../helpers'; -import { FormattedEntry, ExceptionListItemSchema } from '../types'; +import * as i18n from '../translations'; +import { useStateToaster } from '../../toasters'; +import { useKibana } from '../../../../common/lib/kibana'; +import { Panel } from '../../../../common/components/panel'; +import { Loader } from '../../../../common/components/loader'; +import { ExceptionsViewerHeader } from './exceptions_viewer_header'; +import { + ExceptionListType, + ExceptionListItemSchema, + ApiProps, + Filter, + SetExceptionsProps, +} from '../types'; +import { allExceptionItemsReducer, State } from './reducer'; +import { + useExceptionList, + ExceptionIdentifiers, + useApi, +} from '../../../../../public/lists_plugin_deps'; +import { ExceptionItem } from './exception_item'; +import { AndOrBadge } from '../../and_or_badge'; +import { ExceptionsViewerPagination } from './exceptions_pagination'; +import { + UtilityBar, + UtilityBarSection, + UtilityBarGroup, + UtilityBarText, + UtilityBarAction, +} from '../../utility_bar'; -const MyFlexItem = styled(EuiFlexItem)` - &.comments--show { - padding: ${({ theme }) => theme.eui.euiSize}; - border-top: ${({ theme }) => `${theme.eui.euiBorderThin}`} +const StyledText = styled(EuiText)` + font-style: italic; +`; +const MyExceptionsContainer = styled.div` + height: 600px; + overflow: hidden; `; -interface ExceptionItemProps { - exceptionItem: ExceptionListItemSchema; +const initialState: State = { + filterOptions: { filter: '', showEndpointList: false, showDetectionsList: false, tags: [] }, + pagination: { + pageIndex: 0, + pageSize: 20, + totalItemCount: 0, + pageSizeOptions: [5, 10, 20, 50, 100, 200, 300], + }, + endpointList: null, + detectionsList: null, + allExceptions: [], + exceptions: [], + exceptionToEdit: null, + loadingItemIds: [], + isModalOpen: false, +}; + +enum ModalAction { + CREATE = 'CREATE', + EDIT = 'EDIT', +} + +interface ExceptionsViewerProps { + ruleId: string; + exceptionListsMeta: ExceptionIdentifiers[]; + availableListTypes: ExceptionListType[]; commentsAccordionId: string; - handleDelete: ({ id }: { id: string }) => void; - handleEdit: (item: ExceptionListItemSchema) => void; + onAssociateList?: (listId: string) => void; } -const ExceptionItemComponent = ({ - exceptionItem, +const ExceptionsViewerComponent = ({ + ruleId, + exceptionListsMeta, + availableListTypes, + onAssociateList, commentsAccordionId, - handleDelete, - handleEdit, -}: ExceptionItemProps): JSX.Element => { - const [entryItems, setEntryItems] = useState([]); - const [showComments, setShowComments] = useState(false); +}: ExceptionsViewerProps): JSX.Element => { + const { services } = useKibana(); + const [, dispatchToaster] = useStateToaster(); + const [initLoading, setInitLoading] = useState(true); + const onDispatchToaster = useCallback( + ({ title, color, iconType }) => (): void => { + dispatchToaster({ + type: 'addToaster', + toast: { + id: uuid.v4(), + title, + color, + iconType, + }, + }); + }, + [dispatchToaster] + ); + const { deleteExceptionItem } = useApi(services.http); + const [ + { + endpointList, + detectionsList, + exceptions, + filterOptions, + pagination, + loadingItemIds, + isModalOpen, + }, + dispatch, + ] = useReducer(allExceptionItemsReducer(), initialState); - useEffect((): void => { - const formattedEntries = getFormattedEntries(exceptionItem.entries); - setEntryItems(formattedEntries); - }, [exceptionItem.entries]); + // TODO: Update icky typing once api updated + const setExceptions = useCallback( + ({ + lists: newLists, + exceptions: newExceptions, + pagination: newPagination, + }: SetExceptionsProps) => { + dispatch({ + type: 'setExceptions', + lists: newLists, + exceptions: (newExceptions as unknown) as ExceptionListItemSchema[], + pagination: newPagination, + }); + }, + [dispatch] + ); + const [loadingList, , , , fetchList] = useExceptionList({ + http: services.http, + lists: exceptionListsMeta, + filterOptions, + pagination: { + page: pagination.pageIndex + 1, + perPage: pagination.pageSize, + total: pagination.totalItemCount, + }, + dispatchListsInReducer: setExceptions, + onError: onDispatchToaster({ + color: 'danger', + title: i18n.FETCH_LIST_ERROR, + iconType: 'alert', + }), + }); - const onDelete = useCallback((): void => { - handleDelete({ id: exceptionItem.id }); - }, [handleDelete, exceptionItem]); + const setIsModalOpen = useCallback( + (isOpen: boolean): void => { + dispatch({ + type: 'updateModalOpen', + isOpen, + }); + }, + [dispatch] + ); + + const onFetchList = useCallback((): void => { + if (fetchList != null) { + fetchList(); + } + }, [fetchList]); + + const onFiltersChange = useCallback( + ({ filter, pagination: pag }: Filter): void => { + dispatch({ + type: 'updateFilterOptions', + filterOptions: filter, + pagination: pag, + }); + }, + [dispatch] + ); + + const onAddException = useCallback( + (type: ExceptionListType): void => { + setIsModalOpen(true); + }, + [setIsModalOpen] + ); + + const onEditExceptionItem = useCallback( + (exception: ExceptionListItemSchema): void => { + // TODO: Added this just for testing. Update + // modal state logic as needed once ready + dispatch({ + type: 'updateExceptionToEdit', + exception, + }); - const onEdit = useCallback((): void => { - handleEdit(exceptionItem); - }, [handleEdit, exceptionItem]); + setIsModalOpen(true); + }, + [setIsModalOpen] + ); - const onCommentsClick = useCallback((): void => { - setShowComments(!showComments); - }, [setShowComments, showComments]); + const onCloseExceptionModal = useCallback( + ({ actionType, listId }): void => { + setIsModalOpen(false); - const formattedComments = useMemo((): EuiCommentProps[] => { - return getFormattedComments(exceptionItem.comments); - }, [exceptionItem]); + // TODO: This callback along with fetchList can probably get + // passed to the modal for it to call itself maybe + if (actionType === ModalAction.CREATE && listId != null && onAssociateList != null) { + onAssociateList(listId); + } + + onFetchList(); + }, + [setIsModalOpen, onFetchList, onAssociateList] + ); + + const setLoadingItemIds = useCallback( + (items: ApiProps[]): void => { + dispatch({ + type: 'updateLoadingItemIds', + items, + }); + }, + [dispatch] + ); + + const onDeleteException = useCallback( + ({ id, namespaceType }: ApiProps) => { + deleteExceptionItem({ + id, + namespaceType, + onSuccess: () => { + setLoadingItemIds(loadingItemIds.filter((t) => t.id !== id)); + onFetchList(); + }, + onError: () => { + const dispatchToasterError = onDispatchToaster({ + color: 'danger', + title: i18n.DELETE_EXCEPTION_ERROR, + iconType: 'alert', + }); + + dispatchToasterError(); + setLoadingItemIds(loadingItemIds.filter((t) => t.id !== id)); + }, + }); + }, + [setLoadingItemIds, deleteExceptionItem, loadingItemIds, onFetchList, onDispatchToaster] + ); + + // Logic for initial render + useEffect((): void => { + if (initLoading && !loadingList && (exceptions.length === 0 || exceptions != null)) { + setInitLoading(false); + } + }, [initLoading, exceptions, loadingList]); + + const ruleSettingsUrl = useMemo((): string => { + return services.application.getUrlForApp( + `security#/detections/rules/id/${encodeURI(ruleId)}/edit` + ); + }, [ruleId, services.application]); + + const exceptionsSubtext = useMemo((): JSX.Element => { + if (filterOptions.showEndpointList) { + return ( + + + + ), + }} + /> + ); + } else if (filterOptions.showDetectionsList) { + return ( + + + + ), + }} + /> + ); + } else { + return <>; + } + }, [filterOptions.showEndpointList, filterOptions.showDetectionsList, ruleSettingsUrl]); + + const showEmpty = useMemo((): boolean => { + return !initLoading && !loadingList && exceptions.length === 0; + }, [initLoading, exceptions.length, loadingList]); return ( - - - - - + {isModalOpen && ( + + + + + {`Modal goes here`} + + + + + )} + + + {initLoading && } + + + + {(filterOptions.showEndpointList || filterOptions.showDetectionsList) && ( + <> + + {exceptionsSubtext} + + )} + + + + + + + + {i18n.SHOWING_EXCEPTIONS(pagination.totalItemCount ?? 0)} + + + + + + {i18n.REFRESH} + + + + + + + + + {showEmpty && ( + {i18n.EXCEPTION_EMPTY_PROMPT_TITLE}} + body={

{i18n.EXCEPTION_EMPTY_PROMPT_BODY}

} + data-test-subj="exceptionsEmptyPrompt" /> - + )} + + + + + {!initLoading && + exceptions.length > 0 && + exceptions.map((exception, index) => ( + + {index !== 0 && ( + <> + + + + )} + + + ))} -
- - - - - -
-
+ + + + ); }; -ExceptionItemComponent.displayName = 'ExceptionItemComponent'; +ExceptionsViewerComponent.displayName = 'ExceptionsViewerComponent'; -export const ExceptionItem = React.memo(ExceptionItemComponent); +export const ExceptionsViewer = React.memo(ExceptionsViewerComponent); -ExceptionItem.displayName = 'ExceptionItem'; +ExceptionsViewer.displayName = 'ExceptionsViewer'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts new file mode 100644 index 0000000000000..40d5bb5f0a297 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/reducer.ts @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { + ApiProps, + FilterOptions, + ExceptionsPagination, + ExceptionListItemSchema, + Pagination, +} from '../types'; +import { ExceptionList } from '../../../../../public/lists_plugin_deps'; + +export interface State { + filterOptions: FilterOptions; + pagination: ExceptionsPagination; + endpointList: ExceptionList | null; + detectionsList: ExceptionList | null; + allExceptions: ExceptionListItemSchema[]; + exceptions: ExceptionListItemSchema[]; + exceptionToEdit: ExceptionListItemSchema | null; + loadingItemIds: ApiProps[]; + isModalOpen: boolean; +} + +export type Action = + | { + type: 'setExceptions'; + lists: ExceptionList[]; + exceptions: ExceptionListItemSchema[]; + pagination: Pagination; + } + | { + type: 'updateFilterOptions'; + filterOptions: Partial; + pagination: Partial; + } + | { type: 'updateModalOpen'; isOpen: boolean } + | { type: 'updateExceptionToEdit'; exception: ExceptionListItemSchema } + | { type: 'updateLoadingItemIds'; items: ApiProps[] }; + +export const allExceptionItemsReducer = () => (state: State, action: Action): State => { + switch (action.type) { + case 'setExceptions': { + const endpointList = action.lists.filter((t) => t.type === 'endpoint'); + const detectionsList = action.lists.filter((t) => t.type === 'detection'); + + return { + ...state, + endpointList: state.filterOptions.showDetectionsList + ? state.endpointList + : endpointList[0] ?? null, + detectionsList: state.filterOptions.showEndpointList + ? state.detectionsList + : detectionsList[0] ?? null, + pagination: { + ...state.pagination, + pageIndex: action.pagination.page - 1, + pageSize: action.pagination.perPage, + totalItemCount: action.pagination.total, + }, + allExceptions: action.exceptions, + exceptions: action.exceptions, + }; + } + case 'updateFilterOptions': { + const returnState = { + ...state, + filterOptions: { + ...state.filterOptions, + ...action.filterOptions, + }, + pagination: { + ...state.pagination, + ...action.pagination, + }, + }; + + if (action.filterOptions.showEndpointList) { + const exceptions = state.allExceptions.filter((t) => t._tags.includes('endpoint')); + + return { + ...returnState, + exceptions, + }; + } else if (action.filterOptions.showDetectionsList) { + const exceptions = state.allExceptions.filter((t) => t._tags.includes('detection')); + + return { + ...returnState, + exceptions, + }; + } else { + return { + ...returnState, + exceptions: state.allExceptions, + }; + } + } + case 'updateLoadingItemIds': { + return { + ...state, + loadingItemIds: [...state.loadingItemIds, ...action.items], + }; + } + case 'updateExceptionToEdit': { + return { + ...state, + exceptionToEdit: action.exception, + }; + } + case 'updateModalOpen': { + return { + ...state, + isModalOpen: action.isOpen, + }; + } + default: + return state; + } +}; diff --git a/x-pack/plugins/security_solution/public/lists_plugin_deps.ts b/x-pack/plugins/security_solution/public/lists_plugin_deps.ts index 350b53ef52f4e..113bfaa860f00 100644 --- a/x-pack/plugins/security_solution/public/lists_plugin_deps.ts +++ b/x-pack/plugins/security_solution/public/lists_plugin_deps.ts @@ -5,10 +5,18 @@ */ export { + useApi, useExceptionList, usePersistExceptionItem, usePersistExceptionList, + ExceptionIdentifiers, + ExceptionList, mockNewExceptionItem, mockNewExceptionList, } from '../../lists/public'; -export { ExceptionListItemSchema, Entries } from '../../lists/common/schemas'; +export { + ExceptionListSchema, + ExceptionListItemSchema, + Entries, + NamespaceType, +} from '../../lists/common/schemas';

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≀(K2ickH+HI5`Jp&qKLkGzCs{Mi=gVj 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