From ee9733c6395e1cb0ffbfb48020e73bfa5c72732b Mon Sep 17 00:00:00 2001 From: Xin Date: Tue, 5 Apr 2016 13:01:47 -0700 Subject: [PATCH] change monitoring's result page and add doc Change-Id: Ia18754500e82b53919360c4d99e3bee44d07024b --- doc/source/gallery.rst | 32 +++++++++++++++++++-- doc/source/images/kb-http-monitoring.png | Bin 0 -> 126861 bytes kb_server/public/ui/scripts/scripts.js | 4 +-- kb_web/app/scripts/controllers/about.js | 2 +- kb_web/app/scripts/controllers/interval.js | 2 +- 5 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 doc/source/images/kb-http-monitoring.png diff --git a/doc/source/gallery.rst b/doc/source/gallery.rst index a38aab2..17cd673 100644 --- a/doc/source/gallery.rst +++ b/doc/source/gallery.rst @@ -26,8 +26,8 @@ The table shows the results for each iteration step, with the requested and measured RPS (HTTP requests per second) and the corresponding aggregated download throughput (the sum of all downloads for all clients). -The latency distribution is shows in the chart, where each line corresponds to -one load level (or iteration in the progression). Lines can be individually +Each line in the chart represents the latency distribution for one load level +(or iteration in the progression). Lines can be individually shown/hidden by clicking on the corresponding legend item. For example, the largest scale involves 20,000 simultaneous users sending an @@ -44,6 +44,34 @@ during the scale test. :target: https://htmlpreview.github.io/?https://github.com/openstack/kloudbuster/blob/master/doc/source/gallery/http.html +Sample HTTP Monitoring Report +----------------------------- + +The report below shows an HTTP monitoring run with 15 HTTP servers where each +HTTP server is receiving HTTP requests from 1 HTTP traffic generator that runs +in a separate VM and emulates 1,000 users sending 1 request per second each +(for a total of 1000 requests per second per HTTP server). The topology used +for the test is 1 tenant, 1 router, 3 networks and 5 HTTP servers per network. +The total duration is set to 300 seconds. This scale settings can beviewed in +the Configuration tab. + +This stacked chart updates in real time by scrolling to the left and shows +how the latency of HTTP requests evolves over time for each percentile group +(50%, 75%, 90%, 99%,99.9%, 99.99%, 99.999%). Lines can be individually +shown/hidden by clicking on the corresponding legend item. + +The compute node where the HTTP servers run is protected against individual +link failures by using a link aggregation with 2 physical links connected to +2 different switches. + +At 12:19:53, one of the 2 physical links is purposely shut down. As can be seen, +the latency spikes as high as 1664 msec and returns to normal after about 10 +seconds. + +.. image:: images/kb-http-monitoring.png + + + Sample Storage Scale Report --------------------------- diff --git a/doc/source/images/kb-http-monitoring.png b/doc/source/images/kb-http-monitoring.png new file mode 100644 index 0000000000000000000000000000000000000000..827a3464b8fa2b0b6966cdf298010ef5743b4a8b GIT binary patch literal 126861 zcmZ^J1yCGY7AV18g9NwWZo%E%-3h_n9fG?C2r{?@cXxLU?l#!qKFH78-M72H_W!Qx zs_x_G+&j1DNTjl&6bd3fA_N2kij1_lDg*>n2m}PA7Ch`9$ar!FDg*>Fo|TxGvW%D* zsj{=fH!E9n2ngxOA6jtgYBIP0Eme2~M)VJ~d0#}le{4nvy4GMMLF9#?!_&EcRq1Wa zHSLY63Z!Yl5nha{8Cy;_KwY_+>wWM6Fl^s<13knl+r zP6(y@kT5xoD+%+=f`yr!PRZI6NM{TIonEu-1$i+t!UAD_`|9E40kta9YE2t?H~scb zH%4erOaMWNx%*L(n2%t$A7VShHi(4;LKJs_U}6kc`cf}KBQ${&Lc9*TWV9v~x@4rL zae<0z4A)c$VniKBE*&=TJEdTKU^eU?4LoVnp^K+)gop51ucCz$DUKLF86O{r8b>Ga}_W3fE>Gygjp$JFykg5buU29J=M|`*>Ab@xG$GRW~#=X^CwRp zCUPsq@FVRG270-$FJL%vRqis|RYmzM!cT~A8g~(Sie30a_yH~=YsKd=bn_wacw@a( zb$?k3Hthg;wO4E_sp6;n?j_MjlFr`yl{9P?QnF4ih!rep=V&&v`r)B>gDhZ# z$YMLA2eUc+r{^AkRggt>xD5+f-GZ}M{{ySd9x4Rqz zu1hSSVIb8cyvF^E!~Fwa80QBncTAfh-kLp3{w7RfIjz1UOBGf7pDd^j3qx&FZPU*; zLXsA-Ea$#TM&(_-pV|0@-TtE8sGF-D{8*0$;aDEg^?{ ztQ=AGAq}>9TacC{nLR(i_VBTUkisM6k-3UP%}T_eBMsm&M7l9zR|t13W=N5vj9iretCY(+Mo~Ol#ew5vtVl_L zl_isI1Wp0{Y^)`A8=9TCQbF3xX(^sx5UMFe@-SXH@wZ4Gvo3Au)Q}=mQQHriQ5wb? z+5(G^z-KzDq37CoZj6#W`E|^yX;OY1i@nxINMD$)Pu0ByS6nZ2o55(?MhG0=aeBXR z%feGpqR+wC!+#Dz>?7{O=+kNO@J6_Z5GN0|6m|XX!=9Kfk|n1vvMy^&3LtmKBEf)@ zp-h4u{l2dlMOrKURERl8H77VHGl#9pd<>-nsE}*=4405R;_Hmj`n@B~_q%WCOA0?_ z38e)kkPeq@I5Cr=S=PQ;KYHD~)v%Q;ifu4tS1~g0t1^xnm+A?v1?>Zk!~Vg+-GRY= z$;iz<{}5_0(m^O|$kRu-0M zmLwmK5H%5d5eY*>5q}`YB5Hj!q#L8fr}d_vQf5%EQ06c6)TuR+Q5@AC)ru@?5H3?a zE}c^-5;1S9i**ihZn{Q1=p4gM$tg=vkI{J1;HDd-YgeBt<Bg=%BYRxlFXQV^26 z(D?i-qZGFMTWM<9xfV#BNLfv#UMpHHvr@CnU0-3M2X83GSQ5t!dyjMvc5j{=fPPU2y{?sIo_VtAr|r+No_cY2b;k&gd{{}bPaBZK4IW;f$7Lyg12%6^`|d_~C6 ztz*se{&DUKZg^`}v~i*_zv0jtGJUL-%|Fww~?zZ9f`>nV)-yQE=*sa2?*KKyZ*#;A-Wg#;MXj6O#QL14mq#QH_G-cYFPt%sw% zsB^E)TG3Y#RgqC)sK}9(&fzpUa35(@NmNl^;i0$Hs8WkiOIv4E>t$zSKi*W?(D_ZO z9;rspa>@2#Y_ktw(>?i?3bkQU*RL9`8O|K17$-XHJuFBqR`RukQSnQ*Mm9yZ7I%&Z zS<7P!gDcPB_3ZCi&aJ!LQzQFS`=9nc8vq5ip99$qK64Zvejce{MUPszd5RUY@bG1| z>Er{QgQuDCp6I>C;nT9_pB`Zkf){Cmi-Mv#6oMCi27W*=;JW_>@>TYg_f_M??DY#+ z2z~}l8mSZs58f3%i@=jE0{tU?1J%*D8g~}H7A{ZH0ot$r(t0$U9K5bBNBt}}EGF9H zUtOI?_8XHgLJ2}|`ZLLe#T^G$BfyDNiLHs<3S^3rS*kn-GARlR9i{h{-nSD+owFCF zzNVUk>#>}%*n>?&v_lHf<*_~_7q~{m%!=vhEJ8b~`QONyYk4A5KBhHLTRHxEU$|5A zDdCZ)|LJblHhQ}<&pa`cmB_jGC_nhK;%9gg!sykgPqI)wxwb|{Z_0KGBQ2Dz(LL-v zQXH-YQAzyi6eCbj!A*%#$uIQ~(8N{Ayusc{-kAd&Uz_mxfss-xu;=$p{F~dMqo%K> z7#9y8517U%G-uRde0KC__B>+^dJ6nNYgOy13tUKEpMaP2=55EJuZHKsG5XIaf6Tj& zo*&h5eABVNoX*%Dth}rcxl8~Va&8(}axc?bANB9o7rnf1aHdaxUI+vLA-{@@eP0ZP zMT*9~XF}9huTQVzcDcHcSd=)Ba7Y_qwxV5RGE{##D(T5Nk^Lwe^7%_z8{8G+wod!ZKuc3(GC=dY+fjGecK|dFl1KWCo_dIa&II~*oS)I#vcD2rT z99)@Isnz6VSH4x%*=Y+dA?hG%c85K;tzfJAwJfo&QFA(a-m(Ge=6+XgmvT{B0Wkl5 zv362WSJ10evjZ7cc9x&a@TwSWbyIV<)h0~id%}JSn0j2p`hYhDkm3HmxtMef=WhvMk)XL=gQ~w&Dya&>tU_z+$v}IC_l3J<=ku!;P1A9AFt=_3InNyrq1%JX0i!u%0rp;2&)1hmh5>HKl*qST zm|gh(ox8C^nJ3Nn4tj7Da3me${$FmpZi9!yGvcR6)`SKFym>iJ*^h6An7^ZfDu#CJsgSc?|2($7kM;CE6MI*5-WU@k}KzF&X3W5w&LWGaG;G~A|Lh}x}<7I0q%!t7CCsjajl-6;9fWZ0u*Zo08 zmGbgW76EIeuI;L=AkS;&V8>+g)xp%9$be?zbEgXM>}&@6H-q*TYDE?PXY3O zQ1JeF{tL`ZPWlfLR~rFxZ3SggF$ZUJQcflgCKhr*L{d^xe&?^>cvZzE|Hc02O@Q3e z)zy)gnc2g`gUN%P$-&uznU#l!hnaB(ZvAnP`7aDJD-#Rz|BKDl>f8T^ z?Jvwf+5X|zKh^R7C5%_u%G2CdN8HNJ+}`DnX@ab5TpaxW(DOg2|5*B8tlIy@%EQ9) z->m&Vm+x=!OJzZ*!X@A(V z2s-U|b!=tm6x2DNi%x2E)${i*hl>q6rZjZ;1mjI%dykT73yX_GP^K5wu8GuPOdtje zq+|~~-UkX}=zqSD&SSt&x-vGw68s1DZvu3dpc&rp|I3q%$r8kpyya1Wqx0xENG(jv}5k7o;T0(PsZo!-7N_NhuTLj-r1VlbS$J^ zOkL>D=f^Y@E7=K5F@)AipheD3GU=2_J%q)oTLiqZm^3H{a1Yt$fPn+=YotFg!5a{-&S0l8pvl zD3-D7h(?H$FgkiJikN3*bv;o>7NTf9;1yel&oO`}W3`x4cD=P4%cM@zw+Lx7m;gH) zdgbgrthA%e&NX)%N{+ryeV8cNE98!KuA7>B-E$KW8FhPbe)JYy@2c$1|m| z0-O8u^733WV7hePCkhVemm+37?11;`9oiVgh1vN^uxNQ7#ENITlZA?SIm?l-JU$)6 zAnf7F+k{^7J~ay+oeMt9%#ei7fSNb=)g$|Hm~A zOyWgyKXR`R#+1c9J;}M!@(pBo4EI%x5M$@sY?m8C{WH0OMO%zqJDae6&}gcwT5&U_ z2uv+GEQ@3LXEVJXW+;Lv-(Do%G2iMWz8&C^^m3;&tAq z0j+kX)mcnSUR@zL$0x!*d_sNIAex$$8c(H_$gZ+x^kUFy`u>(75P#vtrPV5~!)~@mV;4>{~Jzq!5X|Js`z;2G7e*WFar+q%JU&`_*g0;c*fVT~Nf4)$sQ}A`o zzxOmjK5XprsCJLT`b<1S(1v&;K+3~<{#Wbzp4`xgo)DwMR#5Qz`+I&ewUX-B#fp#9 z5BOW`U4kRPJTgU+eKmhYQStOj^;(9;?mEs;^U>YYy-|+WtjwSOY8*Ok-0G$$*X3QHV0uC8(uW3O#jqaVz`vVW_ zk*AkAuhab0{y{hZ4V$b-BmXb!gUgdyU~O$NRQgXGFF&=m?l>;y=q=M-&}`sPPW^!e z04(Z)!m2$g`KzI_{^1DHt5a|9^}ABw!*PI@so5T7Y?A?Nfl@CKx95lpxKl}%xF|y( zxPwcz8~+$&MHwh`+uC79?w~2@Mf^F6?0flo%W=kVK>s% z#?MEzEs93Smn`lFp||hUR6|dj3rz+Q-qwZ|re*>GlYrAFmqj4}yM^gz8x$l4skQGH zBO*p?=8&321=aw&zcKo>LKe0iSV-d7CM#KPgX!gizzsy#CRjF%LT)6wNzGuo$rgxx3^ml^P{Df-p{pQS~#2H zEN?1%VC&-2hGr$2;iT9aM7ZOAtJxB9+wt=h$5~0OdcE!saTDjAXZTbL>l3#o*ErY# zS{eq181i365)v+wY}B2=D%m629v40IoKi$iJN*oBL;;W0VvAtxt9g>;JUY=UO=@GH z+WSkmAPG0L{%xixBjF6-UU7*;y;Is-b|bu_$Y0(TP^h3oR-ffO{LlRj1#nI z$9Gh|vsY@FjoRP=M5xM{m*QOaLv|0~cA2GW+uPCKvtIEA#Q{1Mn5x zY&5Ufu5I*6rqd;q1m|*^>~f^MyjB|z%bqMZuM6S4Hlg;Oc767&TMnZgvurlJw*o$+ zyqY3#ma6rGC!Cjdz1#QT3~fGTG#j4IW^2AW$}@F62mh|_eivrtAH?y~18--z5m;@b z?UgwK2yc~haLZVx+hznKXsZWxlH;uI9ec+XUp{|7rO?)gw(<4idgO`Oy(n4QB$3CK z#m=Luu+mg;i<+hh;5!^iG>|>rsE2X8c*dE=9F?lAt^GJ0K(AR{6z`ud94zRY{EbmZ zi~_Dx;di;_VcqM4R5^YHKvya@xPXtiZ(|9cS(_IH35Ud_cdq4+KWj=i1Bpg>v&q$H zg{f}ks`XST`-Wsy#V*5*E`NXXK1B*=z=&3mkw*bVVv!FD?Ra~72D6@`kE?LEfL>|Q zN97mc^LGZkkt`z)>79Ln;c#e9S%W*dLTAr=1ZPse5pIx#X_&S7AIs%v`D+-qgd;M; z8si)h_y=b|Sugoz!fzc59ads=J!-HU=VO|TrQScHTrDmL@ zAEvQi!>&|4a(9#p1tk={U2CzxWLryoDW%R~{9A09Ml=;ijWx{kQ2@z|R=l}h^AvvHF8X!^4wv+fPHm`dU*_icZ zbFy#t;>F8&s)yDkTSvL}?7peEFU?(fz)J64#LTX%U}m3g_kzm&gUs^``Ck?D!$Qpy z?@XLASQO{TYjIFc7q&T+vdpq|*A^K|e{*(lIrodKPM?M+xtzP6-}F4{E(r(d2S+;3 zf*touwMakO6(`H~C#1a<4SX`ur53P$dSlb63QqvK1zjx|h43zRWd}Kec8{61{LTxb z4?0BF$cPyn;AQA)sJGYelKQmVdm;~^c0zXrR0Ax{Rh{2B5T?eF<0fwSu4qTcQkf(K z?Auc7e%p)g4Kd_bt~G({<{R*FKU~pNi!0J;wLy1#MHG+>%R55Tpxz97O#K*tM#((> zEh03B&3F7YL6>Z5OTlW6N{82u6CTSPMOS(+rp#S@l$lD$Wd$DO z)%m@zbJYxx5g zYKMamcn+?5JAdTX3K&3hg%6(R@LupdZ#cie0RhuLID3vVEuLG*ak%tmmmHc){r3UI z8KP*WoxVq+1~1|GxU)W?2HbpeM4!yMgc1Octu2&jd9WgquZnS{Cs)4RCaDo^nMLDW!bagZ3Qvl_-kZEVGJJ4tD-xw<$ZWS+Q&78(O9k+{X4ec?QSNUPd87n6!60kcC))ht_djN9Q#ei z%F+B7VYFX6a3UA0w?-C~l*S+mT}LtXmwpM-mkzJc(T#1pdC(-4#GMz%PQcyu2Nr*g zG)bsm?y(6$BBH-p3%7B#rM6XfD{d@Nwmr1>6i7KVrZdMtz8a)ra8ED#)g(<3C6Aj==YnmXs?G>-|K=-PnMo(_oCC{eOjs|?oBDS9 zanvy)9J(PFmPXVAVMp;l8+RTY48(f%9-cB-f1kd*J(1=bQ%^e8)d8Rl%(Ep96IRhb zv!5V-37ExPt#PVfkJtTOKIQ=d{W2(*Hh&M|+iycgI&&NeUutyP+87V}mZ1XR_p;;( z@Tl0w)tP-c%k$T&X{v_>7Qp5uD4w>N0qwbx8Z*{9jEdcNeGu-T^|<%raYd&ZoUfA5 z)(PCa&u?Ac-X?Z$)eJ@GR1(5@2ZGk>J%lRtJHyoJU30iczOgU|q(B^jvhI!r_*WUh%s`p zgF_L_WnP-#HRIG!ttx?zaP$T#`zT3V2G>QUTnt@C&uI-9jC5iPwHR17BR+8mV3x+D}yj=xaxUE1{s zrwK!?3;KL(g7>@EL0SYruAlxs@#$anijf-V$MB0RqW4_zocz-(+S|eOMQiOtFmV%r z`i;Nmx(5RC%c{##|Fm}#X!-LSzvIoPu^Ily@P!-8EiG<)?CGQ;dP+c;L=NwyB>RvL zxs69sM?{n~|Gu31)XnO<;Ps_(j~;G`Vz<0&%=-G>hzl_>3l%MH7)nByOEaH9#}D!R z>$k^K2c_5hX3z0oXLTpV2IS9(^U+>N zX^vSZ#B}qk_0E5qV)vJ%nXgD!85MyG4~eF>Y=PKT2ieZ(=F3~Jnra{pm#F&Q*f~JR zg7<;=IOWG-p46R%$)ea`hEIm;$xg2a4PhS#p#koTkKKLy-8^Tzjw>Xeuy{gx72I6?U!YOL^3D>)H39+b48zkrx|eL# zjZvQo=43yelbbWaw;tb_`{5ivjTlNYHYCxm3s(JrFSdmPK~A511A4FI;CbpUFTBd$ z+X(^j?}(mti#r#z7oFXp^I`t-rN?ge#Ga=~vgvoh7yZY@j_YruYj)Cz2f6RPRt8U@ zX%_1tMgj*J&O-aoV;;;JcL3Z2UgXP5q+W3=O{bLzpLZ-~&r62R$5p<~M`H8O*}%U_%)+pwjzJtD7`CK4 z$Rc0}l-bev{}_PxBNN@EE`)t~N1nnPi0!?@n`l?qjMab6!PTajfJP}h z?sjDcW1+_04ly1+`AdhGWK4now1DD_f5*ZD#sz_8(-VzawrH7g7k>s3$?GcFZ|Kx- z1!TIogt#?SRU2Z}7?l|c)t#>&4CasNR$S1*XmP~v^nNV+U#8$rdstAVPi6$O4+o*p zN5LHII>Y!K@o;Dd&{ww`1ZYv;)YSGso_VmbrPi|@{GU0GQ*^3uu$g1Noc?&hm+gAC zxhM3#Jl}LRi1#_lYxk+csVB6_Gqpmn5%I?t(r93&fl_M>i+>I~WYQMR>G~20I9)P` zk=U-}L@xVyV281tEAg^j?_eqXj(ao}4#?y4*%TjK4us+0cR6I-2XT4Nb@dNh4QzXq zBHP$(Us3^N8*&5Es`I>}wPuD4;2yisOe!P7oAG!U*EpmH_60A8a^6RuRpKaYI6g71 zBA29?n34>cepjGPji^GCvM8lB_}Q{c$#Vccr00+!UFu(Rz=H8Qg%6G0{9?cUX{sp!W)hjWUIEUF8-hy8^o zbqY?oQsIBtPF zw|(XBdz>)`R=_ENirF#>ry1%Spj#7v;GqnWca&{tLJ6ze1(+CnGAB6<`CS`8An%tY zc;n#xJR7udx)O99V>0xCu%Rfv<64mM)r^e5`dMdjM4}EO7lnYN1P#tlX)8c5YSqn7 zEdIW$_kj=^BsDVe+W;$@B8F(L49AYiW?QfMsJ|=k_P0mB*Q7JW&+kYmz~+9*`QV3j zvU&{r(@l*ST9NsHB_t@z({+Q}*P6tILKVMRT@%C`Gz#jG1qIi4Q;F!gQYVM8vnZg@ zOQg4Jshoprmuy2Obpi42CrAwyY^Ue!vL$Zo>R^?cijG*=EHijnMF~Bwoh6}ze776P zlw^y~Jtk`(ZMCk4d~#-u-#R__kF}1P&X?rgdjN@lisA)u=Uu_EPT9pG7u{5AAIY+P zhqY{^NYHYm+qdu}9R!zxyL>J_vko+PgCw6bmOy= z(+ga3DFqiibKFi+o5zcxRI0XODsj?_u<~0HJSqxVFSXH{7>RNF11EAe$)e)aDaD1h zkKrlsD0@uWrb9;6bnvny9Xj|Dh&!6m^!#066aH*b9EwkPmuQ}Q5`Z?K{901TORt0P zQ$3~KW>Yk505}*~aF?v-QrPt7e&cp9B)~JEO1i0vH_*Q0-1-xxu<=48PwDsev5aaL z*Aqk&Riex=V3~}~{`IC{vvRn5C1(Vk7K4(3c7jHE06P2??x5Oj#Iss76%=PHD*pSPZ(ElI*7HH; z2V4H(PmjWZ!K82{!8(&@Qp(e5*`cuZFAx1vSH=Qp)tSz#5mtqYguqSV?Y>(BIxYP% zH{Z{)3GumK_@z5su4FSxw!){?zuys)Et}%+H1`kJII?FF?}{)LHP7;!}9GLag-hO;#dxJx3BWGtZ5GeDXYTlseDhEZ53oO)j3N1*rNk5@8dC1b*7mgeRewPa9QeokjedCo}DJB8}V>-(T(4;Rn(U@5XCme&^P47 z^7|t*!1EC5?)}n6m&J`z;O*sfAue{pl06aXzWC2VJi1iRA?b55)corIsF)J|<|q|^ zx(~)Ox$Yz)k_-3r1}$G0?)q%@KKQBq0J|CDyanuSg@g5`gjb$k&l z5hAFt4>KVL7UOvuo;?hT^-fhC!Fe67mq!TR;9(=$LyqPgxc$fSgtVoCn#2gRS&JhY zv?F)WO8@E{W>>F39XFyFGJ04?Fr7nF7t}QC?hT$1OMWC*EF$KG33V_FJci?+!Q5dR z4k)Nk`u!%3XM}lHE?J00EFqWF4$CMWL^d$$cprN+kop5ltoFjxf2rW=)_jGzIi}Hs zPP`e_2=|gS5IF%~W(%62KSkUp#E+te@N897phO>d$7Twqah;hVrR*4@lsPMl&~pLk zut&vOUB0=&UUd0HB|#cQ1qCIldByT$ZMl9*P$gR(W)||4CB-%)LkKpifLX6`!n%8P z{Wv?+U1}0e?5b65zv+`Cxl-P{X{{V@c(NtOfrC}ziZhAUK(0N_@pVAE>>*pA z>Y;Mh6=|cb4%6n+AB^X*Xyq+Ow6HSUG;$Fa=jz)MbjOrTNa510H4}F??tdC@| z1;y6_^S7M`yTL|nHhl1^1qLcoSGJdedH2QY9GJqt$ljnDBbMm7dBAMvZo>oainKc! zKCTqCivrVW*8iZA9`&ugEwk#>wMYqXpmRVD-4cypq5Ly#E>WyGBmX(n;#%(y^B|Sx zydW;3Rn`iR3DuG;+dD`FuScDR{v;Jd5=$Y%#W&PXw=j2Y4+ww$ZALzhhTZ#yxu@>6 ztuHpRD_m>@d*atGDC7ieVkNnQHpd^T(hK|H7E$|;1w?tq2&LB9`G;GS?BkMXw)>w1 z>Ez_J915vA0fnX90M=3F=pLtyExl6nG<=TB8;8=h*d=L_d484ZQ8f!^`_D(Z{)t6> zxi_k44=m~-%!m#H%sPw8zJcVC%krHf& zV*7(2U1KP^klBlJTlk-Gf^YOa+R5}*+#i{%FXxK1nr#L#PtJIdbi_7vpNahG6#;!n zX?wS;$sV;-oq7A=@jVwjoRTp8nx0eWalFR@x1SrZ{#{p$`K$3Un=WxtFehO%(_Sse z*tY=Rl=OIpRjnGIX;k8bMR5$<5qlsKjS9Vv{L=sR{ZsYR&X=~e&$^BDbk8A#$mo}Q zzn;`-v{IXeZDrVTD?cW0p~K$|YsD+-yyfM%fRIC6dj?K{mRGmt3zbT60Lf!pv_KN) zpRgkcmtyg~3M{|@9T`r#=8_B8%~9|YwmC>XrU7@}kd>QYdUe?6;!J|Esx@2C2kiC! zkpbEGYfoB(e^(tPJjmU*2G#@Zm5Ngoa*6;*1aT*i&z8 z*1`O~JhzJg?*akZ6lY8XPWN>QSM>0k73IJ{&{Gpf7KkKMxD zO)n-ZeNg8>0`~H%u_u*na|(W&1(`bIs>vuxJy(_PwHPE<4*@lopx=UGJ;Urbv<|da z1N}MkKPoewa>}UYJ-WfZ5O-eNR$TdW@=5vev@WfChQciAS4$Hp3(u?HB4e_S#y?Sp zC3v1{#2)uI8|?($2#%sbnV0yLRu`ZQ*Kgw>BGx6Maa-P#rX0DD1NgI9XLv+^Q3M7- zW${fL*nSML#AvM83JpCa$Bg63lgCyyRxY!k2SC2w2?MD7)ptqPF%0Wf)Hc7M&5OLc zd93DTXvie=!8MqltlRxQ?vh$@#DeyR4`FG7Y)%bDmQNn;%IDRhyrlTe-PZjs7CO;-MUeuIRD| zlF#YfGAahU?{!L-Up~+x+aE_$L>|5N2&j|*z1821rAko$%)eF<-g=IQk z-DF9-Rlf2l5jLMZHF8gOZCs0X{_`e3%ri`!>sO!T@V4Uh8NAL|&rsAh{xkY|&1Pwm{%H8e>UIB!3^)6Ut@hua(HuP&F+4Ah) z`S=iJ!ndFqt3}qa(M1SW%U~|h)SAx-#6CzXrvSJ`G~wWXGoGpOG&{7N6!7);lhSK2 z2C{R3Ckldo(}*oT=O`;Kny_^Wvvf4qIR<@r#CDD|4eln#h~BtsoIOcJ0Hv;y1kwiG zd}#ta)Q8GMWMd8yc-Gwc z7f$q@mm+S*a^lpQ6qrjT1t{+$@F2i5|K8YgQf zOF*2XZlgVx-E!N!(9Aw`3vNqu=S6quF9Vg{k{}U(aa)+A2UoQq2rug{#g=z0bMR_3 z(&9_#w`lZOMA%Z=R@Kk4j+agsq~jY=J?gZfFhdF;w>f^IruH)1THV{TgdH{*Of|3B z>U!V^t*&N8<3d?G9wF5MW;*k{lh^NWA8NKXzRY5wZHTEAPvycd3chln+Q7M79d2oX z?>Ptlw40L|vTQ17KW}1HqF-2*^eGw>k*BrMYB)YpJ&Fd~-wCYZJ1=p&wsrBM8t%hMUAB?8~Z@o*61U=3s1Tqmj`C z_FqK%pSxsL^V-pCb7!z{dGv|C5j_Y=yc#~KEJ}&ld>oy=ku=m>Zhn`_;z(`OvD41I zs@7U~fsCga4WH4fxER2FMeZ)#k!fKFk(#Y&jb>TnO$^qoG~U!-xY?vGlg6;HV<}Eh zdOZ64{2V^UARR#4$AN7pGQG7F+D+|QJuZpzHJfx5R@2{5zbh?hnpwpvk~zz*p~N$O zn5|;+oDqko-Bq9721?5Boly^UW8##7U>skFAL*I=92sfZQqsN)h?G`YY;MCfmJ-lF z9N?s1&CgRmU+Ezr8GE{PyJbcTcxc`CFIW}#Jhtn1N&nHEww*gUh}6bjaTPK?q$g_m z)FKI1_w0{OXN!%VdF~9?VR7>hD5R2l0<$Wij_vwcZGSuPZ)(ipyBjX)R&+KY`FjSD zjV1_*53W1i=|%not%d~wZ@CA}=|yN& zgj`xwN;}d7L{wW$JKKY|gVzfyb0SacHg@@Kk1yBooN`L3O>Ilu?Y`&|H>lUt)wKaW zgqIP`iY0eIy_Aa)f1WSPe!eN&_3=^#10VgIc&4T9hguoh>YtiW-s$f>D(fMt=_R|C z%-GS2LalJc;_j6|(SuY2t7WOz<=X%|BVt~B#f)ULj|Y!sc#?RM(*pj?-7wWuy23&M z#XWAqV3woBvTswutVm$$!sW2QUwmn$5n2hoiys_+AtWI!!9ALs5M?G^KEv9CQc2Uw z?`550cv&ks&hh%$F=LzDylQz^PwO6tim?9{#PU_n_BCJ?4oCOkR5~Vf*YJ4uKjT=P zf@P3IehMe{K5?=hg7R{Uv?=bwiy(*At=k{(^%lc+zV&Z6JB3&q{XHIpM%z4Y6yC#L z7S$dY2!C`Ev|&(CAP=ITD3 zgwN(AXmjjfqG5wXr@|@(%J>p=V(>ebO7ZC@{!N1scOjbpd$zM0_~&P&u3sK1?KmjM z=kKSqtL#!@r99mDDz`*_7(oe59oevpyBqWE?RWw|S=>@9B7MP)gdF?B7hX8ScORI& zxD(f*aiJN>k1#+kkSr3IK9{{F8%Izco3aIOI-gI~Yu&`rxX{CNh)XG+_3#3KXTUTZ z9&(COqpk2#>mRbF=yG84=ju(5iI0I)IH>iwxr`Dh!FK_Vr~ZXA>tR%E%RhYEb3uYm zRB_IAfhXM-ghJmrXVC?D_&J%LFjbRRcmGaNT5h445`-gigmL^k9F(v65$tx7(YD0E zs6>Bq9@OF_+ut|lO|Xbiu+RNbBnI#CCGRByF##_(wI&eUcxr(&A-(CSQPS$FwK(*x_NOcz+DcYp|jZwBcGpTzY(V z@C_g$IK_J%r}PH@23kGGxbw%(v*JS%``5kUkfK?(<*t+(lp&*los*zVWmDN1$4S0i z{Y=AO9ljeN(|(Jbhi<+8R*)h8Kq|!2ghkC6Tzm6N#@Ok@lFW@d35UoMip+ab(60c$ zUrmgpVi!fp(bm}C2YWmHTBa3l1DertQNlg5&7aoui3Yk{R;$;KvzUPJq->s5>VcXL zE0d6JG2-)rpj%eV$x+Eg_#1c34(5`Z4zjp=36IUli#p70ysG(ut7OB_Q8@_UP{A7w zT);}FPd8`>sPsTB&ix!xk!N1zxzYeN6zb{Xf=Bip3)YgOecLTH*X134j%s0b&D=cW z1ZNZJVk`{%sLbIxGWWY5-_4<)VzGVyHuf*r<1ei?rSs$$W9|>+eKy zE3nV6k(a4i4_eHdVh^_~;%FT(&<||*|*qZAh?COH?MmC@Ghx_3Nc&&@(Ppkdn*kE!ZzB=BH^0{6zBP7YN)k^ZcUh# z(eKlgxFf;m(|o_4NsgihoNs^E(FEWr4K7^_8y&-Bd1n?FeyLXpGYi~75JVqI8ln1T zcD*E*ZSY&RjM=%5#GTGf__XFXe}KgZ7kvoe%LI^ax5SmXW21D)NF#BWak!Cf9Igr1FGuE683KcU~iR-j2nbiJMvsDVP9Rsg*Rrm01c`^;_*U0xI}u-d?=_R_wS_7a1H5g+}lM`1C}z~K=9Q)5|(GDQN_hDK{sHk z=d)-C4P%Ywq_wM9HJs(6772y}6$4m<4Eez1dFrJ) z(dk^v%6lC~oWy0)3#)P;+S|56KuA1AhgZP9iA*haHHbo2*32`9bMuUNw2%R>=Fw!p z^5lU`FAf>lD;MYzCS(hjvea*^B#vwySBDN4Odu6UOub3?b3Q&#OOSYy7U>%2)1)t? ziM^r2axO1YSLR#3PQY|>qYA1LfN;ns+E2*#V=SOHrq4#>76Bgb@vourSQdsPwq7(; zNH$neM~SG9*Ohs_ji}GYci0ZYwVNoCQVF;rTJi!#eUoKdU<#{ihj|H_0by7u-u>~+ zUaWgiMzbSAiAdbpJ|%81#6T-=11r7K%_PEjJ|c@YRaYN6-sq|-{2lFQ$Ma97^io+R zQ?;Z3&X_vcPqZa79lcW1P6UosOSHg16hB1wE(;gQ_iZfU;(FbUAApi(|6pezv~?S$|AQ5akT@eQ>t%#$D9}uzIoh zrv!&}U=+g(K+gBwpx%$^!?B`eDnx%Q=jU-}edfMKirAt4`LO!d-wx95mg#Oex3-_=;4P)F zV+<^7V08HCj?FuuLa?5fTkMkuNyP>xaV+m@Z__p$yx!`wBu5(i4G#{B53Ck|pUNZm zjgoan?HersinQXn~HkWDZE5fRols*TwAe!-h<6 zO>RKggksBdPr|EH?5aq|8CsSEVRNL~c}UMF?kxH{-*k7z$IVNDYP9;WcB2ZTZ`{Bg zyimE)?2b#z0HJiV9|J;em&;!8WgjY51*_l*6h3g2iKt#EUwHHB^kxegd%eE%-}~Ik9Wxo>#f!CTS}8jm@E@GT8`QtZjB$ zt=uO2vFF3yhsD4f(T-b-xjW*kxsQY@fnOVXyEmq`-|g2x>lsI4;u{k(t7`}K2vQIx zzrCFelVWBJU4NK=D!e+^Vi@56^uDS@(x}7d)9wA&#Cf#qf?{3wq=UI~8jGg$^__-X z)cu*-wf)0W--L#6tZFW+@y0V}(SF7tw74N8z%J9f*onqkuBThxV5T}21a|~{PPJZ4 z!Zfy7^X5nwC=+1Z^OAv^yW_697EZ?wl})%k>)>E-V8`@sc%Fy;;Yl5Jp%l)J-5K>9 z#N`fU_@yI4CGOcA-E~XsVJDBhed&_c3aT&OCR^CCasExyorZdyHv^x&6(*BkU^04q z(dZ^0Sx14^sZWOO1|4PX$9c2dEN=bz>qhxiB|V9Qshh({CR7Jp#x-!?4 zg|SgA#)-y$;PP(sB9sU=9XuXV2~A&8Tnl{w!VB&{Pkr2q+2>ELWhX2WA-{0YkPj;g z26~d(5!QN*I<-k`FV~yTQXF_2NwjA}{)8NRA|Lj^=zHZ<68WLu9&X-DA)6{5d%+*? zCh!D*+CQHJ>!_{njDN=l$8UzASe34qm-n<BxWubvs+{YH_TFInaf5U%H>+u7 zU`^m~|K11b@`f;xi|%x5Xzh~0`=$=iMJgVQSUteEs^F7|NPpHJM$SicWn@oF7-8P;_ z)|=@O4mpYMUbi9Y; zBI27WUB&CrWS#m6ucPznXz71#sm?+QP+JQ47CnzQArs;4o|Yyn_!f4PVi>}7=+hm= z>iNXu%=6%_x#>p0OvHQ&rzS=LRS$UDC5D=>J}yUz%&>&d2(Fnz9)|#)M4-n~>6Y}A zjkW*z&B^J7b45|!aSsugk$Jg{$9m{Syw$)N_y8oL@w)Z8e_v51a3oelm68}AlocFfHlJ7bYiIpEntTw&AXHHc%tav|s z`WgfydK1hTvR`5_bFrj(HRl(*IHW6Lsn`)y{z>TZ44U6Yi>;VYB0AsaZAUT3W7iS< zj~&c)p)sdlqp@jY)10qZ0+SqovB5)wA6`3P52c0{o*VoAcpUFu4ayFbeBS<$fZ}7^ zd$Wr%py&0h<9V5Qy4RJ;lF{5on4C5g>gR@lE0KDCYge9|DtOw#ma(OuMm%?!kn`hK zN1+MPJt>W~jKS`7aoQ>@4@-e>o7&`z6Pj{_X4|mB7NYpNsIQAJ;8wSLc@ix#?}lkf=!(k!A?v{rFA>|2PJmhYVuV&YtytKydzwb!|vP4m^#w0}--) z3O}5(0OE|59xwkS_rMju-J27>C?28pfKCDT1x}wDN5arNJYW3%hBle#^)!n2($1h(UI2Yj_B6w`H|n>1}Z zvR@FB{^p$u$#rhw?sX0M1Gu)N@6CmlqPqOXCW)WH_k}I}2R?f$KfzV>QS1PR7^@aA zEJx{atIBuJ=*L@z47T;zFS?&3^RZI|Z0oqGzv#;kC62c47D2hkE==uQ?-CY6HGG-Q z+1T0^!*2h0FB5t(dno&sALskH1J7DoXUwtY^vAayImH45QhL5a3=?-66iadlOHBne z<>ZG8?a{o#o~JcJk6|yd6BP_TvQ@mV#Qm#6h3UGd>64uVQutUGPH!*=CANe4p`vSi zpd0L#Blz*3(D=O8K3aP`$Sg{rXw~W;Jjl(v<#w}}p1X~Uvb$eG?$&3%p5bez1~1Y( z4@cYGMO{@FJ5|je|Kx+T%bT-f>Q2L9rS}jGVgq?o_38s%4kQ-B3pQwW>p3VdYcc zj~xvny3)0NqrLR;JGl(&c;z_T_I%vy_CkS)}Uc$9;78W4E-$>-O*&8%EonL)r9g7Tw{-+2Aamm7=n?Pez3Olm8-Syn!5{PZw-allm1= zEcSA|IrE+(b#>{*4hCBeSf+j+-qsC%d~agye}KsNwm)Otxh+L>Z4HK_fP#eZVu`>M zn!(Fgex=JfPeaciYFWY|P4^3x`R?N2KXOxN(&VTL~Da5viTIv-~(+S3T{PR!)W ztaUnXk-PnP2%~rTEji~@2{`v;7rXgB3i1xki zM&o)bS;xG6WRVDG``TG%Fn`2pWW}{qE88A-$UoOc?meYp7VaiZ|}c3_vUin z1FlVDwP!CDj&D8&wT4vbrU}%yEjLHs5%>{fn9sr1CK?Y+;y~ZGwo*OJ8k_`9FmHKu zKFi_FPv&g!yglv#%}_6~T!Fdqt~do5tqHDJsk4ra+gz}SXCvkcn7xdq&9h(a)iF#j zKW8PjN0jE>5qv*|Zii-z-l>w9!4HW%I(uTl>S4B{$FS5_SLpF+~PEh|Osw?s@_e zjJ#U=bak(qY-mH*9>lWRmp*UIGGCS4H^)*3w`^q|uh6+$t|VL_!uPPPEH3TH@AA(x z2jZ)sDja5~HFpj9=~dTvJ+XRMSL^%Wyn4lSUBK-mYya3qna`A{cJ6vwu^8LN^XMv^ z(OYo{NW>pus7CDCY<^zZ^|!djaadQ@`|y2sW{gRltLsS=6+e#ML4Ht=POl}za=tB^ zzG!DKp|O<_O5yBz@yp|>R|(iz9EYB^e5=@ z3e=}RFJP{aMld(Jo)%PWNg4&D5&@*sf5;!|C6&sX|8 zncr5eI$WC06CELh&#$e@2l56483B72>wNHW#7;n}S@Z*LeuRm=5CDtOZVV{>vc# zvy01xOaHXvM)7@Cg|?e}HS0mK2lx523S3~}yeAR-Zdxc$rQ>At5@Ph1d20N()0X)0 zGESA}N_sA(6(2N*>>m=os90>2a#}u*6_1@9#miLP^LVfA>%|ae5xx@XZ0$3(Jk^hM zp4AnKG#5Ga2WPh`5c|G5MZTlVbdq^?Apahzed+S_`3JO{N7&n9A5H-+PXvi?jNZV* zPp7_Za0m})a&u2Vw;K#>#L`0<&D-Z~79{O_FYp;)bfnynPAI#HhPcw5ScJ8;TMtWp z_Ex(kJBGEbl|Hy}YePRcL~fI(@eo{u1ZFpW7`|DHEwIj1mBO~vL_iwRs%&}D&Jp!z zOsTJwdMx4K?(cQG7uo=hFDY}{m`!<+sq@!+<9s+QwNL~hRe0Y#o_&SI%(%B`itXjr zcbTjPp3KbOst%HN;1(zVrTYXQqPMuo+ABYw*nAQCk(#*iB@Y@N!|v`bpC_F3rO(+a zcrv$=-TgoVfD#qy%M52v)())N%l!=s=g}>#S!qxv6!YSgKAZkp)y-WO?>n4qRP?=W z*)Di7-RRH9$tznCcR!zKZ+;z?JmCeY70`YAVRd`y$2wRjGp2W#t?lmkB3W#(q~}oK zlg1Ep@>ST~;b}rI;5Jp?Lo&}V_U9(~Zq*>0_Tl@mVg>#iLBiCKm%ias(5PaEC?sxu z@zlNJ)MpK?#g#KJ%gI8@XZB;WIYTZhvPsiXiAw}m+4p$zd%9MmdXAsbr=W`59;w|# z=Ncuu{g6gQwu;d{#9QKglRrsO=B;=)G+R51bkFs&Cy|l`?;lseN$6J8V8t0@Pd&@U zs6Z)pv35y4yC{`@hpHmuAXAS(JxlH&-OBuzkOLTLoDakls|o9KnGN}02BxP2gTHt$ z$k}z6I&Zf!a!BHKfq~F(JnBI3BN-T?S6QMhHTNUe^@KIKvGMiWR08>2hLNVNu5PG$ zu^NH~>KB98Z)#eRzmM2!dx28`b-nu3erbZdB7+aY5KK%%9x%p7J`xIjq8|nHv8L#K zRUL!-FcP&uQj z5>)FX^Eu60B`T2FAWK^=p;(M@#%t=cL_}hP;O|+Ozwe=woFtCIpOKX{L0Cj&OzM(C zSYv?PGP4N_9l~g9v!K$`o4+9}GSZBgQz%FV6?Qx{r;zD?Zt+_zg(x4$Y38pOOoZol zv?K?ONZ@Gk<7rg5`K9Z_v<3WaL!Zo;LJwQTPVtMjYF;fXK{s(*m(6lbym)M;C}n=$ zHqJ{L0fA>s{_+O*k96oKvlqVPoe{mG7{lGaSNU6I#eev7Cl_4Mi5eo|HQY0c-KXJU zJ>ko0}1@rrXw$iY2ahNxZf#Qq*8IWt%%p#|w2n z-YAXXas6D%o}09X(vANx5af$tNANjLKs@#}5ptM{S_M)bq3$=pgZ*u@bw^^5tR zsJWeXqN*x%J>($B-OH*Agcnm6)YHyy!MS}l3ksCFkTA=FRk~zJ+yztzL{f^nxH3XK z@*g1Nw5>9{ACV?Dx2^UL5N#I5rSc6<+|!a1dQfuvCS8eapSjtnwT#s?TRidUM}HrQ z`bS)cUJKm7qSRyTXpxG9cO^OagLu3}!NdTaRzpk#8jT=_&U|VFI^BroSFU>VMav-q zY$0ew{GuX+!X?1ZC=+vS* z+znes1`)9eIUx0lsS#fcMZ79F>*-n;lhL$9(3qIa@e*q>-eR3hCg=>ph_DV7oIP>^ zr5R$GdM+MZDZ!W>fA9D26ItIL_xC1^oV}9~>&@1D9$X%N?dq`VOyAQCWiv1c#bq$N zK-sLdq|?}ER(^Y+8A|6snk~@`p93kH$ThzJUEfPy`&a)xxb?Ribeaef$>9iNStyMX zES2FjfDSJdM5i}RM$fwzfK)-IKm){eYK#%xJ>BN78~JDi1bqRzuEGzWjQXZOo4f-} zJJG0=aeCieBRSsU2isp#543RzbaeV_t@^}6-hfU@_cqRVba zd4zp0^0(Iq(jJ#Ti$0S_Ot)?0njb$zXRv30_S7xEwpd|m+(LKRjs&fFJa6cx@tJ|G zeq46R8x&cbz%m^~kv`U9Ex@kZRqF9{F+cu_kcVBa*Mu>;;Sw{TfTw^x`k5SV)!}k> z=BtO%+*4v6Q^#1rJ1w^SgZEYXU}u~aCdX@o@sqVX)y{*4s$W%M%9M^_DfxVN^heES zN~f81FocUN0N&<*AL98ZqQeB!ScA-qwWww;RcL9S*}b6Cfk}I_(tkiQdn(V1{yx+f@gw2XMuX6ecfudKO=*d}ikT|5+ zXuU{=1aNONBHmsvEsNzl^R16B&i(NssE2bitv-oCqKpTZbK(;GdE)=|(6IektpKQ1 z#PGxby|>Wb!ywl?nEnD?)vzq7=Ov&F!6ADXWkAY0G0`P7z=MiAZgqZ8+gDwCCu9%5 z-5Z9>VYhwle|~}4ry`dNDf$4I93Zd0v90FUKv1y484B=o8TAj*I>ecO3TgHB$kWGG7j1FTYArvuK#g{e@@{UohCK(M!u))cU|D@P;X0o{L_pZB|cC%q(brbb& zr~FH!OJ6~snB1XTE;YTTnaOc=d2m_MtHt&*Xk=ch6+)oVDni>fg3D}i60J=fhpc_6 zl&`>1{UZLJ+kO2_)pNScq5H9JxS^Oa9br(dBs;%K#SnU)Qj{rzo_i9oOb0ZRfJv9Z z(RxJJ?6YNx0WYJNID{_t5kR-uj#|8bbHbtM|8!qqp+Qb1+w_+Fgy$MaZ?UzqMq{d=Zg6U*O%AUpvp4vm~S{lEQ)qg~~v;C6gFtf?^FLpN; zDF~?Q;;}=={0v3$VFQ5E15`sksF&6e2-7rNqN0tl)V|9!?Sh}@hJ1hdenX`S`NMM@ z(oZ^B()S$B-?5guaMuKGzXy^?lHhMDJR4Dr{ycuC>$8JAd1v7be%Z_RQg1tfB|H!m z2e`ewqptU-E8)Lf@J5lioWD3W|1Z7K1{7EfQ9;n5kAdSx?dRJBArU1{_TOm_t;=J|@tgfsPasl(C#d+kz0BLmU0QUF<*Z>!zLninNJ`|$2D2f{l z6zu-&N4#Remmw+}UdT@u0yS|dU|($CGlTDozmaAh;DJWO%W>H13-5-%Q1tR@%fJLl zJyo{8a1UXm%Ar}9rJJNGi!etCmLvuN7Yd|MBO;^oAr!#32R;SfoUSPt^+n~9O2mW- z0yh2)!Ge7hM8erk5mrqSDw!OvQ}cWm(>nNYk$n?E-BI4J<*xe@g4>xrp-9t7bXp}6 zu>=VWdi>nz-mrC*Vh$Jt7(PNYDFzV2k`3mZMImY>io{A=(up);U(_n3f13T{=Yl}+ zF_a1-upJW!dOomJFbo{wa~OiOR{jVoZhs6LJ~580utKkv?)&YI(AwtR&$oLnR5L&Rzjg~vOKzckqTMd_c%5mA3B36%VplVLqyGg*iTSZ6>S3v@#52vG^Q|? zXco3Kk!Uaxn&E2BOBd2^qbZQ=Z$$)9Jgi?3`R(WA>W=m{dKX)KA5*7EpiGz}kjbg= zLI}10&SC};C3pcr1T91m5co+hF@CDnc0xxp1QoEFSogQ=)30Uv568bb&D!~LcYsg( z=E8Z>@e}Wr@fLIXP1eTS(7K2T{PE;Yc~G!RiV9{^m_stuv-qD0qc%MKEB?J8zJ-`907|VKElfj9Z8*ROQJc?D#hy)41^3Jh%>H>q zAQFI?(pmYINwk0Gq1TLb*(bx?myue1~ir|!t)38ZbTi5bLHpq~X`I`C`a z?|Fm2f;)}^ym*Xk;xj%i(9|WQj*0fJs}g=E-j)YX#>^P86gx=@)mSEj8lXMmMo~mO zf~GTo^T+4?WfX|g5Qb=b9)z;!Vf!P5heEjWtc84gvsj#&)82<1jZ{bJS0jkT z%pRB`e%iscx=yEQU{3TAN3 z7{5#D?e6W}u|Wu74g?;Ke+&tFyrf{C0OYZOp&noN!Xape521*u46Tk)7knAD0MXod z$ph80IB*R=#n%Po{Ib&`cVvm$%+2YH{w{<&0mi!EagU97`aMjvkhQ{b)q|o`R)`)N z#EIeS#8hw*l=7S*CW8Bhi0&+>I@L+I{&lFJmd#NVZO9+@6V=Iu!r4n9wrhKBD>-hl zrM}s7Aq0rn!1Axv$8v#1mGX$N06;GY3mbrjtBJ6{(wT9hBJTfH78_H6+tRJol(;WB zMO_D^&<{0yCxmKXq>YFBObizs>Do6jh$TT4lw&>ya{hG)`kgHUobL6J(fL2!a$Or{ zpk#K^#CnZTL7 zaFKR4AcKJSsy+VtvV_4qX8;B4=*Qk%AJ%w@hcMK@Z#Kl#!a^V&8p|JLp?zbRMDLMkK}nJ18AQ z4c4cAS#*k}3FVKpah6RH*Gbbk`sgm=Ifp3xCMuL{&t-zBuXd;!f_6AVHYde=fzT!6 zU7F`2=hrlj_J#(2m4gDOHEnpAiYd`;j$*ltN{>46g}+-!d* z+UTLuU&kNqVPH}O-C+#0l>UgWyDAj>Q=FPZL3p`^{xku0s<%RnpF-lQJeaAs`=}C7 zD;AtWufFPitCk7D$24d@XLw`JwRR7LFDhwzizJz#8D5xdidoU(#41|yg zCU*Y#^+YT=yb<_sJxeK*zaVDvBy6_-kIyDkgULRAcb?d8>mX7M40hL~!o@)kWL_cz zcmrW)r}oaLVVobLNZGsBe$@lXNgx)JoYa)~dlvNp z&k66*${#BOp*X31SoGi#CsZJ_wi^Z@_YrR9X#+<~3C%E{rKTTcFF^z6+mmhm?A>P+ zNm?77g**coPC0p6;TA`~oZTBZ*XTX!UI!Di;y>&Sx&<&Wcy;2vV;-*%aeRCDA;C+( zZGQtHGT}YcZVxTk5hlJZP~3p?utOO4fxazKf4r&wL#H`m(T~ z9uX6hM1=k%pUK~g^oWfNG0Q+h6A_0v55)U-BTCx`f-!0u%nA*DNPmL}?&Dze2@q2W zR{w+wF38G#TsT#82#lSg?dhar_U-~SfPt_vmdUff=KETRL8qzM?saee`tn?FK1s4@ zU!=S(ty-!~zEo}SwnC#Wq}Fs)`ucFbH~&1!^JIPXs z6=|=K;4h%LLAN>~Y>W%(Izjh{Ysf(hLZUaO!G%ivC){Ymu)z?pkpMZhuqOt^T6Qe| zOY(I|uHAI*ZRbJ0eClGy;4E&Jh?l!9q=;BIcJxeU6Ik?jYEcIqB?_0j zPGZ0yfiX;aZAn}X+k!@$<*C7V%3dUmvLaA>RduY+*uj++0S=DzE^}1KT-vT{-`a&Y z`z&grC`vK((!k7unE>oi2KzKiJ^IB6LKf>Oc6DO7kW0Qlu*iN~h@Gm39v5j9L^+MA z#Jd?);2(jWW|110?b;_TvzJpS&F&-{i-qOJnq@expUGvE?=QB+^m%-qngO2MLy7q$ zVi7=yuh~8iQbDaK^^JLh|+Ft!n%!QFDJTb05VCIJEcl2|!U6o|5#51ESQkOO|?!<5HXc0L!RfZR^gh_9G1ui^G#?Rs%viV&pC( zeuB=v8Ud(ueWE<##q{-_2N=0>3fl)U0z&P}nMP7c zi@j9zZHR{!+C1uh#xet;egD=x{Hx|+egl?tCtMdam6`&vgg>fG02j(@EJFqmegp4} zwYT%LA%s$c8Q#FD0P8Zi))Lub6x)A9R?tjN7dDl06ntYJB)K!DfYbu z%^u}__rD7_WwPo+EE&hAF#%u1s$8W#u*_GfDWRRf07k;}D9*u1g#0acbsU^7qb@Qf zP$gu{4W8l;1Kk1*%Y+VOfC{@*uFDlJYYd9}(Bf!5cl0rS&^bGkUI~urhJvbC5RRzl}B( z`vwWl+x9YR+EA(pSVjE35rx{~fe1J>hpMPh?P}j!IgK_vC$)jnCeiYXA;G|uwB`3l zhOf7=2GPLh1(*yaP{k%y~latB^>Ej~}uA-6QzU;lJUofDjB2gte7vDw8Xbe`mt402WNN z_ujrhooT?^AnXVx*ZfEifRx3207&JXs>{`lc%nV)kP(Cw;u{ii`IPoi7d&?k5=meV zu`Ez1B^;Gfc|41+H)8L0%~t_b6(vL;e7rrOdqk8^XP1NT?NlE@;8+p#eSK~+N3?4_ zX1`|^(gjkiO3;>k#}PpnHTg>A>vlFD{k;z958i?0?@Y3eA9KuuAyIeRodd7L8H;SB zk!B=j5P{eQbGM$W$C{28y`|x(E*j(#WFLqA%iSaell%9P%c>){pQctklHQb}FYy2z zI0<-sWal0Yv|vU&GPzx78Vn9|fOvIgF zqg^7<-ae9n`}s7in@j)dvI#x_JFmvh&KM*3kws);xU}S}V`Ar_4d0~KiiWzksX!{- z0Mka3#2@j(a~;JW8G+!1ra|u#n{fr%jwNRgjZFb9|aSiP}y-2ZZpK z+;Tt`O4heFoi38AjhTp6ft0uw@w_YLM%$-Q$dZ+a!9x~dnIJn^>(IMl2=W7P0tw`Z zR0CZ9EGD>7^jjE+i4)jQBa2XLyt;U%vQ3GV;NMqou3LLXV}Z1tafDeAdna>yCRLfU zL*?rll&2Akw)h(IrZe9d6JV_dSr<4?^_HoEPL!*{3**y77=bEJfSM?i3)+$ZR-#6m zd(Dg<`RY=GmCV+9xVWJ-6@&mM9*^r0RRG~d&>S$tib6JpD1Z_|=&mJLQp)`AVWz)o zt>g?rs@PXy^@nAjy=L|B(v2sz;MCvj}csf9%lS*#)O z4RX71baM!1D6j$5xODp<>!7V(XG~EdQOLr)C)w;6F1b)d0+d{YZiC4@F|k(YTwtG3 zb+71Rt%=3W(PHi56DVPQzbLW9CWgVJRwh$QCsyAXP9BGTJFURxlNa{y4hyJ0F*IOK zc)fHD`q{-gp$c!vUg#RR0vs?=v3H90VYkd!B;}+ZB57ytZYTM8f zh9OL_WJ#!PsOv$X{N8G%nJJMO+~T)EsJ~)qG5&^{Q|+E38bR z{gR?ALa<6S32nULxUdT#RIucHb}i=LJSgUk=||Iz2A{{+{;7_SP)0ZY2WGZ4J<< zGfmvjSZ=aQ-p@g&Q3V zynirpeF$Zt&UY1=5i!MuZBRfh`OaFZdLNB@2DVzf+Rl0vS^Pqlm(skmPx}R9;o6I# z$OG08swYyTbflPlu1saqtYj@*KDv<{gnpZNJQh1Tfs3EqNOh|Xg5!oDWfk6GJek{RRpvEIx4jj#uqZ&~S zIH~Z@RLTjW5g*^zs6T#wpQxeH!f^T8`)&7|JIASa%eUmjL>H3F)dl$s&hyx2hpm+` zTqXi}olFD{tELHqeW%6nDLB;VK_Pshl2s|5ZZ~;_5E(pM1|v|KVTkEO2=Tk#Hf^fA zqtjxxT)XzZ$|pqdJ;(G#e)*~JLN*3*ah&b_8X5q-dRWy#kmYqTs7?Oye z)O*^*oP>I_2{I87WJeq~M)FUDJd#DHeXc|iW3@Plz>f;MKl$wO zl|QM^?gEts02XU^H6A0UFDIuV<32Za8z0vmb=UnoV-gvAZvBq1EM+tmfn3g$rf;cv z`(@#gkR-CGf_BHVkw65jp)kKd1IA|2*me2$(*9au4l-Cf*1;5XU~*`2_s8V=J(ZKY zXZ`lgx^R9h?85W&dSU7$S#)`M`Tl4~>{E-*`5aDm>2-by{bLf~az})jE04_5XYB5h z2Ie(}9*&?R#)p^N4gs(2cY5J6LX)6~!{QH8`m;7^rY+2HG(|4@{0FEP{EJ299dJ_tHyh}vBTlrux5koDx; z)_)`^Cx(_8gj$O{w_69UxILlB~*U9P?_MwW!8`s=Z8 z>l1@+go6V7cqUY{2$*)!H+_{}^+$=?~Gl?aiQ1pi=unJVAyGA$}N2%oRY3j+VugGFL(}ajJ z{j6MaHS2~;3Ydu((L%O!dE@AHzN#+sIU5?15bzj4>T@V}S2HF3Sh=I4b&=S_J#wr_ z>{6$kpM2!9;)t}NkdbRz@XGk{%a#0HN!GnJcqUzbP=n9SLDBCEK73lVZ)FdjWC}2# z4wOL~pr+^c++4^Z@nfM{j9C>?GH{O>|o`Udmxr4#yJko(8&LlsG z@2vCf#!k9jj2Y@@TT4$G-t#+DgWa*rMfhm6*gJz7X?b3# zihB;}1PTOJzKM)z=!Fr<*Fu;WmX@aPY*|}TkIq-$o8)DKUN?qR7bc2Z#3^8s$7;#R zT_|EYH6`?^860Ss3|#F`e|+1BeZ7kXeN!qe>NdPEV*cw)F+ciA$Lq`47U3(W56=Kc zNXNBS2Rgg$0#>4AN*{EJt(Ub=<0TbObZz-el)xT5Ow(@&@E3=8!d?sueOw9_EV|a2 zQl89~^f&rAdA+1B{;`|(J>kr-@8Hrjc1*aLKAcLbd|%MyHm1aSpK#}cW1UTRIX=}d zTS169fXF#{VEokD7KL6MpacugJ*!RCjPD$!+^wIf%)y_;X2JiS2B4XV-rKSp+ z#k(>C8An&@>8hNB^}U18!}j`_d$Wbv2dsG<)%_q_Jbzq7up32#Q}inWSsuOUdQoE9 zIUppb<4?(EP;s!u5fC50XsbkPB=jj?zi2y8)-fcP4rV)D7_A%h-8+(z!UMFV5^91y zwW{V(?I}%-+VD{&CRv{|hxE`Ni4 zdzsaWIBYR--*d*=_L#GqPSs{^{`^eweLe)5d=T>kw(&x5jy7RHNyQ%*!P(@z%&23)5J;H;;vj8c&Ag zk+8(^;D#5^@u(Z)tdGsPRc`lnF_Gxs_woI4;r$!iT{j*DABmWIXU!g!Syzt#xQWi| z(9ROmv&!oDs3OdiMXe*ZKojzq$nRgT_%`>P_eNr~)XM@i`qp|tIa{Cp*SdomMla-K zWrHyFyqLzW&b`+`4WXWK-Y%HVcH*Ba!iZm*GR0G2SotX`-^GOl zE&l^c>i}&n2v%aO(N9iW8;6)hB2{ydx~X%0{;)bR7vf7Px-yCi3S%J#)EOVqOoyek za_z;to_`r10Z?xpGLgXP3h~^>(T?nfbA**!2I>3&dJ+%3nkiiXa|9?#`|cj-HpjboNArsBIr#WaTocY-ZI zxduc;`bd3k4xJLf<8Fb&N8n*Hwp;J@TCX2pT!Y#3;cDMKX8qgk58RXX$CI;%!>Ul< zyHH<1tJ`VJ8V&)cJ<$`$_bTw^gf`ZDV@YWkt%Z9k3zI?@nWh+G1i}2(8e-MXna(vw z$M3!#1Io!Ep7=FiLiAVfyQf_NLMcT& zrJs$qtD0Jf5di~7*`rX(ccAWMC}@-UPKOwl*e5CLa~7e6ny^-*W6Pfl^drql6{I$+ zW63ly^rC@BR5%<6m-U!FD=&hfH>*`VdfPF9+5OIpvb(rSK4dhF`Kl(nsT~&qY>BrI zvBb{oUaJgvb9)=A)9M-w>J^9w$FTqe9v8>Ow~r5Izc@HyCv=T_?XYZsxLu9*+qZAe z*B{#XSMQn4yE`sACGqUgeJi>ESdLyfTUP zDcN#vb6)E&al1jr+eggJe)>td#o@npKjyaSI4*D(C;&KZyOh5JaZ$oA8#Vm|k!y&X zp&|HEHq<39%xZcK8iJnC9DfEXC-^)TSbYPK9#KAIo?brmo0f}cP|;QG1V(sYvjR&j z9$#*07Y36HdrYTGj3DlHF6hG4ZPplp%ABmMXdQ&cTzi2?{8(<-$NT#*T8-A>KM5Zf z`ZsAecI47~zFr?1rcnDe(!Tjc?r6mtET&njm^qf}8Vjf+zuNYwiKMCp!oyW`Zbk+N z7rmRRVCNURul(?OJ(E=VAxh^27uR3yT8D!@Lid3gLLI}h&Y6^(mET-u!iUH8i;2eZhTWaS67~_u zHr7N1=i;3#_Utper0q=xV@pJxf44iqn*3Qim(Uf~L!)S4MX8Osq?X2-kJYerH$r)O zjpEDKP0H2@P=n&;pS4d)sdR9Ook>SBupp*ice%IN1Igc%{oUK`)d&W1XsH`M}U=Ho8( z(KO<3C$7H>z5snS7{T)f2D zp-0lBL<7UPwdYg^F>TL451zjo$;9WteHDM}n^-5v`^6EWT{uTYZ*I~7B@~QU<-NW? zh!-fuxRB_do+u#526aqxPmWz@ZbZzvHCnb%6^bJn51Kn)1)cTX4>BUZ4RhH7tTY4a zRa7h&;SIQlZ~JiVf|7MTsR<-sKgD{H!6PDu=sh2NIB)F+$t+Q2i41I9nvG?IpM(yCuNx zut_^R33s72nizBOS~sJnK3@#~<38kOCZIZucd-d+>y$hjQt^ zlon@2@Wkpi+Y|G?K3$%#fWCxujP(0!Hyp$Fd`j!Z5;_L9kDwmM`I+Z%Pf|M0x8T-) zBh~~z#Kd5Xd46(^+wC%I1m4V$l9u$+g?2-rMSn9t%Mi;RtHdyiV@OQrfk@{S-t@-{ z4iX#WdU9Cev@bBxQ*K8KHJ!Ovgbx#;;IJeTig>*4j07U*n~@A5zkqy0CHp~@_xnrZ zvMt;=@1?B!(|P|}p4i&*tEoa62k|%!Aw;8~-SzFRr4gcj#T?o`ulvEoycrG_-}&cZ||n4S<8n{E!|I9CgABTzX3b89#*Y4`}{1{U0g>I)VV)8(l>!gIK8jSxL z$}%TLZ#48V*K3Nkm-nLlKphzO)5L_0`yC5=5k>k+%?O#K!|?Ej{9gYWUS_>ZtEBgt zRrgXR9;5vV=WO>=&ZACaCr$Mgg4w%zTV~9_#4AEM4F>V70_#43CF(iq4$&;-3{)Qq zqqhQ)9Lr&_>=uj`xRQtY@YzrvQNDdey2(kg!Tqw%OrDVp3kVm$w*-o#DIGbWRzo#@^J5vy|fNRE!uKhotcB#0zE)_CE8Uv=vp7qQ>%8jlrmijpMAk zCpi34{7e?o$(NSvMo+o%r9VaR?p1)#TYVEg5w_;*Mih-qm-QIf+(_3c2L=%h)9L0GP(g^4evnGaZY>NCFg($2cz zC!13)FWIwH)3fkRK{dPn+}MHM$u(r)QDnp5!jPw}mSmW298A`Kn|rIjb9Km6&z20r zd_Ym}0+(zmDocMf_F7_nbimo>xs%8UeE%k{mDTGqeJyH;&!msgxf*mB#f9K`W0=KYcxUWr07i@Z z!#gh>wsJ_iIpVC6M4fxxyRCSo!>d8R-p#$Mc{cDOh`d|SSfg(f?_yFmpXln!#yL+`6e30zo9o`^hs z=8s{HgP)aIzUKoQQL%=HZT@6Fw#E>OW3|uP+}(@An)GFb>C4V2-rCGdQ2L6moNLvD zq2gs7oO}fQg(D9MlrkT7_i}9Fx->u)6%N?6lPrU!Sr5o^DVEj0VD0TLT&*>l36j$| z-|hEIF^wH5&YfR;Cw77Svb*G+>D3j%S~$TY$_4r^Y22^oD00pOMr^bTKeX& zxIQ=Prg@==S_EGVOVcN(p+Ex3_%UTbOL`qSQ;f3|!Q`Rd7~N!|-IqVA^ zgJp#PB0_w=+!1Etrvt!B4&W@WK&NP%!Bz1_{UF>Xf`Huzu5LREqY)*|uJw&``=7y5 zZUSLV){TIlA+wgWDAe-_)QbeS9Pi=?G3(|!wzcegFCx-?j0^Ms@%7a~ zakTH22@oJiaJS&DgS)$1aCe8`PH+nW22XHzcMC3qyX#;fz~G*p{O;b}@4HpI|8zl3 z7e)6w-S2tMbIy4}Je!~X?*4ww19R9y4t)36z1Ztq$sEP08kJd;+;7bcF>?H^JWUJ#;_1 z;xxf+rIrQwSygeQJ-jeH=uqM@Rj(R76DDecFSJ?mx-T5r)WwBOo5)l{Lu2Q3r2&vlmCW z{$&nfIOFOm#kkocCJ)TvD)c>tphft&mi&CV{&<-bk~&HbRvu+!fUqq=6l-SV1n8$c z$DlVgM_?gOwyn|3j}cRMu9eHnofg5oI`8q0p%O}tSgPZ}OBPgxD-(-aL?5dZV_?XW ze$e8phOPz*(;p5Wpx^Te z#*|@-VUgpTy`SZze+$j>DpJ$hp;tPo&aXjInJYeHcr3r*bo_t+IvCMEH;ex#Z|3;o zjGB3EKH7}Vj?pw7YyKFw-90Si=VgU(i##MB1-?EU_CqV=dwR=c+Ao0Ij}uP@Mx+PO_7^(bx!+Yh{PXPA7YlknM>Jn2;3($=O@tAeJ?Jz;7R=|uqH_l7BgsVxxpAc@&Rr3oS@j;LvG zy*a1tA9Dms6O+*sIR}vfm$H{OQ7tYFL=;fv9u{G?Y z#9BK8syZm>l#wAz`c2;yN*wxXiF{!I}%YtD~+S3a6f^V1N= z$a8JbkG_XhLs)Aku{f-oVQcWR4EmKcj=$90=~=$0e=P57)Ac6EvGQiop5%D6dR73- ztu{jdYrsLBCFbt=rb=8k>FtV7HPVCU=VeA;)BPuQ*ha)g zAEEK~-eIM7QEUjM@)!pa|%{ zIX&>t@w|=-0X6}|9H@!}E;UCS0aZb6kF#>#{udgDh(SHuCM8B%#M0r9_@Pu_%8Xw6 z3c>IQAOnNz)#ZB@tu5d^(cZ~J)JM_W|G1wXAg^l(lQFeV~FuAqfBY}py>KkM?D z2nl*Z&W@cwVo|4O(*=J`C1-@(k9wo8>4H5v?b52e0F68p}QKJKa2?BS!yqos^0rqPx=(m&)fA8-d~Yu@c8L#Fm6nmGmWpq@7N z7DP9h4~i#~;s-|YG~l$hhV{ebeqKG_=d$&ooQwJRo(%TD3wcY~e&zt&)B|~={nSzQ z6ldL5u%)Lt>5%hlyDiWv?~?PfiNk_x72nz|!_m@~g=e0CZ12ZT7FhMrlGEc6lwxXk zX<-9gsu(pF)L63swdxvW)aY!bLjMj#@k)L}%Qlu1?0+z3?ncxF8RmYd=l#{-reEnT zXLtNNpBJl;3UbBCh)}(LzMlYwr^rTTcu9PMB&`zZ3f2$GkyzH%VQXHX zu)6naCNzVnUW>|AjuXtEaLsoRof=ykE>iZ)eQI!hP~sVUIO0y0@}KWf`%wmm9zRkS z%W4eLqVjCwre22ZtzT4f4tD0hX$KYM^lUOK;RvUGV%#TZb7z5PYwPjvdX zD#43c-RY0)zqoMm2B&=5<(Ps()_Lozc@~{VpQGtKHoh`T1P%w5ekK#+Ami)1+uH~k zQXi@z4e#CMZ$sRrVi>2#$I(cpirfF9=!ip7DS9u`g$#Uo&BPVBrVNvOi_;){{9%EX5 z!iI*6+{;yRRlf!(iKts92f z!ZJ%&>I5(9_XXT-;Js+8>NAdO(%VKvL|j81367sA^fm0S+3WrXI@F60HK?YybTDxd z^nW?>eh&PGYKiEqilm=vPDwd0@|zlq+dkqVZe1kEne+K}uOaUfw8{9rNq)*3@QTRPKdep0(T1Gh*6JYHI#y8^M+ivg2Qf%)~e*~CGczakt9*d zo3IDoT6zc4Hfi))PbW`-m=qGiW${V6fHLvO3p&4Il-=f>nW8ZhWGPqef8ups7zNQc zUE}b%GE?>?cQY9-qDXndV14$`+2LDuS8nw!mh29Gtm-&RqOrINuA2}bHad;kM5EtYMVHPy7FwF(9{!L1QnqPCbh%oglsD$G~f7F-FA$4-hFHO;1=kBASP0l9$>NJ!?N z*Qm_}!+phFglf6j28!VL;p#P$f=kFZRCvEpP9VOR(CsU~1sJ<$Xg~}#hCZtww~`6o1w|%Tc0dD-jz!J{~5U#yZ!7f0n6k0v+$4y!S2-M}6 zK~U1xk)oG*nq>|*{2PygCu!b$Wu10&t?S`_r57vixOLBeR9hxZAK8jrS69YY7c}(I z^FyhL5~|aqP`<24(`2hw#XA}aijXK%CdVawq(p(1t*P;%<2d5jLW>@FQzTSzIrI@T zHT?(74lC5I@c+DEUYK#|UMq^~IK{~Go(fdUMazaz5W3!aJwO)@_G@+&toDTZ>s-+> zn>V!vq9LULT$Hl!2Icf5-bZE;PndU8iYM8uAZ)pU&;NcnwpYp7%1MM0hAC;QCn7jL z%U4H-BiJ_sPsjsi^q?^WW zyz*5Xf2_2v`U1iHzB4~;#@xV?Ax>k{wY0*J6*lfwGZ%L3=$!YyCo|cztx=gkJY$4D zv1bhIYkpm$6;@6wkp+FR(u-WCo{O#ybNzN{J~eT2nz`5|_N)a8VGZ&QmhFhQFp9<^ zHCTrsC*rnH@L0aVbarV>;&UqIdPm>!qb+aF0fK`K5 zG)aHWsRv$x(`Hjg?MJm|qf1@vEd>pqi>+36GG7Pc!%9B`wTT;tmFn3>XHoxntIWl`KY-jS#@4E^C!%eMy zm`WWf2CUY2YC>He2sspBdUr7CE!w%k;PLa*P`KdUn18HvRVXDnv5*J>X{Uyp{C53o zo=!D9J-vmm^Y~x1OZvc^N&@L_tLj|Jy%acN=Hk$*|6TpCIz;eZNo>h(kj| z)AzSsm~GkS$G*|z5kC^@@A-)Wy3vu0>q$CGGBKa=}Apl4EL zZDowu4Jhmu3`h~gzP?*v6$g%3n11%ooE~(y6pZ1teB}s425aqGAA?x-98KS4mb-CR zWx*tj@S_4+R#JKXF6MWue=Mdgo&6+bM0B-!b`pYGeATF_Cv*NbU2IEj{tsHm48b80 z9C}oRjp_6)2Zf~pXM952&5jux$T+bstv}GiL&3dqlI=NW<(e ze}+70K7;3;!G4bR%%Fl^CLcdhv(q_ZGGRQ&N2R?iykd_!xO6=a8l+TISiASIHz)unJ{Pn!9Jj6<@2TmC+7*+=R|Mu@_t|* zv`+$U3^=Sd(g#ZL3JMbA^v{*3M6w1wjPE=@T~DtTa9#hoBLTX=dlZFp0w9X*E1!fzqYwseFi7=?gdQl@8ZGBnhrpQg4wYm*gve zHN{1rWt7}ea|+!U%MHMOvy z61fWSW~GWK;U3&d85|O;Prjh40kN!o)(UkKd3sN(x04j zVwRPvTFZwiTtzpNvl3*uSdFKyT)>`9pEK|1ZYAMN^Sj~1|K!dahxs^u(>ud)$BL+G zu*65tfSn1|OZeuI4P^qJC|jg!wG%v>a(r<*qek+kls(&%2+Sm^=wz9V(^)@fV=%Tl zhhfygM({PK1M}AD7-xwr_{ z>C~P+_Ww!{8e!fB6*s{Q{)$8ZxOSboS_$rrP`Ut@Uh2 zSz!g=Zf%J13oC^KO!=RuX0`n8uER6ft<;zREhHgLp>KSXkL8wsb3*wS4D8=2=Ws0! zE0|}kdtY6kR7~kgy$@)i;?v#%hfRCV<9tbelFUyX>Gq&MudOpEuif39gfOnb+I^ChG3(#chQ$EEhh?4JJu620-kqK^(0gb6m6bSx`ZhnuT*7$vOn z5jn?EkuPgaV+tt(74WJRdzqBNb`j|IqPVFzOwD(lhJ%3x6W}Hq;-bWo zbn7@Cib5xBo=uqW+-6zDpkUzvi)D{1)I9Q#3u4Bf>{uX7=*tEmod*YX)G;u45le(T zjK~OMPG$>1U*Q{sLF}q{-ph(6cGe`8(w0sQ%#Iz7gztVGvHws*t~})B=fjegX_#=~ z?-1xO_AvDIOKB>7#u_7JkD(y5Hn;n=nLLy>*mxE*u$Wt*Z#g0_MtZ=o>eIv8R!{yG z?NM@MJtM49d0WaY<|ZjtWwf%AxAe*2Vjj|e8^ml` zZssswV$+d-NOl|IMuO&anX57-u<)^clg8@THxRYPe{xd-d#*B?ld-r%a?)#~VFy!`Q$OqQ+Uo5T|w`E#4B7h?#i}-wAQ|Y+C;Ph2> z(HY~d<7$hAhY;;(`G+V+Zrj$zUFo>;!I~yJJ`OMDLjFWEy>N|!Q(f|-9CleuV>4+l zCDD94E7_Q>fqQrS8L|EI6J2gWL4pVw>poUxrLe0|4O0W8zNJS0i<57gR?4yLU+fza zr%sQMo)*0#vb?Ut5bkawl!!X|CpsScoP_>xSDt_P<=5bB67%xj5rNx^LXT_a0)s#z zp2`=Q{HE3ZC}wbkwGl5_Fu?WuCXr>n=aFfuW6!6AAEOBK5CRq^y#?(PK9C2w$iw$8 zUX1P_aip{pe2`CM7h!F}7=o#iwa4;s3Y zxRa{ba=TdS2BS<@mO0$!sO=NWjuw%Q>MY%(J>@BQjxp$q6F^9C$T!ljH^gHWhIADV zN9o=s>hxKX;+MYNS4D;n{tDRQ98E~#D+L85%~=^F=OrOO^;J^Zye|??eu@B!+Qqdw za(zp)(px36{zN6L3xb~Zv(2$3e=v?>DzTf+7!P^AKGSgawfbv0H{3{fXjl?z^KFr& z&+}Bynd+G~TnR0deojf#HR?DIF0Ls7R2ruRG)>00b+=G5Ja_et3`qxLke$ePC_9hw z950#ldXWz{O1j64FeWqj-)DI=&Yxe5XdY>93|-puH0POao*aTqzNJrAPj+r0 z1*Yz=H#P}e%bMu%m}xZY2+v4JbS&rIvJXe`jtS7_Q+#Bl<;7FNV6j025Iz3oM@LsH zT$$y{=wcm*N(^0nc-kayfd~M+Jp5#t63t>No%X@asmA{DSDN2F>g#w}GBoUmB9)1AE zS5(D!j|qP$23ZZ7CS}ysY*G4(h)=i5pK?$vSz?!3;3fU!pG3NaNYn5xwXekjKHqjv z__8y+gG`@o)_&GkY5nXRbZXq}c=F!8W@1&@!l)DLT~b#t-EN9pGL#CkK^&!Yt6oq; zb+^p+T`OxLT3*2ExwOW>hz4d;*W3~ZSy2d_g$uyPUe|^N*HK%_oGL$J)S^R6sD%mHi0!JntC)Cch=qoXi z1gNv9kr^@0Lv^Z97l)OnrF!y|YbN5}ETTaBhu*6Z{EA)IIa4k)aP&|w-rzS><&Ei5s&-ve)Z*Ov)|JIesXtD7XG9c`=*8|x$= z&KCMb(I(=FeEXVFbz$j*QRpE4@Zm@Kq_>^Nzkwh7eOt*A#d|q&axJTp)sc*P*l@ne zzp@VwS|*qwxvd8aF~GGt&MCDkD@c8iP28v z2o+*A)dSftKF3iR6E}Ksljy;gc*VO>B~e2FFjk>h-p+%|T-4E)ATwptdG$Gq+$%l2 zJOuDE?%GAquviT{GN(z>mLI7U-S`SnW>nsMU~0ptp}ZRwHN@AIdmk4;x53v#Z<&*S z;rI>=O9?zuQYUuaoX0s+f2sH2vF-5Vl&HjegV20zTJtD{ja|pGQ>UhrYL*{UdV7m027+0HnB3lUe{zkg=Z&(d>mY5ZEtcy6 z>jL!)^ZndSS2PX)mc-mgQk8nWq-5)#z0;cMNwe&^-MbeV5Vmq(!MyH2)Dw@W<*Y9s z=_@zMfswVjm0X#rPc+zt$SE#Y%q^Z|7CL=Ty|t$H@HDxWv~lI#pg0^Y?Bb&u5fR=v zU*%!{cFL%W*zZ488hbl2>#P+yKKdTmzmT=fY?4ul=Di%Wwp>ddzZlxxwNvh zceHn?0Z%A*rZBGiRUaRzhdOY>pXuu2z@b(2mTjJj)4Wq`m`HZ;9TsY_d- z&peK+=$rgy-GUCP-TSMg<~Q@CXUx0u5L*@^?~@T#@(lX?jU(qHsw-^N)I`S6$^xyy zLsNe&Z}o98;|0a-E9dyIKZhgU_~P#^-qdzeu7_imM&x@IO}cS21Sa!+E|l=frQBc~ zrs;z0>5hkLnpa&k0|yS_t@}R1?(J-KS93jb{3`m`Z5)3xBeb!TZ79TFT|m3;_c>^} zyp{#Ez72y7<=$s`8p-yEwh?&PYSl|)QW+6oq;hI3OTY_=3*t6VHR_qn-n|LzBYmzd z?0v(;Xuok{z#cZ!-lp&%MM*(O*@&&&BT=5*9^EEUhKPm2Ff@y{}dZ;2qUu{mBq&iS=XIn zS{p<744%ru0b-GQ4rMx&qww%wc$3d%sYEe{v~M-k)A#N|(uRbxF56hMsX8 ze=uPu&{6@&!q7-Xn`_(1`waYWGT~BV@gp%V~l?=U7xJc*=jAYSQ}VSbb=&Xvj%%Fhqgjdb3VLy^Bjf z<{tznfKu-{E$h~dVRp%akDLJOR+MnZ?p~;Xk`If3WP2RvrA%}MuK$=kGic8)H`DVm z@Hb_9xo4k3m|PPHDUi-j;{Jzw6`oGh z$?Cwxos;#QvTDSwg$755Qwp|b&2b@bVQ=r?Y5E##Md^i^n2fY?02G7Y#NaIxc1KpK zJe7=PvMl}U)9|cgEMUKO6g|5HeRhWAhxvv6eCKE+W}3Weny{M@(xc@V^yBPi`EVb< zh(o*Gw9wZi*i#v4OScQ9gMn|aZ&{KYr>#<`em#}H_=UiRXj z^Lp9mec#b?4U+IQiYtF{F`pG- zGOR@DrW~`rTbgx6@{?s|Q_m15u+eCd^TWy{YTcz|Ky9$^%e6QDwCGhie1V9t5P@>J z5^5=B0O}wbI*K6MA#JYH+!(n9IZ~j^!a=sS{+tqCUyXbA7q(VIUg65->$mh#Eq28> z)h{omC1*vy+k2Xi2D36QIeuo)B-L>KM7C-BDc57`Ve3cQc|VkLQS&<2CVL|+RHF(X zKQwE^NR&~go2>>y?=FY;)n+Ai+G=6BJ+DfNJ*%3TH~wOwW4%0Ne^8ldJl(}hWf|3d zTbpW>Gux1rHL5-7abgsSP~qzR)-5(00$HIIo<~5EZL#rI16`H(3O5%WFuK%Zqu#I_ z*H81U+qvP96w)SwwN7O+UOJe-=RzrvTH!4I{IpqCo1t5+8y;)#QOT0LI#Y*p&W~)= zeh!3!+&ZW5+_RGhg>&-A?0h-ewH<#UQ1hu%sgU+F1B5xCYAB ztH%*HFV`&iNY_&vmPS^+bnX1{^W%61BY0Juk1tPa>p5~J$KF@WxqPG~8jmv|`S9mp z>!rly@I@u;PQ>2}e{O|WfX9wo2^MX`O3fSAnh!nxxLC*)>iEe7=SIr(1*Kx%BPm$3 zaZ0{$m*rhkw z(z@hu}mUqPdUz zPQ-TcK+T6k+>q6*r=P7VDW*3e-k+$E$LMt-l)5Q(_ue%-qo}7H<{t%*{53`Rvft|# z79U|_6eaFT_c*{S!@7%0LgxaS6kJr&CK81PYoezV!8oRVj`D5(z%)b@FK8Fs>1~oq z$X8~}H8(<&YApV(5rmE+5NJ@ztPl_frtC}yUVh~6ac>U3kONDV_+`i0j^iUTC#Ix; zlG2dZ<}=RrHpc*xK1ZLrV8qyibTUJTZ`VIPakcI<^9S}#Y)cc{Y?csARE@A_OBW)}ASe-TZP8p@eJMi9CG}(^2EQ{>voI|EWzNa8 z8AcA{VebeOmSKJ8S*pBM@^)&^ccw`#G>e&VWV1tM931YIz)iJMqJ`1NfcfZ9_uCShb`^36}bxT~Qm2W<^{3;SZ%_)>UofncOIAYrFKnGNF5DW9+ zW(RoCJv)nZV=9*>@D_F_L1*XcAtvMG=S7z?n0t9>vP%7V?O7pxT}wERX=AkeX{kI& z{bQp>aO>y95Rl&RYQnrC!E!7Q7H2yA_W$_lF*xI2y(J}0aj&>+F8Ym+%PpjxUTY`KhTtV86$ ziQl+PcAFkx-|uh5O-(V6l7-{?m^n&-9!6~U1RZglvsH9@Yz&k27n3-ojsYtl--cgcn5 zS!=h6k9b!6$b4xhe4Prqa=14(+9VVHyybZ_m%L-d^(u6Ne_UDWy-76-X^3+T)uT|j za9T#|~Hrq>gtX`RW1lm1DrY{o*2zg@We(rl6gmkR3O7FGOeRwN?rR zUnf{-OLaLn{<2;ZS-7y}F{ME}@Nz2bC;L(%n3|-=>;dS=xjgb_iVilJnFVEfDD7hsmp)e_LLVGF@GT#&vK;CIJL;+kjg)I7e9Z>o z^m>tVrSr@w0)FadB@#TqwRH678#~z_ml$2)pWNfjeMrY|?yWrae0nNUNTzJQdFtI@ zkgcOke|v9daVTBHHd93aSP;1*NN3xV>e^-Ds!jZv?~T8XLI`s1QxBNuiFm?c=R_+^ z!E&3A!a+~@T*^i@W}tfvq6|3=M-uDP^6R+RRKH0aRah$!rYH1Cr1g;WyuTq^qZouo zdKo4&+D*0JM##CJ8yr%&4q7+64)4_L4@Pz$kx?R4#ua8+@wqh$j)E~UuZ6xC*#_cK z3v8g1fL&%^;ZTqU)4yj?!~PEH30o~fU|Zg3DFQgC6-4w?Zw!kFi{J#7<1s+MB|^!G zM8P|>>t1v(AKD0V^6oL>()*JHv}@K)l)b7;SF6%tl!-;oMA*b>!GrAAjkH}Ii06G_ ze$ixclmJ7jSX|6wu(Jnc9tWjGuLReQa4?9sGZPsX` zrR~@K@aT)Cf>r#4bFrKFqb@ty&TDx2n07)`8Om;7D~9KD6(^KGb9lGEvQyNlJNFbi z-yu3Uf(SJ-U`DQ@F9E;2lmWdOdU6-=TdQ_A%e4&qeDso2wQg~bxlU}2$b_x?v0J-` zQ&{ClNOf_)vofws+laCQxL`11936(6-d0jzL<~`9pK$aSo@m5!^hu}_Z`DL%H`wWA z<9OQOzK~W;FIN)9X~~?zcj}uTFxw#j1-emi=s9puFO^Eq1xaTIEn0Vrv(^f(Dh8l zj&seYl|I0mNy5G78cVQ@9gUCNr6ZaGSnOE~YH*ij70O-8vexB;q!G~09x^L&XDEmU zorl}IFS>Z9!h8I$9qvE<*`RfDf#z`7-HW_#S@-w6j&|qXc=*;I8`AK+=aTm@H8oR6 zQ$j8OVm4*xwCj4vW33oUCb1{o(0e3TXUMZ4+{6G6<9^gx^|6BYzKN6ICaI=Y?3AvZ z1+tlzGX%O1^UEe6yR^XNoE=pH&{h>4K1dE@7EL|4NbJ%ob++ZwiaCL7o5RhMi){|V z=!4k;_xo!`kVPQNBf+63(E$Xn`Epn~#3*br=BES2&*sS)rxm)#Z zX9d-}Q*%}Z)I3pczVE(6%d~LNM;}qb=T&3Dc7iE2Kf&R?;3!hrj3dnoTYg~mbsufu zKL7IjyCG~q;u3KXsVD(`1*G>Y34L=Q{{EoS0|D{L19w6t8_!oaT$H+%A29K9i$@2h zUmS29ok$I^`tCX3J~Q!|>>ZTc+nibrO1woEoS=zd3~m*CFNX2vh%Ic7yC*z)Nw_H1 z4TA=j{&#SslC#kh3v@7tu*qP$Fw)pVLx$9lwbDKm`-3S?Qc{c_5lbiUM(QB6Td(9ao6bM z^1bAjbrpP863VUbZ(@sKaU1WhBw>(-C?FDHBJl{kaN=)XYy?2Ql%EnzL1FU;BHQPxyUsA5pMxfrjoyQ8KDf=8gi7xPtzP-)GpAR z0R=l{&7P%=6*{8)O;9<>>|0b<6ha!(N1d`!$a09IKdH@-I+ zzLev3v|9;WM53z9%1ArIYsKir z0nQ3x&d6AKBzQiKNIT}fMACL6}f5NaQA3peq;(@6&#$0ipfIcG;*POztroB}_-rxbbQ9T$m~ z*U%iF7Htw#(b^nZuo!T@!TQBPD?7KuHVV7vRGLo&QowXo#_x-K&Bz6+Oty1^c5&^} zAk4)|k}+zwe6~|oad<7HJvP`QLJI4-r2Ntn28qsv32DG`(imjL`Y?K>f~+T|S+Uqr z_Wf6*5~4$=6<34~d^tU;9oh#s?GY7`&=5Qi4bH+5h7E7@Z)0D!6brRk^rUGpNh@`u z29W{bb%iw`9ew)P2DW|6T!&@K_ddWT#@gEFyb6waF0hKNxq!5`{o-YR;s|UyO*lcVlvKDStsmz`#Afw;* zR$}tbPKC)MaOevyZAly>7xL!GLOoWQJ4feS4j=5N+}`n|Get(^!Y2&&V+AS}>*KRB zsM;jP`@RzxtJ5IZtVGex5LFPT2`n_%Jz*E5>O+_1Go6g5fcK&kYIt5JkK-#uo*zPI zpJ3=zJyTEzoh`KYEO9E_H<1~kv;^ge=$~Yb5XHu9G0;W>4sn>oI?At3tDq6 zu}UPq@$3K#IRf*JFGfy%+fAR`*2~-bQPEHw)1KfH-xpMMTHmnTVQ8xnC%Yul6>lf8 zhXcMOefxl!1=8Iuz=PwV7fJmj?Gr{R@ARDtgTUM(3A5x+df0v${o@?(dZ9wR7LNa1 zD^R5>K^FEiO`!t2ijSyz5|xUsX|!0p%n8f4B^#uj@tb<4bYW^Nvzb{|2EShkcqumE zsJT95j3$`kr70+@&+}2UGouj$G6Uw$YiVhWIDp3#mzlzR507wfyS@I0(YCVDLcwSD za$$eOl4FKRiCNf{Gge_F^|yh8FwK)2hmk|}_-Ms~?YIT2SyJ<%)k7M@PP!+_)v{hI zrQvpa{2i0R8qx{@9;6~ekdm|zpXrH(4}L&lkyhu&$BK=t>58@Vt8b&EAc8rEbX)>0 zgG&$&@)m`3>d0k6V3H<=-j{(0PT}b*w&xq@F1EhHR4w~sHdA&nNLScIG6Eu%MqEh# zRhTPrHpoDoE-fSIjzpH@%J=9q_%^LC@?7_OnqWjB0z zrO9a&&SmUot8EXRTvev*(M!$O$(DQI7-@PXAERE(?2K^?V6)O7>(C)O%nr(NVqmMd z8k^o98>bx-c2(hjE18}`UvE%^w{MaE)pDT4ZuK@OV5eM|fS=?QOzRb%T&h%`xHwG-~0<3G&7t%1@#I@L9+-;v zkyARA({8J7rWZ~yaqIF9ynKFJiES2gpZ@+eO)+K~|Ll8&f;?y_N&jOWL#GRos>Nk3 ztnx&8E(8{>??G|(ZXnWyT}(?_s=eqjZ8V6ww%8^$AsTs--e_R>X9scf=#ctHIiF&W z_pFyjvOP}qEYyF%#Tl&U54&kue{O(*z|>h5UzFYU5jf2-vw58{ZA72? zC@6S~Lub@!VMc=jo84*C7o5>lRNkDJEd3a6P<|Avr9R#gMxQV3IvD56vqBz@RqvGb;2qmW4Qk znp}0^jwyNtHG8DCa}&Oh$GfTOcvnBG(+JrXnvnL#mstkTrY3y^Xnb&6W*Wu~K)b`T zjS_h%8Q0~Y_w};Bs^OV&s6L5o?$7;Zi5Rn%Hxau07MImK53X*0R=9@>G?dhecd0IC zu>|^9kWucNz>4${Mv&mii2rIKMdW#tjEJFPbds@JiK5CaytXUc8LN15@n4ZExf6(N z{i9_Fbe>*vZ@-I{nOgApiNeX_X4662H1vEIe86jakue_IiGzKDU;FXhwYj;C}t z>5MC|&M|yKOfzCrIsTW)qqZ4CG};{I8(9o_gO9%Z3`Xh9vb7ss@br;Lpp1-#CQNLm zx*{~p&!mZbdNZPZ45#lFH?T>oY5d<2EVaCF4viyqWP9>@f-yKw(xLGb|4EBEL9BEO z|8~dg^lv*kamWE;?jepxSAGv4LV^dJHUSKmR_TFFY_OvmqP0~cJs`$&C-Lq z2vhnEbWcylxD{wn23@LcYq$k@M9}_iO8<||9h&KYu0_uBdm-APzsNFe8OV>_0S)?d zf$R>B%mMpDLPGGJ0AJ?j=KlK5O&uI6xnp&h?3Lu0=5W%O>j3}9D*u14bbClTml_aO zi~m>hcA9vXwNxb-L5)*`G_U|lwGLGNb*x1+!K_Eqh25zHHiTv@$Cm}%%3)qGw zL;ULm9hX%@%Fr5EKBXAjQxtw$HhST;`t@&n+kfe{oe<&lxFrzvu&}VyAWwfCXTlIx zVT^3Qv$hMU!Ib0q)LI1jZyMinPf(C1+eev3 zZ@$x4QoO{WmU%!y|_V#v`>v z+&HuyoSlvFyL{=1MF8l15ih2iv{9bW(J!LhhBhV{IY8V90n}mVA#ZHQ*kP7S_EpZw zdpz6tgrYj{BaIe_{DbBUz6x~W+?*~n?XItm*%_H}HnUSY>ypPy%OG>{eo97P(fm@^ z$krdg^PodG4nVa}U7W?aV!5Qh{75SCSkJph6rH3XuTTrNr%Ijd)93+f6*>+L?~ctD z*8|(;*!DsVf%Nf=Ls=r=@U_0W@!c4RRFGbF_?QL=S)^Doo2l5S=bl+*e9A`gb-p^E zhj2Icq4*gTZt^v~WBhs5d=6t%zL@nTK?F zkoT&DGj(zolrxLH2R-QU#{z=nHR7NL^JAvTXL==e=pnwS;qQ6>-;-x~kpcX%4K7#u zf}XnH!wG&A{r$NU>K|=QyvVC;46WzT*NKq#_+u`Z+rVkNR$u#Yuk*;^6C;@0B*?^a zQ*s7eyzJ$ki(9m@uzsqhdh6)kEJ@D!pz}I9s{;C)j(RaIfhKh)aNddKs1L)>%bU)O zrd2wDq^zVQ75+_k=x;2PLAO8OB)X@^T^OVSc4tE)AVfoYcsWD!_!6fOig4L2x=(63 zNn5mRW|W~<*QXwIqWnNmwIXfpN#OXu7<;R*xR$P68wpOZ;O_438rQ=K&2~K{}0~7j9F`NBkuU2{~9rOgoe}&=ZKAE6eeKrF?X;TQs+wBZP^5#>KC;D8; zJF7cx>J7`Ll@CZr)h(3;RCUM6Rf{FHJ5k&iqLN>uuS(~KQqPt=9 z$Em(%>4{^Z)ENo`S0FeF5|MsloVe4m>F&>2F#i?G zwSr-*dYzS(Y(TUcd)nJ&(>N$U@qrSS>6M=$j~niWZKpLI)_f5qjnQsKUDv%^BWTKj z4Wf|^=I8&`W&Sq~nl4UQ&8MwN6Ve)l4LV9UvGlXex@V)9dYxXaM=NL5N^N;yG54;Q zYIJM;r*iRszW5SSAh+1>;x5%t26b2wgoDXs!Pjxv-B$Cw2dAQ$eC$-3#3H*^&L0Om zn*S7F;s>S(2N+lPY#G883B+*(_QG$_Gibt&p?8LcRYyeLivAlLkWAX!oAgG!%D1JQ z*$e|B_OL*lFCg-1a=UfLSmA)|4d8&Z20Q|u3!rl(pxg>Xhe=AX^ zF+X7s-SE-LU*&uz*y$0R#<*CUN1Z&jJ+5ilKawK|zTcUIM0?ye`ZJv)V^k^l@Gl%sG)255`@1t}^8342pP+u+pP z;PhjN=0k_`{qw6je$oj9V+$bDp=@uiB;#+dWwV{DsJrAE*1@6b zVUS}_AtQyET}lPY;mH3x3zTKi{3&{*FQ#j~0V44J=aJLUpRlzQte+N3k9#}r&W&0* zlR;{KV}3pgiiC^--8;J-a@+#BK=QEXLDaT<)Ut9>4oTf@tpoV~$B0-B0F&9!o|0rpL>U9g`4SE^mZe33VAyi)qORO(xekVXwWWdge-yq?iPK6}GPN zp9LpH_*2M zg8)6~PR99Pudj^|#b_>_ZT5z6dVHI6;yon~k{YUE6&yL48Z!!5Iii$Dj(usE(a?yv z)j@!*il=P?W%A8RNe0mWj1!BT5cH4y)s2*dGm`~;_on64jegXT>S6VaynBFiPOm)8 z@a3_+F^S6Qn=3rDKmeB#0=V`8{0@Bnw5V`)%0B}Z7aBzL;%?uq4x3jv0LI%T>=XQs zsD#sWbrNfvBFyrOeIb`h<#huiKKMmZ=(;?@p;nRJ-zQBZVJbWQkJjpc0Q$W_C`KA_ z4lqJ>B4a}LZ^T>BLo0orLv=piemAJZmMoWF!giqdCScr>>&D9|?88%Jdbj5pg`8`#$D`)i|8;-ySlHRjz&k0z;GMw&>EMA*Yl16_74tl(e=_S+$85;c5 zwHQ!W?8E-zB3qY>YRgXr+x+{^-awX9^GW{#i-5VfrCdz zC%5>FuP>X99RQq1X%_s1AlS06zqs%a=CMwj1?Ro_`J=#|^Sx;+x3i z){a(}uzQ`G5xFgu&sk%(qV;D6kju*a1aH@fc|4TBZnH zHAjnoYzDc|A;z~qTiG2}gTkaCJPDgGbqGFpkCqtP?8Adgh`tK^iW%i3E@Nr}Xic!e z45V1sit051?a1la729EZE2KKm^KZ2Z`#_-1|7@uOo4lCy>Ao3xvXNiI`YJL_dI=d}At1liP=bjel11U_uSfo7U*E$4cqj70x3O$8ZV z>Pr>x@J#0y8z}$7f5FkMMe}s~ud=u7Cyq9%R{9jITz&|&C9jCkVGZa5pm_XDdSY{p zT4xTf*t$WM2sV&^m$?6ZI5b26Rg>B7dkn!2LaSTo*2WeNkQeZVpREya%Kx7Q#7Lc_ z_cuMCwF&2Xq1aKYB^h?AH>3NnAxA91Q*XWjdj>p$nRaE57I*BT7{au~ylXmgRE57*gmNJX+nB0Ak}ub{MQIQMFq$EVCH*@7fe`5A^N&Cx<`UdThH@3@(<$y z3xz-3vte9Y$2b=^1jk!`7rd%2dVj$Uh;m-?$;ACA1uYk`^t$rrYBiggMRoS<)n+T3 zHy>vWA%gfcqQmGAdW-VtcA+R@rRV4_OOZaKEpfK;~dLVt*!g!fF5Yu7jK*o5eP(a*} zU$bb(-9TXXr5WF)b#l{~vu;^hL@Ye4pv~XL!b7ylB4ucnNzg*^U-PC}B)|!&vQX>V zMbi-0yEy~VnELy(W372mUm6QK-u?OF^_N09;-=^hHqd$($O`)JC`ic2;d2%W;pOG! zWlu3NF`NbBatTW- z2HUJS7k8LbnNjF!*ge__$qMzb;@Qmdam9_9hg2H~Y91ygZ0AoQ2NJtv?TGDoKde{`_&+^< zkhr+Ih8`auU!6Pn^ZkV(fS4Ctv|(6G28bW8Qy=&##aIR&B=~|p+^Gx6q8{cwh(SjN zaO|1;;GpJ;wXc^Jqpfke4B_+w2+*CJj>|Tk1q$Q=&?yGKKisY59UrLwvjS@gz%mma zgg#+(%?su^ygYnE>4FxwEm%5P>C>`47#ufkZL!>{HZP3sc}lG_hg?jL_=|)g7SA(( zOr!aheL`X1b-$PnV+?YNh++#?6nr-G*bap0|LdvI{eE8?4&p6^N)q|9pRKhry@Jku zY@cG|U0&OdKbrx8FJf`Yvg{22cr9}KfkEDZsM$Xkv%2-V9DLt1YT1ekzeemctWL<> z8Xki!u{ozrP`8NKTKw}Yv9|%G&S}Z~vn7%hexseQMY^z<<(v3DO+j=s}TARgu zyA9R#nXw-#rDZ%wnB7)*o5pyvTBQXY6|k;8AN`5q%DJ7Hz}kvNwwfpcam%8(_=;r* zR9cI<)^=4o=xctjS&l2rWp!xdvzzlX#HpsG67hOb8J591LlWs9*>h z`l%mB?o2$X4HobG8EV-wxzR$hW3fBo`Z-%y+~zLFL^b~C z%P(+7XjcdZ~u>r2=e14?~h z=@7z8u%gKvlj}?m zx~Tp8{#qT+8bIe-Ye!Lj2(`OOLrnA8e-hfW4wQ?sm}&uc6T8t42>`*K;;bn~5X3Jx z&c54YkB?}>=UUw-@_5{#rI>DY@QK!+h5tYmBP}dz?To$aXV#$lj23QVOpRsfwfcog zX6Tcu!8F#JIN?|f(@oZtkfGmgaqAPnr($>ZYX0+7K@aWt4b!UmaTGhkHDB%@>XaQ- zOn_d+ZbiSeCZ;B4>g?hk&M=}BkGF{`EMHSdQrbG5u}ixqzn@7f0M4I-x3XT7QdPfU zP|CP`+(2$Md2u!?dx&Ak?s($=*I(*C$1Fi3*km;{3@>{{TrlRnY9z|dct0ir>)57T z^m}5MNw^)GAN}X-AEOF(f9V`-;eQ$A{UB&UVc9ZBTa5ss8%Oy8us)9B-l=c4y?=Fg zzdO1X9)x*gl8Tf8zlviu~Y9h2=S zCL>y3!MMQ5{5(8tF~Dh+NjG2HLPR~)_n%~M5fLI<1c%(Z4UN-nGHk8IHO#@gnJ-h=0obWkE!`*XG!dd123KnzWpld>(eG%M zjY0I_2gCGR=dBNhII_<+@o3BSvP5#)xFs4{2RRZMK>wFC_*I*DQr3{Ojf>hnb75Nv>L43 z@TR`;Qz}6J$JA!l$Fi&5WB0Cb1Vqrg6 zqh5cpfY}c<^umjA>8Y5PTg)H0d^s^vyxG_hzPa{DUfwQbL~Xtlvh)7RVIHK z(gSo?afb!6k^{M}QN`v;feckahnEvvbA7=ub0BAClgn+Pk6R%sz~?vuKETK%Q`y0o zQK3;HCP2sd&xxSh93cjLb20^j59A@pLCeR|uh|Oyk}3>&lB5TF=3WT3<;!G^!wZ-|W;?j;Vc zlD$=@?S99CRSOV~Ikt&~XC0{o*Ga6q1m6e4(Y%sMSCs1n(KL>0KY+D%izr;B@vPoY zT>iIQ#~{FO#G8S~4pf$LQ^rtDRjF6zMtf^UU#e0&@as|ZliRk~$@hyzn*4FZ8Vk4S zZ$*ezT|_FSz&Zfj$LXISr1TLogNFY9^tLc@-7zfjN8Z!*`2kFG_+=fsXfoSZm7L}= zW-R712LpVw%iYh}J9*IwC}IF>&Cg#2vx9}38EQdEHrVi{5a6BpuRSx!^q_u9mj7;A zEFwwlV~6Oy@8L76YMcLu--~cpc&pUlU|Q@0GSZPZ`(UE7w*~{X894I^%z1FxL$-R4GCGD5}0Y$T!6)vWV^ysP+ZuPtt0hzc9@Wd-Y^?EEgrxS3sy;qgFZ5Dz%Z=I zDhB)Bz5XTis?zYS!dEoNH{=Je*U3E1Ih>lJDt2=JW_MMVibu|~gMq!@(@UMw!YHc@ z-irR*<&M7oB5M77qxy3q(&?3?i^*|m5u5@wQL_B2c_`dJUb~ShiZHYZ3jWHzNOmqW zeepB^hAT8vZY&@*hH$1q`Me2^$13TBq@k-3wahFG<@f9Dmu1kQajviJ`(N8b;7wYO zZEn%iqyL9HpKCHj5eUI02l)p4or{>8{ntCk;bPU?n6t}u$G`M0cg|`!kl^@6E^V=8 zO{A)sxY{L;V(xgIDlzu_qWqk|>{k^=n9Gsvb3NmSr*GKqFmR)AicMjxR(z!?XkLo! zKhdED72>xrn)GaNW=e-FD?H>PCuI*#f5grH?HBz_jP=TD&bPFC0nwS^K%ZsM+~mUn z&-`&rxcG3UqU}Vd3Y#$_hGSN82{K8NwV2A0H+&w|lzTSqA(j<0^geH9=jF{L^u1H2 z%NxF)owUjpR#bG)Ts)+;l~5kgI7u^W(||-QPXuDz2bA7#hzMz`88C3DF*k;Y=_CTD zyD#oi7fTf?+~ zHYlL(%Ze6l3M|?h?(MSFrhjvyXd!{)mSkiO2D6g%9m#k<9WO)O=<+MF2fDG#`yE?}z=rkS|a@``lxNm2cpV!y)#9A~db z^S1c%wa+znxb{YuAZk}A>mTcA1xV3?+Ncu=b}qQ;Crh%C8o@&Z#bh^jvZa)d3Y+1% zm!vgyWP0@|MbeZcP8T1zC`0XnXtl7Y&#U(bcP`~`{L3qbRjWanoSax4DF9_j_l6(l zRFRu)P6LACfhJENAF9%Chf@piDHwe|x;D46tM6!WIbvHG>4#~TW2#eT*hQ0(A)s@uYK1=_kD7sd(7{Pos4;|rM*e5uMN2i_nX zwA9hFFnoA8O;di19kFhESO!+L$){9eS-BRkqqpM@LO*6Ye)jIf zde@q*C`XsmTBZ4zxz-=D^)n$Ms?BHNM!x3Ur<2SR85r%Xe5A3SvX1C6w;oo<01+G? z6_{3^2Yb7;1UVB~alQa)t^C1H;2V>KGw!hB>W>7%nLC(i!g(s6R(~C(oRi#5$<(Rc zvE@F?0XuqLI_^NUyiz9LW7*^4Gy_&B)PqaVFc)3=nHRh-T0-t0&Fv7TfX$0Hd|0B^4-xVC0A~=$qLT>2#D{yo@oGz z+!+h%cYUhWWpK8Wx4g0A%FI-$9>T!pZ3QjF`vv&M)K1+5!y;t@2#!sZZ*3}rtxYxP zK|p;SG)J!{zVoHuT)Blj-ll?YQdGQW${qw?ZMQap+G8G|PIqWZ2?9~U<%)`vPVn+S zmS)Y|fBReHugr$?WUpW>X^?Ka_VEooe|Lv*?I*E(QAbv^${=E+9zPpD(RUMrc;_L& z@RWX7+4ZILX z79 zWMmhc=8zD!XQC9Pmdjl|;KlRvuf%%-v^(YAA4Ka0$P1?tW2~%5o$bYlJ&tv{TZ$7@ zOdqi&IR+iTq^5lB zTcUuAp8>EZw#@F7O>4u8d1UFxe3j&5|A&TqvHvlaKha{@kpKF0%#qt1yr8QdzkF*K z!_!-~8I$Iph1B|JKIdDP#7Y^WzY~=oJ{xp-ari!VY{?sb0GH+lqp;@O zyKl4EnVI83Kx2Ecom2&sgJ~QgM}UV1_uEMBt2BXVBU{q(+v%3<$7^Q)1(Cew-AcqJ z=A#;WWaaLkDQS|*6SJ9iQI7R#t@H$b?!}~>8OO_3#>vu-1(w#f^v^$s&aF|dVi5`Z zj9zO0>;#UJ8D1swYp@ainkyGr-i_sJ*262uWH#QJ(QonUp`dKb#l=(f3#7 zSW^sw(~vysrOPr|wSUvfPHC_0+!fimWEXUxdf110H-bgJCKRR?XXz<`UuGcm^sAyH zz#=-wAo?tWNA+skCrOy*(N*y)+pF8=Yo*fNwlT|WTZwnA3`-|91uE3_5A*|?KY5dRka$xE1tJ1N}{$JK$O?#lVWLqj|BP?x|QR2CK_e*rCepk!k*^)BQ`Q)5uWO;3JQlVx%ATy0CEOL zrbbY3WJpliAf0wX{P`Q!@okc3I+A37*RKB8tgu|}8K1bPZAGMqBJW3cDnXzig@mzD zMYi*lj#2OwHH^<>-kU%sj=zP9H~c~?Z(J=!7b|6vRWJjsP^Vvk;j#6?P?00B`er&P zrs!u7d2J>{^TJckjVPOsFacT5k&VS-?Kr}U?{0V(ni1}p`A!Hz*yEJ?;C0iD{Ubki zC=oQ?2VwD7g9^g2IQO7KdBPlIKS8j-+>NmsHm~iSvG*K{6=e6ux)@{JOKAkb-*<SciugZ-d47@;{Yg7z2bn& z$$a^*QYz-|U&$-tqm%Bi+MK+F9&S>fbJVc|eN`QPN-i{B=?jN6MLM@L+@r_Iuk#h9 z3)XBNj<0y)Wn0iJN`%mPz=>r%kysj;;)W`}X7r9V{HIiD37XoK8)|JHdHH)-KI0Uv*0A_O} z6*6{B30SQ65ky1vltMtg(lNWEReIGDaNeh%bxK3wIOLY4a>>YRV^Ea*1Icq^g6@+k z4S~o9rFr-YuF?*(kT=`92E+H-87$I^uvheu#c@u;_;k<14#EPvd$ za=D7H>Yl2si{l%V!eJq1uV>ScTxBiKSlX=+%n8%cVtflO2|t^hC&xdW41a5Z0mk#< z*oif`nTAG2k$|<>msuck3Jqfjt;V>pzhL6~PD^*CDcE>k>t~|kt6KE;()gIYtVeyt zd;ab+8pbJ`ok-{erY+a;iKUFhQE+|jqCxx{@HIhgLR%!n z631Z=3P&ULmAob^2Fz8I!?VXl{(h1QFJ}R9?b7o3(SSiS*YHT@OSI)^vM2M4%O*xK z2Gj%N%zHcUY8P_@+ZOF_3hGNQ=0JB(!$w})9$?j>yUfh|IA5?^uuAOj)8y5@jIrBe z`Iz5&3B&=rW~>>zi5fGA8VR=`H~=o{Ltvzc-~&Ni<#@PyYWST2Z-odY@X`+>n%R7y z>I{(}9PxtZ=g)yC!O**2xRsR0fhJ~?Z6yVSffxAai1%pUBM@AIPo9&yAn}2ryOROQ z5Buah(IsiJ>^{S;%PD+J+cSg3Zz3Q)B39x(EKd}E^A#jf+Qg6IZRDWT!aq_A1_DA- zY?;x1-*=>4p%H1hIv&pyrp`P|7;{aBV=4UX^>Fq#k&BGc3FgScC-7Ua5fUNKzU?j! zbC`IUB>`Zn@Sx-V*zQ=#7u&?&qFtQ@cBMgq|*qns_ygiS~I(LYH0dS7X(W_ukZf2tcq1 z92?n~UKG|KS?PM3HmO@03$(>kl*_pQN!)Y6N2Vr!j_wwfkj7A+hk}hP_Io60hL~^u zCfTph@cN8}`MvcebWaYQc$mw%Qq;xhne|@`O#Q?kz6E#6?vfY@B0h$^iu9!;b97Y0 zw=uYiOP0$24jPgL$$x!f`+TMZECv!TexS(7t$c_WQD(%QM~RK zdcgZyf4kCX!J8{GouLMgx@i9f2)qMF4VZ~uen*o^FcN|Qsue2=ADLVqBO>TR{OX#c zW-z(o=xy$T*cW3slgm?akd;DKw-vYf>Zn$mkU8n+3r{4m@{a}_gk*f3?;3b3tWmx? zAIt?V0`w3sWQuGiKL%Dp{LU4%Prz|&7P<;J{OY}tH+JYqrA0+_tpJGUtt37 zY#CYhCL2>UW-?FA1~6*cDuvNp%88@{eN|tPz8`gEZept#a~B0BG>ZI$QKO2Mi&U@X zpOz6hrj`m~RdL|OU$VD^MDUU#U?yX)9`Aj~{8WW^;!A1KF>C&;Ki5bzIITf13%e7U zA?X{ulv>7JvM-s6-O%WRz~zViiWf8N^x=%1bNwwe%pw^oTIu45yfm5CZ@`2eDQ{VG zn~gpzIKDUhspP4G_)M{#63|5*P}}cKi^U(Ydo(uHHXIOBuh!jcb6vJS=c$lj2mM|` z-&wUBJV@9#hqif{Hm$DlNk4!qhi13N3>9;o>ON?_Gyyib-+xYS2gW*Doi>!3;j;2w z$&zTsiY0n%mdZ1mWA@yopp#YWCcWFRMeO{~OQwNY-FeTZix+z*n8UFKl6GEV4^>G0`4EH*oZ z_@>9rET0o4ws*rtumKN_Jx`uJ0OU(`iq*4x@-f9Cd;>LIq1u+%0ui1t>hN9SuMuW! z2A5DP9C9~vlbyWPG4r0j?f%c38?iKx7n(?lt54p97k_fvp}hPl4-?t1bVpEfHBl~6 z&B7Whez35R(_s+ClX6pvN8ooE?3EVU zeDj!;SI&2|X1jNAkS*5}EZP^b*s;)BXP695`QR5ftz=G}OF;VdmpXRPLAvuu!iGJ< zaDT8gK2RjAzCD@iT`J;Xy&oN1yvY0Vt!_DJsgM+-_18&&taTFnI!!|W58+_I$ZJOx}RR2e0d1Vc;JWVqGeL|H_DX3vA^XBoZS z>%#6jt42XBkrUh``S5TRU~$t^UxMF4`C(Zv1LtqH6l_gcCjItgzn8VGRoiV{hc5Fi zA~T$0P@R6pU-7`*No6f1QmQdg{w2{qGj8;nm`}KptmHA&(GjOfCj?k-+9F@YlVT+o zPuT%?C+x9h+0_KQ+0<`>G0dFJp7?h|0+?3SuOdw2{oh`WAqd-Ou$pd706bvcX$=L1 zpO+)O(|9K#RlwZKzibreBVVV`aF08t>`l?2+5}j;v@ysRhYNeiMu;s{=|IGYyyYi@ zWlNP^J*p-$wA%eLR1(*pK8f z728$CyshTJRUKkq{XG2b>tk+N)gAmldz9vw+jR??rs-x5 zl`B{n?9<`kQ(^xuR1E7@Yub$2b?hp}{b)2TrD^hp%}=zr2WDjzcx}PRemAwR(?m_9 z@#wze-n&8?a{P>gv2Ora1hxBfL>IIW@MgimonD-$gJE9u!!(n9(*lgnyXF23#%cwh zKg_BU;i7|jvma=&ekk2}Z}7bLc;dF9TXe+t74_gHEX|eK*0PYm8Lnt}pVh?x+)t2- z)Ml_3+lpDN(E_*d!VN{T$7~gGlXb+nW&QwUcNxc)0jq~H9}_|Jud7^RvOGWML#RVb z7cP`MY_@1&MuH%GsX2w@Xgbc6cNT8xEq0!lYbMTIy+L1Rjgc)9%d_|T>i)__SNa*aR zQ!dXnR;cvv}38>om&hk*Jt-^trtGy`{eMY7b+^TMW@fi~WNz z(!mJ~<1GrA8C0Si%B5k78|=9W_~sNRF3GU6O7?7)!X$LlDUYiTy>AQ*!1sy8$H|vv zh4tg7(|3lDuN{p+jM#RYbM*Kl?9RZfRq$ACmV$?S)m}v*lt$Sx3$@W$n6G5qVAsn36w0hNccT(in2w4dqf}H0w94>i(&kfLLM<% zEKYx5U?02FtxRTm;#V3tf@w|Vj%Lx6zS~J~p%5>@O>Zr^hwp%06cY`yr+KuRX_39W zADw!!va~|gY3E~^*7?S#Tj_DJ78)@GBsnV-X*?+V&x9D^$jp%3lqIXh=91%jpJizB ze=y_kcHt=Tn%_YKTjH{m2gKwOV}zAGRV)WW1Bc#j;iwDNSMGn zeC`hHk{(;C#L~vlC<&(XCS={XC(&px9FQ2<6F2Ekb2ORYConrdC}T!|VpMnuI#O32 zH>2H89@wUN-KY>qgK?5V;Me2c=DGe|s~f9KbGVGNHNHiy$_8W+vyoL;z!4dfpK;Q+ zPevRu;2e!$Rk27$KLy?foS46yhj6m@s9Zg6qU~DseDI2R<(JT)bKezG;cwTw%X__I$3UnE1n^ zeu_YdeH4PcW3^u4W;1mK4rzQQu#`1&BAJQp0+`Ugg-nq{fc_$_ktmA z4d50fImE)`ehD)LyIpZOIfTP?28+1OEdO{2b}ucxSUhB6zkdL+AGiiD&qR`2yG%!F zznffFv~eTH$F-vs61@wQ-jHI}T|T)lz-$#i&f2q3Mq>D~`SLo^%$<*R>SUgdYP&bG zhpq{PQPO?c&Zy_>v6}sqAxS@~64Ky|;n)1V(s{qBH^le7#nzA8A0jd$9?lhZNo`p3 zXz2-VppiNM-KucBS5~iLXM~Iin%y{W;S^42wV->|Y%R%Sc&j?RwCI&U6mC8M60+j= z7qk9SqoMoVADaD7YUX*hD#2*qMMg|Zt|F*%r0^;C#zbFU?sq(WlXDL7iP>0K61uNr z9E#{PYnCOCuRA!LXx`2=Wh@>cSED%6nr!t@c*ZA24rzL4Sjfhl=+UgaMIYJlX>+G$Rnq!&D`EHrWe9g3rvR2_QMEG0zEi1cWSru zZm|Lmm){D5LE!MRBr|!Ah)BtoAVNkXi0Y=ehAY5S6tlS=#`;xJBOPJZ6>P2}Eh!b= zX0@AR2aYLxRgo$)>@7Hr~y>+-9gMo={MZvuI0ZgIg=4ry)i{ds&1W8ZB!Ww^|6>B;d`e1g0UbK3UwC03OQ?eBm06KWu{hKoewC^ zf7c>$Y?*J#5HO1<&l?%~^7zuAZ)EVGvshghOD?_pCtFc~)g$so-9?cH4#EgM-Q4vz zG_3m_-8eKe^^kXR_ZOj=WQR(=Y+2R~_Twc$Nm%>w6er2x>jrMP%L8tOeowoB%{{Z@uH z5WkB3cZR`bk&l{YmVQ}K&A)@FK)^3MaQ+QHZdpQkYG|?tDzu=DB9J!)$zXFTIYQKL z7Lgm}G)5k025F=<}b1Y;o5&51LYl@T~6i zVp9Hi;^@xO5l=&1D3FaQ$t)DyG4DKOeqgp=Dy_RA;3iWH#IjP_qW=Dy(OY7n<(F#J zNkR5%Z;Ql|ya@VSeM+!Yg`XV(4G?a2T5;w~QlS0>fwF+;r)0FV7XME}{w7JbXEF{7 zC71ZLRrYgtDZ5Nd*U*FRLFiRFjx&<4<$HJ`)Pdnh1PubAg2CTO168E35$y#HgxHdb z6W-s!vq*dnSN$`Jxaq;q!U$KYWM+!fx#i_$M8JLcE;KL(R0w$ed0`N<2OuF{sa5N| z@UAxq3^rYmTo_%BvdxSnupuZtcXBrG@)mSzgrEIjJt!-@;r?;nIc5TA`Sg5yFL2KP{=LL~7EVEhe~ zu9&>tlu<^)2RzboiVMY+i`dMX<`l@koa4_1C&Dq^&K^o0%Di+_Dwd|$>KGqYxx@NA zlpJ|aERK+ElRY*1V2XSyj(87t`%_pmuc;3GN>fS`%8N0Jl=*DL=vySX6Mtn!9KbC5 zIVZC0LysjYP)V-yeTC^-Je%6g!Bev$>}XAf@%C@f;q*t&o%dvMl@LUHRf7QBHKo|V(w-Qta6iK5PiVP z=)bPOgVTg*E(|eM?liFHfUm;gx~53n)g1&u_Gv-aS~qHQ0f`<&8ubGn6a@ZYkUbOT z)H#plvSz4I;T@y}ooxA;pN!cPkrz+KB-pD;%+l7DTy>*RTvs${L61GLFNV9E9mvU8 zIY0f#P8^|0Acni_BzRK(uz^qx0}D~l7X65#{r zhBfQJFQ=pK>r4CG7{-y{x~z4mALJ2voLSbIjsCm~`fHp+rJ z?sbdZdpN{zbI}hNcc2-iLNZ9pIeMs6?9U!M~B| zd(tLkXg3M!BIp7)Df$sM6@HY2k?VTV-Bhqq+M>UJXAs~M5O9P#Y<2q{g9;K`qNj3& z99|HfwFIDFKot{z3_917VmqA$i`^~em!W>NVyh>pCo;Nhe*X;{X`5$GL=Z+6Bvd>y z_y*zEgDwJqoN4hi27mXG?E7}IU}%gM!e(GF%#JJWIiX}gIBJwHwM>un7}^tVXAZKt z_v#<5+@IfAmE)-?)s6Ri2|@oow#-jlo~+6gn#gt5I6kM+`@k1dLfNE!m`57%S+0DP zBWG;eybnMgb*YuvZ@F(#JR>U#Bp!%cww;#vE_QW~L@h)T^V*n)*U24|Bj@P`p1D0$ zbtZG9q3g=)nSh4LTkc@_OM)_JOIyblzKQ>;^{Rp9i#=a+)%Pq5?gJXJ!!b0i3t$S5 zJrG&qE+2}k@ZCj!nA#syTT2sRLM~QjuqfHmjav+J8?JpDpuY3$dqUmt-aF{=H$W2t4!Hmn0aEf$v z2`!o9sR(o9{^dl~;D(k3;}t3g*;_bgkS3JajjBzXl}o5EQI98GeUS*Mm&`AahFWiQ z_Avj$yL}Jkgu5)JZp|^ zWEf^Buwxw0=C`x7(riBeox|0<@#i8EL&7;KTE7yjJa=^=+uH<2>q~m34)ylk(KW75QN#C%X?L%fq>BVVSHs`0BR^$tnRFm&#EDsI>{L zE|0;oD@q3?7S?SU0p`53WR)s+4-F*Xu|M9u{#Qy@aDni z?~x-ItecC(^7Ac}aRZK~$Il6&($G^wcTmTha*#L=8=f_pHtlG%S*9bw?X!GJ1@3@) zHEKh^E7zDS@tU$hr*Oi9(&tEbQy4Yb64LN%OBy@xz?4r?*x6~t;bO2{t*?zzmj`3+ z#YN-NULlU+Xo{ygn1$NmV+?OlrDK7R7ZQ8Q)cy0C1zNlq;Z=3tATs4I)>0`kp@io_$P$6B#} zAe=<;*#5zq?Oo|HaKS4F&DWV1Wn)0hE7nAaYp%GX>Wea9 zm7L{@@!as(O+ju|{qoK(P}^y7w8ujC#O2X=X6&G$8?yVBrI;j(+VW6zZGepXB04L6 zgpcOWniL?);LKsu=U0HA!%Piv#Vxy`r?K6ggt$-aeLjsgW$L{EJ>1-L2@ih-EGt@{ zCkW3XSVG6K%VJGJc7@xjuZG|BAI@Vfl6hX}BE|+c*16fUnFnK+kz-euZSr3@`RJjihAN zxfrnqcduS9dL&C(m+J?#%6bz!-b&=gt^`lH=UG2 zp-02K8?)QVgXPM|me^r4>l-JwN?uKg@J%CRR!9Qa5M$#>GW3eR0Q>he%2@LOpkZZ0qkA6oU34KDLT0 zXS+jhn7M%0)Fw$Z`$7``PsAZY5+y>lojt)SWmqU<;TkING+3j=R9OURdpHE71FU4w zqoZ2Q6;jhtSDdwi9=Q^YLf&y2Hb-O+Li3rW8U&nTzBdE$M8WVzaB$lA z?ahjpi0HzjlifC;pU8qJh+7ozRhW5bM5&j(aac45NyQBjI0VcSrM%+4$wixAgE z(4#|_8-G@u?FDFrXcM*XbX*R6zJcw%;4+98aq7lsDI;O=l7t>!aoi}?K5>wxS->Ya zF<<$W;z$(;kbJpZFrY^|7sl*#QSHnVjMiQq)X^5WFOtRkKWtrfSeHxFri35e(hUOA z-JQ}U-AGA_ba$t8cPSv<-Q7wz2uOFs_ux6_ef7NGUtC=9Y|PHi?Cj2cPe36RhacbO zhWVOA(r3h*Xi65o;ro3>qO0mb=Q?(WjE2hS2wd_Z;+47I# znHw)lB3R7E!APji*|dEcK&2cxRn#S1T7+f3?_iE7VJl0a)x470{L@f zxnms$;bLmns#+-k1w~zH%8JNNdKX}9a#SA%c!|!6bB`X`33zSC`BiNU0`zm0cFfON zBs`lrJZ|Y*@w#GmZj@2QCNI%AD9Tw8rC+eBqV4`l_~t?O>1{O{fS=?|xMl~dm^=$y zO?4lFHz`&svY~uaF_ExAAw?n#mChfEUWo1aCa53(8zH_PbSm=R=Q4%!zVY@-6@Ei6 zDVA6s=$fy`_>||ED>Ss7oS4&~4=91ySSl0yeZWKRF*7n|@I%&Zx#B#T)s@i5W5nky zckTcp$iP-B@ABr7H)AGr7oD$Q5nOtBy0XmnUMwPB*KA6OS@CqWyZlh5xqa!=zJLWs z?8cRh*-bbhI3hNJc6)ZAYWgGdqSxAr*HjuhF{xz(tmeVJe$*9fj3%+ZV1EEFQ?rfS z-PQ=Vq9V?|f_a{8ET^9;O zB%}hT(dO7^Vk`UAcJSOTiJKwO5AWB5`HQZ+_EP;}9Ned-St-T0L=4nNyTXt5$C)g=$fP2{Dr12Lf9pw~F7CqXtW)Oo zWd^TH-8pFu1D)}8f8~})+}Kj%M3x8(pz~@t@DzGTu3=v$9?1*ftLfcYguxsDU&nH z=G)TMWDwQ{8xM$LS+lyLYL~}-3^K&yu+LLxrU@2y0=T};M{GP<4p!O(9smNdN_iRg z;|`b_8~_}IT%e}s!6qv!I~PuJa*yZ#aXyt9&@}XCI~n z9+VqhFW%oyCbn)0O;exGRx0uK_VrB(JZ=cg2kpaDi(=&4o!(OJrU%?jWh*1UH%H%) z`UlN~i&{jju5^C+GcI9_XofoFw!7;K_ZCvf9xSyV1O5h{&dnLxR?N@d>UjrbM1{Ve z$cu5=mH>eT*-?P0iEFXEfHSa_#rokazQcITw~C<>R2JU=csqIan;uq{Jd zd&K_frN#?Dj<7xeErT^8_{G)L!Zt-DAzw-)KG&yZw97=n3eOiHE~crifZ1u$0T zW~vZF?TlGnb$7E8{kl9RC@1jf07~sZB8xd-{0iJIbO)#)pQP({z@`kR2xE`3mF!DQXLMk#{X)u1I{x zs4zp(^B*Hfy*q04T$?Q4PMn9u-|{|nfq8sL4A-FW@_F3Cp=(-M{H8HwTz zMv7PEB{EN0-yWiX*oz@f?eBLh6OOFU1{JaZNX!f!BL2019Jn!(G4e(&jr*3{Rh74A zajb5F<10eif3R0us6~5HiO4VIe@WR42VxiuNqTMr%3#sh2u^>k&q?G)js#N8-7|;8 zj7zf~64=b7P?jW$V&*dxVV!;9Bmy!U9yZh7+`ag zu!?d~iX(}F2D4C7Cb5m49I$(2iO1=o0MZl>YO2CeyPTc#^J;283|m9PP7_2$B#+v1 z?c-a;gB^;&S^sBH$X{9j{E!m`dl9WH5>)Lqjv=6fo6mU&+s7}QknqDhT|Fg>8m0aW zwa9*eiYVDs9EIZ8RNyX|fc7Jhc6#28E}zF@I!cZdzlIm^Tp@ga3ZslS!RoU&k_gSX zRm4rY9))7(UjzSZ8nyHg{Z{*k`1^DRM3&Q_x4isxBd~cQaBgB(p)a3z4?DQepb1Fv zr@PAzo=tO%=j~KxK@g#9zo)z1dc2zMn`h|h?e#{~0gmxivan^_m?NRad-gCh@C~%z zW+X^FjtZK66iO$Y|03%XaR-wwD9V>Xa)KyH67IK2kX#N>k&r1A3rl`TqTuymHMG@7_btU6?Fn;N%7oPhXHFb6qy2TwIX!Zf`kKW4P zfU@=x5jW#?hF_MwQvi7ok-!-~E1DStL_8hNg$BRLgRI5bM#fyJT&Nr89zU6*UyX(4-c@$C?d_^BcRj8eeiuD2b7!CKxsz`EOUR%KWEth zDo+WE6}hu|T0JlqlCSpg|0I5(kK>z5@oNXyk}Aw0WD_BDg|7gF331PslwPmZk|lsr zE=_WuEG;EPipcZYpb@YL`wBQx{Jgwr{C9I>-~AW`Qu*(_bl*I!)a+K<)C-J|Ba-}q z7zBV=*ibSZvBH#!vR|4LRs_^v&6;4a@o-XwU^wmg8QXUffT{s+gxRUZZE#+rrYGG7 zSn8>@uAr$dWPvnsad9-DVn)Z10HfG(abZT~WFy+H7$pKrc%8MZ#`WRWcYJ4mKqr3J zRQ4C(aa^J`1|HVFB8IB-TO#UFQW#cVIgACv`gn?sEmIZBQ!h zU)0y|Cd@KP`&2qnCtiP%C9 zY>4DL8#PwYdT z0h+rzOGBfIpFHUKs4V^wC_Ns(Ow8Y6NR0#|O`-Nr*`2b^eCzdkcmp+POkQT>HOUMb zM~jLO;2HQ(id0CTIxErC1MRtZFP>*O?# z+sa9k(-goNCkcRO27r?I&+EqQxs@#Jbhc=UIAk!Q!y&BVR7Gy){2zJ!8j~dw1eG1_ z4gRDLGxnh(f*NxH?`srxn4#+jsgrdVVC=yB23tjDB}w73#^4f`uH)modYwNI{h`F; z4WO*63hg*QgYT7IB-o%TqK+~^SbS@1V~%<5X<~)6-R}^U=bgz%A>j<)x5I86MgHc z;`sRBT>@iZNG`c}4PYSR$;Mv>L@NPA9_$YXE00!=RZbx^WoN-BO}&h(EyIzg6pM^V|?cN`ot}l^A_eaWjed9cZbr~&u3Ywj~_qQ z2i0^D9Gzy>OM^i%?UPia9+b3o7}N zBdOk@pn?|HKq`)dR4ndPet=ngzVny6TJdUIT4{8k85thVYvm90u3pw2Tpmf~n3|rB z18m(kEnRv>M(s9W$;|I>_4*}LJ_1- zjdkx8Vti=H-^$s;n4QH0kSeoLoLp1P%w*ZXgw+9Wk0E?2)&SJIohQ6c9&_(a2&}9- z{+M~E{p{tZ06^?}nBllxa-={Jb9E_h0fEBVGTI-eTgPiie;5Zd76_$#_b2^K@T~C98^djHWI+!gD8yiZQs4?4i=d(3fT!UB+91o=I7a|CDn31 zycr@G;SNft%?ARY|IFdps6hD$8{zFIl2V>nlHI|e-YC$!loL&5GoS^GSFIZYfZV zje@m^qDV3@!PB6w!7N6HxV#j_EKGPOI03V*av_tU0?#d;`^AShJI8-4CyE&)M6lT~ z=r*G*CHOm4Q)&E5itcP?zDdxAesYa3)*7VG1xfkv^x`d=g-eO%k?8Uzt9UW22F8caHN!C8NM=$9Q@RUxB3?IQE)E%>c^498X#P1uZPJalI z2poe=YreR})6b(vMmMaRl}AHm_oH1gO>j1LZCfN+-$8(&1dV@%qq`fEQ5^e!JFf+U zm>lP%&G7K_*g~GHi$3S4!>LK`ds%?<<~b((_{_I;n%;4Wtb}`%8mo30agxo9`-i>( z3iT*|cSpVR4Q=){K=C*|h&qWRv zJe{y*+L2@UKlDpo07BBL-;8$e{K0Qe-pYJ9AfN;xMYyPMB)>cVq>~aD_V*yb3TM-J zy8Ayq1H=>Qb(mi(BAA+(O!g6Zr2(O}tfHm3r-ouR=1-R@=4M?SQ=JC%|1LJ_0;lywCQ2 z_nCAdB|W{Sk`K7aG9Sy}s|~LPZitwMZ}r2`*}8x?=-<|*2p=5QXrBmwlCbR&?h-ji zeZG^4Oa0S4TZSp93PIgvm()*CU+dRNk>&&7Q_P>yu3LJK#;*GneUp@#?w@qM9vo7c zfJ4=7?lU-6*L9ZyawRdYacL@djq=&EM4(;dX=vpU>iGJgCH}UppyngId$$y4p=JKOW(e4AeyDjkKk^-Dp0ontTwzE+lb63~-jH|1w!V^5T$vODMsj>4orACdThiJpM3;<1dZXc$%ZY7+(0(kZ87w^&1Qqd zZm^0_OjMEn2Ika(Edj&C&p6?Wi;Mh>#1g{jln656SM*`~#p;3m83 zB>|sQzdZ_3dixpQ-joEq3`?HGQT9iY1wzLm)FN#Xf5W&|<){oPuM0J=_|~U~qXpX4 zY>}W6Mk;SwYGX$f7G~y8kNabf!;7BD4Qw%w+fTRVx0fTu=c~&TtXfo2kG%iHwtovd z6g66jz3)-zO%&v%&~4fL>8R@VaGt*Wl`nOsCMPasL@n;BBm)W+$uso1ggA6{b2D!Q z?hqhQ(*an@`K}f}*4jjin5c{2J_BHZHD|u@6f%Kdy6#{td3$xS`S_n;`tJ_eNxc~h zh^qWr_)5Tr+#Wt>fz3tbl0)A$O>pA)8I;`u%;{fyD5jp{EJ>`oF@*mr&Xe8+U$G z7FC!BMDN~%1)wz8D6qs7rQgga7>d90X|EM|zKlVRH=y1De4#X)PVe>O-J$$dM)Qmb z>d6OV6ep{M@+7*=3;}K!?tp*k$$<#iZrFn#l`n8C)>fH+oz;P+);Rc8o+W0-PIGD1Z- zFe)=Di?{N#Oof8FEdbTV_Y%7=++DJe9Lz{i>{vchrl1xxDxb%X0{bSOTibt_Mc@SE z4y6D+0Rnsi%r2Kz^?N_zSvq6eEC$w&&lQp9bsWz}Yc1#x=P-1B%xG}G8AAOU(7Ua0 zWq~tMf~y`yqyUcU*Cw!YcM)@5I?W^O0xaeltcI!qX?dyJ^0li zPcop_zFi&$&$2gEXMcZn!w%d!6OS80)g}mIZ-~&9JxbF5{v9Stv|*riAag$n!@;b; z&fSacd`u*aAr&1VZJ&8(e4tAU(X1-WP6}z!MCX!5`Hr*YJ z#W|gQ{-f>|O$ZxCC+_RDXJV6Q?{o1p^YAC1CY&hw%in|z1Wy>?7)-4g?9*-6Iy;}Q zkhw9ba`|pi47|3s*WDrk|FMAl%Xx-F&7pj|{E|oY;lIZR;DXi%%;==wXn6cXy>t`e zka87sN@8g(&r?4G$}AGdzFN4R;5G5!?|xp8lB^x;6*Q|zA1wi#W)q^6c^gs!?B9|N z!043S@%h}rtMnYV{9{q|rHNN36Fs5{1IiIsi0t*<9qojaB5po&+mkSaFDYxo()nDsqf?B4rVAxB&e0wAZVUb_HQMRAj$fn(~>-cv`Oz#UZ4n0 zd$*=*__KNX#q<&bECJy^Q}|1Ibb??pL;N?y3zx`)eiaWU>zeSDT1>DQ9X_q}TCI)A z_9c>LP#~yUVu<)rltzfzQsn-u;~V5OZE$-51}g>osw*RzKQJ$zB?d(AK(niEq5gG0SVQ7X zDmljUW#h+zzfi-C0;_cW{oK4#_&6}Ia!eFK1fwTnmX8Pbi`{m!SqP`QAq`vsS!chr zicTntJ3v7RlEsh1W>Mzpgy<;;poSb}q z+=V<7CzQ!Y&R-zWr5qM&cn(Had?QKzYujR?WYvj*r^S%=d*j~)L%U*a&cwemRZ7Vi zVa5^09VB@bxX+CAp@k2kmtMP@v4f?q?|oHhdVkb7ryo`vRs2~`JUWZ88iGza+3ImO2|&5x>9yyr8JR_lPQ~ciO1A??*JSyJ~IAF-a+-E*Bz2J$e4ihlIF}6D?|;%>K)2 z@qI-&)LA&Lws>+eO)Y$IX9z#JjuP}L+2-#!X5KdLwaJVpjW7Wt96h9^k+T9I-0`l{ zw9o~&43%0jxZUrm3c^S*v5RTq>MVZL(_%(}sS0lP?{NGhNH) zXH`Ch4r5u~ysz*sK?lJBk61hq&%xigLG4(gMXqW12oL9iusnobvbDti|x3v=>1m2VUHo*!pxp^Batp z2Gx>l%&$+|CysEk?D6Icy|^B^mOiQATjIfL7=4Z7(BH&&L^RCOnEHlK{%$>*!?43En>Rt_H1D(^Bd-8N4?0#4g@q!g0-_I5$n z%@_&Z_qA9iQ(mo4Qmz;CmfX!EHu2ro>x_G1-g47CZcec;A3nD@ZwY#L?eJOmavL>N zYs%y{hB27l;|O&hLr8$NzXHel8aYeDt&J4FcxasT?~RP;!-y<@v~H}5 z-W#4&5Ub@DWbm}vPL-u*CGjJ6D!0_31@75qQ6T7HY_3}KnFFGe1x#Qx;BJ9e(zjCqF}2oP_wMMB+jp@O_d>vokm{X$z+`b-+Imt+}-wiLU@wlfAN)> zooO<+FB)1#uFFH|6yad~*uS5R$oZP?R@m!mhg~KNH7l~+Ni>w(VaTJQrH-@dEhP*= z3!032FL$wq@yo;k8X4m9_fYREU-OnZp`J1ZdIo0>X)Kg_6$7Vd5o3j&*6SXIg6F5& z+9}bXpr8X=9Drv8fVG_i*D*7f*h(bbTEL6^1Uy@-C}>4WDI>Z+sUtbl+hobL`)-*@e=J1e@VG1e-Jr1@2fN9a zxNp0oD%)S+mE(N2&y}eVX_s-nM>)Yez!9mdpI}&XbbrwOAYj?4p4K^ai}XUg;@#Ju zy7>UTLjG|<0>uh#oXDrk^1PNMMC`a#T@L)b2?pb^WUZeS$_Tu^Xdo*BQPskBbbD5z z_FGIQ_3evx z5zxDjW6+{}%BrE+K|5P=DMs8ZKf0OBbh>`+h_wS7)p3cHw{V$N@60&{WAky(7qM!g zWwAgem|u4?JgdSV{zWvjAf*)7`wyGtk-Dr~*BQ!kvF<6UJ+>EPiMNS+(Y{LjX8UM# z*a>J`jU#Sv6ri>#-ZV1rz>z&tMdJ&4D}V*69_An{&cwmyH^qHQa~dJi4EMd2o?|dl zdU7vy%E&0(a@b-YE5`E#y`}P=CJ5!Z|DLNGEbudA!r}V8Z;V|;QWO@!%dJ=Gc0oNY z+YOp2c;*xtQz2GYjnT+(H20!-K4WG)#|d?aoys$F0)1A^n#rNAj?gYnIi@=eZBZ3!(Zu2(zIqU!>i+WbT|+gj{+N9+yz=7o z%{L{jWdqiooRbon63fDxnATo5`EO_Tx_w>^<%ETpwcC3x6XGB6p89`qS>YSti&^!p z`tI|#gG&ADIK`SAQ_?8!Ta%Zt1MT~@b$n|aoc$kT+^^n8?a{TU_0^P|_vTq1!DH%{ zn5^;fF`&DAdN()QLO-i3!E1w{7OCu*I7NTQ@o}c}JHD(iW;Lsep>AF7Q0zsmDAc_* zRv((q4+z2%V&RUuM)gn@QjaDW!if&SKAa5&NDiWdp>`TKeu}7XIn}22d*f&Z#RI?g^PargIp}BY zgh_b(m!)LNsWs|OY>heJ32f>MH)U>2%xw6A6d}dUcWf=))&nEq$wzG;M@cD_dYz5T zyCH9#nPQ0uIE>5f+IP5HO0~cxyYQfEX=EeJHN<-Y?s>;5pIjF+qDV}!7~aa2Y9C#S z;*izp z=Uj}Om8WTOmoS$~P>&G6{lqQV=P9PGVZuw-)>nI9zQxFa#UTZ=g`9$;t)GB1|Dnt2 zIO_x_S@Yg*GtH!+AHAfm$r9RSg5hHcGE%VKThBqUrjAQRp82qEMyNHas)H>_Y4L^j zO~z?k%yA*mOAtR(>Spi=dAA8S3=YI&6qcQkwz~`i!@3M*P%#p)87=dv3r#)rV_**O zjN>TsThrpurCh*`;7<2`G6@W*&BOXhQ6-<(H%~_p#nTV1;3OUAU=zYsWjS_yau}4x z%eL`;#W$hXVe_(}TTM=q>#U}puXO?OLq||0D@&l-t7Ss;1m=c_ZRP>Z>u=ilWb#9m zQvsfZCK&zmt>s$;MgkXF=iuz+l)fdIO8AV9%Vhl3*4=R%vGjiM*j<8HMEmc&!IvwH z^MAsluGceM1#p@0c^tx&pMN-}xQJQFc8MNZd4O&`H7y@RJg=t})P1yOTYl}^;0_t( zGHs{9OJ}(!Efy9(RMWYV#RqSa*n>uU zOSiqQBZ8}1OZs)Iv$iXek%gIbSLB!KOyS zM_z~Ez7g&!=9PrKy0p4Nc*H!K+OH=t59pAR$H&3YW$uRl)zL7p zQNxn5oboRG$L@!EO7o=;$NePzgst{V?@A}#&{GD_g~wD`KbQTK)!1R!7B_8JWa)I- zircX4md&3C>1y_S%_W`hXfdFoXY-O+hSOUSV>BrYOPgBc=w4dapLQu>DeRo=oHTC- z9@nt4WL2Gz6skARU=ye39!=!Bg)P>!`<^SgeU-IxxF|=9ArzdtoUKFqMYX*HNd{BX z;&prk6TN^fX$Eg10a~ z$JE$n?XcHiA`t|~_4HS3m<5te1F*g-4~n-zVS?az9CkpEcGV(s6k7q(c$-{$uX1>g z$ulXV^C@;+YW(2)3+^?%vP=ibuQo4UbgVFy!tR`(L2u?T?+EkF9-|Nz67>WY;J5Ny zZ78nkuwVPMVfymg+r$mfThoKj2dCj%eB&lcnkV<6H1e7$m`Wyqh7IA!p5S%5sVK>CiN7r`4?r zM<4lpg!KgV%&!$@$%$pb^a75$Wtroqgpp~P8Bd|@J zphrg+mc)<|XIu#X!ORIX70GeJ-6M$Z0S37q7lV_fiX#svQxb`XR@U`-O=H7~%w+4F zm%#G${H~Xk>dRF1CeDYjAa&!qART%guU6cqG=W`3r2XM5t`~`TN$(7jD_Y#9gObuz z->o-8d3AiLmK{wjS^>b45(PqXU7Hlv8!?4KGL!jG8hr3vx{hcKZKj- zV`Kcd*vy;pl}}l4o`TZ+td*PCb*@Q@XG7GAze+T7<3jZA!Z|}i5uxosT}x;6M>1`@ zTBg7-1f&J?s5r#cUQdNQ3vD=IIWKC#aJXRqk3h;%))5if3x^-4SfWTVXZ;9d?3lSs z+;e(Vq5eW#BuFO)GCN)E`_1FQ77VmE8eQaRxY!-M@|{MwI4pOL<8O@zf@$TI8)P&( zED)NKIt>Y6wdA$f8SeQV47dvgAGzFBaal&o1gG9G;X;+wTP1rh<%*i{b}QP?3Ll>Mc16 zYIJ`&@j{5^E4LW~%Z0J|JBzt5pWa*F`&2HPours597$_1sb5Y7B;q<)Lgc~*ySyS0 zs+S-9G=mjHHyiG|EER|&0uu zYAyeV9Ie~szN8@fm#$3UXSJ;*ai4>FhSq7UPGKll7CNQC;t22rY3E6&1p^;!XV3I%EhjgYH`+O>?@}O&YR9N6&S8&J*0SzHjv!@>Kc!*_m};)oq!q?XREKnH-n1a& zO(C$}%L#xTb(uC080*?05Pw^KA>4DK8mBGO{yN!inZo9y$)dwZWOxOW8WQYxB+rdO zkTB~YZ1O9@ca6A`OqwAz4-~H4Aw~ zl~mglE+=Xt?LQR0IE;p`zU^Q}M;qa^vA}c+h4^JXaGM6_y37*y zrZ6pITMtPdujC{`fH=#PzV2dg5Qbqj! z7w)>dDhTAoPpfZi=ciU?6c-rl;{u}Do5(JN9e?7eevR~FRD z$) zNexY+5b7Q+E+9m8wv!MN4m-ns-!T(6du1h}hTcn^nEnXgqA?)C=w0YcA{2XJXoAIx zE8ffqpMi;~FNCFBCb4ea$kfP!d5l{X-vH2iv2ac{J+uH6A54mvhs5)UV+81hAsK-x`4313^yRNJwxZKNys&XjnA-!W z^T0C%Z@f*D2(};I@Kjv+GG{*=>jGOeT@F9IFy`p=+tv%4@bjf+0gyDS<Q(BthU+`IN$)@n)Wa&vw85}p3qSG7j={a;W9*+P)g$Sp^YP7+u|(Dg1};xb z&hPG=1CYPK?C_MxxXSStc*mH^mW`aG>cK;tGoI<5=*Bu7=2lulqmIX@InmbYF`z?2 zvf*P!bEl!(h(zJ!t69?o9DN3A>verP4`c6OS-|_+%0&~@AaAl7+3NDy%xG09w=nID z6v}wTweB<(6L}G>Kz6DKxh0$Dtqn{ncll3iRq~W^Mraw?4SwQ|Bpag>CS_gwYvtsv zL0zVamoW7@%Z%eW#SA=7bzx1|Hg^r*L*dh1OJ^*+hZJT40M4PDcdUaFHQmB5XDlgl z4u>IfB|F^0ATTScG-x~sj~pG1QtVZ?kitgejXy6}xH_w;lvXK0N2Eu@yTzO@#3$d`~#L(JE6 z*X3ojm=g@^u%Pb@eboqC2+!SI%9{UX4A#2fhiz2N+@=wPT*u}n%-71{1R`gq*|p9` zI=XyuMslPzb;7x?bf};Y2(07u*dWq$8BM|+P3zSx^PBIg{+9t|@zkcfvo3G&U@I!w zy3G-$&RgH4Ij+a;m1b1--oJfd=LyvwWr1=vVY~K$hl7MPnQgU4_7vI)l9-)u$BS@M zH=4iTvKb}V@?%uRRA6t?gQ3=cgO}41J(_fE01s_7H2+29-E5s%<~96fhJYHP}RSa>$idzO$=b)i86S zCJ;Y}A2KAlh)`c{ZCt=*VHoCDP;Cpkvr{B3T8O!suN;YPG5dPQzok}GPSvlzKvxJ}wRWo#SZD)b1XB z9=rH})rW%Y(8NK45pDEW!{*aYk_rJ&R#Pk3yFspqH(&b+)qjie|tdssT=v&f2@dcR?I8d&I}>X^d(4|aB=ia zyLjYJQH1P)J4v|!)4{$a+*^mw^P;{4gXmt%YS3j;*HW*wyeAX<<MWV!lSZ5s?<`$pF);-^V#C4-TU8hZy!=H&$qI}vkV6@lRSX(5ww2ZNrN}< zlTpH!-%q6XYmJz_|52wNU3&0dm0g!qYjQ18C-7h`}#xW3|AOL{aT!Arx}t8B`n`O-qe2B}1%hVwjRZKl9;P zkAs08T;t{2mThBLn1-d9;tVd=f^&~A0N&uaXF@aC_ZexW5erEhPJ@2tTe zfA4<`fW%6tzTsh>#jlrLxR}!T2d5;9>|id2-IeYu%0%aavkLANASK%;@Uu& z`TJRs2g}EKW~spek3vfnjNf!uJCR&Hq191mtdcl1A|#?wpG;-}O`<^qVnDQm-XknN z-e{OA2V@Py^`XHN-2EjchO&`Nj0XL^A)>!UDG0mqMYlzyMPY#2*CG2_VRabY*6bJ~ zeRZ21{JODhCLY#xzhV#cJo;9?&_6Rc+h2;eW40=K*r(-ZCiXh4=f7)B2`{S5KA!`Z zQNne4J)ET)eS$c6kOL}HY017W^;an5Wr)KuJq+#tX&F#ncHD^iN|Qt%kuX21W`h>l z7?E@8kt(>>Q*+ICf@VEQ^0$;c2p?HdFx2E0Z~WIEEsuQD{RaxwlTJ>R3%DqzS`tW@iK;4dt#F*r|^FhBm{|VDalYySJSnd7FsL=m{ru@W_RGwX?0$M#)mC4 zxFdSoC_d8#BmDlwujlg!{DJo<|8M~iE1V2YlxCwy(ddrDu-qKGQ~Bbp6$Jl@Y5Db8 zJ1GP(sc8-zR%ltK#Kvc7_eRV)iFM=!7?YkB+ zelIHZ*Pz-HgtPcG6@bK>8^&b1w-!Q{e+>4op=&`ur`BBLhx{um>+hLil8jHl8SMCB zesd-N-*IX|`h>>k0N*cEMc7#!3n}3InT!Jbwtxa2mjf5y3H%cc?G^iG9+lnyjKcB_ z)ax|rJ+lDY>`q^sH{zh2KjA08#B4?aK~RdK%EdM>j6hcWr`&)2R!jbzn``|>(r@Sg z`ztg=Hi~tGE8OeAoIGGX4_q?@iRAL15B|wH$OBW^tHF~&s=x%>TJe+_k36{J#vQ6o!2OXET1SJ$+niiscadp6PE63~xDDRLh$b9sew zb${6qf2}=1xL}W~LOzQ>Ke{teRPlU}=4&1S zk7Hh8rssTIXXfL1;cl!vKU14&rUyGBGBPD{)MW5;T~u}+nsChA4=`tn7p^J!U+XybzIb?e z6gNrdy}U!Ai}_bN=C55>PJmKmt6O3hfbzmdU!Rx{$kZ^mwH^Pw_Y7sYyE>}7Ba?{C z)4N~C`ju3=mE5lVJnMt z5;2F|FzLmnr-{ic0KQrn5)yL0bmYlV(H3pml0wkza-rnvWFj&DG#kQdItUaV|I@ht zwSrFU5SXw1z-HJ3#^ag{VX34=6j7LFse-8dk}@(fx=YpogasYRLG05A0oiV+1iBKm z1F@|9R&0v6g!cao6Ub?>hkC6`p#fBY&rGZbFe&RnTn;}~Zg0lCtff}+r4uK~qIf^e zQU>GT;z|KXzVHT%#DE+7N3E}USJtwH1dtErsw|=Z!npz6tUj3@$@*<_m${8Wxk_+2 zqVNb>V!W}!aEghe9r#2mFyQ%#)@}a;4SmhobIj3yrEfdRlc+cIp7(^57ab{xFQuGz z0oU!_(5K>fQfj5RZbWVHPsFgkU?{vRG*>eGR~!r;dR%) z8f$Aw=#f(@6esq6pS)~yGFhB3>)Ygg-+ya${!`rC=cQ0qx)aFCsl2XG%?3kkU_){T zs0!58y(xNq-6ude`^+r+uKw|M@4`fJGRZJlSn@VGdFV57*|C$1cbPfB|=|Hgp^VDc#KYoVLX7+dM1O)IK}zc^hNPH2Bd+Sax~# z;*pV!O0#h$+X4SAME-Y!?K!05`m&6%rRGN{IoPK`hQS`|-LP*VZZLWR;ISZxzHUEs z>=y4bva;s&iM{CyU`eD;L&ge{5WXsiwAJWb{GSHB$;zuy&5kuD5SjyN{8isvPPp9v zs+daiwK<0^qR`!OU50a^j%I)HWcgGs2i0-m z{}E??sG#3PX92bUbkqToHBbThz5}2n;k4V7bUx|9>N&6L7^(Q~0h7^GlXWc~Sjwe!DQ^~sMA{CJ*G z@Y-M1V382WUfC`8e7HUKL3Yoo{%FP%oUbJ=CbXY0^e!+csB3y!WoIYh3i+W59Xfa6 zf7ZKv8r7^^cQ)<_<;Pwyp2!Uz9^Mq5gyQu+frw>OOtlDoR)>Abe(*^d!jEkGwtuu_ z74-MQ(7u7HtjbYGRDnzVjAHi=14wi~+6iDjYPm6K;r#)SnT{W;P?NXwD|Y~OnB0m6 z{$DMoh!o6u!G6rwDaOS-c(}S?(?+1{aq#xx`|9^nE$R4>Nlq@VVgMw!LzS71jkDIj zW52T_El9m(8}vWp;e?RJ@PYm!DEk&<1!FsuK(|IlbR${65y{h)`E-*R^mMEDWKnzx zfONam+HSwuUhdD0ldVv_OSE-9mcgF8&M4nL#M``_7|O3c{IziHf2fK68?y2CB_Uf2 zU>y&MBm@*MfwZ|!mN8y*LZIaL@vKo)K$OS6k!I9B$nzvjkJiI6Clz@L88PsP?;~rt zoLqo|2jAmd2*uL64(Go#q#c!tq&&_MbU@GvB$@{%>UnCkad7hSm9CJo21H-Im=ls2 z>2P&!fS+P&0CfT3 z4rM=V5(r0z%gKaWG+x7YLLVio+O8A+KMlP^1q3Mo2+}18g~I0B=eKLmn5udJBe)ZP z1=ZBlglT{wG#Mvr-&fAsoYtxHKdSYtBx*r|%9z4#K`8mQW@c2j+HrVdE;hCo?LR|p zP{lvwaO1bBPUwHT{&{?+{r`MlO$Q;X2AVr?+bgZ>e7IWq$`b$ps*&rK98(XmeRBw~ zN*9ssjmxdHl2{J^(a8T;47Dh*P{n*Z`-^HgJ9c>zjP%iE68|W@$F2Wk>no$`>XK~( z0fIwtcX#&y!Ciy9yE{RHyB*x!-6as*-95;`T@oNb-cFBuyT9Dmf7ye*&$3#xW>w8H zK<4*2L;UIg>$T2mz68z23hx(-FOVd71oD8pm$D+CrE%Ip{x1`v{RZO45MGYI==1bb)9~?kijfN7ht^i1 zWb&&=I&TQyw+)2w|9^Jo+j~n0C_GPHjN^$!>Hqg23H_8}F$4JHuo}>5! zHN>0|PZwcey3RxSWH35YUEWKT>f=lOyDWp4G1(hHwlX|6b+)e6#KiEW;SG zk-#f1ra)}ujgvR`f1dr@UhzPN3cGL({F$7w@3V!H{eLlKX=4WaO=i!Aljn4(d(YO8(eC z2~_g@WjnsT*F=V;$S~a1wH(dt5VhovKt@Im{rxEP+X4rd5RROj+`BiL_6uxyW>0J^ za&oJppm;AgoSGFPl9);Utef|L8I3MIB+>@44v4T1s6z^g!RHF?yzJ)R@c;c{^vCqc z8ayS^1)7+c?4$=x2iITM*BOJyW;PcwnUIh|TNM;T)Gk*s&G)lK|JzJ4;6vfHQ7d+^tFL;l#b=NgEA`~AqY5PE$pk1be=b+$ zYE|^To!>7z=sOP&Vw%ms1J>$r_rJHPaMF7zZU#I71G@%O{VejCFR&bSNt|k=`(K3- zw~4z>YdZTxQ9fXll$Q3F3f`B`tgrJUcy(GH+$293J-L2QPhNTZ_YuM(fH*MV!dBzI z9l;FH(pp87uX3$PInZ$|$;u6W!Gy8(5C?UaXt-t@?`y51pxJ~@&U+!H; zDE)Qsmg~vx#*nV)DWkoz^u&5~-6S}M#&5WJ$^D&)p}gu#2M+{=F{CfPIPU$i&Vj-~ zoeJ}qA|x!uGwzVrx2fD!5=I5dUdHji`5^zf;W*v^^Fr{B@aO{e)Vo8(U!#;RL~e1{ zHpW+o^?ComnoCDD#PPrxCuv@vJc-@N(^@-O9Mt!P*5GZCV`A(#G?8z7>Oo@K7$Gz6 zZ&fL0`Xcw6dP`}h`v0CFESSJH9DhpNi&Ny~>JvD<2L6$$Z8P_$Ps$)?+rh1-kBr*p zHrG8T5j1|49eg7G9u_MzpDCk9PlYUosrnzUX-6+*cKQ}lRJFKZ#mvf#cDeLOIR+hM z1j(;~YWC2bot-+nb*>jIQWb51iyL?qu0GVGzs*k`DQw=eUTX!vE%8y5q_B8GR7us< z;Q2=pi)ocvOgDB>Ca9(?ny?pVYO(DT8$Jz^y7@cc`p+-q`g2T`_qI8 z3zSU7!&f;3ZT6?Z2r-T%NJ!G_$p3_yf~tbtHtYBNT(*zC*TrY~f!aWoEct&i2i8G@P`4QP_#D;+k~Ow2su& z5C5m-w~Kqz`5FIn=Up02YA?%SMjV?a(wjR$ceqkBqVUy~}hkF36}rUE>d;2?aV+*3yOkDH6m~$mT0Pdp~XeeKd*sU$+LJ0@r`cZqYZZVSs?m zgcN4aYyUk+GCAYU@Sk?F1`Xms<3j^~n*>ur!u`)sf@4#`al4`q4M#l^TZ{vn-*_+7 z$aYo<0@X!GbU1pgzduQ@mRT z=x4}7tA`?$HuQJS8BC8p(C|BXx-6o~XC(ichd}^t!IK(isDw|}&j7_AYRoCDuuo4< zeatU&%;mdbH!Jh==uCP%#25a%$&OCOY*hw}^xG{?#WPpV|8znEZ9WEU_A))TeecLo z*bGLkom#F5F;~{d5V9<^|1nz1pzh{Aa!6w?f{hO&jw>+nUh@YmhedNyIeh+Ca?iV? z*(*RKE)3B32$M}^3i)%dX>SgAjKvy0^?H*nA>M@rzP9%BdXc8HAKCxkV+Y}W%ys8J z7Q#l@5wx7P*~?bzQ&^{iq2vw+=vd$~nCvl0=Ai{vd2ndHSXGEvLKa+|Z?vl>3&qCN z=yj?Wu5g-uN^2)@zy*6+rs^^P)u03qa^jLdWg>nU^*g%$-%%2FB5x9&&Ha45YqETc zy?tJU!)0=8nuWP0Tl4B8SzPq5f4;KK8!FBGhRGn;$J$sJLj-GQuj}l@YKpV8n-o<2 zgfaqV+u)1*vXWJPsoQ?%8Y_$doO&}$09bt&hpQ@qJ=pmPK^7PO_ba)e+8VPjk=;jU z<+t{1T0X+0r37r;js6N^ z=vptYJ^(4uUWe03s=eEP5eMgcg?yHd70x7yw~ONR^st@95W)AfEv=KH<@mr_5mm#{ zB0cWL^`GJ8g}gVkAC29xR))D(Md#YFCYuI+N9qbx`%DSD>v+8~XaQ#Wb0$qbHW-!x z3Nrn5-jLH0cqu;<9~T!EaCsxd0cOZ>-;vfru5j4@KQI0Ruxjui4pJI;%eEl~mi98D zSf-85C0D;X+cqi2#xQ-+_g=*DmXOTjg*AOrH0P|C5LbqM>?S$bA5Gf%DQzWmL%7W3&M5p8liaY?R8VT0cB zummPD@E>eY8S~tk0QThjFh+84zifa4@Po^H1=-mNNU;ft=ElY%cA#N^h;uydQ%XzA zf+zes2|-y2(fZHD)?|ZaiJBWX-S_>lMLZBEVp)65kdk+0I4nU;RpO;F5(8WiMX(%g ziX3XB9PP-2d>9H@Jn#SISuUt5hV=IK0{nwFVf-Iom>XzR;<(cXy-9k8YUcFtyz1ET zS!cy>9m&~;gNU0`+n)a~Trq(Zh`SoE!`$gafE&{pt%c*P zU@1L?ZK8*Cjf9~KkynL1=b^cG1UL^zz^`%qF|m5pPyEVayV^i`w)Is9Q#dx_PjRAm z5vXaiL6k>;1IO>~W|W0Ab^7kkeKhP-gwr43^B-u#q5-A!#>_>@}oe3yI-Dr zvuKPY=%a^+2an@-;Trv)q5T#_2*dj;M;+Zn5t*Zdoy&hY19^Cm6V#<&S~~w6Lw~5}yIF!YJo-lE_MY;A$K}wRF_5%Mh`|q_Yt=0^IPYR-^vVEB>Ba z{wF3QT78g6X9z|nVSj=wc7G88>Cuq^Z99G$5k8>#{*PhS1*6ujqNk3!j{72SaIDR+ zTi*66xW8TfdImBnd|ObZpOI)%$T+a&BX->sD=dntNyi@ygPa>{NIheZ|Ml@8b1|2Q z796S^eNMMKd_IvqXwoZ6Xc>Zo$fdpYJo7U@q8_b;C+}ltp-u~AuK^gT1|I1rO*L1n}GuJJ% z$X}g4akE6Bd8GkgW#EB~DnKn!sS^SJAMnNsn`b#n{kqSVj$Ci{Q@*LXAmm{PB&bob zTCZ#b((8lCjnAZ4&6#?yX$qB5NX^(G!jlS7&a1@W?ECrpKYIfB1PdgM`dQ2Uu>~QY z&X0TiS=Dd^R5=F2jtPXBxXP?-l?S2ndB zpi4DRE<@TG#ORVPM_GBI3RbfhImgt0LDhl~CTbD@$TzlyIe1c0tf8}`TZ4Z>A%Z|} zSe7u;)M{Dxb@eEb@QBpWvPNkC-5QeT8ep+-a^JQXa`MXlF*XoL7qE=gsB1JchQ)0W z$tU8x|5*AN0jL!x9ZG)t=X`>ehI*62iC+)u1xF#pCPmc~t+xlT9LRwOmLIDDg_d_g zLyP&U|Mc1n698B$R=&F)lznp!bO{D4dNZQQy3j3wG-KP~$6twdvXpMcWbq(e3t&#f zqe=h{ko1MVVgP1L?^9OTKYvCY1*##kn^vrL{-^8qh&KL}HU8lD4-ZIvOv;9g{m*-*Wdq-Ji-bBO91wpay+SWWQu*--)cUWzB2<+rpQ{ zzJbT+4D!{xUIEMD6Sa#3isSCL%tl!0`&BX34g*vsQ6NlhB!_QUJbWiWyREc37(BcP zJ@{7lxExL;pCphM5fTzUEiWz>@A&#wij*S4R{Qa*OT+%fj?_uPmc3HLW2BB=G3kGT zU6(3MY$tK)PA-7HX-DMZT30I7D_Z+$Oc?k`J_9)WpbzeFt@fK0S%NQj^G43jY_?ln z?E}2m1k_-kZxi5jz=g(V(r-hhqAC@UbihY4r;Gsfw*F&Lgs?k}X}V%VhOxe8(vK=6sb?Q~Sd?8C?cvJzvS%?6# zfVEOdMl){5YF(=S&mZU6(mR$Wd#z7QXP-fJ*2l@CUe9&V-^NAHT=mnkmP`tl>Ba>j ze-;5SjznnzXxLc|Q2FlV6RV9D{q-ipeE@H(2GIpj>9UFUcXxjrIMDNKJ#&}qLA|3K zXaL}l(KwQ#JpPac|DO19e29`*Ti74tW^6AvqoFqKaxlfn-V>X75&RAh9Ad9D6?zKF zAi><86ym|ShISRlb!!?9=ArXetDWzvrN#M6pgGk5l_m5zJ;$d2& z%viDJWulvk^jfMKP=id1bNYmiXS2_lZJ!?G79o;y?2d-M$bY0b-uI!?9W+jy8G{5@xg}YP~283Ii*L#Oo)mpq}gk2;9y%oWt~A8{7D)dVod2DAMxYK%ib1{)Eu88U+Uu^VGotkxsx;!gkasxGQX@?k_r$V z!RoR@y5lZzqFciT+A7m&yQ!Dq^#!22{rjUpAPosM-fB+UYdY2gc2zm^^nyf&7`y*& zRC(UcM&sCwWxfE>xyglTjAW#a9p|?((amx0Krg~}yhLxXea}^!iC)hN;S=(%?hm2e z`q>9N@z|K9&E{a*KMW{~1(dc9>BK;I(4cN;H1GI1+&?`HO*Gg%SGQ5#G0qRpVyYA( zMj5A75kFs7de@o83~LES#hlRZ?Ry<*X~POA`mirCRHnFABhEm3#rJ|Sfdvse+NUjF3 zY!rWSuzAq|M=su@V|-phag!X2@5X1<^oqb=d)*4s>=L6)N5Y)VWpoy!mvJC`$BbIz zGv!tngX3(;>*D#GiYx?Iw$lls80F3b|IC#E)S3us6{pmMhN0pmY!e=&!1sOLQWUA! zsiRzh^z)z|N`EYD;-YG*klX(;6LmPSS8|$^!!+%I>~ujiZq2-;8JR+#_ir(D$>!@t zV(rIj^a_(d?nOGUQ11T<%><)kySp|auXp?!Jumjreyep_+ZZk30O99s_lUt?0YkE+SsX-ngF)-)+DuQI4igyG}h zn5=t)wvBHq$l&ez$(@V)$IoEZ)SA4fH4@2)QU7&1@ zmq}QGEtMszSR0~PeOAolG(hVuBApdci~8h!EuJo8h9ypAl))rRz&MWkPBg7j&99oL z5QM?aY{9s8O9rCsR`(-moDrCmj3s-WowrmSuo4jJqwu*|W`rkhExH~a4pM$rg4DVn zh*7bKB$3I%t--LM)a*H=7~2W5&l%4X3Ht=*qiS?qB-hU&e9lN^`p4HTv##q z0?P%_^sbUk8ae3#zxl!e;+eq>>IehL_5^^O2T+P%*+Rn;;2b}`r9q-dFWl#52vL$j z@W|?xG)`!N8G`dgT-sLYo>0D_wo}(g|3RDTSA(FB~XDa6g!Tq!qZ444d_KR#+L>!Cz4TxxJD#~ zeHreLeCHk~(4_>~2~KIU*Vn1`J zxmQ3CYxbkambO7fE(^?^HlYrhNCG)AK45@3rD@>xjrp0dZLh_>@NuztX>Rk)AnI5t z6r!q!!^}t>K(%sIlR7ezd0sSg8(O<6?ZAkqhvy@25*p`BA)wW3R*97|mvT+0+;4kT|({V?A7L0zH zIA#!-l%BS(D#PC%znhzNp2Ic~LL%870WL*}GdpI)@cvox;X}OHj8vFVy2B|{mNb{W zaXqW1+|+7J!teZ~E-k);?UFMkw=eB^gAsIYx|EEb*=tsTsjVWMagsVHBgn<)jGa4VV3KD6~$j^!2&hW;F}DbhSpeMZF$5@!%nW+*p# zMtj5je0>2+d{(S?GklRx$V!OKZHL#xL_x#qEUE-|9M=*tU=Z8xjomfw&ndz8biEUK zpA~_J&ULjcQw$3(y-RY!goq`O+R&}xQZ$SH)L>9wK%dw@xp=YiJm=2xU`1Y@&-6Y1 zrd)B&1F>>HldnqML1KN1sr6;7=>en=p~;KQN?TP_OnA@_ z>)??jqem*c7@k(4;0j${d_mh>hyhaRq)X{maCItSX!?YR3>%>bPd}nn%dqAq=>Js! zBk2dXYN!gI7v2CXQ{7RUIzaI?opB_EruZ|Uym*dh0Pz0pH1y{skSf=7$OfN7LZGdl zfnpm4aV0T9_ROOeDRyEYYl0qdKjz?P&atBMY1qtFd1ck6m{;zzuf~sWEcdOe^dD;1 zSxV@i$emX2Tk4hr`$c=tEPijDJ+r+)^Ob3QSWcNm=>i8z1q{KxgXnoICU6cXft|L< zCLl(2+&=s3*fTp{&nni0ewL z!qJ_r?YR!)5!sQYj%RD5i$gQtDf;;MUB((?^;3k5RC1QGS8RyrTY=te)aR8VT4>Z1 zPub%EBOa;5#CkqDXbR*?eov;^1kW+fcGzJ{-*5r*vJV(udkKykGb$#y*O~WhKMi)TEx-}2Kkdp#5tT|8X@+`FCcoW zhbU}B*HE`B5?Wb!BbCdA9!5`LL|y4tB^be#$xn}L4fMrx$`!0oJ2Lh3(23uo>oFR& zj%@kmEe3AO6CLd&QzYkhG{6D~{RO$G`r|8_Vt5-PL9^YY?gwg_EHBj3Rp;?sZhNgQ zqHaopZe~8HCFo@g1Vr;8v~#1s8RAyWaKD!(IZ1obq}uuPfACeso}y6J<%u%lQ|45m z82CQS$YnN9#VC`72jgGfJI;FOUBaeuzF?K!tg7#8%jk#r6Mm<$;K*VG@xYn{)P6WO z)SxT71xfrA-ZBV9zQ&F~vm|jVd^N#INk{x{B3?#bTcb^$y1;-HMoFKuzaaMhJdz_( zGL%22a)gO!zha1=<2%G)^ffnOYIDR0N{gVHBaM?ZwZhusL7=_wJ&B*S2;?cw*e*J{ zjTuw%C4OWNp1YeAqb3K~#kN^TKmYsE>`sIg7%7Xs4upmT`Gh{*4v~(63?Mur-1!?T z8&*rJavMU2#({^_3W!dv5}G=A7_~1J33mY@q5-T{A$Leap%Sf=e-Mz$8>63le2hJ0cv65%}e$=52{j7X_HZ9gek*?x|2n;%J_tC|xLc1^~}`x^-_`;j9H z&qFNqHEC}J3-WQ+fdr|* zt-2zJQPRd{RI^%+IUak%M>L#%Y;y^NBdoVNZdRLCV=5wRvOA)!U&^B+yfibuJ{R)t zkgp>wutk)}yN>sx6OGA_doo~4jc_)6qEcT}(-J9WHuahn+YNYK6ld~GHyp5t77G>Sz2Rxs)TN#&OH16v@Y@U4SJtgM7_Kn zoY5Dpnp>$bX~s}#>mt2&DNGYi=^sg>V!@c1R1I|$9a;Pl4DaaDLBZk)Ykg5J+G8^7 zH=jb8s%o)>Lb)mXqDBMl+(dM@_D`vadp4d0`Yn^ZM0H|J{G(Z;uj}PfhrqW7FX|dI z-(nJjXFC!Dj^^{UgocKzVBx}@>V;At(2bX-BX3Y)P-rZGmJOD_(y~qr^9{eq4m7;V zX7E@*>q*GJ!cD@27n&hHx`1CclN47bvjLAbaE&Gw78YQjjM!6S zPjr1wKrpYsB=msO3RtJWK~$U!hD#WnJ8V>2pyr`69W}92*aoKtv|VMFCYo9+TdX-- z&5c;u!KBQGh!>ITV;2n!!YcZ$RWPn44kPZk7to8(b~A^HFLv3m**F+;Tk=uhoCZuvtfava8vBAVHqkok6&Iu*iFK{>H*tvQ%1Z=5 z*JX0-9tI$kbUJWFoP(fvhET^XEr`C{)<(}9T^N5R`@{9X4<%aBefAcl!YL6*bM?^_ z9*OClWgb=;77Uxu$m#TnIK`3Q=!od6W$wN}E$>rP7ZwjLbn2QYOi)%3UQ*>2lgHt~)z!_BRfvxoTQe4(SIL-+-2@iePW=TCA&&w@$iq{3{F!J z!Nx2zykZIB7Y8>{-KwxLjuaq!L8Zj&aJR*$Jo`YlpMKLZLF8lAj*k6{vUIe|bsCY} zLnVh(jUc~(ib#1*XZ?UUPjQ2qi;nc-(SHAWOzddbBxE;D@J;vS3FZynjM(#nOolP( zCctcy8QKOkj3ptNy5Oc+ZkRWXxx_4G1Qtu<`|?(G+hAq$K{OT=hZodY=il?vDJavK zw21Q3Kx3P7(?|!cpZTa18d=dY$1B)ojY)?k6IOry7(VjZYuYGoWeR1ZuOzs5z3g z*rmVIVn&MLGFEZW-KTDNu{|_C$J3=VY}^!2=c#0<6op{CZ-i!$RkhMVJ_FlFR*)Je z#<4Cqhimy#^qT253V`28t7&m#D#IbU9JJS6Sst3iXk+Pr%RHDjCD4tYjDJLx&+?f0 zY^DPf(l7#wBRd?=&enF7X>Tf~Cc*?q+aloYoA(ljG;cw(e-Dy-u1eNZ?3T4`wPWv* zLvmF%7ls2v4=Q33!?D^%yv4*&ajY(iSE_b7;$H?#9IzLl3gOZDbY+5-R9$YqPSTtGyD+Q zP*y|XJqHS?y5R5*+ysJx^6xpIXKWE_X^HI`Hd1V;?nl;Oi&!$&&kC}dcO&OMYknqE zsyIw6>>zNFQu*MLIe;-*W`t$*gKRwMa|r@>aR!G6=&2n1&Pyv%R!+^ zPe)QfSI?IvwW4to;$zBSI{32a>g)=Vy$0lpK=sA4g7C3AneApsUEyky5$!;6R?@?` z!ryX6CT-6pa2%?i2yC3Bu|N#I=Mr1fLHb|!ikpu(1(;Mv+6)i+R!ngcWldHl>Di)5 zX+paEBMOE?>_3bmGhds5VM17lir=Zlj!%UX?iE66GD+xO_h8w$1?Wx2FV7`VT~gWB zSV=`mkIUX-g{01vCKL;krx?J}&<{`yDk-F^-kS=sN_==^i*DC-9{=d6L>q)edEJO8Af&t{9vv8+RAXy#l^D@gEgM$F~Uc}B|a_3$| zHVi@yirSC){GS`55;X*(yA?{LYaz7g>WyFNcr4OmN>(M<9ZIj4cey%fk@_Ya+>JVX ziYQe+yPLX=T9j6kB>!BH(#KGvucBcx$a;*L(@tAWX-UxoE%i;*ByR%?`>#J_e4x*U zLM_=@imx>54t3m8vd#Fo)1SrTMAijp5*m4X^Z7iE8z2Ln;^!Py;dv#-wxhe0fYh=@ zVrT8)W#Ru5B`%A6!*7WX-o^c@)+8PmIc2O*_4)cs`b8aSCx?Z4hVGkN$q!g`To=!| zgsIUxPJ+BPyV-@u`jUpcq<`3cJ~9}yOCV(%F_YT?xv;Qs=V-QY$M^Dc?vNJsP-7y0 z)?k%>qlClitWEOQcl1>M%a8nvcNXS^^2An%iyXTki8^8Q{lxM9ixm+*?DINBmjP&6 zCVE`Hz@6VYaUmO^i|T}70s68i>2jrBH2K3uwsZCg5HkIQW&s2kx`6V8Co4F}&Q37F zBS7!FU#YCrd*yB{V0z%n;{Fv}2q0Gyc>_j)wyxaxwu&q%E*ouu%=NDAgBo*M!gLH_ z4@<%2FSB3pkNW^4oAM6Gjl=*LWXonVe*bqUM2J9S9EE$sF-W|e>|w)Y8mK>D8d0m% zt6)J!%7HUFzi|BOla=#v>QA)$-?VzHFe{{7GS_Hzfz894uSA%3-{l(8LTpelaaX{) z+uPN-`E5Lc#km`8?tKcq?=6A0w`Gt({$Y~`YeYN3&;__ zbLXYYco(cE!jyKL=)h#JzlkkDRjQU^jXkk{+qwN-(;1e-QSVRoAg1U$A)s>R;Y6c{ zZun#8y$G&5tp7E(zw&8}r#p-)`^+{of5_^E;oDxRao5&=j`=)T*!xqHtYH7lNo(ZN zusTSj{ex>>DZMQSWhu9Vqb4`4EO%NJn4)h!sFuL|F0UgaA_fCm`$BWs-R0%wbwGT2 zhIIHN>l2xiI|E2ZLK%5@czBQQeb_L5n;swWcY$j18APb2_Hh(>Ad>n&v#o>xQKIN$ zY%K54y0t*77^gj|BN%HzEOQ~l1T3zSqwNB7n$@GV3k?3Bq(x^SDQJiiquX!wdarh* zPISb;T0OEsDxQe9I$9JO7h8 zA7~cwhB(h)e!VyneH!sV?(y-{XGrwizz;xLcN9&hL-tPu^R-5z>{A<&04qcAr>l$+ zFgv#fDQM2lQ3cGjGt`%qH$V%E18YuQf8h$H0%b{7T|prp;?Qyv_GOtiSL+x9sZKTa z@y^XHnCaR@mcU;Z{#(DFkGF(|h#s7p|HBVscqLvt^W9^(P zEyD!(Jp~tXG@4P!1m@G&r*!q-FWuiCG3|Um5`KRC9>|6ZG7X@+QETT6k%gLu4Ba82SF+Y-$}J48 zBU2bC&daJ(oS2pnd3U$`zqzh!m=L~8BQrf_^0hz^B$*Hse4G&bz2t-e{137m!{I*UK zG}3*s;yW4!Xj=2I#uV@n4vA@HiG2hK9gT|HQ6{wz9wo~SNsbChzT-f|Y}kKsp-@dg z^d8Ebt&wQe=96`}#xQh^G1o3DZfxW5$1``G>niWWA{@_DR0RnkRURrFr+0$F-k|4U zXdaiL>m{T$HI9`@DQ~jZ`nY`0OpNxBwQq4scyemZV130O)uUPXkPRACzeBz+47bw)c+g~02iMb6#1~fk4fTe(p6H70s zqqAcu`#@ZK-jMjf=xKSwx<_-;)Nz($GYc{5F*cF_xD~M^q(ZGUqzbU7EOs2Y*pm(S zl14^zs$qmFZEx+Uj0J~%WW+jMm~9*t!$o>Zx2r<;@f!hj!-8~TzmQ~J1vi}__=vzo z40g}TEsX&zFssIxwZg&Vc4(!kZQEbj@?D8Nsf|6f-gCGYLwNo1G%>q}NcmMg^2VYv z9S|}j#B2WKPA_dIEsXafOBZ(6WO3BM2GmX@a(q}*Y}1Ps0u3m)*JQq<1skafO86J5 ziZR>7h*|Vz)T}A0`Ng<5M?>$($og5&GK_H5l9+14J|TQ8m3tdIW;qT0%bTspM3*xl z(VT-`Iz3ZMd2R_f1UEW0+CEbul7&Il0*l5B@;*oxk2h*e6%9nV=h2(+1P!KqSh9FA zl~PJ2ZH7!nQ2Gr87OV9Hdt3$;;IXjfTgiNe)+agvwVOjvc~$YqB^?#N7{`o`AEDnqxgavuv4AJaNhxKfd|V=NKE*s&9FjWn6zudW_UdHC7#5o$s- zX;FENBKsOBtfI!i9dr&Kyh8*G)T9T~t;4mmi~>bYN9_hVL|#7~@XnUbW8Py<>N3`l zY!DH6X={j5E0VtjX#|^_mtYFskpXSynZO*nwM+K2Av5aDay*TX5<3~)TXjx){+gTH z*i>fkf~7se)P$*gH|%Ja?Fe+6xhSB+$9`$8#zsR(;AIx+tTeBIc$Sfss~IrVRHL2d z1#Qt3iH;=A$i^^_M=(UYu)f$uN=C=|`L60hBH~6h`s~mCoUbS{5*dk2mG``Hjm}w> zNPQ{~`9$kwR?rlqZj<$_3BQBQsSNn6@9<+jJ)FFQ7{b zuEGTqnbGJO^_?i%Pfy9oy$MZ8LA=WI^OHhI=o;;l$BH`m7%?l3tOY*8)>p4RinJ5i zrO6}|T|2Pg;yb;JW^9a3HgeBEQuh`5w-x~7yd@r71bK&OjuZb9%E*N!Z0i04jX0?8 z3s%I4$s;U#5{hbuX6fTmv#Ly4q`r6Rl`)rosM9dnQL8=0bZ&DTr=P z)f_8*uJz6;Z6=gz`Wbmu_q)z{+VkP#x4E1}3G;4uS=wOO{&x@Aiw629r z!3B0o1fK@e1UFe-QmL%)q&nHPc81p9$tr=CIjGmOGajZ8YU;}4X7jC{ zhR(Wbx^$_^BR}EFK;_~Y;yqM0$^=GF0WBgGlw*D64kvnC9Ea+jgx-wAjBNo1<<*%R zTAqxr<@jsi=|_jDJ(erbOYTau0THDlyFvXR8WFF6+pyk(iwfK*x>WTnwrxRIxn((4 z>d4+EIYX^u1`m!x>tdX9p3!gw2`ntilCb^$aauY(<%AYCy1nlZM7=e(D%=8tIhwJ| z?xdZxImxs&BiwG_dRbmF51#|@c-4f{q@WSLct%dHOj4;VaT8a3oa{@zxwQ$aj^A1q zL3Sz}5<-V6rkj3=!g`d9KSMEr>M@x*wz4(#{E}d&-ADRK%QDoI4rvQ2;#eU?@_UO} zNGP`n50HhXY2h9j#T%S*c6uBOPdnonySR%v;(e zB5uiCi-{?&QdQ9jft^RfZpMecO}V|@$OflaNFQ$kFU>66Pot4dHdy}BXagI%57hdPTk4UmS^Mo#k7;`I6Q zCXDqU0hgkpST;C$Dp+{qfHJCS7`NPE?Q6EaEe)to)iw{NR&Q!@(=Ql zSy@?V;tEvFY=Kf<^><#G4VA@}+~sWAUPKH6&E;Xd_?1v>mfeW?7-gWeqV%k^Pgxye z7x0eru2JV)?HKTn()b@aw-^+ayGCNzg3s=*F&C-i#Jws*w7kX&DJnv}nxB!7!wA>V zsM)Bfsm)kBWry9V>V}*npp(QQM^6)p2bjIcIL@2g9bi&!u&XhFwwhQgyT3|yh82>rzUZf9n*Vpp9a>li_u zL|Mhx3N8c0H_>Bhe&Q!zb2eP88WxATibfI}RY)12HQc`WQ`s+aVCA=oTQZdOQAK)a zF-s9!$X&+&&~jL5Q-2&asJVo9Z#wgIraHmGLl8|zWRSq3PfB(@dHfb%f1Y^fbYOSH za9iH!eV6Yh{`831dq30ouHR<*Hv>QbD6IW*HSG4>bXyLY_J6&FD2{Iuw`I#E#rT`w35LpY3*PgNh1Ocxz z1yBpw6Sn>PWji%OwY6$Xp81%sRK6DIN=3lu$|G<$6SVWECuM&q5`N#&QJSC>bjq0b zbYS)^j@AUnAsbZM_!^v;L*Kz+> zW}~l7_vN(8(YJf+WVaphmNUbTTQ`3yY+GN?Pj_yAUkin1fBx~OY^~xJ`_#tijDem) z`~_0?Q53Gu2VwO0;+(N=n12p<`(?|c|7b+&;TgL-uhVS8F4DAptzo1TEFCx#GbS(Q z(9O}Sa;!BpL0lZ+G)t(e6;7$41Nm9(g81cV$8q=J`s%djx~F2JE7yROJNkGnv|{=2tJa72`K0z$d!^AMj*g-6 zsqKB`F!k}kCn|P>{c@oE&qVmRRiWr5@v5EKNBIz$CJ1L}>G^uLlCjwgLxe62 zIl}Ps&x`7K3m`*r=X-CE(e{?FQIciur|pt$zRNOJUSWi5j7!PNGio<%R3^|LtdY`VM)c&M?Tk^Sj5_JBPK$l*#eR zY6Jh5oI3aOwK||4+r7L3dIvq-2S^2`VhZ%ouFpD;lml| zN4H#MXh zV6QRlx-gmT--2Hx`qdB1G`2{yQwoU}g#6BYL~CWT2t3bV`K1+(3`1L( zbd$h5e3H!9l1#imv~Q+(o6(s;usGJ_V_y0gbyIYmQktVDMm;I|yI7)ZkG0%oKRc0J zf}mLTRCit)4E`l8L$4A^x;QtudxDZ7?t^abs>)~ep!)#yrXAkJmfSCQv3=%hDQ>EI z`4nuHgQh5wR$pf+*W}}puPQ^2Y*|^A-ieWVY7m^Mn=)jJz};teCbh9-(btFSk4`4mqm@?s)Uh8~-?=ILK3Jg% z75p}<5ooZxNecOc_WI!{VGv~R9E%yOXhdpQ95*$QLxu>qF&*d>dXphTTG z*8#UWZR_d5ldI)gpP1@=Z+WaW`TeiCBBnaWn>RvfCZ07DW;vR1sVOS3Mp*fBQYKr^ zR4je#P-}AxYMHU-4NPwB37DcE4#6!Q29fvCRaC?%C@!ko2l|oDP(_^_!R zXO!*5vA1@cPrp>EZmrL~%9mR|vAxYyFaPng%K3b?1>W@blDjC7~8dZs~A^3&pB+e#XE zVR+u87h!c6Nhc?}?L0lu?qaQ({pX6Njf-Lr4J`yj%zA(p1{GGm(tZp*LzL138J5-k z*Kh^~?b#|iwmc?o6Sr=HUk}cB>vK=w53^0xrB1TdFT=D>ph(ti4@H)dE)X~tZP;MH zsG6BOXe0V`yf~*E`1@w|)GVU4@62?Y4t`I$uU%Sd4C*(vc4@JfcTKwN>1g4!XpuT%Hjdo+0O^y2kS_QtPk+L@_*2LWD^{fl0>FgGt zNSl6|-MZ!c9L_rb{rO^p*Z01EiUOq+*+d?K(64iDhg{)iXrxw&Z$LcOW+vHVvEa(f}4!I{^kI=1y}|B>|t8 zW$ELMGv;WvV(w3T#=iB%eW#IM>uNQRH`%HDm$}Se)fIA68802owob28#=hX2yxeKO z+>hBWK9IE|C8>kGNFQX@zs$<^tF#U>WAZcWY{g}X8=aH*k8#^aHy@Jq3?|gj2u{Xz z>d7GVw`oIdHog{Nh?kN$t;FDWBEv42(;P}E)>?JVW~|< zzA>t+qz!UykZ`~^s3cgt(RnF$v$p3~|FTgeI%R!4iq4!v>z@(ObZ-8A^%XIUOlSp1 z@SMuzeGgUPVDb5?V_I4?v&A0uiwbKw0~LM4dwai)1&@pty?yQ+RV~L`$=o4L-LHZQ zo!=i4z}#!+U!Z;Z8eh^0u$$dbOMP;>4f83F{z1^_dE?A0apK_C9`zs^OGY3SWs7tAHbvp> z`t$HU7w$ay4p*uU{C#FERZ=I-Mjgr2lc(UO&&!P5xZHRebG7y{|7&NOHk>vk@*6y8 z5&BVBW~xI~ML|p^-L5>zsJ8sG&h3{PpX~!lzPhuuX4%z}1kES)gu-x?y(Hv5YOxjl zLmGyIbc-Cg-w$!W%OsKhNSbiZX!){--{}3(lsM)*M`ZI!+`ZcA-vNpXmoEjJqSNlw zC6phlam?9_4cZ(@p8=t%B^@_jrpS*|{=a|vqfC$gv}mzgFWD}!<;IP2}`I23nxEmo|-DNwY*p_Bl{C1|nYP~6>uOOfJEa3{FKoBx?J(=*pQ zpYkc$J4>#;_FBK^zCCVt3;wCRxmc(sFZMxztImZ>7I{?#b|<*!vqn_q>>1?xyPZAm zN-+9z9gM8Wn?JkW=V~<%7`!K95boQyndl#|Cfb?k+az;{7QNK}nQ_CAL%~6--b@Bb z6&pDVJLcfdaJG-Dj1Y5rdbrx3?Q=~#zNj_#b-hozw7&>R6Dhx5hai#he`dWnDcUW9 z@6bjEm-`;tc`dMHF2LReWcJr5l8_P8+K_#miPG0kp8&;fBg}xh7=@06<1)cBZo^Ha=rgB=}y_&{HKF5L{C|_ztg(#s7srWbuAc}tS@cUiK(@o9^`YJ z`2wSU|LNPkI!Cf7_X?`SEj2ex`4VTW?KX6bV*+t=NKQcx239fKWx)#@fMkXquO<<@NyfWIC6^jXPIqIVH#hd$xh$v)+ z@XWi#Z8vJ!P>-|U{1=_yhPwlvBR4KI`e~m`g!GHwuZx2b@?I^fWLB@1^FPY4X+uZM z`W3%scC6f+`GLr9R|scVu~7?(??3hJ2)VnQJGkxP&@oA-Qb?5FgIxsPfh43zgZJuN z=mcB+Vm7`C0b@j-o_gwo#xbiOg`i7rw;(al?{VATq^*mD=myS_;HT!Bb-(1foqikA zlK=8dl#M}IC9T7X`NDa_3NJ#{TV5_6X_;utV1(y>+51>WHu?55QJ}~@FlIAE{2sW= zqsVHcRX}yWiqfUmcKXJ6jHfZG#YLu%r`LG3vY}LY(91x$t|s z@;J0l*_;GDO=L#wc04-xs_m*ZFBOoaL{;EdC`|bLA7R>F!>DjIw)lNTonx<4?^zya zaDhWCNQtTsj`8#lAWmz+avAz!1wk=k?g`@k<67}yzCo&?f6Dwdb=Wg(Ox+K&AbGSV z1n}hi8?L^LffTNpS_7|ZloEUuKT6R)oHLg4#2aaQ5UV&go#f-q^!IMWqRFYh>e5^ zK%~7nt2m+Zb61B81yv^+z6gV-+ezSU9hzmRM!0YxtuP*Fwd1+*$+iMDx}f`tZ@o|Q z-B-15xJdM|6toOV$xEl5#soCID7WJ46b@fs;qGPf1=@y)VP#J1!cv9gk#(arUv?l# zdrJu3kGQwtt7Qt7`hIm93U6MDI8l4>+c#YK6H0?Gb<5{`>^bUvZU&wxPzw>Q3YSO^ z)NFo>#K3>ilbz4zaY|mGx&m5onCJHxIXf`pe-#*)yfxK9_?Y!H=OMRrxKv%g;s1oP zOtp;Y#~|;cR(Xz@pU2gK{jO2roEl$k(OI!LqqCM9Wg?bbI6W?=^mI-^`|C`-PnV8Q z`G=&>lgmpCo6B-pE2yEw5~ka8R>XDTX*XLohY7b22uMY_%L#_Lz4^U0dtdc_1uJ}Q zD<0L)5Ow0dw47|Sr);Nyb&;E@ufj>S{qcTVyxaxLlyv$PHlcvQ>^84TGqE13VQ#($ z=fPs7w%%B#_mQBle)hp^pS}M&zaQ;={nO=&8}xhJSD-}Y$Q+H?a46<_N+*)#SFFG^ zw~~e92IB-OVH5M0BpS)@Pn;eaGw&KZqSjU(mR5F=f_O!8=N-Oo+7wdKa{};Fmtw_l zAmW^9Bz#7LOuEyy-21uw>d7M=9c^zH;gNZ!G}$;M`3;_Cwh1eaafxG zc?x77WMR-yg;Sp+5e7It&1F8Mu)ltISb1s`Co^1`AtzA1D0(xZ})|;9FS1 zyZO4phA8S+aO)hF@+A+VegN14Q6ch_q$RxLXo8u)%k~@}w;U6ZXXEoX9qADZyh*`h z&D{Lzoa%E8NrTmBT0Wz9!)0-*tQV4Lr2X|D43`F1l;hOoE}GmT-QRdyen zvzU|`I-i@*8nl5b^~%2crdYs9yQYzknazhG)UV5)G1?gbIqyW(H>8YZNhx#{OZGxpz0~2>B$u-v6%t7ab`w zp<}r8mLoq|BNu|PHf)Bou$vjuMA?qZMdmcq{9D+u3D{zr2M#So0ypSix?lO1c z2kH>q?4iIpNc__~$7U(kWyf(q{)aKSi|n&p!JAFC(SF0&X3Gu;re6tbMcCl88-#G_ zEpX<@cs@(xMKUk9pjl9?8+o;jb(b@ZZj60U!~mBtL%MPLZO2c1=Q-qE&RNhf7C*kS z?#5B$Hf2ws+AMqUZ7(O&&--e#FhJT>q5Ydk$(Jc98gK+zVD3-t>DO!(-J8lfzZ0me zC^xvIMS8I7MP76$*Reh|53mLa*~B{rF>B7vZv}j>tDj)iFeIw$uVTaoma=|(J{}hO z?t`9%vqwt8gTM8AqQr&4#LKB`=>T0w3W3Y>SIt2YNW>KY(Lt)<$H;$H0yzTHj|;ED zwG5N$hRc#+9nSiM9-N4?D)Dt9{53ZtM?DvYr>{V<0&*n9NgmiZ~yhnu1l-MXA($@dlY| zw|7sJuLxWQ52{mr1m-puv=RxZe%^8%o**7A$>bRsFPnQVhnD~7xvag-*H(KrE0<~! zk-c=ry5jmkXu(XUGZP3cl!9^)AWIqSJ6BuV2mcW>8h()OX0CsIZH84gqDb($G3&zLC|17{EI# zq`ODN!#J9OIp#UQnGs{5*qU@L)mdcmbLU&SFFmvcBkICMy{~NS9En&GUseuCfd7viW5$9Vig02cY+7WudqL?*%uU2SiaA45ufDo z?+;yEUpJ>Q_qWZKblD?nRIGl#A&0dmveMV+8)2UJvGdzA7eir3`MDy)1>CoL>-}>6 z448*xfeRM&5x0F-+@X~M7d7MR^V6}o;>boe3zPgXkbQ;m=CB@`%h+_0^kRf%#Gy+3 zZyaPS(EBmy!cv{HsKedIubH&tv|Y~I9ThfxLLu8Vqco|50Q44~B=c77tB;bV^&oZ9 zh)Bm_TYV9mZNDfLTSJs2x3+IStS&U>XpEf}%*4f}8)mFX=-vf5H`f`QWMqd%?Xnj# z-g3Gd>?F4HE!xTg=41{X71YD?GR(f{LPh}l0Hpzb!u#Y;m`s^%uVj+((a}5IaU-)U z1i5OGLkrgqQZ%Cd*SMzU1Lf)l)Y%NeH%b!PRAqGe&Rhrvehfm?Gka^RygP3a^P{0H z1oM8aUWQHwdv6+0Ph=1MiUy78>|T4eUh^Jmxoz)@9y_9^K(-Ovl@7`z+cf&@s+tQX zzp7>+#U?&jO|lnFQVoT0J;Dq}fg-B<6i_C43M)g%jrPr_fsA~9(!~07d&Jg}!o!vv zWw;~b+^3UIRe+>MZNYHpr*XRi0So2*35(KTS>b`i(;tJf4L5A6ERK5&ZT*fn^CKh7 zHNi;SX2a17P$!O8f%dg~e=JPHT(td*j4lw3eOq_SW1#I{Tk(G6g9EMV4A$pjQx8>V zeI;(fsX)ZvOmVzQ7EX`9z-;~V9=i+DxRg5jFz;f44*e$Tu|zze)U z(G*$}Wp%C+dc9JB|pF z01NJ9wJ0kqt8c0}!a~9pcz6W>!o+-s6_#Z2ZO^oPYxcKltK)N;Vz0=ZKX@r=P*#di zLMHT}2}7rhXu`s;APJkhc47`0y3N<&@j1*6DBK1~ps}fOKWCWx?a3W%ahNKdzJ zAGCAV+gw{TWRTjuqB+j+cC+rh^z%e}4J0&S+OYWS@cu84MS}hXTMnX*?4sIwH25Dh z3c~HoDJV#yJ80pA0IvRnQ?g%a6FomaFC?(dP^z@Zh#S$R<4%`|8&x6w44kzky-z&) zw3A<>8*N#~Roppv|qlD8K1Ppob7l|(r(q~A4lJf2zEG}2Fz^6QrW z^m7{jN_Mnrr=9pyI#{BZs$S_Z@8UI5WO$A?(8+=&Ld^t=heyvs1U;+1n6|`lie&oA zU56=z8Pk=_G*1pP8FW%m!3f)^^(jhA^lLjM=9rz}k(@U`)q3{<8w|kjQcZHJl$oLb zHAd`M>5^^H3+YK&Ip7t+%z1W3M7Z@&E&hK8Xz>FQHBddr&LlFElTkyksj%du$k7lm zk2lz!e|{2wUaDjB*-12nB2KAvIEPY|1ZOx;hu@W|!TV!WH=NB_+vm7y{2KC7qa7?G zR8>N(qtaf7tdPFOhwyyUPI-;5!7%JySAw7`*3jF>qw)5h{$jidow#!On#Z$X<_0C% zo+f;+FmamV5c=B@B(`{eRv9@BW|Dlmoals`wz-R8r2oKs2G+z^dHY%RdMeeci^~7A zcEft`b2jK{{-zFkHScaNq$b%%e~)qbPo6CstE%C9KF?DIeEGmpqcn^aabAK9KWkQ% zY#Zvj3R!QQR+jT{Gmn*vVkqNh6Cwm4DUWq~4@XMYlISEk|Mzy$wq7v0AAu|ogEctM zSp4Dg2EMmi$n*`Iz|-NKgxcWW^~>q5>hHXt$x?Tp^ zGG;Cfw5fO%e`-@ZkC805(CUgivX!lqP zWrPlKw3i5fO;1m_T8csB9($*X^+N8BnmO$8H)BG{pB%Ega-mz!Nf-Td31a|ZYvO!1 zzQ~k}M2gyy2;S%uX|JdfDI!_kceyFR?d%#Py^QYnf7n6_EXhi1Ska5E3_rwo%4djD znh5#<&Oz?|FIDK2zSE-HBI@K8Tk80IPV0v?90d4wzJ)Po#ODc;UI9H&W8lUbnVZyJz?HG3NS$k~XS+tfcLf>eS1O8p#o4 z&J*3S>8~3hRh&0`iFC|@vKXay^H)Xa_%Nyr0WuRIeiFXRl1cN*$WX(>8$aT?g4)KHmhxm+ zvFsTb7-gJOjN23Ccr3&tkobagVX~iXx`YN-?F!_&QecWY7Nz33o(e;ivpRpG9T(>j z>SfpL;)s4MnhgWyFs}0mJ$pNO-e=(jtjdr?VJc5ns?De<+9Ux)eGk&?U?ykNFTHr^ zAYf4;!Jdpif|57#s3GEP$=JC1wnu6}+YCzackti{AvXSdpa9>7c8{GN_*yu}AYF?d zqp8Y=WI9MM#^dLd2y9bQEFyLzji7(z5IGZQc+Zd1L@1Vh?$VvM7H>FNnj`J>unVi4 z{dUX*ybcbXwhlfLH#u>gm+zq)bGuf${FI*STNVTGjwn1zdQu%$ksBP&xWK7=&pZU) zx^ZAeg99FQei5&Uc^!BN_-+{q@Ozjfpb?<#Q2K9Mco+|+B`0Ip&6G?lV!O%7_2u3d zmdwd0pbtC{tIevDi;iI$lTWO~{gW`!UDWl`gJA+Lwu^{=8kIX(Oo7*|%G*G&#- zhIW;VIEkJdG55?3j`g#M_kZ&6-9I^lxwnDTP)jlRG2Fm8_9?za4(P;rGreI>vklIzYeO&RHn^MK)S;@~_jjvY&jfBmc^Da?mycMQet8rMQr~K1Rl;$3ZUwg{vWRWWcO_rrW=r+pjk=K zuINYJ7N_eswrAVW%TmJ{U!%C&hY>^(Otkoo%Fg~iW-8xjRF$<%pWDVU#xS?`^Kh?I z{pKx-*~~UU;wX%$pm#Oeuz|I~R&f?7(Qlh1g5LzWz6c(CSSjdJRJP^uVY(U!91WJI z^fuZLm_Y9Dx^`YmckjZ^rOfm{$%EHT9&hdQy>4%Hp#h5A!(sAWwBnB`>;w*TKI!Ld zS!d_fVK<~jb_7cwF7OxV8-n3mbCph~*-Y=C9Gpc>*~vHZkk@e^yL=!7W_8{gv9ng@!B(6F42jP5(Zp zB*NFMtfGI-vk9*n=DoeU>)M?t=t6+$698)yq0a`V?HpU))b(39_Fb}N$E5!e2LVhy z4>8lnj#iqL-&E0-Q>4CgmL-viovSsso2>yFdl;M|91V&DLnrV*#g2tE71mc#P9P_R zH}W9#=oUW}#y@vgM}#I)0{4UaN>?Q+x9XvB4aN+)+cI22Y++2o?8hzMatK*oAg|v0 z6;XaXlQ{G20}SpHs9Qf>(z?xciqG7gnaWQA29JYtCjl=rg$Yu%k3m2@pX>hd3MGbf zZ`ll3>^S_E%#me$8q7B2hQHVd(R~N0J5ExM05dL=U>n}% zMk|a9?IyPLcL#I%gG2QedU}@=VB_Xh9|6atW=wMKX;r5g9(yV9E_r`KF|T7|7}9Yo z^L^LTRVlo;vL4!8RfxFnM)89cci-!q%w|1;-ay!RrdSy-Wt^h$Rx5uyqt9_j^v+tp zv!;=Wuor8IA^Ppb26G=36)Ado2HBgL%oy;%@4R~6C~%ElHXF?05GIcmDXc6V5po7#e`qZ zy4Jc>kLReC84*09j%5i`AMIWy(3lBso~_dDOzWTJqqcSFKfNFpkhu5hPo|dRVC)r7 zJCB3Vz#o)189rM<73`3L_YxE+#~9fdiK_3Bb9li&-YV6a^}KONO7I+P+*KbH@fScq zUwIZ?XAWVYPM=g(-j9?7^p`(bn|yBZsW6!~P4ANYlj`2Fy0j5yc%N9to`Gsj6NBCm zmik?8RObby)L_OdyC(hj3L3%Qm;N{oLY)ZV4_iugY-0}lkVIae8izL2c&}aQvgUuza#hTZ8@S zvgvdg5ZW9)b;f|Gus(_fUW?x$=~Aau7O)S!i!B2&L9j%%to;2mj|iYVuB}LSp#7u% zFIDSjb#PAVW`8CfCI@dBl8-1sHM0~|uGOlb%vCacPi^ZS>~TW(>&R+YDG#j+phw9w z$(q4_VT|f?D^Od&-&TYZ%`(Ks2&yT1wipiF$5SffLY@+k(|Ga^Rz5cQ=77JK6F$5V#mtMxzl$h zn!%dil0A4*9-$n*3>AjXU5~!m@OBo@mow?Yyd3u;w-bz(E_Z(EtJyO4^A%zu&hVQG z^9926XZ|o(E^&w_SORu`Eq^?ole}ttoJ?<7!E*_ZMTez_Ph=C9qHfD3-jy9=yB~ab z6P1yQ+T|h>FVse7ZJ8HpYplJ}m5o!Ll#|DAZN~zEbe^)MYroTJ$t*xalR6LG#h}v`*T)G!!pv z4!YP375>Pi$kF1>l}4I^(W)h%lMOpEm?2tbJiHk0mmz-R+39H%?+fG~q&-!A{banh zLf@Aai!C%;lPT|i3ucj`@>%&ksO)bV&5F}Xk)NkpwR7TGBtL)BCOWgPHaSAE039lC z$$ve=M&*%t^nq)nG zcFAz3RHon%LHzPaGXCI)yQ_V*)h=xD5~WFmSnA8E*U2AQ)xJA_^5``IV*Z$X{O5~I z&Q=;~y&K5{Zzoj9Q!uz-=6{4(Uy~iHrEm!ysQr*6p-3_q|HK@!B*8Pm%?zBucopJK zGS}LzaoLboY4$4BSP6ul>30-E8D#katObUKR-R63uUjiI3~q0r{#dSH+D(pdNI*wu za9SnVo%9iF%X8=7t!GVso-@`$Mx^+!G}Ts4ZUO))_Gd>x$NCoZcl+8L%hb z?!Azv2pCUp5l$TUAvHZqs!JZgivtrnO#u+P*LI#oBM)HnKxsF6Bm}!^Ufo zZK*=RmIc-psQKpHyuo7+J`W95xT61_bJsbkFlW z6oT825A|xwm;UXtA_q*!9~}coTP}KYLeClxi_^VUBnbTPGX4LIZSEE603D@s7Lld` zG-O_yVOUKkGUQ)V8xe5p(`_g=#4Tfg!AFb@ot$`9vAPp|Vp_`1`9Hw5JfS!9LDVkT z5?ELDGFgct8k{6FLhHw!y7(g8s@!4_a7~}7xl|#*Tpm+I-QOD&8QjL54~`*>BnHsg zh4JNF_KV6a6wxak$KTynfZx6KG?U}tE^6Q$CXhm<+y_xkUw{*OPB|s*#h*JTN)9Ep z)4F834?aLlXU}+${e0@zFX5t#w9CrSwu1KqNOXW})R#FLlwh~PWHy5qYLN%%5GfzJ zB(S8>@njG{*!YvENNmhl<=eBmed(0%Kfj|%p`J;}DrW7qUPv@gv*X5jX!&tePhlaa?ynb_y;gy#IfFVZJFmyB&WAk=`#P}X$M9$D{$DG^s+eeZK5g3)@$5e$mPKg zJzicyY+8#SE9nVqp3)tK?Jsu2l{4(gwVCYG_!c(nI_3TdWW+jYD(Z4UQ3K))vkb@X z96ZOqIf#50VsGzsU%aI4N!9pt#;FbT@l5eT^@PLkmCJ+ula6uL`CR23X6XU#^`&h^ z%}YB0&)Tt<6#f1~!SNvR)0$x_8oHf>3K2`S;dvgoqq_5&>f6gIPYg&ivvxihQPu)S z&jH2YbA+cV z+@_K;#_o3ZZC0emLzsN@`*LDnoJVzABI6OG48KSuSmblUfI)&vwqPI6chMaU{?-qz zK#^AKLjb;YMlgT4wMu4;vj1*S%KMEQ0cMCPgD~P}EbuS@GQSuTzzH~7H zmCMVMg%$ydc!)f%*0K{cgQ7WQ<5=SkbTmgbzhFtB_nQfGe~}@BO3K{8-Sb@Ekl0jL z>Ebi+a3RUCvr)o{T_bIvyV&EppR0#N1U1FM)*+g~hdU(|knvvRoyT}`|2HaFXw2D3 z6(MSxO5f2)lRAw^!@Vx*i{WHdb5t^86ROg)G%;rnkDGw73R6BK1EFRCdj|nrllzCq zF}iLXby%qGN%nxuV)uuVH=_ey2GW;t;E-vxax_P!omCSw=hB$5S{|t=fCRXT3(fx` zT^$-H>spJ}n}T*}S#1S=^0SIG(_|&1D)sek6(i_RB6+OUGi3%<9#!bi9KZm;)4SWI zc01I)wO427$;(FyhP~G>=@hKi522{VeHf76fvge5DyRWINWy(@wphw#2Rg{5@T)l@k@SZ-UNPMmL#lv^wuD$ z?y~j^EE%VrXT>ikL(*Q(lrr9j$?h<@#-AEiz_xbNYBuhJsjA|r4i>tV2%{#l|E5iI z^<}QmraEcSnR0sg&K?2C zHsur=Ws_N?{q~8e8n5E{^zpY7YF^H3sT_NZ8trM)Dj?&YG{bMoQfjL65JsXKr6Xa= zStG#4n}MX?8C$=LW>%5~@%EZwnW@lq_43#Yw>;o4j~PFj3=I*x1a8oAxM<9m=|z}9 zDhKd4#FE0q|6sStvSyST_OmHA!DyhAwq1I>tLO#b`>Br#e?}I@W%3N?ui3K!p%Y=< z^7q4i1M?F^Gi?lZbcl>6YWu4eu|DwCXk8se5`4T04l&fVWpYJeBgAhvcy1hiVJy@s zyM^AjjmB}6@mLg5nRZpa1LW+F z%pevF^eU{>AQdmR_(~RxPm^LaX)giRD_N1p5ZRS}zQqn0ub^3!z&pr(`iwdlV(bs4*{Pu8zzdVhS zTK4aK=YOGNZplr)q9Dsq{0&$X!!5ph{=WFLD`dgK z9CDbRC5sIFWb1dG$)6ZpNs4^ykZkmUc<-%zKlqCcQ$px9^W5Xp5?gwfTuW#O{mUcM za&n4agS2b7H@w+nA_^UK<)9ra3Kano;TD-B^iDyRtKU`zS9)APpTb{EGw^X6yg_4X zh)-iZJh74s9X4`Nb%f4w3T@MBstL*UARZG(?V;whU|8)?ecYlBdb8+F$M>~K>GfdD@1&8Fvp?kL#dZSP&B}~ zcQ=DbC^&lU`KI@vXzXY5Im@&Cu0tsoS{FSX5s~3vOw(}n7FZrF`sNhIDejm3|ePlqK*5{7Bo%<>EUs?0&B$ zIg0S#czeUgBgh8Up-UoZO4iu7w5RuygEHH*Tt*qiv4(FjJ2RLL1U`^*8YDi4lSNe|CWL&L4K1^ea+T=~K9!a2>S8dc zA4;w|iWxKYEB@o_UnBYS?-eiNBcK{*wS5nr1&7^)Hb7z-{yHlDX;Rf~t!qPGp$jzy zXL53KhYq`(CUr;xFZP=5*)dsl-p%Pb`7t?ua2EGlKs;_7ck$;RUaq}S%+q2i@zg32 zIDB~|w7KA0`><~&D)9ggFn?^6UY`CrF9+JP7~jVf|2Y-3apDCN9B1Vt@+#4;theFNJ(vwqsf;1y%Z9MWL&?qf$nMwH9JYi;<#`PLLWN9y|c9 zEMWbToCaGGnV$cpKU|hsCKTKEL!O~Kp{i))TVu5w8$(u>iV$wsE^AuQ2IrhKwgUft z!q#X?5tu}3Wa}LR_~b}@HrLZ5UH=#@e`kedqflH+O!qusJ*@9Isag&^SoM8X5r00) zOsYLdy2~MHsF*=++t$WbCne?!APUt|l2QboUtzbNUSB?qQ@8tWYLCQXMnz#w3$4q0 zb-8)+?#tdeGrjaALp=5zJ*D~ggI4i7#fD9J{@s^^Yld_(v*4vSozY7|WY}`P534_l zc?l+h`4#~JZ294=(XhT9EI#x!eYQZYrAdg)5Q{0PWn($<}Di{;7z#L_>PvSj#4%#>3 zbgzqx(s`=~7XJJY`^ZocMX2ZyZN=;fpi6R=P!b<8-gx$mx>iv}@_n~3F|JeD822yr zM^qB!mS7E8%4-6pRu6+u$?%_{U(!ofWQc{Qk;OQKBe>;I+qrxgJ!e1uVXtdr6z*hC z^G_*@G-`7Tjl#{PPzRVbeMrC7Y|_jQJ3`$kM?dx8azK)LTi^cL;gfNMv|0LUo)P1+ zJ3cC9yX-oBOU8;O=-a!1>p85^+>_=e6Hv42=febacMBcYmpOOUDyxvL4NV_iS-UA)M_T$3GJ+ zfB(+ss1LDSTlz>-jS#b>YKx0v;5&|9j@B2tM~%st6l>_Rlt05UL(%NkmZO*+#MKp& z7I{(9-05BG@knkQ*dLWs5)!z`iCc#2_!{CjjmjO{tKFbI{Wg+PCpUwA0&SE?=BwYh zZT*f+GY;E#X1r?M@*M0GatNco3OgAIpU)C2WEhA?N;;Jl0V60E&vCJzothFc#?W=YfI2Q+2YDLvZznRWGDQ9ixz)uIv=CkI-^ zGe8TVNitU(Cj#^*O*BB-zjs2*OT`fuI@On2Z85)7u`3~OVS3z=F+A$YU*uF@|I3mKec&kSO@sFLtlfduJD5C~8w3xE zJ2!rH!kDSO;5i%6M*vJW6AE}H`GTLXHpm6g1hJGR>9$`L`D~cpB4v3s9#v6a%JW`H z^ekUvaIOlnlP>4l@{*VzLyI1QAhs6G?c;kQpL-wnpHX7+(qS4F&`AoljP233V zO%p$dR=;iP0qu=?^h&W3wNobCQOUaVxNo9h4uf8mxJ>;Erqc+S>#{|3QTju76!imh z^|qhwz6W%J0+XYK(=ob7?L>4w@l_tyfUt|&iDohYYa-4CiHrYck@Lvc(Lg|)vR+v8SZ+^BJJ)`2J zDp&^43n$`8EVvsViTBu3p(f3-fFccaz3tzpo$ZO^21mg{VMRjwFVK)=Lu_2*`@>%W z%mQ)xsqyc2rxJviyYHlJDE3#Vl_7K@F|}-y1z4%m8X*;fpU_sqj!Dr5Sl_J4+c0IR z<4{eD>kiWWxUfP!q?3g-p)M+T;<}%WuV=|J#L!ySP5B&vOCWaGDD)dg&-~@*>EG9g z@(!F79*8ul*PZt5SGbMHcxu*^n1-U8C1;VKnljOTcdeYqxwxMUr~7;~x#W0DF0 zTai4DI7M#2PZd@JszL$1*CWRJ0DxCKEjAQApxf%DXh*rxEt2*;0Mms}2YQ1_#A945 z6^89b{&qRRCq<$C)Kb2|MXN2Q8Uh=lI0UAG-=EeSKh_;2>e==?Uj>X**w))?b8r+s zwY$fM2zeR^Q~bg5KbLR+QaiOLxb_7Qz5(c13pz`Pc_01&R<7c)(b?>FN^c2%z7|eV z(?yr0A=?Xqi--)o^{+63ViY&mIzqgWTJ}B_FcU)P?+=p~_YZCxY+xd)%GUL}{kU2U z#YNJs7PK3W_AyJc?o@bjbihjQrbp0F<%vQ8UgU2SVX38tZxt?eEyo%nV6$KI7QU66 z;w!I~M+bhe(U+K^!#YH$Z3)ydy01`%%J-HnUgcaf~fN-3oI-J7pbt|LBD*}^e!uw*JKN4BCxr!uL%qYPrWhsSlPlxs4hVR~= z$I|=3eiWB$K`9X{&Xh~H%MiDvH?LW4`$t)US*KHpE5p@Kxyqd)pQNu#7bnIW=Q?B4 zz4kY~K@x5ZaUZuLNatQ|zkU$?=62@YaffzOwpd}-D5sOG`}@@Y<^C)AfhT;+)32{x z`rTvn@|~y_L_cmm?EFpF`OkRduvvGSWJPJ74N=eAo(Lo$?G?6}LPnJcOsUcWTs$txABSH9bS zQgKPu41MgP0Os0LXXC^4k&@M@O5V}7z>PU=u~f@`92pkj%gRUXsZgeD98b|4d`F>(-DHabn8k}+6kKPxSc zN>`yuqYVg<2F5SZ7R(t_Y4&pu5`{9Cyi-v!Vmw`&X?57?>=>NoGT@jCG5s6L?C8L0 zSf!NGPOANCX=%9!{7Qamk%=Z%E}oJQ5eFZpS5CBPD2(gg=vK8d8SgH(#`;wPbV!*;!0WMS(*5BC1tJa?*$mjA!F%i^x!y7 zrMp1l_`&Iiw_B=v5RCi@;S9Co6FXsXy|neq40OscWF9Ncug33)rVwk0RTU5SB#(WI zHPSFJ^&2Iz4IDv0sQDR`_9`K$SucLqo1E={mu2j1;KAw^$oPV!#%*X_ND;5prv>BU za6T%S%AvdGblvvE^;8pWV$Pt(#jUL+Y~#HRA@(FEpzYviSV&}r1_M0ZMV&PU{->EJ z68+t}_cWK*3f-sbtE&!sY4wSO)BN&XTlu$LhrHeWh%oyV3u zn)7CBY*S~1#i~AmtJ{6yXj3Py*5?nNnuWxW9~fHfMMSo!yAf#eZ_UlEZ^(c5nygQ# zdlyFkVWF2m?x5wKi;INw^DWaBTL}=xUMOg}!4T-Tyqp ziRboe8R&~;|IpqUG`avAo1dKt3*Bz>9WpoSma)oAG)&TOG2d->090bs!fvUR2T5d2 zvgh!mD4$^BkbJUt_nu_|kKb}pqIfaM1a^Yfk`Ol6-lld~;r0Gr;pOP&-h zL-(cjy}(b{yQ!&D+>K!qO8uY~Ok0)8RQ|B~9BU(N%-BSp%g;@cck7wa8I1W#Iw}jIfo~;>W@Moa;QIn`Ful`KEJ1XqO^GdhbcHx z7}()65my*WpO^@+%?wUBPhQLM>zZ0{>K&zC`*x(Y$fEW+qp5d`@j(D-9yKk?9dstk ze~>4*JTvRi_rIz*`}53E0roNE2LrJnl8)+0*>Wu&*4eH6xZbF=maRW=&vPHFwm*up zkPx`c_Ml8*eJ`8i(Z2w-{4RV z1aPCwv$nNR!)En}*9|U^ou!_Rk)&RuR052D?eZH&44yBI)ZR7uw_7)Ii3L7kxnTZv zXRR9H5W9hKXp?2=8U6Sw2YC%dh@QDLMy(O>d=(Uje2Pke-ubGB6KWqNmh;BA(UWS{UHrv!Z<@QwUUKs8GFa&F?nO$<{UwXgcXndTJ3maC zTBA3A_aFu2Un0{3MC1)ye*B$0f1$n|&v3q97E?*Q;@JE96#N^mb8@C$1;f{fvNy1f8Kg~{_8&3>0XEy?{nl5iuyK-iRy2xrIZ7Pdo*3s|2EwJ z9B1~wcyYt1o<1nWvkd;f{*Oc%AZ7&(a9`%Pye!`1l?L;tRvF#3Ud&7PCA)zCckugj(dNu=4wq_ot%&b^WqiL<M<)%%TVJ5K5x5{L?xUwZuNC|XwZhgJ(FqX{L)w`S|M!n>aK2DO zb@hN7efd`dRRu{f(BO=QXHK}E3K{>%b5)Vo^{Pz>FuGuo4>XQbQ8zIZj7m9O+r0Hw z^Hx~o`!kXzh#!naG5@x;-65Yv-W%1S>3?Sa+&@jor*Y2ruO{pVzFga|>5HNO?oXEj zI5;?lf4qCEk|AQi7LK3s54}5G*gd$ZsfqK`WTDB%;JlFYn#?sKYAb~Z)iZH$V7qP& zqakFalXX!P!uh^wV!lE?2+9F)wgNb>=j`n4Za6(sq+I~bS51{tR8&mnbNIkN$i~Jt zFV>`z%n2Ay6VzVd7iC5j+~3(jHTAo(oNf2_|M`Gm$Alm(pr3@#TP=qOYb_DvgCBYy zKFlx4n=+dEUL+7oa?pO8MGu}0|6J2<))U6*bL~VQqB}CbHSbo}vQZnWbdC^UyLWxZ zrG+B+5@mc`SPVfyLBPRy=Kt5$nfOE5c5(bomXR>1?960Kb}C|qF@(xesVrkjDUU2E z+hiHbjPQ~fTV#E#*)nO7Ws)r>c_P(J29qg;vCW9dKJP6(@8|t|-sk=UuKROe_jO(8 z{LXdG_mtGt*=AT z{8dBVT-J!?Rxx+OXXQsRSB^F^Vi6o1j9y_RV$&5g1k59W^3qOE?izKFMyrXC_I;#Z zSg6*OqSGej5wp2WC@xl{1Hc8=M5e=bt%=`loBsC>W)A~^0&P1%X-nP`VLyR$%>ZbN zHRH)`L5cPOaM%EF5dRBoP77)vUM>qvEK=WQw0}K*@a; zAXgGz0#FE=V)vX*%<5?)H0#gr_w6FY){`E@0F43|Wq8wbrPk?{m6a^A5*|0!8m@8t zn~eURbc;dtRi8$hRC&v>8xZBfM(A_Ul^?TD27r5Ieib_L1t%{}k(#u8)wq{92gCUL z`3Vt8i>G4!GwWM${l>jBC^K4f%i(w1;G*1<>6`mg+9r4@{q=? zbSYl9c7U;Ql?;{cu7vTDPOP(wOEooWkl#a-GVo3KwNSocObNZ!bK{Go7xP24*Ve`= zBmCvM`^v_Tfv){dZY7o(n84P#V*%I}u#m)CXa%9C%o=|OaO;=$q;IUv5VQB0E)7~R zqq{ABe!7BJS1&bt;=4eHd#!Wk7~36f4X*W{fp4)A&2Z7e>qsBp2jZQmz-ARq*QYk? z>+g%V$~j}0^|>(|s4#V^J5*Ud-b$wT>s;>z0aEaDdPHsISz=XHQt9Dq)YqA6*}4bz z?E{)4Q8FOeok6R;&`eyWcw5q$a60L>7q#B~R3EFr+@2+Z)K#@Fs8Zg2>+)xJvPgh! zu_>JNlO8#SOXAej*6#MsJaZlwG_c{ddg?mMe`|9gMwIFne77+Y;QIS=v#4{^mAfu z^XF&LV$52#`0-As8vs;JC9oX3*_W;HOee{pdp6Bv9)zQQ34n)85$?o)f#PiQW8vN+ zaZ_ThLJHu%$>JCfiFMoDT(UmT@Y+i#>Uy*3 z{d77173HVPgm=6U%=EUS)Lwy$wWCAL3Hwl!0{jH|Eyyvj1QOxIML(;@D{V;d#3K%~ z#P6#Km6DC&e);+Yogwwz$#LU|wk?1X#M$$6-`a_rANd9#erq84yU$O^C`-fzz1ZZ8 zlw3w8h$F}v3i>2Zf*I_pm9yZ2Wlc@ZdCw5#@{iplFtps_>P^(qZx#N#g!vBLCI zNISzDbh+)q_Gc1>b*A5@6$>GM5N2B!+D!KC)c_5^exznNJi?Om#vj5*qnzjXgF#0o zz@4W?D5jehkJT+!G@MHfcnM0krvh5QA}KyM7U(a2p(()@Aw@@gGcuehmuV696h!HJ zM+f-+zFxeOj>bd**lnl-RO)I(Iy0wtEAZILyPZQ55)PhPE!GVW3A2-r>jy2t`Ul+V ziK9Zp_Kj=vZ+cE^nW366#dA^k=wa8Rty+-%I6)+xrK&egtgokph7k~C{vx%c131vY zhj>1rEK4M=N>S|$_%P^GDAoPJ#2%i1KS&RaLKi}ysuy#VVs18s*`QuxUSvG<+*-_` zNqR3hy)5^gGZ?=9cCjN-C&hI=whRNtE*3z2U>%^)*%I(mRz*iJX>b%3sNhe2ky zlTzJN3wfnlw1D8cr6{Q$Jldp9fYW;OuY2D@zT#cx&kzaw(19`v95oVVU!9efTXd)V5ap133PLd^L6xs2-WO!CSTk0DyPeidPL=jc1094paTAa~4(w!O0AW)EJP zSz&#;KfWIq3;s^dd*MfXagi$ZI9<@Pq`u8QS;{*#$O?7|7c3r6?lEW_QSnfvC{iet z!;E(9)frJ2iQWj)$o;tGLYR!;<0Vnkl{1Dwc8Ux@KY|dHk(v*qDPQ5-(H{)JemI@; z`BwElr0OJ<=>n&`Drprn^G^)&GAjp65#VFlJ z-^DKD1qd*jZbrYAo|{EPjuxu&>%ehi$2)CyK6Bk>zg^s0;@i0-uTTEv?z`hH$JIgp z)zE&0Z&$~9Zv-+4N-Sww{ht4EcT&zCB=1e^Uh(+bo1xTNs?cSGEMa$AmM?6uif%#* zobfi07z!k@tyE0$W?N0-VES;PVT!ITNPxGW_NP2$()^U5bwd9jK0$wr^Zez<QnnID4LQHcerz#YE*4&Qq9PT;Q|+WE7wmSk9$g7o6NHB7oFf*&2a~+@t9P zZIG&^$OgF6UU1;qUtuiTxdW-g~PJ6+AL)Y%?6<{snctTPqEU(>2^$y?-b$C zMyBbZt|o-Hw4|(=&7mtDCQx=BlEXgqz9^Y-nTq+{sGBUjtqXdLn(ytna+18c-LisR zr^(l}zMt%@z1A9p1Z;^#Jj5B7h*UoL#Ef>Z`%z_!RWc}`VPp#Eb_+c|VV(vt#>syP z@HRYcQ#oyp0u`NLS`huYv6y$A} z=0NUp=o1$rfcSxNzi0}v`0mR8lRR=0Z`o=@+4iM#(vstHu z5_ro@{J4XHsCNQ4H1ZjjMAw|r8b%pTdJP9two_4 z&E(1FN3WMZU}BekXl*_VheSB%S2J@9@A*(KCi-RCPO@Pdie~XzSL@v0DE-Ck8F-C< zfVyo`bb({*U~;hs|7(0Bp60u;k)Ytn4Y$Z0oscyV=L{|Qm0niD-c#<8ag}?Z9+6|>J&5mG)^u2nu zsHx?c@5)bC?~)-(5;G6O9bHNF)8oHWynrwQprHcq=J?J0f9wQ70ka72>ddEw|0g2$ zx0EHIKt|C1hwNJc{}keo0aV`;{tCm1e;73o3iyK0d)_?z2Sp9>+a6UWi%$6aJ^$6c wz#Jt2XX&Vn4wbTFrT?p!w@=nOD2u!65EycH_PzPgzkuiD346b;b++)if(b in this&&this[b]===a)return b;return-1};old_m=angular.module("n3-charts.linechart",["n3charts.utils"]),m=angular.module("n3-line-chart",["n3charts.utils"]),directive=function(a,b){return old_m.directive(a,b),m.directive(a,b)},directive("linechart",["n3utils","$window","$timeout",function(a,b,c){var d;return d=function(d,e,f,g){var h,i,j,k,l,m,n,o;o=a,h=o.getEventDispatcher(),i=o.uuid(),e[0].style["font-size"]=0,d.redraw=function(){d.update()},k=!1,j={onSeriesVisibilityChange:function(a){var b,c,e;return e=a.series,b=a.index,c=a.newVisibility,d.options.series[b].visible=c,d.$apply()}},d.update=function(){var a,b,c,g,k,l,m,n,p;return n=o.sanitizeOptions(d.options,f.mode),l=angular.extend(j,o.getTooltipHandlers(n)),c=o.getDataPerSeries(d.data,n),g=o.getDimensions(n,e,f),m="thumbnail"===f.mode,o.clean(e[0]),p=o.bootstrap(e[0],i,g),k=function(a){return n.series.filter(function(b){return b.axis===a&&b.visible!==!1}).length>0},a=o.createAxes(p,g,n.axes).andAddThemIf({all:!m,x:!0,y:k("y"),y2:k("y2")}),c.length&&o.setScalesDomain(a,d.data,n.series,p,n),o.createContent(p,i,n,l),c.length&&(b=o.getBestColumnWidth(a,g,c,n),o.drawData(p,g,a,c,b,n,l,h)),n.drawLegend&&o.drawLegend(p,n.series,g,l,h),"scrubber"===n.tooltip.mode?o.createGlass(p,g,l,a,c,n,h,b):"none"!==n.tooltip.mode&&o.addTooltips(p,g,n.axes),o.createFocus(p,g,n),o.setZoom(p,g,a,c,b,n,l,h)},m=function(){return d.oldclick?h.on("click",d.oldclick):d.click?h.on("click",d.click):h.on("click",null),d.oldhover?h.on("hover",d.oldhover):d.hover?h.on("hover",d.hover):h.on("hover",null),d.mouseenter?h.on("mouseenter",d.mouseenter):h.on("mouseenter",null),d.mouseover?h.on("mouseover",d.mouseover):h.on("mouseover",null),d.mouseout?h.on("mouseout",d.mouseout):h.on("mouseout",null),d.oldfocus?h.on("focus",d.oldfocus):d.focus?h.on("focus",d.focus):h.on("focus",null),d.toggle?h.on("toggle",d.toggle):h.on("toggle",null)},l=void 0,n=function(){return null!=l&&c.cancel(l),l=c(d.redraw,1)},b.addEventListener("resize",n),d.$watch("data",d.redraw,!0),d.$watch("options",d.redraw,!0),d.$watchCollection("[click, hover, focus, toggle]",m),d.$watchCollection("[mouseenter, mouseover, mouseout]",m),d.$watchCollection("[oldclick, oldhover, oldfocus]",m),d.$on("$destroy",function(){return b.removeEventListener("resize",n)})},{replace:!0,restrict:"E",scope:{data:"=",options:"=",oldclick:"=click",oldhover:"=hover",oldfocus:"=focus",click:"=onClick",hover:"=onHover",focus:"=onFocus",toggle:"=onToggle",mouseenter:"=onMouseenter",mouseover:"=onMouseover",mouseout:"=onMouseout"},template:"
",link:d}}]),mod=angular.module("n3charts.utils",[]),mod.factory("n3utils",["$window","$log","$rootScope",function(a,b,c){return{addPatterns:function(a,b){var c;return c=a.select("defs").selectAll("pattern").data(b.filter(function(a){return a.striped})).enter().append("pattern").attr({id:function(a){return a.type+"Pattern_"+a.index},patternUnits:"userSpaceOnUse",x:0,y:0,width:60,height:60}).append("g").style({fill:function(a){return a.color},"fill-opacity":.9}),c.append("rect").style("fill-opacity",.9).attr("width",60).attr("height",60),c.append("path").attr("d","M 10 0 l10 0 l -20 20 l 0 -10 z"),c.append("path").attr("d","M40 0 l10 0 l-50 50 l0 -10 z"),c.append("path").attr("d","M60 10 l0 10 l-40 40 l-10 0 z"),c.append("path").attr("d","M60 40 l0 10 l-10 10 l -10 0 z")},drawArea:function(a,b,c,d){var e,f,g,h;return g=c.filter(function(a){return"area"===a.type}),this.addPatterns(a,g),h={y:this.createLeftAreaDrawer(b,d.lineMode,d.tension),y2:this.createRightAreaDrawer(b,d.lineMode,d.tension)},f=a.select(".content").selectAll(".areaGroup").data(g),e=f.enter().append("g").attr("class",function(a){return"areaGroup series_"+a.index}),f.each(function(a){var b;return b=d3.select(this).selectAll("path").data([a]),b.enter().append("path").attr("class","area"),b.style("fill",function(a){return a.striped!==!0?a.color:"url(#areaPattern_"+a.index+")"}).style("opacity",function(a){return a.striped?"1":"0.8"}).attr("d",function(a){return h[a.axis](a.values)})}),this},createLeftAreaDrawer:function(a,b,c){return d3.svg.area().x(function(b){return a.xScale(b.x)}).y0(function(b){return a.yScale(b.y0)}).y1(function(b){return a.yScale(b.y0+b.y)}).interpolate(b).tension(c)},createRightAreaDrawer:function(a,b,c){return d3.svg.area().x(function(b){return a.xScale(b.x)}).y0(function(b){return a.y2Scale(b.y0)}).y1(function(b){return a.y2Scale(b.y0+b.y)}).interpolate(b).tension(c)},getPseudoColumns:function(a,b){var c,d;return a=a.filter(function(a){return"column"===a.type}),d={},c=[],a.forEach(function(a){var e,f,g,h,i;return e=b.series.map(function(a){return a.id}).indexOf(a.id),h=null!=(i=b.series)?i[e].visible:void 0,void 0!==h&&h!==!0||(f=!1,b.stacks.forEach(function(b,e){var g;return null!=a.id&&(g=a.id,__indexOf.call(b.series,g)>=0)?(d[a.id]=e,__indexOf.call(c,e)<0&&c.push(e),f=!0):void 0}),f!==!1)?void 0:(e=d[a.id]=g=c.length,c.push(e))}),{pseudoColumns:d,keys:c}},getMinDelta:function(a,b,c,d){return d3.min(a.map(function(a){return a.values.map(function(a){return c(a[b])}).filter(function(a){return d?a>=d[0]&&a<=d[1]:!0}).reduce(function(a,b,c,d){var e;return e=c>0?Math.max(b-d[c-1],0):Number.MAX_VALUE,a>e?e:a},Number.MAX_VALUE)}))},getBestColumnWidth:function(a,b,c,d){var e,f,g,h,i,j,k;return c&&0!==c.length?0===c.filter(function(a){return"column"===a.type}).length?10:(k=this.getPseudoColumns(c,d),j=k.pseudoColumns,h=k.keys,g=b.width-b.left-b.right,e=c.filter(function(a){return j.hasOwnProperty(a.id)}),f=this.getMinDelta(e,"x",a.xScale,[0,g]),f>g&&(f=.25*g),i=h.length,d.columnsHGap0))return[g];for(m=c.width-c.right-c.left,d=0,j=[],f=k.length-1;f>=0;)j.push(m-d-k[f]),d+=k[f]+i,f--;return j.reverse(),[g,j]},getLegendItemsWidths:function(a,b){var c,d,e,f,g;if(f=this,c=function(a){return f.getTextBBox(a).width},e=a.selectAll(".legendItem."+b),!(e.length>0))return[];for(g=[],d=0;dA;h=++A)f=t[h],u=b.xScale(f.x),x=b.yScale(f.y),("undefined"==typeof n||null===n||n>u)&&(n=u,o=f.x),("undefined"==typeof j||null===j||u>j)&&(j=u,k=f.x),("undefined"==typeof p||null===p||p>x)&&(p=x),("undefined"==typeof l||null===l||x>l)&&(l=x),("undefined"==typeof q||null===q||f.ym)&&(m=f.y);return v=(r[0]-n)/(j-n),y=(r[1]-p)/(l-p),w=Math.round(v*(k-o)+o),z=Math.round((1-y)*(m-q)+q),i={x:w,y:z},"function"==typeof e.onMouseOver?e.onMouseOver(a,{series:c,x:r[0],y:r[1],datum:i},d.axes):void 0},h.on("mousemove",g).on("mouseout",function(b){return"function"==typeof e.onMouseOut?e.onMouseOut(a):void 0})),this},createLeftLineDrawer:function(a,b,c){return d3.svg.line().x(function(b){return a.xScale(b.x)}).y(function(b){return a.yScale(b.y+b.y0)}).interpolate(b).tension(c)},createRightLineDrawer:function(a,b,c){return d3.svg.line().x(function(b){return a.xScale(b.x)}).y(function(b){return a.y2Scale(b.y+b.y0)}).interpolate(b).tension(c)},getPixelCssProp:function(b,c){var d;return d=a.getComputedStyle(b,null).getPropertyValue(c),+d.replace(/px$/,"")},getDefaultMargins:function(){return{top:20,right:50,bottom:60,left:50}},getDefaultThumbnailMargins:function(){return{top:1,right:1,bottom:2,left:0}},getElementDimensions:function(a,b,c){var d,e,f,g,h,i;return e={},g=a,i=this.getPixelCssProp(g,"padding-top"),d=this.getPixelCssProp(g,"padding-bottom"),f=this.getPixelCssProp(g,"padding-left"),h=this.getPixelCssProp(g,"padding-right"),e.width=+(b||g.offsetWidth||900)-f-h,e.height=+(c||g.offsetHeight||500)-i-d,e},getDimensions:function(a,b,c){var d;return d=this.getElementDimensions(b[0].parentElement,c.width,c.height),d=angular.extend(a.margin,d)},clean:function(a){return d3.select(a).on("keydown",null).on("keyup",null).select("svg").remove()},uuid:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b,c;return b=16*Math.random()|0,c="x"===a?b:3&b|8,c.toString(16)})},bootstrap:function(a,b,c){var d,e,f,g;return d3.select(a).classed("chart",!0),g=c.width,e=c.height,f=d3.select(a).append("svg").attr({width:g,height:e}).append("g").attr("transform","translate("+c.left+","+c.top+")"),d=f.append("defs").attr("class","patterns"),d.append("clipPath").attr("class","content-clip").attr("id","content-clip-"+b).append("rect").attr({x:0,y:0,width:g-c.left-c.right,height:e-c.top-c.bottom}),f},createContent:function(a,b,c){var d;return d=a.append("g").attr("class","content"),c.hideOverflow?d.attr("clip-path","url(#content-clip-"+b+")"):void 0},createZoomResetIcon:function(a,b,c,d,e,f,g,h,i){var j,k,l,m,n,o,p;return o=this,m="M22.646,19.307c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127l3.535-3.537L22.646,19.307zM13.688,20.369c-3.582-0.008-6.478-2.904-6.484-6.484c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486C20.165,17.465,17.267,20.361,13.688,20.369zM8.854,11.884v4.001l9.665-0.001v-3.999L8.854,11.884z",k=a.select(".focus-container").selectAll(".icon.zoom-reset").data([1]),j=k.enter().append("g").attr("class","icon zoom-reset").on("click",function(){return o.resetZoom(a,b,c,d,e,f,g,h,i),d3.select(this).remove()}).on("mouseenter",function(){return d3.select(this).style("fill","steelblue")}).on("mouseout",function(){return d3.select(this).style("fill","black")}),j.append("path").attr("d",m),l=b.width-b.left-b.right-24,p=2,n=.7,k.style({fill:"black",stroke:"white","stroke-width":1.5}).attr({opacity:1,transform:"translate("+l+", "+p+") scale("+n+")"})},createFocus:function(a,b,c){var d;return d=a.append("g").attr({"class":"focus-container"})},createGlass:function(a,b,c,d,e,f,g,h){var i,j,k;return k=this,i=a.append("g").attr({"class":"glass-container",opacity:0}),j=i.selectAll(".scrubberItem").data(e).enter().append("g").attr("class",function(a,b){return"scrubberItem series_"+b}),j.each(function(a,b){var c,d,e;return e=d3.select(this),c=e.append("g").attr({"class":"rightTT"}),c.append("path").attr({"class":"scrubberPath series_"+b,y:"-7px",fill:a.color}),k.styleTooltip(c.append("text").style("text-anchor","start").attr({"class":function(a,b){return"scrubberText series_"+b},height:"14px",transform:"translate(7, 3)","text-rendering":"geometric-precision"})).text(a.label||a.y),d=e.append("g").attr({"class":"leftTT"}),d.append("path").attr({"class":"scrubberPath series_"+b,y:"-7px",fill:a.color}),k.styleTooltip(d.append("text").style("text-anchor","end").attr({"class":"scrubberText series_"+b,height:"14px",transform:"translate(-13, 3)","text-rendering":"geometric-precision"})).text(a.label||a.y),e.append("circle").attr({"class":"scrubberDot series_"+b,fill:"white",stroke:a.color,"stroke-width":"2px",r:4})}),i.append("rect").attr({"class":"glass",width:b.width-b.left-b.right,height:b.height-b.top-b.bottom}).style("fill","white").style("fill-opacity",1e-6).on("mouseover",function(){return c.onChartHover(a,d3.select(this),d,e,f,g,h)})},drawData:function(a,b,c,d,e,f,g,h){return this.drawArea(a,c,d,f,g).drawColumns(a,c,d,e,f,g,h).drawLines(a,c,d,f,g),f.drawDots?this.drawDots(a,c,d,f,g,h):void 0},getDataPerSeries:function(a,b){var c,d,e,f;return e=b.series,c=b.axes,e&&e.length&&a&&a.length?(f=e.map(function(c,d){var e;return e={index:d,name:c.y,values:[],color:c.color,axis:c.axis||"y",xOffset:0,type:c.type,thickness:c.thickness,drawDots:c.drawDots!==!1},null!=c.dotSize&&(e.dotSize=c.dotSize),c.striped===!0&&(e.striped=!0),null!=c.lineMode&&(e.lineMode=c.lineMode),c.id&&(e.id=c.id),a.filter(function(a){return null!=a[c.y]}).forEach(function(a){var d;return d={x:a[b.axes.x.key],y:a[c.y],y0:0,axis:c.axis||"y"},null!=c.dotSize&&(d.dotSize=c.dotSize),e.values.push(d)}),e}),null==b.stacks||0===b.stacks.length?f:(d=d3.layout.stack().values(function(a){return a.values}),b.stacks.forEach(function(a){var b;if(a.series.length>0)return b=f.filter(function(a,b){return void 0===e[b].visible||e[b].visible}).filter(function(b,c){var d;return null!=b.id&&(d=b.id,__indexOf.call(a.series,d)>=0)}),d(b)}),f)):[]},estimateSideTooltipWidth:function(a,b){var c,d;return d=a.append("text"),d.text(""+b),this.styleTooltip(d),c=this.getTextBBox(d[0][0]),d.remove(),c},getTextBBox:function(a){var b;if(null!==a)try{return a.getBBox()}catch(c){return b=c,{height:0,width:0,y:0,x:0}}return{}},getWidestTickWidth:function(a,b){var c,d,e,f;return d=0,c=this.getTextBBox,e=a.select("."+b+".axis").selectAll(".tick"),null!=(f=e[0])&&f.forEach(function(a){return d=Math.max(d,c(a).width)}),d},getWidestOrdinate:function(a,b,c){var d;return d="",a.forEach(function(a){return b.forEach(function(b){var e,f;return e=a[b.y],null!=b.axis&&(null!=(f=c.axes[b.axis])?f.ticksFormatter:void 0)&&(e=c.axes[b.axis].ticksFormatter(e)),null!=e&&(""+e).length>(""+d).length?d=e:void 0})}),d},getDefaultOptions:function(){return{tooltip:{mode:"scrubber"},lineMode:"linear",tension:.7,margin:this.getDefaultMargins(),axes:{x:{type:"linear",key:"x"},y:{type:"linear"}},series:[],drawLegend:!0,drawDots:!0,stacks:[],columnsHGap:5,hideOverflow:!1}},sanitizeOptions:function(a,b){var c;return null==a&&(a={}),"thumbnail"===b&&(a.drawLegend=!1,a.drawDots=!1,a.tooltip={mode:"none",interpolate:!1}),a.series=this.sanitizeSeriesOptions(a.series),a.stacks=this.sanitizeSeriesStacks(a.stacks,a.series),a.axes=this.sanitizeAxes(a.axes,this.haveSecondYAxis(a.series)),a.tooltip=this.sanitizeTooltip(a.tooltip),a.margin=this.sanitizeMargins(a.margin),a.lineMode||(a.lineMode=this.getDefaultOptions().lineMode),a.tension=/^\d+(\.\d+)?$/.test(a.tension)?a.tension:this.getDefaultOptions().tension,a.drawLegend=a.drawLegend!==!1,a.drawDots=a.drawDots!==!1,angular.isNumber(a.columnsHGap)||(a.columnsHGap=5),a.hideOverflow=a.hideOverflow||!1,c="thumbnail"===b?this.getDefaultThumbnailMargins():this.getDefaultMargins(),a.series=angular.extend(this.getDefaultOptions().series,a.series),a.axes=angular.extend(this.getDefaultOptions().axes,a.axes),a.tooltip=angular.extend(this.getDefaultOptions().tooltip,a.tooltip),a.margin=angular.extend(c,a.margin),a},sanitizeMargins:function(a){var b,c,d,e;b=["top","right","bottom","left"],c={};for(d in a)e=a[d],__indexOf.call(b,d)>=0&&(c[d]=parseFloat(e));return c},sanitizeSeriesStacks:function(a,c){var d;return null==a?[]:(d={},c.forEach(function(a){return d[a.id]=a}),a.forEach(function(a){return a.series.forEach(function(c){var e;if(e=d[c],null!=e){if(e.axis!==a.axis)return b.warn("Series "+c+" is not on the same axis as its stack")}else if(!e)return b.warn("Unknown series found in stack : "+c)})}),a)},sanitizeTooltip:function(a){var b;if(!a)return{mode:"scrubber"};if("none"!==(b=a.mode)&&"axes"!==b&&"scrubber"!==b&&(a.mode="scrubber"),"scrubber"===a.mode?delete a.interpolate:a.interpolate=!!a.interpolate,"scrubber"===a.mode&&a.interpolate)throw new Error("Interpolation is not supported for scrubber tooltip mode.");return a},sanitizeSeriesOptions:function(a){var b,c;return null==a?[]:(b=d3.scale.category10(),c={},a.forEach(function(a,b){if(null!=c[a.id])throw new Error("Twice the same ID ("+a.id+") ? Really ?");return null!=a.id?c[a.id]=a:void 0}),a.forEach(function(a,d){var e,f,g,h,i;if(a.axis="y2"!==(null!=(f=a.axis)?f.toLowerCase():void 0)?"y":"y2",a.color||(a.color=b(d)),a.type="line"===(g=a.type)||"area"===g||"column"===g?a.type:"line","column"===a.type?(delete a.thickness,delete a.lineMode,delete a.drawDots,delete a.dotSize):/^\d+px$/.test(a.thickness)||(a.thickness="1px"),"line"!==(h=a.type)&&"area"!==h||("dashed"!==(i=a.lineMode)&&delete a.lineMode,a.drawDots!==!1&&null==a.dotSize&&(a.dotSize=2)),null==a.id){for(e=0;null!=c["series_"+e];)e++;a.id="series_"+e,c[a.id]=a}return a.drawDots===!1?delete a.dotSize:void 0}),a)},sanitizeAxes:function(a,b){var c;return null==a&&(a={}),a.x=this.sanitizeAxisOptions(a.x),(c=a.x).key||(c.key="x"),a.y=this.sanitizeAxisOptions(a.y),b&&(a.y2=this.sanitizeAxisOptions(a.y2)),a},sanitizeExtrema:function(a){var c,d,e,f,g,h;for(g=["min","max"],h=[],e=0,f=g.length;f>e;e++)c=g[e],d=a[c],null!=d?(a[c]=this.sanitizeExtremum(c,a),null==a[c]?h.push(b.warn("Invalid "+c+" value '"+d+"' (parsed as "+a[c]+"), ignoring it.")):h.push(void 0)):h.push(void 0);return h},sanitizeExtremum:function(a,b){var c;return c=this.sanitizeNumber,"date"===b.type&&(c=this.sanitizeDate),c(b[a])},sanitizeDate:function(a){return null!=a&&a instanceof Date&&!isNaN(a.valueOf())?a:void 0},sanitizeNumber:function(a){var b;if(null!=a&&(b=parseFloat(a),!isNaN(b)))return b},sanitizeAxisOptions:function(a){return null==a?{type:"linear"}:(a.type||(a.type="linear"),null!=a.ticksRotate&&(a.ticksRotate=this.sanitizeNumber(a.ticksRotate)),null!=a.zoomable&&(a.zoomable=a.zoomable||!1),null!=a.innerTicks&&(a.innerTicks=a.innerTicks||!1),null!=a.labelFunction&&(a.ticksFormatter=a.labelFunction),null!=a.ticksFormat&&("date"===a.type?a.ticksFormatter=d3.time.format(a.ticksFormat):a.ticksFormatter=d3.format(a.ticksFormat),null==a.tooltipFormatter&&(a.tooltipFormatter=a.ticksFormatter)),null!=a.tooltipFormat&&("date"===a.type?a.tooltipFormatter=d3.time.format(a.tooltipFormat):a.tooltipFormatter=d3.format(a.tooltipFormat)),null!=a.ticksInterval&&(a.ticksInterval=this.sanitizeNumber(a.ticksInterval)),this.sanitizeExtrema(a),a)},createAxes:function(a,b,c){var d,e,f,g,h,i,j,k,l,m;return d=null!=c.y2,g=b.width,e=b.height,g=g-b.left-b.right,e=e-b.top-b.bottom,h=void 0,h="date"===c.x.type?d3.time.scale().rangeRound([0,g]):d3.scale.linear().rangeRound([0,g]),i=this.createAxis(h,"x",c),j=void 0,j="log"===c.y.type?d3.scale.log().clamp(!0).rangeRound([e,0]):d3.scale.linear().rangeRound([e,0]),j.clamp(!0),m=this.createAxis(j,"y",c),k=void 0,k=d&&"log"===c.y2.type?d3.scale.log().clamp(!0).rangeRound([e,0]):d3.scale.linear().rangeRound([e,0]),k.clamp(!0),l=this.createAxis(k,"y2",c),f=function(a){return a.style({font:"10px Courier","shape-rendering":"crispEdges"}),a.selectAll("path").style({fill:"none",stroke:"#000"})},{xScale:h,yScale:j,y2Scale:k,xAxis:i,yAxis:m,y2Axis:l,andAddThemIf:function(b){return b.all&&(b.y&&(a.append("g").attr("class","y grid"),a.append("g").attr("class","y axis").call(m).call(f)),d&&b.y2&&(a.append("g").attr("class","y2 grid").attr("transform","translate("+g+", 0)"),a.append("g").attr("class","y2 axis").attr("transform","translate("+g+", 0)").call(l).call(f)),b.x&&(a.append("g").attr("class","x grid").attr("transform","translate(0,"+e+")"),a.append("g").attr("class","x axis").attr("transform","translate(0,"+e+")").call(i).call(f))),{xScale:h,yScale:j,y2Scale:k,xAxis:i,yAxis:m,y2Axis:l}}}},createAxis:function(a,b,c){var d,e,f;return f={x:"bottom",y:"left",y2:"right"},e=c[b],d=d3.svg.axis().scale(a).orient(f[b]).innerTickSize(4).tickFormat(null!=e?e.ticksFormatter:void 0),null==e?d:(angular.isArray(e.ticks)?d.tickValues(e.ticks):angular.isNumber(e.ticks)?d.ticks(e.ticks):angular.isFunction(e.ticks)&&d.ticks(e.ticks,e.ticksInterval),d)},setDefaultStroke:function(a){return a.attr("stroke","#000").attr("stroke-width",1).style("shape-rendering","crispEdges")},setDefaultGrid:function(a){return a.attr("stroke","#eee").attr("stroke-width",1).style("shape-rendering","crispEdges")},setScalesDomain:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n;return this.setXScale(a.xScale,b,c,e.axes),f=d.selectAll(".x.axis").call(a.xAxis),null!=e.axes.x.innerTicks&&f.selectAll(".tick>line").call(this.setDefaultStroke),null!=e.axes.x.grid&&(h=e.margin.height-e.margin.top-e.margin.bottom,j=a.xAxis.tickSize(-h,0,0),g=d.selectAll(".x.grid").call(j),g.selectAll(".tick>line").call(this.setDefaultGrid)),null!=e.axes.x.ticksRotate&&f.selectAll(".tick>text").attr("dy",null).attr("transform","translate(0,5) rotate("+e.axes.x.ticksRotate+" 0,6)").style("text-anchor",e.axes.x.ticksRotate>=0?"start":"end"),c.filter(function(a){return"y"===a.axis&&a.visible!==!1}).length>0&&(m=this.getVerticalDomain(e,b,c,"y"),a.yScale.domain(m).nice(),f=d.selectAll(".y.axis").call(a.yAxis),null!=e.axes.y.innerTicks&&f.selectAll(".tick>line").call(this.setDefaultStroke),null!=e.axes.y.ticksRotate&&f.selectAll(".tick>text").attr("transform","rotate("+e.axes.y.ticksRotate+" -6,0)").style("text-anchor","end"),null!=e.axes.y.grid&&(i=e.margin.width-e.margin.left-e.margin.right,n=a.yAxis.tickSize(-i,0,0),g=d.selectAll(".y.grid").call(n),g.selectAll(".tick>line").call(this.setDefaultGrid))),c.filter(function(a){return"y2"===a.axis&&a.visible!==!1}).length>0&&(k=this.getVerticalDomain(e,b,c,"y2"),a.y2Scale.domain(k).nice(),f=d.selectAll(".y2.axis").call(a.y2Axis),null!=e.axes.y2.innerTicks&&f.selectAll(".tick>line").call(this.setDefaultStroke),null!=e.axes.y2.ticksRotate&&f.selectAll(".tick>text").attr("transform","rotate("+e.axes.y2.ticksRotate+" 6,0)").style("text-anchor","start"),null!=e.axes.y2.grid)?(i=e.margin.width-e.margin.left-e.margin.right,l=a.y2Axis.tickSize(-i,0,0),g=d.selectAll(".y2.grid").call(l),g.selectAll(".tick>line").call(this.setDefaultGrid)):void 0},getVerticalDomain:function(a,b,c,d){var e,f,g;return(g=a.axes[d])?null!=g.ticks&&angular.isArray(g.ticks)?[g.ticks[0],g.ticks[g.ticks.length-1]]:(f=c.filter(function(a){return a.axis===d&&a.visible!==!1}),e=this.yExtent(c.filter(function(a){return a.axis===d&&a.visible!==!1}),b,a.stacks.filter(function(a){return a.axis===d})),"log"===g.type&&(e[0]=0===e[0]?.001:e[0]),null!=g.min&&(e[0]=g.min),null!=g.max&&(e[1]=g.max),e):[]},yExtent:function(a,b,c){var d,e,f;return f=Number.POSITIVE_INFINITY,e=Number.NEGATIVE_INFINITY,d=[],c.forEach(function(b){return d.push(b.series.map(function(b){return a.filter(function(a){return a.id===b})[0]}))}),a.forEach(function(a,b){var e;return e=!1,c.forEach(function(b){var c;return c=a.id,__indexOf.call(b.series,c)>=0?e=!0:void 0}),e?void 0:d.push([a])}),d.forEach(function(a){return a=a.filter(Boolean),f=Math.min(f,d3.min(b,function(b){return a.reduce(function(a,c){return Math.min(a,b[c.y])},Number.POSITIVE_INFINITY)})),e=Math.max(e,d3.max(b,function(b){return a.reduce(function(a,c){return a+b[c.y]},0)}))}),f===e?f>0?[0,2*f]:[2*f,0]:[f,e]},setXScale:function(a,b,c,d){var e,f;return e=this.xExtent(b,d.x.key,d.x.type),c.filter(function(a){return"column"===a.type}).length&&this.adjustXDomainForColumns(e,b,d.x.key),f=d.x,null!=f.min&&(e[0]=f.min),null!=f.max&&(e[1]=f.max),a.domain(e)},xExtent:function(a,b,c){var d,e,f,g;return g=d3.extent(a,function(a){return a[b]}),e=g[0],f=g[1],e===f?"date"===c?(d=864e5,[new Date(+e-d),new Date(+f+d)]):e>0?[0,2*e]:[2*e,0]:[e,f]},adjustXDomainForColumns:function(a,b,c){var d;return d=this.getAverageStep(b,c),angular.isDate(a[0])?(a[0]=new Date(+a[0]-d),a[1]=new Date(+a[1]+d)):(a[0]=a[0]-d,a[1]=a[1]+d)},getAverageStep:function(a,b){var c,d,e;if(!(a.length>1))return 0;for(e=0,d=a.length-1,c=0;d>c;)e+=a[c+1][b]-a[c][b],c++;return e/d},haveSecondYAxis:function(a){return!a.every(function(a){return"y2"!==a.axis})},showScrubber:function(a,b,c,d,e,f,g){var h;return h=this,b.on("mousemove",function(){return a.selectAll(".glass-container").attr("opacity",1),h.updateScrubber(a,d3.mouse(this),c,d,e,f,g)}),b.on("mouseout",function(){return b.on("mousemove",null),a.selectAll(".glass-container").attr("opacity",0)})},getClosestPoint:function(a,b){var c,d,e,f,g;return g=d3.bisector(function(a){return a.x}).left,f=g(a,b),0===f?a[0]:f>a.length-1?a[a.length-1]:(d=a[f-1],e=a[f],c=b-d.x>e.x-b?e:d)},updateScrubber:function(a,b,c,d,e,f,g){var h,i,j,k,l,m;return l=b[0],m=b[1],h=function(a){return a.transition().duration(50)},j=this,i=[],d.forEach(function(b,d){var g,k,n,o,p,q,r,s,t,u,v,w,x;return k=a.select(".scrubberItem.series_"+d),e.series[d].visible===!1?void k.attr("opacity",0):(k.attr("opacity",1),v=c.xScale.invert(l),x=c.yScale.invert(m),u=j.getClosestPoint(b.values,v),f.focus(u,b.values.indexOf(u),[v,x]),t=u.x+" : "+u.y,e.tooltip.formatter&&(t=e.tooltip.formatter(u.x,u.y,e.series[d])),q=k.select(".rightTT"),p=q.select("text"),p.text(t),o=k.select(".leftTT"),n=o.select("text"),n.text(t),s={right:j.getTextBBox(p[0][0]).width+5,left:j.getTextBBox(n[0][0]).width+5},r="y2"===b.axis?"right":"left",w=c.xScale(u.x),"left"===r?w+j.getTextBBox(n[0][0]).x-10<0&&(r="right"):"right"===r&&w+s.right>j.getTextBBox(a.select(".glass")[0][0]).width&&(r="left"),"left"===r?(h(q).attr("opacity",0),h(o).attr("opacity",1)):(h(q).attr("opacity",1),h(o).attr("opacity",0)),i[d]={index:d,x:w,y:c[u.axis+"Scale"](u.y+u.y0),side:r,sizes:s},g=angular.isFunction(b.color)?b.color(u,b.values.indexOf(u)):b.color,k.selectAll("circle").attr("stroke",g),k.selectAll("path").attr("fill",g))}),i=this.preventOverlapping(i),k=Math.max(15,100/g),d.forEach(function(b,c){var d,f,g,l;if(e.series[c].visible!==!1)return f=i[c],d=a.select(".scrubberItem.series_"+c),g=d.select("."+f.side+"TT"),l="left"===f.side?b.xOffset:-b.xOffset,g.select("text").attr("transform",function(){return"left"===f.side?"translate("+(-3-k-l)+", "+(f.labelOffset+3)+")":"translate("+(4+k+l)+", "+(f.labelOffset+3)+")"}),g.select("path").attr("d",j.getScrubberPath(f.sizes[f.side]+1,f.labelOffset,f.side,k+l)), h(d).attr({transform:"translate("+(i[c].x+b.xOffset)+", "+i[c].y+")"})})},getScrubberPath:function(a,b,c,d){var e,f,g,h;return e=18,f=d,a=a,g="left"===c?1:-1,h=1,0!==b&&(h=Math.abs(b)/b),b||(b=0),["m0 0","l"+g+" 0","l0 "+(b+h),"l"+-g*(f+1)+" 0","l0 "+(-e/2-h),"l"+-g*a+" 0","l0 "+e,"l"+g*a+" 0","l0 "+(-e/2-h),"l"+g*(f-1)+" 0","l0 "+(-b+h),"l1 0","z"].join("")},preventOverlapping:function(a){var b,c,d,e;return d=18,b={},a.forEach(function(a){var c;return b[c=a.x]||(b[c]={left:[],right:[]}),b[a.x][a.side].push(a)}),c=function(a){var c,e,f,g,h,i,j,k,l;f=[];for(j in b)if(i=b[j],0!==i[a].length){for(g={};i[a].length>0;){h=i[a].pop(),c=!1;for(k in g)e=g[k],+k-d<=(l=h.y)&&+k+d>=l&&(e.push(h),c=!0);c||(g[h.y]=[h])}f.push(g)}return f},e=function(a){var b,c,d,e,f,g,h;f=20;for(b in a){g=a[b];for(h in g)d=g[h],c=d.length,1!==c?(d=d.sort(function(a,b){return a.y-b.y}),e=c%2===0?-(f/2)*(c/2):-(c-1)/2*f,d.forEach(function(a,b){return a.labelOffset=e+f*b})):d[0].labelOffset=0}},e(c("left")),e(c("right")),a},getTooltipHandlers:function(a){return"scrubber"===a.tooltip.mode?{onChartHover:angular.bind(this,this.showScrubber)}:{onMouseOver:angular.bind(this,this.onMouseOver),onMouseOut:angular.bind(this,this.onMouseOut)}},styleTooltip:function(a){return a.attr({"font-family":"monospace","font-size":10,fill:"white","text-rendering":"geometric-precision"})},addTooltips:function(a,b,c){var d,e,f,g,h,i,j,k;return h=b.width,e=b.height,h=h-b.left-b.right,e=e-b.top-b.bottom,g=24,d=18,f=5,i=a.append("g").attr({id:"xTooltip","class":"xTooltip",opacity:0}),i.append("path").attr("transform","translate(0,"+(e+1)+")"),this.styleTooltip(i.append("text").style("text-anchor","middle").attr({width:g,height:d,transform:"translate(0,"+(e+19)+")"})),k=a.append("g").attr({id:"yTooltip","class":"yTooltip",opacity:0}),k.append("path"),this.styleTooltip(k.append("text").attr({width:d,height:g})),null!=c.y2?(j=a.append("g").attr({id:"y2Tooltip","class":"y2Tooltip",opacity:0,transform:"translate("+h+",0)"}),j.append("path"),this.styleTooltip(j.append("text").attr({width:d,height:g}))):void 0},onMouseOver:function(a,b,c){return this.updateXTooltip(a,b,c.x),"y2"===b.series.axis?this.updateY2Tooltip(a,b,c.y2):this.updateYTooltip(a,b,c.y)},onMouseOut:function(a){return this.hideTooltips(a)},updateXTooltip:function(a,b,c){var d,e,f,g,h,i,j,k;return i=b.x,e=b.datum,g=b.series,j=a.select("#xTooltip"),j.transition().attr({opacity:1,transform:"translate("+i+",0)"}),k=c.tooltipFormatter,h=k?k(e.x):e.x,f=j.select("text"),f.text(h),d=angular.isFunction(g.color)?g.color(e,g.values.indexOf(e)):g.color,j.select("path").style("fill",d).attr("d",this.getXTooltipPath(f[0][0]))},getXTooltipPath:function(a){var b,c,d;return d=Math.max(this.getTextBBox(a).width,15),b=18,c=5,"m-"+d/2+" "+c+" l0 "+b+" l"+d+" 0 l0 "+-b+"l"+(-d/2+c)+" 0 l"+-c+" -"+b/4+" l"+-c+" "+b/4+" l"+(-d/2+c)+" 0z"},updateYTooltip:function(a,b,c){var d,e,f,g,h,i,j,k,l;return j=b.y,e=b.datum,g=b.series,k=a.select("#yTooltip"),k.transition().attr({opacity:1,transform:"translate(0, "+j+")"}),l=c.tooltipFormatter,h=l?l(e.y):e.y,f=k.select("text"),f.text(h),i=this.getTextBBox(f[0][0]).width+5,f.attr({transform:"translate("+(-i-2)+",3)",width:i}),d=angular.isFunction(g.color)?g.color(e,g.values.indexOf(e)):g.color,k.select("path").style("fill",d).attr("d",this.getYTooltipPath(i))},updateY2Tooltip:function(a,b,c){var d,e,f,g,h,i,j,k,l;return j=b.y,e=b.datum,g=b.series,k=a.select("#y2Tooltip"),k.transition().attr("opacity",1),l=c.tooltipFormatter,h=l?l(e.y):e.y,f=k.select("text"),f.text(h),i=this.getTextBBox(f[0][0]).width+5,f.attr({transform:"translate(7, "+(parseFloat(j)+3)+")",w:i}),d=angular.isFunction(g.color)?g.color(e,g.values.indexOf(e)):g.color,k.select("path").style("fill",d).attr({d:this.getY2TooltipPath(i),transform:"translate(0, "+j+")"})},getYTooltipPath:function(a){var b,c;return b=18,c=5,"m0 0l"+-c+" "+-c+" l0 "+(-b/2+c)+" l"+-a+" 0 l0 "+b+" l"+a+" 0 l0 "+(-b/2+c)+"l"+-c+" "+c+"z"},getY2TooltipPath:function(a){var b,c;return b=18,c=5,"m0 0l"+c+" "+c+" l0 "+(b/2-c)+" l"+a+" 0 l0 "+-b+" l"+-a+" 0 l0 "+(b/2-c)+" l"+-c+" "+c+"z"},hideTooltips:function(a){return a.select("#xTooltip").transition().attr("opacity",0),a.select("#yTooltip").transition().attr("opacity",0),a.select("#y2Tooltip").transition().attr("opacity",0)}}}]),angular.module("kbWebApp",["ngAnimate","ngCookies","ngResource","ngRoute","ngSanitize","ngTouch","ngTable","ngMessages","ngMaterial","ui.bootstrap","angular-loading-bar","n3-line-chart"]).config(["$routeProvider",function(a){a.when("/About",{templateUrl:"views/about.html",controller:"AboutCtrl",controllerAs:"about"}).when("/Config",{templateUrl:"views/config.html",controller:"ConfigCtrl",controllerAs:"config"}).when("/InteractiveMode",{templateUrl:"views/run.html",controller:"RunCtrl",controllerAs:"run"}).when("/MonitoringMode",{templateUrl:"views/interval.html",controller:"IntervalCtrl",controllerAs:"interval"}).when("/Log",{templateUrl:"views/log.html",controller:"LogCtrl",controllerAs:"log"}).when("/Login",{templateUrl:"views/login.html",controller:"LoginCtrl",controllerAs:"login"}).when("/StorageConfig",{templateUrl:"views/config_storage.html",controller:"StorageConfigCtrl",controllerAs:"config_storage"}).when("/StorageMode",{templateUrl:"views/run_storage.html",controller:"RunStorageCtrl",controllerAs:"run_storage"}).otherwise({redirectTo:"/InteractiveMode"})}]).config(["cfpLoadingBarProvider",function(a){a.latencyThreshold=1}]),angular.module("kbWebApp").controller("AboutCtrl",["$scope","$http","$location","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f){this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],$(window).on("hashchange",f.change()),d.getMethod("/kloudbuster/version").then(function(b){a.version=b.data},function(a){console.log("get version error:"),console.log(a)})}]).service("locationChange",function(){function a(a){$("#"+a).addClass("active")}function b(){$("#scaletestnav").removeClass("active"),$("#interactivenav").removeClass("active"),$("#monitoringnav").removeClass("active"),$("#confignav").removeClass("active"),$("#lognav").removeClass("active"),$("#loginnav").removeClass("active"),$("#aboutnav").removeClass("active"),$("#storageconfignav").removeClass("active"),$("#storagemodenav").removeClass("active")}var c;this.change=function(){switch(c=$(location).attr("hash"),b(),$("#scaletestname").text("Scale/Performance"),$("#loginname").text("Log Out"),c){case"#/InteractiveMode":a("scaletestnav"),a("interactivenav"),$("#scaletestname").text("Interactive Mode");break;case"#/MonitoringMode":a("scaletestnav"),a("monitoringnav"),$("#scaletestname").text("Monitoring Mode");break;case"#/Config":a("confignav");break;case"#/Log":a("lognav");break;case"#/Login":a("loginnav"),$("#loginname").text("Log In");break;case"#/About":a("aboutnav");break;case"#/StorageConfig":a("storageconfignav");break;case"#/StorageMode":a("storagemodenav")}}}).service("kbHttp",["$http","$q",function(a,b){var c=$(location).attr("protocol")+"//"+$(location).attr("host")+"/api";this.getMethod=function(d){var e=b.defer();return a.get(c+d).then(function(a){e.resolve(a)},function(a){e.reject(a)}),e.promise},this.getMethod2=function(d){var e=b.defer();return a.get(c+d,{ignoreLoadingBar:!0}).then(function(a){e.resolve(a)},function(a){e.reject(a)}),e.promise},this.putMethod=function(d,e){var f=b.defer();return a.defaults.headers.put["Content-Type"]="application/x-www-form-urlencoded;charset=utf-8",a.put(c+d,"arg="+encodeURIComponent(angular.toJson(e))).then(function(a){f.resolve(a)},function(a){f.reject(a)}),f.promise},this.postMethod=function(d,e){var f=b.defer();return e?(a.defaults.headers.post["Content-Type"]="application/x-www-form-urlencoded;charset=utf-8",a.post(c+d,"arg="+encodeURIComponent(angular.toJson(e))).then(function(a){f.resolve(a)},function(a){f.reject(a)}),f.promise):(a.post(c+d).then(function(a){f.resolve(a)},function(a){f.reject(a)}),f.promise)},this.delMethod=function(d){var e=b.defer();return a["delete"](c+d).then(function(a){e.resolve(a)},function(a){e.reject(a)}),e.promise}}]).service("kbCookie",["$location",function(a){this.init=function(){b="",d="",e="",f="",h="",i=0,g="",h="",i=0,j=0,c=""};var b="";this.getSessionID=function(){return b},this.setSessionID=function(a){return b=a};var c="";this.getMode=function(){return c},this.setMode=function(a){return c=a},this.checkMode=function(b){"login"==b?($(".forHttp").hide(),$(".forStorage").show()):"storage"==c?($(".forHttp").hide(),$(".forStorage").show(),c!=b&&a.path("/StorageMode")):"http"==c?($(".forStorage").hide(),$(".forHttp").show(),c!=b&&a.path("/InteractiveMode")):a.path("/Login")};var d="";this.getStatus=function(){return d},this.setStatus=function(a){return d=a};var e="";this.getConfig=function(){return e},this.setConfig=function(a){return e=a};var f="";this.getCredentials=function(){return f},this.setCredentials=function(a){return f=a};var g="";this.getIsOneCloud=function(){return g},this.setIsOneCloud=function(a){return g=a};var h="";this.getTopology=function(){return h},this.setTopology=function(a){return h=a};var i=0;this.getLogOffset=function(){return i},this.setLogOffset=function(a){return i=a};var j=0;this.getLogNum=function(){return j},this.setLogNum=function(a){return j=a}}]).service("showAlert",["$mdDialog",function(a){this.showAlert=function(b,c){var d=a.alert({title:"Attention",content:b,ok:"Close"});a.show(d)["finally"](function(){d=void 0})}}]),angular.module("kbWebApp").controller("ConfigCtrl",["$scope","$http","$location","showAlert","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f,g){function h(){a.selectedA=[],a.selectedB=[],a.selectedC=[],l=[],a.listA=[],a.listB=[],a.listC=[],a.toggle=!1}function i(a,b,c){for(var d=0,e=a.length;e>d;d++)if(a[d][c]===b)return d;return-1}function j(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1}function k(){a.selectedA=[],a.selectedB=[],a.selectedC=[],a.toggle=!1}this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===f.getSessionID()?c.path("/Login"):f.checkMode("http"),$(window).on("hashchange",g.change()),a.sessionID=f.getSessionID(),a.status=f.getStatus(),a.dashstatus1="active",a.dashstatus1vis=!0,a.dashstatus2="",a.dashstatus2vis=!1,a.dashstatus3="",a.dashstatus3vis=!1,a.setDashStatus=function(b){1===b?(a.dashstatus2="",a.dashstatus2vis=!1,a.dashstatus3="",a.dashstatus3vis=!1,a.dashstatus1="active",a.dashstatus1vis=!0):2===b?(a.dashstatus1="",a.dashstatus1vis=!1,a.dashstatus3="",a.dashstatus3vis=!1,a.dashstatus2="active",a.dashstatus2vis=!0):3===b&&(a.dashstatus1="",a.dashstatus1vis=!1,a.dashstatus2="",a.dashstatus2vis=!1,a.dashstatus3="active",a.dashstatus3vis=!0)};var l;a.setUserData=function(b){var c,d=1;for(c in b)l.push({id:d++,firstName:b[c]});a.listA=l.slice(0,l.length),a.items=l},h(),a.aToB=function(){for(var b in a.selectedA){var c=i(a.items,a.selectedA[b],"id");a.listB.push(a.items[c]);var d=i(a.listA,a.selectedA[b],"id");a.listA.splice(d,1)}k()},a.aToC=function(){for(var b in a.selectedA){var c=i(a.items,a.selectedA[b],"id");a.listC.push(a.items[c]);var d=i(a.listA,a.selectedA[b],"id");a.listA.splice(d,1)}k()},a.bToA=function(){for(var b in a.selectedB){var c=i(a.items,a.selectedB[b],"id");a.listA.push(a.items[c]);var d=i(a.listB,a.selectedB[b],"id");a.listB.splice(d,1)}k()},a.cToA=function(){for(var b in a.selectedC){var c=i(a.items,a.selectedC[b],"id");a.listA.push(a.items[c]);var d=i(a.listC,a.selectedC[b],"id");a.listC.splice(d,1)}k()},a.toggleA=function(){if(a.selectedA.length>0)k();else for(var b in a.listA)a.selectedB=[],a.selectedC=[],a.selectedA.push(a.listA[b].id)},a.toggleB=function(){if(a.selectedB.length>0)k();else for(var b in a.listB)a.selectedA=[],a.selectedC=[],a.selectedB.push(a.listB[b].id)},a.toggleC=function(){if(a.selectedC.length>0)k();else for(var b in a.listC)a.selectedA=[],a.selectedB=[],a.selectedC.push(a.listC[b].id)},a.selectA=function(b){var c=j(a.selectedA,b);-1===c?a.selectedA.push(b):a.selectedA.splice(c,1)},a.selectB=function(b){var c=j(a.selectedB,b);-1===c?a.selectedB.push(b):a.selectedB.splice(c,1)},a.selectC=function(b){var c=j(a.selectedC,b);-1===c?a.selectedC.push(b):a.selectedC.splice(c,1)},a.checkStatus=function(){a.sessionID?e.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,f.setStatus(a.status),a.configStatus()},function(a){console.log("status error")}):(a.status="NO SESSION ID",f.setStatus(""))},a.checkStatus();var m=!1;a.disableConfig=function(a){$("#"+a).find("input,button").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input,button").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?m===!0&&(m=!1,a.enableConfig("stagingConfig2"),a.enableConfig("getButton"),$("md-radio-button").removeAttr("disabled")):m===!1&&(m=!0,a.disableConfig("stagingConfig2"),a.disableConfig("getButton"),$("md-radio-button").attr("disabled","disabled")),f.getIsOneCloud()===!1&&a.disableConfig("topology")},a.getTopology=function(){e.getMethod("/config/hypervisor_list/"+a.sessionID).then(function(b){a.setUserData(b.data.server)},function(a){console.log("get hypervisor list error:"),console.log(a)})},a.getDefaultConfig=function(){e.getMethod("/config/default_config").then(function(b){f.setConfig(b.data),a.config=b.data,0==a.config.server.flavor.disk?a.choose_disk_size1=0:a.choose_disk_size1=1,0==a.config.client.flavor.disk?a.choose_disk_size2=0:a.choose_disk_size2=1,console.log("get & save default config")},function(a){d.showAlert("Cannot get the Default Configuration!")}),a.getTopology(),f.setTopology(""),a.availability_zone=1,l=[],h()},a.getRunConfig=function(){a.availability_zone=1,e.getMethod("/config/running_config/"+a.sessionID).then(function(b){f.setConfig(b.data),a.config=b.data,0==a.config.server.flavor.disk?a.choose_disk_size1=0:a.choose_disk_size1=1,0==a.config.client.flavor.disk?a.choose_disk_size2=0:a.choose_disk_size2=1,(null!=a.config.server.availability_zone&&""!=a.config.server.availability_zone||null!=a.config.client.availability_zone&&""!=a.client.server.availability_zone)&&(a.availability_zone=2),console.log("get & save running config")},function(a){console.log("get running config error:"),console.log(a)}),e.getMethod("/config/az_list/"+a.sessionID).then(function(b){f.getIsOneCloud()===!1?(a.serversides=b.data.server,a.clientsides=b.data.client):(a.serversides=b.data.server,a.clientsides=b.data.server)},function(a){console.log("get AZ list error:"),console.log(a)}),h(),a.getTopology(),e.getMethod("/config/topology_config/"+a.sessionID).then(function(b){if("null"!=b.data&&(0!=b.data.servers_rack.length||0!=b.data.clients_rack.length)){a.availability_zone=3,a.topology={servers_rack:b.data.servers_rack,clients_rack:b.data.clients_rack},f.setTopology(a.topology),console.log(b.data);for(var c in a.topology.servers_rack){var d=i(a.items,a.topology.servers_rack[c],"firstName");a.listC.push(a.items[d]);var e=i(a.listA,a.topology.servers_rack[c],"firstName");a.listA.splice(e,1)}for(var c in a.topology.clients_rack){var d=i(a.items,a.topology.clients_rack[c],"firstName");a.listB.push(a.items[d]);var e=i(a.listA,a.topology.clients_rack[c],"firstName");a.listA.splice(e,1)}}console.log("get & save topology config")},function(a){console.log("get topology config error:"),console.log(a)})},a.getRunConfig(),a.changeConfig=function(){if("READY"===a.status||""===a.status)if(1==a.server.$valid&&1==a.general.$valid&&1==a.client.$valid){if(f.setConfig(a.config),3==a.availability_zone){a.topology={servers_rack:[],clients_rack:[]};for(var b in a.listC)a.topology.servers_rack.push(a.listC[b].firstName);for(var b in a.listB)a.topology.clients_rack.push(a.listB[b].firstName);f.setTopology(a.topology)}else f.setTopology({servers_rack:"",clients_rack:""});a.chaCon={kb_cfg:{},topo_cfg:{}},a.chaCon.kb_cfg=f.getConfig(),a.chaCon.topo_cfg=f.getTopology(),console.log(a.chaCon),e.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config")},function(a){d.showAlert("Failed to update configuration!")})}else d.showAlert("Please check your inputs!");else d.showAlert("Configuration cannot be changed now!")},a.changeTopology=function(){1==a.availability_zone?(a.config.server.availability_zone="",a.config.client.availability_zone="",a.topology={},f.setTopology({servers_rack:"",clients_rack:""}),h(),a.getTopology()):2==a.availability_zone?(a.topology={},f.setTopology({servers_rack:"",clients_rack:""}),h(),a.getTopology()):3==a.availability_zone&&(a.config.server.availability_zone="",a.config.client.availability_zone="")}}]),angular.module("kbWebApp").controller("RunCtrl",["$scope","$timeout","$location","$http","$q","showAlert","ngTableParams","kbCookie","kbHttp","interactiveMode","color","locationChange",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a,b){var c=document.createElement("a"),d=new Blob([b]),e=document.createEvent("HTMLEvents");e.initEvent("click",!1,!1),c.download=a,c.href=URL.createObjectURL(d),c.dispatchEvent(e)}function n(a){return 10>a?"0"+a:99>a?""+a:-1}this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===h.getSessionID()?c.path("/Login"):h.checkMode("http"),$(window).on("hashchange",l.change()),$("[data-toggle='.container']").click(function(){var a=$(this).data("toggle");$(a).toggleClass("open-sidebar"),$("#littleglyph").toggleClass("glyphicon-triangle-right"),$("#littleglyph").toggleClass("glyphicon-triangle-left")}),$(".swipe-area").swipe({swipeStatus:function(a,b,c,d,e,f){return"move"==b&&"right"==c?($(".container").addClass("open-sidebar"),!1):"move"==b&&"left"==c?($(".container").removeClass("open-sidebar"),!1):void 0}}),a.oneAtATime=!0,a.status1={isFirstOpen:!0,isFirstDisabled:!1},a.status2={isFirstOpen:!0,isFirstDisabled:!1},a.status3={isFirstOpen:!0,isFirstDisabled:!1},a.status1.open=!1,a.status2.open=!0,a.status3.open=!1,a.alerts=[],a.closeAlert=function(b){a.alerts.splice(b,1)},a.sessionID=h.getSessionID(),a.status=h.getStatus(),a.config=h.getConfig(),a.getRunConfig=function(){i.getMethod("/config/running_config/"+a.sessionID).then(function(b){a.config=b.data,h.setConfig(b.data),console.log("get & save config")},function(a){console.log("get running config error:"),console.log(a)})},a.sessionID&&!a.config&&a.getRunConfig(),a.setConfig=function(b){var c=e.defer();return"READY"===a.status?(h.setConfig(a.config),a.chaCon={kb_cfg:{}},a.chaCon.kb_cfg=h.getConfig(),i.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),c.resolve(1)},function(a){c.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})):"STAGED"===a.status?(a.config.client.http_tool_configs.report_interval=0,h.setConfig(a.config),a.chaCon={kb_cfg:{client:{http_tool_configs:{duration:a.config.client.http_tool_configs.duration,rate_limit:a.config.client.http_tool_configs.rate_limit,connections:a.config.client.http_tool_configs.connections,report_interval:0}}}},i.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),c.resolve(1)},function(a){c.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})):(console.log("config not allow to change now!"),c.reject(0)),c.promise};var o=!1,p=!1;a.disableConfig=function(a){$("#"+a).find("input").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?(o===!0&&(o=!1,a.enableConfig("stagingConfig"),a.enableConfig("stagingConfig1"),$("#client_progression_enabled").removeAttr("disabled")),p===!0&&(p=!1,a.enableConfig("runningConfig"))):"STAGED"===a.status?(o===!1&&(o=!0,a.disableConfig("stagingConfig"),a.disableConfig("stagingConfig1"),$("#client_progression_enabled").attr("disabled","disabled")),p===!0&&(p=!1,a.enableConfig("runningConfig"))):(o===!1&&(o=!0,a.disableConfig("stagingConfig"),a.disableConfig("stagingConfig1"),$("md-checkbox").attr("disabled","disabled")),p===!1&&(p=!0,a.disableConfig("runningConfig")))};var q=0;a.pointNum=function(){var a=".";q=(q+1)%6;for(var b=0;q>b;b++)a+=" .";return a},a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=0,a.server_vm_count=0,a.statusButton="btn-default",a.checkStatus=function(){a.sessionID?i.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,h.setStatus(a.status),a.configStatus(),"READY"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!1,a.client_vm_count=0,a.server_vm_count=0,$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"STAGING"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=b.data.client_vm_count,a.server_vm_count=b.data.server_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Creating VM(s)"+a.pointNum()):"STAGED"===a.status?(a.runButton="Run Test",a.runStatus=!1,a.setStatus=!1,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,a.getReport(),$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"RUNNING"===a.status?(a.runButton="Stop Test",a.runStatus=!1,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,a.config.client.progression.enabled===!0&&a.getReport(),$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Running"+a.pointNum()):"ERROR"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").addClass("pause"),a.statusButton="btn-danger",a.info=""):"CLEANING"!==a.status&&"STOPPING"!==a.status||(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="Please Wait"+a.pointNum())},function(a){console.log("get status error:"),console.log(a)}):(a.status="NO SESSION ID",h.setStatus(""))},a.checkStatus(),a.setStage=function(){i.postMethod("/kloudbuster/stage/"+a.sessionID).then(function(a){},function(a){console.log("set stage error:"),console.log(a),f.showAlert("Unable to stage resources!")})},a.CleanUp=function(){a.initChart(),!a.sessionID||"ERROR"!==a.status&&"STAGED"!==a.status?console.log("Cannot cleanup!"):i.postMethod("/kloudbuster/cleanup/"+a.sessionID).then(function(b){a.checkStatus()},function(a){console.log("clean error:"),console.log(a)})},a.stage=function(){if("ERROR"===a.status||"STAGED"===a.status)a.CleanUp();else if("READY"===a.status){var b=a.setConfig(1);b.then(function(){a.setStage()})}},a.runKb=function(){i.postMethod("/kloudbuster/run_test/"+a.sessionID).then(function(a){},function(a){console.log("running error:"),console.log(a),f.showAlert("Unable to start test!")})},a.stopKb=function(){i.postMethod("/kloudbuster/stop_test/"+a.sessionID).then(function(a){},function(a){console.log("stop error:"),console.log(a),f.showAlert("Unable to stop test!")})},a.scaleTest=function(){if("RUNNING"===a.status)a.stopKb();else if("STAGED"===a.status){var b=a.setConfig(1);b.then(function(){a.initChart(),a.runKb()})}},a.tabledata=[],a.cols=[{field:"seq",title:"SEQ",sortable:"seq",show:!0},{field:"connection",title:"Connection",sortable:"connection",show:!0},{field:"server_vms",title:"Server VMs",sortable:"server_vms",show:!0},{field:"requests",title:"Requests",sortable:"requests",show:!0},{field:"sock_err",title:"Error",sortable:"sock_err",show:!0},{field:"rps",title:"RPS measured",sortable:"rps",show:!0},{field:"rate_limit",title:"RPS requested",sortable:"rate_limit",show:!0},{field:"throughput",title:"Throughput",sortable:"throughput",show:!0},{field:"action",title:"Action",sortable:"action",show:!0}],a.tableParams=new g({sorting:{name:"asc"},count:10},{counts:[],data:a.tabledata}),a.options={axes:{x:{key:"x",type:"linear",ticksFormatter:function(a){return 0===a?"50%":10===a?"75%":20===a?"90%":30===a?"99%":40===a?"99.9%":50===a?"99.99%":60===a?"99.999%":void 0}},y:{type:"log",ticksFormat:"d",innerTicks:!0,grid:!0}},tooltip:{mode:"scrubber",formatter:function(a,b,c){return c.label+":"+b}},tension:.8,lineMode:"cardinal",series:[{}]},a.initChart=function(){a.data=[{x:0},{x:10},{x:20},{x:30},{x:40},{x:50},{x:60}],a.options.series=[{}],a.isDely=!1,a.tabledata.length=0,a.tableParams.reload(),a.isDely=!1,r=0,k.reset()};var r=0;a.initChart(),a.refreshChart=function(){a.data=[{x:0},{x:10},{x:20},{x:30},{x:40},{x:50},{x:60}],a.options.series=[{}],a.isDely=!1,a.tabledata.length=0,a.tableParams.reload(),k.reset()},a.getReport=function(){i.getMethod2("/kloudbuster/report/"+a.sessionID+"?final=true").then(function(b){if(console.log("get report totally:"+b.data.kb_result.length),b.data.kb_result.length>0&&rc;c++){a.result=b.data.kb_result[c];var d=k.getColor();a.config.client.progression.enabled?(console.log("show report"+a.name),a.pushChartData("Connection-"+a.result.total_connections,a.result,d),a.pushTableData("Connection-"+a.result.total_connections,a.result,d)):(console.log("show report"+a.name),a.pushChartData("Final",a.result,d),a.pushTableData("Final",a.result,d))}}},function(a){console.log("get report error:"),console.log(a)})},a.pushChartData=function(b,c,d){a.isDely===!1&&(a.options.series.shift(),a.isDely=!0),a.options.series.push({y:b,label:b,color:d,dotSize:"3",thickness:"2px"});for(var e=0;7>e;e++)a.data[e][b]=c.latency_stats[e][1]/1e3},a.pushTableData=function(b,c,d){var e=8*c.http_throughput_kbytes/1e6;a.tabledata.push({seq:b,connection:c.total_connections,server_vms:c.total_server_vms,requests:c.http_total_req,sock_err:c.http_sock_err+c.http_sock_timeout,rps:c.http_rps,rate_limit:c.http_rate_limit,throughput:e.toFixed(2),description:c.description,color:d}),$("").appendTo("head"),a.tableParams.reload()},a.saveResult=function(){var a=new Date,b=n(a.getMonth()+1),c=n(a.getDate()),d=n(a.getHours()),e=n(a.getMinutes()),g=""+b+c+d+e+".html",i=j.getResult();if(""!=i){var k=' KloudBuster Report

KloudBuster HTTP Test Report

Latency(ms)
{{row.connection}} {{row.server_vms}} {{row.requests}} {{row.sock_err}} {{row.rps}} {{row.rate_limit}} {{row.throughput}} Gbps

KloudBuster HTTP Test Configuration


{{from_outside["time"]}} - KloudBuster {{from_outside["version"]}}
'; -m(g,k)}else f.showAlert("No result to save!")},setInterval(function(){a.checkStatus()},1e3),$(function(){$('[data-toggle="tooltip"]').tooltip()})}]).service("interactiveMode",function(){var a=[];this.getResult=function(){return a},this.setResult=function(b){return a=b}}).service("color",function(){var a=-1,b=["#F44336","#673AB7","#03A9F4","#4CAF50","#FFEB3B","#BF360C","#795548","#E91E63","#3F51B5","#00BCD4","#CDDC39","#FF9800","#9E9E9E","#9C27B0","#009688"],c=b.length;this.getColor=function(){return a=(a+1)%c,b[a]},this.reset=function(){a=-1}}).directive("convertToNumber",function(){return{require:"ngModel",link:function(a,b,c,d){d.$parsers.push(function(a){return parseFloat(a)}),d.$formatters.push(function(a){return""+a})}}}),angular.module("kbWebApp").controller("LogCtrl",["$scope","$compile","$http","$location","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f,g){this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===f.getSessionID()&&d.path("/Login"),$(window).on("hashchange",g.change()),String.prototype.replaceAll=function(a,b){return this.replace(new RegExp(a,"gm"),b)},a.sessionID=f.getSessionID(),a.status=f.getStatus(),a.logs="",a.logNum=f.getLogNum(),a.logOffset=0,a.delLog=function(){f.setLogOffset(a.logOffset),$("#cc").empty(),a.getLog()},a.getLog=function(){a.sessionID?(f.setLogNum(a.logNum),e.getMethod("/kloudbuster/log/"+a.sessionID+"?offset="+f.getLogOffset()).then(function(b){b.data=b.data.substring(1,b.data.length-1),a.logOffset=f.getLogOffset()+b.data.replace(/\\n/g,"a").length,a.logs=b.data.split("\\n"),$("#cc").empty();var c;c=0==f.getLogNum()?0:a.logs.length-f.getLogNum();for(var d in a.logs)c>0?c--:(a.logs[d]=a.logs[d].replace(/ /g," "),$("#cc").append(a.logs[d]+"
"))},function(a){console.log("get Log error:"),console.log(a)})):console.log("not connected "+a.status+","+a.sessionID)},a.getLog()}]),angular.module("kbWebApp").controller("IntervalCtrl",["$scope","$http","kbHttp","$q","$location","showAlert","kbCookie","monitorMode","locationChange",function(a,b,c,d,e,f,g,h,i){function j(a,b){var c=document.createElement("a"),d=new Blob([b]),e=document.createEvent("HTMLEvents");e.initEvent("click",!1,!1),c.download=a,c.href=URL.createObjectURL(d),c.dispatchEvent(e)}function k(a){return 10>a?"0"+a:99>a?""+a:-1}this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===g.getSessionID()?e.path("/Login"):g.checkMode("http"),$(window).on("hashchange",i.change()),$("[data-toggle='.container']").click(function(){var a=$(this).data("toggle");$(a).toggleClass("open-sidebar"),$("#littleglyph1").toggleClass("glyphicon-triangle-right"),$("#littleglyph1").toggleClass("glyphicon-triangle-left")}),$(".swipe-area").swipe({swipeStatus:function(a,b,c,d,e,f){return"move"==b&&"right"==c?($(".container").addClass("open-sidebar"),!1):"move"==b&&"left"==c?($(".container").removeClass("open-sidebar"),!1):void 0}}),a.oneAtATime=!0,a.status1={isFirstOpen:!0,isFirstDisabled:!1},a.status2={isFirstOpen:!0,isFirstDisabled:!1},a.status1.open=!1,a.status2.open=!0,a.alerts=[],a.closeAlert=function(b){a.alerts.splice(b,1)},a.sessionID=g.getSessionID(),a.status=g.getStatus(),a.config=g.getConfig(),a.getRunConfig=function(){c.getMethod("/config/running_config/"+a.sessionID).then(function(b){a.config=b.data,g.setConfig(b.data),console.log("get & save config")},function(a){console.log("get running config error:"),console.log(a)})},a.sessionID&&!a.config&&a.getRunConfig(),a.setConfig=function(b){var e=d.defer();if("READY"===a.status)a.config.client.progression.enabled=!1,g.setConfig(a.config),a.chaCon={kb_cfg:{}},a.chaCon.kb_cfg=g.getConfig(),c.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),e.resolve(1),1!=b&&f.showAlert("Configuration updated successfully!")},function(a){e.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))});else if("STAGED"===a.status){if(a.config.client.progression.enabled===!0)return alert("Can't Run Monitor Test Now! You have chosen Progression Test. Click Unstage Button First!"),e.reject(0),e.promise;if(0===a.config.client.progression.report_interval)return alert("Can't Run Monitor Test Now! Report interval must be a number no less than 1."),e.reject(0),e.promise;g.setConfig(a.config),a.chaCon={kb_cfg:{client:{http_tool_configs:{duration:a.config.client.http_tool_configs.duration,rate_limit:a.config.client.http_tool_configs.rate_limit,connections:a.config.client.http_tool_configs.connections,report_interval:a.config.client.http_tool_configs.report_interval}}}},console.log(a.chaCon),c.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),e.resolve(1)},function(a){e.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})}else console.log("config not allow to change now!"),e.reject(0);return e.promise};var l=!1,m=!1;a.disableConfig=function(a){$("#"+a).find("input").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?(l===!0&&(l=!1,a.enableConfig("stagingConfig")),m===!0&&(m=!1,a.enableConfig("runningConfig"))):"STAGED"===a.status?(l===!1&&(l=!0,a.disableConfig("stagingConfig")),m===!0&&(m=!1,a.enableConfig("runningConfig"))):(l===!1&&(l=!0,a.disableConfig("stagingConfig")),m===!1&&(m=!0,a.disableConfig("runningConfig")))};var n=0;a.pointNum=function(){var a=".";n=(n+1)%6;for(var b=0;n>b;b++)a+=" .";return a},a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=0,a.server_vm_count=0,a.statusButton="btn-default",a.checkStatus=function(){a.sessionID?c.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,a.configStatus(),g.setStatus(a.status),"READY"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!1,a.client_vm_count=0,a.server_vm_count=0,$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"STAGING"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=b.data.client_vm_count,a.server_vm_count=b.data.server_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Creating VM(s)"+a.pointNum()):"STAGED"===a.status?(a.runButton="Run Test",a.runStatus=!1,a.setStatus=!1,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"RUNNING"===a.status?(a.runButton="Stop Test",a.runStatus=!1,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.getSeqReport(),a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Running"+a.pointNum()):"ERROR"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").addClass("pause"),a.statusButton="btn-danger",a.info=""):"CLEANING"!==a.status&&"STOPPING"!==a.status||(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="Please Wait"+a.pointNum())},function(a){console.log("get status error:"),console.log(a)}):a.status="NO SESSION ID"},a.checkStatus(),a.setStage=function(){c.postMethod("/kloudbuster/stage/"+a.sessionID).then(function(a){},function(a){console.log("set stage error:"),console.log(a),f.showAlert("Unable to stage resources!")})},a.CleanUp=function(){a.initChart(),!a.sessionID||"ERROR"!==a.status&&"STAGED"!==a.status?console.log("Cannot cleanup!"):c.postMethod("/kloudbuster/cleanup/"+a.sessionID).then(function(b){a.checkStatus()},function(a){console.log("clean error:"),console.log(a)})},a.stage=function(){if("ERROR"===a.status||"STAGED"===a.status)a.CleanUp();else if("READY"===a.status){var b=a.setConfig(1);b.then(function(){a.setStage()})}},a.runKb=function(){c.postMethod("/kloudbuster/run_test/"+a.sessionID).then(function(a){},function(a){console.log("running error:"),console.log(a),f.showAlert("Unable to start test!")})},a.stopKb=function(){c.postMethod("/kloudbuster/stop_test/"+a.sessionID).then(function(a){},function(a){console.log("stop error:"),console.log(a),f.showAlert("Unable to stop test!")})},a.scaleTest=function(){if("RUNNING"===a.status)a.stopKb();else{var b=a.setConfig(1);b.then(function(){"STAGED"===a.status&&(a.config.client.progression.enabled===!0?f.showAlert("Can't Run Monitor Test Now! You have chosen Progression Test. Clean Up First!"):0===a.config.client.http_tool_configs.report_interval?f.showAlert("Can't Run Monitor Test Now! Report interval must be a number no less than 1."):(a.initChart(),a.runKb()))})}},a.data=[{x:new Date}],a.isDely=!1;var o=0;a.initChart=function(){a.data=[{x:new Date}],a.isDely=!1,o=0,h.setResult("")},a.options={axes:{x:{type:"date"},y:{type:"log",ticksFormat:"d",innerTicks:!0,grid:!0}},series:[{y:"val_6",label:"99.999%",type:"area",color:"#2e4174",dotSize:"0",thickness:"2px",visible:!1},{y:"val_5",label:"99.99%",type:"area",color:"#084594",dotSize:"0",thickness:"2px",visible:!1},{y:"val_4",label:"99.9%",type:"area",color:"#0074D9",dotSize:"0",thickness:"2px"},{y:"val_3",label:"99%",type:"area",color:"#79afe1",dotSize:"0",thickness:"2px"},{y:"val_2",label:"90%",type:"area",color:"#9ecae1",dotSize:"0",thickness:"2px"},{y:"val_1",label:"75%",type:"area",color:"#c6dbef",dotSize:"0",thickness:"2px",visible:!1},{y:"val_0",label:"50%",type:"area",color:"#eff3ff",dotSize:"0",thickness:"2px"}],tooltip:{mode:"scrubber",formatter:function(a,b,c){return c.label+":"+b}},tension:.9,lineMode:"cardinal"},a.data.forEach(function(a){a.x=new Date(a.x)}),a.getSeqReport=function(){c.getMethod2("/kloudbuster/report/"+a.sessionID).then(function(b){a.result=b.data.report,a.seq=b.data.seq,console.log("get seq report:"+a.seq),a.seq&&a.seq>o&&(o=a.seq,a.data.length>40&&a.data.shift(),a.pushChartData("SEQ_"+a.seq,a.result))},function(a){console.log("get seq report error:"),console.log(a)})},a.pushChartData=function(b,c){a.isDely===!1&&(a.data.shift(),a.isDely=!0),a.data.push({x:new Date,val_0:c.latency_stats[0][1]/1e3,val_1:c.latency_stats[1][1]/1e3,val_2:c.latency_stats[2][1]/1e3,val_3:c.latency_stats[3][1]/1e3,val_4:c.latency_stats[4][1]/1e3,val_5:c.latency_stats[5][1]/1e3,val_6:c.latency_stats[6][1]/1e3}),h.setResult(a.data)},h.getResult()&&(a.data=h.getResult()),a.saveResult=function(){var a=new Date,b=k(a.getMonth()+1),c=k(a.getDate()),d=k(a.getHours()),e=k(a.getMinutes()),g=""+b+c+d+e+".html";if(console.log(g),console.log(h.getResult()),""!=h.getResult()){var i=' KloudBuster Report
';j(g,i)}else f.showAlert("No result to save!")},setInterval(function(){a.checkStatus()},900)}]).service("monitorMode",function(){var a="";this.getResult=function(){return a},this.setResult=function(b){return a=b}}),angular.module("kbWebApp").controller("LoginCtrl",["$scope","$http","$location","showAlert","$q","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f,g,h){function i(a){var b=a.target.files,c=b[0],d=new FileReader;d.onload=function(){l=this.result},d.readAsText(c)}function j(a){var b=a.target.files,c=b[0],d=new FileReader;d.onload=function(){m=this.result},d.readAsText(c)}if(this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],g.checkMode("login"),$(window).on("hashchange",h.change()),function(a,b,c){var d=a.querySelectorAll("html")[0];d.className=d.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2")}(document,window,0),function(a,b,c){var d=a.querySelectorAll(".inputfile");Array.prototype.forEach.call(d,function(a){var b=a.nextElementSibling,c=b.innerHTML;a.addEventListener("change",function(a){var d="";d=a.target.value.split("\\").pop(),d?b.querySelector("span").innerHTML=d:b.innerHTML=c}),a.addEventListener("focus",function(){a.classList.add("has-focus")}),a.addEventListener("blur",function(){a.classList.remove("has-focus")})})}(document,window,0),a.deleteSession=function(){f.delMethod("/config/running_config/"+a.sessionID).then(function(a){console.log("del sessionID")},function(a){})},a.CleanUp=function(){var b=e.defer();return"READY"!=g.getStatus()&&"CLEANING"!=g.getStatus()?(f.postMethod("/kloudbuster/cleanup/"+a.sessionID).then(function(a){console.log("clean up successfully")},function(a){}),b.resolve(1)):b.resolve(1),b.promise},""!=g.getSessionID()){a.sessionID=g.getSessionID();var k=a.CleanUp();k.then(function(){a.deleteSession(),g.init()})}a.samecloud=!0,a.clouds=function(){a.samecloud===!0?($("#inputPassword2").attr("disabled",!0),$("#file2").attr("disabled",!0),$("#rcfile2").attr("disabled",!0)):($("#inputPassword2").attr("disabled",!1),$("#file2").attr("disabled",!1),$("#rcfile2").attr("disabled",!1))};var l;document.getElementById("file1").addEventListener("change",i,!1);var m;document.getElementById("file2").addEventListener("change",j,!1),$("#inputPassword1").keydown(function(b){var c=b.which;13==c&&a.setConfig()}),$("#inputPassword2").keydown(function(b){var c=b.which;13==c&&a.setConfig()}),a.setConfig=function(){"storage"==a.mode?(g.setIsOneCloud(!0),a.credentials={"tested-passwd":a.inputPassword1,"tested-rc":l},a.storage_mode=!0):(a.storage_mode=!1,a.samecloud===!0?(g.setIsOneCloud(!0),a.credentials={"tested-passwd":a.inputPassword1,"tested-rc":l}):(g.setIsOneCloud(!1),a.credentials={"tested-passwd":a.inputPassword1,"tested-rc":l,"testing-passwd":inputPassword2,"testing-rc":m})),a.runCon={credentials:{},kb_cfg:"",storage_mode:a.storage_mode},a.runCon.credentials=a.credentials,g.setCredentials(a.credentials),g.setMode(a.mode),f.postMethod("/config/running_config",a.runCon).then(function(b){g.setSessionID(b.data),a.sessionID=g.getSessionID(),console.log("set config & get sesID:"+a.sessionID),"storage"==a.mode?c.path("/StorageMode"):c.path("/InteractiveMode")},function(a){400==a.status?d.showAlert("Error while parsing configurations! Please check your inputs!"):-1==a.status&&d.showAlert("Error while connecting kloudbuster server!")})}}]),angular.module("kbWebApp").controller("StorageConfigCtrl",["$scope","$http","$location","showAlert","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f,g){this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===f.getSessionID()?c.path("/Login"):f.checkMode("storage"),$(window).on("hashchange",g.change()),a.sessionID=f.getSessionID(),a.status=f.getStatus(),a.dash1status1="active",a.dash1status1vis=!0,a.dash1status2="",a.dash1status2vis=!1,a.setDash1Status=function(b){1===b?(a.dash1status2="",a.dash1status2vis=!1,a.dash1status1="active",a.dash1status1vis=!0):2===b&&(a.dash1status1="",a.dash1status1vis=!1,a.dash1status2="active",a.dash1status2vis=!0)},a.parseInt=parseInt,a.checkStatus=function(){a.sessionID?e.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,f.setStatus(a.status),a.configStatus()},function(a){console.log("status error")}):(a.status="NO SESSION ID",f.setStatus(""))};var h=!1;a.disableConfig=function(a){$("#"+a).find("input,button,a,md-radio-button").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input,button,a,md-radio-button").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?h===!0&&(h=!1,a.enableConfig("stagingConfig3"),a.enableConfig("getButton")):h===!1&&(h=!0,a.disableConfig("stagingConfig3"),a.disableConfig("getButton"))},$("#dropdownrandrw").append('
  • '),a.storageMode={randread:{name:"Random Read",type:"panel-randread",para:["description","rate_iops","block_size","iodepth","runtime","extra_opts"]},randwrite:{name:"Random Write",type:"panel-randwrite",para:["description","rate_iops","block_size","iodepth","runtime","extra_opts"]},randrw:{name:"Random Read/Write",type:"panel-randrw",para:["description","rate_iops","block_size","iodepth","rwmixread","runtime","extra_opts"]},read:{name:"Seq Read",type:"panel-read",para:["description","rate","block_size","iodepth","runtime","extra_opts"]},write:{name:"Seq Write",type:"panel-write",para:["description","rate","block_size","iodepth","runtime","extra_opts"]},rw:{name:"Seq Read/Write",type:"panel-rw",para:["description","rate","block_size","iodepth","rwmixread","runtime","extra_opts"]}},a.options={description:{name:"Description","default":""},mode:{name:"Mode"},runtime:{name:"Run Time","default":30},block_size:{name:"Block Size (KB)","default":"4k"},iodepth:{name:"IO Depth","default":1},rate_iops:{name:"IOPs","default":100},rate:{name:"BW (MB/s)","default":"60M"},rwmixread:{name:"Read %","default":70},extra_opts:{name:"Extra Options","default":""}},a.switchIndex=function(b,c){var d=a.config.client.storage_tool_configs[b];a.config.client.storage_tool_configs.splice(b,1),1==c?a.config.client.storage_tool_configs.splice(b-1,0,d):-1==c&&a.config.client.storage_tool_configs.splice(b+1,0,d)},a.addMode=function(b){var c={};for(var d in a.storageMode[b].para){var e=a.storageMode[b].para[d];c[e]=a.options[e]["default"]}c.mode=b,a.config.client.storage_tool_configs.splice(0,0,c)},a.getDefaultConfig=function(){e.getMethod("/config/default_config").then(function(b){f.setConfig(b.data),a.config=b.data,0==a.config.client.flavor.disk?a.choose_disk_size=0:a.choose_disk_size=1,console.log("get & save default config")},function(a){d.showAlert("Cannot get the Default Configuration!")})},a.getRunConfig=function(){e.getMethod("/config/running_config/"+a.sessionID).then(function(b){f.setConfig(b.data),a.config=b.data,0==a.config.client.flavor.disk?a.choose_disk_size=0:a.choose_disk_size=1,a.checkStatus(),console.log("get & save running config")},function(a){console.log("get running config error:"),console.log(a)})},a.getRunConfig(),a.changeConfig=function(){"READY"===a.status||""===a.status?1==a.server.$valid&&1==a.general.$valid?(f.setConfig(a.config),a.chaCon={kb_cfg:{},topo_cfg:{}},a.chaCon.kb_cfg=f.getConfig(),f.setTopology({servers_rack:"",clients_rack:""}),a.chaCon.topo_cfg=f.getTopology(),a.config.server.availability_zone="",a.config.client.availability_zone="",console.log(a.chaCon),e.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config")},function(a){d.showAlert("Failed to update configuration!")})):d.showAlert("Please check your inputs!"):d.showAlert("Configuration cannot be changed now!")}}]),angular.module("kbWebApp").controller("RunStorageCtrl",["$scope","$timeout","$location","$http","$q","showAlert","ngTableParams","kbCookie","kbHttp","storageMode","color","locationChange",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a){var b=Number.POSITIVE_INFINITY;return a.forEach(function(a){a.forEach(function(a){"write_hist"in a&&(b=Math.min(b,a.write_hist[0][1])),"read_hist"in a&&(b=Math.min(b,a.read_hist[0][1]))})}),b}function n(a,b){var c=document.createElement("a"),d=new Blob([b]),e=document.createEvent("HTMLEvents");e.initEvent("click",!1,!1),c.download=a,c.href=URL.createObjectURL(d),c.dispatchEvent(e)}function o(a){return 10>a?"0"+a:99>a?""+a:-1}this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===h.getSessionID()?c.path("/Login"):h.checkMode("storage"),$(window).on("hashchange",l.change()),$("[data-toggle='.container']").click(function(){var a=$(this).data("toggle");$(a).toggleClass("open-sidebar"),$("#littleglyph").toggleClass("glyphicon-triangle-right"),$("#littleglyph").toggleClass("glyphicon-triangle-left")}),$(".swipe-area").swipe({swipeStatus:function(a,b,c,d,e,f){return"move"==b&&"right"==c?($(".container").addClass("open-sidebar"),!1):"move"==b&&"left"==c?($(".container").removeClass("open-sidebar"),!1):void 0}}),a.oneAtATime=!1,a.status1={isFirstOpen:!0,isFirstDisabled:!1},a.status2={isFirstOpen:!0,isFirstDisabled:!1},a.status1.open=!0,a.status2.open=!0,a.sessionID=h.getSessionID(),a.status=h.getStatus(),a.getRunConfig=function(){i.getMethod("/config/running_config/"+a.sessionID).then(function(b){a.config=b.data,h.setConfig(b.data),a.current_mode_name=a.config.client.storage_tool_configs[0].mode,a.current_mode_description=a.config.client.storage_tool_configs[0].description,a.getCurrentMode(a.current_mode_name,"read"),console.log("get & save config")},function(a){console.log("get running config error:"),console.log(a)})},a.sessionID&&!a.config&&a.getRunConfig(),a.setConfig=function(b){var c=e.defer();return"READY"===a.status?(h.setConfig(a.config),a.chaCon={kb_cfg:{}},a.chaCon.kb_cfg=h.getConfig(),i.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),c.resolve(1)},function(a){c.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})):"STAGED"===a.status?(a.config.client.http_tool_configs.report_interval=0,h.setConfig(a.config),a.chaCon={kb_cfg:{client:{http_tool_configs:{duration:a.config.client.http_tool_configs.duration,rate_limit:a.config.client.http_tool_configs.rate_limit,connections:a.config.client.http_tool_configs.connections,report_interval:0}}}},i.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),c.resolve(1)},function(a){c.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})):(console.log("config not allow to change now!"),c.reject(0)),c.promise};var p=!1,q=!1;a.disableConfig=function(a){$("#"+a).find("input").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?(p===!0&&(p=!1,a.enableConfig("stagingConfig"),a.enableConfig("stagingConfig1"),$("#client_progression_enabled").removeAttr("disabled"),$("#client_progression_vm_start").removeAttr("disabled")),q===!0&&(q=!1,a.enableConfig("runningConfig"))):"STAGED"===a.status?(p===!1&&(p=!0,a.disableConfig("stagingConfig"),a.disableConfig("stagingConfig1"),$("#client_progression_enabled").attr("disabled","disabled"),$("#client_progression_vm_start").attr("disabled","disabled")),q===!0&&(q=!1,a.enableConfig("runningConfig"))):(p===!1&&(p=!0,a.disableConfig("stagingConfig"),a.disableConfig("stagingConfig1"),$("md-checkbox").attr("disabled","disabled")),q===!1&&(q=!0,a.disableConfig("runningConfig")))};var r=0;a.pointNum=function(){var a=".";r=(r+1)%6;for(var b=0;r>b;b++)a+=" .";return a},a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=0,a.server_vm_count=0,a.statusButton="btn-default",a.checkStatus=function(){a.sessionID?i.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,h.setStatus(a.status),a.configStatus(),"READY"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!1,a.client_vm_count=0,$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"STAGING"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=b.data.client_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Creating VM(s)"+a.pointNum()):"STAGED"===a.status?(a.runButton="Run Test",a.runStatus=!1,a.setStatus=!1,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,a.getReport(),$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"RUNNING"===a.status?(a.runButton="Stop Test",a.runStatus=!1,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,a.config.client.progression.enabled===!0&&a.getReport(),$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Running"+a.pointNum()):"ERROR"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,$(".loading").addClass("pause"),a.statusButton="btn-danger",a.info=""):"CLEANING"!==a.status&&"STOPPING"!==a.status||(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="Please Wait"+a.pointNum())},function(a){console.log("get status error:"),console.log(a)}):(a.status="NO SESSION ID",h.setStatus(""))},a.checkStatus(),a.setStage=function(){i.postMethod("/kloudbuster/stage/"+a.sessionID).then(function(a){},function(a){console.log("set stage error:"),console.log(a),f.showAlert("Unable to stage resources!")})},a.CleanUp=function(){a.initChart(),!a.sessionID||"ERROR"!==a.status&&"STAGED"!==a.status?console.log("Cannot cleanup!"):i.postMethod("/kloudbuster/cleanup/"+a.sessionID).then(function(b){a.checkStatus()},function(a){console.log("clean error:"),console.log(a)})},a.stage=function(){if("ERROR"===a.status||"STAGED"===a.status)a.CleanUp();else if("READY"===a.status){var b=a.setConfig(1);b.then(function(){a.setStage()})}},a.runKb=function(){i.postMethod("/kloudbuster/run_test/"+a.sessionID).then(function(a){},function(a){console.log("running error:"),console.log(a),f.showAlert("Unable to start test!")})},a.stopKb=function(){i.postMethod("/kloudbuster/stop_test/"+a.sessionID).then(function(a){},function(a){console.log("stop error:"),console.log(a),f.showAlert("Unable to stop test!")})},a.scaleTest=function(){if("RUNNING"===a.status)a.stopKb();else if("STAGED"===a.status){var b=a.setConfig(1);b.then(function(){a.initChart(),a.runKb()})}},a.modes={randread:{name:"randread",title:"Rand Read",group:["rand","read"],y_axis:"IOPs/VM",y_label:"RATE IOPs Per VM"},randwrite:{name:"randwrite",title:"Rand Write",group:["rand","write"],y_axis:"IOPs/VM",y_label:"RATE IOPs Per VM"},read:{name:"read",title:"Seq Read",group:["seq","read"],y_axis:"BW/VM(KB/s)",y_label:"RATE BW Per VM"},write:{name:"write",title:"Seq Write",group:["seq","write"],y_axis:"BW/VM(KB/s)",y_label:"RATE BW Per VM"},randrw:{name:"randrw",title:"Rand Read/Write",span:"caret",group:["rand","mix"],y_axis:"IOPs/VM",y_label:"RATE IOPs Per VM"},rw:{name:"rw",title:"Seq Read/Write",span:"caret",group:["seq","mix"],y_axis:"BW/VM(KB/s)",y_label:"RATE BW Per VM"}},a.current_index=0,a.getCurrentMode=function(b,c,d){"rw"==b?(""==c&&(c="read"),a.current_mode=a.modes[c],"read"==c?a.current_title="- "+d+"% Read":a.current_title="- "+(100-d)+"% Write"):"randrw"==b?(""==c&&(c="read"),a.current_mode=a.modes["rand"+c], -"read"==c?a.current_title="- "+d+"% Read":a.current_title="- "+(100-d)+"% Write"):(a.current_mode=a.modes[a.current_mode_name],a.current_title="")},(a.config=h.getConfig())&&(a.current_mode_name=a.config.client.storage_tool_configs[0].mode,a.current_mode_description=a.config.client.storage_tool_configs[0].description,a.getCurrentMode(a.current_mode_name,"read")),a.handleEvent=function(b,c,d){a.current_index=c,a.current_mode_name=a.config.client.storage_tool_configs[c].mode,a.current_mode_description=a.config.client.storage_tool_configs[c].description,a.getCurrentMode(a.current_mode_name,d,a.config.client.storage_tool_configs[c].rwmixread),a.refreshChart(),j.getResult().kb_result.length>0&&a.draw(j.getResult())},a.tabledata=[],a.cols=[{field:"seq",title:"SEQ",sortable:"seq",show:!0},{field:"mode",title:"Mode",sortable:"mode",show:!0},{field:"total_client_vms",title:"Client VMs",sortable:"total_client_vms",show:!0},{field:"block_size",title:"Block Size",sortable:"block_size",show:!0},{field:"iodepth",title:"IO Depth",sortable:"iodepth",show:!0},{field:"rate_iops",title:"Requested IOPS",sortable:"rate_iops",show:!0},{field:"read_iops",title:"Read IOPS",sortable:"read_iops",show:!0},{field:"write_iops",title:"Write IOPS",sortable:"write_iops",show:!0},{field:"rate",title:"Requested BW",sortable:"rate",show:!0},{field:"read_bw",title:"Read BW",sortable:"read_bw",show:!0},{field:"write_bw",title:"Write BW",sortable:"write_bw",show:!0}],a.tableParams=new g({sorting:{name:"asc"},count:10},{counts:[],data:a.tabledata}),a.options={series:[{y:"IOPS",color:"#F44336",type:"column",striped:!0,label:"RATE IOPS/BW PER VM"},{y:"requested_rate",color:"#696969",drawDots:!1,thickness:"1px",label:"Requested Rate",lineMode:"dashed"},{y:"latency1",axis:"y2",color:"#673AB7",drawDots:!0,dotSize:4,thickness:"3px",label:"Latency(ms)--90%"},{y:"latency2",axis:"y2",color:"#03A9F4",drawDots:!0,dotSize:4,thickness:"3px",label:"Latency(ms)--99%"},{y:"latency3",axis:"y2",color:"#E91E63",drawDots:!0,dotSize:4,thickness:"3px",label:"Latency(ms)--99.9%"}],axes:{x:{key:"x",type:"linear",ticks:a.xaxisList,ticksFormatter:function(b){return-1!=$.inArray(b,a.xaxisList)?0==b?"1":b:""}},y:{type:"linear",ticksFormat:"d",innerTicks:!0,min:0},y2:{type:"log",ticksFormat:"d",innerTicks:!1,grid:!0}},tooltip:{mode:"scrubber",formatter:function(a,b,c){return c.label+":"+b}},tension:.8,lineMode:"cardinal",columnsHGap:45},a.initChart=function(){a.data=[],a.isDely=!1,a.tabledata.length=0,a.tableParams.reload(),a.isDely=!1,s=0,k.reset(),j.setResult([])};var s=0;a.initChart(),a.refreshChart=function(){a.data=[],a.isDely=!1,a.tabledata.length=0,a.tableParams.reload(),k.reset()},a.getReport=function(){i.getMethod2("/kloudbuster/report/"+a.sessionID+"?final=true").then(function(b){b.data.kb_result.length>0&&sg;g++)for(var h=0;e>h;h++)if(a.perrow=a.results[g][h],a.perrow.mode==a.current_mode_name&&a.perrow.description==a.current_mode_description){1==a.perrow.total_client_vms&&1!=d?a.xaxis=0:a.xaxis=a.perrow.total_client_vms,a.xaxisList.push(a.xaxis),"randread"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.read_iops/a.perrow.total_client_vms,latency1:a.perrow.read_hist[2][1]/1e3,latency2:a.perrow.read_hist[3][1]/1e3,latency3:a.perrow.read_hist[4][1]/1e3,requested_rate:a.perrow.rate_iops/a.perrow.total_client_vms}),c=a.perrow.rate_iops/a.perrow.total_client_vms),"randwrite"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.write_iops/a.perrow.total_client_vms,latency1:a.perrow.write_hist[2][1]/1e3,latency2:a.perrow.write_hist[3][1]/1e3,latency3:a.perrow.write_hist[4][1]/1e3,requested_rate:a.perrow.rate_iops/a.perrow.total_client_vms}),c=a.perrow.rate_iops/a.perrow.total_client_vms),"read"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.read_bw/a.perrow.total_client_vms,latency1:a.perrow.read_hist[2][1]/1e3,latency2:a.perrow.read_hist[3][1]/1e3,latency3:a.perrow.read_hist[4][1]/1e3,requested_rate:a.perrow.rate/a.perrow.total_client_vms}),c=a.perrow.rate/a.perrow.total_client_vms),"write"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.write_bw/a.perrow.total_client_vms,latency1:a.perrow.write_hist[2][1]/1e3,latency2:a.perrow.write_hist[3][1]/1e3,latency3:a.perrow.write_hist[4][1]/1e3,requested_rate:a.perrow.rate/a.perrow.total_client_vms}),c=a.perrow.rate/a.perrow.total_client_vms);var i=k.getColor(),j="mode-"+a.perrow.mode+"_VM-"+a.perrow.total_client_vms;a.pushTableData(j,a.perrow,i)}a.options.axes.y.max=1.0005*c,a.options.axes.y2.min=m(a.results)/1e3,a.options.series[0].label=a.current_mode.y_label},a.pushChartData=function(b,c,d){a.isDely===!1&&(a.options.series.shift(),a.isDely=!0),a.options.series.push({y:b,label:b,color:d,dotSize:"3",thickness:"2px"});for(var e=0;7>e;e++)a.data[e][b]=c.latency_stats[e][1]/1e3},a.pushTableData=function(b,c,d){a.tabledata.push({seq:b,mode:c.mode,total_client_vms:c.total_client_vms,block_size:c.block_size,iodepth:c.iodepth,rate_iops:c.rate_iops,read_bw:c.read_bw,write_bw:c.write_bw,read_iops:c.read_iops,write_iops:c.write_iops,rate:c.rate,color:d}),a.tableParams.reload()},a.saveResult=function(){var a=new Date,b=o(a.getMonth()+1),c=o(a.getDate()),d=o(a.getHours()),e=o(a.getMinutes()),g=""+b+c+d+e+".html",i=j.getResult();if(""!=i){var k=' KloudBuster Report

    KloudBuster Storage Test Report

    {{current_mode_description}}

    {{modes[current_mode_name]["title"]}} {{current_title}} ({{storage_target[from_outside.storage_target]}})
    {{current_mode["y_axis"]}}Latency(ms)
    {{row.total_client_vms}} {{row.block_size}}b {{row.iodepth}} {{row.rate_iops}} {{row.read_iops}} {{row.write_iops}} {{row.rate}} KB/s {{row.read_bw}} KB/s {{row.write_bw}} KB/s

    KloudBuster HTTP Test Configuration


    {{from_outside["time"]}} - KloudBuster {{from_outside["version"]}}
    ';n(g,k)}else f.showAlert("No result to save!")},setInterval(function(){a.checkStatus()},1e3),$(function(){$('[data-toggle="tooltip"]').tooltip()})}]).service("storageMode",function(){var a=[];this.getResult=function(){return a},this.setResult=function(b){return a=b}}),angular.module("kbWebApp").run(["$templateCache",function(a){"use strict";a.put("views/about.html",'

    KloudBuster

    {{version}}

    Splendid!

    '),a.put("views/config.html",'

    This field is required
    Must be a number between 1 and 999
    VM Placement
    Let Nova Decide Available Zone
    {{serverside}}
    {{clientside}}
    Use Topology -- customized VM placement
    Server Pool {{user.firstName}}
    Available Hypervisors {{user.firstName}}
    Client Pool {{user.firstName}}
    Set hypervisors for both sides!
    This field is required
    Must be a number no less than 0
    Flavor (per instance)
    This field is required
    Must be a number between 1 and 999
    This field is required
    Must be a number no less than
    Use default root disk size Use specific root disk size
    This field is required
    Must be a number no less than 1
    Flavor (per instance)
    This field is required
    Must be a number between 1 and 999
    This field is required
    Must be a number no less than 0
    Use default root disk size Use specific root disk size
    This field is required
    Must be a number no less than 1
    '), +m(g,k)}else f.showAlert("No result to save!")},setInterval(function(){a.checkStatus()},1e3),$(function(){$('[data-toggle="tooltip"]').tooltip()})}]).service("interactiveMode",function(){var a=[];this.getResult=function(){return a},this.setResult=function(b){return a=b}}).service("color",function(){var a=-1,b=["#F44336","#673AB7","#03A9F4","#4CAF50","#FFEB3B","#BF360C","#795548","#E91E63","#3F51B5","#00BCD4","#CDDC39","#FF9800","#9E9E9E","#9C27B0","#009688"],c=b.length;this.getColor=function(){return a=(a+1)%c,b[a]},this.reset=function(){a=-1}}).directive("convertToNumber",function(){return{require:"ngModel",link:function(a,b,c,d){d.$parsers.push(function(a){return parseFloat(a)}),d.$formatters.push(function(a){return""+a})}}}),angular.module("kbWebApp").controller("LogCtrl",["$scope","$compile","$http","$location","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f,g){this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===f.getSessionID()&&d.path("/Login"),$(window).on("hashchange",g.change()),String.prototype.replaceAll=function(a,b){return this.replace(new RegExp(a,"gm"),b)},a.sessionID=f.getSessionID(),a.status=f.getStatus(),a.logs="",a.logNum=f.getLogNum(),a.logOffset=0,a.delLog=function(){f.setLogOffset(a.logOffset),$("#cc").empty(),a.getLog()},a.getLog=function(){a.sessionID?(f.setLogNum(a.logNum),e.getMethod("/kloudbuster/log/"+a.sessionID+"?offset="+f.getLogOffset()).then(function(b){b.data=b.data.substring(1,b.data.length-1),a.logOffset=f.getLogOffset()+b.data.replace(/\\n/g,"a").length,a.logs=b.data.split("\\n"),$("#cc").empty();var c;c=0==f.getLogNum()?0:a.logs.length-f.getLogNum();for(var d in a.logs)c>0?c--:(a.logs[d]=a.logs[d].replace(/ /g," "),$("#cc").append(a.logs[d]+"
    "))},function(a){console.log("get Log error:"),console.log(a)})):console.log("not connected "+a.status+","+a.sessionID)},a.getLog()}]),angular.module("kbWebApp").controller("IntervalCtrl",["$scope","$http","kbHttp","$q","$location","showAlert","kbCookie","monitorMode","locationChange",function(a,b,c,d,e,f,g,h,i){function j(a,b){var c=document.createElement("a"),d=new Blob([b]),e=document.createEvent("HTMLEvents");e.initEvent("click",!1,!1),c.download=a,c.href=URL.createObjectURL(d),c.dispatchEvent(e)}function k(a){return 10>a?"0"+a:99>a?""+a:-1}this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===g.getSessionID()?e.path("/Login"):g.checkMode("http"),$(window).on("hashchange",i.change()),$("[data-toggle='.container']").click(function(){var a=$(this).data("toggle");$(a).toggleClass("open-sidebar"),$("#littleglyph1").toggleClass("glyphicon-triangle-right"),$("#littleglyph1").toggleClass("glyphicon-triangle-left")}),$(".swipe-area").swipe({swipeStatus:function(a,b,c,d,e,f){return"move"==b&&"right"==c?($(".container").addClass("open-sidebar"),!1):"move"==b&&"left"==c?($(".container").removeClass("open-sidebar"),!1):void 0}}),a.oneAtATime=!0,a.status1={isFirstOpen:!0,isFirstDisabled:!1},a.status2={isFirstOpen:!0,isFirstDisabled:!1},a.status1.open=!1,a.status2.open=!0,a.alerts=[],a.closeAlert=function(b){a.alerts.splice(b,1)},a.sessionID=g.getSessionID(),a.status=g.getStatus(),a.config=g.getConfig(),a.getRunConfig=function(){c.getMethod("/config/running_config/"+a.sessionID).then(function(b){a.config=b.data,g.setConfig(b.data),console.log("get & save config")},function(a){console.log("get running config error:"),console.log(a)})},a.sessionID&&!a.config&&a.getRunConfig(),a.setConfig=function(b){var e=d.defer();if("READY"===a.status)a.config.client.progression.enabled=!1,g.setConfig(a.config),a.chaCon={kb_cfg:{}},a.chaCon.kb_cfg=g.getConfig(),c.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),e.resolve(1),1!=b&&f.showAlert("Configuration updated successfully!")},function(a){e.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))});else if("STAGED"===a.status){if(a.config.client.progression.enabled===!0)return alert("Can't Run Monitor Test Now! You have chosen Progression Test. Click Unstage Button First!"),e.reject(0),e.promise;if(0===a.config.client.progression.report_interval)return alert("Can't Run Monitor Test Now! Report interval must be a number no less than 1."),e.reject(0),e.promise;g.setConfig(a.config),a.chaCon={kb_cfg:{client:{http_tool_configs:{duration:a.config.client.http_tool_configs.duration,rate_limit:a.config.client.http_tool_configs.rate_limit,connections:a.config.client.http_tool_configs.connections,report_interval:a.config.client.http_tool_configs.report_interval}}}},console.log(a.chaCon),c.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),e.resolve(1)},function(a){e.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})}else console.log("config not allow to change now!"),e.reject(0);return e.promise};var l=!1,m=!1;a.disableConfig=function(a){$("#"+a).find("input").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?(l===!0&&(l=!1,a.enableConfig("stagingConfig")),m===!0&&(m=!1,a.enableConfig("runningConfig"))):"STAGED"===a.status?(l===!1&&(l=!0,a.disableConfig("stagingConfig")),m===!0&&(m=!1,a.enableConfig("runningConfig"))):(l===!1&&(l=!0,a.disableConfig("stagingConfig")),m===!1&&(m=!0,a.disableConfig("runningConfig")))};var n=0;a.pointNum=function(){var a=".";n=(n+1)%6;for(var b=0;n>b;b++)a+=" .";return a},a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=0,a.server_vm_count=0,a.statusButton="btn-default",a.checkStatus=function(){a.sessionID?c.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,a.configStatus(),g.setStatus(a.status),"READY"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!1,a.client_vm_count=0,a.server_vm_count=0,$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"STAGING"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=b.data.client_vm_count,a.server_vm_count=b.data.server_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Creating VM(s)"+a.pointNum()):"STAGED"===a.status?(a.runButton="Run Test",a.runStatus=!1,a.setStatus=!1,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"RUNNING"===a.status?(a.runButton="Stop Test",a.runStatus=!1,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.getSeqReport(),a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Running"+a.pointNum()):"ERROR"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").addClass("pause"),a.statusButton="btn-danger",a.info=""):"CLEANING"!==a.status&&"STOPPING"!==a.status||(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.server.routers_per_tenant*a.config.server.networks_per_router*a.config.server.vms_per_network*a.config.server.number_tenants,a.server_vm_count=a.client_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="Please Wait"+a.pointNum())},function(a){console.log("get status error:"),console.log(a)}):a.status="NO SESSION ID"},a.checkStatus(),a.setStage=function(){c.postMethod("/kloudbuster/stage/"+a.sessionID).then(function(a){},function(a){console.log("set stage error:"),console.log(a),f.showAlert("Unable to stage resources!")})},a.CleanUp=function(){a.initChart(),!a.sessionID||"ERROR"!==a.status&&"STAGED"!==a.status?console.log("Cannot cleanup!"):c.postMethod("/kloudbuster/cleanup/"+a.sessionID).then(function(b){a.checkStatus()},function(a){console.log("clean error:"),console.log(a)})},a.stage=function(){if("ERROR"===a.status||"STAGED"===a.status)a.CleanUp();else if("READY"===a.status){var b=a.setConfig(1);b.then(function(){a.setStage()})}},a.runKb=function(){c.postMethod("/kloudbuster/run_test/"+a.sessionID).then(function(a){},function(a){console.log("running error:"),console.log(a),f.showAlert("Unable to start test!")})},a.stopKb=function(){c.postMethod("/kloudbuster/stop_test/"+a.sessionID).then(function(a){},function(a){console.log("stop error:"),console.log(a),f.showAlert("Unable to stop test!")})},a.scaleTest=function(){if("RUNNING"===a.status)a.stopKb();else{var b=a.setConfig(1);b.then(function(){"STAGED"===a.status&&(a.config.client.progression.enabled===!0?f.showAlert("Can't Run Monitor Test Now! You have chosen Progression Test. Clean Up First!"):0===a.config.client.http_tool_configs.report_interval?f.showAlert("Can't Run Monitor Test Now! Report interval must be a number no less than 1."):(a.initChart(),a.runKb()))})}},a.data=[{x:new Date}],a.isDely=!1;var o=0;a.initChart=function(){a.data=[{x:new Date}],a.isDely=!1,o=0,h.setResult("")},a.options={axes:{x:{type:"date"},y:{type:"log",ticksFormat:"d",innerTicks:!0,grid:!0}},series:[{y:"val_6",label:"99.999%",type:"area",color:"#2e4174",dotSize:"0",thickness:"2px",visible:!1},{y:"val_5",label:"99.99%",type:"area",color:"#084594",dotSize:"0",thickness:"2px",visible:!1},{y:"val_4",label:"99.9%",type:"area",color:"#0074D9",dotSize:"0",thickness:"2px"},{y:"val_3",label:"99%",type:"area",color:"#79afe1",dotSize:"0",thickness:"2px"},{y:"val_2",label:"90%",type:"area",color:"#9ecae1",dotSize:"0",thickness:"2px"},{y:"val_1",label:"75%",type:"area",color:"#c6dbef",dotSize:"0",thickness:"2px",visible:!1},{y:"val_0",label:"50%",type:"area",color:"#eff3ff",dotSize:"0",thickness:"2px"}],tooltip:{mode:"scrubber",formatter:function(a,b,c){return c.label+":"+b}},tension:.9,lineMode:"cardinal"},a.data.forEach(function(a){a.x=new Date(a.x)}),a.getSeqReport=function(){c.getMethod2("/kloudbuster/report/"+a.sessionID).then(function(b){a.result=b.data.report,a.seq=b.data.seq,console.log("get seq report:"+a.seq),a.seq&&a.seq>o&&(o=a.seq,a.data.length>40&&a.data.shift(),a.pushChartData("SEQ_"+a.seq,a.result))},function(a){console.log("get seq report error:"),console.log(a)})},a.pushChartData=function(b,c){a.isDely===!1&&(a.data.shift(),a.isDely=!0),a.data.push({x:new Date,val_0:c.latency_stats[0][1]/1e3,val_1:c.latency_stats[1][1]/1e3,val_2:c.latency_stats[2][1]/1e3,val_3:c.latency_stats[3][1]/1e3,val_4:c.latency_stats[4][1]/1e3,val_5:c.latency_stats[5][1]/1e3,val_6:c.latency_stats[6][1]/1e3}),h.setResult(a.data)},h.getResult()&&(a.data=h.getResult()),a.saveResult=function(){var a=new Date,b=k(a.getMonth()+1),c=k(a.getDate()),d=k(a.getHours()),e=k(a.getMinutes()),i=""+b+c+d+e+".html";if(console.log(i),console.log(h.getResult()),""!=h.getResult()){var l=' KloudBuster Report

    KloudBuster HTTP Monitoring Test Report

    Latency(ms)

    KloudBuster HTTP Monitoring Test Configuration


    '+b+"-"+c+" "+d+":"+e+' - KloudBuster
    ';j(i,l)}else f.showAlert("No result to save!")},setInterval(function(){a.checkStatus()},900)}]).service("monitorMode",function(){var a="";this.getResult=function(){return a},this.setResult=function(b){return a=b}}),angular.module("kbWebApp").controller("LoginCtrl",["$scope","$http","$location","showAlert","$q","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f,g,h){function i(a){var b=a.target.files,c=b[0],d=new FileReader;d.onload=function(){l=this.result},d.readAsText(c)}function j(a){var b=a.target.files,c=b[0],d=new FileReader;d.onload=function(){m=this.result},d.readAsText(c)}if(this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],g.checkMode("login"),$(window).on("hashchange",h.change()),function(a,b,c){var d=a.querySelectorAll("html")[0];d.className=d.className.replace(/(^|\s)no-js(\s|$)/,"$1js$2")}(document,window,0),function(a,b,c){var d=a.querySelectorAll(".inputfile");Array.prototype.forEach.call(d,function(a){var b=a.nextElementSibling,c=b.innerHTML;a.addEventListener("change",function(a){var d="";d=a.target.value.split("\\").pop(),d?b.querySelector("span").innerHTML=d:b.innerHTML=c}),a.addEventListener("focus",function(){a.classList.add("has-focus")}),a.addEventListener("blur",function(){a.classList.remove("has-focus")})})}(document,window,0),a.deleteSession=function(){f.delMethod("/config/running_config/"+a.sessionID).then(function(a){console.log("del sessionID")},function(a){})},a.CleanUp=function(){var b=e.defer();return"READY"!=g.getStatus()&&"CLEANING"!=g.getStatus()?(f.postMethod("/kloudbuster/cleanup/"+a.sessionID).then(function(a){console.log("clean up successfully")},function(a){}),b.resolve(1)):b.resolve(1),b.promise},""!=g.getSessionID()){a.sessionID=g.getSessionID();var k=a.CleanUp();k.then(function(){a.deleteSession(),g.init()})}a.samecloud=!0,a.clouds=function(){a.samecloud===!0?($("#inputPassword2").attr("disabled",!0),$("#file2").attr("disabled",!0),$("#rcfile2").attr("disabled",!0)):($("#inputPassword2").attr("disabled",!1),$("#file2").attr("disabled",!1),$("#rcfile2").attr("disabled",!1))};var l;document.getElementById("file1").addEventListener("change",i,!1);var m;document.getElementById("file2").addEventListener("change",j,!1),$("#inputPassword1").keydown(function(b){var c=b.which;13==c&&a.setConfig()}),$("#inputPassword2").keydown(function(b){var c=b.which;13==c&&a.setConfig()}),a.setConfig=function(){"storage"==a.mode?(g.setIsOneCloud(!0),a.credentials={"tested-passwd":a.inputPassword1,"tested-rc":l},a.storage_mode=!0):(a.storage_mode=!1,a.samecloud===!0?(g.setIsOneCloud(!0),a.credentials={"tested-passwd":a.inputPassword1,"tested-rc":l}):(g.setIsOneCloud(!1),a.credentials={"tested-passwd":a.inputPassword1,"tested-rc":l,"testing-passwd":inputPassword2,"testing-rc":m})),a.runCon={credentials:{},kb_cfg:"",storage_mode:a.storage_mode},a.runCon.credentials=a.credentials,g.setCredentials(a.credentials),g.setMode(a.mode),f.postMethod("/config/running_config",a.runCon).then(function(b){g.setSessionID(b.data),a.sessionID=g.getSessionID(),console.log("set config & get sesID:"+a.sessionID),"storage"==a.mode?c.path("/StorageMode"):c.path("/InteractiveMode")},function(a){400==a.status?d.showAlert("Error while parsing configurations! Please check your inputs!"):-1==a.status&&d.showAlert("Error while connecting kloudbuster server!")})}}]),angular.module("kbWebApp").controller("StorageConfigCtrl",["$scope","$http","$location","showAlert","kbHttp","kbCookie","locationChange",function(a,b,c,d,e,f,g){this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===f.getSessionID()?c.path("/Login"):f.checkMode("storage"),$(window).on("hashchange",g.change()),a.sessionID=f.getSessionID(),a.status=f.getStatus(),a.dash1status1="active",a.dash1status1vis=!0,a.dash1status2="",a.dash1status2vis=!1,a.setDash1Status=function(b){1===b?(a.dash1status2="",a.dash1status2vis=!1,a.dash1status1="active",a.dash1status1vis=!0):2===b&&(a.dash1status1="",a.dash1status1vis=!1,a.dash1status2="active",a.dash1status2vis=!0)},a.parseInt=parseInt,a.checkStatus=function(){a.sessionID?e.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,f.setStatus(a.status),a.configStatus()},function(a){console.log("status error")}):(a.status="NO SESSION ID",f.setStatus(""))};var h=!1;a.disableConfig=function(a){$("#"+a).find("input,button,a,md-radio-button").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input,button,a,md-radio-button").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?h===!0&&(h=!1,a.enableConfig("stagingConfig3"),a.enableConfig("getButton")):h===!1&&(h=!0,a.disableConfig("stagingConfig3"),a.disableConfig("getButton"))},$("#dropdownrandrw").append('
  • '),a.storageMode={randread:{name:"Random Read",type:"panel-randread",para:["description","rate_iops","block_size","iodepth","runtime","extra_opts"]},randwrite:{name:"Random Write",type:"panel-randwrite",para:["description","rate_iops","block_size","iodepth","runtime","extra_opts"]},randrw:{name:"Random Read/Write",type:"panel-randrw",para:["description","rate_iops","block_size","iodepth","rwmixread","runtime","extra_opts"]},read:{name:"Seq Read",type:"panel-read",para:["description","rate","block_size","iodepth","runtime","extra_opts"]},write:{name:"Seq Write",type:"panel-write",para:["description","rate","block_size","iodepth","runtime","extra_opts"]},rw:{name:"Seq Read/Write",type:"panel-rw",para:["description","rate","block_size","iodepth","rwmixread","runtime","extra_opts"]}},a.options={description:{name:"Description","default":""},mode:{name:"Mode"},runtime:{name:"Run Time","default":30},block_size:{name:"Block Size (KB)","default":"4k"},iodepth:{name:"IO Depth","default":1},rate_iops:{name:"IOPs","default":100},rate:{name:"BW (MB/s)","default":"60M"},rwmixread:{name:"Read %","default":70},extra_opts:{name:"Extra Options","default":""}},a.switchIndex=function(b,c){var d=a.config.client.storage_tool_configs[b];a.config.client.storage_tool_configs.splice(b,1),1==c?a.config.client.storage_tool_configs.splice(b-1,0,d):-1==c&&a.config.client.storage_tool_configs.splice(b+1,0,d)},a.addMode=function(b){var c={};for(var d in a.storageMode[b].para){var e=a.storageMode[b].para[d];c[e]=a.options[e]["default"]}c.mode=b,a.config.client.storage_tool_configs.splice(0,0,c)},a.getDefaultConfig=function(){e.getMethod("/config/default_config").then(function(b){f.setConfig(b.data),a.config=b.data,0==a.config.client.flavor.disk?a.choose_disk_size=0:a.choose_disk_size=1,console.log("get & save default config")},function(a){d.showAlert("Cannot get the Default Configuration!")})},a.getRunConfig=function(){e.getMethod("/config/running_config/"+a.sessionID).then(function(b){f.setConfig(b.data),a.config=b.data,0==a.config.client.flavor.disk?a.choose_disk_size=0:a.choose_disk_size=1,a.checkStatus(),console.log("get & save running config")},function(a){console.log("get running config error:"),console.log(a)})},a.getRunConfig(),a.changeConfig=function(){"READY"===a.status||""===a.status?1==a.server.$valid&&1==a.general.$valid?(f.setConfig(a.config),a.chaCon={kb_cfg:{},topo_cfg:{}},a.chaCon.kb_cfg=f.getConfig(),f.setTopology({servers_rack:"",clients_rack:""}),a.chaCon.topo_cfg=f.getTopology(),a.config.server.availability_zone="",a.config.client.availability_zone="",console.log(a.chaCon),e.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config")},function(a){d.showAlert("Failed to update configuration!")})):d.showAlert("Please check your inputs!"):d.showAlert("Configuration cannot be changed now!")}}]),angular.module("kbWebApp").controller("RunStorageCtrl",["$scope","$timeout","$location","$http","$q","showAlert","ngTableParams","kbCookie","kbHttp","storageMode","color","locationChange",function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a){var b=Number.POSITIVE_INFINITY;return a.forEach(function(a){a.forEach(function(a){"write_hist"in a&&(b=Math.min(b,a.write_hist[0][1])),"read_hist"in a&&(b=Math.min(b,a.read_hist[0][1]))})}),b}function n(a,b){var c=document.createElement("a"),d=new Blob([b]),e=document.createEvent("HTMLEvents");e.initEvent("click",!1,!1),c.download=a,c.href=URL.createObjectURL(d),c.dispatchEvent(e)}function o(a){return 10>a?"0"+a:99>a?""+a:-1}this.awesomeThings=["HTML5 Boilerplate","AngularJS","Karma"],""===h.getSessionID()?c.path("/Login"):h.checkMode("storage"),$(window).on("hashchange",l.change()),$("[data-toggle='.container']").click(function(){var a=$(this).data("toggle");$(a).toggleClass("open-sidebar"),$("#littleglyph").toggleClass("glyphicon-triangle-right"),$("#littleglyph").toggleClass("glyphicon-triangle-left")}),$(".swipe-area").swipe({swipeStatus:function(a,b,c,d,e,f){return"move"==b&&"right"==c?($(".container").addClass("open-sidebar"),!1):"move"==b&&"left"==c?($(".container").removeClass("open-sidebar"),!1):void 0}}),a.oneAtATime=!1,a.status1={isFirstOpen:!0,isFirstDisabled:!1},a.status2={isFirstOpen:!0,isFirstDisabled:!1},a.status1.open=!0,a.status2.open=!0,a.sessionID=h.getSessionID(),a.status=h.getStatus(),a.getRunConfig=function(){i.getMethod("/config/running_config/"+a.sessionID).then(function(b){a.config=b.data,h.setConfig(b.data),a.current_mode_name=a.config.client.storage_tool_configs[0].mode,a.current_mode_description=a.config.client.storage_tool_configs[0].description,a.getCurrentMode(a.current_mode_name,"read"),console.log("get & save config")},function(a){console.log("get running config error:"),console.log(a)})},a.sessionID&&!a.config&&a.getRunConfig(),a.setConfig=function(b){var c=e.defer();return"READY"===a.status?(h.setConfig(a.config),a.chaCon={kb_cfg:{}},a.chaCon.kb_cfg=h.getConfig(),i.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),c.resolve(1)},function(a){c.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})):"STAGED"===a.status?(a.config.client.http_tool_configs.report_interval=0,h.setConfig(a.config),a.chaCon={kb_cfg:{client:{http_tool_configs:{duration:a.config.client.http_tool_configs.duration,rate_limit:a.config.client.http_tool_configs.rate_limit,connections:a.config.client.http_tool_configs.connections,report_interval:0}}}},i.putMethod("/config/running_config/"+a.sessionID,a.chaCon).then(function(a){console.log("change running config"),c.resolve(1)},function(a){c.reject(0),1!=b&&(400==a.status?f.showAlert("Error while parsing configurations! Please check your inputs!"):403==a.status?f.showAlert("Cannot update configuration if KloudBuster is busy or in error state"):-1==a.status&&f.showAlert("Error while connecting kloudbuster server!"))})):(console.log("config not allow to change now!"),c.reject(0)),c.promise};var p=!1,q=!1;a.disableConfig=function(a){$("#"+a).find("input").each(function(){$(this).attr("disabled","disabled")})},a.enableConfig=function(a){$("#"+a).find("input").each(function(){$(this).removeAttr("disabled")})},a.configStatus=function(){"READY"===a.status?(p===!0&&(p=!1,a.enableConfig("stagingConfig"),a.enableConfig("stagingConfig1"),$("#client_progression_enabled").removeAttr("disabled"),$("#client_progression_vm_start").removeAttr("disabled")),q===!0&&(q=!1,a.enableConfig("runningConfig"))):"STAGED"===a.status?(p===!1&&(p=!0,a.disableConfig("stagingConfig"),a.disableConfig("stagingConfig1"),$("#client_progression_enabled").attr("disabled","disabled"),$("#client_progression_vm_start").attr("disabled","disabled")),q===!0&&(q=!1,a.enableConfig("runningConfig"))):(p===!1&&(p=!0,a.disableConfig("stagingConfig"),a.disableConfig("stagingConfig1"),$("md-checkbox").attr("disabled","disabled")),q===!1&&(q=!0,a.disableConfig("runningConfig")))};var r=0;a.pointNum=function(){var a=".";r=(r+1)%6;for(var b=0;r>b;b++)a+=" .";return a},a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=0,a.server_vm_count=0,a.statusButton="btn-default",a.checkStatus=function(){a.sessionID?i.getMethod2("/kloudbuster/status/"+a.sessionID).then(function(b){a.status=b.data.status,h.setStatus(a.status),a.configStatus(),"READY"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!1,a.stageButton="Stage",a.setUnstage=!1,a.client_vm_count=0,$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"STAGING"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Stage",a.setUnstage=!0,a.client_vm_count=b.data.client_vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Creating VM(s)"+a.pointNum()):"STAGED"===a.status?(a.runButton="Run Test",a.runStatus=!1,a.setStatus=!1,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,a.getReport(),$(".loading").addClass("pause"),a.statusButton="btn-success",a.info=""):"RUNNING"===a.status?(a.runButton="Stop Test",a.runStatus=!1,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,a.config.client.progression.enabled===!0&&a.getReport(),$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="KloudBuster is Running"+a.pointNum()):"ERROR"===a.status?(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!1,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,$(".loading").addClass("pause"),a.statusButton="btn-danger",a.info=""):"CLEANING"!==a.status&&"STOPPING"!==a.status||(a.runButton="Run Test",a.runStatus=!0,a.setStatus=!0,a.stageButton="Unstage",a.setUnstage=!0,a.client_vm_count=a.config.client.storage_stage_configs.vm_count,$(".loading").removeClass("pause"),a.statusButton="btn-info",a.info="Please Wait"+a.pointNum())},function(a){console.log("get status error:"),console.log(a)}):(a.status="NO SESSION ID",h.setStatus(""))},a.checkStatus(),a.setStage=function(){i.postMethod("/kloudbuster/stage/"+a.sessionID).then(function(a){},function(a){console.log("set stage error:"),console.log(a),f.showAlert("Unable to stage resources!")})},a.CleanUp=function(){a.initChart(),!a.sessionID||"ERROR"!==a.status&&"STAGED"!==a.status?console.log("Cannot cleanup!"):i.postMethod("/kloudbuster/cleanup/"+a.sessionID).then(function(b){a.checkStatus()},function(a){console.log("clean error:"),console.log(a)})},a.stage=function(){if("ERROR"===a.status||"STAGED"===a.status)a.CleanUp();else if("READY"===a.status){var b=a.setConfig(1);b.then(function(){a.setStage()})}},a.runKb=function(){i.postMethod("/kloudbuster/run_test/"+a.sessionID).then(function(a){},function(a){console.log("running error:"),console.log(a),f.showAlert("Unable to start test!")})},a.stopKb=function(){i.postMethod("/kloudbuster/stop_test/"+a.sessionID).then(function(a){},function(a){console.log("stop error:"), +console.log(a),f.showAlert("Unable to stop test!")})},a.scaleTest=function(){if("RUNNING"===a.status)a.stopKb();else if("STAGED"===a.status){var b=a.setConfig(1);b.then(function(){a.initChart(),a.runKb()})}},a.modes={randread:{name:"randread",title:"Rand Read",group:["rand","read"],y_axis:"IOPs/VM",y_label:"RATE IOPs Per VM"},randwrite:{name:"randwrite",title:"Rand Write",group:["rand","write"],y_axis:"IOPs/VM",y_label:"RATE IOPs Per VM"},read:{name:"read",title:"Seq Read",group:["seq","read"],y_axis:"BW/VM(KB/s)",y_label:"RATE BW Per VM"},write:{name:"write",title:"Seq Write",group:["seq","write"],y_axis:"BW/VM(KB/s)",y_label:"RATE BW Per VM"},randrw:{name:"randrw",title:"Rand Read/Write",span:"caret",group:["rand","mix"],y_axis:"IOPs/VM",y_label:"RATE IOPs Per VM"},rw:{name:"rw",title:"Seq Read/Write",span:"caret",group:["seq","mix"],y_axis:"BW/VM(KB/s)",y_label:"RATE BW Per VM"}},a.current_index=0,a.getCurrentMode=function(b,c,d){"rw"==b?(""==c&&(c="read"),a.current_mode=a.modes[c],"read"==c?a.current_title="- "+d+"% Read":a.current_title="- "+(100-d)+"% Write"):"randrw"==b?(""==c&&(c="read"),a.current_mode=a.modes["rand"+c],"read"==c?a.current_title="- "+d+"% Read":a.current_title="- "+(100-d)+"% Write"):(a.current_mode=a.modes[a.current_mode_name],a.current_title="")},(a.config=h.getConfig())&&(a.current_mode_name=a.config.client.storage_tool_configs[0].mode,a.current_mode_description=a.config.client.storage_tool_configs[0].description,a.getCurrentMode(a.current_mode_name,"read")),a.handleEvent=function(b,c,d){a.current_index=c,a.current_mode_name=a.config.client.storage_tool_configs[c].mode,a.current_mode_description=a.config.client.storage_tool_configs[c].description,a.getCurrentMode(a.current_mode_name,d,a.config.client.storage_tool_configs[c].rwmixread),a.refreshChart(),j.getResult().kb_result.length>0&&a.draw(j.getResult())},a.tabledata=[],a.cols=[{field:"seq",title:"SEQ",sortable:"seq",show:!0},{field:"mode",title:"Mode",sortable:"mode",show:!0},{field:"total_client_vms",title:"Client VMs",sortable:"total_client_vms",show:!0},{field:"block_size",title:"Block Size",sortable:"block_size",show:!0},{field:"iodepth",title:"IO Depth",sortable:"iodepth",show:!0},{field:"rate_iops",title:"Requested IOPS",sortable:"rate_iops",show:!0},{field:"read_iops",title:"Read IOPS",sortable:"read_iops",show:!0},{field:"write_iops",title:"Write IOPS",sortable:"write_iops",show:!0},{field:"rate",title:"Requested BW",sortable:"rate",show:!0},{field:"read_bw",title:"Read BW",sortable:"read_bw",show:!0},{field:"write_bw",title:"Write BW",sortable:"write_bw",show:!0}],a.tableParams=new g({sorting:{name:"asc"},count:10},{counts:[],data:a.tabledata}),a.options={series:[{y:"IOPS",color:"#F44336",type:"column",striped:!0,label:"RATE IOPS/BW PER VM"},{y:"requested_rate",color:"#696969",drawDots:!1,thickness:"1px",label:"Requested Rate",lineMode:"dashed"},{y:"latency1",axis:"y2",color:"#673AB7",drawDots:!0,dotSize:4,thickness:"3px",label:"Latency(ms)--90%"},{y:"latency2",axis:"y2",color:"#03A9F4",drawDots:!0,dotSize:4,thickness:"3px",label:"Latency(ms)--99%"},{y:"latency3",axis:"y2",color:"#E91E63",drawDots:!0,dotSize:4,thickness:"3px",label:"Latency(ms)--99.9%"}],axes:{x:{key:"x",type:"linear",ticks:a.xaxisList,ticksFormatter:function(b){return-1!=$.inArray(b,a.xaxisList)?0==b?"1":b:""}},y:{type:"linear",ticksFormat:"d",innerTicks:!0,min:0},y2:{type:"log",ticksFormat:"d",innerTicks:!1,grid:!0}},tooltip:{mode:"scrubber",formatter:function(a,b,c){return c.label+":"+b}},tension:.8,lineMode:"cardinal",columnsHGap:45},a.initChart=function(){a.data=[],a.isDely=!1,a.tabledata.length=0,a.tableParams.reload(),a.isDely=!1,s=0,k.reset(),j.setResult([])};var s=0;a.initChart(),a.refreshChart=function(){a.data=[],a.isDely=!1,a.tabledata.length=0,a.tableParams.reload(),k.reset()},a.getReport=function(){i.getMethod2("/kloudbuster/report/"+a.sessionID+"?final=true").then(function(b){b.data.kb_result.length>0&&sg;g++)for(var h=0;e>h;h++)if(a.perrow=a.results[g][h],a.perrow.mode==a.current_mode_name&&a.perrow.description==a.current_mode_description){1==a.perrow.total_client_vms&&1!=d?a.xaxis=0:a.xaxis=a.perrow.total_client_vms,a.xaxisList.push(a.xaxis),"randread"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.read_iops/a.perrow.total_client_vms,latency1:a.perrow.read_hist[2][1]/1e3,latency2:a.perrow.read_hist[3][1]/1e3,latency3:a.perrow.read_hist[4][1]/1e3,requested_rate:a.perrow.rate_iops/a.perrow.total_client_vms}),c=a.perrow.rate_iops/a.perrow.total_client_vms),"randwrite"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.write_iops/a.perrow.total_client_vms,latency1:a.perrow.write_hist[2][1]/1e3,latency2:a.perrow.write_hist[3][1]/1e3,latency3:a.perrow.write_hist[4][1]/1e3,requested_rate:a.perrow.rate_iops/a.perrow.total_client_vms}),c=a.perrow.rate_iops/a.perrow.total_client_vms),"read"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.read_bw/a.perrow.total_client_vms,latency1:a.perrow.read_hist[2][1]/1e3,latency2:a.perrow.read_hist[3][1]/1e3,latency3:a.perrow.read_hist[4][1]/1e3,requested_rate:a.perrow.rate/a.perrow.total_client_vms}),c=a.perrow.rate/a.perrow.total_client_vms),"write"==f&&(a.data.push({x:a.xaxis,IOPS:a.perrow.write_bw/a.perrow.total_client_vms,latency1:a.perrow.write_hist[2][1]/1e3,latency2:a.perrow.write_hist[3][1]/1e3,latency3:a.perrow.write_hist[4][1]/1e3,requested_rate:a.perrow.rate/a.perrow.total_client_vms}),c=a.perrow.rate/a.perrow.total_client_vms);var i=k.getColor(),j="mode-"+a.perrow.mode+"_VM-"+a.perrow.total_client_vms;a.pushTableData(j,a.perrow,i)}a.options.axes.y.max=1.0005*c,a.options.axes.y2.min=m(a.results)/1e3,a.options.series[0].label=a.current_mode.y_label},a.pushChartData=function(b,c,d){a.isDely===!1&&(a.options.series.shift(),a.isDely=!0),a.options.series.push({y:b,label:b,color:d,dotSize:"3",thickness:"2px"});for(var e=0;7>e;e++)a.data[e][b]=c.latency_stats[e][1]/1e3},a.pushTableData=function(b,c,d){a.tabledata.push({seq:b,mode:c.mode,total_client_vms:c.total_client_vms,block_size:c.block_size,iodepth:c.iodepth,rate_iops:c.rate_iops,read_bw:c.read_bw,write_bw:c.write_bw,read_iops:c.read_iops,write_iops:c.write_iops,rate:c.rate,color:d}),a.tableParams.reload()},a.saveResult=function(){var a=new Date,b=o(a.getMonth()+1),c=o(a.getDate()),d=o(a.getHours()),e=o(a.getMinutes()),g=""+b+c+d+e+".html",i=j.getResult();if(""!=i){var k=' KloudBuster Report

    KloudBuster Storage Test Report

    {{current_mode_description}}

    {{modes[current_mode_name]["title"]}} {{current_title}} ({{storage_target[from_outside.storage_target]}})
    {{current_mode["y_axis"]}}Latency(ms)
    {{row.total_client_vms}} {{row.block_size}}b {{row.iodepth}} {{row.rate_iops}} {{row.read_iops}} {{row.write_iops}} {{row.rate}} KB/s {{row.read_bw}} KB/s {{row.write_bw}} KB/s

    KloudBuster HTTP Test Configuration


    {{from_outside["time"]}} - KloudBuster {{from_outside["version"]}}
    ';n(g,k)}else f.showAlert("No result to save!")},setInterval(function(){a.checkStatus()},1e3),$(function(){$('[data-toggle="tooltip"]').tooltip()})}]).service("storageMode",function(){var a=[];this.getResult=function(){return a},this.setResult=function(b){return a=b}}),angular.module("kbWebApp").run(["$templateCache",function(a){"use strict";a.put("views/about.html",'

    KloudBuster

    {{version}}

    Splendid!

    '),a.put("views/config.html",'

    This field is required
    Must be a number between 1 and 999
    VM Placement
    Let Nova Decide Available Zone
    {{serverside}}
    {{clientside}}
    Use Topology -- customized VM placement
    Server Pool {{user.firstName}}
    Available Hypervisors {{user.firstName}}
    Client Pool {{user.firstName}}
    Set hypervisors for both sides!
    This field is required
    Must be a number no less than 0
    Flavor (per instance)
    This field is required
    Must be a number between 1 and 999
    This field is required
    Must be a number no less than
    Use default root disk size Use specific root disk size
    This field is required
    Must be a number no less than 1
    Flavor (per instance)
    This field is required
    Must be a number between 1 and 999
    This field is required
    Must be a number no less than 0
    Use default root disk size Use specific root disk size
    This field is required
    Must be a number no less than 1
    '), a.put("views/config_storage.html",'

    This field is required
    Must be a number between 1 and 999
    Volume Types Used for Storage Test:
    Cinder Volume (Block Storage) Ephemeral Volume
    This field is required
    Must be a number between 1 and 999
    This field is required
    Must be a number between 1 and 999
    Flavor (per instance)
    This field is required
    Must be a number between 1 and 999
    This field is required
    Must be a number no less than 0
    Use default root disk size Use specific root disk size
    This field is required
    Must be a number no less than 1

    {{$index+1}}. {{item[\'description\']}} - {{storageMode[item[\'mode\']][\'name\']}}  ×

    This field is required
    This field is required
    Must be a number no less than 1
    This field is required
    Must be a number no less than 1
    This field is required
    Must be a number no less than 1
    This field is required
    Must be a number no less than 1
    This field is required
    Must be a number between 1 and 99
    This field is required
    Must be a number between 1 and 999
    '),a.put("views/interval.html",'
    Latency(ms)

    '), a.put("views/log.html",'
    LOGS
    Show All Logs
    Show Last 100 Lines
    '),a.put("views/login.html",'

    Data Plane Scale Test Storage Scale Test

    Server Cloud

    Client Cloud

    openrc.sh

    Password

    Client Cloud

    openrc.sh

    Password

    '),a.put("views/run.html",'
    Latency(ms)

    {{row.connection}} {{row.server_vms}} {{row.requests}} {{row.sock_err}} {{row.rps}} {{row.rate_limit}} {{row.throughput}} Gbps
    '), a.put("views/run_storage.html",'

    {{modes[current_mode_name][\'title\']}} {{current_title}} ({{current_mode_description}})

    {{current_mode["y_axis"]}}Latency(ms)

    {{row.total_client_vms}} {{row.block_size}}b {{row.iodepth}} {{row.rate_iops}} {{row.read_iops}} {{row.write_iops}} {{row.rate}} KB/s {{row.read_bw}} KB/s {{row.write_bw}} KB/s
     
    ')}]); \ No newline at end of file diff --git a/kb_web/app/scripts/controllers/about.js b/kb_web/app/scripts/controllers/about.js index 1161003..915a5a5 100644 --- a/kb_web/app/scripts/controllers/about.js +++ b/kb_web/app/scripts/controllers/about.js @@ -125,7 +125,7 @@ angular.module('kbWebApp') }) .service('kbHttp', function ($http, $q) { var backendUrl = $(location).attr('protocol') +"//" + $(location).attr('host') + "/api"; - // var backendUrl = "http://127.0.0.1:8080/api"; + //var backendUrl = "http://127.0.0.1:8080/api"; this.getMethod = function (url) { var deferred = $q.defer(); // declaration diff --git a/kb_web/app/scripts/controllers/interval.js b/kb_web/app/scripts/controllers/interval.js index 312bb1a..c839947 100644 --- a/kb_web/app/scripts/controllers/interval.js +++ b/kb_web/app/scripts/controllers/interval.js @@ -656,7 +656,7 @@ angular.module('kbWebApp') console.log(monitorMode.getResult()); if (monitorMode.getResult() != "") { - var myresult = ' KloudBuster Report
    '; + var myresult = ' KloudBuster Report

    KloudBuster HTTP Monitoring Test Report

    Latency(ms)

    KloudBuster HTTP Monitoring Test Configuration


    '+m+'-'+d + ' ' + h +':'+ min +' - KloudBuster
    '; downloadFile(filename, myresult); } else showAlert.showAlert("No result to save!");