From 0cfbaf82988cbf3bb2279a251f575c63ba18c306 Mon Sep 17 00:00:00 2001 From: james-leinas Date: Thu, 26 Mar 2026 09:48:30 -0700 Subject: [PATCH 1/2] Add examples --- .../docs/input/dose_response_5pl_data.xlsx | Bin 0 -> 6007 bytes .../docs/output/5pl_parameters.csv | 9 + .../docs/output/aggregated_data.csv | 12 + .../docs/output/dose_response_curve.png | Bin 0 -> 62120 bytes .../5-parameter-logistic/dose_response_5pl.py | 261 ++++++++++++++++++ .../docs/input/timecourse_data.xlsx | Bin 0 -> 6998 bytes .../docs/output/aggregated_kinetics.csv | 31 +++ .../docs/output/kinetic_curves.png | Bin 0 -> 70657 bytes .../docs/output/kinetic_params.csv | 4 + .../docs/output/ttest_summary.csv | 2 + .../kinetic-timecourse/kinetics_timecourse.py | 215 +++++++++++++++ .../docs/input/multigroup_efficacy_data.xlsx | Bin 0 -> 5730 bytes .../docs/output/anova_bar_chart.png | Bin 0 -> 46250 bytes .../docs/output/anova_summary.csv | 2 + .../docs/output/descriptive_stats.csv | 6 + .../docs/output/tukey_pairwise.csv | 11 + .../multi-group-anova/multigroup_anova.py | 184 ++++++++++++ 17 files changed, 737 insertions(+) create mode 100644 examples/custom-code-AD/snippets/5-parameter-logistic/docs/input/dose_response_5pl_data.xlsx create mode 100644 examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/5pl_parameters.csv create mode 100644 examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/aggregated_data.csv create mode 100644 examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/dose_response_curve.png create mode 100644 examples/custom-code-AD/snippets/5-parameter-logistic/dose_response_5pl.py create mode 100644 examples/custom-code-AD/snippets/kinetic-timecourse/docs/input/timecourse_data.xlsx create mode 100644 examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/aggregated_kinetics.csv create mode 100644 examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/kinetic_curves.png create mode 100644 examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/kinetic_params.csv create mode 100644 examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/ttest_summary.csv create mode 100644 examples/custom-code-AD/snippets/kinetic-timecourse/kinetics_timecourse.py create mode 100644 examples/custom-code-AD/snippets/multi-group-anova/docs/input/multigroup_efficacy_data.xlsx create mode 100644 examples/custom-code-AD/snippets/multi-group-anova/docs/output/anova_bar_chart.png create mode 100644 examples/custom-code-AD/snippets/multi-group-anova/docs/output/anova_summary.csv create mode 100644 examples/custom-code-AD/snippets/multi-group-anova/docs/output/descriptive_stats.csv create mode 100644 examples/custom-code-AD/snippets/multi-group-anova/docs/output/tukey_pairwise.csv create mode 100644 examples/custom-code-AD/snippets/multi-group-anova/multigroup_anova.py diff --git a/examples/custom-code-AD/snippets/5-parameter-logistic/docs/input/dose_response_5pl_data.xlsx b/examples/custom-code-AD/snippets/5-parameter-logistic/docs/input/dose_response_5pl_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9804737927e8503129210dfbeca94e115e642b0e GIT binary patch literal 6007 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 Ig(Bep0I6_fu>b%7 literal 0 HcmV?d00001 diff --git a/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/5pl_parameters.csv b/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/5pl_parameters.csv new file mode 100644 index 0000000..7d2e650 --- /dev/null +++ b/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/5pl_parameters.csv @@ -0,0 +1,9 @@ +Parameter,Value,Std_Error,Note +Bottom (%),1.37,0.873, +Top (%),99.235,0.9498, +EC50 (µM),0.7516,0.2311, +Hill Slope,1.623,0.2467, +Asymmetry (F),0.775,0.2657,asym=1.0 → standard 4PL +R²,0.9994,, +AIC (5PL),11.69,, +ΔAIC vs 4PL,-1.31,,Positive = 5PL preferred diff --git a/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/aggregated_data.csv b/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/aggregated_data.csv new file mode 100644 index 0000000..91ff285 --- /dev/null +++ b/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/aggregated_data.csv @@ -0,0 +1,12 @@ +Concentration_uM,Mean_Inhibition,SD,N,SEM +0.001,2.4375,2.027,4,1.0135 +0.003,0.7925,0.9151,4,0.4576 +0.01,2.34,1.6329,4,0.8164 +0.03,2.2925,1.7193,4,0.8596 +0.1,8.165,2.0677,4,1.0338 +0.3,28.765,2.5523,4,1.2761 +1.0,67.31,2.2448,4,1.1224 +3.0,93.6675,2.1078,4,1.0539 +10.0,96.17,2.5479,4,1.2739 +30.0,99.835,3.1382,4,1.5691 +100.0,99.25,1.5948,4,0.7974 diff --git a/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/dose_response_curve.png b/examples/custom-code-AD/snippets/5-parameter-logistic/docs/output/dose_response_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..23bf8667b9ac1ec2d169db701176c762b22ff788 GIT binary patch literal 62120 zcmeGEg;yMH_B9OCxCD1^+#x`MTc8Of5F`-Xo#5_nja#tb5CRGA?j8sd65QS0^{u|| zncvKOYi51_z_V5_0+p_=t4^Kk$lm*OxRQblCOR2992^|x8(GMEI5-3_92~p`Dl%~7 zvumI|92^+#4dj)oyWV~#inFRTdFaylTRhoqS$rJS4?+>Y;u%}77QJLVvB8u(vhlR< zBqWq}D3!mU!~e2ErT=pEGU%)@^s8e%BNeX=83|6H=14 zpxnM`zCBh#ltFQ@VgAsT7Mt!yW%$&WCZucKb?sWmCwuf6E97)b^5El!QuA9u4K1y0 z0u|FWM;9*|@N*4UOGCo|X9X-~-FtjzOI>0Hk+W|U5pS*tQ;fSXb{29$WRqpVpE<(v ze``3vIa_@}DWd6d$}`AbCk|Guw!(Z;MV zvRJ65mVDi`X?}wE<=q+?^M?{R_@F?Co9w3wn1x#6GO=Hf(Nd$Tuz}Im zB4d0XF9=?bY6N)xVKchj?lHHDk~*>}2Nt-QV*1>}eQR2OvF(aP-;E?X8S}f*e$Hhd zRo)bYr;Eu-$3m(`A#M)L(}-?zT$!3de#FcHp`u^Ra>Z0wOBue(Y~TS+Qw=9_mW1f zWw{O+W3t1>k9Z`P;v|_l#+OEO`@-%-#r#J>amd8xGN0HJsDr#-NR8~LseFpO5*0`( znZbO?n$$I1DQdjd;=U8+!B)4jz0;0MLJ$~RWuA~g`-nSK-{Y`1LdUMtir}Z;8j`b& zV=|h6Ybr<76_@psCb=-&YM0lOs_&U~Sbibb>Zlxl&nlPdL&=wWT_N-S=|_dkc3Os$ zZ0)O!MnXBS9~*LlRc28(6D4#v?Tqm4BS)^8V4UJ8Q38}((*EkiDUejJ>M-4MU0;K~>{*^pW) zWVW-0z|%{>!=5Su&YHb>Iei=>YLCd+#oj!L4VijaV!l*fEzwarXy$t2m3(G96`MJ> zRLHL^Wc;|)8N?Hb`C1p5j2`yiJNLm!@7_hhqPj9wJ+CBRH*m0cnL=o zum(3-D^a$Zv9t1Qo8zIv&Ffb}I6s?WWfpZb$7}RVSWXWQMB+f)smt@X$`cPJ`dhd>lUH^i5v z*#Xv?A|}lvK`qC};ryO17XI>7I}TT!_|`W!sGc&6q~4Zsv7`pBrEEkRyJxGN ze4d$|mF1Ra1}kRW7<7K86tG{XQ1cbuf7;Smp2)jN{7Fh42ZRPVG?G|2q#pPE8D2D! zOo=X9XXUFCQ;OjG0MZ}JrpQ0_W_;wM8<*o;(h2wYvcSnG)JWo`e|X+e`2)#+Kh z;H96^quVk%`*p&s^;~hk7R{rovNEtX=|hRXwKg}mp3mU-cX!Y2detcAd5F_Q=Eo`~ zNT%oJjLs73$x%fve8bDNuv1p~YRn@wKyQwAqc*BT`!1Pg(faViTqP$w^=X*}2uwd- z#kC06m*CHF3JGcXGV;;N4qh-Yfw_C{9p?UA=hX}=OM-B18W4xJpGa5WU=^8!IpF=7 z@h6CQ*Y>E;z@4AXShRAl-2?=tyS6s0?j5g7bd2cQqN!); z3*E%$BGS|H;Pn=_65^ahUoE38wVuUsmKB=(EOXrN_N?uR@#%l=y7}>Uu`=l5yShYt zpvU^57I*(q|5J~DB?gV_{ag3oFqs^`6vplGGBGosdQz*p{n#l8LGRReo!5_?l?&-V zlGuY;=$d*)sGzRVLb08t&9Mfiri5H-s;ZyvZ+>e$o4qlCQR znQHfeu=`XgsC4DW%<*C=DJW%8&*)37XRl0D37TrZaq-g)qzHSJeEE8Qn{YcvClIk` zGgYJ3Vn({4tNdJF0ev9sESpLX4M=cl_&|cY!R#1f3g|(tITFWwns12}_tj(-k4XdJ zhU{i1vA}x?Yd3B#{pn>{+zG{t6TZqGFnuG*DpYrkE`BH!{Kjc&rT%C2n&@(5r}ub~ zIBODH=r_7%T2@xANk8bNVpjVnV?w#~&?{Spl&EmiclcW+y%94~@eGM~!puD-{y0RH zi2I%STPI?~Jaowt;Zh<3ktmLpBJAuU@cCakQiNT@DJyz@<)*F;^&u$L80bBV;kCl& zw^)3ds;3ZnOev|wneU}B;}xnc;xPB_IS~Wl3WtVkVk1##-MTK5adSo%Ob}s3;K<}2(Uks4Z|UxF zaz_h+cGVs^_z9B^)80*ykb_5medCiT$a=k670dDcsR;O zl}6oE6w@!{Mv!|({Mkvv@Q@t8{7hsKHpl7SN2>fqcjLLu(; zX5qT*N7a}6Unk6GJ`D{@F`HxNCNze z3UEROxSP4cX`o?pCmc=gN--?I`M&z2&X9+9hbsOHyHse6Se zUNgQmA6{@!A6M76Gj#`(J8wa{@tg_%irUJ~WYaZcCw54Q!W^!}T#Z=^SzNGO1s*z- zS%>&n!uSFQRg6|?=wJ$GL?w`e6O6va`a>7SA*G{@K61bIy^Io?{jLRJu|Aa?XaO5d zGp6L=9Z;cphRP_)1x9afa;R_!q7J-bS03}tPXlz=+3>yd`=;OE2DR-aSi>Qpu+f&0V9@GR?%FB6^bGdeEiJAv{ zFH>=wl0G&+A->!74ak_`UD;ssV_&L3iOG9@_f(BzM6O;LC1c&nmdqM%YN}qg6i?A} zCv3DUa_(XO=(f5X6$t2esETO+I$F>2PU zv{qdy!?>~$aIo)VfpPs6r(uvA-|-2EUkT50`Y3q`S_F*I`fhL?3SR_|myqW}~Gv{X$` zO^*1BTzWJzb@GniK6KSXF~ad5!byoL3+zJPXH`8HJseheiwN28sx>)K@Zd0F({u37 zU?Xp;`HoRZ`f50S{=$+2Oq+!>8ZG|7=|+h^b#d0TGguIn4eM2af+QX&NTA0vFJXUd zOD+4zRh)6&g-ujDV{?#^g6aj{R-8(w+29{*qfF!$+ zcJk~mWF(+Q3V5fhV`n_@ng4oqpeXvopLQ0e63hNomjb2fUoXorI3)Umb;}#q6qiY!qzXWy+CNe31k;QFj zYV(NndN1P+AqbSDTiG>9)KT#*qX|%dG_-f93P>sl2~{R#Wr3$LjE6#_LaT#bzKVxK zV+Korl;LLLbd@BYz2QHZCcwEEmX0OBv1#z~@W}m8tTvFwYhDFn0T0sh$ReOaUsW)Y zeuB@-67+gu2iz?Fs5lbD2c8AIo2DXBW2^ugk15EdRhD=refi)3J6bJs#t4M{lY143 z-%N3^6Okaon@kEB661N&jfir>Up~v^`CG)inDHlwGr_F{p;^53htFeCxaeg5>qCF@ z7W$Kf38om3h6y7bYSF&<7nv)7xUrnjp$-keRh$Ze10z&F z(}5@2bEXJV&X$0kLx6LT>O{su`;;ojzete{H~_53b+{2D*_9oW zFdW{9xe8dW$qXH^bg=<1;3maNVb*2=_Zb2gT(bw(y){Ax9GS`Yz+c8={}0Qq*&LhbQCx=ErK->f~SN#S5(+<_By8nEiCSaSY{dhz?CfHLF4gyvc@b{`_ zxncMCODSGnSwb%)n69-oIya6)gwtH&SxhQroP-GM@wd|ePYGWZq&x~UhSOnS0n8#i zgrIO_``tsf`76xVX6C}duV3dnW2u`sSG^=43+gTKCwaz!kSLJ{Y#l~lW2OJ|j2?ku z&0t%K!>_d9{-f)T#Xho`Uo)NJ?C_kflL8J`gdhD9(02Aqq7W2E^;p23foqoZIZVLT z%v%2S!xC6^8esW<`9gZ2KSV}mEes>p(9$wspYzh*t)`D7+du1O$Zk^qG@yP>IN0D9vu zx>mHP1*I$MwFG~3cr!Zi3T}L=kez5rY3Xw_gJySYpvw(HtDah(%nTby?nTJIt$kJC z*lUtrRAe!%S4ArR;7GB8i(91jjersB0MVdc`hIlK65`xj5OMG6F@3u5LP|;)~}sA2l#J$W(jBRs4*9&ASLxSQ7Cx6m)Ou zhE=!@`Lbt;p~hgjlJHrgMR;v?k7aQ@i^tA1elOwtI(ZkL8T{>akvd#^hrPh8W@n$4 z_tXz5BoI+DxTGVOVSR<__35H_km z1b;hBnxV8z=k}ZHGhyR|Fv%9OK{>qvGUBkLgwd(MUh_{>OpI72@D`^|KhOo)J6;(z zriTf9zDo56V4ysQOs+A*4rkT7dzBhHH923`^K)tW&(%aI^&@Za>j9hkkii0ABo(mT z8-cLK6AO*#%T(`dSfhkSak>tqcjA^^+U>FZj@f)@)%Dqq)Y3yqpin3^nyLIgw`FNM z5FWF(EIvBscVKyq6xw$;zc`7m`<<|>NGQwF^PYkNEtLmUO&rJ3jBR|kXngH3b3HAB zmEA&+#%tCAz&IzSYoJt-7G40d)A98^TH*a|DGa}L#T6FR%0Ww;ANBbuCr(yFQ?p|v zbP2uqZLmf%Q_pBG%R#xFS}#OeJh0LIc|{#hrzx(H?prd_%bkhB<((ZgV&W;22_jtF z=(uB90pTyLVap~cc1D;zcscrZZ4#T#bpsaWK~uQ#?_aZSzQxAwuen(I+}N(udyg=c zz~JqsS8Xy!QXHUfFCg|{M%+XE_DJ{=vpBqKCh^HDZ{wwg_Q}(R)~QKJjajVW^bmI5<=hy5cO{&GcPDzpS8v~A3+*z)54ER9-eRWHSk+Ms zx{^m*K%@h%JgdIEUs}E_1_whRoxJ(gE$Tg@Yxoo~dyAlJcJtfcZaId*3T!be_mtTt zbhZcTghvrGFZGn_b&tS|#TP6?8Bn;EuF4v93Rs|07FN!IAyK=QH zjD55~tC`yB4<(JuzRd3UdeqlV#4s971&1%4E{e4=}5g@jvk+E>>n>syDDs?pH2FL=|qnL5_JoKNq~my*Px zB!L$B!`&QhAKM292ZMQD5GY(;LWzjTNLkuEUOAi4Pf|CBi`$6?G2|H%Qbrpc`b(>- z?vFx=+G8beS`I7lq<7=v2euD6N0VNYlin!EpWJOJW(_PwYOGS@$~+45;Ki@3oa)3r zBVFwcCsmnmpa}@5fW{;rn3g;}&Ajb-yIOSPz;>-6+-G%SZ#Y|Y_50S>SOo7mAIxW~ zi61+293p`ol{amtmhMU(3!p$bnyo)9mi)**dMlG1e4hN&DCE5h&*w0Jc zs}(H&&JW`;f^MC^VhWPuN5sz)k0!3^^Hoaxfh4su<)@#MYraX}9P!vL(1Qy36bJQ( z>$!8I=!9Al@9tsj<$yW3y1y9zxo>#sU9v`;r6M6OR6yZP#%OQ}k4HolL&g#IgZ6Cm zf^BVjMvjEv>E)$eMtIbr?R3Q&KLFOcv8U0vc2@Prg)imW2k1B!FV@%tVbeU|ufpiB z^j8+s>}Eisu;dlOb=rXNil*YiD_~FEjxKXa&IIjJdVQi0dU}>v4d1!ASb>TbAgzSM z-W}EaOoK_XuCAh@2C<|BPEJna{%L8|{AR1imuvRvDdQ@W+{-sG_2?Y8@JQEhvHxJ} zB*pw8E|(;beQ9#eMDYk(ow&Q_9BwTSPanqvi@JAMS-qcb_Hgj<7~R;3d)L-b+#sbt zOz8_Er)-BZOKlfCf~_^@xl7#G{sMN{d3ezEBKZxk%9(I+aRXShlRh1RaCs7lV0n=J z@5BHUaY#M(^K{hW$?s{NJTB!Qg|}DeAYwkqxdZU<~K(c zGBO&4a#x#IPft4DW``k5y6|u-AfG~zXbl5oF)$z<@Z#s+ z0#8G#t-L77UeEdM;5L;B#GCZIsukt_qJWF(Wy%cXRT9|kQ9CvPVYOQBA9c%FB9mes zz>eCxylWFkg-;MV%*&#^-~AB$bjL*-Y%k&!imJSIEZNebSl`X+WTxTiF3W;SWJl@d z5D*=SVa;peUy#419WI-~d1=lD2SPhvd_i+oysfEM!k+i`GXQEIe%IdEp)t$IG^Ss zN#_&`39IJd5uRBMbpuy5P3L-4mXKW-Oh1o(kaD<_2D5Gq`k%S!uZH-Mw6T6hO36kZ zpd3IqcjVcJBgsS@PKDK6iT_dR`wcW3=z0Ohrm+N)c;EuWr8h^#!Y zJC3Q9uE(`2gh!AreJEWhp~ly`@th!9gqMbghYUA<{InolxLi!;;{FhM;Z~s30r!ZY z`uDYuQThG-iARucWy3Hn)OqkWN_#}nU3E?00 z2Qqb*3ISg|Lkdf@3awGYdEgOv<|pPIO?D%?8vT%E_dM%1EO%aJaEgS%YaE?SG7!}lb^0C=L}?q3LQ~H*);zWrek@DZK-2rIm*LM;eU|*m^g&Faq$VtbUP_e6@3Jt7ysa1uY%j#&k(Z ziM{I)o`~N{lE$`_fyxbg88^QIIq{*JSBZ?#uW+`&BJMpLbKZCR zrV4#$6XQ}LaHA6Gy@})>Yf`RN<>f7egJC9o|BjhF<`U*cqFi%}>vpxBx#5sekz%X9 z=9lrFYkKyb=tly5$5+Qg^Qc%*x4QmHUI-F80W%ywg0yxPs%%PUj@;j zI0NrzbXSb1^@)0qMy`ov3?LD8Vuh!;6 z{J?#icS1OHcQpys#ArzCziQ`5ge=i~7es{ldcHL7#fe6Sc{{k=G_{VEI~l(yy<*77 zlt1#FIB+$=|<#hoz$>9 zB$7X>U$De!EBV)oQa*Ce;fGK$-{w=2%w$T%mUN38C0F%(zFjscY^kGbqn(5zhJoD# zKE1Kx(U8=9|Dp^~Wo6y##IiLdfGIscn3w%3D>8N@?9RA|;H_kj+S0ZYz@Em_LI+ma zDi5ozefj#_@Nj@X3s4Q<*%xJx zG5-7F-dOox%j1TMjbZ?S!;7*rBxF~s2q`8mgPkVb28TV6*hnTOLK9za3Sq>a(_Y$v zAmB2JqW|eK2Z0~VC+!-X#UCBN1=p+|f(Z|fV*P8aaBIBWTFi)IV%`f-e4GrP?tHsJ zW9HB%?nE5MDcTdM9?)=vkBV(B+|VqLqm(7Tec_Sy;_1D3Qp>aP6u=)!K#dphS!ol4 zWO3%8Tt^HesXzWYZN4Z6x9@rrc7l|0YnYNtpGaZ!Zr2$91=s;w86a+uzidGTi&V>) zfjd0W1L4Z$A}eaJn@jYZR;5a@Uwxmo#(5N}pty9kbM42MYcfJyFVv4&>xg&K*nJ7{ zy`0)eCt0h-yYoGMd+LgTj@A1$6Q$Czn<``RER)9eCpI4=klj^)TJ4`e-r95i5ZZH! z2VZ$2g^8+0?s8p07D|xSBv=RxzRXacsiMhy&p@zq>PjkG1;QL#?r7&)SF7WQH1B46 zdfp%~vpmXFesYyRwXJt)~%3fb+f z<|2GtluS=zfD9sum+udoPlW3`t1ft=2JZ*)>1ho*{lk67259?aDvsTZ}XC;0!&t%WvPQ-#VXRCK0Zv>wP{u@ zD}gS`C_M8c^Ypan|2Z&K4t`ZVkq8 z>lLpb1xZPoDmRg&Z!tCAsLTBqqrmc59fsO_fCuhEc)oo@s*34;mwaNNu0GGAO+;k+ zBL@pKx3s=0uIYJK zT&W~cL;LL=1v-?EV#1LCT~=#E0ln`v=naTII$cTP1@h-E`+x8Qm??Q*;xtx&ioF2E z3(IndV%@hd)?DsslbqjE%+m!KgM!tIL)nnfa|{L(1~P?hxDwr$$)mIvUk$8&3~M=z zIX(C-@(ds=jNJR0&Lu$OA<33?1^%gKi$*f<{<$0TWPpXti`VE@AST%mQyE^AiH|+3 za;l~H+oH~&uKz~P%46o1-d1yPJyHH$JL4(^;-33`))fr_KA!$q%S8?} z9%1rhO-bVY$lIZ00vry@uk31CT#~Vk5fg=+G<$)h_U<=kENTs2uOS!YQ2mms9L-Ah z0RtnsRAw+svv{qwG-y15(Kue>6aY>KdEZWO0Pxv_6s*JJ1rT;yba*_^LkhijY4DM8 zIA|<2s)F-J(518dNg?gCdD!y@mG#s_$(O2S=tP zaL1VcBoh2&n+=d`7o+_D6dSKh*X;S5*OL8^JdA@f&wCIClii5a1QjylAwh7r1r}gA z%RF}T9dM(oHvq=32>xd)Ck~}OuXuhvk`X>;+)tk>tF4WAK?-fJ@}dnZ7WEG7GJWS6 z4Nt|W+4BxGe(0-cNsli3_Dv-vngzfs?9WuMHY^tl77mmvBGcL;kK^1UNo}JAPS>XanEUN5{Q8SFYgq-Z#QA^09mqSAye)PY{hn*?hMf*@d*& zg6Q0}|5Cu^5nT+>CMM#<0Rn3PSjF3TOC&kP=d!YH5ldcAWw4h;w>|d__jG-j6^UMi z7GBD;4%$CFGY;~71ihE|#Tur{AV|ohBJm!?#gXwAa7?6sI%fJTr-sp_)UYp&})33&C zw%If0Yfx>DQ8l8ikzYe(3(r{7IZRBa>pa79YOKW)ydNW~T4%q3@`V z77$wrA|z0tw7yE;4hO2fcRIrr{{gnB;Kp^lOUF5WxH|1BtuhO_>k6r`cNoWlki|d% zH=uCBi(60D?;W$#;^W_}Wh->!0gA2N_?H?Do+w!&XPwlKfevVjqI9(Yv95+D39X=DuO?Ibed2jvO4A1T=fW4>y5#SZ+A#-q+?iYeEZ>qae$i2aH*5`#EcMdMnKSqz5d9I zLFPh5XU@3$p`6+L6|3(8iq%%ENjNlHbY5gQTh?KbOD%L_-zU^v?PtE2S3hq&o8-} z4nNe@+gt?j(P-+rr-+|&OCuIVL~(%7ds;)g``7!H#q)!4k2qqOKum$ds!&5BVKwKm zjNcYu>eo&cU5*IiROx;T0u-jX$>)q^ViGJFVK(5@k9e`K5}0zdB)T~DdWsFZjZl&e zM<}KV#{DooPt{ZTw1HJ__0A*GH=1f_9R?E8fgP&J+>qA+0O23?E|_}zK@VkhSbu80 zOl8!^d))ZCUgM>?08hi$ZtOX~?%7fla9#Z$b7Xp3Oj#2XdUkep6H2JSqB;WYM-8H&NZ0lp}cnDP-gvJBDm<;A#QtUPwxy`IRdITuT>X_7gLw>;MF5)1nro`fz+h_1r){VjCl6 z7!7S^3r~w0dFB61%a7=h=41&WVRrQ_b-%Y1^yaYhZdC5c=pW@Ny9gH`I|r(HW{ig3 zJAS?c5kzw)uNTGYqOTdko;)c}?HPfNS3~E}WreDp4Ph6`PzUlr#8?e0U&_ z$=gMQgbe5oFQ1B77`)Ms83aH@@ppUjcR@5^gzLGU$aK6jM?C)ccuJdjdllx?>N%@Z zf%Y26+KQinX6ydwqrE_xnD@ozyKTW=L-o05@3wc3#GUrz0YB6Hk4jobb;r z4OCsSAT&W|R9{}R0gSVu&xEeVePH!Re&ONNyG~M^3pe0GqE43?|t3r{Z%9Z(d#=x7VQA z{rQkXunZ(etKfaAKn?!>!LPo0SKyj{0l>8YX--tPjvVMjzY_kHcKr_whr?Myg`er< zTY2(1K-G0i4+wUK?pN^bYIb;$e(tHi&Q^#vF<03v?FU-%jci@r45c~<4bZf5@H92A zbi|8Sxc^kx*W-OT6A&T;F^Zac3jl2(i5F(EN70LPTdS*`A1dmqBmtE*P?o_F+|ciE zi2xX5#AGXz@pujBy2c`4+BXFN5-`+k`ip#R#_HZgyY-y`Df#L|$@C&Rr{w90IK zV5%h(#S3V+!8#d~mF~A-Z>{s63VtZDPaz-DFC}YmM-y*OO=Q-D^mA6!XRZ5Agutko zC?2`m>7GR&8i&0|U(3iCpPwgPpZ&rVxjG4HPRID{r;7xjfI%T4NNP5-VM{TO0n|jX z@$9uC!+H`u(JJ)|s3lpv@V)4M&pZ$=)1qz?Z*zeiKi#s2Gif`+Wk*57)Xm88%3;)- zWVSja*<(zY2nk~6?3pbK8YkENu5ga=EG$2h(7J>}g|L5Kk*^P^rl0PEQV@`3&-sur zXuAWEHnT$M%d_G09xrqJNn#pDi>J1E+!@)~{dbez_TtA46fs9_PoOV~wH<5KpaB)1 zM*A^&CgS?`PGoAeH^w9f2?zBi9c|w6@(C}&aEgka>RY5Qy6xXiI zar`Ji%nINbT10;>pMS*v6gV_>w7gE8Qt2@$us)df^70-S+xYZt0UyvCyh@HDT|cTn z5R6D$vgv|~m7Yl77@fK?jp+8pHe(qAQuc2OJ+PS>rzZ#0!|J}vw?JE-vcFeHDFJ9h zmg5%*0p)WTRd;(*mvYTAx#6CeH6QDzQ%GTQt%_(}0|>C}h;Bm+Ad6q_DU-IZ@Z&8W z2c|u0EOm50TZDloln>4nH%g!aJ<(#8BU&E31tBmQ5(aF`{4GT*=9DDXK4{yX#00pE z3VY|^{s_W~;Z)`H$Qy}#AcZj{13mX5^lPev_P(S35jroTSa*0@PfFg3%>Dbz z*8c0JZi|fRTAbAxb_QPXDvkEA7z6_8S{!*TCVRE_3-M=jY(G#gasxW{{b{#nz>ri$ zO^rl37Up=thfFulOCSS2H|u+QU*$k#U9#jm;kPqub57liBdo6YY6Ea|VA^9nnvR54 z3BV4&$nT4~lacZ^GJ|ssSBmD{;X23`rjom(p;rOoEI1?5Ug!vlN* zrf!@y#y#gi&3|~l&pub-3`&kR!85{9_S6*U$9wMijj zg=Z9^s1Rv{+?9Cyia)NRU#O(Gi&Z4M@(qklL2Pmp%~QR)Vd6>^nUXzd*w z-ndFg)^*e68`|YBRnOc1~V?0BwxYR@~h7fdFIaY>^A z5y~`~M|fd=YwhB**49>s^?`W$(a}_HI#%_v3={Iw)ua)J0 z9X4lf7pe+I8}{lAS1pJU|nh<^6WzzHEDR zJ(czsSU0^cM=_WiqqTEU9k9W#6fOpWI4P#bz_`qO;my6wtyFw+7pfqX*z6%{jE&J~ zphD`81k4S^4|$#?;)j%9SlV%!lo-bmDP!FNpn6?1<1~x=3Lm)u84jeRIbG-pMRVK4 z*qEabt{F2kgtK(_hpEQja+S)-6nkX)v1xcbDkM3%j@h^ED8auMB{tpLm}k*3BLiD0 zkszjzQr)zs4`HdV`D>+~X+n#?Q5yMFFhlAmr0VkZTOktVhZU&kl10_L6vUhXLCwwI zXrBLYmy)D2G`AwXi!=W8Dpj)(H(nVU0dIZr$)?m^us~9xXSjEv*)5SG!hK8Ot(im( zbfRjCUekoq32OR&wXszrH+F*+UpctVXNg;2dPb7{&uxp2vOL)&>EVv<#ba-@U4R~hJ1 z0PF`)iRSH%X$sWaS+*4D-Oh^xc>2K4_#PTF6{C;xMn*fVVD7E(mTXg{EB+G$#7a6jNn9ws5cu$V9T<9JmJOwSB_t0L3?^t$=$%Z;rt zMcs}byD5N+@%YR@^D>|Tk?rOAxo`>~Y+g&Atp@(AMRXAtf7xts^NchQI+S8sn2gUv zYaD{!gxw)O3g}NS!k=)G4ZanA)s7AS=?~pFdT4&}O2}NMaa?gYcZgGC@Tb43ofwG| z)1{BOrt}0MI-kNHAJ|tTO-|ydRdgup z#VZl5OqM1cuT&hMrB2f0H;XP4@hrx-(_eu(gID#r)ehcU@WYyQAKt3Wf5sWF01%M( zO01tQy=5eNwpJV8x7->kU2PTt;CExx<9W9F$=YG}^!b9uPrUf)XVB@5kCzG5+&<23 zCa3n@`YBJnNBxhVT!f77)=I^xJAp>5!tEj5GcMH_iF&``pIU&~Kup=KeShCfaw|Tu z>TD1$z1x!~9vlCD$k860<;p?&11JemyO3 ze3YvO(%rmzC=xfz5-$i=Gii>zum`f16pas(5gJ^s;&mjCZr)J6DAp$hhFTR}XnWXy zE(V!{cR%i1+ZY-fhv+UTCQZ5B-hXIB+)u&ObF7oG<`D7eMAm70qy}bec zYvmw?B?F7mFsX{V_|qOQFbD%?f`l!ZvGm7ps^1d<27IR=Lp4;{`%Q2x%^aC z5QHxKL(}q40(>6fn~5l=%~7k=;{&prpMG7WL=!Ev2d{lD`gEPC#mK|zMmG3bW({9H z$O4}!__t6UUsblHq%3?VTJ36*{ivGVmgIpCx`-N=lgQ zvn@Jd*LuKL$Y`ctin6sSI2g$$z>zY2rwquOX~!Iz{z)x4=^{c}td&}vl_Wf8-e?Huh(W2Xl108*&;=jh)5|LK@SB(a}ORbcLJ%Tu!-{ zng#1u|NH5o%#zsiHE5tEKQ5FV9t#|bk5iMj9cCo3{%Qwy=l`X@0yOERNc2CZh!+oL zLAkjVBS{#CY-$$#8obdkz|0+noBo$+g7KKf$!3FAy$ZNaugd|@*K9t_x&k??|9_`( zW1X!>jL}hxc10>=t}k0h5=!09R7dlUVVA(#tYFySz<;9x98#H>z-`9;wCDSpf&y0? zLx!2@+UoxYwZ8(5M-yu&N_+$+2j0t#4Q# z5GexVy4dV`)%eX*^6y*?0A)CgmJL(T!AbWwzPw)C7Ioz0q|#wn(p4_lkzmgdf|C{- zOtdaZMb>w_M+Qb@6U2pp*3^1Xl0>|Lj>n^6aOvT0N$Ocz1qm=^yKG<=h9)JPcV8Hy zLZSbn#c>Ubaab=%+l}fkG0g51a?%e%FT1FTt#Tt^WY^(ooOgXR5dqL(Kmhp2cn&s^ zG--23_y~FhD0gvQU)Tk)lkyIXQj7S;d^?+31IEnb#}^27wWp+kez0X?s+(!iV!|B# z^Hh11SSHzyvuG1AbhrJMJ-QYKt)RksYuJ27Evuy8uUrK7Y>`)=k_dV1X6fsfHgYim zEQ622C0r6AYaeenJ){e`tHG)q*x_AdM5FB+paZ;HfHg@6c~_;JPf!J{f5=BHHR{9MTZ6 zF{pAdCWG#gKX(Nw9O|+6GsJ9)GUk{DeGeazM{NW+^mccjnq5)Si|;8i>3uK12&l5^ zKch_dV=zWS4#_ck5Swl?qJ@VK8nas0$#}eJo^IRZTtYwDyt+xe>#aKy8Nd*o^^0DL z&6K%hrvfZvJ|PdY4Ab8T88DskZ4nmUVzugmT_oW0GBV>$*Iu_dD>a`F0O3D6;464O z3=B5(dy4L$_Lc4Y^Kq`H4uU37Ym;uFL<7E}5(!DnZ`CpT-DpawTBadc_l_A{e<+f$ z^gDa0{h5&(U4dLh&$FJoR+&oIM`qG1ac=EnKcKPN6Gos#{L)7Z%mjYpfBjCI#+>Tb z%@XfONb%7D34n0A-8qA8ub@&b>$iK=CYnKsX?AES!HiXMSTF_>RdZ5wHa)#rUe!NVdGpL zM$+4hY--?-duoE`W8jN9j)HOXcerG23HEKI>HS0#HenIx! zLYumjT)p4wNy59{jEVE%49J}{JVq>OMHsj!Nc07oFV0|)9RFXSCxCIMG7;dM{OT+$ z)$V4cg&$Ajr5n2Cmt%IfkON{n$LJ@>9S$Nr$A~|@$&$-9`zKa4I6x{H2VeDfNAd$` zOjFn*-gFCfi?+&r#)(U1&_3!=1b{i!z03p>fY|6Vd5=ieh z8vfVl092iy)=YxOR6aIWRGZ%O7KZc8V2gK8alrv!t?6e0s(E_!n>a%=!RCZ) z=iC51kvLzl{U8`QcJco)_SJDwZe6$z-Q78qARtIL4h_v^4e2i@o0kQZ}!%Eud_eBM^(WVfG-bfhv?W61A58L#Ox5-dIz`{kt(WLNl{ zyG7i8nGuhs8jIbVH#$rI(ad8>W5L1@+hb04361hE`rm|E%7T{d0W)@-b%LZCm`EvC zPZ_^9_io2QJEX#}CN6RX0e85bH6)6f%pD|51Ssq6eNe>uqqA`5K^TMk4#kDvX$orj z;g7Jc>zLsxT56UKqj*mhCm*bY`W>d?$=+X6M~& z@$Aj0Y9OZ~X~jn`!>pA3Mf>eX0Px@}~~doXfJXdlXejjB4p| zIxrh6;5>DsFP3_opu67>NHa7=|I7UUqb^ct(|Fmd`@DNQq^nfU!flJ>koVP1Od_*Y zt~DxQqi+`dWg@`M<^z2AuQ=1I|Jf}1&bwfaE1ykFF5D$jLOW4E^|190T=yHNc0rN+ zY=@6Ts1)x#2QKO|P6nwgkxCbVbIaYPsjLT%`HUfz7<V^`9?KEB=a-eynn`@nP5yFZH2hUlIX$t}o(3}#ea5}8T; zE;Yq6L&2QI)7EhXl%gW1z_wn)%w{Jn;p%r$4JVNUABUc=Bc~r!W+#yV zE5eT;qu?)B^GDNQ#McGiGwch$GvdtL*6-(817&eoU8MeoV}0X-W?v2Mgd^U!)wv7{ zU0@C5VFII({L^TfIZ!?Vk`$23xNqZkF=pjcEc8o^TI(xv+s1WaPvCE~b#V}iP)|HL z$O!S2e>!^=uECeHNY{-Nk=OWpmyAOG@{TUu>=1AG9u4C$K6j<0j8er8sjGlbmMo5lIV7&1^>7 zE;xTZs5*=ws~-M>_GD>dUWp&|%-v22$nRTz5zad+;~<>tEA0UzACkMrCyJUYAz(U$ zb+t-Zf3-pDJ2Tj?z&HJ&_@W{!j{M&GP^=AoFH?hc0Mken;U~>kU|fK&qH#5{*!%oI z8TtrCkvI|bjacEjft}`bly}re4t@`uR+d~MDjIANc3KnP?S$@4d$OVJ+yNNXdIK`VB0H)7NYRl7 zW4IIYn2Vh`_!Zs3<~7JI1$TrQC<#mW|EK-zbIG1&h>3Dm{q}zId~NIm-JM zanZG-jsjSUD#t0WUXaK{5hu(^YJXk^?IL;Pb!n# zlGb|zCqp+!7~c5Z)kY-vy(;<3k?KHduQ#bdMTeQ0pHpRk({d9?5r zx;#swc*HUuBEEUyi{vs8zn!r3c44MCJ9pREsMc2i;B{wG2)J`Yt9LG%5EUsoMJU7+ zi-VkKsF$A4`iXaJ=E=tFr&D^vgyNBPn*PtXLCF7w4Ee~$>lxPsB(D1oy{KPs^52`Q z705LH1P&rpOdkkN-nAA?_K*=ZlpU~=3}?V~AY$&@E@ZvgxIo=@Q*3D^e6c=LYrTA@ zS>=o%dG-|OkWSR5jxY751NHO-ZF#3-vxCIqzay~p-s|Cj;a(vPrZYaYchKe6O%LDl zBCQ_ja=OTg_MPX6Jogza9AnfTd}?mxyV@17gH^7Ur~*k8Pi5sJAnc1^$xDRY!{#7Q zOq03vJOfbp2cJ{%hn2V^pcg;{<81W396fLxbq19LA_VAt|@|k2I<}umCl7f zirWbtUocxnS_uAD-@X}GAdH31imViXg0+Oe?ZG8Hp#FTCW?IHwVj}asJ&M23I!{q~ z^8KU)JrE{amN=5(AWGVG7GEI)Tr3RbGtwg?-WVx)_opKJ1(YPQ5!j30hMObL{8{Rs~O$mWeuufl>?Tlva&X$IEN|v#*f-M+*}rx zd~(~7XiuYx13PY?Z*wj;%(Lpq{0SL4cB2xwykR$E=@DKZGB~U`eKFf@DH-o~($}7O zt*K?3O;g>WrxVHgG%(9cSM^Lw1`S5Xq{cx`4F)e4o z+t#^!Y^$4^w>|V$j&3&%$768~dA@wp*I&-W+>b|!FHduVl7YICN@tnVG5Pi$ZF6wc z#o>{o3s6*0LJ7>Y6Sq4{_l!u|I) z!^RgcO!la3%;#ddiaOQ(86~b~62g8`NsgX+&CMLs*u<{Xep9KSv|gVXD4TZLoca`g z$Uwxz(g^zF*9@PcFlU3oL5v$pUk4Swf3&%0r_G`W-Hi~aJAdH`x}=v&swi;~23D`S zbYYTq-3-bwT*y0=QR`t`AE##1Ufkg+s|GHvI@PirmHN2ab16^L)!xqm8MF*X=Oxxe?gp6q4^>!(s z^O3(W^z!S62a!K|o|Wfm&{sC@OSe}#e*LIhz8qqdM%${+WAbrS0K_wPb`W9F)rW>g3WElo$MruDfT5Pr_GdH+E6JKZyRC7&Pk5fh z;?v||hv%~d(JKyEjxkiVeGT{NoSUB@Bl7O4U5rOrk(T(x3h~CGVutqIdPH^C8ZzNB zV<2c-&NA`(+*#q;|MNi>1r4VPWaNfwfff!z11bdCFGjF->%WJX2PAXUX1z zia#Bj!UwUx?7H>w`6-LdcZ+qGiFkVA%f+n3iiYF;MRQ-glM9i4LIz2y4-cvpa|R-Y z?wW_=?@TiB@)AHQSeXCAu z!!6;x*N({;0RIB|twlwtvcx@gHr^Z?HTVf_3}i&wz4FCS&k)v6kGV*YJj9|Ac0!a} zcR73`AtM^-mUMogs1HTS*4u9Q}n^RZE*IR%c5>W@WnKGVUMd(Le58&x`A)Z(g$YW^t|7m!GZ9uV$8*d)BUbkYJun1@r-v%V)q9`7VDw=i^10)u=KypRK4((I$L|z8;~yIQsNM67a9gH zHg7UZ%A_>&kvThzCg=LTnsAqyhbJB-H|nih3s5Xi33ynL+>wV-d@ut0JRLX5PQayj z`DJ`@b@j!f#R2UQhON+Cnh<(BzCD9*4%`Q8cmN58mgovJn9dgbUqqyA3=m8B@(a5x z6wh^to?{u@M`7k!0Ba02w5yN!S(B#oER_u^s}pp#PN^W_2LT zrPLKqKT={UK_}%`sRp?v#>8Z4XdYNK`f05^;LLrUKr36?&J1?GRglf;E!Msm4$l;I zL-9Y^Z9yfJgd0~m+?sR#ymixQ_EQ{6?q#J=K010k(XJXzGg>}2!UwZ^x^3BYsk9;T z`7z_y#gn^k{OGn7)U>HXSWC(F8R9@&%PR#~B|ojP1>jdDDuO%X8O@2_-=~%2@`b1W9lJ4IUALrJrNErZn^vVz1ZMKRxfA2M~k{4l+w1x-h~1~)4D&` z=rqm0e!zZE_)N6jT0<_9pd(iy=6O?09e(ZDWYx@{T7cSGO0~^FiT!rZNz<<%1MjnX z?M~%L#tZo#KD5!0g(=2T<;*o;V`IzorQCi|cgL#!E2HeE_Ovk8s5**0EalbCxN_%t z@k)nroOkcu^=4(?e((u6{OnH=m7vTRlBI&01{Z|*dbHddPs2QIQ1^6tjj01$%Z88< zo%Jgyf`Zx}`qq}H=YGQ-N{UvK264{8jDjax>G0<#SSd9=UTn~n68N}-{)8|0{f}rX z2L)eW`D+kkxe@d1C1#QnmET+ec4Q!g?L8CY$-OezCUrWOhlmi}^^$1ktq%)8bQQN- z-?uVVJl&g*>165@bDk5O3p|~-Uu+C~x2o%bDL;2fCFY*ry0V^XZm<`m1=D*m%O1i3 zmDa`}V1{EUlP2D<;`A&cBYIaeWHKh2+1D8+L$HDsU7?AS<$cwQk0=*7b*%>#({>yP3;-n2SD`PPeG zD@wp1i7+(tePe$+!l*3k*)xxpu)Ug90u%plRXnq)iYs;djk~7yWEeYfe?EKw|^#d6H)lV-U*zz*B}kGI)pD-+5?jrL_GIRdlJr0 zg*IF7=Y8TuAv@ogP|Jr>CcP9?Pwo zjfqKSn(f|hiswnvZ9@UK@vA=GCcV9fh+~QsqNBizgRU1{^)!O^T4R@YfeN;}TUqa& zjskUEB7V8>S|_bbm{FLt|B2JOTczzl`U?qGCa7#~1R-OIr~YGzI&Db>N(|I-z-~jPT2Vo&Kyu0i!CZZ z0TCW8hT~eAmcbrr^z3f^w6(SG@wkb=B;DB>>}9O->osBJ=~f2&^$>=#5jO%ah-n4+W`w62tB^DHv`C?+9sUQzd$`po*!w7ou-g8bG{EEzZW+qGOJI z%6!H^bXwy(8jZ4oE%k{F@(nE?@bSy#;amW77>5101}t~*TL(W-n#n<w_sD1X%LJmjc!nq#zEY z1T+$_nrD?ts?yR^L!R9#G$L=j-+2lzl)8Nj>Y%bksRS8Gc#{IOAtjI2FOLXE83XmO zE4_9Ro9x;3ualwu01t>X^Ka1;_> zyz6o`@%HqP6sjbYm5pv9x>w+ft|kIJ)SI{exgRDTn!)SjYmcX1qjff&-3-|obDJ;B zM95~Kik*4MD~0)t5z;z>QN|;kstJJ2WFVWy#4cn90NccE6&2|tHNED$6~Jy3i8sO|brwR- zb4I=ik?+BEiB9xx)Px)mOdk4y^ROF?eX0&iha+zL3^A~4zOe$i2A}0F%;=sk+WR)4 z0n|E98e72m{1+a!DV6nNYyh0!^GfPz2uj*}L!}Piqh34;(6@c+GgheGW`oZ0uMkcU z@@Vv3w!^4|NPU60@GvSsDML4q%VuUl&v)9JR!xEKWO+Y_7bdX~PgHTCx2Jv4ODzVO z@*Rh5AnwDa3{`2iMj1tGUrqWLssjWsYuSMFIs<~Nbpg%2Y0~&g!89wY#IlDfwJlbZ z#W&T{zY}v?Ygp^wzXdJ2vqd8h86jtvV1cB94dWp`^8z*y6!=Hx(rf#w+UxdcfrdT` zCmt0XVb<`3i-@sh6#vcJcn)Z~>lTR`WCWc>f(bH?hDS=&h|uzk>%|9?Xxg+@c|k{V z<&T(k79+}!pv9@Z2a{3W)t%p>9O~9Xf)*aRg8>8*wD;8MwPAwGqii4@!d3K=MJd7t zpge#$XZu$T9zbdG`Tk%%-uXr1`EV1&qoI#Bh;#|VGsT}--pq$dN+uuIc#L?6sTp7( zM**y9z(zmS6aa$Ar8GSQ@QG2iN($r=$)h6iC_0%1HRo;?!%%rfsiFXu*u_M7q&jM2Ms9FzjLKO){)qi?N5KaqxUri%Tx4}11b(1n*!y1mOELk zx1b#|R|lJUi0iM6>oEr|jZsVDo_a|eJVr%#sKKEmC1fM-fdGauL=J7OO><&(yjJy& z<*ppqoXD??=pw5hJApgGP%-3v}hr*mqz*TX|}*=DCba zLAu};rF;sEYEOBZ3H!M!cs#db9a*qRm-mqqz3!C)THTDb>R1jU*5!EqMKf=E;zKW` zm6;!Q&W8t%q3`$seM<6t&=L&9e_FH&_7#OhP8p_z5`l$?UnTrm0?b7d+}+f&DE#NOSBuUAaxm#M<++<1*ydeivV(MFui-y^FTp=>m67=jihKN7 z3!AFNOA$ibNV)qyJQS}T#cHrjac^5&fe(R^j%xyToy|9)`mmB3H=@S#hZL=CvZ`-h zy?hZGKhN03`+jKGai|SBdDv0WPYEQsH;YQ{EOnY*@JB=hdX10fx>8r+mWf3*NO^}$$(2JAE3WV#;G|8^9;-L`r) zl|EP(CYbr0j0nH%3Cf+VRtlY@=#nUxf8ytJW_)sh1436EFkR-(xu@5- z>MF|TIjHn=?Y%nD{;jRKM)Jke-E~sTx?H z^tHVZsY&p2BS;teOvZwF%I{SCl^tvhFOZB#AHm2IvjFlwI9()PB46|;+;A9|j2JR4 zlT_S1Cg6aYDFw*<*J+X`UPi{Rp4~bsI~uyYM^0mEK+78&Ky>V2m}>lDH&gNlqck?* zX#@UF<2m{`ry(~Gh~tHO9m(&MPJj74H7!oq_{R<1uHj%k<#7t+&P&h%MU`L+7|@R{w}6p=F@ljzjL zP0=|Op1op+%i^iy3lHUs10^=oxt$7PlhRib?|AJ6d=FWF?9J1rn&`CI1PcRfgH9kH zj#(FL0}nzQt-#S{lBBXl&Bhsa5xyGH4a%Vxt|KKjupaU}xZe_rhVm4i1I}|#gga0_ zDWRgPIZ5~X;F$L4)Lnrs)3ML_{1^-V70DI(@X9@5s*0Oof^!Pg45saTW@Q=!ryq)I>{ zq@DIy7)|Ig!I8(Rezhn0Pe3iZ-VaqQB%)sDBV@1?Ln-TzWLkIA;!kKg3SLtEGXF-@g$yEjJi; z-D~q3V&Po@`Fr%?w3C+&z4Dj79jlRDJ1Fa;)~ToVlb@qVbPov-l}}TW5D6ANr8gK` zl96sDUnFNgQm{ohqyWgWR3%Zosoob+5sm_R_9cy_ex38byUYNH=pV*k7E}!aH+I%@*$0_&A zw$CdzLzoc|3U?e39fu&rPDS#gzEEssFE3#YKxwL)y*ixIzu2AbynzYEdSd|IOxpWT zJOR)@tl_j-yWhv3`f4GVO746y>Oo0U=kR>#y_BYWIJfbE5CxBUq*y7!w5*s408znW zb5c!$Z>ywspph(y8tL9Jli_Q{CQ<#9=7!L&SRj&rUphf93Z|-(7Z{4?!F|vjYqP+@ z{)ljeYZL<#>kv$;oZTv=$9p(J^QIZYr=dz_6J*Fwu_R?{}9W` z{{+e*P7|e?N`qP}Z-9f~vjPAAtHyug4je36V2w@CCE(VK*|bqkqgx*Vo#+!f7fpKV zDgEyjfHNmts-1q0vT{?DFvGMTMW@UfQ%5Pw7vdQH6qR_Sq9C%e*BJ~au8%ONjtBdn zqc;!2un;FkG91W>ak^XD*zX)vg-;z%LJ*VG)%GTYno?ejMfxR$eGgH}NkK3wLc*!0 zw0$@k1qJg??N_buASit_PWpb(g@uEAMDvhG_LRnWUL2fpgpQ{Y8PRwll`<$!f_?ZL zo0dfe^0}m7S!6_ON<&{ONRXEO;Cn8d^$71j6N$8!tJ$j4Pw z&jM4LmaXn!`=|l_n@`qS0=bvSl=;GnJTd$3&l^H_f5IR%LFeBPbo}j9H8u~|LGip- z27Dsx&(MN{$esjl1O^7W@#{H7fqc>)G*bZ+mKnGS(sah=DJw?98L)=B8{^ z2CKzo-dW-?`lwu&9f_=pct6mA&9QZPu`V$H6zxA3@Rl4r{BPpnJOh5=%a41m<8FaX z5F*BbrOv6uRNhM6(`{UKV;Yx|GdP|>2xo%FG!|0C%;nvp1L?tKA|v93d5(a>^M63o z-*@x;864|O^wrA*gYjHqYMR(*_s@Qwxzfyx$IGc{U?iWPpyS{Yn^fFfSqz$`O5?21 zf$4>eip7HA7Fy)<+Auws6&Cg;(B|Z_sIh#`g?ASqFV|c)+S<`w&0H@h(d3VZi7wvI z85$JFGHe*p_U%_Ob5)My@N(U^&7;LHpQM3zKZv^zVBdnKC;86(HY_g~N;()JEVz8w zU;*|o{rCP+LV7sMERPp^5FaC6KU!DTE3#2f`5=fkNV7Jf`55LC|u zt;L!r+D%UeX#5{JEnrUb4hH}{z4-i}-y~iQ*ePhMxf+cwq-8Wf+wN=9$h~spWpdv) z@15jqJZ0z~FQP_CMzO;3Qda>>{70_M0WH!#vxS1AF-3-!^BB03RAR`GH+@&NM1sZQ z!4vf7<5r3Z!-A4meI)Dqmeq41g@i4W$Te;sG18BiMVc->}l zIp@A6E$VO_pfW^WZw&(~164lG6#Nv5wJ5d^IM@{?SY8Hj5{AINX4l@u>P}`PT#8b- zOBrhINoIAq{HAPUoq3urVs_`G_0ugWB60CeAGCZY%JoXxnvNS{$aD)8BDk_XjGTLB`--kWHE2{u5Pj zK!eP{0FMh4WYj;!gxtS8*TxGt?>8oNtIs~7Pp4bRyYL-moB!_UL%u$wWP8kyu@rnC zyc{Lxr#>5K$Z5@Y1P5lAxf_dS0`%WC@@un54&yinMC(056y{E&;CA;lvZ>*g#M-E+U@az zrPXfCci3MY_~YaY>1SBouW+{45rNF78_3NXyLC28@B;tAUysHEpx8f&3t$vq*+C=H zAO0A4kc;usyH*JdkYWQ?ZlfCy9+FW!z8jAb1zznFali`&V7>i z(>B#5cQB1M74d`+jJS(`PM>^ZA8ykB70H-+A_K&ED13^5p?ym`Z%Iuv^6X$O zTNnz@m%O;+gh{~R8n2!iMPX=Ca#1_H-2PdrV7StqwMgMX+|#eN20XIfq?wTefDA=> zk_RTn$<1%B+yab3R&B1L zw+)jL`bapbPzOW7a}qB34g=@`krc@Q;Q+16mUZbS2nQKU0dGK-AH?>1aUbDidkb-2 z+9J8MxYaY5y|(q%hlC?ZRbHYOQqVi#mGOUcr{vD&RC*T*46+n}lYa{VMR3uhLsy69 z8=}e2h{+h@qmMRP$m}i*>elrUF~f0U!Br36!0mJ1Xo9x|F~;wPqm2PeFJxQKL()j$ zzb*YeN;2PL8u!U!ZMgg&xU{o*BoWLcgrvv-vgT|Fc`*ME*)&Iq&KlfDk>Bt=1cl|t z_IqLh=S)5eLECj6BbukwL?Dz9{yTCAREN<$dZg^P1W9xEu*4-)8Yh&7X+6y6v#3Wp z#RjbE%o6Yy|4QS5^&kBLPK+`U>BLIG#JiC^%j<6<=<-t@Lrg`c64tMM!~m(=2k+Z_ z1wQg$g5e*r5+n~n$K?EGf%;FihTr1zP~Tmkf;uCY>m2e7WPQxUC&BNK=Yo7vEFVbE z09W&u()zeXuYCn$KZ@eV{r~e zwx|dAi9RG;nKMLd589AJ^l7TppbH3hg4e#AEyn5nF{CVFn2H+A!BrbW$SB8yN z569Z_ISPGIv)bvUj7ZRyU;RL6u##aTpvA1L|gG>>s|5{`PFQ?gs%S zg>4q51sHMU>f4a+V=>jYIak8=>!d~o`|>1`-pB1%K(V>_{NHGoQ*=m=NhOxp(O0f# zgxfRZQ7lR{sDMQS;X)2hlCBG5h4CbX`~?=3qkdgqbxHrAmBwByNqaZ<51N7GY(I(h zNu3K`(0wUNOM_KLpmFQI#su8b(40M_JX`dsZs0j5X*E0R>uvvi2*v94rGFiXN!Z@w z);FifxcFbw>h?Vz8tjqFX5!6x@Ku=V$>N7zZ)0!T*!!drIqETeFPhl@5S2~+*y3*Q zke3axr}kZ=6t@sYXPTmWxONAHv-%768pRYbg9AaKFRj%5mN^n9ok8!Hkpd!=_Y?4+ zuKsjmdmO$cU|C{r{)H$cBxH$& zroq!;qGvhQ6^D!IITtTY02J&FE)EYsaxWl>)7kSu;9|HTB%q|71oCwg>d%`}>rt8a zU{t<{MXl%@jEuO;VZr35yK@8uq~YNNVTYLEdOy&^2^1>TlfkXqcrqnith?dhTXt7= zZ@0vE!K&X%4%b}t)71qkD13&2X+EiK#MTs)wiKbfy(UOmQ8#ZH3u`+X(2E({JodtD z-^Y>-iMzaS%*1Upllc;X7Rw5QKwP(%znX|E3GOU!6M# z1YbeaKe18(XKn50mE%6CvVktU@xX=2?#$h$^|v%;?b&jULdKt3fKD~Du3{iFVo~Gu z>`*GJNBflN4CG>elpIjZVDVX^;h2oU3e)I2EoLGVS@tU@dM+idQ4`LWL2Yk1N#`S-1YSYj?zI_U+gH#Fc|Pa=r!)awLVtMq_Az)B zFfK2*-@*)JD8Yxws}A*cgmOh z&XKha`t3vM;jg=ut#6ii7yw#cK#TW@6663y4?vT`er1$(BH%#|PAfnmt|}Ytws|%=b)K6d9`Df~a^l=ZpDoKE98HNXeaF1D_hj&N!XF z=jZfqMvag3J~m*FTYBuR!qHgDEq>|F4tPtt;2)L(&rpd+`9M-Hab6|d0p>2dE`y!R$t zF;9_+m9;&s$B&PTGRL2|M8g!cX`sBzp+yn|cx(`Q02iOY?H__>2r#_?cvb%gF#fk1 z3VSnEz3s^~!t(Rjq(sETmi_V#nJ-XQY?{TNAX{&8J9$7I{V882nj|pD1ESX>1K`VC zzt1=WCHcIAvO7&o_od!8Tk7k>%14N(C_dX{5@ejjPLxsuDIn2nTJQ~Lm^CTMcQ{A^ zQGFUgAZBjDK|WRk8+1B`g30kJz()4|!2u$h50ww{c~$?B{yGhSm!9D8z{~FbaLNC8 z{5^a~kI%6_2p})`Uxo~885L+KwA!Rn3y3ie+=KAFy#u}lUXk}NQPRW(qT;`dzUDHW ztJcmyhc~-9QaF+m%18Pv^F^J73dWwII1Yk#Skg%rtR0&146X>W&$#A*+knt*Vn#0J zn1skqgFq)ch$g(wo9h`?bbQ3)F%G@Q^D}8G)QKQq;=@b$Kz_(_haObK#9rI-8O1ANG?| z7i0?|qkJH@WKr`{K;cAY3$Vj=FrMRL`*(nnhdKG5uKY;jbG5bQM6CwX*wWlqi5^zb z2oT@x?N!+9Bm)ugf5h%OE+~4_RWv9SE%o>5Vm$sfhCO24MI!*Y+mGCR`~SK7bM%m& z^9|bkrVIBG3l_f7Hq!>fW=|x}99gEg|d0}6Dn(|<{(8avH zy`4(Hm9g(0W`7M3&?1JOxG>gU6@lLoS9j$X6go= zii)!TnGM<1fzrsNuEQAoTMOn$C4fyB{z<=C9vqeb;X!Kq2@Ae1r?NakUvPTm=lCW`7LD>Tcy+&>z5}A)u0#}=GHc0x?=*Oze?o?_ROTkBCMjM653+v4$ zYjW9&p?ae`fKMFJlzgfy?vtieOVb?1J zLW~Y_z&^l`6S|E^-H#)y$1ZMbW7H#sI%(l`qgS%mUnHV2EWS+7&-VVY>|YyJ#e# z^KY?XpTC+>IyS#{zxCovid9t52P0ZimIo`Z*XMB2>xAD$_=eVumsE2Cr$jM*cn;ji zU%czz>wVs7vsagt_i-tp!C&55VQWmh3zhp|Y-w#qMsckxd8(g!(_*?zV}W{DVFtvw z!^>8XNlhYafWK?TmPT*CG$wbNji`^K zO{#uGnmIk)A>QjSf)YGYO86i^a(nzerc(I5n)51`BwY(Gq2(%k&eb-i$=bVVHy-zx zmIX9@|Gx~P;CQH7?0Z)aH=TG^3@EHQbcN^0SfQtdgj_sPyb=Je;FB@=#R=`4Y{LJbkx)1UpvG>vyZ!DV&&c4`5nfK^to+kQtQeb&MkMvl5zqXbn`f=JXCcB zi-Mf_K7S(SGrkSsku_Akw+J%zM#=FXiV$tNC_dKLj35~e;(l}T<1AaHkeoKYmpG?P zEORO~J=8*%sHCVRhTnxU1Z5@Nb$KwW`~2j=THq-?NZLAR(89x+fbR(N+(uJSO99|2bm5Mq~}|vSl^MX zm$T?PP}>!I5$9Tg{dNf|_?{%3Gbv|5<*i)lyV~%d%ZqwxYBwK#oh2ft2sx>;@+2mn zU1)H9XqRWvMX(llguknlV0LGvl2bp?q?7@;G{qePdaVz}Lh2R2wp?k76eCuW)5@43 z*x16BZH;7tr6l1su8ruXq*{P8D|wN2;e(7!z;u4+hyak3UDcynsf~mMJY1U{{&x{Z0+G$wOWg*$)TnyFKZes+0=<1`=7kl zx~O(x#JRqr{ShMC{3V*U5be0S7Atfira#&$2gW zD@ub0RIXC_3BJpfOz)6GzFS?`Oi>=>c3Muyi{<7fM{P?SiQD~;J`jA|j5EYXF zZtjPcnj+ic?7{BS$jhD*(wba9!LS<);#r{)`neX~;@bA!xi;e**%{3(VL*;l>W@ygncLSHEi zV>R0E#qfJmsksT|S$cG8Qc`cipqY$Vq1merLVpd;1aqMxh8Wrh!%HOPV~`N~=1-8|f2`kD7a7gN}Nf!rf3LSZJMp@?W=rcEso zGhae1!hI4@-q=69{T^9L{W~}s0J?S||AF7)-|lPi)p%sk zu6sNF`wjpTXiYkM@P6)PKa4&5Nl7Q|yH|af%BpDT+~hc%?^oHMV?U^WSfX1g#b~KP z+e#-KCV@k|&7pU7^#eaO$1E0oWiRZ|JV-iIOw8^oGvob5(`^abv#l*ykaP$RPW08H zo>8H%2^;NHXlN26@zaa%uKD4L&<>KP$6Lgr)O7J{*ZHe@-)nED2Odb?A_N+sRbBZl zP;4MnaybEE{wA`1{264flz<-mIep*ltdP9BpDU=`Smf7SbfQ)yeyU+it3b6dI$gYg zqXHd4dq*dVM!})o!L>$R!_;EO&KwzXNt#VKgnZ@!!=E6WvrTgYLPdW+4VZ6t65>k>PL&O?r~oB3SkB+LPdDxBze$yd87QK)c?V@G6jQC%EUdlK z#WR!R-e;SKSIk=ISFT$PG!mlja1&t5Bu?WY9vgLl>c5z>$y7{J%=PvDQ19g6xnFtO zwH2?u9sez#AB*_>VNPmgv9o_b1IFx2(y&6n}-$M^ax$AgzXcm^}GFGgS~LG~mXXbBMP zuH2i$g)}s#Br&f^D8H^S*ROSW_r!RxZCv2~te`yjYPyy>F@$a|vA+_$@HQ~*be=&p zq#e~z>&iTK970Mbvy#Jo@D&>Sx#|`}O-Um&ZZDPKRp%nt>!BSz#3H?b2=tcF*ATti zJFFJ#-!&E(LN=}#{k#Ple|=Ma_wCC2a@}Y9u8w@F=jiVgU%1(F1lfLZct+ZY>XLr4G zOU{?{l-!fl)n+~#Q4#UlV7E5B^JA9*|Ki7NLaVWr4?K|v6Yx))Gc`qhqIoEzM@~~- zlBniaepuIZ>I#-Q_{7T;l}+`W>66i2RaL98G{!G|JJJ@f4{iiad7?$?4kDfz`7CUX z-t(z%dm}AkW{BE5SkXpf6*ApVN%YxDf8n%1Gb7}c)V|EIDv#TA-29%rSq>_(!Q$eF z!S#n198j*w2v^5DYLeq`^glFjXng|rUP^Ax*2K8yWw!<311Qn$|JJF?{47~_1jyQ* zem$XBv0`@PlmgwLnzocnFk^xly%-s<9Qqtv(hzkSql$ep@$q;i1mWe_uX7&^zk!9N zg17@i@)u7=X6@!G2L({WIvG-G@MS}!xO zKR4&Uk*wXx-mrFSCPg~)eTndNzU4xSM>0?6qX1~_b?GxUh~l>rUEc^eJEAwL@il+R zcUtu!hTTQVBeEwoL2j#7G%-DbA>gY#@c-sIo9sI#jcNkuH|m+eJEyJMYea_2g489& zDibs_#i+%EjY2{#s(xMx%#a#fM=_pe%KItuSmhSm2j91e-JWS?7j>Wx^U*Le!Ru1^ zb;Y74d-aL#p6)_vvb6_Pm>cbzLkDNVx3gK01)B5y0gkQHz>5Z!2aBJA84fGCC;yAa zC5j>MSS7xKLhXDnlb%OKykHK5WIwPbLP<_CMHt;BN~|F5=l(y;y>(QS?bkobz|aaq zNyE_HN=OaTof1+C0)o;=$ACzeNGhSUlyrADf}k`~(%nd$i|6~i>wTVgy}xtLALoy= z)~v-1kM-wn~ASbfy=ujn2?fn8G7mT8AI zV}~>gkbyK{M(nL+({pz526{wq`i(GXBMqxP>KgAaeBwKHfz{LPoM zahwRf!|-|kPU8QvHNLGvxZndtk-H;VibOK={jtn#IH2q{9PnR0|389GpeF;h zSjLhGa~q+ki(F;kj?a_dL6vT^*M|bPf$+a@L$|#F!__@%2wLADn*h4ZDG-Z-zMLV3 z*+tPLB;`4sNt+a%1EOT@}r!7zqDC$SrTIYX^2^%VYZd#MEoGH~WCl56 zh_SC)8dL%K->+rh_4KR^zG6h6{`U*^4Fu-?PuCjTR1N=l)diqt15T&kX|47LOBS-8H7CICG zESJ!XC{E+tWzH+q|eX1 zcxX0u_SHlKHIb=d$XJESjE6P=9x4slv|~ghMTq~2W=$uV_Y(|9&A68mRC6%&OfOx4 zVifBA!b9>@;^GzBZytllNgjN8cYRj5Mq$iB3gg?X$ru{!?d> zpx;Ne%4~4<>wRKk;(Q4=Wmln<$mkeT4N#ueYVcA)&5owH!I~FchC?`VKRdPEM$+nj z4$j)%sPB$A@0Nv&-A_UvubEFJ=YJ<>SBleF(v=~1KfGswklc0$?ji7eIow%8gs*t5 znu}g9xSqEAY~)JW2b$M#w(*$IL3y5K|1VH?TCGom%eWk;=`ojtXZaa52~JOKKDWX7 z-2}gVf{P*r?f8GxY#P-Zwm5u8w{AA73c*l1ki>zjJ$-iI4?C$a)LN`z5eEl55HC#zC{~ zXEmZ=w;@0gEjdOlg^pM9 zs3OLEhw}Pc^2(rDud7@8h_Gy*7!@Ow{u>#tpd_(>Po(-MWL+)p!@+VY~URnO3Rmv2$Cjdwf3@b&*Z#^|mq*tTJ6- zgP&Ik#=5;~@^?CzRa7o)=_A)PpWT%AD>xsR8kF|j`l0DnSNZ({WM z@&Nes&osgQNR!xlYZMMT5tEhicLv z>^(_fhKK8VN51X<`D}>8jFgi@F2V~9@HOaEnUMxhrGN34e=ooc83ws5v87z)m!&8d zk*AWfN;VHEgz_>uLkf&D!$wahx6zsn1T$InJoXpuy360ME_B=a!RZIWB-~7+v8nrZNs(Z%YvHJ&!x$~?v3H%oNp*`2AJ+Or5W*G%h(WWF6=;`!?mG{E7L7Y7TMOC0YqN84flkS;L>0G0n)!+BtNYIcWeg6{gt zeBy+VKk&s9w43xFOdn)_g30fIwx0v%}x<<0s6c~ExOLI-^ zcS{r+)stU&&Sn`Pnyz<9UtO%b-M7=gbmV&n?1U=0)r&mz^afEH%W}mp8j6s0NpHd^ zD)lY~{F$hZuu@_7GvV9ve*Aei%DUHfOY)CbG=Ok`3F5woN*oiO9h-uQ9fKh7FGoE9 z_7hGgfniN-qs~?qsi8t|2lkvhlA30sTsX0OD`!t$D zqpVX;_Y|k@g+WDi;!MuxvRF#iZipS)hf=kM`{x0AFw08fN)7;Rni7R)$Gf%v-X^;^ zQYmzI6XP!M>P1J5eg83EU1C^He)HY3Yv}HsW#G!^PSBx<=dJx=sQ)SdHYsSOz@YTnD1#(J$;{}XH4w%b(rSEI@=SJKeb^K<04lC=hdXlj1pN;>ta^2sU zs6x+Y?2=w4aMO@TIwl6q_47xD@N9`VK($xBBWV4u&;;wL0gaf2=;FxDrm;!}cinp= z(SMZdo&iwb>0Ea)m`u^+W zAv?FHH=oTXE~e+*uNq16OjijTB+a+bQJqdka%00sWdlGwDJ}hi=C-8nHLW^F!p&tR zU<=A!s;duL_$*QVYd^S-v@=w8=M+CxzZjWvcc`DI1(bCyeH@(LKgoDZcJPb(Z2pZ~ zO^N{8-?|K84;tARS|$kwx*a=?8D8swz9#ToEQ%@nmZFF~yuI`7)v1P+2U$ToKwO@wG#=dG(FLDn| zN{h)cL9ZacLu*oDSne1?t9J_l~4(ZzN@vfSSa=7FSa5UT%1i+ip#1>OrNkA9c$CPm?xHY2D}c__diO zY_QHLjf)#m9ZTN{JFG!Xyxc?pNKez?m+=(6%ZSO$EZOKTp3!tpGChI4PYI#lwz$q# zeX@=2#DLH4D~Slq?Y3Ghlp`oO+sYe#n zVH1&?TcwNryS#1->{(eknQD>wYrdPW^~;~FG0gF&)zGDSynI84Zo^`pVL3a-Q4@LUboCgn&>vvo{+cmWU^+iI@Fo4* zrD-7oQmDRG%Jpxb2+0h-{;LS>U(VJqY~by%98Dzr`z8n?@HMkh6N%ANXE@_TpfhFg z#g8-YA0x!X51(T585e#(ob*^BeF#(98QqlL8GXlreJ;X~UQdMhJP1+dm7HJsZqKRDuy>a1QqFm`j@Eo*sPF)ET!-Hj_%~h6btt*#!2@6(&op3(XOP2OLy|%L|hi`W$9cG%)a-aoYYO>SUePu z3jds)AT5o_qi&o9LpZ&P5PNIBTK zm(v^CPqyPt95Q1}&|_GC?<9+ncxO5|rtbB#?NRjKeeuQ*4r_N00q=@Zn|#S%5nsjI zi0_Vl!ws8m(H}^;iRYci?46{t!3LdzgpVUq6UD zivIkc57#Z?Zre|utE4{Ja0#HNk2&jQvB}vG-~*^!rQ4YoEyuX6`k?)pifX2^&kFBy zI1R>qX5Qm2R3PavoFafJvZ5e&nIeK!Z1}VOlgk#Mb74@qYYgaIZfn8*F5qGS1zZuI z)xquRC5^BsrMv14uKfS311`+7Kf4wIA*uZ636_HmxJun~0RGuF_6^h$i9T-WsG+TJxCcarz9n)wgTS{6C6?zr2_F4MM z<|;Uk8NH)^_5LonHqk)w*KH6%Qi2u?*x%2u1<#KRHf z9}^qi*qp&V-3=C@gXHw|Xt8{(x4etvx+8Pc^DeDDW(-hG5Uvq|3XLuYpcrnE&r5aS zxokAI(%a-q_v#MGuGO){PVMH;%%_{WGSSqA+#xgL1q4%7w#l)JK4DXU7^7l;lmn2= zkSd-?gP0M}W&#J3SYQgW!7(@Ovxz)l3g}r1c%0Si_T?CT_t66eEJb)3Ej}X^PzOcf zT}Vq^LX_Jle+OaUzom5rNNY$>??%B)XQrN6Zb2;W@QTL1-94NTxATN?(cAg@kLK%$ z-UO+H9QVJ(Yy))p{<1}*ehul?Tx5zxe_WBL&lL~^Z934LndAq&pmmouKqs1q$pg9m z)9D0yD1KUgLGL#Gj)7ONIO5ZaECJ{xR-^BydZzBXuSi%zx@!zMe1moxwOhc1GL zGA>&lKiDy#_5Rer-tcI?>4Vfn6s`P8FfF}j2iBmig&+v>XZdiG-j3=3MG{yazWTQk ztpQe2&s-Jt=VNZ!wd};UsmcP{p$^Gl70@NSCRaKmnzt$H68>jy8v}h>zS{OcA%P_q z0a<;fYr1HsuGF?pzz_qf?Ssn?wgFztd_(%b7k^)!UzMf6obe@-Zj+>x1@3O(N}<00 z0AREHwM_qi}VBvb3!uea#gx95u#Rp*qsmj=R-XrAbq5u@e)n9r~=kcvvUB6^T zQHT&eYam)Y_5%#!Um3U``12TJCCb8Yby(bCII@F;1E%vifDdJMU;}@qQjN>49V2OJ z$>*e)7+vP2>~Sc_+x&$OrvQz85QhTj;wZrm(^|4E+*j+f*x*p> zjExI$7RgcvE8({{fbYZUC(`Qi@UzbPrN`Z#3?-ZpN8!eIMMo02e)IknPEf|JC{fLY zck;`3SrG!+mLzcIwt!EcP|%-#tI!s}g;84bvDVjBkZb3_{bqk!V05b_2gKxDSKjL& zt+7%`yQAEHuf$|t)|gI5#$woy77I^GCS8I(Vef7 zrD2maASYM3tTiL^Vop#7q`DqnBkbelJ|MS~Z{A3tpMXpOP&c_ctv@b1bJ){|>ha0L zV@otiUgvZ8+SW)$CMV$(-u>J_#;MiOkZ`o}Xy_nxC{?c!Pw(_hsU#rbvW0ySbD%I38@;5_pyr0CxI z3f2uf$0`RZy~LWp?*YxK1#vIHM#kVd#u`{htaG8Vp$!iEU}D~3>yyXXwdqDIcEf_X6 z2z=3OP*UrCAG>>6G-hL1N%H!U z{s`8YUS3Qmv+EF*4B#+j<4_k;gJh@%%|3&t5YXbMm+)f82v>4nwV_u}yQGQM@3hP& zvuLFlG2@-VcpQ(kW@M3BG$H{>ith`}oVzm@*bqkt*q>E!pxHdA?S4kiAc2`o4y!if-N`+Y4(faBzL!K1c z$JfVNQXD%Y(n0VFH~TZmgOGmB5DVvbM9eMKF4l?DvF0ttP=&3nNrm(KH`1gt+Y{C} zFcEc@%@`y<)P(_&W+Q>(+;!Tnt*#^2e$rm@s*6{LT@Pp1b}Br5$fV^`5iLG+;*Do1 zGeX9l&D00I8IuN?gkhx#&JzhaP+2+38%Ine*zfN)pf%%=z|OYHtMZka)#vI-t*wUX z%_evajw_3^&`+~~7G9qb3B;$)S33K>_9E%4v9|114|We|+))UDNCMhw)ZlDXY7WY~ zLzgl>4J>ELM!CZP3%LUqkN2J49qcFCXyp z^YgxT;dwQAh<>kdCM?q{p^oXP-b3RUl->%CxuKxrooywdhWy=uMxg~+h6TOWMnU~L zuZ%Gotp0^~-*v*vzPg{KbxwUfQDwH$L;F{s3rR1u zg-p4eD%jA~L~3g873hyx48*M^3BZ*!p3^eIqmg#do;7O@O~6QC{d)-{C)XzYaCVxj zg^MqJq^C&vw;unQFLE*9LF8A*1rTF)(E(A1{hW#5Q86z z1s^}X*`Y_sz^VaZjmY%8?7n~_zxhI~bGce8p}^aHZMgfn%Ohd~q4{?IWhtkqS8(VtnIPh$Y z$HrE;x_Ai%HQ|9RF54fDuCh7@Pl@5hXZ>9giY*Us7lV{J>F<4BuGzq^&40*Wrx%8; z2#kqDjik~L%R@s#cIE0_S<76$*!^7C;KHo3M6e>pdXp&77B1-tyuKXO+0Bk0RW9#r zOdL%$i(n0d`%swKE$YE}xn{%!m7loh45yF;> zGJ(-l*y%B_#5bi$D!^NNTt}?VBg?V#q>JYOCh!auM>RD+l+u$FZo`>KbZS7yfaZU^ zp(w&T-+*miYQ{Z?i5{Z7U*=5MBZW9cT`q5ze0q^_>gcd3mcva7v4Ubf>tleQ40JS{ zGe=}AGkE+t5sSRc*OgtEEdQLiB)THIl2%zkhSjZ-7SV!n7p7ldW%DiT{U+dADm|Uo z8?=-PGU_#+(PKQ(BQYqGAuY9ZqklI0u;nS@MIv|ppByVl?De#Lh+&P!2U)#xtdBY2 zqy!Ur1OXrKJB9)cp7_)vm+@&latFO9sxg?)cI1z6lN-AB8a-sO@AdZ1hl(Ry(k$&L z&U?x~uwR+6C7dO?FUmt7=d;eD5guJ0YK53lJ0Hl??q~6lGS9?=Nt*ew5l2(XLVvub z32i>hzzyx&oQj|6+=|uj%FJnbPkKE2L`c*H0nTrJx_4ZeoBaLtF()DgZzvS6L(z~8 zu?!mml`e)?g%tA0R9{x|dw%n?}PwefmAfq`9c_ z8O1S(W;zz>b1Ozu$H__EhkM_i>iA@dc{a@u)3y4a$o@vJj3Vwd5H1d zFkJZU+E9&S2$=*`lSSWhIGrSfo+4y2D`G+)DsdQ5ZRTPyQ%r%i>MAU^)k-G%!@_am zdub9j!SH+2TBnoy+7-o5W=LL74T^rxMB$sSeKW=&51T1WE?x^`3O7qnJD++WL+oHw zN0rNlSk^G3Ce#Q5YCVL1!Cj9>2?r)MbaXnOpC+7<_{t*9A?{rg>&r|>DO5%;l|@tq zM>f)Me&`q(mV7i7ThaNc-;t(8iteYx4%_J%$3x~0AAu*t4{BZ#BpQ9p=})A)mV=7z z2hK37{RB;^9nZw1XHgB<^*I%xPA?EuIQxZ`baSEnfqeh#lgCveIIzh){ddq5P!_p( z|IzkCjVH+Gav9@wZk383icMr^W@@o0c~N{x*n0$d43RTUkx6{!FcEW%2oRFkNhc{H zayUllQ{7mHM!udDryW{;{3_%G8(-d`KVisaNy9L^7Pv5rzXwNEGV9|E8@-gv&CmxU z*vZ4^pbB8~h8zj`Hk2BF=XQ#`sQ1Z7=LrY2bGel9*E-n7->K>|7TOPIH{YedcR~+&!GlrBmnomwQ@`8B!l`mtGdl^%#%!xK=t+e*TLnd(72iLd z_PKz250IV3b8Uu*eyC8qIx!5P9K}^l&It2q#0F50mEqV}ROw%{Of#hdmI|lg&<8JK z7@`vbp^Sy5(MN}*Ps7xartW$7z35Nm%0ODKCJ32>x?F_5S)TE5|InV7A~Ns7;k+>2 zLZ5S@ZWZ?7zB{2nchd$1s-Wj=#in!NY#F|CF21aT28x`TNmPEcPD@A=kM*LuYi2Pa zyiIN~fs6MZ&yJ%PIX`CdkP)X9Fbe~T0w?$VzPT(SN6{7rN;+Dk!!vbX2aM-XDmkeG zEdSK^j82uPL4>Ui@6|r0cNnSON{}7sjMe0Nw$D_ufWllk<`>CJWL}YB`Apq-HtxXB zud9v%HIF$0k2iBkU(b=L{udVDbR84hofx8uuHYKWRo@)?)3ZwMDz{)2Ma*%C;_RH9 z&$Z;jsuWk=gj|gJZd!3v@iv8`uh01)n@U=>F6n7(jTSOQ|GQdxm6t2xYdW5@%Y7gm z(q}FHYPiNJ;`nAE-zY)-wMa7`o>u)ulr&^0b9 zR5!CGpq|3FzWi<@7Hppy&W$$qJ&l#=;De7G%d<`##wWE)Y~R&JUT>yc4{5Ynok*dk z$=!OGQ_hWhbC;U#g-)GR5uLJu;FPB}AzH5QfmZ@WnC5+(;u@#D^^}v>4W87h52M>o z|LD@QYD`<`7vF;?w{(7#to$KSPv5&v%A@4P*A{$N8d3B_?W2PnQh#(5CjKJEr8ZUn z;{bj7?M!4D*Z``DSB%_v!Gw-!qX*}6Wq2%l~O0D`aoRnOmwbek` z(`Y4v1{yL^KqO#C71nf`R?s#k+q_?($6)YPzE_no<>YGu;#4?92>yu@GFtPU z^}e+R?iU; z#_sw67E!s0!fxu2!~5)Uy>@^XUhsQD|6j1j<{G2=UG~kb@&f^6kxH%~b9tC*42!Ss z_M7T09LlIBUTka(ag9_zo2#X65;tm=RKwmG+T$%Uyt{-u_%tNUDTi{l`T_059dZ`m zo&$l)bU$!VankYpwYFtTt`o`lVhEPzj+yLuN)8>N1M=1nUX@of+pCdv->=Qp$een! zcX-^n?wkled0OGOZ_u#+gaxzBxhXUWlKikP(S2)Oiw_ zHOe#hj*AuV4Pmfa&ooNHBpU|NWnp) z)eu~4+84I8C5s?G##3RXAb<}${-B2lv4Gj57xr~K(Bm{|yeoO*i7iJ<8&{W0HYMnT zL2dXTP&1RKxcIATyYuUGL}Hbjdb_a85hL@UaX3#ESIo8OY~1Hb23YzlKQ2lHV*21^BL!39LRCn>*Qz~ zP{yq$*EgpQ8>@>{9%R3A>&hOgb6j17a_$3Gz_>UToO$-gFbU_X{E_qXx@HAE60*oz zE{HKUOkB&`?@#VT$+kdc3?;7Tiu`o1^N>ZK&}EE;`B$PZa%h*N=;IVp8h zN)X&Y>*4Ivuplb?9f)DX^)gICjZqXhN+Kejkyj!zzM7@@4FVgJ-Z zK4)ZEvg}U?nW`tnpta43_&$`@nYz$UAm{)G4xuL3YhVi|(G;d?zjN&>Iam-*4m44(aPK^UDR-d0{HfcnI&K@HJ=Q@}{Ok81Np;a%;F&apuC>0=+I}XYYzP^6Ld2b{t1|}F{MCkf z*%3JI8mGs+#JaHIn{=l?e9LFWK_~>usAjq9@(XWq#qD}ysJeb^2=l|5M(Q4f*-m4; znb_Jz@1&P2z89XsgHE-;9aRvy^Ao>Q(EjAb#?Oxrq~qM1P~&EW3*VwRu1*idd-kv* z;^=#Q6=K4j;s*E5 zv`{8CZl;lV_ROS{=h+}d%P{`u)VRr9OCC3fsO2alwE6|)2CzbZ@aao5RT6r^;gcJE z549tch)F;g2bTOvKN3oOt6J&Rn(FqtO<$b1eb>@YrxFWNZ+;jhPs<*yH`RXg7D~rkm!CX|@tKw&c}}NQX)iGDa;GcDWeNT}oH2T?q{_@@vRW69+Ql zH@ts}?Ktlxk<$BeCPQ|Q%TV{-aG3Z^>VC5A4a27#6oP(h?UQY3hXP%bbW|MJS3f8g zLiTnaJsUKDsFY`as<2xn?6!adA|ugO>G?tBt2~*i-|NpJ|UvgNDFe!A4Xj zf?_2$5)>-geGBK=SbTo32->r)XDT~^gzN#=@zfnbauSR7><=Bxge7XgcrN=5UYMT`Jd4FLD76!kkaR*d zoJ(V!y~}U+gMDj0Z^vL}XRl>V6^UgT`caTBOBz#lFWdW=1azvRR&@eYhit>Fmk$GVsyBbn}aZrft`fAp_QLT~xobQNM zfc7+z-Cq;Uq$|GJ{*y;_sj$Z{Y995+b9=|E2>!-_kZ3pe?Z%p)aKPpkSn)C#PHIx} zdkrl+9;Nq4FS1^Z%3`U{75#2tr$3euH~?U&~=!yo`Isdyl=t62oJw)Vxp9`Ca_z1 zr_DC7{?gwOyTKRgdfj^SX>EqMKbBf@M9NSPa+Eyp-Ntd?7=5j(AE#1dC&&e0qotY3 z2~LyS5%CycB~aO?;M2-IO?{{onEgirhXQN!b(IQ_hCS#<1_;fi_bAjG$8sR-T-O8I z0DX~uM&PWV*k`Guy#*|v6%yG5g?uK2n16jNp9Ydu@x9MGMCkz0=e*aiIAd47Am8qeqehRtW1ZTb8Ye40er`j@b+?b7t z-;At15Oc<4Pf&Og8%tcfH9C&U2x76%XKLRdSf@ERaa=bul(dFlSX04mHp0GdtM|{BQ8ve={nU7rqe88wmRUy-u9ML z!;ImzezWhW<7Y?bRr)+@ZK(K7gCKmnA|FI!jMOidiPq;Z#kuv$iERDHo$&)ZM}`$? zeFDElQODnJZ*n4tVL)K18lV;v!$It%26)LCu3H*Etnt?(Q9ICLdtfs`fDKwf%L&K# zY~AhB`A~4`K>=pD2pWs;^<4|)M46E`0z0(FT=KJ0NPR*=hk8@V^}@@UPW=YqI|~bL z>aKtkuCheLR^A>}1{y~<*MNa3O(nUx^+jF{O{)gYku5VxM7iNW=+RES{0FJSA`M7& zoohU|zxg|L!~j|H&3Sk6N@Nu@MF0Bt>0UeDF5kP|#_N}1ALl!11g&n;YPFCvq z+f#JE_PdYqbu94N5IPuY&L*n2EBohR;)vUrSXOp6gP;U~Rg*pgljSc;T+JE{GUn*5 zh4Ij`dkvykFa06$ zMh#y`%c;&u=n#RhXQk=Lq)J$|yL=R-Rk@=ts?0-=LPvAr`Q~{`+Buz8D(c8J-z$w* zhnB(ZuJI_26LdV*3XnynP|KvcTXUh6>1ev8FE0Bq==7cEY#B5piG2N=8=>#zt9WkY zdM~y*48Fi1S2H*lJutIrjKq@s9!1-oT54V-Q5+NlvpzvY=aPg*Ho$JYy|c)0K8QP$ z(q-p1lTZ4*`y(g@q7YG2f@kNgFtWU#um^`6+gk?Kidnl?r=rVmIG`c0)Fu*+w(94K z!QKZ!a>Vet7>lkv(p#&c-YAR$R1plkucIZS+phTge-_ zn~_7!dP|ZB+7CBcckC77D#^fl!)nfykBAW@Smid83=s9D^9(=B@acX1u zTJ$SPlDf5qSm->`!18Cf4y9LHAn1;7dl4r%uzHGNd?#s#nD?nu_oRUMb&=9kDVl_A z7`(*JxM0VC2+n5e7m1{J@DvN{o4JDB?)zBOj@S=jl(ti!&g5xp#Yy!58SJ7>+g3XC zngK`{A!Qn`<%)wY*c=9|8(i2FYZT7-}dPK;B@hoe2L8x%S5AG@<+RP ztS(~^pncrnPeeH?pl*$mXFR=~U}EumfCw5Q`s$jLC2w|X=Db+H_wk+9R@SO#Xm>t; zR`QN(Xu>bG>S@;HTJPDKVX8(6HEpDjkdngkIJfw^YKe;^J0tbF@u^Sz!p4rcHXdb- z+OT9xLP5t$hY@PrCMiOWy2euc8M^(tlIO3HOzi=feTiKH>W|~O8OQQxYDnJbVW_vK zPC#WyxMUz1kLg{W|D=X0NKw}KWMpW#bmCN#HG~_$9P>50A}I~jkuX}b-zp*c_g1j7 zs6nzilOsS) zGAaSAN8TZ=_4U*~oY?O=Tx0^zYEySF+-;~&>8nxr?y;GjQu=fk)%*3=pyR@(GJ}nU zvN-4v9c&hgz{}4v7CjBl(*k}ZyMGQjA<8FQNNh|}#P?NhI({)?d|lSm_@uE4mxz=y zD*5R2E)ZU@`M`?<-`iH#TNw2iJyKSkmF6^RaOHWf4{%NGNzAO%{oA(W--vrqUa!08uvhxQ9D zp$d=66xkBDc37AOBTyu1$?gQ)3x5KIo+A9V6VUTXa_6>c1l(xRVxEmqj$B?T+Kk^} z)gn&#IGNBSd+*V&4z@iu!yzA3M|1U5k2zISAINvNZkVuH93_#){Oj<}fQq9#&=+T? z;`e*>u3D_$LGRygKnUoU0Q@?F_9V;&_abHGqh^CXol)H-zSj5Ay^}%$Rv-JJ2fa!T zQ_jCw6N)FTD+>-Rc3MZRrJrNREbD9o+q*IAUqUuhk|z)6>x}q?!jSi8%$%DOdxy@S z*q1vuEeTmeGmFCU@urio>6@%F5@vT@&4T|sob>6%wHLI)Pf=HZ4~_o1N%W#2oM@+m znv3&<0LFtIxJTqSU&$^7A%;IG%{6|F{em0OfgX6sd?KIv#4Y;h@@n*P#nv@5yQIdw zek(lbg&yA5q08ox$|WxEFpPy4)W92v3LQ%gRGBVDu#UhhcoCePR-GW4@+k+8?N6Z$ zK5f)DJ(J#tO?97sC~>xy4U7J`2d#mI4?}K!9%l%>o%np|1=l+2qjh|w2wJq@n*Vk| zj)MH&Mz#iWjfrULj}*vf0cv9&_vls8nu0DzKg@v(DTc?h~ZO=fv7UnJBriQ48EOV-jSiooF34! zm(B}$D7ACoFbmi1#RCq^@6wP(xG*S>$HZED1Wqubc;_SK<5`DY>vyu0yZaE9W+n6) zg=c^n3VFCA`+iC${;(2k{~w}4`5@T{1dgDC0^mc zR>{jS31gJOFqN6_J~L>lvN4j^6}Qg^8b-B>4Nr&Xy9D9qo)m`79SSfhJ?{WoG+;WY1bmF$m*0P zQn-6~aC@WA zZgafoA%}OU*ZomD2yBL`7Z4L3K~YDDohS|G;z%QiQ>KSA@oWP*Fa<;8&tHZDjZX^& z8XxEx&q9)FFwnwU2Gm-}p0+G^CcHordG-Qnr^L6tpOwh@_;_VxTAuPQzu=L-4UwW` z5@2MyR=bK4S42^2BG-gPTn3l0z*ssefvHlYK@Sm}5dn~0TdbNPo6()w(N6z`HyD## z2&2{b(-RfQVq>k<@&*wYz4ThMdu#||X=^=spzjy73i;7P%viTKLT0wxEZkN;rat_< zcX`e$Cu>nz`2dan#0UDox(yd|JIB}o4F~qtzf6>n6|jzmP)gF=%5XHQ4CM|L*86%v zsL{&@SC<}1*Jo%_cPaY_;f}cXTB^-tp+dGBPr4gQz(nz=Je2+s0e)<`mMR1qB_=KJ z`3c1_@WY`kD{<`|t4`qwJ+$+rMftO-!LJR`9vDki#U< z7(elWUq%xBitxaJS*?l8C7^aVx(-z=BPPf_qpF$Qx+f>U^WR1=xJ)AGl@pf#0usdd zo^Yb3dvv978~jv5O@WjWkrjX{4Jha(GWWGM4$PJxaVxucfxX6*s2c{6hE;bUl{T%- z7fT^g>ay?lPPqsDBwyU3U>L`d?HGCsP4H4aY8~%)Wx!~#{1O?7LwokupP5vomHhV# z?OX?|%)f z>#&YmG%?(XmCZC5?b%9l-}<|m6%D5*wZAu1^HDg1X24vZ z!yN@*hdbNj`<^;{6?CoAX?pk{%#H$tJ~;N^wJ=OK?Mn&(spB!NZcY%w0cHsP$<=oC zZfUUhtza(P3Z{DzilVBryp~hg<59Uxf`!km9=_E;vvPX7QC5BZK+n}r$Rx;T-1usx zEY5BS`868<4#uF-o>KdI&YiRK3wMjHCm7p9Gd__LyvYI;9jhg_ZohXNzERv)nXiHT z=At~T+>*4w@MhN=X%X1vW7{$1vwDv3HmPJMpqtv|8E1E$I_5?-;Xs^F35R9BbbT`D zdd`3PbiIO3#JBn;d?|_Fk9sauls#D5Wox0q;*_pXznPN55>FoNr?#v&M(d0MRv$dcy=fl^sm_CLi2`ia-GdjB+BeXfiZf z;txjnyysn}aMIp%3 zbC?J}p_K05sn`+0Tje(D)!yvi#?`EF2+UE30p)r2AA|R3X9}hAg!pACKny5gWJj%M*6z8Q5Kv?kpQWk6f((p| zRA`|CCIau-cXBQXDh9=^_}6p1l`G}2Z|=QcWDgRbNzGZ3iD1w&|BuvOzf(NBR|s3D;a zXU9)y9~%+ZyqH_u5dQs4cU09<#kho~sY$LuBuhDJ4QKJyX8q50UOp;9jkll=>`6tG zlmEv=vVpCJ#?_Gv5yfk&&_qMQ7GLyre=B-|<5jxzm6VmZF~@;5Q_ zup!5wnmz~m_|4ApS28g>f~YMM99r5pV+~gYL?fSNeJbp119?{)@=N(Nou7AYxYPzVYf|{8>t~=mv!uteP_n*_c%_!@9CUB;rpFyuJ?McYvz6DnfrO4`~KY9=iySK?FCH5 zcs{eEJ$_m1))yaCX?G_Rk@=R|aV_afySR9oqfHg`xv#f;7+^Kn=<3F0ySa5y@k^B^ z*Xb7tugC>c2P}Xq*IXXeP~$tRZDmaWUCN#4N*At)?zd!^#V>_GMVYorgOOf~&(?#y zq0}PynT#WBR@|P2iKWbI zVpn!wM*f;z?m^~Q@xy;I$EM%13VEcn_g>X(Rw|H@vGC|-lpk-JrUr5$aRmGhd7-OEgbSncwcs z8!Wf#Ue$%z@EZ%=24?R}`+fdyWkz4yGSFKl+qs5+K`MTv`!OoBXJ-MJjt`}N9`el}2jSv;ui zF9#+>>sGFk2IB4?9@8Qo^%iv0Mw%KkOGl{eNIQYyTT06U^LgPMbE z4u?}LEpKsstY$O#T&Snu0(B(Ev)lVr=khLxJD>kV0ISF$X_-_SfQAxIe_7!gW6ML) zrxw#Q8kbwCo;H5QrF$Cn^z5jq_Gfk@EBc7kS(&r_Z9{vt-WxN$2AoJo1)`q}T`gMk zav)pGWX(9cE)QuK)^SYf&fuBUr|vSYUY_#VpmlYlcIbp%IzdMgmK={am#Bvs25brc55p_9te*@QX0tJ~hq9 zBydi18gW+)U%b?$WEHq+;zUr8DA%K z{J4ass@9{gDraBJA5{M0)R*bb29dYF)6-a+?LRwaC!1_oa>hVZ+BsSM#BSc}tufM% zxnAvz*OR2=#n#t7VST;Zdrf(2Oj%Obq7QO8580ZUnfdhT;`ob)He!KM~}XLG#e8eOGO9gU6Z|TQVO~+ z4|RO7%qcdOOQ4@S>~{98e^Fb6wEo@pf%CxI0H+&i=xO}c0*V4w*q7?B9_C+U7)GFX z^9}cH?tgMykd4X#=8M0-Ujx1jrmjn!OuzS=9s~h@=f!|Sx(5*+;_&#o=r@cT@%(q+xig8%!hK$jM-(Nvz+^qU_XK($JbyqYBbGqE z1L9U|36ulqK#+!_CLq5oP-weOuPAJ6ak~zy8v=A-=;72w23AbD9%A=g>(?qF^jNci zMGA2flyQ4acj;_+_t>zZX}-v}SdmXpExImnL9+ebI;g6! z-`&d(xHG!Ra6+&eIf&pm^Kj3!dV786X7RKFUz)%fW#aNmUTUjV*|Ajrb@lu2pHm^N z(w)rn&L58UIT$TME)7OQTdu7fV$VSc=)=*qd=8B3H)EOSk<0mR zQlD~fp#H1u--96l0Gw-^+o5Y%r1~J`a_CNaEAGs-vn+fcypZRhb747*iHZF*kj|TJ z@_9)rF!ApB&(hWVPh>OEwqs!nruQ_fhNUcPLG&mdXJ>b#E7FLbdVYa9yi{ixYw ziK9*BSAoPeNJt*xR?lV?ix(H_n^JLNzmO;v1*$}y_J4>cHFG(1jOavgeb?bmsV=cr zS6o0Ood{hIACB2G-yja{w40RMQTrnRqEl6<-RBFS>|}TTG~DB&yBrUyc)Y6y*rZSI zv*DY*bV^c9OwBgTFxqxi_O#pofIS22yigo{*~tw_e;lVONqxOHcfK9lCudrXRg`lV zS7mQ4=8JG%)K6GR5=Dis-3bSJy7r--JJZPG;{&ij7-C(zP;t(rdLG39IZl7zlmXHW zdnXGO!&UpZKdF1jXdM8-qNe#?u|7GU?rYn9Q4z~Lrk@7fCe{(19M#dmj{`pS3Rql{ z&7nEHGo?G%zpntW%O7TM;zd#TmA95JU!<8lrOE57WbFAcT(=ilbX|sXiG(a|EAR0_ ztlqfd;WWt9(C}{K$Eu6rM4Fq!;76$tX;Oj&8fRgCUN=;6K{>4Ian$Jex*QXXO@uba zR=D-e1f9WnS-HUoaL%n4(2_~=g%xW>_zbp6#XC=bq;h(NvoQ0aQ(G+oCO2w7U)iyD zWWZSV!q&cy=sV?mKM^^`?*yA2e2HC*CK!LE)4ujBd?Eq-Q7~kru~lmLpkvmB-Hpvn zpuz>C$qa)c6*k`bGy5CVj=l^Rs(4<@2Ps?(Hl31llL9E*(oA2;pLqL8rio3dLl+i7 zF6jQC+gOb~?R?tZXukz6&O`bDXP{@WTo@{#Mky%wdh(Fol>?Lq0KW8|@7Y*+9vM%Y z0QtPtk4CLFnAcaLU9(9>3bzVUMNv_6W>O~DU;uqA)TPd54O6#Rx~>J z@ar?ZLq#hO2L=J+@j?*d0*7k{?)VaqtF9$SXz)wL*fGe4dnNPv3G?Y@L0eehUr8Tg zh6=)0zQzZ%6@PP>GgY!Ms}sVXeHUw(wBj9&a7fH2JQB+FG|`g6YgO2-3qp=3a74}x z3*-*fi+&TJY#N~5bv_z1hkMd!!-)TBkvg7hi_|HSv!N1FJ<0H8t5}=F5P6f9DYMsv zZs#Ql8EbdFTY_``8QBvtGnz=XsAojtckelYi=0EyMVI}i95UumfEq1W;v;9e)Kyhwi>Ii2nJ2kUA*pNPgqHxr>HVhNosAy|1l6i$!ISrLna?9) zrc7>7$|(X}sU4y-Trm%d_e&5cC1Xy;*Sf)7n;aK}Oddz2;769jF+TJ1x3Gdf%*mMA zlkO_yH>N^_Vq@y1++;yV0ZDIT-yxVUN&N%Ar5CYUX}7r|QY)9^RRU%Grfxu*774TA zJL`KZ^`cz^j#AgD-Z&_-gj!po#;j_ZRYzV~9M#d$vAmsGy;M(eGvmWbGK4uVSG|Wd zcQSH}MWS?DzVrHl=r1Jz$Wn;t;{hZz)s*;8#gj{Y%I*s+-X0D?!a3?>0Z8P|3W2|4 zB_nH}?~Ay8_}0!WtBPXU;(#Y-s#B7XtlJxl%Ji<2Z=oS z(ygn~(0RHAilM(Cu`lXwMLX@0!|TJC?ns!-tSNv&3fHQ5dkZJ&no{La=z_JXT7ey= z 0 else 0.0 + + return result_5pl, result_4pl, r2 + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- +def custom_code(inputs: list[IOData], **kwargs) -> list[IOData]: + # --- Load input --- + df = None + for i in inputs: + if isinstance(i.data, pd.DataFrame): + df = i.data + break + elif isinstance(i.data, BytesIO): + df = pd.read_excel(i.data) + break + if df is None: + raise ValueError("No DataFrame or Excel file found in inputs") + + df["Concentration_uM"] = df["Concentration_uM"].astype(float) + df["Signal_%Inhibition"] = df["Signal_%Inhibition"].astype(float) + + # --- Aggregate replicates --- + agg = ( + df.groupby("Concentration_uM")["Signal_%Inhibition"] + .agg(Mean="mean", SD="std", N="count") + .reset_index() + ) + agg.columns = ["Concentration_uM", "Mean_Inhibition", "SD", "N"] + agg["SEM"] = agg["SD"] / np.sqrt(agg["N"]) + + conc = agg["Concentration_uM"].values + resp = agg["Mean_Inhibition"].values + + # --- Fit 5PL (and 4PL for comparison) --- + result_5pl, result_4pl, r2 = fit_5pl(conc, resp) + p = result_5pl.params + + def _se(param): + return round(float(param.stderr), 4) if param.stderr else None + + # Delta AIC: positive = 5PL is better fit + delta_aic = result_4pl.aic - result_5pl.aic + + summary = pd.DataFrame({ + "Parameter": ["Bottom (%)", "Top (%)", "EC50 (µM)", "Hill Slope", "Asymmetry (F)", "R²", "AIC (5PL)", "ΔAIC vs 4PL"], + "Value": [ + round(float(p["bottom"].value), 3), + round(float(p["top"].value), 3), + round(float(p["ec50"].value), 4), + round(float(p["hill"].value), 3), + round(float(p["asym"].value), 3), + round(r2, 4), + round(float(result_5pl.aic), 2), + round(float(delta_aic), 2), + ], + "Std_Error": [ + _se(p["bottom"]), _se(p["top"]), _se(p["ec50"]), + _se(p["hill"]), _se(p["asym"]), None, None, None, + ], + "Note": [ + "", "", "", + "", "asym=1.0 → standard 4PL", + "", "", + "Positive = 5PL preferred", + ], + }) + + # --- Smooth fit lines --- + x_fit = np.logspace(np.log10(conc.min()), np.log10(conc.max()), 400) + y_5pl = five_pl(x_fit, p["bottom"].value, p["top"].value, + p["ec50"].value, p["hill"].value, p["asym"].value) + p4 = result_4pl.params + y_4pl = five_pl(x_fit, p4["bottom"].value, p4["top"].value, + p4["ec50"].value, p4["hill"].value, 1.0) + + # Residuals (5PL) + fitted_at_conc = five_pl(conc, p["bottom"].value, p["top"].value, + p["ec50"].value, p["hill"].value, p["asym"].value) + residuals = resp - fitted_at_conc + ec50_val = float(p["ec50"].value) + + # --- Build figure: main curve + residuals subplot --- + fig = make_subplots( + rows=2, cols=1, + row_heights=[0.72, 0.28], + shared_xaxes=False, + vertical_spacing=0.12, + subplot_titles=("5PL Dose-Response Fit", "Residuals"), + ) + + # Individual replicates + fig.add_trace(go.Scatter( + x=df["Concentration_uM"], y=df["Signal_%Inhibition"], + mode="markers", + marker=dict(symbol="circle-open", size=6, color="#7FBBDA", opacity=0.7), + name="Replicates", + showlegend=True, + ), row=1, col=1) + + # Mean ± SEM + fig.add_trace(go.Scatter( + x=agg["Concentration_uM"], y=agg["Mean_Inhibition"], + error_y=dict(array=agg["SEM"].tolist(), visible=True, color="#1B6CA8"), + mode="markers", + marker=dict(size=10, color="#1B6CA8"), + name="Mean ± SEM", + ), row=1, col=1) + + # 4PL fit (reference) + fig.add_trace(go.Scatter( + x=x_fit, y=y_4pl, + mode="lines", + line=dict(color="#AAAAAA", width=1.8, dash="dash"), + name=f"4PL fit (ΔAIC={delta_aic:+.1f})", + ), row=1, col=1) + + # 5PL fit + fig.add_trace(go.Scatter( + x=x_fit, y=y_5pl, + mode="lines", + line=dict(color="#E84545", width=2.5), + name=f"5PL fit R²={r2:.4f}", + ), row=1, col=1) + + # EC50 dashed vertical line using paper-relative x coords on row 1 axes + fig.add_shape( + type="line", + xref="x", yref="y", + x0=ec50_val, x1=ec50_val, + y0=-5, y1=110, + line=dict(color="#888888", width=1.2, dash="dot"), + row=1, col=1, + ) + fig.add_annotation( + x=np.log10(ec50_val), y=55, + xref="x", yref="y", + text=f"EC50={ec50_val:.3f} µM", + showarrow=False, + font=dict(size=11, color="#555555"), + bgcolor="rgba(255,255,255,0.7)", + xanchor="left", + row=1, col=1, + ) + + # Residuals + fig.add_trace(go.Scatter( + x=conc, y=residuals, + mode="markers+lines", + marker=dict(size=8, color="#E84545"), + line=dict(color="#E84545", width=1, dash="dot"), + name="Residuals", + showlegend=False, + ), row=2, col=1) + fig.add_trace(go.Scatter( + x=[conc.min(), conc.max()], y=[0, 0], + mode="lines", line=dict(color="#AAAAAA", width=1), + showlegend=False, hoverinfo="skip", + ), row=2, col=1) + + # Set log scale explicitly on both subplots + fig.update_xaxes(type="log", row=1, col=1) + fig.update_xaxes(title_text="Concentration (µM)", type="log", row=2, col=1) + fig.update_yaxes(title_text="% Inhibition", range=[-5, 110], row=1, col=1) + fig.update_yaxes(title_text="Residual", zeroline=True, row=2, col=1) + + fig.update_layout( + template="plotly_white", + legend=dict(x=1.02, y=0.95, xanchor="left"), + width=860, height=640, + margin=dict(t=60, r=160), + ) + + return [ + IOData(name="5pl_parameters", data=summary), + IOData(name="aggregated_data", data=agg.round(4)), + IOData(name="dose_response_curve", data=fig), + ] diff --git a/examples/custom-code-AD/snippets/kinetic-timecourse/docs/input/timecourse_data.xlsx b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/input/timecourse_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6f637c0112d21542457d151fbd9e436954750626 GIT binary patch literal 6998 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 literal 0 HcmV?d00001 diff --git a/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/aggregated_kinetics.csv b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/aggregated_kinetics.csv new file mode 100644 index 0000000..80662cb --- /dev/null +++ b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/aggregated_kinetics.csv @@ -0,0 +1,31 @@ +Compound,Time_hr,Mean,SD,N,SEM,CI95_lower,CI95_upper +Compound_A,0.0,-0.2787,1.3743,3,0.7935,-1.8338,1.2765 +Compound_A,0.5,1.277,0.7716,3,0.4455,0.4039,2.1501 +Compound_A,1.0,1.8333,1.0417,3,0.6014,0.6546,3.0121 +Compound_A,2.0,3.54,0.6152,3,0.3552,2.8438,4.2362 +Compound_A,4.0,6.349,0.2737,3,0.158,6.0393,6.6587 +Compound_A,8.0,11.643,0.5953,3,0.3437,10.9693,12.3167 +Compound_A,12.0,13.6943,1.7458,3,1.008,11.7188,15.6699 +Compound_A,24.0,18.3767,0.2974,3,0.1717,18.0401,18.7132 +Compound_A,48.0,19.4823,0.1698,3,0.098,19.2902,19.6745 +Compound_A,72.0,20.15,0.585,3,0.3377,19.4881,20.8119 +Compound_B,0.0,0.1373,0.6439,3,0.3718,-0.5913,0.866 +Compound_B,0.5,0.6577,0.7196,3,0.4155,-0.1567,1.472 +Compound_B,1.0,1.188,0.575,3,0.332,0.5373,1.8387 +Compound_B,2.0,2.2697,0.5702,3,0.3292,1.6244,2.9149 +Compound_B,4.0,3.5597,0.463,3,0.2673,3.0358,4.0836 +Compound_B,8.0,7.0487,0.5562,3,0.3211,6.4193,7.6781 +Compound_B,12.0,9.5947,0.5182,3,0.2992,9.0083,10.1811 +Compound_B,24.0,14.1617,0.402,3,0.2321,13.7067,14.6166 +Compound_B,48.0,18.3357,0.2967,3,0.1713,17.9999,18.6715 +Compound_B,72.0,19.525,1.3894,3,0.8022,17.9527,21.0973 +Vehicle,0.0,0.196,1.0212,3,0.5896,-0.9596,1.3516 +Vehicle,0.5,0.3307,0.295,3,0.1703,-0.0032,0.6645 +Vehicle,1.0,-0.3997,0.4085,3,0.2359,-0.862,0.0626 +Vehicle,2.0,0.0007,0.7273,3,0.4199,-0.8223,0.8237 +Vehicle,4.0,-0.126,0.4066,3,0.2348,-0.5862,0.3342 +Vehicle,8.0,-0.089,0.4928,3,0.2845,-0.6466,0.4686 +Vehicle,12.0,-0.199,0.3337,3,0.1927,-0.5767,0.1787 +Vehicle,24.0,-0.953,0.3277,3,0.1892,-1.3239,-0.5821 +Vehicle,48.0,0.4193,0.6914,3,0.3992,-0.3631,1.2017 +Vehicle,72.0,0.181,0.441,3,0.2546,-0.318,0.68 diff --git a/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/kinetic_curves.png b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/kinetic_curves.png new file mode 100644 index 0000000000000000000000000000000000000000..d50afd3cc3c3ee532493bb9cb0cc9e44f658d729 GIT binary patch literal 70657 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∋2IJ{C=({PU{KSa*1=LE|$ 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 z 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 literal 0 HcmV?d00001 diff --git a/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/kinetic_params.csv b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/kinetic_params.csv new file mode 100644 index 0000000..af3ec3d --- /dev/null +++ b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/kinetic_params.csv @@ -0,0 +1,4 @@ +Compound,Emax_AU,kobs_1_hr,t_half_hr,AUC_AU_hr,R2 +Compound_A,19.949,0.10149,6.83,1222.58,0.9985 +Compound_B,19.867,0.05363,12.92,1049.56,0.9994 +Vehicle,7.749,0.0001,6931.36,-7.33,-0.0248 diff --git a/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/ttest_summary.csv b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/ttest_summary.csv new file mode 100644 index 0000000..e9b02c7 --- /dev/null +++ b/examples/custom-code-AD/snippets/kinetic-timecourse/docs/output/ttest_summary.csv @@ -0,0 +1,2 @@ +Comparison,Timepoint_hr,Timepoint_basis,t_statistic,p_value,Significance +Compound_A vs Compound_B,12.0,1/kobs inflection (target=14.2h),3.8992,0.01755,* diff --git a/examples/custom-code-AD/snippets/kinetic-timecourse/kinetics_timecourse.py b/examples/custom-code-AD/snippets/kinetic-timecourse/kinetics_timecourse.py new file mode 100644 index 0000000..7b24ceb --- /dev/null +++ b/examples/custom-code-AD/snippets/kinetic-timecourse/kinetics_timecourse.py @@ -0,0 +1,215 @@ +""" +Benchling Custom Code Demo 4: Kinetic Time-Course Analysis +=========================================================== +Automated Excel → Benchling publication-ready kinetic graphs, +replacing manual Prism curve generation for compound comparisons. + +INPUTS: + inputs[0]: pd.DataFrame — long format with columns: + Time_hr | Compound | Replicate | Response_AU + +OUTPUTS: + - "kinetic_params" pd.DataFrame — Emax, kobs, t½, AUC, R² per compound + - "ttest_summary" pd.DataFrame — t-test between compounds at final timepoint + - "aggregated_kinetics" pd.DataFrame — Mean ± SEM per compound × timepoint + - "kinetic_curves" go.Figure — Multi-compound curves with 95% CI ribbons + +Supported packages: +allotropy, biopython, lmfit, numpy, openpyxl, pandas, plotly, +pyarrow, pydantic, scikit-learn, scipy, statsmodels +""" + +from io import BytesIO +import numpy as np +import pandas as pd +import plotly.graph_objects as go +from typing import NamedTuple +from lmfit import Model +from scipy.stats import ttest_ind + + +class IOData(NamedTuple): + name: str + data: BytesIO | pd.DataFrame | go.Figure + + +COMPOUND_COLORS = ["#E84545", "#1B6CA8", "#AAAAAA", "#2ECC71", "#F39C12"] + + +# --------------------------------------------------------------------------- +# One-phase association model via lmfit +# --------------------------------------------------------------------------- +def one_phase_assoc(t, emax, kobs): + """One-phase association: y = Emax * (1 - exp(-kobs * t))""" + return emax * (1.0 - np.exp(-kobs * np.clip(t, 0, None))) + + +def fit_kinetics(times: np.ndarray, responses: np.ndarray): + """Returns (emax, kobs, t_half, r2) or nans on failure.""" + try: + model = Model(one_phase_assoc) + params = model.make_params( + emax=dict(value=float(responses.max()), min=0), + kobs=dict(value=0.05, min=1e-4, max=10), + ) + result = model.fit(responses, params, t=times) + emax = result.params["emax"].value + kobs = result.params["kobs"].value + t_half = np.log(2) / kobs if kobs > 0 else np.nan + ss_res = np.sum((responses - result.best_fit) ** 2) + ss_tot = np.sum((responses - responses.mean()) ** 2) + r2 = 1.0 - ss_res / ss_tot if ss_tot > 0 else 0.0 + return float(emax), float(kobs), float(t_half), float(r2) + except Exception: + return np.nan, np.nan, np.nan, np.nan + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- +def custom_code(inputs: list[IOData], **kwargs) -> list[IOData]: + # --- Load input --- + df = None + for i in inputs: + if isinstance(i.data, pd.DataFrame): + df = i.data + break + elif isinstance(i.data, BytesIO): + df = pd.read_excel(i.data) + break + if df is None: + raise ValueError("No DataFrame or Excel file found in inputs") + df["Time_hr"] = df["Time_hr"].astype(float) + df["Response_AU"] = df["Response_AU"].astype(float) + + compounds = df["Compound"].unique().tolist() + + # --- Aggregate: mean ± SEM per compound × timepoint --- + agg = ( + df.groupby(["Compound", "Time_hr"])["Response_AU"] + .agg(Mean="mean", SD="std", N="count") + .reset_index() + ) + agg["SEM"] = agg["SD"] / np.sqrt(agg["N"]) + agg["CI95_lower"] = agg["Mean"] - 1.96 * agg["SEM"] + agg["CI95_upper"] = agg["Mean"] + 1.96 * agg["SEM"] + + # --- Fit kinetics per compound --- + param_rows = [] + for cpd in compounds: + sub = agg[agg["Compound"] == cpd].sort_values("Time_hr") + times_arr = sub["Time_hr"].values + means_arr = sub["Mean"].values + emax, kobs, t_half, r2 = fit_kinetics(times_arr, means_arr) + + # AUC via trapezoidal integration + auc = float(np.trapezoid(means_arr, times_arr)) if len(times_arr) > 1 else np.nan + + param_rows.append({ + "Compound": cpd, + "Emax_AU": round(emax, 3) if not np.isnan(emax) else None, + "kobs_1_hr": round(kobs, 5) if not np.isnan(kobs) else None, + "t_half_hr": round(t_half, 2) if not np.isnan(t_half) else None, + "AUC_AU_hr": round(auc, 2) if not np.isnan(auc) else None, + "R2": round(r2, 4) if not np.isnan(r2) else None, + }) + + params_df = pd.DataFrame(param_rows) + + # --- T-test at the inflection point (t = 1/kobs), where curves are most differentiated --- + # For one-phase association, dy/dt is maximised at t=0 but compounds diverge most + # visibly around t = 1/kobs (the time constant). We average 1/kobs across active + # compounds and snap to the nearest measured timepoint. + active = [c for c in compounds if "vehicle" not in c.lower() and "control" not in c.lower()] + available_timepoints = sorted(df["Time_hr"].unique()) + stats_rows = [] + + if len(active) >= 2: + # Compute t_inflection = 1/kobs for each active compound + t_inflections = [] + for cpd in active: + sub = agg[agg["Compound"] == cpd].sort_values("Time_hr") + _, kobs, _, _ = fit_kinetics(sub["Time_hr"].values, sub["Mean"].values) + if not np.isnan(kobs) and kobs > 0: + t_inflections.append(1.0 / kobs) + + if t_inflections: + t_target = float(np.mean(t_inflections)) + # Snap to nearest actual measured timepoint + t_compare = float(min(available_timepoints, key=lambda t: abs(t - t_target))) + else: + # Fallback: midpoint of timecourse + t_compare = float(available_timepoints[len(available_timepoints) // 2]) + + a_vals = df[(df["Compound"] == active[0]) & (df["Time_hr"] == t_compare)]["Response_AU"].values + b_vals = df[(df["Compound"] == active[1]) & (df["Time_hr"] == t_compare)]["Response_AU"].values + if len(a_vals) > 1 and len(b_vals) > 1: + t_stat, p_val = ttest_ind(a_vals, b_vals) + sig = "****" if p_val < 0.0001 else "***" if p_val < 0.001 else "**" if p_val < 0.01 else "*" if p_val < 0.05 else "ns" + stats_rows.append({ + "Comparison": f"{active[0]} vs {active[1]}", + "Timepoint_hr": t_compare, + "Timepoint_basis": f"1/kobs inflection (target={t_target:.1f}h)", + "t_statistic": round(float(t_stat), 4), + "p_value": round(float(p_val), 5), + "Significance": sig, + }) + ttest_df = pd.DataFrame(stats_rows) if stats_rows else pd.DataFrame( + columns=["Comparison", "Timepoint_hr", "Timepoint_basis", "t_statistic", "p_value", "Significance"]) + + # --- Multi-compound kinetics plot --- + t_smooth = np.linspace(0, float(df["Time_hr"].max()), 300) + fig = go.Figure() + + for idx, cpd in enumerate(compounds): + color = COMPOUND_COLORS[idx % len(COMPOUND_COLORS)] + sub = agg[agg["Compound"] == cpd].sort_values("Time_hr") + times_m = sub["Time_hr"].values + means_m = sub["Mean"].values + + # Smooth fitted line + emax, kobs, _, _ = fit_kinetics(times_m, means_m) + if not np.isnan(emax): + y_smooth = one_phase_assoc(t_smooth, emax, kobs) + fig.add_trace(go.Scatter( + x=t_smooth, y=y_smooth, + mode="lines", line=dict(color=color, width=2.5), + name=cpd, legendgroup=cpd, + )) + + # 95% CI ribbon + x_ribbon = np.concatenate([sub["Time_hr"], sub["Time_hr"].values[::-1]]) + y_ribbon = np.concatenate([sub["CI95_upper"], sub["CI95_lower"].values[::-1]]) + fig.add_trace(go.Scatter( + x=x_ribbon, y=y_ribbon, + fill="toself", fillcolor=color, opacity=0.15, + line=dict(width=0), showlegend=False, legendgroup=cpd, hoverinfo="skip", + )) + + # Mean ± SEM markers + fig.add_trace(go.Scatter( + x=sub["Time_hr"], y=sub["Mean"], + error_y=dict(array=sub["SEM"].tolist(), visible=True, color=color), + mode="markers", + marker=dict(color=color, size=9, line=dict(color="white", width=1.5)), + showlegend=False, legendgroup=cpd, + hovertemplate=f"{cpd} t=%{{x}}h mean=%{{y:.2f}}", + )) + + fig.update_layout( + title=dict(text="Kinetic Time-Course: One-Phase Association Fit", font_size=18), + xaxis=dict(title="Time (hours)"), + yaxis=dict(title="Response (AU)", rangemode="tozero"), + legend=dict(title="Compound", x=0.02, y=0.98), + template="plotly_white", + width=860, height=540, + ) + + return [ + IOData(name="kinetic_params", data=params_df), + IOData(name="ttest_summary", data=ttest_df), + IOData(name="aggregated_kinetics", data=agg.round(4)), + IOData(name="kinetic_curves", data=fig), + ] + + diff --git a/examples/custom-code-AD/snippets/multi-group-anova/docs/input/multigroup_efficacy_data.xlsx b/examples/custom-code-AD/snippets/multi-group-anova/docs/input/multigroup_efficacy_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8aedf62fead601ef9637324d53df2bc30b1e0b0e GIT binary patch literal 5730 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 literal 0 HcmV?d00001 diff --git a/examples/custom-code-AD/snippets/multi-group-anova/docs/output/anova_bar_chart.png b/examples/custom-code-AD/snippets/multi-group-anova/docs/output/anova_bar_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae513dd90c7ebee469995f4435588c00fef0ea0 GIT binary patch literal 46250 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 literal 0 HcmV?d00001 diff --git a/examples/custom-code-AD/snippets/multi-group-anova/docs/output/anova_summary.csv b/examples/custom-code-AD/snippets/multi-group-anova/docs/output/anova_summary.csv new file mode 100644 index 0000000..e6d2148 --- /dev/null +++ b/examples/custom-code-AD/snippets/multi-group-anova/docs/output/anova_summary.csv @@ -0,0 +1,2 @@ +Test,F_statistic,p_value,Result +One-Way ANOVA,170.2789,<0.0001,Significant (p<0.05) diff --git a/examples/custom-code-AD/snippets/multi-group-anova/docs/output/descriptive_stats.csv b/examples/custom-code-AD/snippets/multi-group-anova/docs/output/descriptive_stats.csv new file mode 100644 index 0000000..83eb5fe --- /dev/null +++ b/examples/custom-code-AD/snippets/multi-group-anova/docs/output/descriptive_stats.csv @@ -0,0 +1,6 @@ +Group,N,Mean,SD,SEM +Vehicle_Control,8,9.46,1.275,0.451 +Treatment_1mg,8,14.218,1.134,0.401 +Treatment_5mg,8,18.828,1.768,0.625 +Treatment_10mg,8,22.211,1.616,0.571 +Positive_Control,8,25.628,0.986,0.349 diff --git a/examples/custom-code-AD/snippets/multi-group-anova/docs/output/tukey_pairwise.csv b/examples/custom-code-AD/snippets/multi-group-anova/docs/output/tukey_pairwise.csv new file mode 100644 index 0000000..190400d --- /dev/null +++ b/examples/custom-code-AD/snippets/multi-group-anova/docs/output/tukey_pairwise.csv @@ -0,0 +1,11 @@ +Group1,Group2,Mean_Diff,p_adj,CI_Lower,CI_Upper,Reject_H0,Significance +Positive_Control,Treatment_10mg,-3.4175,2.00e-04,-5.4115,-1.4235,True,*** +Positive_Control,Treatment_1mg,-11.4104,<0.0001,-13.4044,-9.4163,True,**** +Positive_Control,Treatment_5mg,-6.8008,<0.0001,-8.7948,-4.8067,True,**** +Positive_Control,Vehicle_Control,-16.1684,<0.0001,-18.1624,-14.1743,True,**** +Treatment_10mg,Treatment_1mg,-7.9929,<0.0001,-9.9869,-5.9988,True,**** +Treatment_10mg,Treatment_5mg,-3.3833,2.00e-04,-5.3773,-1.3892,True,*** +Treatment_10mg,Vehicle_Control,-12.7509,<0.0001,-14.7449,-10.7568,True,**** +Treatment_1mg,Treatment_5mg,4.6096,<0.0001,2.6156,6.6037,True,**** +Treatment_1mg,Vehicle_Control,-4.758,<0.0001,-6.752,-2.764,True,**** +Treatment_5mg,Vehicle_Control,-9.3676,<0.0001,-11.3617,-7.3736,True,**** diff --git a/examples/custom-code-AD/snippets/multi-group-anova/multigroup_anova.py b/examples/custom-code-AD/snippets/multi-group-anova/multigroup_anova.py new file mode 100644 index 0000000..d766eb0 --- /dev/null +++ b/examples/custom-code-AD/snippets/multi-group-anova/multigroup_anova.py @@ -0,0 +1,184 @@ +""" +Benchling Custom Code Demo 2: Multi-Group ANOVA + Tukey Post-Hoc +================================================================ +Replaces manual copy-paste into Prism for group significance testing. + +INPUTS: + inputs[0]: pd.DataFrame — wide format, one column per group, e.g.: + Vehicle_Control | Treatment_1mg | Treatment_5mg | Treatment_10mg | Positive_Control + +OUTPUTS: + - "anova_summary" pd.DataFrame — F-statistic, p-value, result + - "tukey_pairwise" pd.DataFrame — All pairwise comparisons + significance stars + - "descriptive_stats" pd.DataFrame — N, Mean, SD, SEM per group + - "anova_bar_chart" go.Figure — Bar chart with jitter and significance annotations + +Supported packages: +allotropy, biopython, lmfit, numpy, openpyxl, pandas, plotly, +pyarrow, pydantic, scikit-learn, scipy, statsmodels +""" + +from io import BytesIO +import numpy as np +import pandas as pd +import plotly.graph_objects as go +from typing import NamedTuple +from scipy import stats +from statsmodels.stats.multicomp import pairwise_tukeyhsd + + +class IOData(NamedTuple): + name: str + data: BytesIO | pd.DataFrame | go.Figure + + +# --------------------------------------------------------------------------- +# Entry point +# --------------------------------------------------------------------------- +def custom_code(inputs: list[IOData], **kwargs) -> list[IOData]: + # --- Load input --- + df = None + for i in inputs: + if isinstance(i.data, pd.DataFrame): + df = i.data + break + elif isinstance(i.data, BytesIO): + df = pd.read_excel(i.data) + break + if df is None: + raise ValueError("No DataFrame or Excel file found in inputs") + + # Drop any index column that may come from Excel + if df.columns[0] in ("Sample_ID", "Unnamed: 0"): + df = df.iloc[:, 1:] + + group_names = list(df.columns) + groups = {col: df[col].dropna().astype(float).values for col in group_names} + + # --- One-Way ANOVA --- + f_stat, p_value = stats.f_oneway(*groups.values()) + anova_summary = pd.DataFrame([{ + "Test": "One-Way ANOVA", + "F_statistic": round(float(f_stat), 4), + "p_value": "<0.0001" if p_value < 0.0001 else (f"{p_value:.2e}" if p_value < 0.001 else round(float(p_value), 4)), + "Result": "Significant (p<0.05)" if p_value < 0.05 else "Not Significant", + }]) + + # --- Tukey HSD via statsmodels --- + all_values = np.concatenate(list(groups.values())) + all_labels = np.concatenate([[g] * len(v) for g, v in groups.items()]) + tukey = pairwise_tukeyhsd(all_values, all_labels, alpha=0.05) + tukey_df = pd.DataFrame(data=tukey._results_table.data[1:], + columns=tukey._results_table.data[0]) + tukey_df.columns = ["Group1", "Group2", "Mean_Diff", "p_adj", "CI_Lower", "CI_Upper", "Reject_H0"] + tukey_df["Mean_Diff"] = tukey_df["Mean_Diff"].astype(float).round(4) + def sig_stars(p): + if p < 0.0001: return "****" + if p < 0.001: return "***" + if p < 0.01: return "**" + if p < 0.05: return "*" + return "ns" + + tukey_df["p_adj_float"] = tukey_df["p_adj"].astype(float) + tukey_df["Significance"] = tukey_df["p_adj_float"].apply(sig_stars) + tukey_df["p_adj"] = tukey_df["p_adj_float"].apply( + lambda p: "<0.0001" if p < 0.0001 else (f"{p:.2e}" if p < 0.001 else round(p, 4)) + ) + tukey_df.drop(columns=["p_adj_float"], inplace=True) + + # --- Descriptive stats --- + desc = pd.DataFrame({ + "Group": group_names, + "N": [len(groups[g]) for g in group_names], + "Mean": [round(float(groups[g].mean()), 3) for g in group_names], + "SD": [round(float(groups[g].std(ddof=1)), 3) for g in group_names], + "SEM": [round(float(groups[g].std(ddof=1) / + np.sqrt(len(groups[g]))), 3) for g in group_names], + }) + + # --- Bar chart --- + colors = ["#AAAAAA", "#4DAADF", "#1B6CA8", "#0D3F6E", "#E84545"] + fig = go.Figure() + np.random.seed(0) + + for i, g in enumerate(group_names): + sem = float(groups[g].std(ddof=1) / np.sqrt(len(groups[g]))) + mean = float(groups[g].mean()) + color = colors[i % len(colors)] + + # Jittered individual points + x_jitter = np.random.uniform(-0.25, 0.25, len(groups[g])) + i + fig.add_trace(go.Scatter( + x=x_jitter.tolist(), y=groups[g].tolist(), + mode="markers", marker=dict(color=color, size=6, opacity=0.55), + showlegend=False, hovertemplate=f"{g}: %{{y:.2f}}", + )) + # Bar + fig.add_trace(go.Bar( + x=[i], y=[mean], + error_y=dict(type="data", array=[sem], visible=True), + marker_color=color, marker_line_color="black", marker_line_width=1, + name=g, width=0.5, + )) + + # Significance brackets vs Vehicle (group 0) + # Stack brackets above the tallest bar, spaced by a fixed step + data_max = max(float(v.mean() + v.std()) for v in groups.values()) + step = data_max * 0.08 + bracket_level = data_max * 1.12 + annotations = [dict( + x=0.99, y=0.99, xref="paper", yref="paper", + text=f"ANOVA: F={f_stat:.2f}, p<0.0001" if p_value < 0.0001 else (f"ANOVA: F={f_stat:.2f}, p={p_value:.2e}" if p_value < 0.001 else f"ANOVA: F={f_stat:.2f}, p={p_value:.4f}"), + showarrow=False, bgcolor="white", bordercolor="black", borderwidth=1, + )] + + bracket_idx = 0 + for i, g in enumerate(group_names[1:], 1): + row = tukey_df[ + ((tukey_df["Group1"] == group_names[0]) & (tukey_df["Group2"] == g)) | + ((tukey_df["Group1"] == g) & (tukey_df["Group2"] == group_names[0])) + ] + if not row.empty and row.iloc[0]["Significance"] != "ns": + sig = row.iloc[0]["Significance"] + y_br = bracket_level + bracket_idx * step + # Horizontal bar + fig.add_shape(type="line", x0=0, x1=i, y0=y_br, y1=y_br, + line=dict(color="black", width=1.2)) + # Left tick + fig.add_shape(type="line", x0=0, x1=0, y0=y_br - step * 0.2, y1=y_br, + line=dict(color="black", width=1.2)) + # Right tick + fig.add_shape(type="line", x0=i, x1=i, y0=y_br - step * 0.2, y1=y_br, + line=dict(color="black", width=1.2)) + annotations.append(dict( + x=i / 2, y=y_br + step * 0.15, text=sig, + showarrow=False, font=dict(size=13), + )) + bracket_idx += 1 + + y_axis_max = bracket_level + (bracket_idx + 1) * step + + fig.update_layout( + title=dict(text="Multi-Group Efficacy: One-Way ANOVA + Tukey HSD", font_size=18), + xaxis=dict( + tickmode="array", + tickvals=list(range(len(group_names))), + ticktext=[g.replace("_", "
") for g in group_names], + title="Treatment Group", + ), + yaxis=dict(title="Response (AU)", zeroline=True, range=[0, y_axis_max]), + template="plotly_white", + barmode="overlay", + showlegend=False, + width=860, height=580, + annotations=annotations, + ) + + return [ + IOData(name="anova_summary", data=anova_summary), + IOData(name="tukey_pairwise", data=tukey_df), + IOData(name="descriptive_stats", data=desc), + IOData(name="anova_bar_chart", data=fig), + ] + + From 3ffcf0ea8c885e3297a751d9cbed9470c814d699 Mon Sep 17 00:00:00 2001 From: james-leinas Date: Thu, 26 Mar 2026 09:49:19 -0700 Subject: [PATCH 2/2] update requirements and README --- examples/custom-code-AD/README.md | 24 ++++++++++++++++++++++++ examples/custom-code-AD/requirements.txt | 5 ++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/examples/custom-code-AD/README.md b/examples/custom-code-AD/README.md index 6d7fbc8..c634c55 100644 --- a/examples/custom-code-AD/README.md +++ b/examples/custom-code-AD/README.md @@ -1,5 +1,29 @@ # Custom Code in Automation Designer +## 5-parameter-logistic + +Example snippet fits a 5-Parameter Logistic (5PL) curve to dose-response data to extract EC50, Hill slope, and asymmetry, with AIC comparison against a standard 4PL fit and an interactive plot with residuals subplot. + +- **[Input File](./snippets/5-parameter-logistic/docs/input/dose_response_5pl_data.xlsx)** +- **[Custom Code Block](./snippets/5-parameter-logistic/dose_response_5pl.py)** +- **[Output Files](./snippets/5-parameter-logistic/docs/output)** + +## kinetic-timecourse + +Example snippet fits one-phase association kinetic curves per compound to extract parameters (Emax, kobs, t½, AUC, R²), with t-test comparison at the inflection point and a multi-compound time-course plot with 95% CI ribbons. + +- **[Input File](./snippets/kinetic-timecourse/docs/input/timecourse_data.xlsx)** +- **[Custom Code Block](./snippets/kinetic-timecourse/kinetics_timecourse.py)** +- **[Output Files](./snippets/kinetic-timecourse/docs/output)** + +## multi-group-anova + +Example snippet performs one-way ANOVA to test for significant differences across treatment groups, followed by Tukey HSD post-hoc analysis for pairwise comparisons, with descriptive statistics and an annotated bar chart output. + +- **[Input File](./snippets/multi-group-anova/docs/input/multigroup_efficacy_data.xlsx)** +- **[Custom Code Block](./snippets/multi-group-anova/multigroup_anova.py)** +- **[Output Files](./snippets/multi-group-anova/docs/output)** + ## plot-chromatogram Example snippet demonstrates plotting a multi-axis HPLC chromatogram (retention volume X Absorbance (mAU), Temperature (degC), pH) with custom code. diff --git a/examples/custom-code-AD/requirements.txt b/examples/custom-code-AD/requirements.txt index 03bd3ee..28e7008 100644 --- a/examples/custom-code-AD/requirements.txt +++ b/examples/custom-code-AD/requirements.txt @@ -1,12 +1,15 @@ allotropy==0.1.105 biopython==1.86 +flowkit==0.1.0 lmfit==1.3.4 +matplotlib==3.10.3 numpy==2.2.4 openpyxl==3.1.5 pandas==2.2.3 plotly==5.22.0 pyarrow==19.0.1 -pydantic==2.12.5 +pydantic==1.10.21 +seaborn==0.13.2 scikit-learn==1.6.1 scipy==1.15.2 statsmodels==0.14.4 \ No newline at end of file