From 948f20f4fdfdb691c7e901fe1165194ebad4f08d Mon Sep 17 00:00:00 2001 From: Mansi Mehta Date: Wed, 26 Nov 2025 21:14:55 +0530 Subject: [PATCH 1/2] Two Stage Recommender System with Marketing Interaction --- .../architecture.jpg | Bin 0 -> 84628 bytes ...ge_rs_with_marketing_interaction_13_60.png | Bin 0 -> 33287 bytes ...age_rs_with_marketing_interaction_9_90.png | Bin 0 -> 14198 bytes ..._stage_rs_with_marketing_interaction.ipynb | 699 ++++++++++ ...two_stage_rs_with_marketing_interaction.md | 836 ++++++++++++ ...two_stage_rs_with_marketing_interaction.py | 556 ++++++++ two_stage_rs_with_marketing_interaction.ipynb | 1126 +++++++++++++++++ 7 files changed, 3217 insertions(+) create mode 100644 examples/keras_rs/img/two_stage_rs_with_marketing_interaction/architecture.jpg create mode 100644 examples/keras_rs/img/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_13_60.png create mode 100644 examples/keras_rs/img/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_9_90.png create mode 100644 examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb create mode 100644 examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md create mode 100644 examples/keras_rs/two_stage_rs_with_marketing_interaction.py create mode 100644 two_stage_rs_with_marketing_interaction.ipynb diff --git a/examples/keras_rs/img/two_stage_rs_with_marketing_interaction/architecture.jpg b/examples/keras_rs/img/two_stage_rs_with_marketing_interaction/architecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..05e81acfa3052ded89f4a50d610cf68274a464fe GIT binary patch literal 84628 zcmb@t2UJsA*8mtgL_ooS(v+$sNbkM3gqqL;DxCnKhAs+7Gt#990@6YcN()UuLAr=^ zsUk(HpnzaOoQv;$-~Z2AGqYyan#&6JoO|}!XSdV${`3CN66gY4M_&g-Mg{_r0e_%B zA3<)~!59}1NM9cYq6L9Kg6wD@8s>^ zEaK>m6%Drc5fv8^69p-$2K(4MdN|{_9h_Y;Udp_CZJoT_7$;?3OKC$fLmy3NH;i7W zpED}d$jmX+!%^OeS5<{uDOe#G>w|U1*>eYDJ-z%Df|YsyB3A&?XP-rRx&MOTJd}B@ z3{AK-z5SfIrA4Gg#CU<)eoih5NG+Xz>jF7t-hYV<3JMYlk`(dwa}^brmzNh6lMt1V z5C$NG{X@KP_QAql{(S$zpyllE=!fyaVZ6P#&oJ6Mcn9E=d4ZPylH?2s_`i7nPt2c{ z{N?^XpgwNiIB$P9Z=e5b`2QCFpDOA5;2fm@DQE`+js8nMK#k*H;{9<>qW=p(R6iYj1>_e6OI z_&GYeU_718LVTS6%bH`L$bY%>at`u$^mcOg7j^olj{n~}H~?N0=Vy=ca&}VpboKTF z$ireB4FQVndAa{@oBIE?8BxHzME|v~v*dpbRfU_I`+tnx*$a?M5MauG=0MRP3UYGV z|JM)r3=#|mUJMLiS_U9ZOGZISNlir!rltl1-x&VCKYw0=m}tpGDM1uuydZKWG72WL zKd(VtAP@zJoZ@WQ_|HQ|LrzOcMNL5m6k{)d$S45PDX8hs(^Jz>QPYr-Q&57an5da) zF497Hc*QOJ>l#@u@m-TqHw_5Pn3!bc7m$#YLYdq9ranrqZ=jRbF!RGjX4a05jbBEl z6_Q?QYH8~@$HcNZICk}1cPT0+y#DAE6t2V~VMMzu|l!wQ06!JQaep<>1>>ypIcnV3P32F)4>^DIF5CKtFCjitzQP%(=FpvQ(X>kiez9OVhC2j!vgi#&$ zD7?5)fmN9vsz7iUCJ2_)W>L?PG{Q%^JeETCP={2z6%{~Hgq(t5rLh7qeasD10l*v1 zCDPOwQXXNVO!E5WbSrAAGvV328>L0g2IjKk$mu0w{ff|s!R@Pt zh+9#l&V;>tLIv5QX7xRau2H0szuB)w(@Txd0H`6sYuQB=H*+#Osj&ChZk}2j_yR@5 zzeUip*CSHk(w~^w6G-EUYuFDv@gDSlFqS^ZU@_vfX#6hZ`Tgzjeyb+_48>En#ZyZ| zt+y$a-ldJtUZGukgE})zJf|Yreo~p^ zVCzO+c_k_@}I* zv{WMl^;`1u878UrlV_*6e=`8un)t`4VHC?>!vFFveV}C77!39NK6bocNk?+KRsmgZ zuX=@W?ak`Uu)r+m{g-TmO?+9>b(<3w(j9<#bMe=|{$(CkQDlb?Fg~34hx>2)l|QN; zTKvntxtXD0rRx81Kc$H$by5+Zo(b2)(5=$7lmN7FtJktKW9)G3zw(=UKwvREoCNY7 z-vi(7InMy283^pf)#?RDJzoPhI2>R3gKQuW@8B(zraGL+c@=vX)e-znasV-G4 zjX0bj1q=U0IM{cFq4CTz0G*eN<`Dj(X*_WT^y<7x^!Q>i{WW8I4R?`q{EWu>Ga6-| zWlVRi^laO3_}HPLcrIG&^GV-XMaJ~8n#`IY@-@xsHWNC&xn!uVLQ|k8Yu^}$(3?;JomOy|I)i+et<)nXEX8D~ zQok#0cH+GKD?0uwi-UaG#?nD6!c!w2ZS%x8n~xbA!H%_azH@{xat(YKcqZlK^*}~O zMn%cUT+7tM@y74M|5)MMt!0lKhYCKt%)i>OHaN4Bza3%-_J9Z@oLTcf3bniP*XsY8 z?3u6(&+z;8z zKPy6+$`rF8{u<>!;-z6B-UZK|N&wvopMwM>Hbn~l*Ir-$D+FNR*|>K5ogvb^=WO)( z+vNzGg#S>PJ}NuRqQ`0cS7U=e_6H9YYywJ`hu3Ov$I-pd3H|J!d`-D)XKR#~nQhIv zg?XauQOiyWX^L?^C=uan8mS%5Dg+*5ftcn1^Js>-f?z2OYHIC}DTramZMu}}JT5V0 zE8lcZLviH9?3=21_b18N$f(Af~in z!p3>WpG{vkRh0%Rh{%TXwZGBd51-~cP04?+pO}_%$;42g*<3Op=3)*Brg#|7s5USI zQn5UcHgLuZvEP1|n7DMT>mhM?m}pvFHqSd}^SB%EIgF zOf3k-w47C6RB=*ntsUB7Go+PwSYqN~Mk~(kO{cJjsHbg+pq4HgPNAic)!N3r%AZ~V zKKG4_<9n^&_)mB3u{(mY%3LtV)YWcO+ph2cs*5j4syi{jT%xgY;raH|*n?GZFAa91qpapjb4WFs@A?ZfzF7tJGDHbc z!{N-sqxYo#Y^rc{Ro%oi8Z*h~NOy<2Nf;v(VmD;uMbn|2Wn@P$GTUunlkAp-*UN$R^mp%mIf$^hCUszwg?ii4`%na(%H2caDLRO3l#4pZow_2Yd{eU+ zgXKvt)FK)QuxvG+SGOX%Ba{m-u^G)iOIbxckmi-kO{#wHi>+p*^h@JPDv@K;N7`Bm zYCM^*f7leP88-_ySXKJnQn7i_lw7$G)KGvY-xjhWHT?QNy3N9kUmh!rQ-S)SJ^_X-lGjT9gFTbyRxA$K+Y zaM3M#wdH{rkDh*rU?8H7zYR)|ne(;wydn5J39W}g%-2c0D4|_goL@PI@@_a_EGF~p z7*9}&QsWjbON+Yz*W-rrao=C$C3PO_2cT0Li<#e>Xx0j6W(yP5AcXe^UW|osn&%}@ zJ|E?1r?7x3TlHnzs@F}s$OY^sGu~`FQ9#f$T_!X3HGg^uWdS*va>3+B>{A2>Y+WZ2 z$~bbn_2#pz$2z~b;!u+_v8yh20VN90373tU=L8qN?Lw{e`18Bm9=ua7*;XxlaEa}j zP-e_R@sK^!xL|=2AEE4iqTEZK-VgI8@B0~;np&wFtG>tBlQ4F)-;Ul@74y=YOK8OM zrfXx2luFG?2w&0zcX)K`pF2(RGNgX`-hddX__F&5y+b8HyS2miv5-pTX#;3q;8=gL2ud2)@5Q?_3V%3?U{1{^#)&UcJeJX>Q%XQLi#0)v- z!}$+bcsX`jw`Z9(6KA=cxGafXcFsq13t2^DtHQ$9b>>+00A-!#~~ zCYc$q@c40;l@~JYDuNdKZpEmM7VRhd+0BcrNXA*eGP85p>uD3lj&bdDbfY?mN1Jv4 z%%tHURdxjhMk2q{a+S;TlY``+p&2RqmlxNcqBesN(2ZYd>HB=y>a~E}!0?;cV~xoS z=C1>Cm-DKu*(4XnK!+rsg>AHzP?>MxmrHnajA}hCrCI#rWj-8Z-?gE|4zhhiis#W6OQ~ zExVe0e(s5U#5!y<5lsco-50PYSq?vCN+-IbyvPQGJ|z@HnJA*Zb-%$WF84Gp__Nxz z(xc6wU#>KKyX>x6P1uhf67j+^lt3q6d;83NrkJ%ftcqWZT7pe(AWbEZ!g+c5Y1}=_4WR_9LsTcgoS2^F>$MB}b)ZQv=M~m|9zH_=Vl( z`nLtt6JK7rH=|3+|J0tPzsm|6C3q_6h`-<2J~@_Zh? zO1C8_A5UMqUCK@W&75Z-rT7vAap(6(=FGyzcXj%xiFKnl?#^^7Vkt%4-o_=iVV0R=qc6+xv#V>*#XUqqI*U z^G`WeR5~~g`d?l_r%Gb-5B@U*CwpQQ9?zA~xyJ6nMml->evi~F^Ujv-yCfH1h2P;>+>WkeR zdAV)ap>%HeLH(7vd$EU+3>d*xIcr2eO3-9++(@RrJ)=A}GlD6)njro5X{fp-n+@}P z!tPTqu~%FKy0kU~!YA-*tqh?xOtD}3?c7OY^7Us5^o{4>*M4T#bGFJ-fAGonzGc4k zrY~*zq5y_0z2ic+?fM0RO7*^ZO2;>x(v^)pH}ja#EYtbx-A!x{V;G)zVC8uc@z&1n zO8sN!XP$)9X=051x~2$A5vtl=p;vBH4KMPvsGHFEBgbom)fFEYL6*AGdm3jJTx}$l3!-FJTlXxVi!^-+Z$q&bS$zSMTDJBdMZDRI10o50jZ5N=w`88 z5*P~i9DIDz$O9%RtYE&m-bA{}r`7>e0_pQz~RvLUeFe)&AG z19%NBW8HnL=Ie#{d^PU;fvkX zh%!<>*6&Em?0V>x57^2RnY@$-Zjau;-^@ij6T=;qBl|zMHeEq&T~0s1Tg}dzlpSMt z((ZVyEmBm=l|FU;zFWqToibFrs1v4hl&`^Qr0X`Hni{3Z;CXmAA?N0`r**ePv)bN> z>RiTzIrJs-WGLNr5NU>^)bXU}Zgv;7+n9Ll;ywJ>$L0(s-$}Ufx zB=s14>PlHr%H*)1D9hL)jMV622Ihgid;D%h&h2}I6vPt-H#coLW z)R>B7kK5DxntwpwEdPKyvN8-34aXN~a%7d!-dQ4!nDJ3QgQ#r{F|(q@T-ZhrCwkNlH8%bk>Y)IBEeici0_~aHtjYgLS z`Gpcbk1DRIPhUd6OisP>>7Zgkn8zC8R|%X@rds`CRRnIR3dxUI0tvSG$TIj~gHKKF_LO5X)Ncx)JE_LD2 zqphovtq%ucPzjS9Q8Y~^CyWy}4Pbqutf6@~rsNCF5^)C3IaUM%Qyt70WQ)5DIJ1SI zhIyf*WYzkm7#F;C(PPM0E%Lm}1QUgy*PgSaxhLmA%F7E-gtG%$L1{8=Zp@?}aDWMQ z$#B-b5K*QLp@JX_B+ZCqJNGP3m9MX7OH214asRWC4*5P|Xb5>(VDXI>)g$3nKERGM zRYL+tuR3lJhdgr!x9Sb@!m6v33RVlAO!+ZfRd?PqUlDC#T;uASV@xj;z(Q1}hUXht z1TX;t`t#&w@T&f=dx_Ir`g}w?)~Qup@oX0%cNZxaGkq)jCeCnsBQAmmx(fFG{SK|( z6&Q)8;2AyNf;5GTqkX?jf0{@dvLHjIo|81kAeX@(!{59a=Is*NvX^lG;iFBF6Wk@Q z?53b+VgVHK4cT9KV36Bgv8EeFxpG^SNt!~hIfk#_V4J>kHi!@U7wr-mpZMr33Wp7tQz2CyL zRLX3p)FP|~#rL}?*6gpyY|_0S?e{ECsBmdhNu=CTwwjwpP<6Z(w#dQ@BkT<6Dz9qGT^8J6+bnN?^f+sXkJDhPwAi|4z{b~G zX`eZE9m9ykVZZm{Ezxua2uWdEoiS14phCcp`nBLg;jx!(tDy$r_fqo zEJ_3#1Zq$Tlo3HR`oo^phLFh80J|jy&ToUZ(|9|~X}wzvy*OJTQ`UV?;cSeX(ux}g z`I^G)WP==9Ybfc2qGeH(r05h(dYo2bg-)+2wR4B@$?Qk1!IkZVKCQi$xezU9R+RdJ ziiLOY>PMB*dF19uaBEivwJn0eV94l7pl~ZfLN_oA{3K-P{s4S1O@biP@#E;NPOB1m zpZzhd>K;pz&8?#7Uxw?31DHAKeXc3{^C6}XR_8Z zFi)h_5gyIYE9s80k7{UcvV30nnxDJy?dEL(#5b{@7xiOcFAwJuv$w;0*Vq-4Wqu{; zh!no{Ann(^*X%`Fg>rakJZhPw+)?MA%t|mWZ(<7WR`~2evR*6Yb+F<4=JqgYXm|j1 zC*`FCXCUIUT>AqW;phDekD6%QiibD*!emPu$y^3S4CXA|DYbI=YIr{|hnp7Tgw|zt zm*XyMF*C13>fJOkO*XoFxu?PXQt_(`vkBY63iEn+`M78vnC9mc3V48Z!1J_%lC&`K zx!McTmkJex5F_^q4j%}^NrM96yeqpU0Ri$;T;j!gxLq3!aAq!Z?VR;mc5}T=ORrH* z6JlNfz1CYRHk4HN)s|MYFXQnpP1=R+EIK+mn@5eW1}#=uK&aegrmCOnBh5D0K+9+q zf~&QecHQ_udLyfyD>Ii_7Mm4qh+Sfz)9!2-h{q!A^Qq@=VdC``M-sZP=tkTVU(voi ztaY-drzBI%D=hrhWi;i#G&Gz{JSsgABYoUIYN#2I%0?o+ymj8^?f!j z3e4$p<(p0d)8?}&+nP;$7oARQpN-V;`<8~!&UiGy4YYb1#3z?U6peW`QU?&+{k{XD zQjMN^^4LtB-FdS4Np9R^2khtDLSY;2o`-%!eJ-S{g{`(y1=rlo_`P+39wCqT5DNEr zB+GpIde>sCL>VvY(}ADlZYGdc7u6vpDMugi7O6fR9` zR%PsuO)g}UHVoc``x4*0^~JWxuR^gEWNu)@mGbd^HM(%bn&4->SprIqX>_A8ywfeL z0{NEKv*ksZxmNl|3;)x?$W;laWz<5Rz>Bu(C+ndhD= z|9bSfo!n-Q*(tW0KzFDwr;f6JBNWKS=?y zp0*Y@Kdq=TSvj4h0-5N<7Rsj#th{4lTY(B`CR^vj84J=CW=;fsVft))_+RYvD{PGi z1Ii>gOQSYXJ2}7ia+6POGMDQ` zyCT(#@ReF)*YFIO%OaJw7dI{a$BBB$Y+}ypna`U(+Ge9iCw3>A+S`+*&^BYy0{WKX z=VtSlgjyxpXLdoG@n3MggozQcxiJog8Eo#SciV=lVtv>FI;F7Ya$Ch51 zSr0DmG|A33RvJcTu{D)d!s#y@0H>U3$y(qAUqMe#;nsdQ{sH_Kd0^Q_2Ui@zEe<_S z`qg$E$lVj(*sGqoX{Oaos4HoxYfAS&y19Bh(Eu`2YPzDp0COp7(;Dx8z}1{Ngzc^n zhGVFH)EGI{y&^Mw9>qiBL#)vES+cjwbC4I%*uwSzowX_SjPc*1_MtcXV1N@YTR z9f60?Dvx&_`vVG^%^>+1yLxZPiW}QTKO|Pt3ptSr6#degD9#&%G{2P@63)NrKb7NI z;eDO4Tmb5`JNL-}2knp#%W$+bv+wsEm(g11vW|*3VrEN;x{zg22Da6+*Yk`KJ6$6P z6Fe5S9vPb-?sV!u@oert6ng3!hud8Vdj~E z@dKCvn@HsNLnq`%@FKW6QQ~ev8=GDVoKT6gOqH50$e6%vzq=Vr7E&K3qrN zet@txnCU`qZl$Dd!Plq+44xAh-MisG?GzRLe+zw6UQ*Tbh<);i*RbV+ZJ;eq*T=|y zeT)O^{6;FXq!$W}ZfAY}RyOy0oaCYS^jXXV89rpIx7 zQe?61sq#ZbQH(!r`5f?wEv7QOM!MJ5d^pY}e3H()S65UBRk4ePej>3l4{c~)yW1x)P`%BapIBOCx}e9ZdJFkMXOvgtE58WauSv+&qF18di+2 zhlyPGGilf}p61b~f`Qqr$l#shcdtzv+}()zmYryP<2_2eEvV2?sT>tV+cTl0q29Xk zxQqj1kI zO1|ul_%_OJ{>gFXGFCD}#Nlc(`$a~+Muxg&=06}|V}a!%I0HeLw2qs-FlhcD_syMb;99a0Y?#5~qwbSbDXWwr&LJm0)4W|o$0e6_Ua@TSv; zmcaaW*!)9uytu$OQ?@4gLOnOzkiz|%uDYM8O(2=`0k`CT(|KbTmS)+^pzbZYw*9Et z5dG*?i@<<5TLExD-H3P*FrRnk_x3#V&#mdk+c8|5Go?BzL+|>m+gdeVvlV#ec=1;1 zWYksNO8W*mu-P)FO;nmXmcK0EE%cl0_#N+Nt?{wLE)>--gF3j_z*J0%?}MDYt^KU<#3z{wG`LU49(;fj!}w=e76)4YYsXT?>t zS=-MSbX~B#vejgpE}$E}CeW9&Dp$VN;wkW=DXFJ$aiZi`%TBZYxWk?!smTLVW&52e z-7aBaR;Z4J>1EOL(p)bDg##zd7iy!gZc6Lh@EH!cXkL90&deZnCH9sW)p*U?TjIt& z*{Xw<;7H+{>ic{p>3|cS7ktU0j1h6C z;Wj_@_^dIWylPES(hJW8S1{*b=|BQdU*QfNM*5mRATLT< zi|;?a=HN`+h!S)J?HhpmQ}Qdu)57mu866 zf-DsTi))Jm9%t1L2>5aa7;t$`KMFXxRR>OK;3dS(@~Hm1ftRT?iab)Sx_9N#!JC{u zQT7Mzupvm5o=(E3-efl;{`L4U$gND9OvjC&r8G`mTb2WyOSS$U9-!OKNfZ68)UMPh zmKy|T$_-!y)*jys9qZ*)-+7o)WbA#v*ehEt>lS2TIxId>@}eKAe^;p6DHcfxq=I~W z?L-imnwv*TXsyY}s#r|p7_=8csSj@mU|O?3$2(I+X#6BL-K9^l-to8_6s20mvWP>E z{mdi!GwW0=RwQG#ABr#d`a%dg$r8Lr4p%tzG}CP5ks8U89cm!A_Hh&|Km72Tc`rQ; z|BD^B&jzUw(%2M2&$sy*p@{Tk_MOQ*oI?#JSJQ6O;p;03`{*lL2-CPKOGh~5(PAOR zJv^C^sY|agB-q2C`rPRWzMCFs*3XcbP+&{X^liEsah+?wjCfsj%=p)K$j-rqJb#Qv zdOA!e!Z%Zv)Bnn$j?j~fyX7)t(~)!0IVaiM=hk4V(z`WvkmgtGTCS{VV2f3s4#Y!! zxSq{B0(pAiFYZX!mQ5oSP8n35N%F^hTec5xz>3l-C=VeGC6SJRij{JAO^YcxE& zB&xfehu4WT9P^A_4BV8u_Ii1&v=G}gk4PqQ1Yj$?Sg45lMr4l?R;#3i_=8r_jfZ*` z{gxH|6N7hbyy(EmJatb(z(~l7IvP1tl@;R58RE#Ld6MF-F)n zW_UVR5Pa`Z^ly%C*!5cOb1(Mwm6xd8g=BTdwmxWO>!p0!^^At6JP_IIJ@t%kzJe2V zm!%@2Nqq9NxjuN70j8m(#{>MO;sM=kV2dCq)8IovWRnmKaXW92{}?{}2UL?YYrJr6 ze5AJ0>BY7)gJCjPf0Y2gQYqspquWbxsko!D{B3rmKnjsrQS-`A4-;pL zr6-a4PXTK|G22Sjdfv|IFl7z(U#rJwg!yaW1h?V0_GpOdUnzc9K zNM}|5`0Wv*AUqf9K9O4?%tLxLo1&P`AILa3>k3BoDBf0%-Y{W4@1oZNmpchV8XvNs z)Ln9w_i)YmVn0&%JS)#2C2l*bAF)6#dz5&HG(eKK-Jy z+=X5;d9SjpLK?m4-Y;j$?m(qIgcmg$8A;pcwE{KSU8ZIy=|l<{%6Y#mX^gETRfsZt z)IIleEa|2Ht&GgyDDgN;UZt5gdN^#L=0#^op4Fr;AxDddXJor_jh1L;^zhzVCr{CC zNKeao(#?5&OQph>x8}`?YA`pK2^Z4{F1Rw6evDml3_AgOnS9&x%7=yOjt_?xD?&k~ z)n32|iwD-gMMi%>Z|>Thlrzc?qB*Bq+oGZUXT8lVj{pmlvvTg?C&(e+70K|?G#e?p z1n?JZq)uNCNcq4I-yZw<&Q-Am`snStK;G-BbWYlV>t6cOp>_gZd*|eQVZVyMhgLZ- z?+e?+Dm{7dN#=vO3&%d>R}u{*%?HE-1=cOZ6q#oMrbWd{Xn(G+orYwN-EwhQBmBa>t$uL-o^R0 z^Li}$ldpWw;~{A;IBKDF9&KaEKFNl@$X|hYzrD*kW3Pv_;mFfDF925bpK2_hYI{*+ z@GBux?*_bO-dRjH#9$zg=g3Tz{E08@YEr90PdX(5s`pZlPVX3Wnc^p?dV5qwehk%zEuoJ=-p6^|EavgI4OvLZXobwF^w!80 zD@3GbtEDTh`t8$8=+05QvfPi`qu41og(xSFt)Z#xLLoQ8WCLjt7^H8fOOYnh8nK`o zDS_;5n;#W)3MN@M_p#3wu8d_Ky?2=(8ht{CXmVzi8OVToDU6j$w!b5dnf#(jpE9~9 z;>jLmpq<4F&tmA|=P}aE;N^R$CQpk_&BeH@@uy@klkqR-dK_%{sLbu7Q&?@8pQQX0 zpgHf5yRGM=_eszRdS`f$GRnvh(Yt}E%+GISS}8I~4Ps*#3nBrsW@ z!xA4_@tnIQ6mngThoAqpUo#zH_q^s^rH6NvwQo0XwRL-SbD;BX+j#knxj?;c@bn@{ zucKnSk!&sq?y5>3x7R z->oAb6(~-j?e-YptiP4c^wgIYtrxH=wHq?bvu-lJdOY-5!2bNj-PVkpwZ?MiQiZ}& zr&SGWQ(Jz+^mxRgU;9_)jU?iF<86}0fPnQt)mRzUtG93hJ2)!y!$8PiA~?2%zMNcE z>f62tv7DTY4NODnbXVca)mEjK3SHi98{tj;!Qjcaq)#uWE3Sr8fIlR}QFFS9Wv_lUguya$Ub=TCI)Pp+4Y zY<4?e4?p+mcPeapzfc(4dwxxovMZKL_<`v2i1=sPAyHi5*|K@$6FOfJ!TUG!5}|ZK zyF7DPLD#1eeH2XAf_i@5B1-~1C9C{`(2bsn1j^<=AUA!V^#iZIn(Nx|QReV2c20TU zX8%uG*zN=`U#3OOISVmxIxskn+^%8hINBCMR4W|@nZQ#HgYxWG1=nGkZ-|Tp_`p2! zx%s2q)d^sN{sR(vHtLm>EBL7Fn@E15Ut1f@AWzyC`&jfDlvJ(kY2#44P{s4Qk(=r^ z%Qth7*#+`DvWyMj*12vjqdR%t7!*?`X==I4%O`g*1Yx5mn6R~2*8HijdAJuKatv-hIga4FfGf6p6k3)f#bQyf`*v6Y( zGlmm(WwEmH)FD+8)LU`1slih(jJEa{t&>At*Z*Zd~oLz&)KnT#v>9!oG0#D%a2R6`Op(c zsdd`Rfs4a~cAq|YxM*dITWOI><(fF-*+o(uCAQSMD_)vX9v%PkO>1^``$8J}DLuU! z+uZs!c#Nca_gQCEoN4&C-hJXKdW7M|DeFw9cH5n_``uxxF;lljy*l~J!#P_6OSQYl zK8<_~$T~zf4M59cNy+D`JB#h^>YFT2-f+mPbl6S0WOM%aZr$DFfFAsVhk19}S+2mOIRycx6 ztloK;dRo$K8Rm%$e}27_%k%U?;O$egS*|Knf`6IM{@eHbTXQlX{$+tRU5cjX*T^57 zs4<5R?!V9&W1RE4DEzj9QIT%BJ4v=JvyqY~47dx#cJ)nz{GVdd) zPSOp}LO)_g-M(ETRccn6N5@Zf9qP-G+CsaSIN6bru!6b;EEYzd&b*iIP$Cf?s8z>E zM3sPaCG&W3)ue=S!VnIxD zpvy&IDu_u`>-Hbe?B4gRJ295_whZb=H2*lqvAA#gDf=z_;||AV`Sa#^+v$58=Z90= zHSzT?Bg*igqDrnC<2|tZFsMtWTd5(Rx>V(oP|bwu?XVuv0qOU^O08r1EGcE4MYvV> zp9L1+8<#(@_g~*Q8{i(ldSe(ybz{;r=k^%H90c6{lbJvcbOg(zfG8%iq6`+_LOibC z7*f!4162%BgMPwG0)c42;*O4xBd%=@8%#h|6q*{~#euI#>Udb(X1!qSZ@d5I|6Gj^BGFA!)(jWID~E3hugyJ1d+ zY@qp%>;A-4g~GY_|Mox+&J(LV6U-=H;y73RN~34~?^~+oj71q<%a>}=*E=moCN;`a zYs{yD9qOq&LP{A}GCe-kTIW!)ycuI>H}6GXC=_!-glpd*fl(*SgbE|M64E$E13tAp zkse*va9ppq)I^z3mHWQVv2+!19{ z#!sFvZ6@#*-tZ*;5H2%)%!)jGOO#3*nIG}R!~fUn^CgC3;R2%GPy`i4z{fIjuar`; z-%aYgee&R27HtawLgNK!_?!*v*Z8QkPrVb*-&=|iocVX@q@U09ZqAeKOmW^4<1R}BQ2W?hT!UYgl<@Grt zwyNTY!|S`b-+`IGWpef0SIIJMmYM#)Rtp3aR+76FLpDmNluWg?AYj2^GHs=)Yvni~ zxbnG6>u>d=wo`!*Jm&8m{wMupnbSm6n%9tc%HYx3v6S8a9~0j(*&MgDG_c!$RtLf1RPKK%h5@e%^eH*LfH zKm0zpH=qr#G-ky^QA8>oVCW&opY>!xV4BK-#d@#@7vaT$@I!!979b{*trAGUKqi7^ z|AZz|0bR zpvIeRFcp~M)y&C&`^C%E6{ZGbh1&ls2Is6JQ~vxg**Q3NH#oz3?PHI8u~a$nnjoi! zN~7o9vz`nt3UFVhsYPGywEQrsS)S)x)AD6=tU3xN$a1Ln>`4_J8$W+oNrdG0;m{#h zM!Uds_2Uu~?>+LhWY-IyJY1GAX-Wuorfk-*05g|ypxfJ+3uhgavvkfWS?;A+Wea~# zT@>YUQEIxKEp$VEAbORQ9@UNFoa6EmjEwo*FQiX=@?_My>=vmlaBQP#uEctxY9iKa zL^IAYJ+9RG6Px5y(HD+{C@Y(r@E?gQDwRU&@4lP70!4|bvr%68&J9c=p`R%VKH06t zn~Y`U3pbxmJIM^`xl3rw2lVmF#inHTj%Qr(LnXhuVR`@YjCeYMaicyX%t}!rOu6QR zJLx*%VerK9-ktM1U$>NBx3j<&owRdCcs1A-P2XVNnJj~!*x1_l+1PLz<1%=hn07fM zT{k`bD@8wyjO={fes*%V-t~0~Y8WycaJwq9Tz70QxberemQSs}b?#>UojbH?fNSA) z?Y$>YD_u$oCOrr<-=@pM5B$FwOr*0PC?o*K$A!R81RPRAr4R|mIo#J`@i+PQ1pD36 z??97JX0w27I-mJO%4AVA3#g=Pnq{(WzXbj=-RXO-ysd z)gaVBY;8Gs>DKA=z1MB4u$FJrTjv`;d=>ctuKqw(Pv`@#suSZrHB0kVjv!FmIbVU! zR70ijZ<7yV*BZscD#lBoqf|h|G&tcbG`Xe;84heFfa3;_+L|`gziIygsm@ERNg0a+ zd#8Ur#SP6vEyAvM{sQ__8a@-Bb|N(Ea~w6TSS8X)t-$3R7ahduXDjzo#Rl=JcB(|o zq6QiDE28lJhkowR`=cU%Kqp43y`+0t(^)SXGBB6aLCM9eVYHNCSA33>Ke8~hW_En~ z@QdzrYdyqb-_faaRMF%fv*QX{^)2LHkypVfe;-geSIG9FyT`8KAJFrsyVb*m&st

S_(EpJ*p1dj0{)p}3g8o&U6{xud>f{_!R%XC{6SA8qmPWN1Lg6YQ27J5pBQX#nauvVVTU1)xVqsmRZeQ zJv5lO`ug$rsgZ*i)kFA%>REdDAjTu8P&j;`^XTI5iNxA}*~qI%t-H06Rj&F#{44S4 zI`~IEp8cN&Pko4ftfYU@x;IE4%lrYo2Uc8-MzwXmp*-#a6;Lf!2tiN)dI>F$OfQZu zAyegl6am_sh}8sZOvNx%VS7jo`9E#3&W$BYsp&+R{wqGdPHP{=+2}0>6=XEU#}lXdx)!lA%9$irvbtgfqBCePl?H)C1^_; zOZ^{Iy>&oT-S$5WDj+B!(kUg4f^*n6$@iB$o4Oohc^UR#)@kjp_7haD}aNvb?%(syoi(v+Xa zJca(h@P-%&Z|qp_<=)HV_;`7B<2(J)@BG~@L^Nu>W)WB;xqvk?P=}xxAuPT7WR8-C8t)$sx|!gi#=9@C@HGtQ}o=Ss2DMIKv* zo=Vo1UN66ee>tKB>2~Zc=2+o~=_KF z2%VdxY2Q1$~3u4u;%mk%;{}1;ZN&1 zhkm9FlhNfP7PhIW>Jn{go~R}Eu7D2~!^llqm8A8dA5^$ez2_{`kCPIcKYuVD?}aqH z@u{NWq@6h3naD{d-ljvhJUI-1r0m%1d;L@8u#KJB3Qj)609!c!s#oJ&p|#pGHKWEr zr5Y1Dl-EU#?1NIdW<(psBrU~o|0I+1fy%NV@fHUaxtX0Qk^5@mJKJVWpM2j>FCwRO zjj>*cmNAL2CN(~(aDulwy-K=Aw1y=z2zDa@*W@REQR+2rxz4QubvL$IXp6?Vmdcvx z4ixTIx$1uJ&DrSEgtG7yA~zI`l@DD_u-6)*k??rQr4K2PBe5fa`}^<9^L2%I>cHz~Xv9-V##Hmo^o zztH<43m6@%c}72@W&B>;qv#Yl5WEn0!SCz$9iP#b`+}@oV(i6 zvnXm@&nikOs>?}NjQ%DOe!#@KKmAn?fqzX*PRz~=Z2XOu@RFvTOHt>;Z-0*cl@B$kG02PRXqp3(UM!0& z^MuM`eqD&>-#W9T%BS_56E!cL**y(l3sE^yvq_I`^r-k-W(H8810YcaMe7GgpSbV1_gakPkNs4-=cv|te&hr+C0X8=hZZG4jPTob zylshI;Gq=*Qn}ZqeSwLUIDatKnP)N=N>D@9o#VKk5r+On3g06PTzL?Xd`Gdd9C#xW z6C)x%5G2Or&Lh-M<`*LxzDxS+=sYtqr%~3+LfP6Vqoyh4n~w^}Ek&}KmGyv<**ZRt zTrmbJ>c!oo=`?B4-{`sBOxkGyrbHNhc6~l|TZ*{OsAg|sl#56+2IU$ok0}^l5}dt= zUFuMR7(^wWy?(*=sl_cmGTg^foLgo_lMn*t%WG%>3vIV9pjmGucPZ_f6=A=0TN01) z=NB7M3w-)cU-(gBO;sf`_k8y!AE^vxGZ(7B62DQ4z@sXC4%n?@{Q6izdMINuMzobH7v z^by)gA2qDpYsa>C#VjF}NmdxFycEZl)H|U2gJICVN!2)wd*v0_DMY_eqDzDGf9E?} zOK!znE(bTSJ)(EJXY8wbIQqwpY0fIfRq-NaqS-1*p8>~T=-{h7>J+e~rexK8SvfFqQ0SR?dC0$Ty)&y)E2#VDxigGz{ zq)V~}gQ@!XPvuF<@8xnZ1gla(v?!k{z_g1ps`t0BEU`#W0gn_uz)&O_faBp(Kcz^l zgQb2dO;#(Hhsl#PLM-t)4B!gk>_B`BgvR{z4Yvk2HLTlFIzl~Qe%AjTjpn~scQ^3U z3Fg0VXeG5y7Z3&{x+{{b&uKyYUU_z^b6U$u3<8Xnx-=Q?k>#Fe&pzeEk|CWyQJ5T< zawYfV?M<#p|Fd-@>QjTiE66Y*x$P6WZKL<14O5V`GEZoGN_#;>Cn?kbvUP|z0G4`= znuSqMR-t%KZKF{aw0gYXO)Sy*R>QI``+RFi+DF!VrYg3P{XQTLP_||a%7JsRemT>% z^=l-#eF@viv_yGwzF9?Wc`Gt0L=2f0q*BYT44X!XH8*`sVP(KwOICo<4Lsf_xSD+P9{Umn?AbKw9_=HS8SjMzxPi;ke1#3K9x?5+b(V5l}IcJ|MWW?ogFdWyq3O z*-|?H7}pl&SixJ`4_aiwcPA=?zC$FDr(iL!ub$CT3XqiR4f&0|;n{xSSM$nQF0W!{ zs9H1(vC;EL%2H4lNwnu<2NEmF!Fm)oS=>{D3A2zxKOdAKYnBeJ%MY-VA%=7`{0I{* z`#c~Ea#f`5*RkJLxRrOc`;9Y(s>o&U5&aUr5uEnD*C(AiZ88ZjaXNW=D0-hdf?XL@ zzdB@({E@_+#65lvYr{<}uL%Q%e2Y_i@=N`-W$Vn1bT6nFBPRC$w+%Vy*pv>O zPXqgqH;{wm=w(isrwZV0!*+lorLImw#Ac6~6)WCDUs*@4k_0JD&`|;h&MZ%QD z0`)U_@h^>M(rHDF(;|6EUB1`wAZH?@9xB^%Pk(G;Bh9T6F97*r;QK)O$eG3n_ z3F50<7jB7h^!(GkYbHf$N&d`(Q5W>6`P+hKtl>vS)$SqU)OXQsy0- z;|7l0yy8-3Z46tSCU+)3NbZ1}nj7E?=Ek`VGtrjMWppz~N`Dl6c|#n8gL1?7sUR!29S8NB_5o;+U;k8W>k0BKoA@Vi{^4$3#W#KPhr+RDmYva=QZDXxIe@^En zqTD+vQkC#uY53yFoA1%UZZbiO&cD40!#oy%%fZsB9?V}-?8y&Tb+kUVE>``(+o@W@ z^?EW+7W#EaWdI~digiCIrJSb9l7D(oE!v25iDB*_?Xo$`h+Dy^g3k$;x2!M*Y2drT z+tlr-A@t2K!vfj1*e~tyE0?m{$IxV$d4(26Ezp~n1@|4|(_y56NwvAL!)9|gJBg8) zF771WmX=hlsN_ATNbMTmKrN%=CrRHjxX_|O*6+Myy*G`Z)=+JV*u9HRCeeuyIy@-? zD?D(>1-I5X)i&dXhkWIXxh!(fn)6VjwaZk?bvy!DIogGdn}`6wZk+43St`xl4pte>gEqm5)ZH1^q4wjI&o7ch&QIhTSl zrPcOx;UDp3D}OMGxVgJ(m%lXly*nm(tM+<`BgnfNlJvL3yMFVuq zG5rzxn`=)~!NYutG?4sKK)vm zy;Tl?+WZ%_%t6E+nanvDSnFCMtR3?Uzp7~3^>Y&Sv#xgi4qL$bs`K(FJD-P12R2kM zng&Ov+s6!zK~p0>J)MR_Q8EeGn3QwOQ|ZJWpOjhn40PM4_e1?_AR>?k--bG zBJ_FlUC}MHgOJ0=ip?9#&DBA-SDkm2q{@f=j!yg$M5l2zGYK26T{;XiGwWc)23Dyp zAB{4bCHEs`SEWHRzGTyNCR>x#2KJAs%*%D}*_ny_6^IU)>Swc8XYp-bf4lBLi60zF zG7j+ZE11_Bmb9Louco1g!g#OhJ(WS~-@`(*S7>TH@`RoXbX~%@8*G|;qj;I@o|&94 zOqPk{eTG-BZxhea>SLUwG=8XIV6I@269xnfxdPhyPpmUFC|#32$EGopTJ=tJxuqrH z4uX?PQW6SE!>~B6y_*fKULOvc5}X^LUY{me%E9K>0ig?xc8r0m%QW{xPdiTTQs!s0 z1zfDHQ9n&hR9lQ|pVmI6XtYx1>5n#aO{SGbEXaz(gFMA3Wi5CxO8vdCe_#to(_@QD zN_sbyyn4P~@zj|k44e7^wF)ss_`=a>JB#8}u$i4BK~utx47Nxyst!r>*3Z#yaB+zF zdg!8mwt2zFn;cyJ)RJNZRn=TkHa4kDz>P$^qYQ(zjy`i>$Bg~K2)*Z^uuOb>lbyRW zU)J~0C?}NeaX|4X`J*fI8`Hu|Nk(9haE}Dr*ttfb7hi2^S7@ZWTcFrQ9_pi$vD4v#|8OsbMqY zVJ4;)il%*Q`7CYuWhm7D2Q<4`s#T>HaQFRcpzTd$KBdpp30p*H8VTbOaRJu z$FN*YnJDoHOb>h79mC=GJ!NmMn||QlapDJC)+=^})P55tqE|r!7@Ye-^M`lz-alpr z&KlhRhxFhQ=E<~qTNN+F+OQvQphp7`LZzjLDSI(Lppnx1x0~GTlJ<&+hmzyJz5rpE zy7DkZZMz)>z?-u>@gO6xiyP-m9ORf8}Dwg<4kAuv6|jatnejI zl~?3~TQQ3?a%~{;Bb6r)1M_Pdv%?loW zZ`0;va&L;5!c^45O`dU1g-@G%rLSB0x0?8IPQCu!a#d!h%27A*bJW-{Vns+2JZuHO zVzx8TDpoO{?d0!;CX)6na&w*Pdsrc5okty~N-dgjsHJIJFhX!}ASsnCY1Bpf$)xAo zXOC0ATm96ugln@=bycQkCfMLi21OKUKsyst-kjgNfCf%;t- z{k}rK%BU?`yXde|3s+;@c!)*u{$<7c%YnYY`&afx0g#5(SJDEra4p5_Hq#u%%Sq9Y z|Ne>*FSo68J^x_HJ-Is?-F|Y%5h%y|_m$Qi2lUCDmT}&n zWptQp*7Qu4{^;P&m43Z==RebR)^^hd^Xr)iJP2%S{tb-$DE~7=ijZIV07E!7$?x;y zi%GM1FSZhUE*-o)+k)uuXm(B85EKv}{{=GcYIH_wv2Jbw;NY(s4HjLBh&qS$DNCg3h>t|rPQx-Y;APzOqXKW`J=_oV;# zW$8~{r&RXy(f<^;RI=qESGx2@v&ZjN?!H2*vy!_yHn%|9B{|IRgRABTm@yB0M!g#s zdgRo0>spa_=)lgZR-qWAn7cYJwkbn;9x*LU>y5I^3VygODw9kZ)Gfut#(r>V->RqV z_XlHz?2e=1W>&x5v5M0qFMwBsCB%OM%6fZ7`8X%;@XclK_cwR1m(g?KSE?%!w*@Ob zx*ETsoI82R$m5OSciNV}5xMO1wG}?`cNgxlmKC(e?w^)xRrCZEB(!S3zK=hojiT&Q zbT(H|Cln3pjknpB#;M7WVdT#cox244+`v!*lZHneN zKKGFgOi0}0$Fsvi*f_S(XRD9HnA)*1jxU1_?xX9*mc!ra|_HG0{bK$FI`h&2D?ePBHV8eCbZ(|#d1F6SpVgwg%*yBsZ z4U&8D%U|y>=S^Q;-+#cJ7#tk-?2TV2vOWNBuE`_+Q~b@v=ti@Ff>jMfRD-d8V}p%3HjBB{_T5Uz1Q+i{_C7?vtGF!f*puaiqQvJj*Z*3>3bO#gf`t zovEXYOni?8+_zdtM9b#Q@D)ImadhGyZgb{h&>781*vP%KW@2@S8?UKf$uz)3na!k+ zp0@gfk&BxB?2+>6_J{L&HvO>2zOu>vpjQbs((o=L>F2lB2YAX7=@iRj0;AIdU-v(B zdcRosuGbbik*|p;sUau9Vo)}OaO*-+Dp;R|F`|GizclM@X>^SlU@#E^ znBbO1dti}JK@=br)}c~5^ubI2C2l!G@~|%f;?@#C+^QJrg;%uhnrBt$j@?&}_T--+ z*(oZ*GboB3qb%mv1fc4QaR_A@JEkgxQVVcE&SHq}*Tv8^5B(1CS^%42j*tZYok9SB z0q8Q(_$2000QKgl9LHbt3MvmgygK>iheg0{r>gu2`jSb}*T3gGaZ*O&ATd-W^uXT7 ziA5|4uN(HZ*e-!2H(^pjAk%ub+;|cJ)#)Tfjxm2Gl;;uSGU9om;3YSO*f$u05%7&0 zxIRcilIcS2yUuVaYzz|5yVa4Qhw*y>fty;n4`N}5xuY7sdOCQrD#UM)QD!Pzb=>^a>5q- z?Dg0$Z`$q;MjyA$$IXeSF-gv3)N;QoVlxR%>defUJ$h}X(C>p}VH_-ql;A~ZjFv>D zFsabmD8&i_ddyo?tLj58ZMQib!=RNDo&7F-C2*SBknYM19>bJY!28Ly7xVDE^L5x? zTs}~bpbYJ_I;qj;v%X`M`B;3{@+Cafp*4a8s#+pKs?z26gayyacrzraayw4Zt5#%X z)Xo#@EQIf2`=SyP`q_Ey_%HjOC06m%m;l*PCI4wB&+R4XsAx52OP>*V(N!N)1RVAG zemj=aF)@l2ek4TlO-{n<;c`mL69&bmF2~dqezHqlm423baG1o93GU#aOmL0t^vmMs zs_*6abVvzm9#cljx?M0IGO9SfFGMEQmsH?_T#-%8n~bV3#nr8%rsq=|PJ03{zX>OK zST=3;!Uq)u51;n*icSMVM`Ut~L}z&Q%6lPiyiN=#%DY5A~%9$PcB2FRUa&) z8DfIF81XVO?CHEm?mBqoZ8jD(U0GSY1KE zU5KQpD*=S1?x@E)RAQ|KrhIXY4Uw3flbAH_{jlafOa4{=<>Yfv!bX%8=6klnk|S4X z4ekYA@a;Fro> zIt`+&>anUe@`qk?m)3pmXAiC2WZI-<_tR46NsyRqE-cXGIU#1EN<^IgdIX_0RQEgV z=QNd+MGiGM%boj0MhYsO!gVGssccbQbM1>v@E3}j9~&zg(8JE(p24Kqyyi5uDhl!~ zeR*J?$1SO-%-Ap*l!6z*XR-6L8}GFns5i58=4^o);`uvPU9`S`S+1L`{Ra*{2zY3? zbz;ivec`)rC6+wpw_N7`DLlTE+=Olj#6TLZOVH^@WQ5Uqzq>vH2#s<@z}lN%6~{T8 zdNQsWo}T-Z=v&U6m`MeXLU+_2YxNk{4@y}5HPK@1eq)}=kHObj2}l)(5;|E`_C7s^ zg!n0T&J2%&+lfmjuKr-_P}-M94v2&7YL9+55XnQZ7N$+gpqQdJb8CCZBm7miUA$`- zLR)1H%44i2P34bQ*?@mb7;Wy}+L8j5JNih?;;yA?{;1WAKOp-2;UA2zi?`YWdK)IO zlg^(fcmVGM;iS9J8g|DFudixWsyNR{gyFh{%{`(>;u6fcl!EOx(wDn-g=c!@jhEvq z)31!@cBLu%5p$Xv1C;-fDYoU8*zYOHDU({>cF9IGB3hmw7nMvz23oS=F^`)k}{Tl#(6- zCQ?#T$8j#3UVJopTGH$^k`={fmr-BXSFa|s^~n-EvxsnVEbS3xVL%K{T@aV$3Xe9G z6Cid?Ib=X@psNNdNUs+Yv$$Y-$WV!SYW;o)D4HsMp<>%pcY+v>tEI^T{Vn>Tv^}g^ z!l`+|;kb6M=g8uxZ})z-Ydje>hicg22cmQuXrjT@xp3n*^=+Y#MSaAU)Jt&f1qSG| zd8k6k9Ck>_)k_ISKJD&ce5B1CO=p^1#fe}wq4iNjQY;S*U>s8B|#9!Fwetsw@WUxJuFceoq zOdN)ST2aV+i4_V#rgU0^WsW#zd-tu%W|nL6cUTbii1{r4NN!b_ef)U3vt_F;S~p~0 zuDrTlH>Kh$qBu85k1(oTsL9ZHN+|sBWxlGtb*3BOuk{FlYJ4%LnjUNXxdL$y)2#E2 z5_s|0Y4KUR_AblwgPtw1gpHRmQ`sKyl!f>jt!YQI$AaO}A>gLg6fCxyXC+D4ehseQ_;V)seJ7ZA9d}6fbwL1GF#}SM2`!0^Q`HJzo zrWVK|tHOPchZi$ERCcp&M*5$_lNq6x_x9S{l)H$6iWeFXz3O9jbzcI+H73!buMpp* z!JBp}$vmEOl}SPGKS%Dcf#}|p8mQwgDiHdX81wwfCfoEfbIFarCUPXZHp~m}ZYV(A z$SXs)9%&G-hNpgNNG0XsX77gvh0(cv_x*-^$KLY0R=_!SQ3Xmzt zWh;4+1Y9*2@b3&scFuoi0A`!M8ISHTYi^>yRu+(4Jdh+6I}PIn);wUY7k}q!_6k+6 zKZF84YE2)s{Rg{$YJU>eV-z|{G$oO-fmV}Kz#HbGgZ62ru3-d~swIN{Jv?H?OByYe zU0G^>FMKkw@E$SO-)!mt+cc=FCT*sODi|c!WaTBE5toF|VM(*ZVI@EL{2G{`FtdQ1J<)uE8W?+CG2CO5WK(fD;5NR zld-T3O6-X$eF^~VCk_v?tHrJhDd$(1_IPAkVJ{gPd9n@hmhz*U4*a0(v#g`%i+vko za6_$;E?7b%{uUghkHf%L5rb9Vz zs*R;(C^iO?k*or9B;ZdioY=ti=P=}pfOLJH^Tsb#W(R}qM~!XbcD#N~{SKi{Xf7(F z&JsvYoSJ%F-~X&9&d%|a;U1Sx1rL7`hzvZhKqM_tn4`b`6e*TE;$Hpm#kWj`S;kTh z4Q-byGs{w#OiT^Q+BEw^PQQ$rxFd9K+f=(~+n}TCU4(!{-hCvN>5&_iXItqYWM;s# zTr0IDXv%ho#dWF)RkSr-&7w4Tb{dl-qqBbO+6tJGLUx_REm&U{2Bme|_fvXcfALro zajC2KuA)(x`_ZV~-)<<{Q6)9EB{)5W^OVto>#I?iv=t>x+os!RAtY#Vo0|YRWTn^^? z?HF$4|B796n1K$i@S>b#<)Gd=3(xdYrBG#Nueh13X6EJ_dR)+2IHEO3z4`ML9N`ex zf<5UF;fyjh&U~%bxp&zA%GXJ3n1{GnjEu3SZGq=?O2O-)Nc;m&X|>c>JG)m5OKV?r ze+@SQMXQntpm)W4dDD=>C&QKKa_E zX>j>bS6oLki!-XIn1x{}deC(-u47xi^TFbytp%^i#~ghueWopoPA;kjf?JbM)XpQ3 z6H6950H^)dwA{Km z+AkuZICtJ*O&<*r%wdBgVVYghZmv0gIt@#lDeC2){8j^PJ{Y5XbCR*LerI`{8qeKB z32mB11SS*%q)a{If7B9n*PN2&m$y8(sdn`Kv_K@rhFvAWBLOhi|2cX-?2~IM!tJE2 zB+N|o@HjTsGT_NdO~g75mcD6v?LEGDD)FR%{PSyQPLGkaP6(P>gM zV%yCxp~i36@ss?B5VT;fj4~pW#6P-hOs>; zr%FlO_9R!BaV8f5bALSaveo0vnWHklH}R8P)=|l7v%ZWNvEJ*sHH}aW4HMl}9|PUb zlMOc}-CDFz^l^W)kdG4MlgNAAb!^xw>HKIvQiGjCP7v+d+()P^tUa*MajF4nkN;zw~AnBFOfu}a6ZS^pd(^`!d^RtuHu(iou zSS=k_=8f4{eL-wjR4g`gb0iEJge;W?m922dJdUe`!V(uN+s`+OSuM#OXJb6qnTNUs z$yvTSsW^7Gysl3h+oM(1Zb;)R+u|!)D5mBkA%(nt{F84Q@AZ3>q)Y6OE^bzEcC0{4 z=gy?Jfd<7W<5TW*Q^&``be=Ornh6gnO{i<>g43NR>uY9aoyjVWm1fd7la`Pws^#O{ zUOk8~)wB~F9=;q_Zx(w_6*G`TlolnLF~@lAZQ}q@4hp&rQsh?wQWO)rN5k!9t&O9o z1zV%grV7UbEIw%fmJSnHBda`nr`0BSJ9BW&Nx*kI^Zitvd6R(uV0+Q=E4?G9Oj1+T z!UL*PX5FzFBe=tUxB0eEUXP2v>K{cou8n)K{u`Kncg7YJ)@+T+FJx@$j4h#EgH}O21OIb>| zgqO*VzUJ;69)){)>+C8MS&9)r%`&-2N-uokPzHtx=_2;poUWbb;HD#xZVjACgfyPC zb6LE2snewU;oS7Zo}I@$N5*?1nHz`_CQ|z*X}#jVAsXp-9+5sZ-tY^ zP9rL|QH4K@7xEdXZG!Ls?SQmA02sov{#Vxo=muWJ^Z=I+Fdx(DNiH=wAO3HNlLJ0c zHUD4g0e6M?L!d{LrvV8VE~P1NVfxlx7oD_z4{rgi8?<*nj$MgCng>zagD4WL!P!qz zy4b6-6UBfx>fg{P{lWODcDFY*2S;g~C|>9tm?{tuz%miDJTsBGYHgeCvbnSoy402k zBgdT`hg6mbrdD`1OZEMgqmQJf`AdS_7q;Yb^IR?&adb22r+iY&-!q@)svl{8qy^_1 zGWK!%yQQ``b4r?%_Qfqg8#hdp3Urw#hrP^Fv4a8i$P<8Uk%96658ta?9i}W*9mf)7 zhY&=w10-T9j`g*zG+TbiOHH<-at}aTR!*z+mgygD2L0YTWUIXWiA3w)u;SJT)F(;) zp<=y?YCtERvoMsuyeK#ti{s4{(29$)JOUJATNP~yF!l?|IH_O)9F093xJ3o#jii9u z3i8f&m~`itP3gGkrc=mXj;y~fB`*>H%k{fnWKE_WqYD;2dc zc+7VAOtqT+N~``g(sQczqR8>ZjfzhG%|s8N_f<0)8$1yy&APyy7KQ#wtNJz3cdBD^ zrd=8sW!Lbl)=Tm?de1Au@Mnr%qi8+|a3z=yq@3%tuMUVhL;j@I`g|{< zc1Q3O`kyI)yXfFe8$y4@SJMB^{cz`1=^c~0aVn$cd$#A#4cz-qQtrU#RL38?e4-o+ z6jmh|q5thH}pngFBh0@mHnVHQ0X;|LbK5{F=Gjbq)sRcHh95xZDt+GpbSRC zQaE7-N(@aGgid839s4Oqa;cwtzN4$?cP-6yYsU?TdcV%nbH7hV6u{0UtbRDYHbQ@J zxtzPGy75&RIk8W@Xq7wAHPbmI>G3i z`bncr#62$#*(gZrv-joXE(N40+;OkYarhy-o;A3n+R~CZ3=2aM!G{fafZOxo_pB~$ z1?03XH~o^YU5yj8*?TxLZ1$t6KaPyeR9pK+Ngt&Agow;YHE3QX8r^AmW_CSarjKRsG&d+)`6fA<^lNV5EngPYnq+(e z%F2E_Rf}$2v~^rRq@Bc{oy3xb9pGzm(kki+cw9o12=cZ1q6PtJL z=cluG>F4_L3CE$QE6i0n{Ja;Z(aKny}b<)n1FHS_~0n+CAC^(WUO)o(TE@SPdV=8$BBw1S{CN+SuM4N=!R(4YnB$;>K}r} zN|{$zFK7&X^@ZZJ0_cAQ-^!BKG&)6VKVX;Fw|H}uQb7FleIa#JH;gt?=?E-_LHf~{ zb8!UTnSUb%hyeGyXM7-)fXJ)01#iEZe2(s?{arWEo&lWfUe=vfrF*Ns^_A0WJ-a}>Wp(9m!Ql$^@~7dd#lDc|9jy4MxaZ@qSw>hr8J~Xnj(~vECqvRLs^d=p*x8<$jk$so z4Z^5h{W&qan%cJEH~YK!RFB3n0C%BNsQnK{w#tY$eZxEb-4_Jd*(L>6Fdz5^f7{!; zmp4tpPpThZ&J^e!GCXvZdtV5mkNlWpm{N*r7Tu45eh_U;Z9R?V^qkIjbP_J*R$Ktb zL27S#C<0aprjD}1QAG5pXeA1(P?mC)W_Y&h!Tob)M)D~4 z(?$&NK%-$fy0>rD&i0qCe9HPPTu=oFi(Ph!?SYp4JC;smU zA7DhiDeYmz-R{DtqGRAtw9dWet*0<&-KUm4!oNaeozS|4T3wZ?GKX(a=7s!*@LY3; z-(uq~SqI+Wra@1o`xg2X3Vzk!i8y5aZJzw2x~f_*f7^V9qHC$651R|H4+Zmae3|&= zyVdq(xsf zlmEvKtgQTx1&s4=whDua-Wy31q_WFL)wz*xj{6>OzYVIgh`F@LA(;oEj53A}gHW>` zGWDBh$#Z^U$?;!|NZtjaMI8e7pprM=XQ{SEJYxQ38RiJkItgFme6RJd(r<=`e8|66 z0hCn+fPjjl4qg)a2jgAS%6Z!8NmdLqp-TYBP6`+cw?j3><4PPZp3VKim_mF=nJ~qs zyMHU6_uTa5wkVcx5t|0LCM-p@h`oV;MXoAkQFW+O&Pg#4ky;=AaK7D;8T*`HU@oGK@ zOHP|6uu_u6Uz^4+^hDRH9;*F?{KGB0>{B)HJlf&}fyZfCcOTKOwX`(*>BeqSE(l$8 z+aP<5RUyu|r<0~LP{l!eLSQA{c_*e&0)j3OVN z=d(>Tq$X5;_{eqENK@9a5H|_ZTw{j|BF1G7!W>pF<=5PZV>5FU-RHrO#_ToHcEV6J z!?e}Jqr~atdsz1glkr0l{%aS>!0M#}KO{w0i*H=DO73x3_r>f!oIrQ#6Rn%J2FWnj z%$$WugtV=)kcd*m6Yh#j;=Ku4pT~kkLw243>*1lyJ*Z4-D!pARjZSEhVL+|GP4D5> zfKE&R=P+xi6YwVi@_ucDJ8h*Op5uQoV7qnu0@<57_|1YMY8QkJ#RH^+n}jZbtt}Td z=Y}{qOV_()fz=nzsoFHO9zeA}%l>NE`VU4*R*YL8if!`)@J)AAOv5y=mo94mzGw4W zjrU8shVL%$`OXBUOzEXaeEH3O5`mIr5zA=0QWv|NR0V!D)qgP9tNmGx{+WHoIc3Ts z4H(A;+&KW0TM;9?y79@MfAlRsN{q!K$)Pq`;TL4U z@7?^JDd0Y{^PM>Tk{9tgcX7(VBgp>!5~c4i(gO`pI&{=LySEQVUQVSdf=j+Sxj%|x z$&3{v-8QuX-26ScOR+>K*WQ=sZ39%I%Xh?Ahth!KML;c!E2_S+f0F(Icc)v29%u0F z?ceivwJcEYXpK}MRz!wCQnLPGZR^kh+J43Mj#Pm0(JZA9U;|e@;i%n+uDJknuZF=ji8tGX+)Q`pfc-=V;a#q&WC68e zn3waov#AhXT#e_6z-Y5`wP9zFBORH+Cx!N#C8;s8z(-sw#U=qx=`(+a7cB=k7f;-cu32TDK}UzrpB4e~LHjGr z#$S3iw`8ZM{tw3l1Mv<3mL)K-yw-MDOq+4agS5D-O>zgBpS_=Iw-#2jZD`e@ZKGY+ zx`59t-+t-T+Jrz$pNV6(*xlz~U=m?@M$8~LTeQ}21-HMPSh)7^^(qtVP_cj*fY-Ug zcxVPR7s2k$>T(I+Ju4^=(WQcroQu`iSq#1Mje7w#rvA4bJ|j9lma_&Mgb8&%pP9}B zdX9(dZchzJ*LY1ff>nC1dXAUix0ess)4!^nx0z}z@?Q3?U0a+lETF8f(<;1!%HHd{ zuP-b~gIo3j3`OE9n%m{)D;W^s0}KXmHRFPK)=W{-}s+{BLw2&5z* z5!A%yyI2P2dy{V6c&VK0M)@*7GVYmvHC;Q9S3YO3Rj^Rz$=bck_E3Er4>B(^+rs?) zSrF+)&%gtxN9s85zP|~0wM_p9gKBYvVlQ&$+Bz&-RBYtsH+;+0gsE3zW79l)DUF^` zYVwwheOJ6??cfe(8}`wv2~FMGftZe7waV2gf7ZA84pTo@YtFv~kd%Lm(mr&?UNqWQ zN@xmCK|^Gcmr@yQ?QF+F1t{>A6OvrpTzdV#ZByQm?!0v`&TUl>bB;wM9sI_P9g1f= zNoo$GsV-pGr&c}JTJl$$E)7tGZG$ljZEaN0r5gcww zB%wS@2@Yui92RpPz)et?6?yqp2dAagVjOB)oOP|#js-{p>VC(P!X|HA+%Do*Xmw>R zAvwWQe65uLu`m|b6<@Ki2PvfWduRjcXT%{T#7R=Zy;8?|v@ykYBVPimi^&6xyj zQ(bZh5v_jV%RoeO$-*4CouTHW@JvQ3vfO^d@Q3pu)mYkE1r6UBEK50MB9DU#lrGw& zM2^=x$nwYPRKna*FA=0vlT)J0M&gq@DXDVt6f&Ak!r(n+Z@)N4X)N(BubEXQ%_|8! zIcV||9V$YiL&0)YUdoKa9;76LmZhwH(t9@keUW8c77#c};()3x?iCN>&>!0#e=r8t zu3yxRl#gE^@U*nkktdtcp{?IliBpi0acRaec7gAQ$W8agzq}$*0*w`kxuo86&9TAQ zraY*NTUz7?j2zbL1_WA{IL@zXFWPdl-}SrKysXvzQRRNIxxjO!W|>hQJ!$9IBt|9M zR@4sG2~EIc_dph3x~DDP$=oFCdGtr2)1=ewO?mTWzx$3T3zlk8RvLm({D8Nzia-JXZ&!lj^<@hLU>o9rwS8|!b!3%C>3 z7B&}F?QC~YoEhJ;hY(0J3HlVhkD@h)SW(Os%?Cbj!b2lqOdpHK?PJ52oMlfO^mES9;48~q#dbE{UAI8+c)0OrqE&_r`EA=hi*MQdCr3Df4RZ_?(+Ar@E6{Mgn|~e z(h++GB~4C8Cbk1Z!F>gfck)@F7nNd)#wRphbD%vgjD4hKv> zXZp?>Ubp;DBIN!(Wh?c;#PhaZ_0~gWz*hsXBB|{I)F_hwYC5fdu^IF9)pp4KYgJHG z<^SSu+4f(vec zRO@SH`^dLpE?p@tok#q`_fqA=C-}jY@YYzMZ(R?6Q4lBBxGn*C6;+_l+e6lE1E76N zop0zJ3lPq%>i8{Fan9UT{zU7IB<;BeXp~E=8=c@AY`RyOs=yxX`Sq>((r2yG|DGy* z2AK4xh}+rs+4%1S*at~&8aZLQV4D=A9oUY%qAmYM`O3Qgb>Wk|sX`ScFr*n(QfGcI z0T1dUZ;O9%e&TQQx-_Fy_x0;D=YX%@*o!HoePrVY<#4yW*W6mA7RUPu;2e^>g9_1eou47mI>!U{8}xkr~{!L zfxEdFx!@rvrorgWz8v`1NKPV}&=%W)j+LY;sOlOD3Yn0SNncD*2E9VT zkw}U@8>Go)j1haLMbZ>BDmI-ijBXvB@wRm?j>VawsJRB=CDsxl#AFvl?b7UY@LW9J z{{PTLtNYA0t;(3n7ZXbTc(gy1p2coFi{3kD>`ebBu}SZV5dwX(yae)zyc1}Jt&WbU z?ls^e@%=I>Iwi~Xr*oZ;@YRI(TIgT(Fs;CwJb#$jk1zSZJO|^QYI#bEA@P(yc)i*9 zYB^gL99`Citf@a3kzIk|EA}~PtpV6bSAriz(N;3_mHf=$51kmZalK>taTg=$a!2Fg zhW=sDHpP2>nNq~QczY5Fo;&)b0)e|7leo#6Y8BJ?Ldt>OTqfmH2KDftzBH&IEh$$x zB)lICd5M@x&~CwL1B`nT&|nP&OCI$IoimH2Gle5b{| zP^CrQxJ#{!TK`N&ySk}yw1t0tLvS#IU1}?_Szqkd&oJ!ynr#b`L5Nai?RNKk(e!;d zxp4i7Z`%aZi?=My#0gtB@ptagSr!U!MY;u+H#1!6tau(yY?4+d#U;#XAF-kamP_I) zE}Hbk&?dW+n!l4vM8z3uHpIt7I%!;5#S zN@A$8q}Xy6%VE$<%13OVbdk$3@CkX+EH{RQZ!{V;mTHnE+%=gT|2=_(5T*Ez=E7pB zE_BxG%NIlGOI(cTm0`@f@0CuO^(1|Q6=p67k|2z{9qSG9`iG&!$sS(k@j z4#eWz-{RMlE*!OsHOi?t8akx`7VI^iUTK-9-*JxyJZICw*fr$c_;m^jm7&mZ_31*! zotr-xGL5E?=(RcMIT_$Z!kHUgerbe7|F63F-6mP%bfD9s#7RrQ5@V+kpl&|`#b_C+QEP|=jTf=E;Wk1kS(b*QQ~359vA?%QG#GCFSm z2$dTm#P5-FqY>=9rT?TEF26oX$o}_yEe^qd&)Z)c+4|y1ycxZ%BMc_7ymY*WP&NFCSdps6RAG;if%=-sY-Ah8$SkjeeWdlb zcMVQ%T;>Nd8=C~=k2YsT_8bX|13niJCF;^jkJF7TR~qS3x(+>#Vc9a0o>>8Bw-`(v z7{qc&dFM3}L&Z|iGbL-Q$!%EdS^U|KOi<}@o8qQNJ>iy_k?!N{;STnXD*R^_h~GdT z%;rG3g;QRORBk$Wa;R%HVWvXje03R{vW5OXp3XX|$+&<2h={a+gh)tD7%;jKr6fj= z9-&Cbh`~Tgk&+fhcaAP$Y&6o1bZnG_N()kg@!Ru!pY!|gbMKt(oc*!;-urrA*XxSF z6v+i9_|3~r_&6DziPWOH^o}&mgWA4Ec=9y)DFBOobWF*lkZ$1D^{Raz)&*a5rLW^l z77HcIMj!?!mxi0n2 z_ayV@euR;uWKyhpXtOhe#OQyQbbEj4WESI|Mq7oPw7gmR6PS4a1QU`ARArXU;oA6>keG719=#ua|;uSzr? z-v>Ptx8GGuFK&3hke>YUbE`M{W2E92%$ z{C9-RGRi_Mj}tgokyfka*{_zV9{;!oiPkcWZCgyJs%+~-!Vxg8W(|QpxWD9p;B>}GvzT& zy}=o>?djHW#-`-hMMjN^r1OLru~hAOk;mYB_C`9k%E8{&ob(PP4TLr|z?!jc4LcSm zEy)%;XqELa=HZ~EgbtyaY{($(mDFFbKSq~zTn_M+Zymz;PF z;l$_gt3S<4mt#%_0Rv^LpbG~L6=c%3SyCGRox)lQatbb`caq7|#Z(Jf$qpUo4edA5 z3SnQ>_Ttr3q`*dyVru+qOuLV>LvIE{@e+l)w|dwdu_AsG?c=!$R(Z?7kyS<*yF*5-BAt6Sjuh{;+L&- zv83k94I0*?r}cXNR`ZAS>RsbyZp$MxQm5k6Grmn5SUeU4bjeZ>PR{w1z`f3i-g2fP zE;J3#O`L2FX2a^unlcqv!`A#tvpjXuloE##=N&T~uG)ufYyz5{(seO&3l-Dzt)56^}2G*yT|V6zN`St&l5Eiqo{OvY#^t zLw~23u&T}ix~t#*GRc^zF@9QSEzW%I9yIUp(~Xh(ar?>1BqpcO;z%l^2mQ-OK%sAT z-{0hoBG0z~6Wi~M=h$YCp>MTn1Y;CmYw_CKVetnS{|HoY+{GUC zw~Zkx1PR&468#w@Um%N*-wBMY16m^9S|^ToaoiZ)mgh*s*UA8BBunKZi-1Jse!Kdb zGIi4+xw%}1aQZ%%2Q@ZJSLqo!|K&++IM33}$ak^Vs ziW(_!o%blP3!Xq0uc(r?CxOq*#JFG@3hGvN_PS-uHOCQtdMul^WuRf5WiSG0V|BG}pz);Fu<6 zy~G&%-uAai9*O_nJ)fDL`YMB`)JxCoO|;z~ni?0E_QwcAb8hK9<~7?+pD9)`-mt|| z5XTzRn}pU@4f^Gp1ez-m5!uAD`pci@}{;j#iSxf5(!brWS1;^f2<5MOuGtjYO{NCC|`$*=a3v979#~7k% zAxPu<8#w(ikbo{fY+HxFl6Y9W>iC8vC)P$-*id_cP(d*SMWX9pmG)@uuvdaj6;PlO z<3-V1x$*u#ubxr+FD6iXB`&|wZTrF!3SsyiExzOcum>pQAyTFDM!A5aQCdXy$u=dZ z9Pf-b-Bp4#>ahDqWZpF0p9PU~8ME9fCLh@_>*im%Ldl%j?g(ISY`__}O>BgjVal|- z-i(7UniTzw)8xi6jj4SeW2;fy1kj3-3h}Uy*Xjg!ZP_zXNSNCmixhgn<^vP+-v}6p zHP#b~#Jgu7)HS5gPzqXQ0G_0qMl!D>`^}bMX@Mz#vX$$d8ik&io-ygd=$MDzm6(~e z!bp2x-L%D7ZuU=s33GscbQv!X>ms!v2zJ0eJ!)OtJi?@5Jo_Ok*9gQkvp=E|rwg2I zE^XOhWi^UDGGI_PJYbRPHLPvzXtI}oYdX+0RKVVnk;8EJdJa9ZAM?S-NGmtYLZw8J z>v@0eyUtWp8AAldcuzlcQ-rAKd5|@F$ii%D^Du0=b9HF9wN`Y`-j=7JwK6|Y{22FrhaSm$8dKk0%t(>RX3m^G_APZ`<~T=8g?IGyjj- ztM}AYWD`G2Y$FBQV*hcVFRd)4_1)jgZ0e$GJAQ=87=}}5l#`(`C#aflB_6%^|5B-; z9d&P7itv*^DIzcneLJYOO#1XDC15+v%obwXgGp(^lIh^EUTYQ8@XqGjW4`ReH1eXV z)pz}ZpBdK??RKi|Nur~Qn|&G;{gKtWZC03+yY$=736gQ~xjGCbC?uSly+KS4bGqWo%z%#wpB&YGI|k=+rxGe4Gz=_Vsei$dj)t zB3)wp{LQh^hXc`N$o`hb`$89hDfWGFNV&c2WmLJ^hryMnlD%Xm=)mJg6YPg<#$9B13oX-Gc}$L{VJgxu^U-sgyR0lQmv!=u=0>Z zG_`XQD1`mE6^ZJz_c1&wExmJ|g|gjFks-6Gv;?OH3W6rp%$^tTW<` zu6i{j7&Hd4q*NWaQ)4_afU6UyyW@0T~iq*yc+6-B$|#}dn4gIoTqCZpJBqgm%{h&fMYd!rN|SdG z64$OajMB?+SWb|{;YSm)Q8kEF0i6;}y<~HXOQFlzgUbSzpp0xVg*gI55HlHyq0s2NSqY+ZHUCM={>S5Ov3aZ+ zkda>e+{!Jai-fW5z%8UvG=YWwk)X&^qgJ(AtD&dZSMdGP$h5Gmr^Uet|KHmAT6K+1 zY&GkqiRom6<=sI9b!Js7!SvcfM4rGtPFW*Bs$7Qpn-9wipnAVWo&IvbOCn4Xw+^({ zqp1E7^-UW4Qfygsk?zmprB=!gPhnbK2o`u|=8Yx2aV1@-wjhmNpo$VvDI43HC%+1- zwBN22SG75np3gjdDcYa8BRvQhOdOle3VF=7nKtqsNOSvhbTgot)CA32^gwacJMt%L zbx$?st4?D1!}sF1gKP)fu@nKyZv<|`%I$z;N)ALsGa5e{wK_T(@5{Q-5UEgMSUUE| z#&}$oUAil?c7XX$uQJ39kLg2&3yKnwnh zM8RX!)unG#zj=bTrmNunVm0mf#;scQ7NW-*u=&CksKqT?-n>}F%vTb~;fl!<4XOS@;}&W#IHuu&G6$*jm=d5o>;a!1`qQ zXIYQyJpG14L+?ZH@0UtU6?a0JSid3&C9YHD#Q3{#B*b`0YVh-5b)0yyF6^vKjS>zr zG#hn~D#Xmzpz#fPRvFvf6bBq~xqeCN@gdFoNOB2*)O_ETVW7(J#M$)5^>_d<+c z0Y8Np4r#}zd}2A&NZS1rDiu{oL?pj&PW19#>8l{s2BSIEmlz0+uAmldbT$0oaaU^z z!$+vt(d&CR|A<~*UQc}EpFf{}=vLjb-0kIb@H@?SDb27$~HtmxRb z=>jQkYos<01pNIg^?P)mun*@Lu#gAv?craHd#t$=Sjd}$&CsDrsZIRp9k_(H{-7Y8 zB?<9v{4lRQ@m`KQyMX-KDL_MlBu;jLxJj7 zjixxJG^T9dT#k7@(iZ8(;F*aKj#zYQEleJFzX`tLGB}0Y^v5uvP+Wk1e`gBLTE)uY z!ng10)2n-aMT_rXw{u zfxSsyA$?JU1v&MOE<`zd~P`V+%Oxu2vzwqeTK~k4k`9y zNc~{ew|2Mr@yhw;mS2JcMn*`WOv=y5&4Evi1qAZNNd zW=*ya&9GBLMm~|#ZEJok7-Jkkiaj*lCUEQgUmEn!1$?xiI8SQvMJ?NO`QWLf5FT?D zIDbYtvWb1RRXj0$^4M|%Qtz zKJ8B4>geEV>&X3$u3c+W>&B%=DVz#`U~r6pc495t{B0)bZ>zUG=rs>*=E_e@K1T#Y zVq0;OR53c3YKJ~UtJ*5>!CsC8Uq_vQJFDezs1&9tR( zGy@ShmvhoZmR_MWZ?5Z0C_h7mF>We_?Q_lJS?(yGO?7w6JhZeqgz0A`xbKy!`xh2~ zrs1ca!A_fNfz>Y!<4NNzbdOT|#ROKp-%BgN9YCOl7z&4=<*&6`w+3X!4vA{$lY;l; zpH0FK1qP!}OuWOgo`3z75CzH9W!{FbL5K{<6p+NqhO(dJ`Zl(_DV2tsN8t=zN=Z}7 z<{!8!b!lFy%-kMNc(o+KTS^v6eh@*&_Dl`FAFb&o&Wsqy7~3`XMFal)c))7`f5UcT;$PF zE0}Rxxn2z(++>4)=R9#Sa6DgradrM>A}IfM_1<~hdbQc%$!@S_o;P`Y6|+ci-7`$L z&Cf{r&6R2?y#A_v=dG-nFDu0>EYaIj<1OLoWd-pw$h{mym>=jax#{8RcI1`y>o*lv zA%vSQ?vJm4r_?t;_X1jZP25^s2)3WzkP#X|$OR1Pkk8+-kmVySABg=`-B`wB zcf`)c-Co!gb-K}ZJ|NYB{^AY|{MA}|_ivL|674#lLYUE#bZp@XUs=DD^%-iERitCS z+85sr5O9DCihrhJXRtX+0Gz#OXJftiGH*eWpKN@4t}g7i1h;M(P7wdT`UUT% zt9q|jMQA|lwbdg*FwSyJCH8iZiXl30zK+)M7;Lh(l2j9v#WLt}S`9l}=MciQC**@g zBB1SK2$gFLuzlY4{I;+tjJj7u3&4pU`F6lbXU3PoVf2X%wB6i*0?8$APt-MR&n z6oGfphp#_$lG(p}a!QXbXVrE+CYCYN{X`Q#TR&SUHJm-rXkX6Vif|RkvrWT{)v*DU zBts0*jm9XFI~C=AXNQ$Ptc3C&ABtKxNVZSR8gSz)n0;h`KVGO+hcs0^V`n-8o)d~O zYlk44z2Y+g)}xk3cV53?_YK3SVDNIWNv#-bqsKq`B?llmEvo6592?#=R7HK`NWeDg z;K?mx%B69o1^#dr>Xu@5-)u6e?P3}b;}Y)Qx%Q|4u|FbnTVB%AUX-b; zdcGh)M?0xJqgf;>)CHZ;uD`fHu>8PforzFqCo0gghzLyS0=?0yE+C!s9e6SS@mM!w zV%!*9`$sJM8dDJH-sSPC*tYG=yZb>Grl3$IDDS^6@X-%mXMwAPfS%^BH4_VY5*lk7vU7wkwA2vHwTdJIlDKJ9YaY;-+;7norytP-&N|uu?IrB@~$Wf1XpV zXsC_Ri!}MHgXbB_adA}B9$5aCS>PLU>(lJvb8T&~JxBmzs?wn1y^@bR<^SFZ|EpN` z`EM!aZI+ctT}pp^?6p*qGD&G^BtQ!w07j}HODhSYxWFwfh$d&KG6_XZV%(z0R<{53 zi2FYx@krm7t^bHvXS){^oPMR6$>k?a7u+#}$vL)Z8jhu8e_Q_c#7n&Op5-5{Z>I2a z_HAj?5~SeXKO(IM@HEf{B6(WangBlPG@V#F}h)W&Hn)&GM z;Mwtc;__dIm-3=3|A-P?j`so8zxOihor*o9+ja*mBCpwtH*z}0Qg^J&6v=b;;dm9u zL0mf9*WtuswD6OJoyncogPK*}+xwC{F#EOZCN9bD7<^XfpT_Ceew(c)=CKDaM`0D7 zG_AZX6se^2g=FM|>IBzs@t@hN$%4Nhaov-p`EiS41moZA`gFzNi*FQ}*)d=zcLWt( zRH~>ZFLh^V1rY;8fg+SBIhSe^qmK$C@J!dP1kb4!({iRE-_am$(}EE#j^RVKi};Y0 zd!rg#^|~|gud~;&XE!vMpTeKLVe&J52`vc;p`{>RlxjnKSdemEuA&|CC4b?RTNBB1 zME3u@*w*=OThg4~l*$BS5>n$Wi5&q;eXhOPIi$UPz5ic}cDk!p>{6cLjF4{9S!>{1 zonhoPp#$#l<4()w=Mb=A4l-zdK3`1zhZFd>@$s13d+08XOUdAlwW93SYY7w~le~lO zlr6cELOlf%j{8PvRc~!ZpR>&m896tfXm7XWHy7c+HfoF z8BQyossX+q&NVUV(F641^Q6>sfyp3J?5x|^d$1_0yl|gc&?Nm%deTh3tFhLpe385C zE!Aj*GnbaRz7WRvGJm?0`S>SpUliu4NH+rE5#2*sW&;N85%AHz*@s-)AT5bK@DI%wcBK*){D_ z_b-UZR7WnSvn9q#JOmp6;ZiwI5rg1F%{wn~>6(hrHdHCFF z_@fnh%AKL`50wIRxv&_$cIr#q%0uy~QI%M@26n$C@{>9VYe~b#XU8CDn^YnLIX&&~ z2#sX2j?6kzYd?k0KEt@H04EO_S@kWmS5Nvvc$qnNP<6>X)p_M0rW-h+YA6B>=SgYZ zX_huM7#r8&hq-A&nOB*HHNiJ$zKIyzlB;yqJH@DpQ_!hlTQ_@Orp6p7xvj#GPC?V? z7^n{;vQ^u8D*tDiV5w&uPEfoB@ImDSd#LUErV0cq3q)lq6jhIuQ;G`9-rY|fmVPKdGpRI%9=Q_ufL6Xx%A>|x8ju#zHJ-b)o zLpfZSwJ*ystmdgmO0m^ivR5+opxy8XNo}z#SJBmZqt(*|!g?|zk|;U*pk-nPIxUr; z^*y9*|Dj(6t#uZ+akQ%=>kq*55Nb78d<%vh%*)uZ_3l%bCiNj?Zn0pOaatuL=9dGR zRgSy#254mO&6=tFl`5>#I}>RSKxqpm;;Z75Y76tXBdcU8CFe53xJw($)V?Qtj%kJQ zcT(@jM%j~Knk&&QWrQai=?a(Jau~V2NqfSRpeCzX{~V545Oe!a9Vs!Nyy!oTD+Uj~ zb-Gd)f<-jNa#XC6Xv=2G$z%mwJ`2vgjrnox@8mI+naAQoi~HIn=4~3G1uI+DjH=kK zPO@}oWS%^2N}^W~$SZ9V#jVaxtndnKX5CwUyq2)sjQ#$EkGp%=b>^o6MQ+kAkdm#x z19h}>2sUM1kmPA_`tkO;Iq&Dr{u)&(_jD(z-HU0+e2*A~(yBK|y0FO541L#M_Ni+$qUIJJwrY^O0OOcgUZMsh$DR|RGnTx$$bd&H>>JNRpYO0_OX2}t#lSFD+OgW6vJciOwdL$lsyzEr;mM>Jx)RV1>0AJf1SqMTHet-?3Se$V>E6w5pBc5^6;C&rN6575<2*80 z6A3v#nTi;9Zq++E;d?N6%D6Y|xvFKrlOZA_abfV;$jY;vtZ(;%OUfagKYo6G1 zwiH&$r7yNXPzKDDq#nrPAmAV}-f~-uDcJJa*Q6$`Ia(e{*&rFB4AluUOcp)I~(e~M9lLix^uv$0cd*oOn3Ev?F(0UZNOfG&zb!$aFbKf_q zoR_Oy4yZbmX{h(4zIS*EGn;)4V~{U8G#kovYtL^os4IYc_)p{5h|~%%p@m3u((b>2 z2kkSnK%3E zDoqCu>8;>#lrTRKl@xU;RC>p~Hzlj8)+?oy8p8wClPo;lvRt00t)GZuv$0*<1`eu) zbUOi985-hK>Eb;G<;*-XfdYQ6520mzme>lrA^sh7wN=nt14sG1qp6ih(Nr`bXa;I zjl2@Mnn)Gvw!T->(w3%Gsm5ikFi%NGVejKo@BC>#X7$}Sl!6@6tg^SbMh>NnWiV2G z^zfGGU(6Cdwg|BrvX>jz1bqP&(yUb5v^b%Ryjv|_)_O?C%xcmEw;=;!G-?K~>QApdbC)9jqYqw6Y4ruEkwvyu>c3 zU-L3V8PVGRm2B2tdjH8B)5=oj$7O}7Ac#M@uJ7>W4Pw^vwW2>9|GfpHb0#S>ZoKxQ z0)if1NqkO2y%Np3o}WuC~r2Dphofq{%r~v zl?p*PUk7d-=Z#(bV!YTG7hOX&p~<=Ov|;xA8;qo$RA>gJgFBXRr2~?Mho3?ey)P%f z-2}(3KQiCmtK5ty#FXvyszVqa4II{gmGP7YSNsaLkH3hw4|>UOPp{ZZ#(6_vRx$*6 z!u}D7wFfksIHg{xcYL4GZnzt?8-1J5&uLGwlAoMwhqY+ts7QvrlN;Mk#CpQ*N0KMH zxa~z}Yy#O#?Ese?MqK=0UU>tg*7|ZY)XmnnhzfMq6;IU?NkyN*x`gH@CIbj+nv!vD zq3M!siqHMCyiThUO=sB{~<=A;cM@@k{J6nx8?0T5hM?B#Q;?Ij4CrZuPp^ zbpO?f)*M1wotu=!>zS|PBG7P09vQmbN_C1ClHQL58d0T2RH7?{nfA=h-uwP8?S^+w zL?L*lJTA2Zc{1`H=@6MN3b|_G4^_fz3)3R#A`W*#^B#1aJltI@8Bcy}DZ?K>q-K`7 zZj{CzU8Fm>Qz$vIv?S;mm{j*t06e!La5t+uP;LFOc8vV<>7N2?#VvZ`(I-YM1Jyot zm~m5!mo2~ea+@)Yds-@3&V$M*?CoMt+9PKEhXT(BjbrK)oZv8e07$Q+EHZ27P`F;u z8|Xcx0#2L%1T{yR znH9d?3Bag{!Y=u?o(p(ux$xWej;<=h7P;GQguAJS3^bvevZHB8pO!S1sLEiE&F8&( z$Z0CA?4J`IaqCio<^}<#_~bZpSHhS_D10r^qx=tKcd&hzn&90^!@g@Zs;{2;xS@4n*pm?^}7eBleK zNFgNYbALA8t;nOv7thPIYs=Kx-iRiy44RguEOQPa%8~CaG)cN5N+VDTqez?zA{u2Q z>*?L>a_C9_^_#eU5ma#_zu_#b@170uQX=X}YGt$JGErml$F5T?Mz>w9N(bm*bDO2L zmE4f=aQ}aaHPUv?yt=jr4Jt=3*1HaoS zS>&!bg-_=h#W`1E%!AmP2aQ0yBp8JV0QnJ&olgX&ljH6BwOPC6Q0J0qTqY|O3Wm(& zN4M;~AAiZk)?6lUn(P0gIdZ&ewT@iXQPn7;;!8hf@-0;D4X6ds+&D|_mb40!>Zm1+?v zAfeAL<`Wo_1Wwg|Nkp&3e!bU|Z1amCa^HXYU)!kc2RT7jWMN@YKU?@8p2mtexf${Q z7)n{2^KGOC7`eNAl&R}I7u`)2S2ngD&00+~$07w&U=_Ox0Ij)e^TC5iON^>qXzyCkJ` z1fP6^!P09bj%Ztd!fO3eF=H$Jk(h-LEkVtlPzB>4x6vQi(%=@d{J!{49eu4`fX^|0 z&Z927p_SI2aMMUE7ueMJWA4UFK6LJ8=RIxnPq;J3FL`asD5}KESz(xB*Z0YLTeTmW z#0zxCVtD>$LyeVKF@Y2d2SMdsN|$c>uZIS-%yt!Bp*&KJf?jq*5yP(}HQkvh4VT;m zaH+sW1}#1T!voD*Jo8GsTwc%r{L#VyTb^P~(M%ch?*heN@dLU%e%#g~ahP4Tzf1(i z)Y}zH{Vl)@=oa_?8Qs`9IxZh?l_-%R&#X~uY2rdR&M-9YA9aSJw#zeetAR=;cQqRI z2~~uS_xKD6aWWnK%Y`&7n>1}|tro=ZbRiAq1!S*;Fes=@L6|6llvysSZI7*`gg-ns ziivdm;FHI0_;{_v@|T$$73fxTdCmmH(%TtKoJ+2N;R7CM>hyft*r^D)wO8{lQg8Ns z=U;T$t>3NB(#!nudmJ9DE-^GRM$s!O74f8ILKu`_tqy0tZ*wF`?dB~m;K2crpPw+_ z@CUa%Cm4t<<8D#MFMhyW6=e(}bmo$z2%xEHz;9}lMB$UYdoEll9*D7sA2Nv;=bF#b zW;<)Z8uO0g^q;zQtkw;iGHk#)62CTc?os=%$UibZd~Q(QI%cGm)!*7%D>XF#D3+$6bHdg1-rLWIqq&N%>;4{*G_&kf3PmAD-;@FE($y zI40=Z?fSVqGgo|VXMYS^gLb_CG+*yRs*Vspu1nyTqgyv_=TjNpHm~=#kLq(O4`f*m zWN&xrxBij3NOKLrm?v!sb3ZBmL1Ht0gwDQc*?WYBqF zoWC2EKVGh=c^WNOSzHB~nqMI7A>yDp5W6N%t@w2Nei}?U?J02#IBk5U?wMDG8EVQ}&pFX}icJX)m4Cfi<8~*&AzLX`A8wvESXm@UHjXmy?H^(bZwAgPSXS#C=JY zEjk|eV|)(YdDEWSRSLhQ1~f9`TiCL%teSm?)^sv<#@}cM*IAYC33(kjEKc2241D;1&y23B5jD;a)fGbxir67(K<|KeQ&x~Z4Kz0O zZ*ZUtPYpT$8#60mpZmaj-HVi?!(YkCUzm%Ccx#zkK(TZwDf!Q4=njoB(U zMwD@=?N7{qm0?NlmJIJby(>bkYTApE4)}N5*ByF}!CKOOTkY=X!pByZ=1G(W4^*&{ z(Vo1->PCBcC3lHC=%4xc{Ugd>&VG9>te^5rKKd^%-FK=P(|%+c!GF!@cnF~{xmg*) zC|9JIswRw)eCj+2t3{eyO%x-}|BB7WmIBp-UK7L+ZjqOyZs$ss%42YJ#s7v4J zLOnSE-mbAr!cwG0NN@YfMmRZteNs?kp{wRgd}|h0b5k|Lce(~JWfUf>FRYo%{uF!s zU{G*q<9AwO&(XaRT|z5b74cm{q?+v`;ZiT&Smi&#X=QCBAww-F@2k#LM0i<4=syYd z$Khtox7>rm^7n=i03>9I zes=6FRUY+?67mkc505A@SizW&GfqPxLfveS$2akCh2=iN|0Y#xMM4ong{&c~Nxk!T zuBu-D9C1H-(k=gwBx!bj;vS(MIG@D7_r6qw4?iGC|HGUc;fHLOJ)hh01-`SAZ$3D$ z^8ch-GB{6HjG;Tn(^E-~tF>}-AAZ(wM2spYovyr5LzeYbFL!Y9@)j1k%}0VK%40?a zD7;6cXOV>{x&3@iNV}FG7kazGiRktkBZ*ZgLn9{Z?dfc>eZNd!)3dY=y82OGiQ39f=1bVvuDDbD-6$ z*;WcULB;6nxhsc@LW~wD%>%T3I{K$M{bxh>@VtNfJBmnhNr#s^BIzdWS(R1HcrxSXkkh>b@KdOyI8 zu3Q6;k6<>R4qD9LmIV=_rnu}6zFiI(Qi>b3=?iu4qQ+=|+8>=z?=<3&u5(S@Fu8w3 zg-$;SU@mH38eSaPuHKX^`kn|pFqFtW zdf!qqccZQ#>H|#|n*O`-`D^muhp$E+9Z~&t>HaY{`C{ZF#{KWtw8QS2ta78J`^#Pk z#c)~nr1n0(rXK}Z3gDKPU9t zsI0MH`U#!-NABy2trz#=ZGN%ey_Bji2o`!&-gye1d!+Q>Cj42p#+6Il{YPH^_tkZ_ zyIJAij$khcg!=HUy968tx=!*R(aKsk5KAlkFc_!_QI@&eK>lFlTK}&}6>xSuq^Dql z=eJaE*Y1U?aBAZeS96jIEg2Ud32lDgmFqX2t+RU{@<>F?C|4J@n7%kB^6D8^RKbI4 zM{Jd(p-^Pz-cHAC#hP@@Ay8{r@esLLfArSk*qz%z)vvlbTDy@KPoG%LtujM78Yrjo zFhsa@)d!jWLh*gJctiaJO@_R~dxXi^lO)>qD&$rrOb~&Ib`h>^@NVtrflnbJ6rn77 zT2*{3@^5TB`1edts{ys-ROoRtlf_(H^nr>^W8?2+8Ya@z7A->W9GQ{H;q!_|C z&Mi6{x%1!Ha&5gU`0{Y;^ILhXb>IERsal5s@a$w7fBr8>s+J)iFH%oS>dTowtqHy2 zBx^jP#mqS-f%}iR*i|Ug;!#-BF+y^QF!O|pQdgr`sRLN`33HI}&ycQSLl5x1)MSqLJffmhX zZr1v)Nc`6o$efnQgZ;=+=-32`i|vyNmccX>2Usny%?W}COIRhTQuWbqw`3&FMj^*O zz(@T`FDZ`vVt4Qd%$fC8+~RSmW?wWAH>G~;f$~cUtmzzZC=}69mij($VK42BEh!dzKnJ z7ASr0g>}XrQiEVpRi2(B(%94%DvvoD;Jrv*3^O&=V-;wKZbZ7V`u%a7FLe5CGCPe7 zhYrC`Ol++da8LBTQM~P(I2zECIC;P^Ie8B8uyV-EQ7oRs!)tq2;=*H)b6JKNPo);X zrR8%;(O2=g3;^Y2>TaypGP*2J1Krd%_FGvs8EnEn@siC&vqvT6d)W?<#E${=shKyi zmyD+&cKOZy7k5TFH8rHd>Sk-JWNsN-k_s_tg>f#qUe<$KoDY8=zJew} zECpbioJG17m{Nu<*Q8R0N(wC&EiDpSv3R4n*CCBxV85slRfOJ$K4 zJ3xXhxFd}}H%(A};7!a*y%oAQjks^&)t}p^1BW;L(SGJX`k!;FnLJkmiXpGrI8lTe zwwBFzN5m8<3*U9grSON1+bd2P9&B>dh>fsUKdD$Wso(z{EC=5l0-nEQAK+4KE^2dR z?6q~BCpUUTZ-tv^&RE^Jr`XtaUHYllSBw!{Q z#?`QAoYc77^NF;m55$kwm|3ZQzKI)^!q+`g=amx#pHm&&4?UqLdQMU>r;H$r4usCyY%Q$1C5u z+6C+?^IlSSi(5r_v~+fGt7X_|Le<3S3z=@+0<+vjFI0Q6ziAO7L27kd#PA}uWMuo1 z`YycNgkSIDmcZW8(Q+$t2h=0AIvxP}{<72$1*(-S}L|JbZ?DP3Rizh}pl z!cC6M`WE2^%>E1DD*ONMm}ee6|Gniu`cjuQQt)BEi}dV%0{5pJn_>^D5ixr$!rb3_ zE?`8*VV)FaB$7H?LEW{rlvrm6xWl4F0Z|*BpK@81AXKw@h<#Oo1C}vUM+?H_kXp#7 z_%NWAoRztAA;2=I05W*a&C*+!1(!UGX;(~?5E@1-?o70FMC3l>8YeC8*CcxqJ#3o{ zxTM*^lneuV6rI$qbsswx)0b(!u`lPeA>IZfJlm8pqW~^#zVx*q$e1!UPe&@RpP5iM z^lCoNX({VO_ZKn7=~8i9?#y7=`Otr=`ZLG^?Dfs~h_O`-AWO)x(B2KcaBPlR3el=( zT2IQZ^!40qXR@rfLB6+g#vd6Oqwk0i%|*nnEB#3wD^ID<4WO;@vaQbK|$7eOHz zW-Asch*no^3BP`<0K9D32!^6z#_2lO+WN?n5^bSz<#g)cuk9BynF5-@6xEFRj z00aOG(a~$`*YdAGDCStX6jDj`T^ONL9S&ILW=Xdcqx-INjq*K#0+v?aX@*)Ay}~Ym z+93J6vPBn3jd0SLkJ&F9yb2=x@WDAvmC1^JtV1-Y)v#PO2dgYwqc1X#WxN|DklAD} zK&#Q7^T|n_v7g@uy}OWXcg!5aj!5UsW40diK3;aYna$9)+>}_Dw0DlR6>9l%<5o?S ziV9h}Ls_@EJOiFyShw{)QW;F(?Bt>27fTp`bqXkawz64`K5T2qAYfeWsL^CvP^28D zE`=$xP7D?smm+PB3*2(};HBhj^DqmMIk${eljhLYQjK$g+gxh*p@u=kWRbI+bjnL({T1Ld2EGM%8F}TE2+}=M^@s)ppVy|2KP4=T$U%J{l{nFFH z^ZZS>0Aj!GjpeX*Px{uewk^MQqzhQzb{K4-QPz!Px}ggLXvVW_Y`!qJOHzxFQT$X< z@3S04rLdBg9w6d?h9PcynFS2h-NzlvFm3jmOjPGUL2>btZ54_(N>Q_J2`qD%Pu}`1 zLzW`48LXNR%jG3x3c#~eQqNq&EL9(MG9!0Rd*{=r(I4lXl}zQktf3+v|A>l)U`8!I z_4i-T;cOhzc`t=U?Uce1@uxh|y132qN}Y6e)d5%M;#cXal}a4tNhT4ri^9A=dUAX% z>02jT<#*i9Ox?iC!|~(gsX1=$U&y^=F%J<#zv5mX#(>nNq4f`D8Fh96^-Ha5NA$%> zwt%@l>_%8J@okrw2bdZ^^oEN*M&DyG%GI7@z*WMs{a$gCD9dK5ZJKafB zs6!imbnho5iN?~*0(Z~JH}WQJuf=vMP{#+c8u+nw;egrARTUB&=bD{P6f(JOn;vJq zd=VDuTJX>U=DrKt1)r20hI(k4KCQHoh!0Qv@jI-5m>mP7kFWnJK8hT33a1;rhvwt6$lm_sqg zR=s2xMkGL|`N^2VOY|2JZEsCTsV-zDp+XBnuTZpg7{Ur0V-Dbh^qW*ot)k9XUa16{ z2een$iKolA>t(QH5;|y`8;cv#WGTk%WG^#3q@ml^CE&=4Z{|Ddv!u>083$ ztNT-R-i$1snl8GaJ83AChIXZZp@j;4NXV!|)Ztw#VKxjXeVJ-ka-^kf6;Kh|D&qy+ z9`jhkkwh&KvUC9UgfNP^FM1NKXZnRdq@ykwSLiZx>{XeG81DwsMefUOcY0aXws{}z5MeRLf z$0{*uwN_$Nv&-IlQzfy*j!o^Nsy4A|ucG!U{i1!}_xoQLmpqY^XXGR~=RWuS`vHS^ zDw6dD)IQhOCGFrD9K3bJ33MQhf_Hf70X9SLZK8_bp0X&ISZhIU(a_>{(DNcK9L!8e z3W!ilL>k7IE4cVQ#m1GT+t5z}%B1Uh%SjzDzj&@pD}7IG4+DJyc$;Zjl*jL;{DsJ& zA`;9(%mU74TMp~5XRq9U7-kKlo5dGr)oMr?palT?Fm|&t*pHbAJ6|0xwN8gnAVdXf zYiL0`^C4D6$|)H06g)>;{Y@XG(a2LK&3^$E~G4;s(zI3NoADPydqU;Zq+inv;F>OK_YovpCN19w|2IsHYacKrZiu=@A(}O zTu`9#6Q+oKOOtkRP_wL>sv{eaOKyajG{l$eg^J|(D=zedcP;mqB{Hnl8qFTi2VHMc z$c7Qa{z2T`dZ6|j3N0Wn&YfEF>ZJBV93q%*ZsAqp^e0nOyGo`nLmXK zNb%icJ?ICB_CEGa8v}wpv8VY#%&EER#^y7V?-*trPH;s|XUAvtuxDn7UHs}rpMGD* z60I`OEh}+3+}N0lfCSFF)9sGYMKGeKxu%*7KHgKVla>N!CIC|4)eoe&D?jiK!XM+Y zbg9+by-x{0w}m7pQNO&R4j}HS5^3Rh^WmilpsD!2wTUus)hfDdc-lK{%R>WQ4al}X z=+_Q56TPcReAmn?Y+vxVi%(mNrK=Xo&Qqyuy9un|`qN#S*S}9oIIxj1>9|a(-7bi+ z({p}Hw-faYwcu1Er~YE8Of0PF%(+pifZ1Qb2;vEbw2M<_9_*k%Fqn6?*r)Qv+p3tgP*RQmAl4ta(6-?2zjV|!=-L7~#|8ws$X}_5n;?<3X*k!16 z`|Y+_{=JQGJXP28hyKCoFKvZc=7uVoG+GsGO`YZsU@3Jhre|mC{;*dvHm7vGe|g@t zi`%Vr9$0yb^e#4BPA22wMfVrNQ2TIky>d?f4-TSv=Y~sXcka__?^*dcRm025>`>{~ z*8P*oUANu&V1ezG5{NLmFrI|L@UY zmb>ukK)x~H{m4~VM0G=c)fxHUJqST`=C7hR;}He@#UMp-^OY|(h!yp>C$fBJEtGa-K0Q1%_*$4o&AbVxkGgSin9o3y8f^jLt zUW9qPgO!g_$)x1o`B!tHnQaqq(~Fd@Ok#c|TT~>mQGqEuPx>F4pl#Lc!*^PySv%JK z-q&yJxe1KSE(2q}N?sF}9u+JjkE7HAEF$I>gX!uUgNsLJy?W{MkT>lnACH2@M2Ch6 zPM5vUerH)R@0P}>_$w}Ax9$GmtdH-aMdshP{ijt>(jT0q18Kg~GwygX`I~2NqaQj~ zWEr`yeJ1aJwzPNnlJOuyZ9sh{L+-(AYThqLk}EVu;)WyiAp}Y)QCljU1XRGcZ*BRp@iUKCb&Raae;a?Lq^n#pb@7GF(?Px2T1F*I9?W-0c6pU8i7C_G}~3A<5;kc-cTWs*@ z>C()nOZe!FMEVR8;q3}$N;=c$GI= zxvQ?0ONc5Xj~(^VUEuWns@eyXD}JeVk67}*^C9=5lRa>HyM1?9d(!xG%wXX*Vf;@V z*2O{^-gc#?P%XQCO3Yr9w??uC{D5F^e-hu_54>-{8cJcVP+SdhSW&do-=!`8iyYMb z7C)#_%Z#PJ-z3s9-_t7F(O*6)&s@b;3u==g|DwOkTn?%S#$%9qW)0;`VptTRUM*os z7OyhOp*JdIt)7}y2!my-g=v>Z=8q}S%evUJfY2XNF5R)oGg@f9rGD*LT(-D{eB5$q zhml6LXN|A(d@OqZynmC zrn_clsSQw@m*5n4=NsJQRnw;dXoP=o2hKq8m-Z=c6QO6saAF_5u}&8qn=Sev^wUN4 z9Uq@vG9-nZ+NUv*T$#HbcWkdlE0(^Q>)!vB?(5JzZmg+5OV*h@Y^i5+uwY$QcUKbz zK1sr&K@D9Indqf>*@r?Sg_8!)U)GDg8$vEf{|211H}o{l{Rh5TIm zjS76FcLW1I9YO&Cb@@I{>2a;2((?9Dn}K?j$9u1mNS{X6YkTgdkt=%>NltWGXU`Rm z24IJ92EJvD8^O8&gY(BS7Me7W6Y^yng6}iP)?T8y0dw0u&l6uW#-q$Qyh$u2QKw+K z?YNep=$OTG{pBZ^6uL#x--64rCjP_tDUB@G?q?@q!6t|6D70;?jjSFNY!+6KXKFR% zx{G=86mFBhQY?|m6`#aD!@(V`i~aO{k7?%wxxQW*L?23OKd`rmcwfVPe<%KV0w)bZ z$-3W?@*xzN4W_50q(T&RlXg?%hlg(kBt{O{^=4Jb>F>;ddA6Gx08Z88-vg`Ip4oW{ zq$$jUDFd6W3t8(bWfDJzTxiB9I6iQaqu-u*{!_u<-+x}CpPOPXGP$uaw}_v3#=8T# zo9HUjPFt8>?T{T!&JU1gVRfV3B_jSXhPXoU>YK zrFj0p*;kc);yy4+s^L23I3)7W)&8#Agx<8o2NLMHrIhe`U4;c6bE%l-K!!uB@tlSD zlN6-stlt-CMEFRi#e#gATpB$FoZHhm+Y?O7lsDg-(|GiGo*_9y(6fBcSR-vXOlg*BUM(A{ZaXg^4 zr0JN_{asOK4II%ktPvIl=%f4rBF~sL`R%HXUo;hkMSkNQ3bFW^u-2pjOcLh;Ui1nYSsB<2$hESb8N>+P!(DJT84vaHf)>Y7F za#s2?L-4LbK2{$x?aCbHqFcOuCkn{chHI;9za~(0OI0m%C9x17PDM$=*68pZ%DCkN zmc5v)CD=?|=4do+?3#+NN?hKSyzgIAWHwF2Sg#3qSnk%|5QYpc}V`^G@<* zTc4A)@UC+L05U{m^%x~R%?aJ9k4_zywYSkfz*6N?l2RZ6LAAQh%%c`|v(U6%pSb07E3wfrA0 zKiiA~ckwzi;K$KjKLvvR)cSp^pjS>pb4A3?2ueB`Kra<8Ca`e1s%+<%mR8l1XTX%Z z#igDz#XK(e1Up@qrEG1R9&4`CQ9y%7=v`JG2^-}16JAZNd1T>%DT=YH%(!4^sGY(O z!12rqVOSq?$FB05M#!7IgwAiw8jTxip4)z}Y)l?)y|iv4NL-1&OBcK8)@cEux2Pc4iQ1Y)3b1 zH9sqvMNa_&)qDWaUu%M={XaQJ(XxI_G4d0vC-&C#=uukJP8p*TE@2wbu+0FS%XW1< zp!YSTrE}NhRhfHPh0TQz5NhWY-lc!KR;(}zyzUikzg6TQjwt?q%7E7@0C-EZBXaA9 zXF`lEnfs;w^soMHl9cp-Rb0d8t4Z+Sv^^*|(-@+?XB0hJ!chHDce>WMNd+TtEVe8O zT({`rdt4?{eW%~m&Vq%AfL-?sthbH___c^=rp?J#g~QlBp{Et+scjXM*K(C|>G!7F zL*MVyp#Hk5Sx@{j^vogxHsDkd#`E^D97xO|u7}s*=S0a$mcxAqzh=RM%y;fyA@12F0gSX_bgy&l zq7x!E5|sQhE%^xgZe|?8>!;?%pI5c!yb@I3nHQf~NOc;lo4KO^CR2#;b`iFjeZ`^6 z+v61G$j>kxFUl?l>o=dtmyLdw_9(b2pjxWH6m*)GVu<#L@Z0{7g7{oHkVJ$)rk3}P zL3C*(M5<_Ap44xFVIsPmL5lEQ-3rx0hD1Eptm;d zzpnehk|q%ehN-^y=wf7bM9)XHxFY)A5luXvU9Iku&s@QYNQk`+=yH9G6|BL=BNC(+7h_^2nlFOuq8=uF!8@xTEgtky4@L*_Tn%Jhrj^ ztv(i~7Uq|ms!q<5c{640-(76lbpBZznkS{-S=DL#k&eA72{V@hRd3Om|L`xph9+&b zHk1F8h+@ePqnET-TA8Ip2#rS$=t_j5@A~kzoO#DawxwtDLuxsHsT#m<-moS;u3U#=OX^2|jo~h79KD|kTUGKgT2q1H zB47D@yR+9{^oCr7t;DW@ZzZWO18cdc@;*g$_APVHEWeXCfz$wx!Q&iP@ ziZhu}uh7^Yx~(PT{sGS_3V9^e^`!zS&ZsyMzu`erwH;YjwItgg59K(crN@@*5L-@L z&F)krE=D{EO@A(sqDQrC=PBV8!3~ii*5z`q(Vx3tK@9}YYUvbv=pHgHG5BT{Amw5T zkCwE*)=jLu{>rTlD!^B9QAAUWf2Y%t(bUdlcn8t9J04ZljA7{aS&%IJ-D+v>NtK@p z(VEEinI?H#C8NsKKAZWJO>qiEVP07Z>aGG+8}w8(Hb)@{*ORA664V${}(yC z{tZ&n_p-%{ws(ABuPr4;RJ9xsex%IN6@D^H^6J?PHh;TkhvUG6HGQAGr5BGzlBv@7 z*zT%TQmcc*L;-w7-f#<`W{mQ>g${g=1a)irbIL(7i@?TTR8(%oD-k$;{63M5-ZF3> zI8ihig4P%#v`jH3Hu=_XzhnUJRncHZzs3urX};jbzD@j)9#o)HdtdvwuC<*^C(Y>x zHThSEKJU>QJpJJBc{O;N;<&}Z)xm|$O4{D?4dcJEAY-4R_0smu?G%lA#sm&uP&!k_ z?HXoHZ-Rb{)XY241&=ybc|3y&XDK}XsQB@sQJr(c`+;it%wj<%hCwg&>v2eDkrCL~4(+<= zUKq*ZpB1)%&U_F*9=NF??H0iOK&tXh63Zt*i1E9PL_=2D@ZZUqChnp@YY-7BMZ$;o z=+h%QG9~qDWA~PZ?K1Sx>zKk_r;D1<>gkxFx0GMK`=Sq{SnkWLGBgF|%D-|okdwD( z5%A$Py%@VQJlN_Aw~bvfs^Gn+iauD()PRokeD1fvquPg%S>Q5^!{rp*&6-7d8B}_1 zEht#2rQqoSzXVYAYHiD783#7eR%1UCOt8T(t3_QY!JH5P1st|UU z{?nCC$&{bBRK0tcq2&IQ-T-2Y1{|pw1!_)KE3+A}ps`u%w%PkGPwHx;&MdmI-`1UV z0||@`_vDD=cYWHp8$E2HeY)KN#f!#z=sdMO#)st^eRYa9bh=x>(R`d}+| zbwg`5Bu@+Nqxuc)=?YFHoC*ZYpSxfdr}@&6Zcp8RC=H2lG=$wB28E<;k%|4Z;Vep~ z_fF#xGlOnAqRDd&>)2Z+ zjeV8e%t7~a0Cr6v)V-$Ksv*~lr!Su;TKA@pwMwAK&p>H)O0A78!^V35yxu*M`XnAYsB(9#%Tlv zuYehd_9YNI>Q|tr8}jjaL7~xYKoyHxoD`~QupYU1ptsW;UZdc3;n>|*c4}}yP>~1= zypkk&&Oq5;^*M-Ja#dKlR#h3X8M*ggQiigJv5%FY;!odEn?pBh8lrM7W`+{Gi(912 zMt)djwLspigjU&{{@GDX7E(VVN96{HTZwgn{J|lUjNbaM3}hl9tEN3qu%szt0c==C zBz<@3{2eA@w?weqQXt?#_aT1mL!ot#5JfHzD%}~G(n zD&NV&&}{pR14y-s1BH28EnI5hqg;$LgL>G88f`*Ll4E3JsH{3(*^@Oe6C2snvK zcaSiNihy4>PmmN9GIgV$`10mL&nGCnk@I4(&X4Pc!|D`Mda(aApA%`C*)GU=!rWzx z@a^5F<6dyDlEwz=82$$8)=KAiw8lA^Z}VXDmGku1Jbkh$jAr7ztN9Knx5?%~juIoE zA&fSg`!g=Jh!Y?w3s^4Rmss_78`Rh1y9+|J#LCn?t8u^q&F|?t;~(YZIkm+YCioOi zzxa=5vgAL{?nKpB?*K@UY88gV&bkNUkA-+1vBpA>e6-xU{tF&kwPdOYmGG_}A$dN~#^{&8 zowQW#xi+q~(A5vrjQ02g{A}EJP2yNUEVMmCTr`a- z_iZ#=?}paZ=$X2-6nBQ|zU8hk^ewnxd~8)2=QKvnQE}XN`7}O`(26t0!ycP`5{YOm z73-=IT%t?GbXv%YkUHV`i#>6H&)L*Y8-l)@g_YiSNup>*fgkaHvEX`cOELf}NWoAv zfPvWL&(Pbo%XJK^y&vd3ORcnLm(9}}XS!QJ?DzQ=YicWgo=k_)-)Hg*^f2@3r{~^_ zjJ+TI@CY8TNi6ZLfo?wSnGGgBtjHLw&qTRC7>^{l$4;-JYj2$c>h+C9cx?r>XUFK! zH$De=)O%fm=9)U_jej&SO1`|ON}ujS)lqB1tt?c>rvx3cxWh5w(8^<{Di%LX-bSaC z9i7oK3|EnxygfXy5+?9{>?AfT!jgi2IUXWM3D$p?c`E!(7z#B=R-co#jlatGUwo=g zr~vgd0ALX8Pn~1OUecPdC+Ft@)@HzJ{lJ|^2?0@e(Ha2sA;y!Hqg53npn9s|Iyz$t zD~hL=VZCkXO7@a;cmdVUO8v=fF#_wiH;lnnG&HJHi;u}~ViAz7a>Wsy1Q+w;X5wJ) z2~#a0vVUe`gR|>O19m@p+6>nYC%S-3TT_08YILMDGq*R)_eOSGSwUt5QQe zcducZTUfZO4QGA#eLBYmmRM$+S`bhn|4XM6V>hlEj+YU=skL)K7+u!>`=8IfigfyL zl2@u>Z-cWm-9qTqA~2sY0`|}-mB|1JlilJ5e)eTToBXwUoe#U*X^d`cO5nWWmCi7d z`k)r(67&J((pV5;)rL1uib8jmpf~w)W-Q^Gzf+^B@f}>*$?)@N7FAp>@I($Gl3dxw zQ8TMrv&nXXo=~ITjjo8NleBFxwq~FPcuoSC=0)71MrtJjy9zv)#9bf*T^ZR)=_yFe z(qlKB#!i0tex8Z(9o+^v6jsa9gNY5X0+C2Ji%qR9J`y2{$0BONc8UugZ#w ze8d1e4XyIMP9R)(ygZ7(wu>No%!axqYSwfAnYL&xmx&T@0&5bEw=3)PV*pmDBm?md ze>9oC5jc}lqF?sxS$4LSLxw{n$_k}w>^%|G=Yi`4v|p{iv{)6&3bIj#>y<9+m(NtO zGCi}rAs{G4J>ONH!0IuL{@{d|6s|hAHqv0e5aSeRI}XW2(_v64sz2wJ!gSKn$Sy=- zLE?7xVmH})s_co8i=>1pLJgnRpcZLIbD%AW`z+P$X4Jeasz^ z5A&FVreoHPxngJpvjMe4FoPHPtGz(tlCkm1aUl{t#TEqITLgesO}{Do)ZKF_{{Dof zj`dqm)lpM6A{*rk%jXH2GOAMw|HXw%3K|=LKo-Frr(SG@6Sl*HE{MG90>QwE8KNZD zm)Aw*)=5%@UV6$=O&s`%L(W+_Uf*0D7GzzA97hd^M%;fpd>tsAsU}Ua0Y~pEsM^~l zPp!b|`&D2Z$)(&*uDP1tp1XAHhe-Di{JSR)<3WQ9aa@w$w!U%powa$0Tv`a#f~H7pr({&;99H{PL(s9Pu+8 zgPb9cTO+x}l5Kd(N`X3;*meKe4q-M$M~qt(dxM@cXirYsVQa5c+X!S3~!zy)+vx$UIKd~(0E>Ds;RrIgKG5I+J4OaRm9jo8g)rp zK%ef9EvNPn{W$<<;lf#A@SH52lu&dv{bn=5#ZW6Q)GfB{yxJI>VoIc!4K2$T>wMBm zg-rmGmE|(pO?j&vUK;~(=)Q4wmWvlD8qYj;A#Dtig?uPF6}Z;oh)*C!@tMZ`3UgNOR{zc}n_%;Rl&w9H+%0SKyjqjGR@%9m-!=2{GQGx}v&*4r zPRo-G7(jc5ob{C244`!jXST%K#9p`JpT1YLP`vGA)$~b#r2$mO(G$LH&zBWn^Qnit zrc8&tHeb$)Z(mOP2Q2=sH}0by;7=hGI?gqVcbVV9HNUlitmsi70XHrP9j^x&1tCd< z<5lm#MA=q8K23k|-MGGaz0mH>yNR|_lk&$^Ki<6gPoT&I4)Xu-U++%q|M%`VVZ%h4 zp}A>D)5;;zLILW3F(M1kg0ylh6{3>p&D~t@Fih_g`eh0?H7eqZz)AK6s0Q+!lrWF) zcSKJQCQm>N*XctQDnCs>5f+D&4C`e=D|4HN-6sG#fR3;T2^TuyAw5yW3~C z!b)lZR5r2!y5rpDdqG_0j%T&?`@`VYb=}^pQX9J!pM;0Lpw;$)Z$Ht*P2%D%dIP5< zna!9ZUL_0M2n|cAYVCxd)O7J*K6-F-OGXxUIfGHDpF!>5L z2pmjJM1k2sz@$e6gO2ZKCvQJ(N}k5a1y^mU+^4iogH@T_(MC}uxx&ykD32|TZ-OdC?h-5F>Rus50vGX= z1q?ta3VLj}8<=ecv#EL; zne*|Puo`3@0*jrE4AT@IyTdMP zhLSJhvzn&`7$tg%?Qbc1%5O@m%h5n z^DQI~K_D&Xvo30sRiVgl{yP*Ona~8k+Pr%AL z=aPA4a>EH_j$dXojHBK@`!0nt_rGj9@6mXDG?^&(lgC+=TYz2UsRIP6v8vJkudB)38`dV}=}8 z1uP@^3#a|J)kC4dviSUYRSXgt~KWeNNo4{USxY(ob6~o=1qU&E#o}-VdtJv2CSU&L z#v}d1RQZkBel|8HwJkZYSFw1|6X7HVCppzUJTY-Z3f0V(i-Sim_9g%=~y9vdX+*qE<5&oJpU6!Swq1+6l#>8K1@-!=#R;{V?5f zp(W<(MnC2g{*f^iny`sgtNt)8nV7N(>Azaf1+tqN{!RYW9#^R(?vP7q07(q5jq+=+ zpI-WJHkrl2C_~JMCkatL0recyiDBh`=lA2qGRL2|7yZon#C5F9JQppqfiL3(4PJ~6 znx4sib|4tx-V-k@=!zqpTK%^2x$1#Y_$aqs9c1hSK+-y>`E9iEGagFMsN&9`&t;+l zpz#@l{48P9s&RoW%Qh=L1&J}4sLl1V1BxV(!1Y_FMmWpV!gqMLj7lNJ{e??&QeFQt zpTvwVIa=O`gsqkMJCuF@M*}Sj-+cMeI*Wk=(c z;=h}@oRYjl{{)srFA+(`o9;l6FE5Kht+TRQFk6hU8Bnur<;@+aZS7I_Lqa(4W$wzKjuE1 zD2|zg*Bn*e#1F8EKK+eRhRNc5tU@7dhBG#xS|wb()-W^fH9Kk@bJz3oh_FG>cxukM zE4Sd|)(lS2Facqu;7IY~%1+j8U#!oPdtKE-vaMv(tNCVzmDEXiSWs&oeKYeKpcWp3 zG0D#ZhFJ7pZ41FR9oIaBmU}u6O^6f5b&-X~gWmrpT*n*PN+tsiee$KHk--ZVBZLC- znx8rdodx7H1!TT)P53DFIvCD+;5}|WqTNm$tqhZQjReL{hyT*@G$tbuWRTI#(8S@= zbWK%!SfrtMmQcPEWt{uG6kOj#QMBC%&TuBFx;#)1DD1prm%}&fDZa}Xq}EP<%Iz3% zf|-|prv{lo_v2+kl9eq!&*tXUP-@QPVlgF$+$s%lcC=ua8T*1p=l8RI{q*N zs1D$aXt$?I?uf6gNojh&CD0O%4ZUT|8pO1;MaJ?(&g9yS4f+>)CGW*sn~L%@fF`Vt zl^y{oIyzyGfi8Cw-g+Z=gns}Ylcf6=4SRSmkv%MR$(f(25^|Hr1f7^>zPhv6rj#BN>!`!q;)xJS2E1T8qQ@`QxZ1fqxER26oF{4s22WO6)(3N5xN5e0r;bd zzOB=cO^hj$lFQzDf9DY*7Lwz7=h1trJGZcR;E9iChH)7u)|SCR)U}A^79;+uE=w4DrxHHiGsey}40XCE$tG2ZN^J#o zo&ziV%blu!F}JG=i2L5Q>-)_yCmm8%m7^mgb9#HFw4(%H@pg`rsftF+j3qGzokCCk z7wl^PWgG_7YuEeCOD7Fmnf3}U+JE;Og!|h&qowdrxvYn|g(ts>u5NhxmoENH->lEtmRhOT;P?b*b)YYw&!xuhFC96eOV9DEyKe?rY2A z_xzGD<%|V(n6=elLb|s__6`&CCBy{IbM<$e=8g3xM&JJDP4uSVE;!-XdaYrlNIm_5 zTGr3!d&;jyj?}E8Gin8o|E%OaaQG-q7aGmYw@O@|rr`>EzOmlJIRTBRTJ4Qv7eDDc zS*H(2XZU%H)nr@h?UO{ktMxj>=*||tY>7%htkBDW_>ZnoYA&!zcQXWPPY6pBwa(>^ zmFJ=`zNZA^H-TtxQ8tU#Dh4@940_^K52`DcY#f4>THJ(1QZ(PBUB<^)z5}* zMW<3QMJ53#a^c%NX{10ke@$2*U(L0-!jB!^nZ6(CN(XEOKo+H&~%^Kwn4I3_hVz(&=> z#QxAPYQuB#gPa9tvb-#8h!b-DoyogY`WpIXn~eNm<8kgB)~T zaX}KniMgt5@va(v)FXtldzho4WBbu-MfJkLSEa&O<@t!z@#e>^@q*vsx0$W|w@0PN zOSI0ZpXO#+?m%Lg%r8fge{gUwXlwr9#HpIRezT{Ua$Smf^QEYk+LgUR?UJHzc6f!~7a6xl3Ohz+k-6l_Ez5vB}lf%9TXscbB|_FyZO7swXVip@0@& zlTOdfpm!GQ5`_^U{fI6^p+7Vfu4>^}=NukZkqOB#X6rTrs+AQXOY!b>Ogn#Ct7A=_ z@#}(bFi5THJCfmu*c4d;o4(#ssFU{*FQZS|QV^N&=35}rEp1KXhOG2D*90x1sl0@P z2p*C2RQGJxIG7fzEAO6gjy$13e2KZOVz-u)zcku!Y~^uT2p%bcM!>!~fP%BU@p0|I z;bs$ML?iacPBCLTEJf(=#Qt|1d+b+n*xm~Z4=np~(td%ZKxL%c%hkF9VoyrGz6iU3 z)mP`v1kyWh>z!iYe6L({(K{_aXg$RkjH|bbA=;f=L#2!O=Kw%5rRBV1KCqo8_myk)zL zjN!IVqkvkT0IIqx>M{kfjgS9Q<||Ekt`g?kG8GQ>TMK4&7x64R;si)WW_;da61pT(u$R(rage!RToUA$ntxc#gvH?~00%Z+RM znBoGv;!K4ls9TxBb1(nh9%~h%VoEXVuO(}RV`p;l<4(xQs8DY@%kgjr9%uX=0jW{nEvdWuTIa{z;EfEQWHwsW6#x#)2#vo} zi5x}BzDgNk;@*hlu*+aL%~OaW5wH%kS*@k5n1P~ODf!~&Rq#bm9Rgnu+x>c`ft@Em zU8M#f?A;@3O&IKIU(@IR!Fl#{m1>9%Bz4=aZSd>4qDrNrSf@Q2^%UbrI{GFf?I7GL zil!XDX7Z>G+m;ot@QV5D4e6>!6w@+GDte*=Ir}ko>!A%_UZNX46h$6*oI*3^NDWYY z!h?99896V&SYj;_)cG8J#qT)AyRjp2ulI8jt zBl!qj+W{G*as$VHf#Ifd4mgfjF1En3F+XwH9-RJ~bWCa_9?4d7X+y?J%m#SDz{z>f zxqlKA&QYLI@OkdpdBaCe^G>&CV^QHJTV1Y${ zu-jSa_7w9z?>R9tUMqOV_`)>Cnmsa8=nsy&lUh$W>L%GVTS?l zbd-Qg?<}(|7NR$jU=W z+;6#BZT2&iUO8%E+k11s)_O;+E_0k1QZSKoGanZL{BrpMXD@vTn(lv(6C6eDO8fJ+(V0l;Y9{{NJ7a8b>VJX;poTo< z=vy!*E)M8HIeK}wW$f72!2&2po|pu*e}qHC-u$glB*U3$wSV=}J$%KV$t2*yG(f1{ zFTYU{JKV)W1a5wA2m;u@*jU>{{Q%{`XsL^qpurTi#YXJ=l5HZe9+C_2{T6~USEK4V z4lYKO1BY}(L%C#|#&|{>swp-Qwxbr=xXfFC5jU|@aS^4xZ67SlT65p1?Zq;*p5KQA zoA`Pd8;F0*{=-*JMsi~c1%55$b2;FBmcMvlzoXPte|6aS+s^r1gSDLZ?@7)|>6%;^ zYJRI8`CnHV^HHB~J(v#w*88P5N#`}iEU1v?!UWnCS9sO%=R`YY~iv0<;M`2%P zDGiw)-T&*OHUH;fw@qhnE`lKTA`}>BWxe>(^7mmSA$^4mG%fzC&A;`XvAyff|LA_y#Bu2BZ~*=E%yD`!@B9{e-Fzj`koo~ zOr*Fz9{BtWh(`VQWqqFI=5o32ady+hqrmoL)_JtN$4R}GrQo3l9e6&d>VRsd5CS)R z4?#~*BA7NjIq^*b?y&w%mAp7He6IPTor@SJMJnsfvWE6T%JTm+~Av7M$HXfnmeBnO|9*luU7HQ?_b;qJ( zmpPwX8yO6Hjc3|Yh0r8=-pBaPg-~FYRnfxD)aanN`T4*S=7>j2)&2GZF`n6Bbl5Dl zsVZq{{M96^=UjnA=QLS)ljaXj^4O2(f4M$RzXh*Drv4Fr92n_;VhPr{goT#_9EaGk zR`T$5sBzvN&&Q#eYa`t@ndg@g(&^Y1^!PUaJkljr;haST|NKRg!9Wc13+wZ z(*HFd+x|`{g(VkdU~x%IZ!1q}-Uu$7*}MP2;jp=XMP92sZzPR?UPF!E{QO-xj_v* zyQXWA?weM`o-#=5G+FEKDNp+5G_u+2Y1P%QW}VE~FA_|e=>AfXhpE~0(#Y8qDFBFc zb|G3e%2zm6{~${f8q-FMYw65kHDo_E#NH(SJk7NA<2v_yv_e0(aLX(70TB+le}%HG z)KocJ!gE|BfKZL!Ms95JmqDsc9d#W=Dn4xjF+DyCMZ!q!j@(Ecy>=zrZZQJQaDBot zcfyM~8|={XMxZ=o)mZ)q2P<6Bcee( zOy*jV`J{&*2m@P+IZ_ji#KatwS7)Awz#66sG~u%uZu`6!_CJnl6r7VX#3x0NM{V}7 z-BnyWHG2$^W8zp0vgYnAH1efWVO*@dl9OE;@U_5@f)ZNsi6cnk?7DMdAy(nK7vYX;A< z!^vMl85I|cp5fa?cM+P~?DKEO%7=$P^yk#Fg1b>}wZmReX1sa`uXC3!0nqywJx#BX zucM&bIzrAIH3#SI22g3DM%|uYbc+gg3t$a&OrT8pO=jk8n;ByffjNEo7Vs1Y< zJS%ZO3+afi^oo#HR~*)wVyy~P)(a{7^cFL%EadZEut1k(8dh3ma- zXAmQqT|lgp!FUfa&94xqJ(iSo8#ci9@PL7slUs#Lhr}}~@QK^Y&D4E{EiZlNs%du> zE#di{Pm^Me6L_(+X|}Ns?FNwm-=x6x)=xpy26^r&G;K<}*B^pOYI%$J#u+F-YZ=0x zcvzygW36vDSW_mk60ji<<7&w8D>t)dKP@5XmU8c)^kY!}Hj}l8Gh5YG>`yfxd}kw; z;Qo6G1e}Csj=6HauHJ|uP92D@@uqdAz3*hqO>oiuCIP8kGhR___cN+V=L+jlzHwqs zrEhyMV-p&X=j_ORX+5cwfd1o~5i~MAp04z$@kGDS|IqDNeJs6sH&NTR8)w{vuwwmQ z+)m`HIa-{UPRt$Fxm(Qe7O%T!o+T~)3-+?WXGD(OkhrKXHuhgr?q{#N>BMh;kW5qA zTSGe_TPo}ojd;nmN41*#vk-jb2%&!U<0cz#RU9T`3kd@~TyA0m>cFv4y4M(@TW?h~ zpK; zTNT^6@_q$!nOZ=uc|_T*EotHS$U2?pYgrV@TpRwu&{pc%=8L&K*(h39^ume*2` zTcxUXb-|ItrfIYYy97nN+$<^rD$BUsdj?#Np4Rvu;$lfj?|eBWC8A~8JaypWm#zA( z73=>*&_(j2LAm_wPck!{-+9z!k4S&vkU4u=U2t2!&Xv9tAD+LOZ!>*8=EF0X4?#(6(fHKyB2@H9fLDExFz+j}3Oly~NhbT_u=F zIBE&C7cttuPURe=(&y7frgPoajLpprCm~GIqy4|H<)j%H}&;(cdX~im< zGcw5UauGJ{l<($dR1Ymf#}N{|?`M-E`*PR&*Jn@_P-nhl;C1rDc0n~- zs(b9kRo`H-urv_m$u~Ou4I&g$)GfwB>J0)%|JwfcGPAP|kRWq)H zaO8;C(Ct4<5ob3`5r1$tv1Ono%)4)%we0B9N|vjRYSCmco3+YEfKQ^&+vC6gJeiQh zMEzR)>^@(ly+ceVD|4AMhoms^_BDO%Ngz3Xg6`yP9A$wCnt7lh%UhrdOqMYeJnsTD zf+ZHolnsX8(bQAI#lEvcO`g?Av4@IM<>?FnL3(EKi<2T z`ubbUOHH_Azo_;lKJO@McSEgP31d^vJp9!CWOl$u!4YXLv8ffTDD@;{_ow83N+ckE zY&-A)4Msc>0B+ajcu32J-*Mge?A5zWOI-tTN23&9tCO`Cz$iC3z% z{gE>QAy*vItgpX~zj7J9j(wIP7!jXh86m|WD3ELlU)h?EFADWO*iQ2}Cq<8B=(2!B zDsm8|iH{0*r>>+?kxhz888kH?^0A>1o1%$^CtM?kDdYx4x=A1sq^{3MViLhC#xzX4 zep(24PKVOrnH|~WQL3w!`XL#a1<*`we-6; zUQt?Aqar(BN{sA;I~mo2)!&a#Jcai{mH{qfN&GBaK0*6kU_a((HrOqXV9ru9d* z1w4D-Y9stRw$N}msKl5YV`7JULT4%9tszXc2?_TED7$FLiQE>dADwmCn4H!qzCW0J zbhxLSPF0Wx;`VSn1&4~--<6A=|9@S*c|4Tg`#)~4$dYD+5ZPu%6b)&Rb?oaH`%)BH zLS#uIYZ&`7LqZH=8C&)>O16mXI~Cc=5|X0jd#G3M&+qrgJRWl|=RV7QopWF3x}MML zvavB0q&|H_>MiT1Tg{{z$>~!zW_fRv%1&|6*UF8wUgUnaal84NwXf!B4Q>E<`RwkzX)H7l*7uWdpz$$PK?CAxT1)Twr6#|N>zHA;PJ zBl`4I?|nfTOg<}77s6Wd-0?hpoubqd=Nf`F{rtrIOTx6hZ9PIIg(sQQMU<~HnShP; zh;->!c%gne;+ga1O|isWE3qcI;i9@%`W{;Df|ieJwft-`wZ>1B_u8%%d)K_V^lYas zDauG@#l8JTU%=e(vkUEMU(V=RCkm_ke}NM)u?lwTCthk@lVHgk&b@UMLtjg6)v5XA z4AJ?OyiYjzHff_2oFDm!gmrs$h=)n&V(V~rqo@W<>uI~JsTHj$%;1SIX-aF&Myfz) zCc#a3Ic@96%z;(N;{7MCvbM;xAsR*xK_Zw6;B)xrfOzZ3#5}z&E~r!6jvdXaOV)C_ zyr|_U;+7iTX7I7}X)*kCDpP?d;`9al3Hg>X@eh94wHU=!J`EbUfKO|pA}t7dsYpfI ze1H{85&j3tO&+;UYQ0FVX1emdelO2?)QOQY*TvwL{l~8b9(I$j=(gU~UcRAi-_|ZW z;aDyi`Yc%t^_f1sRa2sx)qQEqxY;G^64pXbt#P#g_k`_@+%g|tLpvFn7}jyR%d2@6 zzQq~_6+&^Dc<4?;TsM$qY79v}&gV||Hh48lPC6S5ZY54)^-IU7*e-Xue8@jS*iw3a zd1Czbi2L3}ca&t}a$|aO1F76KGlDN~utMy74I!tl1f*@4glt7+MO7&>gIFe_#%)`N0k_lZ|1Y1Yhz*pwLRvf+i=2;PlyV)yVby``dQ>V(R0UhOMz z)dH{@eSeKLEe1_1{SDrCbN7pjQS(vew=BH0{mdFljdPRS(rLPSC0;AFkDN>ogbbD5 zVUT^L>y=bpEl@G3Mb zqk$TX+nkt70wo9r^-}FpT&+4mWMpoM$>o_o|CDuY_HY$}#BnEqM# zvu>6sjFKSrT`2jNPp@J}>c`y%Hvc0bvnCdM&7V8e5a0{_4$bzY7>01Gk&# zDP|C)SM14p)l-rC{)jsb6;Rv>GfJ!UFDt-B%^3m9N<*Y!_0jBP=ncl}TB)?BEJWH~ z{HBr515MlQ~N)6ga~>eZC5kCu&H zx%BpHQ)-a5A<}pP1-Hjhj9C?28GF#y_yN&K|IUdSfYgB*t?<54KB?RPj4_aVXMpoGKpLQ-EcOJ4tkGn0 z!t>3kf-6UyJBI2HJ|95cxNsRlBw0^GhS%;EODC{OEp${VllG0#A0xVyfzM9(N~LUqB6Un(IjNz8D2h?D{lJY8hnTg_~PgLn|Gp86}IpK)Xi@ z1fNmO+bj1}%J{}{X!=$)-ITpXrZ-y@CVc2~O6If)E}0_q*r^zYQ)69@FO~c>`%xmi z6lq_7=ShjXDXH_lndWZKupd44RO%3wcf8My9fP3guSr*Pf4IfjNF{wi5C3G+JdH4V za}93Y53)1)IO3CnUhU{C9eX7$|FEVf$Z^z~vFg3u=&Y7oR$c4x;NTqVwvD&_fe%g_{pSdmg0i|p3w>Cy3KImsQmW{XnNV7IGsT|*!QRTe)FRb+QU zOn-&n$dIl72;2v4Ynh2Dmz#sS=^5Q#E(E@X31TqZB8xXYyy4dJ*_oA5Zo?<+wC~BB zn2fpIlW3)N4o^P$%7r9N5@2$QxJ8kr0Wvj<9AlBY+4F<5;Y_NPB#W1Tv3p&!>I%0# zTw{-VCA@QnSYA(sbMD$Uw&{Og)x_6NBH?W`PV93p7RX8f)i$QpvS5T==4DU83Cu zJ2hKKk<~f`GR=L=6}6~w&olM8L{mOt-;q|6qfd%#G;lpaJw)OiYyFAEzADY|TNzCJ zNu<_P?9|kw*eu`wY2NL0B&z_CohioV2!vK`tb!#dS2h%Z$tOxJ}qp_`$hhmkQ{J`5tLfutGj)+ManR+@Z8gk?(uXt zca`MqnuLVqbPDux%A4`=V-?D22zQsI)$AY1?4Ps?{sHG8ilp+>Efa} zF|rCRnUxcSng~VpnK=Fdwv;uHsDIw;jp*4uh!y}wlvU9h$(8xILeZZCJ;U~mb-vuQt z?pl}aE$05@)O+QO4Jsa7^ZxW}JRr;SSnY~{W&Tgbmb>1Hp>Hiuruo;skN-_k088O? zkzHHp?>{0aq-HZolr38i&rw)S7QzedR?80AXwg5}siT`armYm;=OWjMap(zEsd7BjzJ!Mu|oLAx&=lClExvg1`WB1MKLK&7qPb)Z!n`c-3O{ zYDh3BTxH)06Dg=xm8h{XCi8NqwEL8nT@bmN`L4g=ot<+J`f6lMt#>YZ&%kEVI(oY~ z2HCtW^G%&Jk$6Olc^Mtalp9KeB&2`%5W0Qo+8vpa8!LCmN=p=h%Z+T`bX?9^u1YX( z{S@7#k`l|%9a44`?{ONwswS4?pmElC3ZDMbyHj4@_#Pxi<G&0|L%@s07AVOGPmWTt_md)jz`>uXWf z*U?DreU@ ze@Yk1^>Pxjf0K~R3Q--QT${7R^Y{hZMS71jIoHXqq-Zrg((OsZHx&%NR|%l!_#jtL zy2GASog5mwCc1DYb8m0L-DaMCWeoG<8jEe8?--s-lv0tBso|pqy;9=sXsX1ER{o&^4S6nwZcf&vJ_s*QJ(GvARU%RW(10aZ8J# zUBPfOr?1_)8fq6-vDPI|?-+jcV`XJJ5!5!KOrJE z?o_cOQm-%BWa}cOasv~Ixgwm71sg*%F5Ir@_C;%r1+P~pt!%zj6^r0U+43^Aw4?=} zy|3ot&K;v#C=!$n4A0Z{efkzA_2rdV4QIDe_d?yrgr4b8k(63j{gCKvfeRo3+B1cH zshNA`ULCkHa~C|kx{%&bs~U|-Gti*P*5rW8g-`W*%euxOZn+rI&xXIPZ^`$xAlrbP zYJxB91bVe}vbHmiDQ#`(LyW_z)QvwUW!)*=K(VC=sC$VOig<}#*$x`Xa#5OLFb^qm zk?V#m&IMA?P+D(?a+$MDu=3y;26W50>)yNS;+gJSV=BU4)K|VvI0fqwlM2Ml`(bV; zyBHp6TuHDcO!qKctPgfJSM7?tKeEluOuC~S)OqRrz1ARlnOI#vr~K!SRnzvEV!o)a zeto1%s%L*l#WvToNTc(jt!66R4OVu9!e{FaZcJC)-OK0EGk5n#4jTqv)Su%$U-X@FZB`&nL6`0>ZV$p>g~((3BNGo6y>mn*JlnLl;twQgDSs(K&G z{(x(^h1m67kSq4oZ;FHe>L5~eJB4A{zK)BU@%snW7csvg`9CB#)E<|Qb-Fqra6hry zJ{tS!mt#qucEG>lc4ObJpBaho%Wf2{fTX$!F84O5eYOW+2APrG91W?OMNtrq~zfZWI?Z! zc7!h}O%ZEE=QyB{MSI(e;=r5Fx)D!a8oTXPK^6$TpcAo(HOz>E@2VT{Ef>C4YnAUTgam;I+>t^%8y8t~y_ek3WgS>ppW=<) zh3I34mRs<{zy3mwdM`!z)^WABx~=hyx$ch(H-GV1skSnDG?ms0SUf|_ebXT|i>GY6 zh_|LTpLBGKw)-(-pfajxB!lg$zK2DBexh~%`uW9=UAIfmhfZ3|b3C|&HT1uKLxiGW zH&EcoZKj`685S=Gyyu-N5nt^;TA>WxD;w$LP15#5)yO&X#<~Cadkw{+?nO7a-r{T{I)Sn*sCk9ZN1w( zn>YBDz2|#Fb57{zAHv{&_xA=Oz1glakIk-*^@zLM)njvh=8r+oL>A|-p4W^3J--@F z`Y~m2d+9wA?zv`ob~FDQ>vaA^bVtq*lRV$(xLvNL9o!Z5@uf>m(DL1GLN!g$T9Tnm zsM1iGM6sLAQmXar@P^Gu#j|{hZ7Ya)6bvN&5o9Og?Tn5NplJqfWAYrbu!h74MATo+ z{yfm^$uZA={mS~rUCEKN2ZbzG3PX&08n)Y_kE5{kw3J|5V8Dc<w?{YlC?Sikn0nEKC=NI47=$49v%(R4}~|W@u!-=^Xh58bVKDNWvlb z7NZB$)2IsePF$(ox%tjGX}hWXHwEhPh={`enUR+6!GODXv!!_hsVOso0i23)J9p=^ zn>`1|4bSew-^*kFz}yBBJ1{{7696 z_rsma>1>tgEH3D^&|43K-`zNkPk5uWIyx1C7<{AtMZGY8Lmr*o#zdSu#Vdv~*Tj9N zyKJL=Y(1GCb3H?(3VGB+RKrOYcIlFf&gBO+7Q-QIjGebd0|}$^w;J}fFzK-=5SG)9 zrj*a~#pOiE%PaSd(#+5=>IXQ7M~yma-_(-MPqS+mI;i-%bK13j3@Ph0WKyLqr0)@+ zpkS!j9E$z=@P^aP)Ostiiqg-|XxTJa&IHj@7uO8mwAc08g$TUD6?88U(v;u3ik=QM za4!?im7XWPM7jHjSZ#ia&9D_Y*TSSNpz3ZQgm89RKrLeu^NnU`L({$e6pfa?RhCwT z4tb<7O%*(<>-DhAOa4*h8#?_;OmwXe8P2w3!c?3XYG>g`r{{7+Z{XfOZNwz*+*HFk z*Xfdhv+Z@FDH-|`7c=0wJNKojdj{eO-R%Q({crsh`}<+&{49Wvi;FcTM&yFkT48 z1S%=Y@Vu-h1ZgoJt5qIm&Na>Ts^cQ?Tki@%3@%HT$m7F zg5$F~lG{3RDym+^eYogpcn+=T(A0Eu@~#aWK4?cS<`P~J`kD9UZk6PT+L*C4^R%lL zdKT#cu!sA_e4^)5Nlz(Oy+S5})i)3|S}My^cHk5%eC8Mgzr<-z+*=VYgVn3XO9k^ zPV3PN%o`-thKA-)P#N|1KNC5@9d+|+1-fDS9F9<=veVaTW zb6(MtWYx^`#Iey?cN)1`Sca~vmwY!hu+GYzASKez($Q+YxE0c&^xY9e$bZGV#l0ea zBGh8u{1&XbHQYbyK>~+~$9^iMvX5sv_L%DP0 zfW}?))W~Zu@BpA5>C5a^cu+mEv5M|WP{}Rm{lRLmmMS?huW{0`rmo`bNj*m2~3iaD;_8> zz^Da~fY5X8x>p4K9Op*?s-5G2L0d>`S}J^S^oLK|JyXgQolNd{`qqquwB#V4SF`3} zX#YBN%iLqQu*54~k+=P(gaFBOL$Jf#P^RL7CHJq*Cv-(`KVOe>uINq>PhIxkbs2J5 zEp#m`CD#Y#BFv>~ny<&ygk_7ej>``E4n$&y=q zg@-Xa z6?|O_(O2dN#j_qUmND0^WY+C3 zdHihFaj#N&t2=s-7||mcFS%XZ zexwUWk%P1kB;shPbuMZKI#9tNoJu%*VD+Q}Y6~xTNEV#4OWzP}tAnXxF8^t9V6}TB zDb;D&%F&$rPB-6Gj7P8<^0Q$pI0wA3f@uj0SpNtgSEOBPBrbp5=8>HOR^ zpygI)s$5eWB>Czuly#@LRLS2-uS+^xDA7UJj9rF;7RJQVjM(I-We4OB$_oT#J$W0@1)0MH0HSk?SmnzHp0wpaUXAd#H ztO*P*htKs=kGqY^d76!5x4d0?UGrHyx!)Tm-$L=L>Q$5x3NBI7^?x$tFFa~uYPfhK zK<%OcVYsvKYoHYc+`Rrd&*>?#icI^Zd-i=p=fW)(y*wM`T8YOU-e?ENN^z@GZ1`)@ z&&HqF=~e|yV8L5eQ*Is|G4;lW+oA@MJ>FS8di2?#fBoIZtGz*hZqxhRTuUiDc!hZSWn4Y09!lajugX_`|_He zczp|SsvXvf+>7rGxRJw#WL-8H)Sr(?$e}@=*3wa<@c7I^9~>xXrxFxT+d{&*7Xsu& zz!_jS1Hmexakhk}Q2P8gXQO);Pvf&1qLDFu`}ML@Ybz!;woo*LYk zIOL?=;EbOudM5Vl0Hz@?`Mi)@7)*R(Ad%qEZgjx`;7AH>E06`j4L|?Jzb);Q9CK3s z()bG=pizi^LNeXy1+a|Y6su^>5hGo^)Bg@X>K!Rl*_VVDFTjg+gd;pSoj`!7p$ zLT6qON=|7wL~LBh9-BvoRUCEHxSi1!$a-gLeXco${a4lWn}>`KUY2sMH?Y1n4ZrWz znXg)V^dXn0ozEET?YQT$FU@prC8H-d6aqir21%11wzgANwMO@) zLy(h%g@cw)k#97bkG9ovYmJB|u#Qx`C0R+F5bv*Z({+c%e~`NDDtW1_ z%!A7??&)d8*-S?n=dMr9;k&2rT#{^*7~$K$pj-=MS%d?ln{*aoL6kO`p9Y4?tKDW9 zpy&5UoGAN}KPOtU+%Qm33zK+VWE^RKB2F;n_!4jT>vHHZGYfKT(6bM`P>H0OP!o%` zU$7~>@0@e*o6s6pDeuX^Ex`+Ud37g`Azb+*%~bHw=Wg97UO=p_N;j&EE)38uzV>Bm zMD$HZc#l{uSwQ79>)UD{zRX_Yzr<~$If=nbP2t9CIcQD25T#{?U##m?BEEzRSfE}z zh*}9uCS3IDldJEa3{Bw>rHd04<8!T<>VYZJK=FKt3DN7e_Bvx0S97LID)`?F?9x_K z)?b?*UsSFkIiyhJ%0L;}E|6qTBz{ta%S7^A(r=_kr&#$ z<|o}uU@R073;s2}hdxzv5FOPt~3J>~zgKXzs zOa9NdYNBUqJ4=l#_X8F-NN@UBoommSepo3S>V=L3=K<<3b=K%*Vqv(d1EgJtKFEyI zi18c<<&RZFLyQc25tLa5T2QsW@gb~LP#K+;@x6J}A+GfgwNn8?70WWIA<%)F!a&u5zKc_-0&28H#6zijIkM=n9Gn)8A!hn~ zniVAd>u6aFnTVG)P-*R@7{DovaO7p!!qWoDs=++9J8oN5Pcj9uvxS@t6;{i|R3&cF9OplK;Njeg$A{(GRg-S9l*>J230eYD({Q|pWlYpMi` z1k(D9ouALE>ef1`;W{#+hloylH^=TzY+~}$=~8aD2yBfc(>*Q!_$gZ0w8^1PtZrCP zEy^cAR)njLQf4^3q0`I>G3n@R(G(c5YNyL3?Awu*G>P{P6IfRYYK<>*)X;AQTY9*_ z3Cp71_uu*8NoTc_a~I%AeBY00yx`EZc6Zcx!Ou$_>_24I=3l*-=)^xKbBAd8w8zQ! zo5dKExuEP3M=gQMjxJD9!i`o>RQ(q60ELmrYAA0cb|Z1)~s9$ zlgjdM8dKurS&%h)G2zZ{(NixYbZe=hE&s9XSd?~^CCu4YLz%H^REaeiPeWCFB*HH}`(IA27+sM9Ri9Hl4S0Ze7(9ytnx5?ze+*b>HrJL@E^m30PnJ%X|S=Q>$2! zvO^XO_;1#HHhge*!ulXE-EcWZ+^9Jvf9$^_)ON%BfwW^Jqubk>IM_8{5z~jy;Sjt< z4L`%C4z_GVJlRn1D=$S`4jAWg7W1E^gdXB$jipP+`;G(foY8T>OdnQ;oJ1q2@HG97 z54q0`QdLkDhNWSbsnUoU9K@Wn4L_B?{@ua#dQFC}GJi|CABJr{XK~Mp*>WuI^vT}a zPHIN8DVYb<9$^rAE4cXc%U+ILc#sJNd=QEUS~zxFq4zrO#whY7Q^SmUK+55sZ5;Ox z`%1WP^q6F@)BE7hw^-YP?4w!!Df2hQ20+D+<5FA;J6j7McJ1#O3~+~kfOA%pO2j9; zb_C^>KdR0V602#}F@}xoub@K4VRim%^=E!GxP6Cy@_fT8b|Jn>>4_94m%c?r6nuHb zyj4kQlt73l(FA6+oeVs3*ThwN(|>=*8<>{AS4VY>R$sUi?!){n<+$RpH!r_KL8|^yxT!!RIcYhwK zw!}MdEOFFW>K^5nng|Cl_#W;}EZF}2E0yK`_2=%#waw6$ZKp3qh41@onV;42$Ni9U zy9sEUre#Xg;&IBZ(z|j@pl$=TGw1)+oiIPMyD>5aEZB=fBuS)oSl!Rn`ukTe{=m(( zymSr@qMPvObm+|9mT9}T`)GA_7f~R+{jZ0q^9#EhGk*)~zOFvS=5?b>B=CpE{n|7q z*?Jw*8TcT9Z8I8l$TQ#J{q56A(}n?03#LksX`c7Si#i919#uMd<+Ax` zbp>lOh*eprLP6)8H}dHTxbC;yJiF_|{+pr=JTb!>+DVT~*1#l_L_wZ$ zxU&IfnCO8e!9YTk4~ZIUlFhR2q629cO@~UO-}TB4wzC6u&sZr-!H^iF0uV8gStBnQ zkd->va`bb@K?oM0Q;`Zz3D4L6Se;Y7E|KM_8}|TGmAGYN?0dIz_`_f>nfBI;H247S zArysO4#vR>=-~#qy6b#e$mcl_W8@&*Scxn_(#5MFN3R)ERp>y$B74EXaR6sTa9{(F z6MfkM&FFrb!7Q9OdXO#{%tb!iOc*f>ZlCFBMCXLhl8gKJwlnv~woqQ+$aw`nV1tg+ z_`axf^GS@#6ok^uHooY@#_YdE*1W0p)NBCz~J$zvkj0ut0z~!3g0*Xkz@fK?40=Tw}wH`Dw4^cQO`6w5yVhdJK$N};A0Zd304gg>{a;FQb8?QqL zqrxF1XfHS#LP5toV<4R33dFP%M4TrBBnAZwOoJQJ1xl*E3qK6`1U~8Miv`onhj9g> zy28yC<}Lko*CteOPcX;K{(~a1?n!@~8;TyfAwBpd?EH@}&C61$&&z02%zfMaV5mtC&u~+-uT1|A1A^|PZza6lFu{F!I`oUR z?^n^~?HS*#hFj{(?Iz5}t9C;xTgZL)cNN}0%=}F7*)e;Q`ElXb34W5%8!b_}_vbb~ zRz8s%Sh=3xB$V;f_|8&;S4(TIFUjbw7WaQw`=#yjn*_mCpCz*0uT!>Yw2A*Yy*eWTSB$zB)vythm}@<(4!n=3`c3-O*Giiaqb$V!9L zA99FCHHy*pY0NQTZm^Sd%b}_kg(nrkG8Li<=Y%g3fZn_U3=Lqt0bdFzgi~dJ7K1!f z{uh^LBqgcQe|_{nowrk-GqTz~bdzM$-`*l~g5+?{Tg&0LOUEwv%PDdIcM{4{P7`gqZDuLD?x>iqJWf6m7J zQaiPz**UnYH@OJj1(Q{>P7sELn)y@66niyYU6s6d^sc-WOFpxEV zC~Ew;-f~q}=97?^$>Zp6*)Mnuiwm>1l(;8{r3WI-sghYW9~nG1Smm#6v1WEbRj3m} z)Q2FOCiyhCgSAs6;^6wQcJ{o7aKLmS;>1;GK%C`(zsOeVgLVF|Aty%E|BvnFfMO%$R6n@9 zx7he?Jm6Lc=A^MNbuX_YrI`VJ2E-si)sYixDckSR&Q8uUu>u}|KPn_Z%&H9@(x-xZ z{_k22fCeo$Ks?O@ph0P+EPOCuedNZ9D>2%r9pQ+?059@lIS5FluuP1`(m4=AuqY)Q zEhQQSS2~MFF#@z`rK)ZM5&%;3Rbc>6dd@HlET`=VaTSPxI;Vs$`TQRlC2sKz&x1AI zcWw9#b@izPrhE{X@1u9NXiQ35391~2&Pa)7jL2>44PK?+zNKySTO z%{+xbLFK+AH*85=2s;juxUJbGw}4W3E|*O`Ig7qKn`kLv$V~Rr=wVLid%l12=N!pT zkty(k--V{Q_d=B|?zhkY_KJAwD4FI=A%Yw+X-#wNhjEZ_-Q~S3oLIoP$w#Ar?gFOl za++xlWJO=J%CP-<8Z{Eo&!~DaNX}<&AKxrE%FAjMc0pH>%&aDEPItI5$H#XeFIi19 zd-|%hPg&nX#j_`HD1ZbEhw04)1#{zTQ&^;O<^ecByU)r z&J!F3coY>pw#AWnL|=Zst`iV;X^FFQ$mvW7>gE@YmdpA&o4N(R9_#;LACk{{{kO;tqFN;Sian2URmH|dV|T$Dav*ZviDaf#F6@m#c#@Q~A~5Ki!z zC(=V-ro!HJJo-t0vky5SHKjV4n|V;3_OB3dv-RWKKRAZ2X6t zJn6Upv7j&qnu&a~eDR7qxv&FHiA`$%*8r^{*Td(-pGf!Xbmc(Rxy%kLp#zoNyVd&n zs&>G^<3U?85eWzF^cUYd{wCew%T)M5TMlj;%=?x_pL@?m8MNi_X6wVQp2^bw-jPRi z#~G>1TKso2_RnpHO+IX?@J zYUYEXKJ3E5U4OcOeG9QIlH=M^ta>A7I!q-^f~eT=+Loi)QsT)*9q zd7YED^l8Dh?7QdltSKKNfny&KQu^Uov*wxhO7mC}soaeE7}JpnphxvV2MtF0X8UW3;M zSO)tXPcCCKk3EODkmd8*{zzqjN3L`w^NS4dR^FzQm(#(xsd1V8dxJj@-{9d0NE-TA zK}LAp59H+kGbIkh@Z>E6++Qg?6ff{v{*E{P#APZ1B5vj1s|T~}Kv)lNL%1Kz%?n^| z9tv8VPU_*@1aDsFB<`Bg=^^`nLixW36c(h{s|rQ(y_cF^JKNW;q!lIa?X(Jzfmxdp8B@j zZt#ZfK#C4!od+xje|r?{hC2!h9?YM^B_Q|izj1I7`bGj{cI$8z0gDzQ;BX-1v%$wpCFB9nMH^25m!U7YfC;9>XMVxFk^Us%IZ1{CJHTSbZ6Fd9jl6Pgv1%>9=Fp`K; zkY-{Q1W)~zhNqR$i}Sph_!X4Eg<_HwPNU=N=#~2FpjrLj6nA-}gGF-YY9W)=6%YmY zT?vls-h;(Hqov;&bND?1H{y>tmfoGb+IA&cl<|#n{IvITLG4!tjQQW06EzLLanb+M zr-qiXa!ith;l?9ynfR<+5l4Oxhzuktnxy z4YYCB^snQ@^&ro)i`}*9yYVW6#7qY=6a}{}@GW)*LFSG-0CO6kzyO!G1Cb5rOEBnJ z5ya7~j%Y)mhT>7SIHB@(_Tn(Q5K7%l7!?r@d7ekBPtQn&ix5Yn5Mh969D!XiFw!kA zE=TLogHjL%pm0Ix@v@jHBUKpkc|I`d+Tmc%oSvJiurzGp02(2#n?Z-PtvDMGK^7F3 zD?lZYfnXn-rGhCgG@=7RcYp?*18GO`pHRq0Qy07IhNvJIA)N4mG#L3n0nmrUK(LCs zc&IW^zy{k-LHlCN`#Up6hKn!41qDt9ro>;8YRY_(9LBrfm^3vV{cTp*S^0|d;6=hN z+c?MS@vQi0zaan8Gp&`@`f<)JW>`!<`kcXWV@FAxGauGQ3ke#UWuWImp^p#|ttvNQ zAIh&GOp?J0`gLeZF%}-AE%XSj!#-I2b#O|d&=`#jcFH1|x#YM&3W{q6+ZAJ=U^uBr zxE>eLYDLY8DFq1o;FQ@~jtiYM3HQc@ohaT8B}_^U+%8AUCDRPkhnU^Uu`_rGlO%LY z^pT; z90l@3X+|>y%WBPpClA82uq&Xgpw@Of9B7XoiT?-ArO7h@ literal 0 HcmV?d00001 diff --git a/examples/keras_rs/img/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_13_60.png b/examples/keras_rs/img/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_13_60.png new file mode 100644 index 0000000000000000000000000000000000000000..72409279ad4f48767bfa129eef6788a325bd3237 GIT binary patch literal 33287 zcmce;1yGf3v^FeK(t^?rA}?LiC9**pX^;}w)TX;zN|2OB5fEt*kZuszG|~v0F6j=b z@7}&=&N=hdKl9H&|1*O+?q}c6bH`fiTGzT3k*`!<;$c%@-@A7YPhJk9e(xUY{Jnc9 z;SVst|H!($69<2ZxXS3dYB*T9dYCwy-%~bmb+mPGwY4^-b2oQ(v39WMid5#i#p`_DT#9h@z>lqwiC!6;aca(XWJ?h%+Ee^3e}^R4gQ3v!W%NNIXz?jkTf zH72ew4;&Kr#I0CzU!55R)7^g;T&d|8yn@MaK#C^g$e{SV9pwRQFhf5U{tpyh2ueJQ z^h~Ax=Mfn}#HHlEyvDE57cWOM4sXPU`2~L~JA12hdF}fQ`DEf^grGqFy`Y35{Y~tI z|6V)?PZ|DRmE0Chkr96{_J|~aU-Q(-v%nUg{Z2VQw?B(&s%t|2kn>>dGk9{NC0Cs~q?$*28+bf5REj}#!JOm!a zvwzMuCF+fW?RarC!0SLYeo)!`$r63S|*w%Pqfkr<5=-60= zSr0yOoCBhP7?XhJZDV8O0STt*NpE351*zst3ht&LHS8o6Ko z%RjJoepTb_&ejTU?>`MX|G=U#-W4@jsy{oh0cIK#MGmH3nQGMRy%fp(scj@%`tWyt z)^ZoA@sHj_=EE^nNj;hJ#)gI>WwwtZZtBv@IwiVln};qNLrcSwcaSUzzcY7$DB@&YU0+|9JUbqiEPj3w|B{B~OqiE=sWAW3 zi-{twiH+G3JwA4$rn(W!C#{KOVxEq-ac<TR?uHJ=hTo3|T)fF1g zjEG=;k2d@wSRwJtmnTVhDRg$z-%R9GRJwCyqBKWXIzL3=GbPh$#d!Vsov+n)IwZPZ z@cj39p@yTA6U&(&6L-p#%~Tn+|MlTZVgsXLeTQcBk1F}RCy|knTjDfe@;h_&e0Qnf zFq@4RsIlIo;j@VTg8&CE-(L`GT5-Fgho%$Zu~2$n94kh-bw!#$Tytmtc-En{FdmKQ zK(Wnpt&iCEpdFLdr^RD`{(9LG6QAl;IU6bEYTeF`tO-3w*a_A;E`m$MYBQ5=%khxtae!cb93c^r^Wb3$r(p+2?Ocw8&ToC|tMb;{ zcl6R>1+9r2SphW4>CedU1XI>s|)b(vp&wmls?74(wT2kybIqC-1Go z>mHRXiBcoJfBu0#q@~TeyNH#%Eugu(+{iknrF>=;*WTZ+xC<+D!BAsnPsK>P1Q{`Fh2n53MY-i@WXSMp&yV+Ygkcwv2!o{m9B_ z`RE>H{6ecMOwb}u9= zD~q0kLm82B8@Hiw_xODNs0tm2&!FK*VwW00crD9p9>29;fER(b@n?tCMI*}FPAm$bpZEr#8axA{AD2zucD&jGUKsNV$rHh_;m{NHpf1_2KJZW`s`#7YGdBJfubq`EZwdq2ksPv+2Q&mE}1!^T!`{{vjF);BH9_UG!U_YwUmT*iDJI@q4o z)?>1RGn|TQrIgJ*GgX!ob~k@caj2Q4JiR9ClNV18mO3wh$&A0UB|kHmdp-O0JSoRq zM*bDY4VzRBE^!L|W*5hX)=7O&EUivZ85P@&kz*qL#Lu5U3m#k=uDX1nUvXBG3Ulu_ z_?`1*5DNYmjBRj(qw^|H65B|OWh>3{liG2s`DTLwcf#cc@HZS< zqQIb(gnB?2W|zf|kzao;cUBF;2`gO8eJ8bO-HvsOiQM4wQjx3q%lfT?wrh7Zc__9) z8hrR2W4oCY(W2rvE|&(TR|$dT-xaQC)O)eC7*2&Q)$lN_D@lZy*Q3p$CnRZM1Y z2L>^L&d9)!Gx`Pz1(G@*D=j$nP+uH$5*%(7mlyRgQF4ZMK!u#!*~=f_FMi;~(fduI zYd@UUUl&~|uT;RFvD#)zyH@?Tfj{jdat1D$Nd-zek|*d*^PVesN%fr8cCfLlzR;+g z7#i`SFy($ne{x~E_Izkn6zd-Ytc$ha;F4O-G(*KW94z(k%3*f>U2)5D7W%wPyh=u2 z|1nT?%0=mu_V-{(O-V}9GBuH)pK&3-&y`_77spAyl31xvKBuhZKe0++{k=}7=Sxo1>bUfR*fvA% zv#~4O$6EdkD=Fm@KHuh@3beHZ>m-wzr|LmI;2>Q}m7Ww1L>X1XhyiLkicQR3NvP+L zW9{fa)cC4Y|1_8D+?>-#ruW+a5+U(tGnXhlP?3_x_dqI%Fl8aXE_?H-vy;^0osgrr z^Tee~XZnJFG>jkL+~oag{@tM|48D31kNJORB z&XJbLAzez!t{eDOIb*%N){rpa@@6f?c-&c=SJeYJJlMyLcX5kq$-N0V21gC*sY<+v zBT;#hYB6%XUWupm7^3$;y{%zK7ckMuPYUkwTdHh>>B5J?bQdA!{!y2L@p`gOnuZf zm6O#H{WLO|d^iJ`N42qjtO+MnbK#J4-p*KNne0qgY~@6sBn`x;oF_;m{v>jig3Rkk zSf;IT9Pi}OuHBD_R-t2HV8uhi*#dR>Fs=LfX?&JNCSAO(K7USr7k!&{85Ymyt>oRG zeI__Z!pm+@d7HqL5+%s1WXxIcAxX@bwLO+r(&&9Dp#me%LAA@#dI9NG?EmB!;AY7 zxCOZbbq?V7h2d1EIa6ik)0I%mL9HL}!6!SY$m0N6`({1%G@6`Gc2Fn9WPz8!>t~J( zY<~ZfxKH1Adm(`4X9P)ffbp`19~?No4Gk^ynon56$Hmp`YWVV;EW{q1SJnt5;{AK! zEK~jGKmS5hWRd`tLi*jm*Z()k#Q!gY!pYs~1O-V+ISm41V+k@dGr!y86VA|uvqJRRc1JGFqESY{5os(AOwgaaT~o}3?Ue4@w=+Lll{BFE*8U|-kWrWnH(&(Z?&K;7VDIE189Q`8AdL?Z{EDg zz5?MnJU@TK4Rt>{8n>FbL{4e7U|UsjE-5bVvzvx(aBHjN3u$RKO=#snkOvG_gdLsb zy~QGS(1t1~c6;)B3@G^l(ON#(amZdmvt|Hu|(pZm?{M*fS2lWduP zXD(@KW;PKw1>S|k+hC7Y-1{VKIHi6OlspW!p1dBulXEe{+c<)k!S=;9OlvhgGMn!=MXC)%X zTC1PSVPlUGb8`SK>sv88Kl>_-NcjDAl;>1SX1#Np)r?HqNrww04bE$QZsm@BE{YUS zS2s3NS`QVN!1~1R7OCgG>tir%a4j5JaW-Dpnzy3(GO$m>3ylcXmxme)H8nY3^*v2_ zlxXq-WI>nuQ0SLQW#r>?oSog=WM*sZv^eMzkubFt9KR{QJpgx$Wu+w!e>_SWz0(se zxu*=#uFFg{$YbBz%ER4_KRj}Ft18hEGEa@Og+RqanJZoJ;Jy5GY|MiDH3xo|Uhejs zl`gpOK~V|8ePLmYnV0js6H^H*Lnqci1NFGFESUKcN$6*%!!eYq5=#@&AN&@%BD}VSt3Id1Cz(z&kG*-FL_1 zoLFkuW^6U^J_n&<=75A9wrcj%WWBN@CU2vtuhlJ!_LfQ!pQAmekua1x<3v)@dlZzuYLb%d1r6Vl2YV<`ChMh6)y8x|)XzcRvO zchNdv)&JVSkCA;DTj(c!+d{?IZl_{jh7DClvCr1`GKgV$INj%m70tI+tyInxP=N&*>We5T5cjaj6X z?^;d-P0N2QcizyNx=+oJ1gJ7p(wgHpX{f6^F8_#p(I2|I&}v+or(3Me!H;`=eR+Jb zQ#Cw3Y))Q5AbI_etM$6_b?^?r_C0`{$Sq1vIm2dFGml&3VPd2#^wM{3zj0kDy%u9) ze7UO_SIk?95uzZJ%3DkHoU*F==pzT0O-3zO5UicuuANR_fbG3;|DfImTJw-RLS)-5 zbZ`6U>{O-O?=&^>kmr<-*{cQrh+2`x#bdH_PzF=5-Yr?5dd{G1uW@5PBW5hy;$BqP z!=G-@uPE{xL2n<>9U9D&ST`m0Byc{a9p5rM4t889t|f|VyfpM1nCMT9Y*Bmu(Zx;q zH@4F#v6V)UyIdo7&Dcq*4sr4ISlkyy`N$OI3<1Mq-CWuC=QARx*bi<2a{@rI$LfM0M=xE_@o1hRAu(}YnOr(t-INF#OU{P@AiWGY zD@ZnJor_639e4{O_*28)7s0mHXf8Ewtedq;i8J)aNRO; zd7HX>#&}&Enb>-YM1DPf)v%79&gsouSERqP&RRR9(yd>eb)MSd7{?Y=YUI$wkKPn& ze@v5Nwsy)i&EJxo=xyl5aXK$^wq|)mwZan`Vl%c~VTDPUls1s1B?UA3_Szt9>RION z`?E*TRAnjm*E{cHJw_=*#!FmRu3nUVx1h+^K+Nm?qizpe4`S4;?tWXxCm| z?F}8c^NVxpX*K_e$-O_@M5j^ty&*VFzkc8Kv<0p3az>BT(4R!d9$|=WX+!>+}eAB#?t)Yl?%b!{*KMq*hj|#{&v=a5lg&r^TmTR8X3&w_5 zy{vCNmbhF^6!O0o^8fRjSxa&!NykV{>J)(crRC+|c*d7Sfj%I?Jvcg2kM;5KDc(@Y z6jDRnolY4~6k+q`=xfha{uZ8J^@Pfuu6#Fmr z>rh3I)a@_j+}9a%v}jh*`KPg%%hiUeo4uBX)0 zo%Iesx{6nK%2~$PI_uTCxon9bSCe%VZ~ASL&J?q*b4~h05<9Vv@j6lQXxaqt{6fyp zn`6zzQw~jqXP#j-i26=QC7#b;POEq-;JxSNMV||}IVH7kKGi;*PBHc`Oin}QOEmr$ zCj8h}?U=NXC=!nG;qA%h*ALbFC%-CF@=xf=3CxX>d1|D6F}GN0Rb*lH6u=ke#gK=allIg;eN{a(!BOyuhs_qdNLkN38$&iT^talmp- zdaX6$2}8K^Dx6SAR5VvQyqFXhYK~fXMJM@aSp1wyHkvFuED^AIhUiNi`Zb!8i9Kt# z^UXd^=LnBthJ~;9=G8CCDU#&YCGI>}$nPLe7qeWjrb**J@1+QQO%4>9?oqa*_d;=- zXu3B`X4S|zJ*zy(21tBLMwd^+`zQ=G+Cm^4CT_TR##1dfN6Z*rI7`i_^i~mVgQ>N!#(eiE>1quzT z6@EOO2-i1!9`uXmBk$aI#WzXll|%$+g{D^YD`!S=8Fu<5Zl(* z-Sod8?(2o?s!OwXEnPn^a&-gT#l6GM#~b7!YYZ+W{d{x!ih!Y%a(5SS-1AwPKex_v)H!xX|V%`LES6#c?KaNUE&8RrGPK@{GFFV=9y@Ie>Y?!@!Msq z)lRIEW>5_-Ay;3&R%|l=%}>?=+S22iSCV{X#tIO~q}G1u}5>LHQ!?-8uh04I#pIvC?p3g80n zo5$DJ_W+<*Bv9CLIs{&=c)-0g3{Q*r7!(_%(RW^GkHKbZH~=~Jl{M$?sGsXnvg+|C zYAW_=2}cRSVgkt06e=kpVV3shhPq>kQ$Z|tnR1YO^Bad#kf_b@=#@g=eJ-@EL7SZo zd|Nd|L#oTgHL_>bgjdqfR07Y&vlVz~OnXCNnJ~1NpD0aFVR3{_6weo}Qis(dU4b<@ja9 z+<7{QQAH>(FMn`+ENyCpJN@Jvv{ar$#&4Jdfby*;Yl*YOf;{lag_9YpbJ?!;3f z_%U-d-LK}>irZ`0Gu$j!9-i2%;dwm656fq}Ljx(W5scmO@SdZ6El&nVZ5m5xZ2X&S zi^gK9nt_SryvB&lhChN^vBUTQVNr#ohr1OHhmbMmX)}l`o~)t!W81q#QrmJC&S`t1 zU~3SA5@crYk7mfdMF=IxEf7{(j!&J!)U0cl31|N^u^-NanL@`aOk_-T`JxmM zpPHZ;M>*_VKIcP|7$EZYL$ocwS0Jca@sR zmw`_9HP+3xGX&PSb>3R;QIS+(QA6mA`msNX16tnYVWt!yw}k>dE*S9p$#`in=ui(|J90vBaNQEg|=vCQ+F81PPt z#&DwWIXe#fdnzs#O{1+v!?I8b*UT2}LTYGYyKolvdh)*D3T> z2x4p{3s1=Ug+_LC8}BiSdfJG>L4!hZz8>eqz~=5VIQx^gj_LOOC27|66;}5GuhI5X zLPP1vZl~Nv2Zw}A_%SmxpJ`%g_?W*xNKGZ1upHG{>uQ^orHWMOIPO1Rna+c{ z-9_rdma6BK>!`>G<4YA((TEt{qyLP#Mx!!Bg&G^i-{*G_z?dD}!)!|9XRJggYKpe! zqmZ5?X!q!8?fh&J@@g#q>*OEU6plB2eI0eO8zEi({Iw8uj=tEmlypwa_gwqKrOGAL~g~RaJbV#vF_cnlrV% zw6kNdq=tgqRI01FOkAxrU6bgv<$wN^-gCP>xnOzFO*=B;SyGxee?)SLTYKQ^J?4*G zCVJ%zV)s$*xIa&pKJR}SZDZ|HM;kwwSU*qXdFQ-EDmHP=GJd=f`m9odNUou-uHZd; zY*1~|pS1-XPrEggCwZ2goieeJ=g+!wcRPjdf+GqlllK}fxE=;H$i4cQQr|)purf6w zjM_4R()v2kSb62CRL!rH9++c`K>SA-;oN-$%&oIK;{Ao=Lb&IC%=veFB0}rvpju*Y zms1n=>oMKurCQ38)k?aEHx8v4;1J%GJ-K)1i??$-E_D9Kd(Ic7^&109_1yYyf2EO# zpLum=M9DzGWbT2_kNpddWkITF@rZS;bQ=H$Mu9o9xm>(Z_aC{L`*?b2TZ`fNGbMmX zl8`Xz#dvG?8~w??Aq75(^({LC+Qz!iuW4M)&8CRdBDXNdd&J%L+lTZ0yD_gM+Il?v z2Id)@-++Z4@M*otx8Jwc!!z5r|KjEXe4CCthU3Lcvo`Abc+;85UcOQKZWbowBx`H@3GaqrP{kj09ytNHHNY z4T$+c+aAm8|KkR4&yx0$FpwK)o1Uk6+Fo*D42dvD?@d16UVlh96B~sY=zxK8$XqU= zz2R==-l*pAd^i9*67C!<7JT5^pU-16%szk+CG`kjz~dt2au<#dS<)qCd&5n}?SkN` zzH@Bk9>+dHVhYGv75nt?FlC5+;fr|_A#P_u?oH;;zx{9HgXB@q@`#oi+nyn~#_{aQ}rJ|{&8BstwP%$uEIXN>r-a53+ppsQnZk`G}9H5|p zXx1B?aC%lCqF{Gbomup}!U?n}@gXcOi_NB8*wNIYB#F$b-2g0V(IIkQ5u!nXfgg~MVBmq3W7mjlQcQ?}jhGee*WD! z(!h5S&ZyS-jLml6WQ0573ldrv+34!bsqd0N*DRKr#rF@#=$yGhT5tJZw4Bwi?<^$j zy7yF7Rgs1H=@r0|yEL8svH`i6;MQbm6d|K*!3`*F5{nE0EeEKiUg{^YYArsv6(V`> zM~LO<@pCCnbPLc|UzAT*2cbqO4lY?pOs-Op zhlRycP*V-rLo^!up?p+9fa11K#c(ei{z`fP=jh;|?rE;y^@S5)XbsUfKyg?IkWC7< z;Y}9m>gw5p+Es|ENlLaff-SO`hglsrfN!&ayVp|VUTB)@5XG-kU_ATLiASq_<*@Hf zDO@l7S}-!Agy$gU{d*Y|75pM?j%#$;J>w?Nis=nFw`*^L;+u~d8ButY0&mv(l3+sh zkpqv60U4HlB_43=n+>6W0H3t(DlW#KH_=Z2SapVu2CsuyX zrtLmu;LRA*4}?<(&f{%9OQ%+ZXq!Q|;}4up+bjBe4mu-g|FX}DTF3P+8#z)T7)842 z#l>s@NalqVDt?{&qEl|<37FQOmF9}X1?75G7@&rDv7X`Z&Tr6ZrJJ6IhbJH^`g`+z zV&Qs>fg%0ctHL3-hns6fz=KEZ^jK)r_&i+HSKgj{NVtaMNbt(WCyLY`J|r(=X+mpjYbn%?hynrvp4m=6 zWLC)pf*gB$`-9U{j_)(+#<$IZcbs``QwVbD#t(C(pb{l(S##g=?*2*H^Zbn&KM2$f z;~7Puafg6;F&dBH0)Mp>(~ zKWj(xCGc5lOhB!I^coZB@`X+nfD9yx9qjAt01#HK+(_K5iGAsxQ|3 zdas$irP`^`+6-hY$WizXoQxZa%h77@bfZT(_LsaG8CO@=ik|+UXd8x_?kR*pUJBH2qP(Kb~BOA9?IV|3V@KcyK0e<=3S5iEBT; zG}J$SU3GRjZ@eQEg;k8tFx`WvZ`6QFQ|4Wo0V>3vH1W9SgMtgufFFE?NFjV)$=g{q zED;6tMyKg3=4oArD?MgFTXY#Kez6z=)9dDHx#-v%iYF$jK-HZ?1#y0O7xmi48o|KO z_-1(Hq0I&2>wacTd943?3>3VBLGgt)y&)3-dp90N>G0>2a2iO zpx7~8Wk~?UW}og-OAhGHYaJGhc3glQW&GiB@RQBtcxk5i4Y(v4x?p$_bp8(y1_A=* z`(%BJ>uc!ebbaJhBG#e~b~`?l`=AVBycgXDaIEIJOHbe#)qVL@D?sqaCnhFJ^7lag z)0>s0i%BPjmSFDUhfg^c1F6|%E$ITi1+&d?L|gB|`(*0st^=ygK5$Ok(=E>?h=K8NAVeW z1DJWFTCQxNX>tM!SLEZm5A>>EIe2+TohlKf8234WK+%4$0rv^$e3DUGcq#LEj1mhY&OpBF$>&N@wRA;gg>p{EaT)ln}{!W ze0ms-gd%)qi-uSUqgCJD9LrbV`JMxeR5cq(6%Q=|HG`=4l!EJ$Pdj_o{6USX{K_D0 zgQNHb5DcvV78NNxW6SOmNZz%dp?$!98H`3aGvyq`Ku<44oK>P-n%=MpR9(^~z)98= zxV#^NMON6NrjRmLzKp)d*1lYtAMeS8a~j+{QtS4<&r^}1QoZuSbVn#oh3yP4m9R4! zqipo68C!A*P7Hjig0OcPK-8r%_*=ql>+$XNvFgdrj0XBPlG6@r4J8(CB^7GHcN|5j zZ7y)Li6|gS(f<&fAbR2k)=3p;IqsU2N2JDI+8*Y&KS}Jne3hF*!)j zz_;v;PLd3gE17^#+E-?Kum{aUy`v8D5bctHyW5D!$aY}*no`w3d}s!6#wGd`2zJR z|F|eJPjWW&EBC@`O#T`EX?yxc!}FfD3^=P^=j*a$)7n=3amluxTJkCcqX&u>g%#2w zHOV&~_8R$kdlwD3wff&2(b59l7KO?!@G3^fRP_(Z$;b*mF-xYTlf{akkr{cd5o@XD zepw?iXS-%_ZR8ixN z53sP>nX`Ozuyy)0KLPhtOutprGPf*^NBg4cvxQu*Lc3_=5hpKEyfVmcrNX(M6wY>M zw`9(ONO;|=%X zK`5kpp`;-zZ$2ynUIC#+!Qaplw5Z8|XM^SMumae#GnL0|1VEK)|5~&q^@%wn&w9_L ziL-Lkov#(Tu8xG>Q@f?fRE!L>oo%x(OcVGXW+Y(gi7O=&0U-k4^l7BQFSPVI98J4! zPNqseP+C#fcLKDZ>!2Agt{*U{Z&z?b&auU{u1fe7iDvEhs82snyd+|BFosl_snp1r8X!{frNYLEvep`tqA4DVZ* z@Pntv-&f#y`TmMtd8QPy$_?|JYCF*GoVXo8@Wsb{`V7KcK{T1CK0LeW62V>~3xPh3 zBz&$-@!13YzHm=`1XX{V1*+OYs|2T|L3d`e3lh~O5u!RoaWQpwzyKCyD|uS<4DEz- zN0Y(%A5IZcr6%*7Uw5|`=hHsc<;bn#1zUyE`&&%k|wy%I!yR0Lh|npO-s!JRW$H z_Dh7aa4Yy+%-JO{^)C8q!1GajNMrfDU!CxY#g~mQW`Bl$bCcmB0hoOtIIk&0E7w3X z!WSutw+g*CL=zYw)R+{pxM|~~T4#Pg(`{(l*&atg))twOxuW7W4YKozlHM8e4jr!l zohgyuv?t}5|aj^@;LIEQSC;{ru7vO~vP zUW8-8?uv7bmmCe|>k}euB@cl3Mj#B2GORrWGZ!dNb-%qq5fc}$@H|{LjlBc3@!>C< z@@!BuDA2FvL>3UvECBz8eRGa^=i8O1iy;v7xz{V&C)oR;2GX2g z?XtqCSY+iPHPoJ#78a%e!EVksUrmsX{2spndUn#QOrWFS_idshARqv`gz6XNX&*jl zT2+z!J<1j{Y0u}JRwR(Rp()Sb>nV%7%kM*+Fe{d)vCkgHmtxKX# zxr~~0cU++GI_P(xWQqYre%tA9C~P`q5KT?ZdSe$LLj;_0|3XJc#~VCAQ3;v$c}^Wn z{JRIYPvSE0>i*pG=dT8VDt-d%47YnTL$>%v*k{Ah&VhjqdN}$GSrJ8Y>~&6Nbqx)s zKvWHrtA|$i+W^IeoRZSO0#Fs3;0+nJ1g}Qh)`@Jt;+od~%NxvG?{!y(#US&5N`=^G z-e`iMb8p#Zbht0edktnY;C&xh{*(e4>4~>EC+J1kbgHMNpm@FG0yw=2fNQ>d{kja~ zEkfQW|1>o>Px$U1wS3LUpakkM9J|TIkx+=+Y(Wu$!HK~h@PJLnjY#8+Q26XJY68nI zbew85+vxguan|ZEqXW>B($DPw6R0uFmBst-sOCC-GVHi9GJ-wr(7tbviJ>9pS4;Kb zobqttjb6ZTN9YHf9WDkowe{~M>{r!5ddRL{gZnauN=>VeDTAZ4rwggXeC3$)w9Bf)7aYWo8;Fr240zYJtthW4K_RJKvf15+kMz|G#%N@v6g$n~pqZqFKR z#JMoAEg4KQpMcZ@B$cVptP@!MCqeQ7>`9b}Y?M6cBL}jz(Lm)aX{rkkeRnHzi(BzWMw~_$OD(jo1{>3XFRc_c7Y_e+KQ)bN zh|@vJqew)kCW{^CI5|x~uRKi)bbM6K5~X9$_*buybw^O&si2K~*48$Q z8v|jIhIL|I)fEEO-vHfN>ft0C*+EeUCldo}e#5QXq0+YH`0Z@te0Scs;*MgDLU-G2 zbm)W-(yJ34HzK)-q5`QwjBKx0E-P`z)KtzYnlogc87Lbbj|lag{RM&eEa#o`q;N6o z1_)TT!nNqFnSVk*DriQ6yPWVGkmre)5h=hND3W@P8g0e@Vz;$=o8!lqu5aOytXQb~ z*nLC2T|c9GVOdCp?Z7`s|NHk}7LLd5Rutop<1>ON(-rC<|4A!!KAqI4m5L$sV z)bKPgCjc-%ybGauD$wFii|DY@UQsIN!cprPXya zCHBcgHb?0Mw!eWBG-YU8g5vW! zQEzb75EfpMcgFtTiT?B=9z>pzco{r<0W!N6zv%ech*xT3UaHvRgGby)elPnNAc<4y zrls`~!70lZkkx7RmB4YU6@N#@QhjL%bm~Mze17Npsn|#H3PEo!3DN5`q%A1oHnA-_ zesD_ls@n2j{{yD{&w4}!!L<#FJrxjbL#>fCZ{7_X>@LKQc2U=NzK;k36#!of{OgcF zdG`R{8tIdYo}5p$(i(O)Ft7>YtklFvTc|v}`UD54D8q!M!s2fvxos1zk^y{7$vpu7Qr? zo7GQ-Q;PEDGm4#r_P}f5d3t4J3Z-`#+MB1CQUugT%AZ~myI7WrPJDAg#ZCR@c3+)W zV>%CF(bm?O6FN~;@r{BoX&!_P9@}YdTpBSlpbSFlEf;_Pj_ise1>7y5jz$VKn8nVf z&9?eCK_}4rm$ZH-VS3IPNzPbx&g3AE)S`fa+`n=eC$R%GFadexPL}Kew)e9 z08uctsLIM>BqStY+X)B`h<)Q+>_8T4S++yv>Gk$TMnMdYi-V92x}~I=y-!EL zCT`>NXYrU}Twh-w38s2J@KkzG%wslTYK2%#npI_zGkNBW7g zTd1(*A$b~k3dEbI-Uk1nkqna~u>`8Pi-o(}@NDUD&{;-OcXxZGMaOAOv!-a_G&eUl z-qaJEF&H5XYr?CT4?vB8i@5Gg6QW|`LqP82bhTSsjFSjj_bx70Vt0=_zF-)fmZknQ z$1rf^M55;w$=hbID$bd0v+BfN8T>Zd1w!3`Auu^TZY;hmib4az-=(dsci^-E)oZcK z+7r*@t0VMEA<$h2t237(YQkyk7lZFVvcqo5_rlPd$(p@Bpry-MED+Up1>6;9gA<0~$f}MR&$Ss<<@V&CH-S zZzLyGa@_${>-epTBXZ}9ik ztIFP_Dy4Fxa5WtSHzY-Uln%pH%Z)A*{4i>fhFy%#e=pMz2}<=YL*-e->iuuLPZ8>} zCP>XHOqeGvU3xvwWpwGiibLCM7vkv?n{}vV52cIzr<%*#hq@>Y(3vF2QQjgaO zld-V0L{g}sVd?#1he$`_wRjZj0`TYNXdVtejo1Uw&ED#^;@Rx2rdY^eK)? zbG`3nB}FJp4+a`qL3Dle_YYAYp#Brh#byTKPGqfaViLdZ2t}qgqn}DCPftLSA2hMO zj@P+wo94j>@_#MxzKZWaVQYg)oB{^_5}f=#I4BF zW)uTZJH zpD!Bf5qlxkrbnyt#q2Td$Vf~=M`{X$TIXrVAp06+4+R#}zNm(w=ze>yQ-iicASy5ydBkkegZfA&DVzYVr8qC__wM$P>_ zv?2oWVOPVE^D-0Zds>C(%{hGOlRV9J-_3oJ44?sq$-3!(JScb^D+~lQ*p)ytKR%rI za283mxA4c~-b_T-W+B8t%eiS3igp2K=NW-z+rBYWpyKdA9J7(E9JWwTI6lT*iZ+i)h7g&qluJD%u=|So= z>r^iwB?3e?grv}FD9<_~!d3=vpCZ+_*r~o>29w0(GrqEU?-Wl_z!sB@kI72$s{=x+J!~DQZrM9j|2gP0ZU>kX8hG;xD&O8>s zdUQ@6>mPP4ae+F0{DjG(p@I$&w+e77?+O-nFH-{A;?ZBCfb5@dtQerM854$rcc|W& zGJfmhv(O2Yw}6m<7adTluylQe7U&CFQr{P=*Srr}&mH{%yfXCs@{@5>yO^@lrRwl# zJtaOp30WyC!9d+tf2TUASsP?j1~YVKVBmG>&OqWH+jQTTpPaWJzx57fU=Y6Vu;;0P zTv|Mg`LzdN;_&F4W7c#`7Zx4{2K|kV_3+w;CiIVq_>x(F$R)F`^^o_XW6bA02GnT; z{JN4au{|jI+|IZO z<3C=slH7&6Yt7Pgh~jZMc#-P~>w&4tY2Y>~Mk2d(a3Um}`DX|JkOQTXborQ>YzjGS z^Kz-KGquVi208R&)cs0}CUIfVO$gr!s$~b58saYVu0*-fE&bQs&Vl8{@mv;iNInpB z(+|%qKuaI=HrhkOos}@2x*>Ox+Oy=)3>I)bd03a~tp;Xh9USDr(v?p!b!dTvz0syh zL4rsM;S6TmSYbspjh4d4xe}_(MaS2ZI>O-m1ib2R=ky9Xw3J7{>JtZ^(cOM`%0j+; z;~LobowBN>m93Bfv%9Xw#)S#M6D7qUACO1JH!np615zoPiaQkUdo)3TI@|zb!eb^* z3JWLCN%~_sdbslaefPkwB(%bMDxy<>%jg_w zpw4~38G6z5ZvB>qb7VV{{U+@pp>Wt{?q8q*S$(zb(;s&XGnxR~$^P_~pAaKNYTJTP z59}&0+Wg;>FPm}<0?mYFEfJw`+`aRATDF5S8^P}hDJxb-h>&LG1Xll{C#F}u-k)PS z24~y^gj@vo-qqA7sGLJId((BSV{~R)i_SLoK1Lx(J&yV48oS#XA9HS?&!ZS|Cf@>l zPbIDJEbb%c1mC?@Ze(Tvq42C*>Z}9Y9h`r4xoePXS$&JiA0Ju^Eck`N?JJkRDICL6 z$>C%z#^O$&3KN6#a}^bpRL6d_XSh}o7bl*?zLslHYv8q_-Ygo1MSIX8_j%n(7~}>8 zgEZj&H%JRE-}X6hI&8m9y-97htU)@_2jJ|tMFYc2W6I>2|AXv#a(1ouwOJY*awxjt zit!CHR=xXcfsFqf(Z!UwKXBhx;{}9bVqy z6onyzvN^(vZhB{*u0T8F&j^Iw|7Sw)Cm;ur%}<~=w~OX(LdSRs{Al&ig31pN7^{~f z$+x5{{%Y(dROBzKNb`vKdzwF3YHq7-zA8m6gBrIV2Z+UvmuQ~h3EMA%Urb<&6o7_c z637BnTJfg+zNfdhDZs>CG_7{C0Sx=ABR8lKZeck{f=M2#F#2Kk<3scMxca_dK@B5^=+} znJkgopKtEJN$0Z|2+YbdzJ1y`#UXQR*_w$QJ$_~tiW<4`FD0Xfg3O-~ZURV3*3lgm zq>1EL;Z$7zrGzMb4Op@N3$(w^USIS2Z{maKw|P%2p@3`k%zKaQIva2@ZN5k5eD5R9 z;-fx5M&!JBjb7W)FW6dgwlI54<1VA8y35Q^TncLe4T?%x64W3SicfEC2L0zHM$Hsp zDcR0#8tUuYr>1I0ELaX%x@~Loi)r>ay`!252;)2P_|6GXUB$|Y2!B>1g#|v_^HEgN z_(s#$_lNQ`Ed}FO(B`#@G=q%FdjRah27INobky)`rA#5hyQ_seZlHetZuRp%=s0M_ z{$XC{38W15Mpe9B8DVKYl}Jya_YEX;gowbz#79rvGT&NA4aUXA2mWl0m3^&EarK^x z@xcAx4yOuGbG`0CqHJnWclI-3B+edkmm;#tSXWKi;Acx@S)pDXM0#^}WbzWB(2kg) zcG*h}d4B$!s?k@8gRk4vW|dod(0r!+KX5e6>l={P(DCzYX+0qYiGileH|0IhL^hBm zNei0ddO($?0u+&x&{KMpQ7+yaX(%Guyfi>N1Mi@aZIlg0R2kCsvEU$~W%r+8WU$%z ze<1a6&w;XN{1st65VnW`8dPiK2FOd2|L|A;$om0^rD&vsW(}#)nl%MjGPTBxVjZ|1 z5O#m&S&*L5&pc)hp^l!4b89l!<0*8s-+N&*HbvFWtgm8XwIPz~sH#!bB0wnI?FF&X zK5ra^;XZkZA{_wa;1j^1L2Wi3@>Omu49?5JdCjjL`vzS5T-04G7E2h@&v6-STf~Pb zvUUppSk@Y}`v?|uu}c`tlQ=oa9=Bm4vRXj&16WiU*^!uiZko~%eE@&RbMMIBe;9at zMl*wpF)!Gby$($5gXfUv_A{kG65h4V}Z^bwio z!o9yX`N6TERFa>YHB}(gecIK82KK` zxc=@i)sM-Mam16Q56oJdrYn>ao z?T|GrP(M62=i&>D=JV5^?iUoK`hDpi_v5M7>fT6&0}C;$<{P;Eqbd|kK@<^n%xMWq zszV`*_aIE>wn}_UKF)JBhVpH6X;t8|wqbuD`UjL@Iei`ll12O57@#WA6G{iUP3F_b zeK`t=_e%C{kWVuSjgJpJIa>2%Ud&ZWlg>!wdojviJf8bJATV%tL4O8g^c=@-a5+NS zk9b?6Jl7783jd_LSw!{~AV0KH^J}Bk8^PP&#uL0wK@{u7fMnW>qf2D_{6e3C& z&}CV!HMU7!$Zew7Jwo_9otyQA|C~Dx0i#!NajQRN$tMV9_-Br}u2t`c%*~TWN7_0% zsx1tF-$G|gh>wr2IL!Sy;kS!l@5(jGXz4bDi^&We-E*+~jluJs)da56y&&LSBuAzn zczJpKlKK1`427@n9=mvz4tDF`F|HKGIOC*;lzFwL!9k*bL{-?B{eLA@loK#Qq2#wd z18s26#A@Z*y-_fu0UwK|Qs}uW%$ZtllY2628DVpM{v{M_<~Lru4o#l{IU}7JYXBAz z{T3M(4(SbwggiCF0L^Sdbi@Zs|@ z*#ZNX57cX;J9y;h@7&jRp_F(*`4-Lqkn^Tm2Rl9YiFMt~WWs;0P%s8g`}+{-kmni? ze>@|Y`&M`%ikTe#I9|(&RXfPcX+ORRGi&|v4_oWsVq2|gr_Sq+ZqnYX+7jbmBHals zdB0JE2be>$WBLJRn{@{`*`i%?G_y|6%5(yitz4fgtB3bh@186j>Y>bswO~fN?23Tz z{`2GGYVQRA?6Om<^dfFp|4+ieEPT<}CtI`5(GmqXp6eVrj}SiblW&Mx)h1zf2ykE1^~ASQ=b1iS4Ha;u9+rn|1Jl74jz{NZW3EBKAFJmyFt zcFM?iY4WihZGrek67U78LXwv=rOtj#ZhoEG@BE;EdIhMXeBd}nj_&tQpH=pvK;i(B zr8kWV8EpW+B5af9!oikqVwOYATV{%LYXr0Nk1b6{$=vO;aoWaKl5{g1rH!5Lqw&Ce=XLhH z@k1Zei<4R%nVXLhfZh4N#|sa$nEW%PXDEXO1Cb6j_l7!@j&u5x?yu_v>jKQ7LaILT z&@a|pmZhcb7k_U>IzKL;Zd~UXa!6&j(>cZXAkxRn>C&_;Q5PBVe<^)q5pUSDYyB7C zsZ>5doW4#c?w=hZ&=26~sW(2=QZypv5iR{YV+5}LXbxV+$LuCfZ}(`ZAP%y9cv6J$9QqJ#fmM9L$@=IYzNI`&InKPwz_ zDu9EKM`Z1LA!AX~G$KMsm{?Ii*DF}41)VE%+0QZL08Ia>b8SJndnRTg;enZ2CKwI` zRp;wmoBfGM0n{)kBm_b+NLI~KTkK20N=``$5cUAp)z9C*eF9;zs&zvk&!w!_hTs{A z&?>~5`9vXkTWDEi&g7S^^3wGT@o4cGuT?L80?+e3CmTWqwgp8mh`)d2!U6|UPss5aLP4HTLOA2NuM^%=W6WwLIe*KJQMSPU{ z;Alk0TYUVOn=_|k1|x5?gQ1p3WA|S97GgPyuhi|;w%7$(_4BTG|EHp5u_t}aI2b97 z&Ly7&c9sL;mQc>lL@sVnL!r7ofZLhFpy^^$b93Y#`M*$ljFz^v?&J!B;?hNBy$269 z5G0qaT*%zT@p*|7bX_yUUuzA(!lchZ3cr_t*(4POML>K!r3zGe@Xnt=v;m)6O($mb z$9b4=RGYltH%)Z+0ioM87++gp{?V7E&c3bN9P*L1mv;h5afCK68y1?siHLg)o>nW|mJe!KtC`H2&WMp%@n z2%N%evHAcClkq$~5PV`1xd`37iOF95o4|4Tn->!4b-f0L6zO`kHJYDfv9+Z^NHn@t zX)eVh@5ln&(|I6zzP|Y2gYX21#K3k&GG0n31s+eINM}lilj9@&Yu8>QEc7e09Iet8 zgoVb=eJCytXb}@S1{|%@7tIh7m**@@R&fj&I+^$H-MDdfFiX7^84)4TWH;tCO{!ia z$7A{{MipcZDqhm|aP8G@MUC(0Az^PZ8()sY(y6_w;f0GkI71cBjb69&csV0_36@|& zaTe*Qi!2$GwZ6VsaM)v+6R1B$V!~9s0u{%y47+*J)G?1=0L9pZ&3g#*Sv}O7_*3GLhCBjKgJz8~_H_*(BV|d@78AHcEeW z8qc>Z9+AZG-nCV`Y*G8m@v=)*@lp=K=dT1r&2^Qe(aMDbmPygP&10Zx7abzHJ{N8y za$Oq{wZp-Vkhj$x_Wbpi5F+T%bG}eLLxmJYLdV7q9mAYbg)Tj9a=34d%vth~Gdu8> z@7@Vh!koFUZT5{WRYg;3C&PVs0lrhq+#SOf!PCr}EkZRrTLT3Gpp8&P8!4pjU!N6= zxb|3N^H+$%`5p-xR&n{r((@ROK}ir*!ZU5XFFW2=#9J8#zfFIkWkU0e9JTtvwUbysTvNVhP!W`HsscES zE02VzfCcB@THp9?gW9!IvU{U&F75!i@U#5F?^7StUDP=3K}KA9v%Q;)9e} z;MPzsjbHgAQPRlALFp8)dY)c>O1{jUisxpNgmi>B^G1a3T(WotY!r?bA5K_X7@Sde zfcx^>tNJ+ag%E@)9tg)Kj@Q{bh($B8&H3wK_|fmkXE<6SI3&vK@Rh)!wHA(Hg&arB zBB%FsJ!To!WJKk?2ds&j{E4=@m=iYY({PMGe*+iol-hoInt=o^L&K>tY{aGt{LDc7 zT2r9-PT)C%NuBdZMi2K>xRw1RGgft|63362UX8xCUf$%y(clyBI$~&TsH;5ly1ou6 zA;~yCS>`CLH-#ebR{&*Xj?S$;53?0zKdAtlJr5h;NUf_==j?WV(Sj0yuSuh6 zDI8tC_n53fudB3>==5`LIv zrCSS%;<46J)YUNDn7?AUPp=kWd}~nu3UmGU?pPGL?jMvikCgPA|ne^Nm z#*KP_&C4o++N&9WR@=`)W{+{8X_%d_`7-jFkAbQ$>M>e&#Vj&Yta6xSV z4U;J_4V?+|#vU+D8BfQG9!f}T7ShTg2l2*OKp*{=x0(hP=s!3337z~B{i*sjDyCCA zYs2>YAM%wmYgnUtK}P-<>Lz0B)_;f$PK{>(Xa2ok+tWec-}`U(j|T+ezU_&aTHIb5 zRwwGxLrq}{{q7ZG&e9=(E_LtEAL1W=Me}Q`AquW;{!yx$w48MKV#B!2$BResBo^US zb!gfsMY;S78K%o;gUQ4Cm~*Xa3vb->#9dX~aH0Eynbbw+uHV1ypK%S0el1p-i1tIj zn4Ld^(38ivb0x&n=){`A2#_`Zd?8WZ)^6|!I`61s!gq05^ETJMlk2JLx!LYAmNCsT zq#C77{=`+7f&2_}c(l3J+02`zG=4qERf#PD-&XpJoL8w)r2-dlAw@hlFuQ? z3!8-PDF_*R>1Y0;I_+?_GvyjDyUEsby5;GUl_HwD{{t2fQ^0))nEKPr^p7h50tRc; z6Ye@lQ;C4cyf}ClFiO2HW85t0CZOD`+5S0y4QIWMO(2qcWWf;>f- zf#f`w!4jw{MI7UC>n-Uurq~kupZ$jiR#h85nV0M#vKDSuL%3GVD8>SZ)$Y~zcCD17 zWR8qncHEqQLi(O~np8tKp_OUI_I(vNo+O}>h+L>-R8u>9PPRExiZ zi=|oPCg6iZrnG4Db*p_dHY!~*CNd(RiABQ<87vjNDc`10Mj$|#U5ho zf|ctL<~K||<#~&a_2dGT{Ot5McMN-1X3y^--MNOO2DVE34A&baf4O!_iMDqWfMS`S zmaYaml_5k1sAzzvxb`CEC4P=X`oXE!+Of)uQsd#9W!H3P4HkJ~%KuTA@t(`{V^@l8w2Bp$0#pJ=D z${3&)|BgKzv#l2mh}Gce&vXDr)!}9bGwP)F{zj%y~4UON*@ElKFKvk&x za3u&cEZ6mFhhrKHLK+MUK&`g|2bnwXkjQT%s=5I-IHkrx8Rq)}#_fbE70Wm?wg$8> zk+vK^M){=W2!E3LrTU2*5hw@1VHXD|aIfsomy{LGbzar@cRBn@HU;URhR|_hd!^kR zbJrpBN0F_-Apd|6xBM>;njlTSpzMsy za-IM_ql5R(KmkY&4B0Lx)%JrSO-Zv$WO;D!A#k2!VzYKfmhn(pSVa6j0nbn0=D= znVtXSlz>O_0ox;B5BK#ju7thj9g!G@EH4!-D^q-qERL4Sy=w?T55#h1`DIi z(kB7J3*(qvYg#ol#e-O{AZbJG!xL|P3ZIPanhaZLkAS0^ zML4Pg86hj2st@+}yBwDvAm3~INkl6LpmS6u%CIL*80FSA^B2quoQIF`&*DV>!g!2Z zmx~9UVWTb-U_-oR_LBwj4;#*TJ&KK$7ic5sHky7hemQDz%!xDJh2HIUZVL~zob9Vk zRxKlc#=xW~F3y|eao^nyxWpp77eTYxMuB^l=W7IZf`+;Z%mFqNs~f`nUWFH8XWHai zj$FpRoxX_{1gMESdxX0K)mQ>Pl(Hk7xK_)kb1?!f-~2iQy!Zk@5EMDFU+WbpUN=UQ zZgb5w93EmHq(7D<{sxi4-N%B6vFJY@ZV!KU{Tj!ni9e z2)!J-1<|~oXdWjrSIjT{3OJXKwT@;Fc{;Lhsma%s%ds9cZN`MO6z$%Kvczw>0WmW9 zyQ(EgJ-tS6ME`Wps*&>~aUX{CW@C3MC)d54Ak#3MyFk_SOQrz8+SC>dk{z<$B@kZ0 z_07rpseCPQ_n7hukK4ryr0adhAqWFOpUMbCYup07TU0aZ7x)S<)vU5r#L`XRKjJ?esy9H=R8Jh=m8q#I zYbU2izIaq$pnF)NP7Dow3F6*l5dK=**@;0KQ@%-8>|tUp#MNg8y4U9bqE5%zU?Te! zg*-F@J~6}9RMw8h!$>+P=i8nHi(`7?@#?D&Rv++(S!0}2yHe*1Pik+ySkxwcTPD;=i;}M$1WdNjF2k&S|)SlWO|eeC*Bv_Ww1XVQvHB-Lo}|FC&{L zVm2Y0Uk7s;Q$SFV?#`V%o=9*yvzS{Z)69w*)7m3(qpkjkm*@{I?x(DU?XCKR`n{so z&!~d$5xnARK-+UM28JAu$*j z3ei?75f4fru^s^dxdBR6D748P%D>-#Dt!G5 zo*>Yw=z5@k)#bS@?E+t9*Q_U0Q$(VdXSFxEh>0r*#lw-$Pk$$4Lz3<*6WBgw(P zbrQrND%tesh7ymQfXpLY2I}k$1n_jt{8TE$RvRxRfcO|O#}~ZF%p0klAhauf5j&&G z)6>=UP*UP@>o0`Zs1%jUrpe0cw4 zr5crwkXU7!t+q|y7Z>NFH+PDicl!IB_>uq^Lg>AWQhD#sg^W8AYt64kg#Bm~4$(Zd z9TcdJDs$l6|M6sZR4q?S-n7dwVC&(A06t0t>vDSz8Ybk4@ z+l7#rhKRYke^MHrHu>R8%E_s!cK_pVy0%}g!UL(fMVHGU79+<$ODdly0tDUoki4KK z6AZIYTtwB;9x4J+>cmGc!@oj!k@@4ljitRIQtrUu22vZ&>^Tm%?+Y>m+gSncSvX0L zN34DI96QUiJ$bku2{JHTfKj7TV>3`2IsVBpmvg0fY%}a%(0ca(i|Pv^q;!GN0>t5( zSG6g9%n4ns@&iY0ZAws2^p)G0LUy^>idJ~Wm)MXv?$P)>Ja0zYWCJ6ev)vXvtA&WR z1YhUT*Q8HRYMPw7!J1wP-!?a?h%M>xzb`m9ee~dKbM)M}KB-Ja>iUGiKBh26+$as@L7(jZ2d0nj z_lCtIkD_iYDwMjAi^X2?3K(zJ?+zi(GkeiBt+dG;i+q*7AfjxO?j-1g{G>CKgXGP= z=U19dcw30^&aWi;9%miQJY9a^`x6EiRdOC~`Auu%pgIhs1!1Ft)y85taR=*1G{;mc1H@%}$BX`j2Hf<)+5}KN^e@3uz zaBgqBC*wAG3L0{g=iKjbTW z0pNt?gt6ZO3BFoAUu44H;3K96NkQ*BB7kOqavUZ&(IZ%%FNNNuDCoTL+e$I14^sFQXEA_+7-m)U5p3L)eqzE zi!2G`850n$xi3eJZyV)j>Zju-gi{5e++w}MQbpxm`*?daCM!2#$$)A2CC;vENOHrF zTmkEXMqcvVh7K9~t2MnuvmO{(aVTcSy@he}8k% zY`m1vgyk(HPyFyh|0%+I9%Qw4M2w`i5z{;gL{yb5W+b}Lb}^`*t-q8@h`Ves31c-Q zLkO5ry~?D%4MB&I!M?t}6_Jx#80YW=*;_fbT%4pe13hi+aobd4U#%u3UEc}Cy^M#a zR$qEZL8olTjN}{*IPd>!CZ_b$1-u3s7;Dh%<3iA9k+sZQbol7+7bryVP`NXPavxdZ zCw01-XXQy{E}vIF8yun7Q5x0daR%=Q*T3U!SdK?MktQxyk?|*NqIgfu@w&Li&J5J2 zlg}v5UdNbYInE=Bl;(p{INcuW-%)&wm|~cC_s{ZMOnyj+d|f0vBf_RFA7~MlbEUKo;~<+- zDcLLCGZz@~y_5Gk1wLCToz+pr<0n`v>?ZSA4ssGoQRX{q1l zqit!KWkGoSxbVS~?@l+7R2zVKw*|`1yL&9YUOPFU7AXIred{*+hZNIFo!|27Hg=2n zyW-+E1^0b7c#CdMDwi!n;T70ko6y6hNCf|>CaneZqRbJN%w@#*_#fv##(@e>kBGv3 z@uRQG3f@m#1dEHcno(_R_vPhJCSvlFdlD+-xJt7M z@|LVT8Tg%X$$WmDZ0(Ffcf`$1*#hb;!d?IrJv@5pv#FY+O5$8^tU;>kO??2oM{lK* zl`2|lJ`#L2gkUwn=uQ-|+L)-+;pGc=x2u`niBa zcMwQsDqVsgfQ7)u#^#r>`9S(diETv5spom*@NqaSb3$pb5~ML^mS!5S55T{oB2oz} zvGT|YsIFa0$@C@3rUVUn2WW)q7@gc-?XIC{irvg^fGd>2GVaaUTAaEB8P}(BlpY8Z z%RO#1f^z{hzt5Ei`x+nWeIma!;kJcK&i5h^n5fhJZ?MfQk9iuEwV5zxg`56E6K$(cG5h|za^nZ<1JvvG4s2gJ>@Jl(gkm+=yWSPYmzC}C9KN`=`=!YCVxtFO-bL%Q zxPzHw?#6@N-@ktR9y2F7qn@Wka|}}w;tKYZ=SY&~ohUfjGGsSk;-T82CF%2BoU0Qy zFx0{Jy-gZ(AnIe{Zj;c`peDUUL#n~lvwy(#&=gvWUl^axkGHk8y%%(1y9ZnJaLDgS zQqesqKR+p|D}%8HvAp;pLYsarvIWbagP{*-hy3pD6Y2qrtE(BVSMH6T+)$&|d%JBq zJhSUJvGKGK3o&D;Y@{b^98fx@@6R2=In4N$xe-jH&{4AS*egNKb5@!mJt@1n&%}^A z?R!3}1afM2jU0#wO!r`V>!uhrQ98-cQ&{#j?yMNz)qyh?dyknp!)~@=3JdTJ=4h$w ze2X{{k?T;G8qzB0{ghOBYu~x_1rZGqZR0RDqT4Kb{uOCtV4P${gp!GSlWq4QEKG6Q zwZmDIYt|P3fn?P2Wc_Pq07?a>e_gO#HPyRXs+WXELW4jsmbBYGj^tcQw#oLT>fps~ z)KtWSdBSMKsI1f|q1a`uKm3fKpdbY_XY7RH9akmWzM-RaZfLA0H#VpBm&59@AIMU@ zyAnPsKMaPn=55+T)tD|YJ}6Z&U+YWpt>A#oa!Si~saCTK43V}|ULAg60zR%X^BP&Z zY_CDzNP?_$YAl(fyxE8bNS^BxZKMk>HG9>Oo0 z7;+faOz}qT(nOE`Xv{~(mVkIwvm}gw{{7`F8!}F2b^#HzwH0d#mv($Ot%`APcIv~LR9v3HO)k0ETTj#1XAy#I^k7Uhg zRgNpkgy!5UuIOh@5_J2kUkErrmOPPsM^?_6=3;l}yt4o+Vxy{~#L#q<{^F)LCl{9z z5pl&_l$P~UPHE;$V?%?=jTEMUnfUj!CNX+iUvau`qBdy?!DdGT3EU?zI29i8lPm;7nu4`1#dEX+XKP1T=; ztS8_jZyCLFfhxjks#V6${a16zzsMjSpBmChn*x%G7t z?zs}BUt(ABH8@Q_6p|YpcO2DDmh<-1gWDA(9n(K25?a3CHd^1>32h!9X?tux9flij z5$sm}ZYuqgb24A-g!|VbT(gtCxM~14=%p)0DMoK&U>=nMSLKkvxTS_=$vIVsO}i{9 zYBLNc%BWVB-tgw&7n!V^hP6ydEkSLqfYM(TN?mu>! ztwZS+=oZMA8O@|ISDxP-a`71Ohoo_Fd&B6j?1ocb-cLO21qy6~w)r4UzUfjiY~@3CfBYS8fCO1A{m*B(^Df`Kln9<#mKL3*d#HFZf7%@ z5A||NPsEB6a^@cQ_~JbzcY_v-R!j{>q+02u;W$*$2bkQG!*pVUS19?Pmiw=A6}f#| zyPxOulDXxTqqvc4Dt}x&BmGy_hm>GbFar1P3}TbIiDnq(I?Lm3*1(LhR*?O`Jd;bv zc2;ux%1a}I)VukF)EQ`VwKtHPvHFbiRYI4g6%&xOmId$LtB~rJSj1@hI{lkR@g@vl zdE#aXYJM}13>Bwn2UJ?a2Ap?;@s0tZ<-b36dEqHUXK>xY*C2@@VJp0pW>DEF1LOsT zISACR+(DgDQyi?yHt&@tny6f@kU5ggv}-?<*zbR0{b77F+gwK6C?It&OockiK#~hb z#h)_=$&Q(fRZ)pDP+(BP)s3QwFib1RH|jJFF3Tw31R?}qqm~O+8r30@rfM>V?|r1C z`x0PEU(<!9XA@BMs1@Q@7sDj(3b~z7N$X2G&RZYNaQ9;6NS?n+?_Tl z8n?eIxbp%10*%Jk_^Ro{f`x@eqB#*OeJsjEvY*;B+mJvgKu5b3cJg`lgjIt}p6+DEe@K}%UvHClKmr2J{w(r1nux&gg!E+Tn^m7wB%*`Riq4SN2r;u}vlkYv^5cdzr9oM=$BWquc70&xQ?FFvdl zB+xm(cq+1P<#i%L*tA7=LcODC$>(%Q+ze~25$y5l*w(&OLB+Gqt55TVX0PkNI9T50g#Z-cQh zT4zUp`p%{``9r+6wZ1^c+dXXlFvL22X|VWqA!BvqrF!B2`zmi+be-#e*_`Ubs$f_G z@p{ZfJTFE`cU}OajqGMcWC+`Wd78zUy*+7lC;yQcB|#=7vap6S<4S_tW}EpjuglJI zhK8#YMX+1&?0(q7qXe3tE|mL+i|GrJ9-gzikL+y9{v|cf)@*bI6XUbNOd^-xi(ar? zjXxZ?{2R>7%$_6Q5?aI`RKfjNq8KZ$ zJSmWtFs&r4sM(IbC!~35zt3;sQESUqilK)ue5!}%9g5elpHI|O>mymSyU_pR04C-G zG}1VE3ncFr@GT+lv%J zEfQ+-K;+~S^UpjfKm;ZV(*~F#y+Q1O zU_V-7P`o)M(C@d<+JN$?@`qoqd22>h=#lQ}KO*Dr#W4Sm)V7<8wuA(-01OCWK-LTr zi9x9p=<6lr<$Y4P+>e8gOK&vZ5`m@@(aBlW9`W*8jR(RoBjdyheY`>0wq|NUy)^M&e?MpX4haJ zo#>G}lF_HrygZZ>_sNnj69@iAQovSE3xuOQvM>6!qtr8$FkPyt!G**8y9{wpd8Z)z z#(|f$f!*x<%wHFJYJ(b#m|q=w&Y(Rhg5NBl%{Sm#GK3#ve_Kd|xTmit?C|)BPy$WB z!eg&e2-5xmQZk>uSlBTdA)C{pJg5NJAih%wk@G zd#O>e3Yt_iR#P%vkEsUC;-c8V^N9CXf9-^yu!@$&ZUn-eL+a}84?vb4%IR$5+F$WIFs=j1K-(5NVrGU(QDA^YM22?>c97_V^Q za&W`_skmgKeA8|gdBB83HV-9-XV43e9tl6%JfN!;i4BN2Y<1Izt>C9Gf#rW~4^3`w zsY8Yh@Ir#K{yC~NU~>WxV#o{o|F`X;^|r?}oGvj&EDB+wXW%9EP+mM&^y#br1ubP1 AeE)rnkbs;30)Y_9%Dhy8K(N6NRuJBG z@E2%Xy(9Qf&{;~$S=HXm+0Dq&6ryP4>|kT>Y-4Fm<7(>YWNB~5&CdCZou8G)!r9ru zNsxoX_CI&9+dG5DPgl?(jYyL(X)3T9j|*!D^-mASWBpD=MW^-A)JsEI4aksv$Jz~*Se@dLzuI8wbEh!2RWSE>)2t> zy+1{S(lcBtgrqZBz^N@7x3&&UvH!4*SXo9+F8Ka~2c65kNs0*rcS@XAl<)}&Z5<*` zXRj^{$pjn`Yo@tHBO_|NNA{xLIHxtd_w`&SOx3pxtL(l#5^#L^;>C+L)d|rl--~fy z^%}$0?e%I22b)?w#b|K->}U7usQBxo*=g z@%6jy6zH?rD}%%BS&pmI@g}{~#>u+xzT&ahqf=99EZGYiPpv$zE{-zt^Ec{K2bz3+ zzl4XADrdlLm%3sd|FnJC6V=tzOTP8+S*q-0TFbO?Ndlx`zE@u&5gdU-F8pG{d|9Pc z%@lgL5lLZR|3;_M#`1D!jT+fyBo8gMt6gJo@*c^4b7(|2g(Tff8=5cf7d`9QpdcY( z*jw%uvJV>>E70xrv2VIK^spWFJ}7y>qLDBaL_{5TwpFKG>$+)WP^6xxkx3XzsZ)P2 zrn|J*8O`AEJ0>RP*9~efnyP76-O#i9BqUv}L}E69mpl)xk}knA6PvZP-@h*r-XD-0 z%2cHI5*!?5c>aepGd_<&u+4Mjn_Hsa_acu@`uJZ-_Kg$S{d`70aQAe`@8{jfF}y^_ z-@9{%hIepYoG{We`M`WGPS-ASf8Y6RVe;n5pfojXyX|m#%9Gx-ugD3Lnn} zp#Ow$bWvaK+*q4wsGAsfwWRnl9D$yiz0}xhJhLO_%N>pw%~56CJB?;kE=2!^Za0`u z^15zlIYGPQ*vy{GU1g)F)ojmzC7WGlqn>@gEOGsK-7ifts0%EFX!u>0=*c2+XKyd> zb_TqJi%_2Y^H{z%t!k!1WTW?4;=s`_+VF&D`{#T8Q}8?yUvfE~2to=z1&tyDwsAeD zUJu(}U0qR+B?A*8-UG8rn#-^q7$1iWMa-9V?I&2w4fMNiHykCNHC|mp_b9Ey7Y{e5 z`lnXbvfyzY)V@euHd|j;*UI|+A^ByYtF5|i1n?`g*wvoc^0CF!a_^a6zkV?n?JY(t zCq5S5JQxwzo^nXJu0=Ra9_DjYHw&X`p00CCf)rGZ67nP8PM$a85G8D*j&~Q#n##+| zuM@JM;%`920~&xOO{yDTfUV4*n3xy?hl>K{^wxGbGnAK(t_@j9CgNFMp;=@wmY)9P z%$p?Sr=ZR6XV&rT`Wr_LSC?nYyyN-WPBUjNs{<{jqrK?@X<_+UpKzyvprETLA`nu;AJ;9$n$4SgoaA3QMi z4NtPG?G&^cc?yLV)hv^r`GBk3XCen9s_F*Y?G*Oqrza=cN1IdTcJ@=1y~5j#XIpvb z`YF4*UZj}y80(ogII0o`Iyx=o?K6b|H;59wD>hw9C~+>rH1f5K zCS&8`%&4G?k<$6!1YNksIhxKLQS|Y8#d^_Y@i}-f9ldYPi1T!Gs4E@#L&+laIJeB|gSoU(6{+Q>&&})E zLH_v}(u+c69Nr&$*@W}08`1IIQK&pVTRxsWleDn0Jg5Zira`^ibsHyZY3jZIbm2knY}TK`X5VlShwl`-Lc6wNd5bWf zoXcfv0N4$pz8;C&o48t^+Sc}xdnJc!syI{Bu5LtjlvLmOP3(#~^`DV6Zo<&Lm41F* z+YaO#!4kujC^nsPnd^k)Cd-1OB=>lqqTY`Vs7+aqYI-;NP9f`S<({qfufVU)&56}q zE)#BlSbsf-kc}qydIFIkfDAl64H|LHjO+6lQoTF~&+RiG5@4UCNOLxjw{4J}ys1V_ zx*nRX08MeW3p@0&5Fa$)+T9aM5zu9yvdwQgYBZ|^=pvq?lD9!Eh$AAhXzq)$8PE9L<+FFV?U7>f1OZ8Ct5D3x_n%MQOjC9SD`P zmrKh*qsv!@MrWG}s+3S~^jFJJP8FJR{F?&9vX`f2uXS4n6Q4;FK<3mu+mjAeEI(Nh z(%Vi|@*Y{{_<#NSbuXo;^);VhlbitUuhn9$B7+76zd^oxCm+b zQXAMjNm36dEw-g?_j$a%l?maoYZKPw>^A0?6YP2L1I-5VY9DqH7DY+K_2AmDn(yWM z9F526J&C;XJ{Ks%@zZ)#QPWJhw5099yMihg1D&PqrV`2AcmvNId|OY2+^a_uGloGr z2j*p-*+V-y<~V$~B7h%d4G$l>+zuTJtX)Zg_6Rd?whX-eE~!5$pOLjoRd zSpj)lN$Xh4Uqc4MY*?xE51q3W7&|x&8^jj;JbkekJ4XF&~~cBxDtQ?6o$O zflit|Z@+cMT)>@?<_1uT%VAEO_$7)Um3MGkt2J*ct3%#e%JTErj0l@sYOA~0WMuY7!QuAat7$>`U%q?+(N7ysL}b>rtFd>Y z%)Ed|^f_r-v&C7sGlp6q!nb}+Gf*R{BXXE7^y-fD^$5!o<=vG^WPRKnTIhd*N=0Ei|^jM0` z#QoH0xINQQz|pWD<)I+|VijslvCqkNgVTNIEh>s$KA&(Y>&jAVACPvxHLQhafTKST z{GZwR|CP4?|GR+w6Gw}cM8I_;;iZ(+7dRYVmxR;Ys#T!T+20=zkaYKGWi}k*#VTX@ zSx!mG)r}kCUJbZ_<#^$@x+JXT5cii6Ln%+EI9gU$E!_BT_yu)#cXMAoEW2RGg1`w> zD(8g>-{3MqLND~OA$>ng0Ply~xQhV)K6)7ec4TK+K*f(^7)?!2PrqgNs*Lo}BLzzw zh+-JcHJ*3mskffz&pb#|QBhGy#rDg55rLif{%+^jueb2=@SbIDsmh>#NI?(W zE9_@e%Jv{UWd8RD6k=mzJ3&ZL;N9BUad6|$ny?0}1z*(@>F@84oPGom_3vC3=T^&IHT#VdyTdWj*Wl=p6`5IDEv zq701BHW92IqWFU)U?l8&4f-NdPrxN`QV0TRcB$u*k@}>O{8j6<+VWN=SSiPHtOPUH zqFw|uy9;In*VBDV81RU;_V&bkw-?$&qZ^<{lhk5f$HiZ%#b$)5?%sVIujly1>wLH4 z(A)PQ&k$C6-N?vjC_|pq165FkJhp^1ORvjFrJy3avZM(NG*b6$a-d3^L^lZ>RySHe z*q_GD@&%Z7kCKw@>SFeaP1Df3Vq>zRd&DzQ&?Pr#rqSoZlNhmo`RkWV+4e%Xn4O(3 zx|4CJ*2Q|F${wC90v)>szYTe`0w&H}p8k+pf?(#Qq*^!(UbEETCc>%lBY@%%^@Aj} z@fY_z~)hf)uwf6FP1C>Y z2#XCDJ(Ur?I(LGJKr4lhkWOd}DA21>c@<7&8;Ffb{b~_xkU6}fjmTiZ zaoSkJHWMdzqHo_3t=3z=AHk?c8=!7wThm}KO`Em>m5oYFWESzw$~S;!EFyBzLet5eYW8tKli8`~a3~KoVy< zQ}1!_!2|kmk;4Q!dV1JdEXmeLN*0DIC1+Hb^^y}eV`4>y@73k9LgSx5#@Z#upDs8d z7VPz<(!l~M;(Mt}1U$F&0j_d6ufBF#PP;w2Mh30C7U)u~gfrCdd+9`+ZQy;Ne)gn| z+pH&IrUBah`7SLT4NY?o4BKzHtv|PEBC)2vUKrqLBoe9TL~!uQtCm}GOZ&Ls*6JM= zYNYP_$~$wG!NI|c;EbZ8qMoFsrES@TNmCaEUfu?tz7?5%4t(2!z<>;a;k6LOmf1R% zB&RVd;6{|b_C>TySgOqc0fW$eG!InXzl!+D?3mdmVjT^>wT-beo?nL8=PU$xr3$x% zDI0PhF+zIdHAxmnn0o~0g^z4{QJm8u8y;Ek z>H&o3TG1_)N)MF>62bT@I|@2}rTTTQj*GwU3OKJu)FlmXSbiQ_$mk%1BnFRPXOg37 zrg-`4RbqyQoczg+mQNPS_a768tL{zGn2I?SW%o=gVv$R=VqsxH5*dqTgX(B*>F*cw;r1u@jJh;y-OA3Kh2OeE#I`f2LXfI@ZXOiaU zBPMW{)eHsV1xqf4>Lmb$>R_T8i0uz8S>3F5>R2N8Y z>3Ml8`n*Y4wcd_3=hlA;3=GbDgBgJ*kEX(IS`Y>t+GeI+Tcc3Va_p)W5OzdyadF>8 z`uFejw6v{_l%if*dZC@m5J;+aLB$bB#8Sqm5F)CxUVEWmA9ALTU6hkDi;6bRY^&<& z+3+O+D|qkxz6Mj_O*?tkFhzQAmE*&TXWG*bU|~8o zmd)?tw7wNWO2H8uKJxThw{3QylSDJZy-M4?fgIE`_E0c6yFn$ZKPK@W-Y#b$d=8wP zSBRvD%F(QEQ@&Qo3rxBWL0|Ry;*NupeA93GT{JN8ygah$2<0{W;^#~zh z)Nq(s0~9Tj*t1zr6kE;3;Z*NIc{$JS(N)fO6iA~S0Y6L{cmPC`i?gHnPzrvza4Hc* zPHs|}!Yyz@(1@Y5hMU@TuC}pL{bE=36UY`(>DwwAl4xDS@>;_A)N5VP-XgJp{I|XF!Q~ z5r9qiJoOJPmol*W=SkpUKY#oLb5O4rlbNuV<-|-bx!c_Tz9bao>xBfc+^XPEgoM2O9t!l7K&!fTp7{h{S?&SP? zvqB@UbZ)}mWqEkzonyHG?&L>&@-iZrz_e5VOjmRkPbEeSJb-L?{$F6^!2b-R z%nTLi@&l1I)}X<&6DUfoTTH&MClT8>A&`3A0RIuddQAXBF7?45qQrFa{ z|Mclo#a7w-g;zB|88YpPVM0&4&BAsvrux1KW#lj>sbco?c{F^~szR{V2`E%+upvKQ zN|n{O-Px6h+^lwzjtC=R&v;JuYcEU#6TmHr=t)WFQrF0tF=($&bmf@#?9Klk})7ADgm{9-)`dc(-UKY+CFj*2@y^i&MCuzgcNNP7;sr;ZTWC{4tHibDP| zee&aXDxB9;v>QAt5D0{x0~{kQ=BnrABD2iT*DmaG?E1Jk!Sg94p@PX(7K2Z;8@+0B z=uMMW5X3)PfBfhjsP@kFgl9v~csNR^mq zOs0Vxq&=9lE`oK=(n^QL00cWboPlmnz@y{h7|6)T4yRfJ3AyLx161Ln-irZ5q7kOu zaianf(+~azJ>(>TKaQ*IWf!I<3K${8 zFZx&^!uSgYI&2#GrGqOluoQi)7a^#t!*04n0#XeK#2pI^es_f-iN#75Jl=ct3?D?Dn8G`1!&-a4U!WvHoYFqMyKw2vB*q} zPq8=wdJfziINv`80P}Jz{Rbz>yqIO)fXo5oqkWNo@-c(o5}lxp?a;iL!(|(D`36_7S@ig zp*c{+$7M(cA*p@0hUURPI725&ir7GHK2VLpJUFcXT26LE@I5>aHO$_HF4l>tfW!S_VN#CnueN8mxO=f~eZNmunB4>(5wPgE3~Qehjx&0D24oSr6pPn&jn%R#v$t zCMLhD0K*B^Wl7@3fF+NLRIY^|rY=*E#`CF4$!h-kHy?d6rcCAq+^WF;zwEo$V8bNWN#2r@w8+EZyRd#hH^Kptqy)i z_X%w$bgcBiXqlLp96|j>=FOW(Op&V8^T6r^6cv8zJG*np2lrx(Og#EpPJwP!SN5Cl z8&z4#a65KJeLD~+z{RRo4FG$4og_6je~Sz zmbx=?}}`es9E6dBRoiWQ~7&KYm};+;n!=-;-Jx?A;W&aPRKDr;QuQckivx_7{ zTu-#nAzdb@wBfBY4REH?G&1TK>!+=&AVM(~od0Vf@aH#a5?s})^58iBEM!W&@Cc1bOJqL4*!yM zAjdWn#ZY7ZbO0X$VaAoi0hvOd%>l35mY%GvY$On=`;c3pE()?J2@J523Ax&U`Yv9Wo_Tb^KJ7V1C;W)R^Hs^b7BaoGiDD2I_HUmp6Ip{^ev(iiobU zvGInkqho1x^lhU_&kPbT51HWZuIWhtEOWFH%-r0nfBrC&U{wxIO?Eqj+?M>mVek8@ zUGIDJqJnB+E2Q0MP?W)}ci+=FpX&pMZJvP{k*AN>OkDiM=_eeI*h`)#binJu3J z<)(KN=#|iH6`j+$@8P0c4X<^4<+^Dwpk5ItYO!@s_ap4fiq)lOTqqW#IsQbuV9ZR+ zTBmnudTbD2C9C;t6(ooyL+Tp_F~gb-{@V zpr9BG@uL})skKq)M_6>SFh?_9HgpU8mzTUExU~~+UbxMMb?H-T3=PbmQFRf(m~;c4 ziqZf#)2mFqIOD>r_iIW_PuZQ?yRkt^9Y(W6H{9+Vxfo~U$XX?Hd8(aTWb35x-)SYmo`I#^mh4xxA%ezLyhXy!d#U}HJ6Lhb*8rK?=>49 z0B%VPhM5+q|BiI96vBA&rPOR^N{_H+BP9q6#<)zRM7zC>jq$gXEG=`tDQg$Ue!|S_ z3Ak_*V7o`t76(%S?V?4WcFoylfny~CIcg7>Ng_ld7rz{jD30Hr`YGFwfWU0s_?b;Q8ro`g{7^7eG9RzYNjZ=S-)camWk8v!N z#E14QY^Cly8Q9uLJQX|Ukezr6Xt&?(k|;wphUi)3k3=tEUNrtONguCYQ)3EoSg@ur z)%6UkO9Wx#k$8mTca6x$rHfUP8RjbG$*ioAx-0f^yihGU(6Xg05#di7GX@gah`>Syu?4|6Y zkLs?=J6oiB#mCW#!OINBE)q7k%zy*Qf$@Jghp{cSLW5+p`0hFiH)%06omBMbG)AY1 z{xvZ*?s0l{IZ@9!bH}sdu;s(4q}$!R92e4+)M@S@jBLG%KtqgLu+UkCdQY~I0y2Nn zB^SkA)AX*^UwO=jG$fCL6Q#I|5dKWEd2Ta_SCgsfuf218!r>D`v0`WZ4Lk(n_eMG& zZ*+H89YhQ8AH`-5h?j}Zj&ht!&rExPau0z!He?_MPlZay-paU%ZdizSBVEJH64nvF z8DniYNkeh;&B1LC04*6V6H(mnCkiA=WUOWFN6#8m>$uR1mHdrSOgAfkH7=ZN*#V?C z=>ulv?Qyb@D&hiIcMi`Ah@zxwkYYt?dO+U%`Vman&3#mr`nmJHCj5-fz@>$ ze!9CtxPEze5cNGDHn3qAomAR2EZvPXXz%arQ9?mkG8V7>>XL3$Uy~pZFC(9Xg46*4 zp z_IvzIrxTsix^$9sCS$CS{is)fCETZ4|JAu^Xpe4{Av#!2AP`v2!9dEPIN_t`uMI#_ z;xuJkA_JnL@J=%h`uDr=(ciSZwv#-aojJbrTR^`rQ{RdkKYAM$^DbDfduduRXepHN z1|3V$pXyhiaJy_JCzBpGRahBIp4LP?_*zHE+1wpCRt4v zrKXAtIA-P(O4mej{XJ7wF);6gdr#T;!5 z;oMXFLCW2LiY@KwYomW|Ettt$-DTh>v|wy{6k%hf4$ztrHwQGv$%~8onV704>)3y< zT3A>>9gzQTN!L(vhMaw;N(W*MGbGhV5c28#KDtC&6{&l@BA%tT zA~qGW4yfR3?SMo;!5UtM09j^?T#o;hbL*=ugOhgXkY@-lj5Hap|;P)+%L7Rogzattr}UzL(BKH|cO70|{k^<>xJ+VAMN+ zOqB>Q=}Q(UHR-$uiqzpS7G6L!WaZ?zh}%brm4!i9*sVw)s3mb9rFb7|YggL9VC6HQ z$vx>z?;{`O@=7d(CuiN@k1q(RU)bnvyUN(y^nH$rD&Iy zm6nW%q3~dw zg>~nbxrL=xZgH$LQS6uu(DhL-@6^?qd-$!5hb&F2(N7mV>5K0ZLYh~KU)~~LG?6Ir zD&+Xe>y z=5UwL5Uw=2s+mpW9?uYQRnY9}@WB6mGW*2{83sOV45zqh*j5ajr8e@{VorC+xmg5!iFg zxJ*2-Kc$Wn)mI37H9#muix|{Vzuul`#|OXW&39t4r1)vvwLpteo#=O;QIr(MHw3&Z4;FFn9mDSz{)yyopAe3A^|8ADBikV%c zjfj_AC6%BpbN+VUFYXXlO%h@fI`1f5nI@3fReAq34RK&DJbUu*>R1*@W4o#>1xgPF zn27T$Ggf5Y>?}mjyIW~Hurzb0Xa_Qx+g&Bn&<4n4ojy0P9Ofhw)kZwWoM+Vr9ftfTotk`V?~7H zd9z_H{Y#j`C^zRTPr6r0rglI4agalHJX8_{nBXy2mamcbNWfbIm}%^$w4>?Dpq^7h zrbC7~{(A9SB0>%P!6A{yUAU~lfu7g@Sq;|c5B1ZWV26w;q7KL2mxsjH=y|Ca3)%}M z0|X!a<`q?`ZI@1Zk$(5_hezXPA8D>NtK+GNi*$2r2*#NceA?>!6|djnxYYdR2eXtU zi@Y5fgZ@IgV)anOXpJp`spAfL+fJ&`9R#GBK!U(w02ak{!kH)T)6)|#0y{y!(`ZDP zEy=t3yzjj#JNZJ_5tu}k*Ed?3JwVfVgY@46nloX%8O(yMp&`{gnG|c!TsF>g)Rk$g z_SxBr_%TyK#R~He9}xjQ1#FzB{R3M6*fn;d#a3)z*`!;&_#tIKe>{2NKH8m4M5_{g zOQ%F%QoTcCeyGIdqqEI}$CNssF6R(v_O3m zm#MkenTevHv{2WSBt)GH9lU{s8u-HPcx;k}ujOfGB)lrF|Z7e3uGhI z__D&+kTUQ@?Ou8-ognMLEp1QizpJ+(+TkL%(~$~HC@?(xy+_5tQYB+%5Sg=XQ1Xp4 zp1eA2DJAx6@)M>qEydL#+mPhKUGE6YWLp#=+h6B^HNBlYx^jtS8hNQ`+J8b z9A6i75%}Mqd*}SC&{&3}zP+QOYW<}|3BIPFm&H`r@_pFbSQu183C_gZ8YIYRP*odv zXX;f@!c4()LLKtrbje=t+IppAgI7Uvbg^?-?oa*i`|SlDluOH2T~hXK52{FIESY_N zwxCB8cj#dGd+3bIDFm~xHl5SGt7C{&(l-9=)}tU8i_PbO?Q&xV@&{I<6x5xcOSBbIk+tt6?25xvj2zhn7@AIPk6G`en1^16#%T$77%6b;L> zcF@y@Dy)6Mo+CIP2CCP8t-!-Hf&d>sQoGCyChwq^B;;ctkO>ivm;PJ7vNl<0h=d1t}s-@e*C|Nqf zsomU$gA3vvw(Zi@jL6j;h;Rd;uH0cdI&152)}&`*)`eHq8DZ`EWAl4c+vjhVx} z$9xQxl)^AA?Wf_s=dFqb`@&%E{2i{-wJwM69^Sui;tjg=H~TR?N*;ZHb|ZhQ^b=E1 zSbHyo@;}dnB!1L9kco|nN$`cOzgAtk7Jh)?=EzAt`}aVn>+I>tcl_$YsYUr>>EXDc zon2v#%|vNN%?Mm~Gb7haug(R$nkHEd>VNN}*X~ev+!t5HyUzjMF2UdH z=3!?q?7HxTg12bwtmF9y?_^jBwpVt%<`4P#1iaxAJ>ME653X%?@IHU8rBiOv^4>O; zQph!74k6hsSY-oRJcqtZ6HQdwQgqz+>-JEOz!v`SpH7OFX~kUv&?m#2CJQ|gJ)XmX z344^n-dzU`Jb8hKI-vI&w7{%ZvKP|yXY9144?e^R|Z z;H;#i6uYul1~rKyg$cEOxEm_Vw%6u?x9NcR@Ylc_AU&pCK$8k+L(b!B(F;;?HZE84 z89NbC7CDGyLSrVkCKJQYPE`x&2_eRH@gAqpExtA6$WP-I|TPA(_iG_~c}C zA)hyr%6$%tI6d$d*$<#=;!tZB_z2IUkRjt@J>3*ov8fBq;;1Pp$c)>Tziou1w>E67~P znbNgyF!k*NwpswHO>hBkF=1h(=d{bXHa8a+a&l{V3)F_nUBL?#=S?%~(=5Kpu8|M{uXk)Rn UZ&4eNdms>5DW#W%FW&n9FN;kgZU6uP literal 0 HcmV?d00001 diff --git a/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb b/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb new file mode 100644 index 0000000000..66c3ce85c0 --- /dev/null +++ b/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb @@ -0,0 +1,699 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# Two Stage Recommender System with Marketing Interaction\n", + "\n", + "**Author:** Mansi Mehta
\n", + "**Date created:** 26/11/2025
\n", + "**Last modified:** 26/11/2025
\n", + "**Description:** Recommender System with Ranking and Retrival model for Marketing interaction." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# **Introduction**\n", + "\n", + "This tutorial demonstrates a critical business scenario: a user lands on a website, and a\n", + "marketing engine must decide which specific ad to display from an inventory of thousands.\n", + "The goal is to maximize the Click-Through Rate (CTR). Showing irrelevant ads wastes\n", + "marketing budget and annoys the user. Therefore, we need a system that predicts the\n", + "probability of a specific user clicking on a specific ad based on their demographics and\n", + "browsing habits.\n", + "\n", + "**Architecture**\n", + "1. **The Retrieval Stage:** Efficiently select an initial set of roughly 10-100\n", + "candidates from millions of possibilities. It weeds out items the user is definitely not\n", + "interested in.\n", + "User Tower: Embeds user features (ID, demographics, behavior) into a vector.\n", + "Item Tower: Embeds ad features (Ad ID, Topic) into a vector.\n", + "Interaction: The dot product of these two vectors represents similarity.\n", + "2. **The Ranking Stage:** It takes the output of the retrieval model and fine-tune the\n", + "order to select the single best ad to show.\n", + "A Deep Neural Network (MLP).\n", + "Interaction: It takes the User Embedding, Ad Embedding, and their similarity score to\n", + "predict a precise probability (0% to 100%) that the user will click.\n", + "\n", + "![jpg](/img/examples/keras_rs/two_stage_rs_with_marketing_interaction/architecture.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# **Dataset**\n", + "We will use the [Ad Click\n", + "Prediction](https://www.kaggle.com/datasets/mafrojaakter/ad-click-data) Dataset from\n", + "Kaggle\n", + "\n", + "**Feature Distribution of dataset:**\n", + "User Tower describes who is looking and features contains i.e Gender, City, Country, Age,\n", + "Daily Internet Usage, Daily Time Spent on Site, and Area Income.\n", + "Item Tower describes what is being shown and features contains Ad Topic Line, Ad ID.\n", + "\n", + "In this tutorial, we are going to build and train a Two-Tower (User Tower and Ad Tower)\n", + "model using the Ad Click Prediction dataset from Kaggle.\n", + "We're going to:\n", + "1. **Data Pipeline:** Get our data and preprocess it for both Retrieval (implicit\n", + "feedback) and Ranking (explicit labels).\n", + "2. **Retrieval:** Implement and train a Two-Tower model to generate candidates.\n", + "3. **Ranking:** Implement and train a Neural Ranking model to predict click probabilities.\n", + "4. **Inference:** Run an end-to-end test (Retrieval --> Ranking) to generate\n", + "recommendations for a specific user." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "!!pip install -q keras-rs" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ[\"KERAS_BACKEND\"] = \"tensorflow\"\n", + "import keras\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "import pandas as pd\n", + "import keras_rs\n", + "import tensorflow_datasets as tfds\n", + "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", + "from keras import layers\n", + "from concurrent.futures import ThreadPoolExecutor\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# **Preparing Dataset**" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "!pip install -q kaggle\n", + "!# Download the dataset (requires Kaggle API key in ~/.kaggle/kaggle.json)\n", + "!kaggle datasets download -d mafrojaakter/ad-click-data --unzip -p ./ad_click_dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "data_path = \"./ad_click_dataset/Ad_click_data.csv\"\n", + "if not os.path.exists(data_path):\n", + " # Fallback for filenames with spaces or different casing\n", + " data_path = \"./ad_click_dataset/Ad Click Data.csv\"\n", + "\n", + "ads_df = pd.read_csv(data_path)\n", + "# Clean column names\n", + "ads_df.columns = ads_df.columns.str.strip()\n", + "# Rename the column name\n", + "ads_df = ads_df.rename(\n", + " columns={\n", + " \"Male\": \"gender\",\n", + " \"Ad Topic Line\": \"ad_topic\",\n", + " \"City\": \"city\",\n", + " \"Country\": \"country\",\n", + " \"Daily Time Spent on Site\": \"time_on_site\",\n", + " \"Daily Internet Usage\": \"internet_usage\",\n", + " \"Area Income\": \"area_income\",\n", + " }\n", + ")\n", + "# Add user_id and add_id column\n", + "ads_df[\"user_id\"] = \"user_\" + ads_df.index.astype(str)\n", + "ads_df[\"ad_id\"] = \"ad_\" + ads_df[\"ad_topic\"].astype(\"category\").cat.codes.astype(str)\n", + "# Remove nulls and normalize\n", + "ads_df = ads_df.dropna()\n", + "# normalize\n", + "numeric_cols = [\"time_on_site\", \"internet_usage\", \"area_income\", \"Age\"]\n", + "scaler = MinMaxScaler()\n", + "ads_df[numeric_cols] = scaler.fit_transform(ads_df[numeric_cols])\n", + "\n", + "# Split the train and test datasets\n", + "x_train, x_test = train_test_split(ads_df, test_size=0.2, random_state=42)\n", + "\n", + "\n", + "def dict_to_tensor_features(df_features, continuous_features):\n", + " tensor_dict = {}\n", + " for k, v in df_features.items():\n", + " if k in continuous_features:\n", + " tensor_dict[k] = tf.expand_dims(tf.constant(v, dtype=\"float32\"), axis=-1)\n", + " else:\n", + " v_str = np.array(v).astype(str).tolist()\n", + " tensor_dict[k] = tf.expand_dims(tf.constant(v_str, dtype=\"string\"), axis=-1)\n", + " return tensor_dict\n", + "\n", + "\n", + "def create_retrieval_dataset(\n", + " data_df,\n", + " all_ads_features,\n", + " all_ad_ids,\n", + " user_features_list,\n", + " ad_features_list,\n", + " continuous_features_list,\n", + "):\n", + "\n", + " # Filter for Positive Interactions (Cicks)\n", + " positive_interactions = data_df[data_df[\"Clicked on Ad\"] == 1].copy()\n", + "\n", + " if positive_interactions.empty:\n", + " return None\n", + "\n", + " def sample_negative(positive_ad_id):\n", + " neg_ad_id = positive_ad_id\n", + " while neg_ad_id == positive_ad_id:\n", + " neg_ad_id = np.random.choice(all_ad_ids)\n", + " return neg_ad_id\n", + "\n", + " def create_triplets_row(pos_row):\n", + " pos_ad_id = pos_row.ad_id\n", + " neg_ad_id = sample_negative(pos_ad_id)\n", + "\n", + " neg_ad_row = all_ads_features[all_ads_features[\"ad_id\"] == neg_ad_id].iloc[0]\n", + " user_features_dict = {\n", + " name: getattr(pos_row, name) for name in user_features_list\n", + " }\n", + " pos_ad_features_dict = {\n", + " name: getattr(pos_row, name) for name in ad_features_list\n", + " }\n", + " neg_ad_features_dict = {name: neg_ad_row[name] for name in ad_features_list}\n", + "\n", + " return {\n", + " \"user\": user_features_dict,\n", + " \"positive_ad\": pos_ad_features_dict,\n", + " \"negative_ad\": neg_ad_features_dict,\n", + " }\n", + "\n", + " with ThreadPoolExecutor(max_workers=8) as executor:\n", + " triplets = list(\n", + " executor.map(\n", + " create_triplets_row, positive_interactions.itertuples(index=False)\n", + " )\n", + " )\n", + "\n", + " triplets_df = pd.DataFrame(triplets)\n", + " user_df = triplets_df[\"user\"].apply(pd.Series)\n", + " pos_ad_df = triplets_df[\"positive_ad\"].apply(pd.Series)\n", + " neg_ad_df = triplets_df[\"negative_ad\"].apply(pd.Series)\n", + "\n", + " user_features_tensor = dict_to_tensor_features(\n", + " user_df.to_dict(\"list\"), continuous_features_list\n", + " )\n", + " pos_ad_features_tensor = dict_to_tensor_features(\n", + " pos_ad_df.to_dict(\"list\"), continuous_features_list\n", + " )\n", + " neg_ad_features_tensor = dict_to_tensor_features(\n", + " neg_ad_df.to_dict(\"list\"), continuous_features_list\n", + " )\n", + "\n", + " features = {\n", + " \"user\": user_features_tensor,\n", + " \"positive_ad\": pos_ad_features_tensor,\n", + " \"negative_ad\": neg_ad_features_tensor,\n", + " }\n", + " y_true = tf.ones((triplets_df.shape[0], 1), dtype=tf.float32)\n", + " dataset = tf.data.Dataset.from_tensor_slices((features, y_true))\n", + " buffer_size = len(triplets_df)\n", + " dataset = (\n", + " dataset.shuffle(buffer_size=buffer_size)\n", + " .batch(64)\n", + " .cache()\n", + " .prefetch(tf.data.AUTOTUNE)\n", + " )\n", + " return dataset\n", + "\n", + "\n", + "user_clicked_ads = (\n", + " x_train[x_train[\"Clicked on Ad\"] == 1]\n", + " .groupby(\"user_id\")[\"ad_id\"]\n", + " .apply(set)\n", + " .to_dict()\n", + ")\n", + "\n", + "for u in x_train[\"user_id\"].unique():\n", + " if u not in user_clicked_ads:\n", + " user_clicked_ads[u] = set()\n", + "\n", + "AD_FEATURES = [\"ad_id\", \"ad_topic\"]\n", + "USER_FEATURES = [\n", + " \"user_id\",\n", + " \"gender\",\n", + " \"city\",\n", + " \"country\",\n", + " \"time_on_site\",\n", + " \"internet_usage\",\n", + " \"area_income\",\n", + " \"Age\",\n", + "]\n", + "continuous_features = [\"time_on_site\", \"internet_usage\", \"area_income\", \"Age\"]\n", + "\n", + "all_ads_features = x_train[AD_FEATURES].drop_duplicates().reset_index(drop=True)\n", + "all_ad_ids = all_ads_features[\"ad_id\"].tolist()\n", + "\n", + "retrieval_train_dataset = create_retrieval_dataset(\n", + " data_df=x_train,\n", + " all_ads_features=all_ads_features,\n", + " all_ad_ids=all_ad_ids,\n", + " user_features_list=USER_FEATURES,\n", + " ad_features_list=AD_FEATURES,\n", + " continuous_features_list=continuous_features,\n", + ")\n", + "\n", + "retrieval_test_dataset = create_retrieval_dataset(\n", + " data_df=x_test,\n", + " all_ads_features=all_ads_features,\n", + " all_ad_ids=all_ad_ids,\n", + " user_features_list=USER_FEATURES,\n", + " ad_features_list=AD_FEATURES,\n", + " continuous_features_list=continuous_features,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# **Implement the Retrival Model**\n", + "For the Retrieval stage, we will build a Two-Tower Model.\n", + "\n", + "**The Architecture Components:**\n", + "\n", + "1. User Tower:User features (User ID, demographics, behavior metrics like time_on_site).\n", + "It encodes these mixed features into a fixed-size vector representation called the User\n", + "Embedding.\n", + "2. Item (Ad) Tower:Ad features (Ad ID, Ad Topic Line).It encodes these features into a\n", + "fixed-size vector representation called the Item Embedding.\n", + "3. Interaction (Similarity):We calculate the Dot Product between the User Embedding and\n", + "the Item Embedding." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "keras.utils.set_random_seed(42)\n", + "\n", + "vocab_map = {\n", + " \"user_id\": x_train[\"user_id\"].unique(),\n", + " \"gender\": x_train[\"gender\"].astype(str).unique(),\n", + " \"city\": x_train[\"city\"].unique(),\n", + " \"country\": x_train[\"country\"].unique(),\n", + " \"ad_id\": x_train[\"ad_id\"].unique(),\n", + " \"ad_topic\": x_train[\"ad_topic\"].unique(),\n", + "}\n", + "cont_feats = [\"time_on_site\", \"internet_usage\", \"area_income\", \"Age\"]\n", + "\n", + "normalizers = {}\n", + "for f in cont_feats:\n", + " norm = layers.Normalization(axis=None)\n", + " norm.adapt(x_train[f].values.astype(\"float32\"))\n", + " normalizers[f] = norm\n", + "\n", + "\n", + "def build_tower(feature_names, continuous_names=None, embed_dim=64, name=\"tower\"):\n", + " inputs, embeddings = {}, []\n", + "\n", + " for feat in feature_names:\n", + " if feat in vocab_map:\n", + " inp = keras.Input(shape=(1,), dtype=tf.string, name=feat)\n", + " inputs[feat] = inp\n", + " vocab = list(vocab_map[feat])\n", + " x = layers.StringLookup(vocabulary=vocab)(inp)\n", + " x = layers.Embedding(\n", + " len(vocab) + 1, embed_dim, embeddings_regularizer=\"l2\"\n", + " )(x)\n", + " embeddings.append(layers.Flatten()(x))\n", + "\n", + " if continuous_names:\n", + " for feat in continuous_names:\n", + " inp = keras.Input(shape=(1,), dtype=tf.float32, name=feat)\n", + " inputs[feat] = inp\n", + " embeddings.append(normalizers[feat](inp))\n", + "\n", + " x = layers.Concatenate()(embeddings)\n", + " x = layers.Dense(128, activation=\"relu\")(x)\n", + " x = layers.Dropout(0.2)(x)\n", + " x = layers.Dense(64, activation=\"relu\")(x)\n", + " output = layers.Dense(embed_dim)(layers.Dropout(0.2)(x))\n", + "\n", + " return keras.Model(inputs=inputs, outputs=output, name=name)\n", + "\n", + "\n", + "user_tower = build_tower(\n", + " [\"user_id\", \"gender\", \"city\", \"country\"], cont_feats, name=\"user_tower\"\n", + ")\n", + "ad_tower = build_tower([\"ad_id\", \"ad_topic\"], name=\"ad_tower\")\n", + "\n", + "\n", + "def bpr_hinge_loss(y_true, y_pred):\n", + " margin = 1.0\n", + " return -tf.math.log(tf.nn.sigmoid(y_pred) + 1e-10)\n", + "\n", + "\n", + "class RetrievalModel(keras.Model):\n", + " def __init__(self, user_tower_instance, ad_tower_instance, **kwargs):\n", + " super().__init__(**kwargs)\n", + " self.user_tower = user_tower\n", + " self.ad_tower = ad_tower\n", + " self.ln_user = layers.LayerNormalization()\n", + " self.ln_ad = layers.LayerNormalization()\n", + "\n", + " def call(self, inputs):\n", + " u_emb = self.ln_user(self.user_tower(inputs[\"user\"]))\n", + " pos_emb = self.ln_ad(self.ad_tower(inputs[\"positive_ad\"]))\n", + " neg_emb = self.ln_ad(self.ad_tower(inputs[\"negative_ad\"]))\n", + " pos_score = keras.ops.sum(u_emb * pos_emb, axis=1, keepdims=True)\n", + " neg_score = keras.ops.sum(u_emb * neg_emb, axis=1, keepdims=True)\n", + " return pos_score - neg_score\n", + "\n", + " def get_embeddings(self, inputs):\n", + " u_emb = self.ln_user(self.user_tower(inputs[\"user\"]))\n", + " ad_emb = self.ln_ad(self.ad_tower(inputs[\"positive_ad\"]))\n", + " dot_interaction = keras.ops.sum(u_emb * ad_emb, axis=1, keepdims=True)\n", + " return u_emb, ad_emb, dot_interaction\n", + "\n", + "\n", + "retrieval_model = RetrievalModel(user_tower, ad_tower)\n", + "retrieval_model.compile(\n", + " optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=bpr_hinge_loss\n", + ")\n", + "history = retrieval_model.fit(retrieval_train_dataset, epochs=30)\n", + "\n", + "pd.DataFrame(history.history).plot(\n", + " subplots=True, layout=(1, 3), figsize=(12, 4), title=\"Retrival Model Metrics\"\n", + ")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# **Predictions of Retrival Model**\n", + "Two-Tower model is trained, we need to use it to generate candidates.\n", + "\n", + "We can implement inference pipeline using three steps:\n", + "1. Indexing: We can run the Item Tower once for all available ads to generate their\n", + "embeddings.\n", + "2. Query Encoding: When a user arrives, we pass their features through the User Tower to\n", + "generate a User Embedding.\n", + "3. Nearest Neighbor Search: We search the index to find the Ad Embeddings closest to the\n", + "User Embedding (highest dot product).\n", + "\n", + "Keras-RS [BruteForceRetrieval\n", + "layer](https://keras.io/keras_rs/api/retrieval_layers/brute_force_retrieval/) calculates\n", + "dot product between the user and every single item in the index to find exact top-K\n", + "matches" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "USER_CATEGORICAL = [\"user_id\", \"gender\", \"city\", \"country\"]\n", + "CONTINUOUS_FEATURES = [\"time_on_site\", \"internet_usage\", \"area_income\", \"Age\"]\n", + "USER_FEATURES = USER_CATEGORICAL + CONTINUOUS_FEATURES\n", + "\n", + "\n", + "class BruteForceRetrievalWrapper:\n", + " def __init__(self, model, ads_df, ad_features, user_features, k=10):\n", + " self.model, self.k = model, k\n", + " self.user_features = user_features\n", + " unique_ads = ads_df[ad_features].drop_duplicates(\"ad_id\").reset_index(drop=True)\n", + " self.ids = unique_ads[\"ad_id\"].values\n", + " self.topic_map = dict(zip(unique_ads[\"ad_id\"], unique_ads[\"ad_topic\"]))\n", + " ad_inputs = {\n", + " \"ad_id\": tf.constant(self.ids.astype(str)),\n", + " \"ad_topic\": tf.constant(unique_ads[\"ad_topic\"].astype(str).values),\n", + " }\n", + " self.candidate_embs = model.ln_ad(model.ad_tower(ad_inputs))\n", + "\n", + " def query_batch(self, user_df):\n", + " inputs = {\n", + " k: tf.constant(\n", + " user_df[k].values.astype(float if k in CONTINUOUS_FEATURES else str)\n", + " )\n", + " for k in self.user_features\n", + " if k in user_df.columns\n", + " }\n", + " u_emb = self.model.ln_user(self.model.user_tower(inputs))\n", + " scores = tf.linalg.matmul(u_emb, self.candidate_embs, transpose_b=True)\n", + " top_scores, top_indices = tf.math.top_k(scores, k=self.k)\n", + " return top_scores.numpy(), top_indices.numpy()\n", + "\n", + " def decode_results(self, scores, indices):\n", + " results = []\n", + " for row_scores, row_indices in zip(scores, indices):\n", + " retrieved_ids = self.ids[row_indices]\n", + " results.append(\n", + " [\n", + " {\"ad_id\": aid, \"ad_topic\": self.topic_map[aid], \"score\": float(s)}\n", + " for aid, s in zip(retrieved_ids, row_scores)\n", + " ]\n", + " )\n", + " return results\n", + "\n", + "\n", + "retrieval_engine = BruteForceRetrievalWrapper(\n", + " model=retrieval_model,\n", + " ads_df=ads_df,\n", + " ad_features=[\"ad_id\", \"ad_topic\"],\n", + " user_features=USER_FEATURES,\n", + " k=10,\n", + ")\n", + "sample_user = pd.DataFrame([x_test.iloc[0]])\n", + "scores, indices = retrieval_engine.query_batch(sample_user)\n", + "top_ads = retrieval_engine.decode_results(scores, indices)[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# **Implementation of Ranking Model**\n", + "Retrieval model only calculates a simple similarity score (Dot Product). It doesn't\n", + "account for complex feature interactions.\n", + "So we need to build ranking model after words retrival model.\n", + "\n", + "**Architecture**\n", + "1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the\n", + "Retrieval stage. We freeze these towers (trainable = False) so their weights don't\n", + "change.\n", + "2. **Interaction:** Instead of just a dot product, we concatenate three inputs- The User\n", + "EmbeddingThe Ad EmbeddingThe Dot Product (Similarity)\n", + "3. **Scorer(MLP):** These concatenated inputs are fed into a Multi-Layer Perceptron\u2014a\n", + "stack of Dense layers. This network learns the non-linear relationships between the user\n", + "and the ad.\n", + "4. **Output:** The final layer uses a Sigmoid activation to output a single probability\n", + "between 0.0 and 1.0 (Likelihood of a Click)." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "retrieval_model.trainable = False\n", + "\n", + "\n", + "def create_ranking_ds(df):\n", + " inputs = {\n", + " \"user\": dict_to_tensor_features(df[USER_FEATURES], continuous_features),\n", + " \"positive_ad\": dict_to_tensor_features(df[AD_FEATURES], continuous_features),\n", + " }\n", + " return (\n", + " tf.data.Dataset.from_tensor_slices(\n", + " (inputs, df[\"Clicked on Ad\"].values.astype(\"float32\"))\n", + " )\n", + " .shuffle(10000)\n", + " .batch(256)\n", + " .prefetch(tf.data.AUTOTUNE)\n", + " )\n", + "\n", + "\n", + "ranking_train_dataset = create_ranking_ds(x_train)\n", + "ranking_test_dataset = create_ranking_ds(x_test)\n", + "\n", + "\n", + "class RankingModel(keras.Model):\n", + " def __init__(self, retrieval_model, **kwargs):\n", + " super().__init__(**kwargs)\n", + " self.retrieval = retrieval_model\n", + " self.mlp = keras.Sequential(\n", + " [\n", + " layers.Dense(256, activation=\"relu\"),\n", + " layers.Dropout(0.2),\n", + " layers.Dense(128, activation=\"relu\"),\n", + " layers.Dropout(0.2),\n", + " layers.Dense(64, activation=\"relu\"),\n", + " layers.Dense(1, activation=\"sigmoid\"),\n", + " ]\n", + " )\n", + "\n", + " def call(self, inputs):\n", + " u_emb, ad_emb, dot = self.retrieval.get_embeddings(inputs)\n", + " return self.mlp(keras.ops.concatenate([u_emb, ad_emb, dot], axis=-1))\n", + "\n", + "\n", + "ranking_model = RankingModel(retrieval_model)\n", + "ranking_model.compile(\n", + " optimizer=keras.optimizers.Adam(1e-4),\n", + " loss=\"binary_crossentropy\",\n", + " metrics=[\"AUC\", \"accuracy\"],\n", + ")\n", + "history1 = ranking_model.fit(ranking_train_dataset, epochs=20)\n", + "\n", + "pd.DataFrame(history1.history).plot(\n", + " subplots=True, layout=(1, 3), figsize=(12, 4), title=\"Ranking Model Metrics\"\n", + ")\n", + "plt.show()\n", + "\n", + "ranking_model.evaluate(ranking_test_dataset)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text" + }, + "source": [ + "# **Predictions of Ranking Model**\n", + "The retrieval model gave us a list of ads that are generally relevant (high dot product\n", + "similarity). The ranking model will now calculate the specific probability (0% to 100%)\n", + "that the user will click each of those ads.\n", + "\n", + "The Ranking model expects pairs of (User, Ad). Since we are scoring 10 ads for 1 user, we\n", + "cannot just pass the user features once.We effectively take user's features 10 times to\n", + "create a batch." + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab_type": "code" + }, + "outputs": [], + "source": [ + "\n", + "def rerank_ads_for_user(user_row, retrieved_ads, ranking_model):\n", + " ads_df = pd.DataFrame(retrieved_ads)\n", + " num_ads = len(ads_df)\n", + " user_inputs = {\n", + " k: tf.fill(\n", + " (num_ads, 1),\n", + " str(user_row[k]) if k not in continuous_features else float(user_row[k]),\n", + " )\n", + " for k in USER_FEATURES\n", + " }\n", + " ad_inputs = {\n", + " k: tf.reshape(tf.constant(ads_df[k].astype(str).values), (-1, 1))\n", + " for k in AD_FEATURES\n", + " }\n", + " scores = (\n", + " ranking_model({\"user\": user_inputs, \"positive_ad\": ad_inputs}).numpy().flatten()\n", + " )\n", + " ads_df[\"ranking_score\"] = scores\n", + " return ads_df.sort_values(\"ranking_score\", ascending=False).to_dict(\"records\")\n", + "\n", + "\n", + "sample_user = x_test.iloc[0]\n", + "scores, indices = retrieval_engine.query_batch(pd.DataFrame([sample_user]))\n", + "top_ads = retrieval_engine.decode_results(scores, indices)[0]\n", + "final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model)\n", + "print(f\"User: {sample_user['user_id']}\")\n", + "print(f\"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}\")\n", + "for item in final_ranked_ads:\n", + " print(\n", + " f\"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} |{item['ranking_score']*100:.2f}%\"\n", + " )" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "collapsed_sections": [], + "name": "two_stage_rs_with_marketing_interaction", + "private_outputs": false, + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md b/examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md new file mode 100644 index 0000000000..87c31267c8 --- /dev/null +++ b/examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md @@ -0,0 +1,836 @@ +# Two Stage Recommender System with Marketing Interaction + +**Author:** Mansi Mehta
+**Date created:** 26/11/2025
+**Last modified:** 26/11/2025
+**Description:** Recommender System with Ranking and Retrival model for Marketing interaction. + + + [**View in Colab**](https://colab.research.google.com/github/keras-team/keras-io/blob/master/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb) [**GitHub source**](https://github.com/keras-team/keras-io/blob/master/examples/keras_rs/two_stage_rs_with_marketing_interaction.py) + + + +# **Introduction** + +This tutorial demonstrates a critical business scenario: a user lands on a website, and a +marketing engine must decide which specific ad to display from an inventory of thousands. +The goal is to maximize the Click-Through Rate (CTR). Showing irrelevant ads wastes +marketing budget and annoys the user. Therefore, we need a system that predicts the +probability of a specific user clicking on a specific ad based on their demographics and +browsing habits. + +**Architecture** +1. **The Retrieval Stage:** Efficiently select an initial set of roughly 10-100 +candidates from millions of possibilities. It weeds out items the user is definitely not +interested in. +User Tower: Embeds user features (ID, demographics, behavior) into a vector. +Item Tower: Embeds ad features (Ad ID, Topic) into a vector. +Interaction: The dot product of these two vectors represents similarity. +2. **The Ranking Stage:** It takes the output of the retrieval model and fine-tune the +order to select the single best ad to show. +A Deep Neural Network (MLP). +Interaction: It takes the User Embedding, Ad Embedding, and their similarity score to +predict a precise probability (0% to 100%) that the user will click. + +![jpg](/img/examples/keras_rs/two_stage_rs_with_marketing_interaction/architecture.jpg) + +# **Dataset** +We will use the [Ad Click +Prediction](https://www.kaggle.com/datasets/mafrojaakter/ad-click-data) Dataset from +Kaggle + +**Feature Distribution of dataset:** +User Tower describes who is looking and features contains i.e Gender, City, Country, Age, +Daily Internet Usage, Daily Time Spent on Site, and Area Income. +Item Tower describes what is being shown and features contains Ad Topic Line, Ad ID. + +In this tutorial, we are going to build and train a Two-Tower (User Tower and Ad Tower) +model using the Ad Click Prediction dataset from Kaggle. +We're going to: +1. **Data Pipeline:** Get our data and preprocess it for both Retrieval (implicit +feedback) and Ranking (explicit labels). +2. **Retrieval:** Implement and train a Two-Tower model to generate candidates. +3. **Ranking:** Implement and train a Neural Ranking model to predict click probabilities. +4. **Inference:** Run an end-to-end test (Retrieval --> Ranking) to generate +recommendations for a specific user. + + +```python +!!pip install -q keras-rs +``` + + + +```python +import os + +os.environ["KERAS_BACKEND"] = "tensorflow" +import keras +import matplotlib.pyplot as plt +import numpy as np +import tensorflow as tf +import pandas as pd +import keras_rs +import tensorflow_datasets as tfds +from mpl_toolkits.axes_grid1 import make_axes_locatable +from keras import layers +from concurrent.futures import ThreadPoolExecutor +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import MinMaxScaler + +``` +

+ +# **Preparing Dataset** + + +```python +!pip install -q kaggle +!# Download the dataset (requires Kaggle API key in ~/.kaggle/kaggle.json) +!kaggle datasets download -d mafrojaakter/ad-click-data --unzip -p ./ad_click_dataset +``` + + +
+``` +[notice] To update, run: pip install --upgrade pip + +Dataset URL: https://www.kaggle.com/datasets/mafrojaakter/ad-click-data +License(s): unknown + +Downloading ad-click-data.zip to ./ad_click_dataset +``` +
+ + 0%| | 0.00/37.6k [00:00 +``` +Epoch 1/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - loss: 2.8117 + +Epoch 2/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 1.3631 + +Epoch 3/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 1.0918 + +Epoch 4/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.9143 + +Epoch 5/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.7872 + +Epoch 6/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.6925 + +Epoch 7/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.6203 + +Epoch 8/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.5641 + +Epoch 9/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.5190 + +Epoch 10/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.4817 + +Epoch 11/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.4499 + +Epoch 12/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.4220 + +Epoch 13/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 8ms/step - loss: 0.3970 + +Epoch 14/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3743 + +Epoch 15/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.3537 + +Epoch 16/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.3346 + +Epoch 17/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.3171 + +Epoch 18/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.3009 + +Epoch 19/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2858 + +Epoch 20/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2718 + +Epoch 21/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2587 + +Epoch 22/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2465 + +Epoch 23/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2350 + +Epoch 24/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2243 + +Epoch 25/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2142 + +Epoch 26/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2046 + +Epoch 27/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1956 + +Epoch 28/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1871 + +Epoch 29/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1791 + +Epoch 30/30 + +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1715 +``` + + +![png](/img/examples/keras_rs/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_9_90.png) + + + +# **Predictions of Retrival Model** +Two-Tower model is trained, we need to use it to generate candidates. + +We can implement inference pipeline using three steps: +1. Indexing: We can run the Item Tower once for all available ads to generate their +embeddings. +2. Query Encoding: When a user arrives, we pass their features through the User Tower to +generate a User Embedding. +3. Nearest Neighbor Search: We search the index to find the Ad Embeddings closest to the +User Embedding (highest dot product). + +Keras-RS [BruteForceRetrieval +layer](https://keras.io/keras_rs/api/retrieval_layers/brute_force_retrieval/) calculates +dot product between the user and every single item in the index to find exact top-K +matches + + +```python +USER_CATEGORICAL = ["user_id", "gender", "city", "country"] +CONTINUOUS_FEATURES = ["time_on_site", "internet_usage", "area_income", "Age"] +USER_FEATURES = USER_CATEGORICAL + CONTINUOUS_FEATURES + + +class BruteForceRetrievalWrapper: + def __init__(self, model, ads_df, ad_features, user_features, k=10): + self.model, self.k = model, k + self.user_features = user_features + unique_ads = ads_df[ad_features].drop_duplicates("ad_id").reset_index(drop=True) + self.ids = unique_ads["ad_id"].values + self.topic_map = dict(zip(unique_ads["ad_id"], unique_ads["ad_topic"])) + ad_inputs = { + "ad_id": tf.constant(self.ids.astype(str)), + "ad_topic": tf.constant(unique_ads["ad_topic"].astype(str).values), + } + self.candidate_embs = model.ln_ad(model.ad_tower(ad_inputs)) + + def query_batch(self, user_df): + inputs = { + k: tf.constant( + user_df[k].values.astype(float if k in CONTINUOUS_FEATURES else str) + ) + for k in self.user_features + if k in user_df.columns + } + u_emb = self.model.ln_user(self.model.user_tower(inputs)) + scores = tf.linalg.matmul(u_emb, self.candidate_embs, transpose_b=True) + top_scores, top_indices = tf.math.top_k(scores, k=self.k) + return top_scores.numpy(), top_indices.numpy() + + def decode_results(self, scores, indices): + results = [] + for row_scores, row_indices in zip(scores, indices): + retrieved_ids = self.ids[row_indices] + results.append( + [ + {"ad_id": aid, "ad_topic": self.topic_map[aid], "score": float(s)} + for aid, s in zip(retrieved_ids, row_scores) + ] + ) + return results + + +retrieval_engine = BruteForceRetrievalWrapper( + model=retrieval_model, + ads_df=ads_df, + ad_features=["ad_id", "ad_topic"], + user_features=USER_FEATURES, + k=10, +) +sample_user = pd.DataFrame([x_test.iloc[0]]) +scores, indices = retrieval_engine.query_batch(sample_user) +top_ads = retrieval_engine.decode_results(scores, indices)[0] +``` + +# **Implementation of Ranking Model** +Retrieval model only calculates a simple similarity score (Dot Product). It doesn't +account for complex feature interactions. +So we need to build ranking model after words retrival model. + +**Architecture** +1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the +Retrieval stage. We freeze these towers (trainable = False) so their weights don't +change. +2. **Interaction:** Instead of just a dot product, we concatenate three inputs- The User +EmbeddingThe Ad EmbeddingThe Dot Product (Similarity) +3. **Scorer(MLP):** These concatenated inputs are fed into a Multi-Layer Perceptron—a +stack of Dense layers. This network learns the non-linear relationships between the user +and the ad. +4. **Output:** The final layer uses a Sigmoid activation to output a single probability +between 0.0 and 1.0 (Likelihood of a Click). + + +```python +retrieval_model.trainable = False + + +def create_ranking_ds(df): + inputs = { + "user": dict_to_tensor_features(df[USER_FEATURES], continuous_features), + "positive_ad": dict_to_tensor_features(df[AD_FEATURES], continuous_features), + } + return ( + tf.data.Dataset.from_tensor_slices( + (inputs, df["Clicked on Ad"].values.astype("float32")) + ) + .shuffle(10000) + .batch(256) + .prefetch(tf.data.AUTOTUNE) + ) + + +ranking_train_dataset = create_ranking_ds(x_train) +ranking_test_dataset = create_ranking_ds(x_test) + + +class RankingModel(keras.Model): + def __init__(self, retrieval_model, **kwargs): + super().__init__(**kwargs) + self.retrieval = retrieval_model + self.mlp = keras.Sequential( + [ + layers.Dense(256, activation="relu"), + layers.Dropout(0.2), + layers.Dense(128, activation="relu"), + layers.Dropout(0.2), + layers.Dense(64, activation="relu"), + layers.Dense(1, activation="sigmoid"), + ] + ) + + def call(self, inputs): + u_emb, ad_emb, dot = self.retrieval.get_embeddings(inputs) + return self.mlp(keras.ops.concatenate([u_emb, ad_emb, dot], axis=-1)) + + +ranking_model = RankingModel(retrieval_model) +ranking_model.compile( + optimizer=keras.optimizers.Adam(1e-4), + loss="binary_crossentropy", + metrics=["AUC", "accuracy"], +) +history1 = ranking_model.fit(ranking_train_dataset, epochs=20) + +pd.DataFrame(history1.history).plot( + subplots=True, layout=(1, 3), figsize=(12, 4), title="Ranking Model Metrics" +) +plt.show() + +ranking_model.evaluate(ranking_test_dataset) +``` + +
+``` +Epoch 1/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 1s 5ms/step - AUC: 0.6079 - accuracy: 0.4961 - loss: 0.6890 + +Epoch 2/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.8329 - accuracy: 0.5748 - loss: 0.6423 + +Epoch 3/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - AUC: 0.9284 - accuracy: 0.7467 - loss: 0.5995 + +Epoch 4/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9636 - accuracy: 0.8766 - loss: 0.5599 + +Epoch 5/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9763 - accuracy: 0.9213 - loss: 0.5229 + +Epoch 6/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9824 - accuracy: 0.9304 - loss: 0.4876 + +Epoch 7/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9862 - accuracy: 0.9331 - loss: 0.4540 + +Epoch 8/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9880 - accuracy: 0.9357 - loss: 0.4224 + +Epoch 9/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9898 - accuracy: 0.9436 - loss: 0.3920 + +Epoch 10/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9911 - accuracy: 0.9475 - loss: 0.3633 + +Epoch 11/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9914 - accuracy: 0.9528 - loss: 0.3361 + +Epoch 12/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9923 - accuracy: 0.9580 - loss: 0.3103 + +Epoch 13/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9925 - accuracy: 0.9619 - loss: 0.2866 + +Epoch 14/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9931 - accuracy: 0.9633 - loss: 0.2643 + +Epoch 15/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9935 - accuracy: 0.9633 - loss: 0.2436 + +Epoch 16/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9938 - accuracy: 0.9659 - loss: 0.2247 + +Epoch 17/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9942 - accuracy: 0.9646 - loss: 0.2076 + +Epoch 18/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9945 - accuracy: 0.9659 - loss: 0.1918 + +Epoch 19/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9947 - accuracy: 0.9672 - loss: 0.1777 + +Epoch 20/20 + +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9953 - accuracy: 0.9685 - loss: 0.1645 +``` +
+ +![png](/img/examples/keras_rs/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_13_60.png) + + + + +
+``` +1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 230ms/step - AUC: 0.9904 - accuracy: 0.9476 - loss: 0.2319 + +[0.2318607121706009, 0.9903508424758911, 0.9476439952850342] +``` +
+ +# **Predictions of Ranking Model** +The retrieval model gave us a list of ads that are generally relevant (high dot product +similarity). The ranking model will now calculate the specific probability (0% to 100%) +that the user will click each of those ads. + +The Ranking model expects pairs of (User, Ad). Since we are scoring 10 ads for 1 user, we +cannot just pass the user features once.We effectively take user's features 10 times to +create a batch. + + +```python + +def rerank_ads_for_user(user_row, retrieved_ads, ranking_model): + ads_df = pd.DataFrame(retrieved_ads) + num_ads = len(ads_df) + user_inputs = { + k: tf.fill( + (num_ads, 1), + str(user_row[k]) if k not in continuous_features else float(user_row[k]), + ) + for k in USER_FEATURES + } + ad_inputs = { + k: tf.reshape(tf.constant(ads_df[k].astype(str).values), (-1, 1)) + for k in AD_FEATURES + } + scores = ( + ranking_model({"user": user_inputs, "positive_ad": ad_inputs}).numpy().flatten() + ) + ads_df["ranking_score"] = scores + return ads_df.sort_values("ranking_score", ascending=False).to_dict("records") + + +sample_user = x_test.iloc[0] +scores, indices = retrieval_engine.query_batch(pd.DataFrame([sample_user])) +top_ads = retrieval_engine.decode_results(scores, indices)[0] +final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model) +print(f"User: {sample_user['user_id']}") +print(f"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}") +for item in final_ranked_ads: + print( + f"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} |{item['ranking_score']*100:.2f}%" + ) +``` + +
+``` +User: user_216 +Ad ID | Topic | Retrival Score | Rank Probability +ad_305 | Front-line fault-tolerant in | 8.2131 |99.27% +ad_318 | Front-line upward-trending g | 7.6231 |99.17% +ad_758 | Right-sized multi-tasking so | 7.1814 |99.06% +ad_767 | Robust object-oriented Graph | 7.2068 |99.02% +ad_620 | Polarized modular function | 7.2857 |98.92% +ad_522 | Open-architected full-range | 7.0892 |98.82% +ad_771 | Robust web-enabled attitude | 7.3828 |98.81% +ad_810 | Sharable optimal capacity | 6.7046 |98.69% +ad_31 | Ameliorated well-modulated c | 6.9498 |98.40% +ad_104 | Configurable 24/7 hub | 6.7244 |98.39% +``` +
diff --git a/examples/keras_rs/two_stage_rs_with_marketing_interaction.py b/examples/keras_rs/two_stage_rs_with_marketing_interaction.py new file mode 100644 index 0000000000..b2c1e572ca --- /dev/null +++ b/examples/keras_rs/two_stage_rs_with_marketing_interaction.py @@ -0,0 +1,556 @@ +""" +Title: Two Stage Recommender System with Marketing Interaction +Author: Mansi Mehta +Date created: 26/11/2025 +Last modified: 26/11/2025 +Description: Recommender System with Ranking and Retrival model for Marketing interaction. +Accelerator: GPU +""" + +""" +# **Introduction** + +This tutorial demonstrates a critical business scenario: a user lands on a website, and a +marketing engine must decide which specific ad to display from an inventory of thousands. +The goal is to maximize the Click-Through Rate (CTR). Showing irrelevant ads wastes +marketing budget and annoys the user. Therefore, we need a system that predicts the +probability of a specific user clicking on a specific ad based on their demographics and +browsing habits. + +**Architecture** +1. **The Retrieval Stage:** Efficiently select an initial set of roughly 10-100 +candidates from millions of possibilities. It weeds out items the user is definitely not +interested in. +User Tower: Embeds user features (ID, demographics, behavior) into a vector. +Item Tower: Embeds ad features (Ad ID, Topic) into a vector. +Interaction: The dot product of these two vectors represents similarity. +2. **The Ranking Stage:** It takes the output of the retrieval model and fine-tune the +order to select the single best ad to show. +A Deep Neural Network (MLP). +Interaction: It takes the User Embedding, Ad Embedding, and their similarity score to +predict a precise probability (0% to 100%) that the user will click. + +![jpg](/img/examples/keras_rs/two_stage_rs_with_marketing_interaction/architecture.jpg) +""" + +""" +# **Dataset** +We will use the [Ad Click +Prediction](https://www.kaggle.com/datasets/mafrojaakter/ad-click-data) Dataset from +Kaggle + +**Feature Distribution of dataset:** +User Tower describes who is looking and features contains i.e Gender, City, Country, Age, +Daily Internet Usage, Daily Time Spent on Site, and Area Income. +Item Tower describes what is being shown and features contains Ad Topic Line, Ad ID. + +In this tutorial, we are going to build and train a Two-Tower (User Tower and Ad Tower) +model using the Ad Click Prediction dataset from Kaggle. +We're going to: +1. **Data Pipeline:** Get our data and preprocess it for both Retrieval (implicit +feedback) and Ranking (explicit labels). +2. **Retrieval:** Implement and train a Two-Tower model to generate candidates. +3. **Ranking:** Implement and train a Neural Ranking model to predict click probabilities. +4. **Inference:** Run an end-to-end test (Retrieval --> Ranking) to generate +recommendations for a specific user. +""" + +"""shell +!pip install -q keras-rs +""" + +import os + +os.environ["KERAS_BACKEND"] = "tensorflow" +import keras +import matplotlib.pyplot as plt +import numpy as np +import tensorflow as tf +import pandas as pd +import keras_rs +import tensorflow_datasets as tfds +from mpl_toolkits.axes_grid1 import make_axes_locatable +from keras import layers +from concurrent.futures import ThreadPoolExecutor +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import MinMaxScaler + + +""" +# **Preparing Dataset** +""" + +"""shell +pip install -q kaggle +# Download the dataset (requires Kaggle API key in ~/.kaggle/kaggle.json) +kaggle datasets download -d mafrojaakter/ad-click-data --unzip -p ./ad_click_dataset +""" +data_path = "./ad_click_dataset/Ad_click_data.csv" +if not os.path.exists(data_path): + # Fallback for filenames with spaces or different casing + data_path = "./ad_click_dataset/Ad Click Data.csv" + +ads_df = pd.read_csv(data_path) +# Clean column names +ads_df.columns = ads_df.columns.str.strip() +# Rename the column name +ads_df = ads_df.rename( + columns={ + "Male": "gender", + "Ad Topic Line": "ad_topic", + "City": "city", + "Country": "country", + "Daily Time Spent on Site": "time_on_site", + "Daily Internet Usage": "internet_usage", + "Area Income": "area_income", + } +) +# Add user_id and add_id column +ads_df["user_id"] = "user_" + ads_df.index.astype(str) +ads_df["ad_id"] = "ad_" + ads_df["ad_topic"].astype("category").cat.codes.astype(str) +# Remove nulls and normalize +ads_df = ads_df.dropna() +# normalize +numeric_cols = ["time_on_site", "internet_usage", "area_income", "Age"] +scaler = MinMaxScaler() +ads_df[numeric_cols] = scaler.fit_transform(ads_df[numeric_cols]) + +# Split the train and test datasets +x_train, x_test = train_test_split(ads_df, test_size=0.2, random_state=42) + + +def dict_to_tensor_features(df_features, continuous_features): + tensor_dict = {} + for k, v in df_features.items(): + if k in continuous_features: + tensor_dict[k] = tf.expand_dims(tf.constant(v, dtype="float32"), axis=-1) + else: + v_str = np.array(v).astype(str).tolist() + tensor_dict[k] = tf.expand_dims(tf.constant(v_str, dtype="string"), axis=-1) + return tensor_dict + + +def create_retrieval_dataset( + data_df, + all_ads_features, + all_ad_ids, + user_features_list, + ad_features_list, + continuous_features_list, +): + + # Filter for Positive Interactions (Cicks) + positive_interactions = data_df[data_df["Clicked on Ad"] == 1].copy() + + if positive_interactions.empty: + return None + + def sample_negative(positive_ad_id): + neg_ad_id = positive_ad_id + while neg_ad_id == positive_ad_id: + neg_ad_id = np.random.choice(all_ad_ids) + return neg_ad_id + + def create_triplets_row(pos_row): + pos_ad_id = pos_row.ad_id + neg_ad_id = sample_negative(pos_ad_id) + + neg_ad_row = all_ads_features[all_ads_features["ad_id"] == neg_ad_id].iloc[0] + user_features_dict = { + name: getattr(pos_row, name) for name in user_features_list + } + pos_ad_features_dict = { + name: getattr(pos_row, name) for name in ad_features_list + } + neg_ad_features_dict = {name: neg_ad_row[name] for name in ad_features_list} + + return { + "user": user_features_dict, + "positive_ad": pos_ad_features_dict, + "negative_ad": neg_ad_features_dict, + } + + with ThreadPoolExecutor(max_workers=8) as executor: + triplets = list( + executor.map( + create_triplets_row, positive_interactions.itertuples(index=False) + ) + ) + + triplets_df = pd.DataFrame(triplets) + user_df = triplets_df["user"].apply(pd.Series) + pos_ad_df = triplets_df["positive_ad"].apply(pd.Series) + neg_ad_df = triplets_df["negative_ad"].apply(pd.Series) + + user_features_tensor = dict_to_tensor_features( + user_df.to_dict("list"), continuous_features_list + ) + pos_ad_features_tensor = dict_to_tensor_features( + pos_ad_df.to_dict("list"), continuous_features_list + ) + neg_ad_features_tensor = dict_to_tensor_features( + neg_ad_df.to_dict("list"), continuous_features_list + ) + + features = { + "user": user_features_tensor, + "positive_ad": pos_ad_features_tensor, + "negative_ad": neg_ad_features_tensor, + } + y_true = tf.ones((triplets_df.shape[0], 1), dtype=tf.float32) + dataset = tf.data.Dataset.from_tensor_slices((features, y_true)) + buffer_size = len(triplets_df) + dataset = ( + dataset.shuffle(buffer_size=buffer_size) + .batch(64) + .cache() + .prefetch(tf.data.AUTOTUNE) + ) + return dataset + + +user_clicked_ads = ( + x_train[x_train["Clicked on Ad"] == 1] + .groupby("user_id")["ad_id"] + .apply(set) + .to_dict() +) + +for u in x_train["user_id"].unique(): + if u not in user_clicked_ads: + user_clicked_ads[u] = set() + +AD_FEATURES = ["ad_id", "ad_topic"] +USER_FEATURES = [ + "user_id", + "gender", + "city", + "country", + "time_on_site", + "internet_usage", + "area_income", + "Age", +] +continuous_features = ["time_on_site", "internet_usage", "area_income", "Age"] + +all_ads_features = x_train[AD_FEATURES].drop_duplicates().reset_index(drop=True) +all_ad_ids = all_ads_features["ad_id"].tolist() + +retrieval_train_dataset = create_retrieval_dataset( + data_df=x_train, + all_ads_features=all_ads_features, + all_ad_ids=all_ad_ids, + user_features_list=USER_FEATURES, + ad_features_list=AD_FEATURES, + continuous_features_list=continuous_features, +) + +retrieval_test_dataset = create_retrieval_dataset( + data_df=x_test, + all_ads_features=all_ads_features, + all_ad_ids=all_ad_ids, + user_features_list=USER_FEATURES, + ad_features_list=AD_FEATURES, + continuous_features_list=continuous_features, +) + +""" +# **Implement the Retrival Model** +For the Retrieval stage, we will build a Two-Tower Model. + +**The Architecture Components:** + +1. User Tower:User features (User ID, demographics, behavior metrics like time_on_site). +It encodes these mixed features into a fixed-size vector representation called the User +Embedding. +2. Item (Ad) Tower:Ad features (Ad ID, Ad Topic Line).It encodes these features into a +fixed-size vector representation called the Item Embedding. +3. Interaction (Similarity):We calculate the Dot Product between the User Embedding and +the Item Embedding. +""" + +keras.utils.set_random_seed(42) + +vocab_map = { + "user_id": x_train["user_id"].unique(), + "gender": x_train["gender"].astype(str).unique(), + "city": x_train["city"].unique(), + "country": x_train["country"].unique(), + "ad_id": x_train["ad_id"].unique(), + "ad_topic": x_train["ad_topic"].unique(), +} +cont_feats = ["time_on_site", "internet_usage", "area_income", "Age"] + +normalizers = {} +for f in cont_feats: + norm = layers.Normalization(axis=None) + norm.adapt(x_train[f].values.astype("float32")) + normalizers[f] = norm + + +def build_tower(feature_names, continuous_names=None, embed_dim=64, name="tower"): + inputs, embeddings = {}, [] + + for feat in feature_names: + if feat in vocab_map: + inp = keras.Input(shape=(1,), dtype=tf.string, name=feat) + inputs[feat] = inp + vocab = list(vocab_map[feat]) + x = layers.StringLookup(vocabulary=vocab)(inp) + x = layers.Embedding( + len(vocab) + 1, embed_dim, embeddings_regularizer="l2" + )(x) + embeddings.append(layers.Flatten()(x)) + + if continuous_names: + for feat in continuous_names: + inp = keras.Input(shape=(1,), dtype=tf.float32, name=feat) + inputs[feat] = inp + embeddings.append(normalizers[feat](inp)) + + x = layers.Concatenate()(embeddings) + x = layers.Dense(128, activation="relu")(x) + x = layers.Dropout(0.2)(x) + x = layers.Dense(64, activation="relu")(x) + output = layers.Dense(embed_dim)(layers.Dropout(0.2)(x)) + + return keras.Model(inputs=inputs, outputs=output, name=name) + + +user_tower = build_tower( + ["user_id", "gender", "city", "country"], cont_feats, name="user_tower" +) +ad_tower = build_tower(["ad_id", "ad_topic"], name="ad_tower") + + +def bpr_hinge_loss(y_true, y_pred): + margin = 1.0 + return -tf.math.log(tf.nn.sigmoid(y_pred) + 1e-10) + + +class RetrievalModel(keras.Model): + def __init__(self, user_tower_instance, ad_tower_instance, **kwargs): + super().__init__(**kwargs) + self.user_tower = user_tower + self.ad_tower = ad_tower + self.ln_user = layers.LayerNormalization() + self.ln_ad = layers.LayerNormalization() + + def call(self, inputs): + u_emb = self.ln_user(self.user_tower(inputs["user"])) + pos_emb = self.ln_ad(self.ad_tower(inputs["positive_ad"])) + neg_emb = self.ln_ad(self.ad_tower(inputs["negative_ad"])) + pos_score = keras.ops.sum(u_emb * pos_emb, axis=1, keepdims=True) + neg_score = keras.ops.sum(u_emb * neg_emb, axis=1, keepdims=True) + return pos_score - neg_score + + def get_embeddings(self, inputs): + u_emb = self.ln_user(self.user_tower(inputs["user"])) + ad_emb = self.ln_ad(self.ad_tower(inputs["positive_ad"])) + dot_interaction = keras.ops.sum(u_emb * ad_emb, axis=1, keepdims=True) + return u_emb, ad_emb, dot_interaction + + +retrieval_model = RetrievalModel(user_tower, ad_tower) +retrieval_model.compile( + optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=bpr_hinge_loss +) +history = retrieval_model.fit(retrieval_train_dataset, epochs=30) + +pd.DataFrame(history.history).plot( + subplots=True, layout=(1, 3), figsize=(12, 4), title="Retrival Model Metrics" +) +plt.show() + +""" +# **Predictions of Retrival Model** +Two-Tower model is trained, we need to use it to generate candidates. + +We can implement inference pipeline using three steps: +1. Indexing: We can run the Item Tower once for all available ads to generate their +embeddings. +2. Query Encoding: When a user arrives, we pass their features through the User Tower to +generate a User Embedding. +3. Nearest Neighbor Search: We search the index to find the Ad Embeddings closest to the +User Embedding (highest dot product). + +Keras-RS [BruteForceRetrieval +layer](https://keras.io/keras_rs/api/retrieval_layers/brute_force_retrieval/) calculates +dot product between the user and every single item in the index to find exact top-K +matches +""" + +USER_CATEGORICAL = ["user_id", "gender", "city", "country"] +CONTINUOUS_FEATURES = ["time_on_site", "internet_usage", "area_income", "Age"] +USER_FEATURES = USER_CATEGORICAL + CONTINUOUS_FEATURES + + +class BruteForceRetrievalWrapper: + def __init__(self, model, ads_df, ad_features, user_features, k=10): + self.model, self.k = model, k + self.user_features = user_features + unique_ads = ads_df[ad_features].drop_duplicates("ad_id").reset_index(drop=True) + self.ids = unique_ads["ad_id"].values + self.topic_map = dict(zip(unique_ads["ad_id"], unique_ads["ad_topic"])) + ad_inputs = { + "ad_id": tf.constant(self.ids.astype(str)), + "ad_topic": tf.constant(unique_ads["ad_topic"].astype(str).values), + } + self.candidate_embs = model.ln_ad(model.ad_tower(ad_inputs)) + + def query_batch(self, user_df): + inputs = { + k: tf.constant( + user_df[k].values.astype(float if k in CONTINUOUS_FEATURES else str) + ) + for k in self.user_features + if k in user_df.columns + } + u_emb = self.model.ln_user(self.model.user_tower(inputs)) + scores = tf.linalg.matmul(u_emb, self.candidate_embs, transpose_b=True) + top_scores, top_indices = tf.math.top_k(scores, k=self.k) + return top_scores.numpy(), top_indices.numpy() + + def decode_results(self, scores, indices): + results = [] + for row_scores, row_indices in zip(scores, indices): + retrieved_ids = self.ids[row_indices] + results.append( + [ + {"ad_id": aid, "ad_topic": self.topic_map[aid], "score": float(s)} + for aid, s in zip(retrieved_ids, row_scores) + ] + ) + return results + + +retrieval_engine = BruteForceRetrievalWrapper( + model=retrieval_model, + ads_df=ads_df, + ad_features=["ad_id", "ad_topic"], + user_features=USER_FEATURES, + k=10, +) +sample_user = pd.DataFrame([x_test.iloc[0]]) +scores, indices = retrieval_engine.query_batch(sample_user) +top_ads = retrieval_engine.decode_results(scores, indices)[0] + +""" +# **Implementation of Ranking Model** +Retrieval model only calculates a simple similarity score (Dot Product). It doesn't +account for complex feature interactions. +So we need to build ranking model after words retrival model. + +**Architecture** +1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the +Retrieval stage. We freeze these towers (trainable = False) so their weights don't +change. +2. **Interaction:** Instead of just a dot product, we concatenate three inputs- The User +EmbeddingThe Ad EmbeddingThe Dot Product (Similarity) +3. **Scorer(MLP):** These concatenated inputs are fed into a Multi-Layer Perceptron—a +stack of Dense layers. This network learns the non-linear relationships between the user +and the ad. +4. **Output:** The final layer uses a Sigmoid activation to output a single probability +between 0.0 and 1.0 (Likelihood of a Click). +""" + +retrieval_model.trainable = False + + +def create_ranking_ds(df): + inputs = { + "user": dict_to_tensor_features(df[USER_FEATURES], continuous_features), + "positive_ad": dict_to_tensor_features(df[AD_FEATURES], continuous_features), + } + return ( + tf.data.Dataset.from_tensor_slices( + (inputs, df["Clicked on Ad"].values.astype("float32")) + ) + .shuffle(10000) + .batch(256) + .prefetch(tf.data.AUTOTUNE) + ) + + +ranking_train_dataset = create_ranking_ds(x_train) +ranking_test_dataset = create_ranking_ds(x_test) + + +class RankingModel(keras.Model): + def __init__(self, retrieval_model, **kwargs): + super().__init__(**kwargs) + self.retrieval = retrieval_model + self.mlp = keras.Sequential( + [ + layers.Dense(256, activation="relu"), + layers.Dropout(0.2), + layers.Dense(128, activation="relu"), + layers.Dropout(0.2), + layers.Dense(64, activation="relu"), + layers.Dense(1, activation="sigmoid"), + ] + ) + + def call(self, inputs): + u_emb, ad_emb, dot = self.retrieval.get_embeddings(inputs) + return self.mlp(keras.ops.concatenate([u_emb, ad_emb, dot], axis=-1)) + + +ranking_model = RankingModel(retrieval_model) +ranking_model.compile( + optimizer=keras.optimizers.Adam(1e-4), + loss="binary_crossentropy", + metrics=["AUC", "accuracy"], +) +history1 = ranking_model.fit(ranking_train_dataset, epochs=20) + +pd.DataFrame(history1.history).plot( + subplots=True, layout=(1, 3), figsize=(12, 4), title="Ranking Model Metrics" +) +plt.show() + +ranking_model.evaluate(ranking_test_dataset) + +""" +# **Predictions of Ranking Model** +The retrieval model gave us a list of ads that are generally relevant (high dot product +similarity). The ranking model will now calculate the specific probability (0% to 100%) +that the user will click each of those ads. + +The Ranking model expects pairs of (User, Ad). Since we are scoring 10 ads for 1 user, we +cannot just pass the user features once.We effectively take user's features 10 times to +create a batch. +""" + + +def rerank_ads_for_user(user_row, retrieved_ads, ranking_model): + ads_df = pd.DataFrame(retrieved_ads) + num_ads = len(ads_df) + user_inputs = { + k: tf.fill( + (num_ads, 1), + str(user_row[k]) if k not in continuous_features else float(user_row[k]), + ) + for k in USER_FEATURES + } + ad_inputs = { + k: tf.reshape(tf.constant(ads_df[k].astype(str).values), (-1, 1)) + for k in AD_FEATURES + } + scores = ( + ranking_model({"user": user_inputs, "positive_ad": ad_inputs}).numpy().flatten() + ) + ads_df["ranking_score"] = scores + return ads_df.sort_values("ranking_score", ascending=False).to_dict("records") + + +sample_user = x_test.iloc[0] +scores, indices = retrieval_engine.query_batch(pd.DataFrame([sample_user])) +top_ads = retrieval_engine.decode_results(scores, indices)[0] +final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model) +print(f"User: {sample_user['user_id']}") +print(f"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}") +for item in final_ranked_ads: + print( + f"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} |{item['ranking_score']*100:.2f}%" + ) diff --git a/two_stage_rs_with_marketing_interaction.ipynb b/two_stage_rs_with_marketing_interaction.ipynb new file mode 100644 index 0000000000..cb1843b016 --- /dev/null +++ b/two_stage_rs_with_marketing_interaction.ipynb @@ -0,0 +1,1126 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# **Introduction**\n", + "\n", + "This tutorial demonstrates a critical business scenario: a user lands on a website, and a marketing engine must decide which specific ad to display from an inventory of thousands.\n", + "The goal is to maximize the Click-Through Rate (CTR). Showing irrelevant ads wastes marketing budget and annoys the user. Therefore, we need a system that predicts the probability of a specific user clicking on a specific ad based on their demographics and browsing habits.\n", + "\n", + "**Architecture**\n", + "1. **The Retrieval Stage:** Efficiently select an initial set of roughly 10-100 candidates from millions of possibilities. It weeds out items the user is definitely not interested in.\n", + "User Tower: Embeds user features (ID, demographics, behavior) into a vector.\n", + "Item Tower: Embeds ad features (Ad ID, Topic) into a vector.\n", + "Interaction: The dot product of these two vectors represents similarity.\n", + "2. **The Ranking Stage:** It takes the output of the retrieval model and fine-tune the order to select the single best ad to show.\n", + "A Deep Neural Network (MLP).\n", + "Interaction: It takes the User Embedding, Ad Embedding, and their similarity score to predict a precise probability (0% to 100%) that the user will click.\n", + "\n", + "![marketing_usecase.jpg](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QBoRXhpZgAASUkqAAgAAAACADEBAgAHAAAAJgAAAGmHBAABAAAALgAAAAAAAABQaWNhc2EAAAIAAJAHAAQAAAAwMjIwA5ACABQAAABMAAAAAAAAADIwMjU6MTE6MjQgMTU6MDE6NTYA/+EDH2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIgZXhpZjpEYXRlVGltZU9yaWdpbmFsPSIyMDI1LTExLTI0VDE1OjAxOjU2KzAwOjAwIiBwaG90b3Nob3A6Q3JlZGl0PSJNYWRlIHdpdGggR29vZ2xlIEFJIiBwaG90b3Nob3A6RGF0ZUNyZWF0ZWQ9IjIwMjUtMTEtMjRUMTU6MDE6NTYrMDA6MDAiIElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VmaWxlVHlwZT0iaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS90cmFpbmVkQWxnb3JpdGhtaWNNZWRpYSIgSXB0YzR4bXBFeHQ6RGlnaXRhbFNvdXJjZVR5cGU9Imh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWEiLz4gPC9yZGY6UkRGPiA8L3g6eG1w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)" + ], + "metadata": { + "id": "y5jO6Y78Vf-N" + } + }, + { + "cell_type": "markdown", + "source": [ + "# **Dataset**\n", + "We will use the [Ad Click Prediction](https://www.kaggle.com/datasets/mafrojaakter/ad-click-data) Dataset from Kaggle\n", + "\n", + "**Feature Distribution of dataset:**\n", + "User Tower describes who is looking and features contains i.e Gender, City, Country, Age, Daily Internet Usage, Daily Time Spent on Site, and Area Income.\n", + "Item Tower describes what is being shown and features contains Ad Topic Line, Ad ID.\n", + "\n", + "In this tutorial, we are going to build and train a Two-Tower (User Tower and Ad Tower) model using the Ad Click Prediction dataset from Kaggle.\n", + "We're going to:\n", + "1. **Data Pipeline:** Get our data and preprocess it for both Retrieval (implicit feedback) and Ranking (explicit labels).\n", + "2. **Retrieval:** Implement and train a Two-Tower model to generate candidates.\n", + "3. **Ranking:** Implement and train a Neural Ranking model to predict click probabilities.\n", + "4. **Inference:** Run an end-to-end test (Retrieval --> Ranking) to generate recommendations for a specific user." + ], + "metadata": { + "id": "xcJBUXmeaavN" + } + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "AL5vdFd8QOZl", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "8b519c48-1e1a-4e58-9325-6108cfb7b4da" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/92.5 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.5/92.5 kB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h" + ] + } + ], + "source": [ + "!pip install -q keras-rs" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "2cdPdsiFQOZm" + }, + "outputs": [], + "source": [ + "import os\n", + "os.environ[\"KERAS_BACKEND\"] = \"tensorflow\"\n", + "import keras\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import tensorflow as tf\n", + "import pandas as pd\n", + "import keras_rs\n", + "import tensorflow_datasets as tfds\n", + "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", + "from keras import layers\n", + "from concurrent.futures import ThreadPoolExecutor\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# **Preparing Dataset**" + ], + "metadata": { + "id": "fdhb5tuL9UBe" + } + }, + { + "cell_type": "code", + "source": [ + "from google.colab import files\n", + "files.upload()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 91 + }, + "id": "RJN16Th-9W8E", + "outputId": "bfa060e0-25fe-41a4-cddd-b46aea023352" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + " \n", + " \n", + " Upload widget is only available when the cell has been executed in the\n", + " current browser session. Please rerun this cell to enable.\n", + " \n", + " " + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Saving kaggle (1).json to kaggle (1).json\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'kaggle (1).json': b'{\"username\":\"mansim071\",\"key\":\"7b9249c264ac5cb7d295afcdd44f7ad1\"}'}" + ] + }, + "metadata": {}, + "execution_count": 3 + } + ] + }, + { + "cell_type": "code", + "source": [ + "!mkdir -p ~/.kaggle\n", + "!mv kaggle.json ~/.kaggle/\n", + "!chmod 600 ~/.kaggle/kaggle.json" + ], + "metadata": { + "id": "G4JgdNRp9tI3" + }, + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!kaggle datasets download -d mafrojaakter/ad-click-data\n", + "!unzip -o ad-click-data.zip -d ./ad_click_data" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "NOhaq3bl-bmp", + "outputId": "bcd54c95-28dc-42b5-8f82-39f8763db18a" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Dataset URL: https://www.kaggle.com/datasets/mafrojaakter/ad-click-data\n", + "License(s): unknown\n", + "Downloading ad-click-data.zip to /content\n", + " 0% 0.00/37.6k [00:00" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAGHCAYAAAB7xLxyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPERJREFUeJzt3Xl8VPW9//H3ZJtsk4RA9gQIiywii0EQUEShUgQKVhGhLajAdYlaBGvL7UWtyy/1WitVcUGvcKtFEBH1oojIKgVURFRAEJAlQHbITPaEzPn9ETISSYBMZjLJzOv5eJxHMmfOmfOZEx7Ht9/v93yPyTAMQwAAAGg0P08XAAAA0FoRpAAAAJxEkAIAAHASQQoAAMBJBCkAAAAnEaQAAACcRJACAABwEkEKAADASQQpAAAAJxGkAACtXseOHXXbbbe57fM3bNggk8mkDRs2uO0YTWUymfToo482er/Dhw/LZDJp0aJFLq+pOXj6b0OQAgA4ZdGiRTKZTI4lICBASUlJuu2223T8+HGnPnPPnj169NFHdfjwYdcW20zOPiebN28+533DMJSSkiKTyaQxY8Z4oELn1QYWk8mkN998s95thgwZIpPJpF69ejl1jMWLF2vevHlNqLL5BXi6AABA6/bYY48pNTVV5eXl2rZtmxYtWqTNmzdr165dCg4ObtRn7dmzR3/5y180bNgwdezY8aL327dvn/z8Wk7bQHBwsBYvXqyrrrqqzvqNGzfq2LFjMpvNHqqs6Wq/229/+9s66w8fPqwtW7Y0+m9+tsWLF2vXrl2aOXPmRe8zdOhQlZWVKSgoyOnjNkXL+VcHAGiVRo0apd/+9reaPn26XnvtNT344IM6ePCgPvjgA7ce1zAMlZWVSZLMZrMCAwPderzGuOGGG7Rs2TKdPn26zvrFixcrLS1N8fHxHqqs6W644QatWbNG+fn5ddYvXrxYcXFx6t+/f7PUUV5eLrvdLj8/PwUHB3ssSBOkAAAudfXVV0uSDh48WGf93r17dfPNNys6OlrBwcHq379/nbC1aNEiTZgwQZJ07bXXOrqRase+dOzYUWPGjNHq1avVv39/hYSE6JVXXnG8VztGavv27TKZTPrf//3fc2pbvXq1TCaTVq5cKUk6cuSI7rnnHnXr1k0hISFq27atJkyY0OSuxUmTJqmgoEBr1qxxrKusrNQ777yjyZMn17tPSUmJZs+erZSUFJnNZnXr1k1/+9vfZBhGne0qKir0wAMPKCYmRhaLRb/61a907Nixej/z+PHjuuOOOxQXFyez2axLL71Ur7/+epO+27hx42Q2m7Vs2bI66xcvXqxbbrlF/v7+9e735ptvKi0tTSEhIYqOjtatt96qzMxMx/vDhg3Thx9+qCNHjjj+9rWtkrXdikuWLNF//dd/KSkpSaGhobLZbA2Okfr88891ww03qE2bNgoLC1Pv3r31j3/8w/F+dna2br/9diUnJ8tsNishIUHjxo1r9N+erj0AgEvV/oeoTZs2jnW7d+/WkCFDlJSUpD/96U8KCwvT22+/rfHjx2v58uW68cYbNXToUN1///167rnn9J//+Z/q0aOHJDl+SjVdeJMmTdKdd96pGTNmqFu3buccv3///urUqZPefvttTZ06tc57S5cuVZs2bTRy5EhJ0pdffqktW7bo1ltvVXJysg4fPqyXXnpJw4YN0549exQaGurUOejYsaMGDRqkt956S6NGjZIkrVq1SlarVbfeequee+65OtsbhqFf/epXWr9+vaZNm6a+fftq9erV+sMf/qDjx4/r2WefdWw7ffp0vfnmm5o8ebIGDx6sdevWafTo0efUkJOToyuvvFImk0n33nuvYmJitGrVKk2bNk02m61R3WdnCw0N1bhx4/TWW2/p7rvvliR988032r17t1577TV9++235+zz5JNPau7cubrllls0ffp05eXl6fnnn9fQoUP19ddfKyoqSn/+859ltVp17Ngxx/cNDw+v8zmPP/64goKC9OCDD6qioqLB7rw1a9ZozJgxSkhI0O9//3vFx8fr+++/18qVK/X73/9eknTTTTdp9+7duu+++9SxY0fl5uZqzZo1Onr0aKO6lWUAAOCEhQsXGpKMTz/91MjLyzMyMzONd955x4iJiTHMZrORmZnp2Hb48OHGZZddZpSXlzvW2e12Y/DgwUbXrl0d65YtW2ZIMtavX3/O8Tp06GBIMj7++ON635s6darj9Zw5c4zAwEDj5MmTjnUVFRVGVFSUcccddzjWlZaWnvNZW7duNSQZ//znPx3r1q9f32Bd9Z2TL7/80njhhRcMi8XiOMaECROMa6+91lHv6NGjHfu99957hiTjiSeeqPN5N998s2EymYwDBw4YhmEYO3fuNCQZ99xzT53tJk+ebEgyHnnkEce6adOmGQkJCUZ+fn6dbW+99VYjMjLSUdehQ4cMScbChQvP+91qz8GyZcuMlStXGiaTyTh69KhhGIbxhz/8wejUqZNhGIZxzTXXGJdeeqljv8OHDxv+/v7Gk08+WefzvvvuOyMgIKDO+tGjRxsdOnRo8NidOnU652/287/N6dOnjdTUVKNDhw7GqVOn6mxrt9sNwzCMU6dOGZKMp59++rzf+WLQtQcAaJIRI0YoJiZGKSkpuvnmmxUWFqYPPvhAycnJkqSTJ09q3bp1uuWWW1RUVKT8/Hzl5+eroKBAI0eO1P79+y/6Lr/U1FRHa9L5TJw4UVVVVXr33Xcd6z755BMVFhZq4sSJjnUhISGO36uqqlRQUKAuXbooKipKO3bsuNhTUK9bbrlFZWVlWrlypYqKirRy5coGu/U++ugj+fv76/7776+zfvbs2TIMQ6tWrXJsJ+mc7X7eumQYhpYvX66xY8fKMAzHOc/Pz9fIkSNltVqb9P2uv/56RUdHa8mSJTIMQ0uWLNGkSZPq3fbdd9+V3W7XLbfcUqeO+Ph4de3aVevXr7/o406dOrXO36w+X3/9tQ4dOqSZM2cqKiqqznsmk0lSzd89KChIGzZs0KlTpy76+PWhaw8A0CTz58/XJZdcIqvVqtdff12bNm2qc1fagQMHZBiG5s6dq7lz59b7Gbm5uUpKSrrgsVJTUy+qpj59+qh79+5aunSppk2bJqmmW69du3a67rrrHNuVlZUpIyNDCxcu1PHjx+uMR7JarRd1rIbExMRoxIgRWrx4sUpLS1VdXa2bb7653m2PHDmixMREWSyWOutruzWPHDni+Onn56fOnTvX2e7nXZx5eXkqLCzUggULtGDBgnqPmZub69T3kqTAwEBNmDBBixcv1oABA5SZmdlgSNy/f78Mw1DXrl0b/KyLdTF//9qxeeebgsFsNuupp57S7NmzFRcXpyuvvFJjxozRlClTGn0jAEEKANAkAwYMcNypNX78eF111VWaPHmy9u3bp/DwcNntdknSgw8+2GBrUpcuXS7qWBdqjTjbxIkT9eSTTyo/P18Wi0UffPCBJk2apICAn/7Td99992nhwoWaOXOmBg0apMjISJlMJt16662Oupti8uTJmjFjhrKzszVq1KhzWkjcpbb23/72t+eME6vVu3fvJh1j8uTJevnll/Xoo4+qT58+6tmzZ4O1mEwmrVq1qt6B6D8fB3U+jfn7X8jMmTM1duxYvffee1q9erXmzp2rjIwMrVu3Tv369bvozyFIAQBcxt/fXxkZGbr22mv1wgsv6E9/+pM6deokqablYcSIEefdv7brxRUmTpyov/zlL1q+fLni4uJks9l066231tnmnXfe0dSpU/XMM8841pWXl6uwsNAlNdx444268847tW3bNi1durTB7Tp06KBPP/1URUVFdVql9u7d63i/9qfdbtfBgwfrtELt27evzufV3tFXXV19wXPurKuuukrt27fXhg0b9NRTTzW4XefOnWUYhlJTU3XJJZec9zNd8fevba3btWvXBb97586dNXv2bM2ePVv79+9X37599cwzzzQ44Wh9GCMFAHCpYcOGacCAAZo3b57Ky8sVGxurYcOG6ZVXXlFWVtY52+fl5Tl+DwsLkySXBJkePXrosssu09KlS7V06VIlJCRo6NChdbbx9/c/Z3qB559/XtXV1U0+vlTT2vLSSy/p0Ucf1dixYxvc7oYbblB1dbVeeOGFOuufffZZmUwmx51/tT9/ftffz2cD9/f310033aTly5dr165d5xzv7HPuLJPJpOeee06PPPKIfve73zW43a9//Wv5+/vrL3/5yznn2jAMFRQUOF6HhYU1uUv18ssvV2pqqubNm3fOv6Pa45eWlqq8vLzOe507d5bFYlFFRUWjjkeLFADA5f7whz9owoQJWrRoke666y7Nnz9fV111lS677DLNmDFDnTp1Uk5OjrZu3apjx47pm2++kST17dtX/v7+euqpp2S1WmU2m3XdddcpNjbWqTomTpyohx9+WMHBwZo2bdo5kzaOGTNGb7zxhiIjI9WzZ09t3bpVn376qdq2bdvkc1Croa61s40dO1bXXnut/vznP+vw4cPq06ePPvnkE73//vuaOXOmo5Wlb9++mjRpkl588UVZrVYNHjxYa9eu1YEDB875zL/+9a9av369Bg4cqBkzZqhnz546efKkduzYoU8//VQnT55s8ncbN26cxo0bd95tOnfurCeeeEJz5szR4cOHNX78eFksFh06dEgrVqzQf/zHf+jBBx+UJKWlpWnp0qWaNWuWrrjiCoWHh583gNbHz89PL730ksaOHau+ffvq9ttvV0JCgvbu3avdu3dr9erV+uGHHzR8+HDdcsst6tmzpwIC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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# **Predictions of Retrival Model**\n", + "Two-Tower model is trained, we need to use it to generate candidates.\n", + "\n", + "We can implement inference pipeline using three steps:\n", + "1. Indexing: We can run the Item Tower once for all available ads to generate their embeddings.\n", + "2. Query Encoding: When a user arrives, we pass their features through the User Tower to generate a User Embedding.\n", + "3. Nearest Neighbor Search: We search the index to find the Ad Embeddings closest to the User Embedding (highest dot product).\n", + "\n", + "Keras-RS [BruteForceRetrieval layer](https://keras.io/keras_rs/api/retrieval_layers/brute_force_retrieval/) calculates dot product between the user and every single item in the index to find exact top-K matches" + ], + "metadata": { + "id": "_o0ILppGcknp" + } + }, + { + "cell_type": "code", + "source": [ + "USER_CATEGORICAL = [\"user_id\", \"gender\", \"city\", \"country\"]\n", + "CONTINUOUS_FEATURES = [\"time_on_site\", \"internet_usage\", \"area_income\", \"Age\"]\n", + "USER_FEATURES = USER_CATEGORICAL + CONTINUOUS_FEATURES\n", + "\n", + "class BruteForceRetrievalWrapper:\n", + " def __init__(self, model, ads_df, ad_features, user_features, k=10):\n", + " self.model, self.k = model, k\n", + " self.user_features = user_features\n", + " unique_ads = ads_df[ad_features].drop_duplicates(\"ad_id\").reset_index(drop=True)\n", + " self.ids = unique_ads[\"ad_id\"].values\n", + " self.topic_map = dict(zip(unique_ads[\"ad_id\"], unique_ads[\"ad_topic\"]))\n", + " ad_inputs = {\"ad_id\": tf.constant(self.ids.astype(str)),\n", + " \"ad_topic\": tf.constant(unique_ads[\"ad_topic\"].astype(str).values)\n", + " }\n", + " self.candidate_embs = model.ln_ad(model.ad_tower(ad_inputs))\n", + "\n", + " def query_batch(self, user_df):\n", + " inputs = {k: tf.constant(user_df[k].values.astype(float if k in CONTINUOUS_FEATURES else str))\n", + " for k in self.user_features if k in user_df.columns\n", + " }\n", + " u_emb = self.model.ln_user(self.model.user_tower(inputs))\n", + " scores = tf.linalg.matmul(u_emb, self.candidate_embs, transpose_b=True)\n", + " top_scores, top_indices = tf.math.top_k(scores, k=self.k)\n", + " return top_scores.numpy(), top_indices.numpy()\n", + "\n", + " def decode_results(self, scores, indices):\n", + " results = []\n", + " for row_scores, row_indices in zip(scores, indices):\n", + " retrieved_ids = self.ids[row_indices]\n", + " results.append([\n", + " {\"ad_id\": aid, \"ad_topic\": self.topic_map[aid], \"score\": float(s)}\n", + " for aid, s in zip(retrieved_ids, row_scores)\n", + " ])\n", + " return results\n", + "\n", + "retrieval_engine = BruteForceRetrievalWrapper(model=retrieval_model,ads_df=ads_df,ad_features=[\"ad_id\", \"ad_topic\"],\n", + " user_features=USER_FEATURES, k=10)\n", + "sample_user = pd.DataFrame([x_test.iloc[0]])\n", + "scores, indices = retrieval_engine.query_batch(sample_user)\n", + "top_ads = retrieval_engine.decode_results(scores, indices)[0]" + ], + "metadata": { + "id": "QrHPBLIml8Si" + }, + "execution_count": 51, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "# **Implementation of Ranking Model**\n", + "Retrieval model only calculates a simple similarity score (Dot Product). It doesn't account for complex feature interactions.\n", + "So we need to build ranking model after words retrival model.\n", + "\n", + "**Architecture**\n", + "1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the Retrieval stage. We freeze these towers (trainable = False) so their weights don't change.\n", + "2. **Interaction:** Instead of just a dot product, we concatenate three inputs- The User EmbeddingThe Ad EmbeddingThe Dot Product (Similarity)\n", + "3. **Scorer(MLP):** These concatenated inputs are fed into a Multi-Layer Perceptron—a stack of Dense layers. This network learns the non-linear relationships between the user and the ad.\n", + "4. **Output:** The final layer uses a Sigmoid activation to output a single probability between 0.0 and 1.0 (Likelihood of a Click)." + ], + "metadata": { + "id": "xQtLgCfyeqYS" + } + }, + { + "cell_type": "code", + "source": [ + "retrieval_model.trainable = False\n", + "def create_ranking_ds(df):\n", + " inputs = {\"user\": dict_to_tensor_features(df[USER_FEATURES], continuous_features),\n", + " \"positive_ad\": dict_to_tensor_features(df[AD_FEATURES], continuous_features)\n", + " }\n", + " return tf.data.Dataset.from_tensor_slices((inputs, df[\"Clicked on Ad\"].values.\n", + " astype('float32'))).shuffle(10000).batch(256).prefetch(tf.data.AUTOTUNE)" + ], + "metadata": { + "id": "_j2PAllRvDOb" + }, + "execution_count": 39, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "ranking_train_dataset= create_ranking_ds(x_train)\n", + "ranking_test_dataset = create_ranking_ds(x_test)" + ], + "metadata": { + "id": "uhKCsNa8v0Uo" + }, + "execution_count": 40, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "class RankingModel(keras.Model):\n", + " def __init__(self, retrieval_model, **kwargs):\n", + " super().__init__(**kwargs)\n", + " self.retrieval = retrieval_model\n", + " self.mlp = keras.Sequential([\n", + " layers.Dense(256, activation=\"relu\"), layers.Dropout(0.2),\n", + " layers.Dense(128, activation=\"relu\"), layers.Dropout(0.2),\n", + " layers.Dense(64, activation=\"relu\"),\n", + " layers.Dense(1, activation=\"sigmoid\")\n", + " ])\n", + "\n", + " def call(self, inputs):\n", + " u_emb, ad_emb, dot = self.retrieval.get_embeddings(inputs)\n", + " return self.mlp(keras.ops.concatenate([u_emb, ad_emb, dot], axis=-1))" + ], + "metadata": { + "id": "mQCXdFFqvDRC" + }, + "execution_count": 41, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "ranking_model = RankingModel(retrieval_model)\n", + "ranking_model.compile(optimizer=keras.optimizers.Adam(1e-4), loss=\"binary_crossentropy\", metrics=[\"AUC\", \"accuracy\"])\n", + "history1 = ranking_model.fit(ranking_train_dataset, epochs=20)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "w5JPRvJ_vDUS", + "outputId": "cdc8c321-8722-48a9-f6e3-8516c9f5caa1" + }, + "execution_count": 42, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Epoch 1/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 75ms/step - AUC: 0.7137 - accuracy: 0.4999 - loss: 0.6688\n", + "Epoch 2/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step - AUC: 0.8871 - accuracy: 0.6535 - loss: 0.6237\n", + "Epoch 3/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 51ms/step - AUC: 0.9528 - accuracy: 0.8104 - loss: 0.5837\n", + "Epoch 4/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 27ms/step - AUC: 0.9704 - accuracy: 0.8531 - loss: 0.5561 \n", + "Epoch 5/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step - AUC: 0.9826 - accuracy: 0.9023 - loss: 0.5173\n", + "Epoch 6/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - AUC: 0.9875 - accuracy: 0.9188 - loss: 0.4851\n", + "Epoch 7/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 58ms/step - AUC: 0.9866 - accuracy: 0.9337 - loss: 0.4533\n", + "Epoch 8/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step - AUC: 0.9914 - accuracy: 0.9448 - loss: 0.4224 \n", + "Epoch 9/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step - AUC: 0.9903 - accuracy: 0.9441 - loss: 0.3910\n", + "Epoch 10/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 40ms/step - AUC: 0.9910 - accuracy: 0.9502 - loss: 0.3671\n", + "Epoch 11/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step - AUC: 0.9938 - accuracy: 0.9616 - loss: 0.3386\n", + "Epoch 12/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step - AUC: 0.9922 - accuracy: 0.9628 - loss: 0.3158\n", + "Epoch 13/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step - AUC: 0.9940 - accuracy: 0.9676 - loss: 0.2864\n", + "Epoch 14/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 24ms/step - AUC: 0.9948 - accuracy: 0.9657 - loss: 0.2607\n", + "Epoch 15/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - AUC: 0.9951 - accuracy: 0.9685 - loss: 0.2452\n", + "Epoch 16/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - AUC: 0.9943 - accuracy: 0.9689 - loss: 0.2243\n", + "Epoch 17/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - AUC: 0.9945 - accuracy: 0.9701 - loss: 0.2068\n", + "Epoch 18/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - AUC: 0.9942 - accuracy: 0.9682 - loss: 0.1947\n", + "Epoch 19/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - AUC: 0.9955 - accuracy: 0.9719 - loss: 0.1764\n", + "Epoch 20/20\n", + "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - AUC: 0.9943 - accuracy: 0.9725 - loss: 0.1623\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "pd.DataFrame(history1.history).plot(subplots=True, layout=(1, 3), figsize=(12, 4), title=\"Ranking Model Metrics\")\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 408 + }, + "id": "WoodoIYnFgsx", + "outputId": "ee8c8243-6c85-4831-f44a-167d1ecf7b06" + }, + "execution_count": 43, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAGHCAYAAABGc4o9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAh+xJREFUeJzs3Xt8zvX/x/HHdV3btZMdzGZzGHM+syJLiGq1kEonhwr74vtLKVm+scKkpBPpoFYiOn3TwbcTkRaViCIkEjkfNmOzsdnpuq7fH7OLZdj5s8Pzfrt9bte1z/U5PK8LH3td7/fn/TY5HA4HIiIiIiIiIlIuzEYHEBEREREREanOVHiLiIiIiIiIlCMV3iIiIiIiIiLlSIW3iIiIiIiISDlS4S0iIiIiIiJSjlR4i4iIiIiIiJQjFd4iIiIiIiIi5UiFt4iIiIiIiEg5UuEtIiIiIiIiUo5UeIuISLUzfPhwatWqdcntevfuTe/evcs/UCUydepUTCZTifYdPnw4oaGhZRuoAtXEP28REakcVHiLiEiZW7BgASaTybm4uLjQoEEDhg8fzqFDh4yOVymEhoZiMpmIiIgo9PW5c+c6P79ff/21gtOVTu/evTGZTLRo0aLQ11esWOF8b5988kmxj3/48GGmTp3Kpk2bSplURESkYrgYHUBERKqvadOm0aRJEzIzM/n5559ZsGABq1evZuvWrbi7uxsdj2+++cbQ87u7u7Ny5UoSEhIIDg4u8Nr777+Pu7s7mZmZBqUrHXd3d3bt2sX69evp2rVrgddK+94OHz7ME088QWhoKGFhYUXez+g/bxERqbnU4i0iIuWmT58+3HPPPYwcOZK33nqL8ePH8/fff/PFF18YHQ0Aq9WK1Wo17Pzdu3enVq1aLFq0qMD6gwcP8uOPP9KvXz+DkpVes2bNaNWqFf/9738LrM/MzOR///tfhb63jIwMwPg/bxERqblUeIuISIXp2bMnAH///bdzXXZ2NlOmTKFz5874+vri5eVFz549WblyZYF99+7di8lk4oUXXuDNN9+kWbNmuLm5ccUVV/DLL79c8tybNm0iMDCQ3r17c+rUKeD8e35XrVqFyWTio48+Yvr06TRs2BB3d3euu+46du3add4x58yZQ9OmTfHw8KBr1678+OOPxbqP2N3dndtuu40PPvigwPr//ve/1K5dm8jIyEL3++677+jZsydeXl74+flxyy23sH379vO2W716NVdccQXu7u40a9aMN95444JZ3nvvPTp37oyHhwf+/v4MGjSIAwcOFOl9XMjgwYNZtGgRdrvdue7LL78kIyODu+66q9B9Dh06xL/+9S+CgoJwc3OjXbt2zJ8/3/n6qlWruOKKKwCIiopydllfsGABkPdn2r59ezZs2MDVV1+Np6cnjz32mPO1f/7ZZGZmMnXqVFq2bIm7uzv16tXjtttuK/B39MMPP6Rz5854e3vj4+NDhw4deOmll0r12YiISM2iruYiIlJh9u7dC0Dt2rWd69LS0njrrbcYPHgwo0aN4uTJk8ybN4/IyEjWr19/XlfiDz74gJMnT/J///d/mEwmnnvuOW677TZ2796Nq6troef95ZdfiIyMpEuXLnz++ed4eHhcNOczzzyD2Wxm/PjxpKam8txzz3H33Xezbt065zavv/46Y8aMoWfPnowbN469e/dy6623Urt2bRo2bFjkz2TIkCHccMMN/P333zRr1sz5Hu+4445C38+3335Lnz59aNq0KVOnTuX06dO88sordO/enY0bNzoHP/v999+54YYbCAwMZOrUqeTm5hIbG0tQUNB5x5w+fTqTJ0/mrrvuYuTIkSQlJfHKK69w9dVX89tvv+Hn51fk9/PP9zZ16lRWrVrFtdde63xv1113HXXr1j1v+8TERK688kpMJhNjxowhMDCQr7/+mhEjRpCWlsbDDz9MmzZtmDZtGlOmTOHf//6388ucq666ynmc48eP06dPHwYNGsQ999xT6HsGsNls3HTTTcTHxzNo0CDGjh3LyZMnWbFiBVu3bqVZs2asWLGCwYMHc9111/Hss88CsH37dn766SfGjh1bos9FRERqIIeIiEgZe/vttx2A49tvv3UkJSU5Dhw44Pjkk08cgYGBDjc3N8eBAwec2+bm5jqysrIK7J+SkuIICgpy/Otf/3Ku27NnjwNw1KlTx5GcnOxc//nnnzsAx5dffulcN2zYMIeXl5fD4XA4Vq9e7fDx8XH069fPkZmZWeA8vXr1cvTq1cv588qVKx2Ao02bNgUyvfTSSw7A8fvvvzscDocjKyvLUadOHccVV1zhyMnJcW63YMECB1DgmBfSuHFjR79+/Ry5ubmO4OBgx5NPPulwOByObdu2OQDH999/7/wcf/nlF+d+YWFhjrp16zqOHz/uXLd582aH2Wx2DB061Lnu1ltvdbi7uzv27dvnXLdt2zaHxWJxnPvf/969ex0Wi8Uxffr0Avl+//13h4uLS4H1w4YNczRu3PiS761Xr16Odu3aORwOh6NLly6OESNGOByOvD9Xq9XqWLhwofOz/vjjj537jRgxwlGvXj3HsWPHChxv0KBBDl9fX0dGRobD4XA4fvnlFwfgePvttws9N+CIi4sr9LVz/2zmz5/vAByzZs06b1u73e5wOByOsWPHOnx8fBy5ubmXfN8iIiIXoq7mIiJSbiIiIggMDCQkJIQ77rgDLy8vvvjiiwItwhaLxXnfrd1uJzk5mdzcXLp06cLGjRvPO+bAgQMLtJjnt3ju3r37vG1XrlxJZGQk1113HYsXL8bNza1IuaOiogrcC/zPc/z6668cP36cUaNG4eJytvPY3XffXSBbUVgsFu666y7nvdDvv/8+ISEhznOe68iRI2zatInhw4fj7+/vXN+xY0euv/56li5dCuS15C5fvpxbb72VRo0aObdr06bNed3XFy9ejN1u56677uLYsWPOJTg4mBYtWpzX5b+4hgwZwuLFi8nOzuaTTz7BYrEwYMCA87ZzOBx8+umn9O/fH4fDUSBLZGQkqamphf59KIybmxtRUVGX3O7TTz8lICCABx988LzX8qdc8/PzIz09nRUrVhTp3CIiIoVR4S0iIuVmzpw5rFixgk8++YS+ffty7NixQovfhQsX0rFjR9zd3alTpw6BgYEsWbKE1NTU87Y9t5CEs93WU1JSCqzPzMykX79+XHbZZXz00UfFGlTrUufYt28fAM2bNy+wnYuLS4nmuR4yZAjbtm1j8+bNfPDBBwwaNKjQubbzz9uqVavzXmvTpg3Hjh0jPT2dpKQkTp8+Xeh0Xv/cd+fOnTgcDlq0aEFgYGCBZfv27Rw9erTY7+dcgwYNIjU1la+//pr333+fm266CW9v7/O2S0pK4sSJE7z55pvn5cgvoouapUGDBkX68/77779p1apVgS9P/un++++nZcuW9OnTh4YNG/Kvf/2LZcuWFSmHiIhIPt3jLSIi5aZr16506dIFgFtvvZUePXowZMgQduzYQa1atYC8Qb2GDx/Orbfeyn/+8x/q1q2LxWJhxowZBQa4ymexWAo9l8PhKPCzm5sbffv25fPPP2fZsmXcdNNNRc5d1HOUlfDwcJo1a8bDDz/Mnj17GDJkSLmcpzB2ux2TycTXX39d6PvO/3MqqXr16tG7d29mzpzJTz/9xKeffnrBHAD33HMPw4YNK3Sbjh07Fumcl7qHvzjq1q3Lpk2bWL58OV9//TVff/01b7/9NkOHDmXhwoVldh4REaneVHiLiEiFyC+mr7nmGl599VUmTpwIwCeffELTpk1ZvHhxgVbe2NjYUp3PZDLx/vvvc8stt3DnnXfy9ddfF3m08Utp3LgxALt27eKaa65xrs/NzWXv3r1FLhDPNXjwYJ566inatGlzwbmp88+7Y8eO8177888/CQgIwMvLC3d3dzw8PNi5c+d52/1z32bNmuFwOGjSpAktW7Ysdu6iGDJkCCNHjsTPz4++ffsWuk1gYCDe3t7YbDYiIiIuerzCegOURLNmzVi3bh05OTkXHJgP8qYh69+/P/3798dut3P//ffzxhtvMHny5PN6PYiIiBRGXc1FRKTC9O7dm65duzJ79mwyMzOBs63L57Ymr1u3jrVr15b6fFarlcWLF3PFFVfQv39/1q9fX+pjAnTp0oU6deowd+5ccnNznevff//987q8F9XIkSOJjY1l5syZF9ymXr16hIWFsXDhQk6cOOFcv3XrVr755htnUWuxWIiMjOSzzz5j//79zu22b9/O8uXLCxzztttuw2Kx8MQTT5zXou9wODh+/HiJ3s+57rjjDmJjY3nttdcu2AXcYrFw++238+mnn7J169bzXk9KSnI+9/LyAijwGZTE7bffzrFjx3j11VfPey3/s/jn+zebzc4vVrKyskp1fhERqTnU4i0iIhXqP//5D3feeScLFizgvvvu46abbmLx4sUMGDCAfv36sWfPHuLi4mjbtq1zvu3S8PDw4KuvvuLaa6+lT58+fP/997Rv375Ux7RarUydOpUHH3yQa6+9lrvuuou9e/eyYMECmjVrVqIW2caNGzN16tRLbvf888/Tp08funXrxogRI5zTifn6+hbY/4knnmDZsmX07NmT+++/n9zcXF555RXatWvHli1bnNs1a9aMp556ipiYGOeUaN7e3uzZs4f//e9//Pvf/2b8+PHFfj/n+me2C3nmmWdYuXIl4eHhjBo1irZt25KcnMzGjRv59ttvSU5Odmb28/MjLi4Ob29vvLy8CA8Pp0mTJsXKNXToUN555x2io6NZv349PXv2JD09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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "ranking_model.evaluate(ranking_test_dataset)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "RD4UirtNvDXT", + "outputId": "9964607f-eea1-4c1a-d117-2a847416cfec" + }, + "execution_count": 44, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 630ms/step - AUC: 0.9867 - accuracy: 0.9372 - loss: 0.2243\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[0.2243196964263916, 0.9866776466369629, 0.9371727705001831]" + ] + }, + "metadata": {}, + "execution_count": 44 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# **Predictions of Ranking Model**\n", + "The retrieval model gave us a list of ads that are generally relevant (high dot product similarity). The ranking model will now calculate the specific probability (0% to 100%) that the user will click each of those ads.\n", + "\n", + "The Ranking model expects pairs of (User, Ad). Since we are scoring 10 ads for 1 user, we cannot just pass the user features once.We effectively take user's features 10 times to create a batch." + ], + "metadata": { + "id": "XaLAPapNjdYm" + } + }, + { + "cell_type": "code", + "source": [ + "def rerank_ads_for_user(user_row, retrieved_ads, ranking_model):\n", + " ads_df = pd.DataFrame(retrieved_ads)\n", + " num_ads = len(ads_df)\n", + " user_inputs = { k: tf.fill((num_ads, 1), str(user_row[k]) if k not in continuous_features else float(user_row[k]))\n", + " for k in USER_FEATURES}\n", + " ad_inputs = {k: tf.reshape(tf.constant(ads_df[k].astype(str).values), (-1, 1)) for k in AD_FEATURES}\n", + " scores = ranking_model({\"user\": user_inputs, \"positive_ad\": ad_inputs}).numpy().flatten()\n", + " ads_df[\"ranking_score\"] = scores\n", + " return ads_df.sort_values(\"ranking_score\", ascending=False).to_dict(\"records\")\n", + "\n", + "sample_user = x_test.iloc[0]\n", + "scores, indices = retrieval_engine.query_batch(pd.DataFrame([sample_user]))\n", + "top_ads = retrieval_engine.decode_results(scores, indices)[0]\n", + "final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model)\n", + "print(f\"User: {sample_user['user_id']}\")\n", + "print(f\"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}\")\n", + "for item in final_ranked_ads:\n", + " print(f\"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} | {item['ranking_score']*100:.2f}%\")" + ], + "metadata": { + "id": "MvPsCaw_vDaT", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "7b16a6ac-679e-41b6-cce8-67b4f193b91a" + }, + "execution_count": 49, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "User: user_216\n", + "Ad ID | Topic | Retrival Score | Rank Probability\n", + "ad_660 | Profound optimizing utilizat | 8.1021 | 99.19%\n", + "ad_318 | Front-line upward-trending g | 6.6563 | 99.07%\n", + "ad_311 | Front-line methodical utiliz | 6.6728 | 98.77%\n", + "ad_31 | Ameliorated well-modulated c | 6.4871 | 98.65%\n", + "ad_861 | Synergized clear-thinking pr | 6.2368 | 98.57%\n", + "ad_387 | Implemented didactic support | 5.9674 | 98.47%\n", + "ad_799 | Self-enabling optimal initia | 5.8983 | 98.43%\n", + "ad_984 | Vision-oriented contextually | 5.9103 | 98.29%\n", + "ad_706 | Re-engineered demand-driven | 6.5815 | 98.22%\n", + "ad_916 | Universal multi-state system | 5.6566 | 98.17%\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "ECqj1I91JUgg" + }, + "execution_count": 45, + "outputs": [] + } + ] +} \ No newline at end of file From e403faaeb5e2304cb3893e1d40f45f38f6d7c594 Mon Sep 17 00:00:00 2001 From: mehtamansi29 Date: Sat, 6 Dec 2025 19:02:51 +0530 Subject: [PATCH 2/2] Resolve gemini suggestions --- ...ge_rs_with_marketing_interaction_13_60.png | Bin 33287 -> 31743 bytes ...age_rs_with_marketing_interaction_9_90.png | Bin 14198 -> 14400 bytes ..._stage_rs_with_marketing_interaction.ipynb | 53 +- ...two_stage_rs_with_marketing_interaction.md | 212 ++-- ...two_stage_rs_with_marketing_interaction.py | 51 +- two_stage_rs_with_marketing_interaction.ipynb | 1126 ----------------- 6 files changed, 145 insertions(+), 1297 deletions(-) delete mode 100644 two_stage_rs_with_marketing_interaction.ipynb diff --git a/examples/keras_rs/img/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_13_60.png b/examples/keras_rs/img/two_stage_rs_with_marketing_interaction/two_stage_rs_with_marketing_interaction_13_60.png index 72409279ad4f48767bfa129eef6788a325bd3237..af9143ab07da7915832d6ce882fa09a2d7cbd00c 100644 GIT binary patch literal 31743 zcmbrm1yGdX`!4*_0wO9P0umMy5=w)FL8o*hAYH=JjfJ!zy`*$Y$C4_7z|y@eph&ZX z!~#p4XZ@Z3|C~AB%s1zoj~PdXdG~$a=XvhBuKT(-OhZkcih_{>f*>kIg=d-&L^KOQ z1fds5!C&NH;gaA#F?U&gcP$rdcQ11{D@fJc{gtDOyQ7^2o2Qi<%+AGGfLDxH@IITZ zyZbAcI3J(We_z1s;%39g@^RJ{+=TpJ2nwYO>>$X`QSsShZSOP;n#^0f z^SEor%=gV(wUrh zauxUpo~RQR;exD%nP?Q)$fwd?VsSnhmi<$b2nj^kw^o~3pL^|#ZjHp?4Irrb)}Vws z<-cDq61x27PaoQu{{6ytYa730s6FCBGXegW?OXqMmjn+qZZ@rJ=c}Y>WlZGAQzMQ( zg|Y_f6A%!*J2PG%FDn`DVGWvtg5yHKlQjNV_a&RZkr=pk<3=f?ko{!4Q&%*znn=Yn zeuB~?N8kOmg!R*reAV9Llfbhhn*?_D1|f{|XyNm6>_Dcp^mv2M8KA@v>n-PMf_g8XaicMR5#XUEY1CLklF@5AStWgL$*$Msn?OVEY#u5^~ zys{1-m`Ay^=@=WQSy)=aX0YQ%E>k$9jUHo4oy+8x$GwR>TA`Pi!}nTJ+HtY+ES2

38I~S;^YT;T< z?yDABzikFG(iaXesQPuVDTD9mO$&#MAHN~BAI=S%^;u58Q4fEC%ZZWV8pkHa$7|pE z_YB#2Du_cE-Q-a%t-6hgjf?v{lp|kag76Fv3wy4u9WOZ$No-T^vuh1cJ=q&kUtdfz zs|zvF*H7*jU%$^|)_M|O;WQk_tyk_il0|d%s$2Rl;?=JwIL573TzQ7~Z}PEHgOTXI zgN>$rQJ<302PR43xKOr%3 z?W6;{2UqJ#&@;8;<9Z2x&<9gCnNu={ZRe*h)!1gQjub2( zGN)i)USxSB%58;ysdas++GVOLPq$P*dlQY|e)v$6`q8$`ctF>=bKg7YQ{8NXt0hiM zr$iTdrdD+x)t@TV8z^kmo2cXNUSn8mpZD|Az07eNB50d0H}_A z{T|Nd)cx_MxZ9r(rUCmpOzx?Iiwjy|svqt9kJ`?0(oC-;_eZsaHKrR}bDlhT;uc^+ zlMG*Wm}_m3I{HJyWSr6WNnNU_y zi}^vz{?^=Fs|d}PaaRV`d&(+l@i?&c?AQUW_<}HyhMz^!S9?JE zyqQ_jtkKO%cc*$T=o~Fo(Kz{{Us+jsB>91*qm17pSgbkl3*qa+Q{;Zw&DsGw!U?m$ zqfS!nJM&q%j}y)POs`oVgDs?SccErp5Bc)eY>SaiWXsdbALFl)c z?lo(7Ue|ZSU4Z%PiBw*^Sx>Q&>un1%8DS zVBIFDIwu(3kIQ=!xDj8!e%+{)H#AJ;784WeTA;omI$vy9TfBa}UNO+*1VX`q7`JZe z%5+;$&^RX3|8H2!Y4w0qZ z73Cp$Fll*kFjk_6T0Y!FY*k5hE%qkaNR~UH>dLuviW`7CCwZVM+RoM}E?#t}x*^KH zUUzniLx31#VpQk&vkCdgOGD#hfLaU^E`mYsP_J54{byZejuR`aeJ4r>{x4nefnik2X# z;sG53S!h*eSi5ndTro;`7f~H^fsBO23W*Tn{E5SE)#p@OyH7{Xv$(Ve6Nt(6N#4$| z{*LozH$g|b!-smPrB4R)d6z>K&HJV34-Y5!b$%cViy5*-=unbrB=Q%Xw8L7;P1Md$B=))}S1nv>}_6;6J-J|wQ?Pn@!v=)j`e>KkgQL0Ni} zm)Pq1&YG#0EPoELADMRjgxkJpJ*dzt(!7ff#9{8uEE~8XBMv^nKn@&zzRejrz9#xq=5}PfnpS52Of{%K@I=cI$ zGbOy7Tc-)2U@{m;+oqNj(J8SG-y&N*G1FtDDGn3mwPVeavMqfV${WvT{kCdhLCC_D z2G<2Q+J?XU*u@{jF;gkf95K#Xt)4tyr9H{)C?M+daHXZZMCN3l`D~5dr_;#r2nLMs z<5u!WnBQE+oR)ctg;jpml)%6v%Vk;k^QGo#^JKB9H>6ZO`!`^&?9ysNp>1q^b2&dB z@-q-G2|PqORJ7!W5Rpw&%0bW{vJep{OW*tTDoB}ne9hahCub{A$s0uEI5fN@Y?+@56M)v?c}OsyiP1t+g*4$lK01v-Q^<5l;ruga7C0b z{ZltfxjLjmgW@LYj3Ry42Eg_&dTUKNv1-?7N!h z`D~^+b4GJWvagfmHqJ)l`qI9NZ)@Xa_eTRZt|vH=u}w*O-MCMm)Ytb3ptCnuTp*ds zhpT_AiKj~u{<}yK6zwaT8}Qdg)@pT%wHe|b#i=4L8MU(qtNgdyGK0<)6VmTtPT@O-SfQM$B{6lYuW!i@0^HX|fAUr@8mRS^ zhGd-XuzwWhJjhpoGh_?VU+D9(Hrbd9#PO^@8Zi|ZmU8>kU3zz@ueJ+wSDl!A!Ml+&I^8wzK{2ce1fAu$r z$xZL6S)KWMk_USFVnr&fqy#?knDc%}o)BuY5$HnoRf}ZiG(r|tG!WEHEeBktvnTRP zYWpfE-0JK)tpl->m6lHCl@gl`-=e!yedaP6f63ky7oV1@C>nJt4uaF}j987Q1a3Ai zZ+xgCR|z`&MP^iqCVtC4hB8uNtRpW(en1%XPWwk&V;ls6#Qo;&!kjZp&7iJ9 zy?9g~{+k^$7byrIGKNL_NCWrxXg>#qQ%OVeew`}h7+#bT@nA_H zOyn{Axf^WfNA4<|l8eNO#f7Uw`f&b@aPQZ?%1lw$&!>KNAX$v3!FF+iIs5F_MJgP) z*5O5zOS^;+n>1lxs>P8wSa4c=%DDrf3Cy)4H=788t{WGVKv|djZtO2qn80hS1jLQB zWoIBL*yY7{CMfuce#5Km_f$;Q%O&s{7Xj*{F+H=|-9Wuk{pVR8-$2B1$!P#J_dAVx zXA|)B-u_+ToEbVU?Ju28Dk1!@oq?w?-v(F;{CHo%2Pg3Je~T&b*EawEMkfEC??RDC z-QC?i*q<(;Q|D+vLQE`*z5(TZ>|Gp=y)CcZ;_E>|dOR+qc&q>wyg9o9skH^|g|(yH zlWXnA+?p65|Mog3lyd{qjiEIeCgknzm_}RQuxu);zD^R11APF=mm_gkcc=UJg zUh7+_tL>{7!A#u(sFmzuR) z`ut=>H^6TtJJcQRF|jCW1Mt9s&%*EDqxq^#lIJJ8YlGQOJLaz7A3vYFt`2WlpYM31 zCX%Pkp;wLvQ0gV!FGGm7zJGtlbloiIbpLoD=nU4gE8;YrOUc))Au{J*J?p#9!=wL2 z1`n5tbxQK30*)tP)&m(%M7u>=1;v(K(W!!VaV;*G>Dpq=Jf&Z=4F8@+oRNk4ZWtRI zE7fTK__;}zf|Am3hNRy{Wte#c&-Ny&z5@NXmw049}>>o5b## zK701|)b6#*ZVH_+W@f!}Eb+dDuLhjhmN&;ZtPqdvt_Kq+8v6R>T zI4~;w<{E%{7}b2t^6v&oA5Bf0Gj)ne?OCo}vlan=%M#7YFW|bv@qN`A;;?FF@rJLt zAiTEvUEyNU(b08Bf7#_{9q~7$oX`AyX_bLDFCP&fmyxYKkZ2t}k`TAl(}bMKj9Z$W zS%%|~m~zK@n~YCK0z9{$GVo&8U%pgeSh88FR6f4}&&+`JNrn&*cnZ)HqH&v<1XBk@ zLf+x^S*PRn=m-dn3q#X zQQTKU+`8`Ry*YKokDs{|7uOUPk-8HttXj$xmpqQqhmyN4bEu$}GP^d_5eNF_eBTHA zY0g*Yy?pmpvcXnNTg>D|O%QFVrHk8v0!_>rE*;d`f(EEs2jPivtc49!y<}iuIPhK> z%${{-Ir&K5{iwsH>K>aA&Q6SI=ugewjrwJew&l7%+PnVe#LWg+oAj+q7pTjtr&F(oh*G4f8;M3}4g_MfuIgA= z(||JCHY-f)S97^-qias z7VVX3@_GaA(mI6LYIP_{^h?hBPD;g?3lImY7J;O@SnZfn&?9ydK`w~Bn{PW1YpEof zn4df9&aA4arx|{fVjVPns=YfBa58YZDm-8N*sYFjlIA)*lYRSuF8gr^1v!O=!j~h4 z!-2{vYEKty>HCu~Gv0dCDMUg>%Ed7#sf1xEJJ?u$_&VJu`d6#WJWH(b1l>kp^pGod zOHdMZp-KLLl6+H{YAQMgCj>sj!NIT5@p!4g&gCF89;{JY5&4=F)38_bjU znP+~V`Ml_r#*x)4uAZ0b{)Q30$=i0*^p2!`&bxIw_)zof=7LlvkLL9A)j?rwoz?T9 zny@Q-PZ-7nlLIGr-duAwDqM8!_0ZigP!k~!t{|NS0js)S5<7F_akV+&GJ}A%?L@iB zbd!g}_^CDL1DcoAOu{Ok?y2h{Q-$_>xGP@r+_k=VonHoEv}1LqE}Z9VYupxNEzH#??x!A0|^ZsII+o<*&>kS5V!ydp-DNp3Un;Dn?j6 z%ifuil3aZAWCQENLht_7^4mjJnj5sXp9;{c<0*C%QwP-r7KjByFSb?kXvqqv*VZ() znzTeRVX?k_%-2(8cG~lUUdyR}agsAuzgx2*-BEbT@X6`C;l&tfF?&hg+k-dxL6;&t z>!)g}zns=KQlxyjhmwtO%q%+c@eZZE?EW`cs(yg?v;Xrp%Qg+^{8nBU|3>Sw^gQz3 zd$!|k)|`Vc??4=$WS4FX0(f3DAcgDW6$giTBqh2BgMkL|kScNqlj%7$sxzZZ9Ef>v;FGWI)Qo;}MPj@q$Qf)O^6DGW4q>`~sEcOWTjPp1h%B z_&qh?3AdS>r7wL&1KCh!RKK3j>dO*0(oor^fJhX`q^r2G^8+{FxaeMEvB%nrj&{Qy z0$O6(gNcE*T$|K)z1(DQbhZMwSg&H9%h!u6F` zozLF#_gsYT>YVu6?d%R$RI8(S~x^S^_eBkU>#W&o#A+vvt^)RAzH${m#2Qx{V&L*Q*6xu*BnT} z5Mri{Zh5}gO{WNdKSFPpo7+FgRa~n&nGRMZcPR<*&{8;?rNDdVc z%K@oRgM*!>mVb3t&3?QzWq5eF#(j0TGitbZ<<;rp7Gk6O0K2|`sWM{G>3LtI9-)u$C^ZW?8i(eU zHDi=YW)l-tVh_$Stvnps_ON%OtDZ$}mIX!^;=S`zk0fo-IqOTN1=xwUijq{5Jkmu* zQS|+GK0*6Y1$s08%J&x;KI6d(mr-3Q!0p+11|JoL*lg;Jb`)`*nbdu74oEkrcIV`= z8c=Q)T;nmE3||4@(Punh_Q^aZH2Q|}*t&9^?KCx$2ftCmjyThKC8MS`)9pfbU9GkzF_S^jv z)V4G2P%*Xm{cOJ?XliW{jqs{3TFC$07@LvdJknL~GUr^9VfLzn#1|0Hm;k`Ec@q2Y zE+NA|eE4#Ew%Qu`*WQoF_?{6{X}qZa;TH=F3wJz~n|*j^CdhdEz6tu5f%1f}Grc9y*?1^zryt7A zJK{KK#>}oy;B9UwQ0^(r#Hek2k|8imD6CP*pMGIZv#$3bn4B+h!ZqQq3*T*5>>nFA^k+?l~+W;F%KT^^SLx79gEjs{w$LcD-D7B zh^MUEPbAo9@{D1WIs~&mpl6P)1Dbwml}Ucl&2&0ZIb}NVYEt|MJfz7R)~A9I*}V29 zCLQ3B!Na$C435`fc8lx7Ki-LLMU=)fX#0&1_t&|Mqb|7(z=-Be7Qgnc=8uc4rqB(n z93>2tc%{$gl`9ECTLA4;2IKbc!i6xnC~=u~Dku+?A+-4d73s{1&h)Vi9-TK{?F-TT zW~!-g5XwZ}{!Lpbv(_`w^UlWLdWqQt(#hEq|6Z2~U08QI!ZE%l5o2P6o2UVY!l3$_ z^Q6I=x5XYG@80%mPY*D`RE>dSadolQW|9e`VWcfaOr!Js+7Nmp=gH;DOeV!Wu?gwU z*MhIUZby;z9lCyEIdiN<-^1VK$9>)^%e)%5{JkzRO{LekgZ39iJ0!y?Z*t#D-VGNb zxNDjz94j!xu}`{Z-_wLVgB0q0o6cY7 z6VE^zad~%?5a;opr(77ryG};zofWv{Gm3q5(I2OB3lpcT_y@gJv#2vu6Wn6$vF$f` z;nQZ7^V1We#@-FgG}a>p;t-3T;+S30jYGnrClozC?1 zZ~NW4zLD>l_w3h>w9=igetbjDhV&f;g?Cklh#C)Qz0^8P)Mc8OU-3>F=H~m%{p6Y*BfI^3!_#7$S2hNsWd3>&g!WGL_ z44aBqb?TaqMx>?7s!P(#*wzHI-aZI<2`T{ed;sxm-u;!p-w{H-RzvK5Cxh>h?w0k( zV3(m2Wu>?p^VXVUEj#o~PcMdc$%Lg@UX|1(2ug5OKOZxfpKn*DjLspm%a z2QEbiQ`)R#FFN0LPS!SO8lJ_Q>hHfk9$zo%{-^*J*nShdp^V&nW$M6_&{>1Jv2hfG zpCY%(RCXQyu5+Gy!8M-c5|d{*CQiwtOkB^HC)qR-rz|v`q9mkNM=L|_A^VAYuitFT z78UE{yNK0u?@I9kdktN>xy}1)SirdH{LS3nSvW>`CF7L=lgW5_{=XX^^coE>e{&;6 z(J?k~$H0f2v}mJx79h2ocQ~GT)wdaW1^6XdpNKs@ciwgxi@IrfWm}$j_O8C6@B7Wb zExmv$`-0bmM1nhQPVTNKM*M#IqXsGzGv^j(D`o@*CR_E3htpm#$%Lfqtv~W88`6pJ zyg%GvwIEnKp`92+a&o!R^{%!(xLI0l4=K7MguwT#N8myeK|3l@6?boC)4SSzU46Kb zT0zI?vO5t6EzQfA4Svm=AvX=1VU^b$P3A#T5Djie5GyJ64m!D%jncPmX)0(0n>HV- z>^tZnSFH(xU5p;erov+U+D0^1U*99IBcKhN9;)>S=v~L09WE{;#J9-YhT3H2O#l`? zt4OW)t$*@{X#a05W(+~H-a;6x$CG*|U_aQeZT(ddc7YfTg^yB|Icr2c6rxSKUSQXz z4r>yF!Wlxm$ahf(Zwz2fW(Y%-P5U&7|iEZaI%I=3PZq4vWMfVg~#a#J%o37J({O zpO=I-O>C6cL<&Y3iL3FBP!nuZf{%A+N>JOKt)UMj=A4#=0mT76-^s`lA#eIGvRhm(W1|NCUg7Asp;Qu285p_&L8>^Xk)C^p`5h<|3Q20TK!*D}Sss%S+7=7!o%Y>0B>i~aHjf;exrVG_GrKUlRR=!-2o4azdJ1_xS{QGCP zEeB9Ir3yQx+K+M^^;TSR7Sk8%9Ua}wMW-I4v6_X8Gw;ku(3NOw`WqU^|;5fkjS!xz|xX<-|Wt z1({MbNw;YoAL$76YBqU?j|P4LC-Ko~&liw&YXGN=JB5UV9C-hXyW1$WG@>r8Q=pda zSd8xrj#XJHM=?w2uCA{7w5qweRb670O0$H8b5>c0m*q7M3wo~VQ|HY8P zPbU#RIzlDaF!)8*zsyz6oMA8XH=(!?&wG^V{zC}AOyQlK9pM+k1n!KZ4bckl!C6Slba^8N~oHmOjTd%aad7UbRAhR7Mx%3(B{RY z(P}%o+R`fv|5ldl{y9MajSJ{fF5`tY$wF?=K|_#)gv1WJi3VDRuFA^FMyVg#4@GqP zkPDAeg&eHqyH(eGomCchS5{VT7%6hpSaYRsi8aY<1?3Gg&X-(hX0Guti<3I;l$;Kb z$U#FId!D872QKkXZsiHoa%5k zBb0ex9;(%owkrY(sL$<%fKC4>cwIb>;&||2NLNgR^wJGmtxn0l)BNHid^4VCldtvg z>oq-r&T%EUvk+pn*>Jg$vWzDOEF*$~&Rad@VJGj@Wfqq5Xl4ofsVXa<40vj4u{>*l zHWj1bmu2`}mZko5_(IzMRPTt@<*UMblANSJ=3@06>v3KOxp89i>fue)vMj?Rxzf_^ zTlL2vb`ZRxu#P?e=2?bUsesc0ii-ry)+3UMI%jmT31X(C{dzwCG|)xlfi`*x2op^J z5ISC#viN=>K@RKHVD{_rFGH4kV>9RDVXy%l79Au3?Hg0o7&=9*hOhqSX@DC(-doK9 zg~v1@eHWgp-dlpZOmio*Ckr$GxtnDCxif-(JyM{*Tf74BzsEp2aBipnDg>@uta7^P z0{GC;#>cX?C0ZT$+q2KEJ&lcsqRji=0^n>>MYd=(2_zpPZHB zY$DDT9)oy83aQy?L_990F_HI+*&I`DYyAUETa?ZlP7w=~5E>PxEoVNj+hzQkU;d0U zX8n|w<~VY@I^x5J!OyZ0ZZma(r@lHBrs%-R=Hs;zC-LW|eJ~a&f6*@8X*q<}u)t`x zDM`9X+h=?$LZx{s^jMSC;Ev|iJfTbk)~MS5dhqZ~K@P!^!D%Ch+2JOlbpTJHdxTqu zhu)wnvq9GG@ON3SzMn~^RTB7WN$8;E;dXX%biDnI8rC=TU^P*|y6?-bx2f;yU8m_9 zMZhqP0G8V=px<@j2PZo_yMqACUnxQ|G-fs3YBPeu>)|xjA)U*9cI&A8wUo9c1#8Kf zzx%nVm~>|<=#NnnqltT9`fkFe(nO9ji;k~c6DYGZ7>iTYGaea4F$z_|XpqB~tY@PY zD+O~Nu>ib02DDJll$ObSDX^u!p^i6X`7RdgY}t(r1&rWR+IE*8rJo#-)`XsmeK^+~~GA3Uo;bVM}MAaiL{qPPgQy z`b`tJzckEa07IzmdqQV94abAS(_rb}z3rYZ8Mc=dSzpT93yTUL+xGm1Is23FsrI&c zD1OmtA@vMSb`$04Ak3URxji*14|6P5%7{$K(a({i%FE09r;7jrhP35Ia&mIK7!4?@ zgpT6uq#Z{qM=#bEG33A){}mA72CnJeLD3P^z!01fU48jcHJt)-W!1 z1gPZSvNc(D?V*#KhSAlGX+#hl7geTjDMIDls;|$%3Ek z-88MRzhrkD19u!m3)YqTiVQSHUWT$hB(Hb3Aw9RMJw+haD>tr}$|D{XX9cq%Q4iHA z>rS-p5zDMTp2t{)#^g=6qZ&?|FBDC+rGeGarsUJ5t{o>% zpib{4N@aiJ3ct9p*U!al02Ko$XXwtM0Ub4XP9N7m-w>nuB7Vm0uffqZVB@LSmb=Buq?lE zMz$_JsE!D912qsua62lZj#aey@Gb2-Vv<4^?ieKA)5PogmI>624 z(j|K~+ZvZtPg}8G_$RS~C)q~b+b)*_VocNOO=ZrzkGb@WipPdl$D!Z}kBTXi^Wt+p ztA>YyzB{&{LnjVERe=oHkrDwdB*P9V#CMD_!4Bx2ClGR2khe?Ec#Q{evFe%v#5l+u z)chL+lr+MS`lK65N@LM)o zFo7sJp$p%@R=I)HlLuF5kHM1lPh;a_**ohJxkOx>gdmMl-a@|+-_eb100rP~85yyg z0C4;XX-A>njRDVtwvKqJQ^g#-h_;^sjjr$Z2ANYw?cBjxzSo&=7kEN95qK;9HgJ|3 z?bdcE^`(-6(Z7J$B7&m%l_RKJL}oUnvAwYAz?TRRm_Aa1_b~^0fp9y_rY|~g#U6ip zH(&+}y`!!6e$1*8#SbF7CheCYB~b71DF8h7UQ&KT>fIRBPH9~3XtzYGLo`1}NJO{~ zOojH!jchB|-o2$Y5xi+GT=w?scrQt=r0P}V=>3JKoD@_Cu5F4t4tevhil$`$JxWia zsczFQC{d0-s=o!6`|{~LW>FBPwFk7pd9?^8Gq!hKqM%mexPtGP;BiuXByH4* zd9LQL7T)(%h-Xb@%!PnHq1w2AYYTx@6d((}Z{6ONo0de)T~SLmZr@YP2^vr`>|hc4 zE$bgo74et9MoKG?yJ|l3Df)GUe;K8Cr7H=7`6Jg6=hLhecAcAa;4@H&*AT4HIMSOa zSi~p1SZIrnBotpba=7}AuNIwA;d<{Tu^j#)xSM+iAoKREE8g^#%w#cZ+m(WN4|$$Y z^$&I_uRRAm$7aBA9|4>CZShDv(yS41EyyrF$OU$O!V=OY) z&K*5cXuGA&p;r%WbS1SW>YHabrK|p2!KhBJgUxO0tWUgE$BxppfP!zuC*E>8{LwNn zjfOt*)z`MDs&WgCb^Lk5*y3GNCQqDoc*Wb#fy#xVgg|C!x@j`qngtL-p6`LP25aKU zgoUPPE!!7`*D(6I*m0|Cg~S?wF^d??&MBI%J1<1r;4N#i$!9Y&$`|+qL^Alr|0#NG zlNWIg3NnY?Y$Vv=Z3%xE=aV3-XwL}_`fRt@`>sTgtf@ZIb_TVY2+0(|JgQ5^Dh=iF z#uzIdsckP;j9)iJNWC6K$pZkyWVr(0)SSC;@;@sMD*yLt_drUD@$xaYdfK}d6A-kL zFlXx8q!?^=bNk?{rbQnp8gA8{abpL>)AL>(>q8uolZE5};GFQYs^{1;QTjm;K{=LvvM>KV@{YxDuv1VBsJrw}t|MQukEmaLA-}gQ5NlL7b zF8sq;mJ9W9oP^qy+1iyM|31sdeqS!eD_~}Gz*NEryx%PFa;cbh#D`@s_*eUo5Q2a9 z^@`zv9D*RLFwF$xXfm?Fh>%|EdLAy#i1(*Vxp|Xk9Hpd?>Bra|b#ozLgINkGwJl5u zF1e>&2kRZO)Lh>Ze&Mf_{jV#(tkZM4R?r&i7NdXSW2QPeCB?|wO&VGj+VV~bdWWS< z0pR2F)!?{;dl!%IZCm5dx;543+ivc>20q?M6+CVvZEE{=>UrLnFt8ePC=Gmd{uB5> zd->BYcYaPCzzpG27BGKkjJ$$*53Hf*mn4EJn!55-sCfvG}Hs|zubNeIPzg_&LkXGZ6kP8(J;XOMz z37H{j^evQn0;sQR+!mE;?MCDRj`xOu9_6pU3Xt{y!DT|N6Huw^qc*tvWFsD=cNO|- zdpN02mUjjE_F20Vz7pN$?H=nM9o3dRUdgc^%nFg5bN>um?w2fEzHgU22lC7psp?dp zD1p3(I{19e2M5|Ne9HyYu_ZpcOQ}GUckA|TA@JN!q>%v18W;gCAfgu8dPiK)Z~+mc zry=uk$uTuY{rqecobeg6H~pUdpQqH4x%j4yFA(6?`tIAKf!MDJ$Z7XLqm%YnO!@CW zM^+PX@edi{A(#hk7f!=Ui+A{03=g9hFR~;}t6nN*#3(B$XaJEkzUye>ztefVJ0Puo zEdKN7PjUalSJ71Gwnlkn&Q5+M=pc(#nrVOAYP^q$Z1b*+b^jljXg$%$xe_<@Sf+hXkj0wsOG%jmcH>^8K765}p~0ASBv+9JXR-s-_Cr7) zQ4|?@(PMMQ00^iDc0B;KRFIsUT#6*#=w5xFD6&#IS?w-}Dcr=JN#*4h;G^m};nr8< zC_%kzF?{YARnD)-`jczF#skzXk(EPxuegD9EFMunScpq5wDFF zeF8|k5a?3Y0JSp&z;Pjvt)oHMzDNcG=Y-4KnOQs zJKUp)4^D0E2!6fWsyz)1L#AzkEiG5Yg3kO=4^j!QzYFM(bFckd(Qx~~rZ)MN&IgMk zCWvGB2%TSOC=(1^cit+2OGgt($vwAb(-%Bpj!VwV@_@PS7hSlB7nBUZ0J3m=T(`lb zrY%%l%(DJB869M~&vYD!!-7Y1>^GZ^`Tza%(|)ut7LZ}ZgM%7W0O#h%!=Gcmaw+O@ zOYR~#fmh3Z*B&-WGI;yR>O0i-qV;y2!-N{1&uBtkoJ_V9s7hzGW?KeIGCe@$HBV}u z59R1mo1i!B|AmNYc+CVbwmieE`U<(!_)LI?^uxl!Ji|iU&W@F>dg3d0TPSg9cUSGL zbmx&L&JYLV&UzjZJTFV5D3BVz$;ru25TF+}(w8DoYmHPm~qOs z<`>)<^+hT}%I)hR^^J^;UR$PqLc_Gu0tEXzdbg_w=A^(3lu0itmmq}}29q7W{{T>? zjsDU$inXpTpEZXc($X>J8ZO>WcfJJ02g*|`8C^qQ4dgCDN^e0);_$Qo?y=i$QqwsO zw?8YpRpe-E0QwQ}Tm-yHMHX63DWkWv&@;4#-2F$htmjovy^yAP2Od4^r$*xRsCB~a z^uS!v_+soqSLiVAO`ei!Zgww-Xu-pvC;E}Et^Tv;oy8Bl=NoPqg~{wz51hR}c8B7{ z82Mr2HO^j4p>1h}z1;s^;g<{$yQ1Tebm71$_ z0zKY11i4+ge!0*U{ex4OOV{X<%TRKsR=&z}z@E_kH(mEh zZz}^3VZfq3fB0|##C>Hjgix(4bR7RwBDY}G?N7Z@b?>-#OR za3MtWWG1aHk;Y}3dupQ}Z$1_D-hLtEGHa|=pr-TkWp2KDX2$wa1U;W_60eE-n2z4m z^S@v&XdS4v9xZbCteVJ03c?@`o<8x}827+u9y#mwUc=5&hvsjGkrZ^08tBPf0HAxi znQv%Q;5QXpo2I5_jYTH~5Q1{A*MV8A|4EIFG{S6f*VVIHTo>e!DFX693Dmpm0Tl2a zpowt9C@j%edwMV3FB6Q0C?ynrh{H=|eDbK|xOb9E?MZ=E%o<%1@19 z5>b2b;DG@=h2HeDlj)s2cEur~++rU5S!D$?f(mLVT@H1c6d0fw;dTF?6+8tC#P6Rm zaR0(e%dR!R>(s!$N}p^$4cO_V_uZ)M`s?5KzZ2wKbaqQozVK#QeBH$HHiFSOx0lI` zHwpCjLUD9S$v6_Lb~6$QbnvjTe$){fqWBDSwiFZ;!(g5cHsc&^2?ikp`U;=txMON3 z)_yR#)O3MaAx#U5&tM>oT@o)g*E#hzH#hg>rc*iA7(dyh#8)Wuf-`f!0#C1;hmLQU zSw@t#j4unlBYp=oBU#U0e8<(uHCv`RQv_??5fs!04VjVGB$QRoyUOcgGy3i$Dw-ZyBsULH?kl=gqKv302--!tN4v|Y z=dWOhdl28)IMU<16s1ZLT0L`w5m@*wkB3hK6RD-<`c2yMz{VNC14L8td$IXGsM~y9h4!x30yU(Qu&M6QZ99 zH_`hD?ee-29zu=O^Z6SASsZA_zAB}@3D$+L z=VkwFxy(HFN>~Cd$a%}xL~n$CrI8oYK3Bxk6bsUln@qKe!B2owvjGGbOrLm#2s*q$ z<1RgR%1J^>yf)G%JqE}feAczR&`jBGoYzay49Jh*k?MdHoXsgL&6yl(SMCp&RQ5`9 z4Mnpe+)D#dI5-GNH$c}9@{76SU}h0cNR-R2(~IYnI9j4vK3;P4+|rZ&hL5k!wy%0S z#4E;ql#mKzUtB^t&up8)hr^jeya-NG#M%&nix0yu?1xzSL+zXrdW}Je758N0y}*G& zd=HD3ED=#UZ<0x;VeTHu~k^??@8jCB>|)IsqDFh`CZmz=UKC z#vLe=)i+^FYVkEmu!Sc+9~C&W=2_+19e({4t{jQSlM{d$$okyad-okFS+QFRKOU## z1=S#)5OF^Gf#0og0~wiM7R*T@W0Fg0K-a;Pg~QL)pWwu|xd^xXANGD=pv!sUWJ3UP z+`%toOZNRU`@fB!ba+eC&L**;EGB;ojjiJ;x1STw9@R(>1<;jSq-Yet386eDIsmca z>=Vn1$d^?#Knli_v@NF-D13#>2yPy(z8&d}N9YAs6BV18c(P+o0x><+gg8Ze27UcY zZdm7#0#@Jrx?Ljkz=~uRTp^Qv_lI(5T_e`g2=DJQw!{x(-8cv9|8M@{$6IH zD+!Zi=MrVpH*-GI6gW!*m^Szph{x^PyGmeqSmqa|M@0xAB?TJMXn``mk3;t>k1wT5i{~6?Am!k}7)WMdyxe{ckumt+f ze9aZ_5i_d>yvNBMR7>vz1++ussKwCt z=W8x|FF$?amZ~`{upy;`B$yZEPQ`D%=)1uz4OMZkxMEqIk;HFC8xJju7>dC0bAa^k zza8l*|DKfdq2T1dV&s`D43Z(x4lm4I9`G{-fx)oJq38!66M*}{zp0uFR8l@Sd8~6i zdSnb{YDcTAdewZ-auq*~0vIOy>{%gDnlcJICWCr5(c}CZwX~y_Qk4q`#5#(VF+$A* z^Lx*M&uGY~atRI{Ixo;=K}f(oY@O^!<2~TsHh|4_`00}emOpI4FuDCmeiXjNC+T4AOBO~J$78Z6W(JqQp3J*we@YehMg%L`# zHm_yZw2jA?Lh%pZ7+oB1V>&TfEq6!nq9v!jZFBIJPVWsg3HZSq(955YR=<4RHYVx5 zLEO3}Uct+{Kwg9IoruAf3eDOA#rll^HUw(Ga?mqeUn{8?A1^c7b(H_F*8XmO068$f zc02Px5s-D0iwZ5pqlOrC`Uhi2Z#M;WV6??Uw@7C}2VV(H0fFiepVYw+k6S<_!)hQH zs2i(w(0ljxZ6WyXfi=*ljn;+20kJIEa_{OEkv@KLp7 zhR%NB+O+S>lJ|T!)be2QjG%AP3cg_guSftr=+EgiXTL&O*CO~@2Q6bH6Ft=CS_3>l zhacbj^=xfmxFYSnoi!VPMH^?r{&dHRyRT@B0}Nefk+NVC2F4OOM3W-G!8U8QPgstZ z8hAdd2|7PBb-A6U^WgL6jIE>QTW@aH-gi#Bx(8JFgwphq&~=su^VS#!Mum zkkW*yUzv0BjvRokN=e3UVN~Cdg&uP6{hT%y61er$qL@U+!GN1vi}d~bDnmmhUBG5MKx1ptQSmVJ$0E~u(Wd&8((+cBpSsKW zejVPdg|{#LXGR4~$iFT{scbt&OL(lsuUp2&#ce#=-cZ?g{^Q}nb@S$9AUm(e4?@KS z7lR;0{BEpR@Y53j#i)X>7H5(8Qwfj^kCOWSiIsOuXFH66*{A3H!n{YF79>jN$x0~o zhbzd$=BC2AWB(^=#{7LzKjRj0m4?RYp54V8qJ#Ob{fym*WIbo=6bT-}>X!#HUF18E zm<(vfIPU~M!AYmAMS_kDhvQWCcjMXxx)8TO9Lbu0WVbY?AV8+!4&Fga9}1<_nKWZ4zlg@6Tc*7~DlKy~zNS0|5c+?0=?cMF{_E1cLgKr0Urz_0 zQcsDAEG>grp$)#zfXQ8Y=R1wTvg2GUnsf?u>#DKvCyvsmd!Nu=hCu3ulk5#kz;_fV zB0-_5mJ_@Mrpgl5ErIjrf?xo?<-y8&?9ZE&HCwr^UrZ{I57suGPy2e8=x!PmWzSt4 zL!Hj*Hg3DAiBO52wxh0#yBDJWa^)v3ki33_F=nn_?2LS$qz!syT$10?ubN45eaDAG z&ikcHMYe(Y;JD{+_w|V6zyJ92tDw+_zr8Q5Qa4no1%6{NW3Cz(6Z!`NboByU6Y7|! z^35qjR~L89bQLbop?-m`iFDXN+MJ2-BYpFZ%~5YiMv8fw_im?hNQdUwHNYXtkn0Q* zw&q{^nDW`SibL{|tRFIK0H~xfSL+(-R)m=RmEUbs_?|T{dtj0#)|S!I>tT87lR|CC z52EuTU{5@8S7+#u_|C+Lf`G`ou_s^u+hE{;+`)fIM1G22UC=phP8>S}!${>!o)tVl zlB*l`c_EV}rGFj*6no!5ts=(%JAfkN2u+8t0N+*EssaA3;Du)U|4Ces_&bainlIbI zJzBxoh|gEInjbs$--6sh?+aVkrnit3GXZLHofZ|3{UTHs(9~TE!E%1r!WTWO8@^}v#4obdw#>FZA82Z8gUWZFVi#nZaKe)FZt&!-P)?}q;iY_z(!w@Ec>Nc>|& zEJ=$xUm>XXfsMuiyXO^?&!j_wufH>B0eqnRE8p`>FFqOq&?o zBJWFoeqQX^^1;x<7hEKFngVy>EUhbk7QWXL*l=iOENjqf9zTA_l=u6rc;Rnlj?RMb z6HMg|N1bCH?<*8-xmqLj1ld+u{QTOqrOWRh1hj#F`NfAxARU@@O{q#Be*Hs|4M;&- zrQFm*+FO3jT@9l&P=|)f2|$N1#WE%hD!;*W)U|=)SbDm%|*)>KK;0 zHGZKj&qWQ?HnJAAORRHei3HCClXx(_tP4Pw@&XRnkAj%r{XX(4i|1HbZlyHWp+o(l zFNiZ&dR!V{+-qCrO@Qm1EQ#i7SWtuOO6)V@{J*HxI2 z_QB%@3Qx69bd9!m;hV$*e|@BV4)3P>QE1}dorpt^gteXlk5%K@gLy*&lxkrTUUX73 z)8H3XKXwk^3ok|`ygA=JVJXGlStW8L&;unL5U#jA8<6Kw!lS!2QcJ+>($Kqy`nFHA#_vrZZ$q zd>RBDA9nZ*Jm?w`N&u>wjN{Ls9DA!=WV=w4v7lFEVL5ZFCt0VoR6^<&6XnBjSWFMk zRs+9BaXR+>-gn=2De*AO02W9r{64tgnuYKY0|0jA5AuYJRIoFo}FY zO1I?O)7@tim}Jidt0esVu@nwwcbV(}9M48i_5OVao7#1-zd+ag+qNLm>Xa-i$(*Vh zPo^}0aE~v=^&*4?2m}S!zJG^ue(2s#=Y^pVBlh85ZXi{=Wh4njY^S-&louA?Fv0ZU z4SFR~T*zQxVL1={z!$%!f6)WhF}DD+F~)@_P+NT+e3N+sbhkUY#)VTF41lH%2yeE| z#2urR?7*|8CXVAB=3oeUa~&2($Jm(#<3rXMiT?=I2u}^I#siof3MecQf1DaDRJVv-5b{iqMqXG7RU$4j9EW}!^L#8E=)Vy_@!0B$SL7) z%allJBp*s1Do6-ho9j0K+qK%W`}^y^<460LVPam7?QZz0M>Jig2W5plac#|fWcDo# zRtbAU<`=WLf}zSvpoE(L1N@?)Ga*t0Izh9hj}j=oLN;yPLB;Gf#c@V;i*YnmvDm@} zrE*whnGr8EKxG6f)?_Y(JIMGkLC25)Ts_?ow^T7}26^l!#FhNj1oE0T$N$z;UWpIW zG-n_q7exE5_`JZS+lo<3ZwS@|;zXz@wj+jnt6mL^IPk3)X_7~iKA9b*^RiYw|VxO{Mp?c<%QdossPrvCmejfI09kJ@jB_iH`V5g4RnESF`o;M%)T^ ziI`N_O6UHAN!_ui%F$5zp8}&~fXN*Ady{GYUTfJK&Q%I1236Qr? zOVgjg2Y^)$Y5(k}e0AR54|qvZd2U|JG~DG=y8d2_z_Z;Ez2Xe)vV%>~)Bsqa4gw5$ zVg89R>z3XH(g9cr&pn_hdT)1QtMS?HqUgDKGazUpxg?S8ihzpT@Vm)q zzcm(KhBkO|IeYs48|ZDsEb0XjD~^JZ|Al$C03fO`CHNemIm0us3CdV$s}2^kA9dc1 z+15<0Nw>&d%8I>IRKIrPIh~5@lOih$INIDG?Tkvy{VPm7anSmwz@$3ak`x4=4Vl`o z#^Uo(3QdCnEL4;Nwnc;T#ekgrs)A#eybQY z2dQ??{SPwnZBVEpfq3C$O6s&f?AHU1Y=EqH6Yl@5W3NkWH0Vmm8!M^GheHP*exU{}pXs@)N?dcTzdE$X}&sSxT zJSt;7@%!!$mQhyP#E>@>Bd z3X!pYWgfT;OPCs*PaXy3hbe3GhnZOql#EklYdS3FV7=uwLpYGC-w5X~2pr}|QbrF@ za<+nEZv~Q{rP|&(8Ff2t&e_03Y8PmoAd5L-JTEwRLe5 zT|P{JKuSWmS;X?dqa&v#1;0V=*eJ(VGHf0)Id1-?qTM72(Z(bu!G4}0S}Lj(I2BFHeaW=)jqcy?7>0y`k78X=bVLA8XV%oFSw^SdyuF+ZeY|=5#yOMc2VIO>x8UA zZPpg*D8)jL#{n>bVLntUlt%&)tcR@Bz)LX5yN#~iZj{+L3=RU2h3r=z2frO<>Q*O z6zABwwe&J(s&8(#jaxLj$tAbJuF#Z)d>1GEZMFJ~%*H7Z5!cOO!cJPzWzVN;^wQT& zqZ&ECJiM2{jMC>OSIJ2QzI4PQJGxyQM3d2Z(XHd#%=5FS-ZIbpVn2>|G zfvHZqh7_rEIw*nqvxp}w&RKv1^(KJok&y*fa!_nBWXCB^$A8wVoP_p{g@Zx<8|C5l zwQj5vbU{~0=7y)&(gx+BT@)w){kPdindsMGnnHN-8!F>?H{E<2A#DAIW8WHp%@dWh z;(#YQAM;tWL5Bi6!hshxn?w>5De8X6Vv=^U6Ls=4Ao$Hvxer_~BQCQb5O{E4=^ele z%F4=ll8vzZl+$L&6!_Qa`aOzWf6XR?^sILQM~i5t7MyP=G|Itd3aEiCgZ1(-9Oa^D z7DBGUfA_d(ep0%I>=7uG1hSKG8BgxzWtJL-F}+(@T>JYCIF6QByF}60|bOV7TK$Rpy z=EQit@SGaNw&gx(`Y2++ASl>*>PAiJE`>B!f#dfM5bT zJ{{SBS*2F>?S5ETzV@B&L|eKfKO$qhPxU0m40}2jYO$a$rEY-PH#&%0Zv73bsw6mk3+F2itbiYA3jS|c+J^GdRq2dCrjrv}7zL>ZN}r-d z*R&jx`y>D~oY4Lzk-xbB!sT%L*$WOSzpBam`5UlWsjF#VHD@6q?W;^+bqPofhH}6h{F;T) z_>>5g;xf||z!QCaeRJR?fC$iG=!8Y+O`4lvgFj#o2N88|;q;eU3n4+Ja0mo2Uvvp+ zyPOyIy7{&JQafpXsdt%h#5bvyH}3|&Y{7`~Drlp3a3tP;5rGV>CMrK5de3Cc)D6rv ze`?g0OWnO&yLe-Bp6?B8ToR3G*ZOS2dYM<5$WJ7)eATEq=4_J9#f>YrxSdsT!#5Hs z0(9ZzR{DM`d>!28Ja(hE(zUWB|6)vU?d}bf`8WpVJw4MI4cRPwRy_|Iyudv_E!5Yp zYxnZe90^O;z!pr^jh$`vc?|veo*t>E=I%tzHM4b0kiV%47zJ3~d;28nNv|F|bLo!v z>TGW+z>?j*W=tOLvpoe`JMIxP)mqV8N}iB)U?gOa!L4<2(7r|KDrsNmwA{lWXUz-H_AZ8+A&f)f0r-g=YjFz_Ehsgv zXqTt*!}Q7vy=!=nP1mV*s@0iGqMdk|9WW#D14f#+!RUL@d6;+4dhOs17^RC-?ur5? zzME}RNj#e2hbqLkwz!ib{77J<{Zwr#J`QK$L))~$L(qfmKYZ|4N5(w|nQwA$0P}zJ zoUV1xl-R>UttxO+=)wwnfR;ow6K&6AA2T|g4NpMbdMYfQwo9J83KXIGi&@Ca-GaL= z1|{O18Jz@Fx8D=FmZIQo02VbLA837Qi zz`kG5jmO?3?Z44*Iz_nt>o+>=`qcCA9NXjNPWvPVqHu(?6okQ)vBJRv13M;=y4lr# zR(MLR$Xcbol8at(UXKLUm2AVqV}R87u!V!F5ufZp205GE0fY$TCyBa?1!@heB^YWe07o}sN{vNBFbE>^gZ_JxVW z^^TmsL2>+hB?+eBO0s#hn%yY+2_JQP<_%xY@#&ZED&JACIFzT$O3T0te|DZARh;xu z5KgYEeLyq5K2o#>B@uMEs4s#jfsa)K(n!tI?&VN26!a5n8Ws?$X8{1wdh;xOX^Vfg z7xf_++ol3Z6M5{NLX_VTjyJc*MVjY~%%4h%7-`>I%#E;}MFcTm-t6aK%WI_e=vTsB z;YCgka!)}eub;#T`|NGN$`+DG(eCBnd8u1J(dy|~FT35qvGKGJ?rrg|rZnIY=}E}d9A_%UYhSM9vASlWz+XFe)R{iiOdmn%Rn)K~ zF>i#F&ndfp9((=|2!w>E;R}@q;R$QP6P~F}F{=ml+wW&P-}&uz-|Nfw^O+qim&|7t zxY?tdRBK~Yp0IzLNZcSJnY*av>*;LJP_0A!ClJ)$r9%N7~c@?>p#-?=2kA zU`%9!Ll+dMmgF|g-1e8MJ>Di6on3>Cl@hg*6+ z@^@@Qjh6IIhf@}@zvZdbe=_-ci8QpcPKq@fvR=kuwpG%<%Ul56q#W$)Dva**F+*uv(1=^uXS$ zbK3GBcdxPjYV`#sCP>lILcEp2h7e?1$)~mo>fe~672b?`^?Ja*#hnYW ze7OvqOpGF14_*lJ*&S6JEm`Z!UOJpvFdD8}S`T4uGc?vqel6Vyp*h#-k&uYkHD~3! zn@XxmINirQe~iJaL8BW1hfqZ3x~S@cI|yA|^D49VAKBjy7_a7n# zZL^N74|;}`-K!>vVNXfPScD>FOEAT$u^yia`qg-`OZCE*Wq6c)JY<&Gq5WA9!uwpy zN(@RB7D_k)Fbj5Vn@DKqbe2~?pVAS#Rnw5!y3GMXLycz|1JW&ZTs{8?p;T$Xr=410 zH)eeD0Hm>{rZ-1KX*oIm0pj}hHJCIrdu`3|Z!s=Id?aM_7eew=dL^A(U83BnF%`qn z{f9Bms@JxZR8P;OW|lT*-Tl@InQld%`THv7utdU;c}`N6wwe)Zn#G^z^;uiPEV+{s z_p7A8H#NqImWe|HSM%$y!`+w|Gqsy2(V{zh>UfitRiESm#l!V6pzMQ4w8 zUsH7Ol0C^_Yb><&(RcYAtoz~%HEd~!d8ndAr^{8ky75&Mpp?|$qK)(vr}A$R@!Qx< zhq+7z{`8yY=Igb;MF6g6`vc(u0~82~)uOCd=^ZcZ3dxab$CW5#6T%tkrL#CeMxtfD zb7t5|zz@K@IfMQ`vb_?qMF~pc;wFrZ?I#J6pKzdYra4jlET9W5x;9*f%*N9MFGPiA*41H+er*h z|Mga9N_z6xA-wUY#I*2_%P;IVsNqY8k+4NolLrt`l0OIwi;-cRA#Ys6LA|Em``tuV z+LH@MrgSL0c=QS1=XTF|rGz7*h&dKjK>_)5*Ull28ZY>k{Py^nS7$I5ZfDo7v}DBm z=GqpTSCExy0ekC?dOz|$>t!V4@ouqKe)Qa;ZRyDfRoAh(h|%8oF%2;j_Sh{U?BQb3 zlelj;NKT%iLbmGI`$<69VImWsj8IR`9O(a*@RIYb9H;!2N4VAcB>4}P;eb8hya+J%#e{;{m!f;m_dT23gr0I(Zix?2_ao62Wz*7i8Jj(prsT^b)P}J=qOL+I^ffBO$mmJyTxp`glX(?w6=9r6A)qH@ zvY5UQxYz>l{|>0*A1H~Y1>IJQ-s8`=o zz`o~AlOCxn{SCxaLF%z8P14$+nVrTXMNsyfoqE5!@-@Qa$B$W9{LcsYv88E1GhT&V zUbd&+jZ%XRu zxE;Vc8ft=||5rz#64}_;2!ZaUMgH2k_pwEggvW>BdKvA$C4 zO@zYFET!mgt}x1PS%xF(USmcp0ZH%T7GJ7q!;hRvM$`hBm%AZFzq3il?rmT7v4G~~ zurP|7iayb1Z7G7i@y&11-23|x^LU0zLO@h#Em=nMH{I{O1$IgJ`~<)<1Gi_PS-DTt z>n?F~0u<$Q!5!BtisJa3L&eZVnCDvccGYr_Dbav1)M4vP{uKCXcov@qZ*DdAqxyh1 zm?E~UaAayqEBVV(!`@0Z3v6bA^c3=7rl@-N0tv#+n_pW(Zp~Yg>~5}K^5HEGR%DXs zIAISV(oGYiu}630vDQo0FT%oAd+Ma!P`>Nk90*kD?iTTDesY*Ld~7({b&^#S6eB?E zWww@jY#CZy_8xlZn467!38r;Jmyz4W^={jN@O-0aB!1LZGyBl|J@aXe2+S#$hhD0z zlC`s>Pk1XV>VCRIFctg!gnzMmiAX`YTaK#%%Np%T%Z^b`DLT?dOP(YSkHt@V_@aPVHi@*ttK(~hYcjl2VhhCE6Y9r3opzHS z%rYGYy?CD7V_*ek|D`9^h&VjA&@9K*8O|K4=NJ}s{dZ@b9cI2nY_ejLax#Pv^U0vZ z6L976TycXIqZs`}$VyeGTDMHu2>#6j!57nFQ!wq)`L&&AlODVb_>gzZCDRd?gm)1Y zrk$33k)4XW=BZJ|2LlG*y619|RPIWZh90qPrLcHmgzA^o`3ba^ zRF~M4t1ex9$qo4^xc`Se|qgk(u+Xnl{QTW$Z(v3 z{Db_H_6LSR4HE-SHlxt@8-V-gfc*`Dp1``II2+a9maB3A*9bfzd4+l9WnBIF2m$Xy zo==lj=6w~-qk7w5baNjb%gfM|IW|6*JbDsf8wzSwQ%7Kq@>J5#EJR~y&EUN7#xSBB2br2&3Ia;Ld2ZVd-ui+q6aX4x%eu_x1>IVXjDYrIF8EdtH_2k z=v>P@U%EA0WY(3FjLazJ83jMd>&ZL<*ZSNVG(MNW#9>>~@BTsJ7)ULWYPYdbugB{& z$~=Eu)G~VaWpiUJ#!`vu^yvqX9@`Oq;0e=NzLwi!_+?c*)Zjeg<+U>g?hAgR?YBHY zFlaD6EDYknfgt2aDTGdS=885lT>=9*UHEHsg9uY-uYHSr;cAyTa(bp!zE8+SCABF2 zUG=sLtb=SeZ!{IH3J7-MJu02ymIKSP*1oowc?k}-+{QF7T=R@cPsXdVqa0nIr9<6q zpXqPlPbMS^N67!qSI5clKFt&e56>8l!`lAN)fDfN3jR<|CdU zK<%-1P;H*1rL_!w;S(C4B!e`~u)Xhs)#F~O@KV>2={MKo7Ckm0qBVTDLzf~=x8Tbm zV@fW43#oumE(0s6;zQgO(|0A`XMP>pFABFjXyt>yG_g#+bSk50Ifl5+Txki4F2!G^ zVIP;klhb+NJyVuATv-Iy+N7c2XmFc+8RL1-SQgkrJz7xbzs4Nn{*g#%*K@CW@x{QY z*MZS+;u2>5)QN}vt(#0JXI7NZGK@OZ5KV<&l+@V9PuWrvkhoB@k03l0bmni?_%o+Z;PM4BA z87+Q>-=pV!KZCbc*wzYS?&tTc7*0;S?aO>%(f---%$GxZ_#ZU(T%*c%esP#i`1AYB z{Eaz(&}7UXJ9h4xs@ht_0l!McoEXws`e!yk7e8dvw0$G}#;JQfb4PM5c!eyLjM02OQ3 z)o#+BpGKj2#?N<$`Cc!mwiLWVk(WhfIx27|(F+C3T9B~em1?{iMMwN&viuqzZ1aKlxPXK)F+{YWw+yCIz?ZV=rSKpS=0+$Ms@e#y@U z2FgOXCdvU)TT|ggT-}D!hQj@G?I@4Xi>09}Wpb3bKi>0o3kj@#Z77lR=Cohiz@C~= zE^GEMETkgyJ^vYR8*$x)j)}|z;FU?hB)}?c(r{U#wNBz2%9jTV9N!)OrBs}*wcQ6B zh^Nb&yHdxJT|IeuEPUC<&P`gninZH_WD4M`{`$-OmXYAd2KGK3#K0yAuOr5;`1RHO zsN&Qs>?j!bB5Wkhn2X-Rnr+H)8%CFO31QabAXC$96>B_&YqOqAFfeEi=w-K`FbOq- zN!3yRYjWT$ho|6BRPbQ4&jrb1pCLmM^X%Exg=_iD^L%d~qk%a>!!&?2j4OmgJ15KT z81BJqtrX_1@lCh|CoowGmpT{S^u`1OKw_ln5;s3A@fy(n9OfANMg79_!j1PrC z^twbBxA(EXmig6F)IPth#YtRKl@Vd75^eiQ@suZ(<9)ywQ+hXPS0_Y09`G6Uy^BJH zkuOiI=Hd}YHe*sk9d|>{$$Fgm_n$wz2E>I`aXq?eJhd$0!LF+O_rN$PSbv%FaNUnv zOD&{Rn1Q+LBsZqR`{@m~KmQX%f(EK|PpgzzH#zUr3+Zh7(#EZ|?jQIkK1I8HWVSnd zS;9nwuYWevtvK`gBmCm#Zdums?{yGBrk1HMT6**3powOqXFLz1C4 zZ{MK@=Vb*q6JFP*ov@M|mREN?Q8ngAXj9$iG$Ll$C6*LGdYo7cW>c0CyT&Y*rF@a3~c^G6LTwq}Jb^1HlWkEL|Zy7Z0o z%CYTY@wjD^2T@4vrxJPWe(b`yJU{rXwZx>?oIN(PGyf;2ghuQ3m3ht+r_$^q)NJ7T z5T(WU1Z!@4_f&cW3Y06?>aEy|LA*?`kv<)bOEy6W9^>xGHl1IW!F0alGnW z!eI2h*ZHDHC8{odWjG%$-MBPG6SCjvUBxBydy+SAb{IYVm1$t`)roX{pUU0?oD2*g z0>+5FBv#6D5#)Da=Gf+G=KhIRL=gjr3Yq1@@3+6#EpklP8(wrqN(~j29&=-A=yFs+ zC})uA@WDhRPO~}q*Mf=GY=mN<7j@V|zESfuP*>C=W1wqK>UnUH6xm9QXr2)k{NI@r(8EooJ5WihHYILaGVGDOJ(Nu~j zjg<~V)mI1-S(LsOet4Z`iR>8{WFa3{Ot~^q1E9(6wjR=+zv{v%mpcEVGxcj0P)^yu z@R6YPGjMwcITfzR`!51IM2zq9Wo1aiZiZ_CUky7p4DVlz1ji@eQ?V_8=V8$$9|3wK z{a+H8upzV2uVCqA_Lz2?D=`@}GO)w(Ldc?eoxFDxUJw^KlOPuwy(swS=AVL*?{zAM z(5R@uDzdEknyg|anZ4%-oy8ozz{6NbD7Xs(xESL;xaUtj?e@asjXTh`gd(0+=VDEE z`5RK){EDJ0Z=f^?qNxw`cj|C`D!y9)D(3bG_oZ7>VR-9d2+w5w z#aE%V9K0M<@WIPI&TH9vIf&3H)hymDe(FqU%tYgdM^lhwTPviXsOW^k6@gb12*sWT zjZP~3x}09dgk^EabV(bASQ1SOi!^h%|4b_%)>h-mQ>R8<$D*8c3G-)8!|Jz1*(rg! z`|6k0#9kAE2~DwHH?6iyym+=tg5tg6y+mj|d55C@LB=SK?jU0j^mu&ZLgm>aZ>aC3=l~*1P?UH=>GsL zG%3z*z|j(mqI7~p86bDC_G zA^bII>5-QkKoW0*AZ z@ZFkq_eRl0^6f`EPsD0DXgNqA7`qlk==!^!=}{1n9t?MmeovlsC7eSSC5MV56;3KN z*sJ*VPs-ou;3DMmk*QMrs!kDU#X^J@NqP2#?~o6m3reWm+N;ZOd2p`djCLs2og7Zj z3^?kG0L+_)=mVR!WYtQPjj9P3EVtk!FE5Sltn^^QG3Mb0d>nQaUZCY53C6PRr11*p wovJdB|IY<+ELMN(%(4G_Df<6-$YL~c&k+5mA!1eaP92kxP`H_K{f_Vd0tF}G(f|Me literal 33287 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 AeE*L6r0zZ7ppaEzMptIvd$LnAupvpu$i-E=E&F zM_UIG9v-Xzya8%sZ^A<#I&KOEA+nX#bbvs}^l=}&EQw4r2t+VfPU`VX*M!wEBF~rD zzNSC0p}lKSESD}^8gemIO<}(BHtR;TmcGgP3lkB{!Q=obk!)eyE?V(1+&gK0)WOQRY77dd zV*7z{!1EUP!qGqpf%p)UqrrE?ds}=6WKz2y`m(lVXz8~^LN*oQ>k$}f+l^y2V9@OQ~Y0JvK zFE;IJINlU<-FW3&J6|^8W#M&zJUiK&?%bYtSSf3w_sAJ;I$na;@$NPK{P{l5?%2|0 z)J~>k?`-1iBzfyWQ}Aun-kx5O@h7)rLlcvrJVr3PrIpVz^q=8+NHycO7^XWi!4VY> z^R4O8y7%6_dq;8w?tQYXw|pDzyfVndQ+HgrANT$}q1((S!H&wBl$1wQP=x8)o|?$+ z+38;0a|FV(A9)B%?(EE%lAmDTA%SNqCx%I!9dy3N2kTAg;Cpt`d3GEUn;ye&5p_I8 z<{dg#<%028ubJ;3C>dFui%!2nMi%}1_p?9za2=;eqKFC4Ev3j2eho8@is?YkpKu*F zY-Ct`JSPKkyG!%C>H2t${Z1d;!;lV(#df6Ry-_yN$bAF^%s0pyjd)#aUY~7ww7a@l zlzgH{D`;)$)v~iXQYH`SG5U4Orn(DJyHbcrz&z!IqaFK?5DxA9g|2^IZ;duL%epP5 zN1Ny1cWZtkqF|FXH_s;0TOBS5XHWL*J}y*aWo0$yDjRoS)|Bw|zi|62fpq#~lkPOR z?o1Vi4FV7+AH0h!+}ujK-X}Zv%IbE9E!Ywk_OrJdh@u_2weRba62irX=s1q+~X=z@!O~ay)ZI2~!kB#q_+gC}_ z6@L0&CPVLQ8tbtr|-#8SHqBI}PY`&w@tb%m{QNG>TWObBM?Ur?h}A166Wb0YVz;T;i9&d+mKZNC zR4$`ob??_}_H^BLhfJ{EXM5i14)Yyz6~TGI*t&R|T1~H`k%`tsm+`x|A3EnaUu9QG z;;W0;q0SU9RYR#8|1zBZ`5`Pe_HIvx5)7tuSh-%k6-;ENudm-R&!drFeBpN)$=;_G+e>|@??(!Cnb36cKR+otXwz5~qGHn3WjL}F zf4n&@WDu~7A;POv(e?ZzeJ~xwqey7iHo3UJZNeaAn?e-pvAgm)`E)yzE#J)5{&)Vj zvOL`yEw8QkiI|fbw=HA0xmc6gs`Xmf(U(-O1B_lPa&L_N;NT#`Ij6Yzbn51Hu3 zqY}(7Of-)mES2^({|Y`ne#^>G5q1;9Bl!K<#p#^^J)2+Y3PB>jGL+)u<^?SJb6WSh z_M-i{YV>}%IFa5KF|5rbcyTiH&}qqV9A;B@QtC#w=pnhc7jgGRTU(B}`ULSU0n5<5 z+QV!wSdcRW(xJb*GUR*``KN_Fc`$@t%zUEGyY6JQY@$@qqQ8xvp57Y$@ak=m-tig_ z7Y}{?)UDFZP5YzzHy2ldHMoomc%OQ1iNSL;?E05WtjC5&_x?07z&$1g3k(tmfTgK= zI64-efJLJ=%LC}$o9XH3EIXTb!dHnv~7 z&z`;VVmlG03#Jo(O-4*yM8+UKs;jO(SAB9YpDZ{r6A9OSFc1_JwEE%0hh5zocQu;5 zwpdvE476tZ`MecQBw`#K%?F31FyprSAtx(Eo#vyR{9W^(7$n9|e~?MU{HZ-$Le1@x ziSO527Y(gUc%Rh_$s7tH*M-K(4s~xncl=q3OaNc`V6H&V^G~B@h||YZlg^}FR9@|{SFHxsB}i{J)a(Cj@l_FBB$rBnj)P z2;R2P)QnBb%#3eZ{P@1ZvMpY)^I(*MT{(s|Io`Um#ZBARHs8Tm!Nh&rq+9c*PEs$; z$E{QaxS0F4Emi3<@9;v`*Y>c%Sn-2diXuchOjQImlTu`6XJ@zh{W3$$vPhBrY%@8H zpfw_rMp#Fr4_gY`i|kNe%u&K3(~q7ec6Mj3dFxDjeC_VcfSKiLmx(VI+!D0rTgOja z?cVb@pwk+aa9nt{WizMIEk>PKveKQdkQ>sq4vg~a(@(r-!C+QWeOan^U|ZP+4;i?K zFF=+o54RV)Q=eRJX=(Wk*L7<=zTP`b8K6_;96P-gz~D7#+1JIGqTugD1b0fUBNVh6 zerfb=p>5!W)~M$X62Ta~!^*2!GyO)AxkcaT(7knMCpK<}i7eCM?e zba8@9Z>iAKX?JzRq&BI7E*mc!rSFlg%Euh|w;cdMvib2<m{np+oxevm`(0tWb&)86$urM??-O3nMWb6+b$=k|&8 zVv3WRmP5Ks$>M&Ax{QgP`|ir3=f{4j#hj4wyvAOj*2V$~7Iqz6qc)~vk^R1lS0ktt zffXP`rS~GKV$Nn5&a!q-TX!@`Qg;wjQ&VhwW~}X?{v3DcsulpU6Vq!llfS>7Bzd2@y{KM`x!a{lp%aDrWN>%R zbCKL$OA3h|a5&zy9Ivj>r0so`r4TbbTgc08+n@Zzq~uw*q&MB^l2$g8`);>GdWIOAHj}zRI6+`1vySAoA1`#rqjt|?AI}e4fhC6j<{*_x#&6S`tug+!ZqtHj%yRnEC)BerZO<61n}loACk&fU|a_4qs6 z+qJOhOZy1QQrK~83pd+Vi}E_Eu~ z6FN_lPpd3G4ad?Q!I$eg62y99`wvUMy_y3VoUY@dqKEn-j{|pheUQb%U9#5PAsfq z$JZ7(oyCD_Y8sX1WaNKUuokIGmp&CyNON+fJ$6KhVA3ATF4kps(>&Gb?@NXg_uNiJ zq3OMk?TUIckH)(ECC?zgnZ2!)QX5weZF0Qn7A%&oMiD$fl9|N^xC^h(kl;b^dID1` ze+-r=)#FnmUI|zkq&TmSTahAFl$A>Z{QZZui%s?G=He_AkNjJ8y$+0e2p(&*y|l)p zSV7E1SZXV&@Id6>{XoG!JW^s|GK|M(HQZb5<+}7OQxWwRMpmVwq{N@MH)s%&xO1{| z3NoJ2>fqAYg|VtKWY-tzIsTo}EwjdF@i6TNFRg2Se|y1R#87hkr;f{*k=B!h#dp-Y z_pPovwjqypOEQ5M7PuOz{eWYPK}Gx^t;S*iJy$?PM6@f8JRCeb9H<+1u(zij4NMgX z?=)?k+yD`NB(Lt&-6Nb$sZC>>-}`hcc_f-!TODgRZ2e^7$*_E?y|(|bZdIjsJa|Fu zUi#N}?`!wA4}z(v4!ss8>gsA#zdqdsX=u^J*=|`~;tstC^~fTC5|DcQtcw4@5C0F4 z1K)uA0SS<>ci9FX8_YWQFW)ey~mdevhBO zZ%H4rVRy8*9v#K4ttEC9;?=?45ZR$2EPiuldOC-m6v7Z5A8&E`$iXuT;&aKp+@1^H zJRd+QQ;yav5Z4Qhm;ZMh1$mUxhroNIsQvi{HMO?b)jVn{s;BYz5ZyPn_^uB~)Nlz0 z9&t&}tH`J*V@WEA#s_fSZU)oVrbt9eDqwXfCQ{httNxf?u2#u()+0z1c$IE8NavK3 zM9nG#Wu&Dw#pv<|ax`HS`Hpq({Qb4W=pc9>CEnrjsHv+P*A}*^2?n3c4%$FoQ8rLc zVl}3-Z|zb*Y##qbdUaRfbx0@Qk6vCShIA5UJI{Q4V1~`tV(;s}?fU_NVD^p5hwbmf zYlTDauq$`pB7{I(qxAeygYN@<8MlJubLjziB)soMgMQt>*`TJ&G<7Av8>qb@NI}9v zLthQceWVk9?z}d-SnWMgi{v%$<#6x@37g~Uu$uVs#*=vm?;Vt0EEVzR&!4+%ksh&P z9;NRjNFbMNlTkN~(UX}<(khV}J;sc@eC3a2X2$F>+-!<9d*dG0sj1n$4||elvr*_U zkcIYdf1#D|s$P^#PD-+Fh#aSSPN6n?dC^+u= z)zHwenM81u5nw~Xy)vtj{sYgNJeT$H?lK!ahZ?1L0q99Aq+aK^axT#5alOb$sa1Gr z=(UQ4FF^@q{AS%!BF-zOYcIeG@6 zpY$y>Zl_i7B86n}oF!Gf*1YB=6+P!j(2_mi9Pn_h{0R?0cu)k!E@J>SNEzcR$)I{@I{zv*TLHBLbimi@^Sb){T1_w3V7E%M!q=TsD zoYUK%I{9Zm2_T(YsHfyqk9n5CrWD75JluXDbB&6UvgM0(P{JObkKh(27Nrq|kC&H{ zOTove1K=<3t9ppT&#%y}#m{ep!?~89C;Mk`=2dt5PLoF4$bDV_6`oL;^MmY_V#U4qw||nbBYIJ7J71L0-vzCb{9o?pVs$XAtp8g zh&?PSijAC{T%D{ba}SP`cmkR9+;^c+H3p&HCjkEdd_BamCY_t>ahz9%@xa9clkz}9 zC#vG3M{+a}$i^M78ZM3J#?fE8?NI?20n_vzmxV7J72Pz6%`PEUZG z!VZI_GOqBg(J>CJxCUWV62YOzmA1UnJf@rjO|A;Iapj^Eozk( zd3jfc@*Ifk#WNCkg5EVR$%_|L@gSZ7dQ`>mq>3*ow}EAcP57fUOro7}jL}8{ zV_hCj>A>|+h5!^pRWVqNYv7sx-*w|33m}A5#@pI(_cDS(GfmLv-al#f4D*(c9Pmu^ zvvpIz2q2JGcxUSljfITh&VE~dqt+XXAl(1_^-KQs>n}K5UTDx1td$Hi>7a9v>}%DQ zlJaxSro6}x7^!-TAAQ+sD8u9ZKZVv~BAS(s--KgVHl}{0r=+Cx&o?$U${8DHIE<9p zB)ewM-3!6JZ8DeL`gDILq%$tEnosHd-;~cJVT41o-r7jZiW$tdH_V z^ucXImA*9GGe&WkgHe)R7mcj$`iuTSSFMGGh#$(T=jn2DYnSG1Z51n{05f5~)h>wn z8X~SW(-vt>D&mlir(n`r?1e%fo~=>{hrwAGMvo{Kt;E=h0ACXNwoKiJEJV52~{B!U?wz1|RmH0!f76&WqvYC9oB9&WY9`A3yR% zH+`hJ!>v_(-|58?j8sc?Ydf5{=75s4RnoH29tOX}&T=dbULF0Ii zEvM#CCN=A1;QB{_f1k5|`qcjt{)rHi^Yl+5oD)&HrXVXD3euV8IDU&Xg=pxsb?_Ym zGZqkfs(BH8>AOg5Yor=lVyg{iT(mpej$=0`X}mnFzu#lGF$P&K#Pz*i0Ox#5d@L?K zp}&3&2Cq1G{Se3{!ZT8Ma4aYAG{BbkUCO_7;uQLR9VxsQXXq+h%eIshUX>p>FmHjb zJUJFcBw91Ko{KEBUW3Z;e0bSMZHUBscf-32{~5iHcL1sfhEtZd?gHRC>L&-L?(qr9 zGD~uL{j6rD{Q%~%2ZmO|zJDBub0e4ck>y{q{u*Hb=kNoNM5tUz__sHZGcq_1q(aCx zk8CNIMcrUBxc~OHj{e=i0&cj0vrn?kvwxRTAlVh?1n(YkLM-RGMMLVy;02i~-cOQo z0wVHaK*!+Z0StDkRn_6I8u-);+reNs%e#2NWG*}FWh-V?oeU`IzA$(Pu<@5(4~lR< z*Bpx@-UVDz(6DU`ksAXtvlRrx2i_q7i^;t7wA?;HFEkeS9%DSpzwcS2x;YgXE{K~Y z(RCJ1O|L5g->Puj@*ENu6 z99do8e&HUXfD2?K)%OrevAoiUJIm|^1qER-F&qQB9=R)n1v3eq@elqQ_@O9T~N~4v$U3t}`%Mu#x8OZQ<>gZk=4kgM{=U z7B5GdkCxkg3c&%$tG5JlTCMIp{dm7@AT2Aa+4H9Qc*kY@RUn7uA8KxH6^b$U9}|$! zvW!(aq5jwfkTFE1rKQ~~TXd?aDIJEMaP}0WXJiDT;@&4UNdYzUIckXP*EJjK1(fGq zw1C~T6pV9jaCd#eTX%wI*O5ZCU5z~mgW!_~w-%`>F820}xlCA@XLa}Vq=UFqA}#=Y zX<=bu_Grey&TgDvKtO!E8ndJ?i%>J05!M;zL5Xya1+k;PJC;-DdC!0ME2{~eH1}Wm zZ~-URYUQ4mI=*&SApX<2VuTQWTYo;eoL2`WriSv>py`}mXi-zr(3n9(XkbsZ0O(rE z=*5wm(Yo&6L{GMRa0Gk2(NB_F0?mMFYYZ>W5<4;^TD=Koz1N1Q*`E%|ATS5+rMueA zVP3#yTy)-mmzS3X2J3M{PS(F+3pI;b8Y;@HKG_{9eD(dUR?y_w8|b-EjnPZ?X=AOC zoSl`cfRE>kcS)#@J^u-LVS4nfn!C<}bH(JaZBUbven^0`Fx$*}B3y6<4(Cz5ABw@^ zuc9I^u>DnTQKrcT%5&pNyugkSj>0E4YXn+2%KoZBjq9J$SDa$U`pt(3uB!k2b&(n(1LsZ3 z6~Ke>?dsnY9@gMe7>`Se<Hk`*3B+9YHnzEd` zINNZaD}Vi<3vrgMbTpuIC#}J~LT)gy+9L2{$BW4uUGump%DjRS^PY=@<&nwXg^K|T zZS;c|zfL({gu<(Loac#DJidCleNuTWt{63XC#8Y%Jk*bYyX}fWl3-g_e+B1i0x_-W zS;cKjQ$R)%H=a%16Ukvl+%?Vv>v(wSW%(7-LODl`{0hZ$?-Kwf6S#$Qi!N8nZ7FZ5 zcF9JZ+bAg>HCpI3*b^Yccbx7zV2QXpuq)llxFBSGE&p$lGD-S|8l8Z7i-QEf-KF{v z!wV9sK}uJyI@y81mCt+x{ZQN6jx_w{5x} z*L>hxoS-PDvOy6F@Dz7@GF9>hws2Ld*x1+(?gtN4bLw#s#5R+m(-0v8>RNo-NV6F8 z-mK5A3hk6g+`Ci;5IakK3UPuqP&mTwohPVPl!%x9Mk`$Mi;ObkjPSHDn znKm!!j1{u`BDzt3v13`p0h{f!GqY&3fZI>-4z*10v(rNNoh90JGBPs3_=i7}#I^GC z(-88lt*m@Pla;Dqiv$Zw zgiuvg?fxo5b}$>RlI=;R(sPG^A7S?sr)K=|W7cIs(LHaS#mw)sv&&3RPj?(0>74e; z4>{yKnhUwbcrwiA+;S7|Qilm4q?e5mRdKrpy?I6WT$|Ki`Tx}>L81j)>2}<9megN` z|5X{eNB*43<5z)tv(^(26XC*D$psi9Q5>K2+|K(h@cw7^Y+F!I3O_eJYT{`*s)mMi4=OEiJ?AM;Ycm^m^%a^Sn8I6qoQ0uLI9wFM}uyVd^=mH{9$f0%!W)G z;C{%Y3>f&^lumft0IPP<&&wS;Bwz!j>itm)5Bb9LCmDx4avnJ|w3oRHfhnn6vMdk$ zL>T#IH7*7dRAvmA1TX~q1p(X;VeJE~6W4L7XmQE0oVK4;)l%TI&8`V%Dnarb*&IK5 z6u`Oa()Y0Bb47K;S6tvH26sOHQB}wXqB4Sg@<-qMo+h>Sq-lO z%Te!!zq61o7vbh&k%g{Dm_i+xO(2lp&-_s4w1LoZca0V2D6o`AC*?g^{>rRaKROil2B+}Py!}wHtE&kt0`bim z7lrLPjv@f#1c8YA+dBCh7ff|$s=ci^ZV|xwu}3G@(AnQVB!DrVkfXEh8W$;q^F|yH z_R3Kj=X>#l5Z)(iLCbwR>~$LO^Faa(h37jLa1Cv4`=U;LZW*)aAv6HAISbaHM&i}Q zqc(l#3HE4)U8xE9AfHM`L?5GwsMIe~O9NvG&?jA~kfq^W7f@Q77>Cn4&ylDooE@wEbXHP?f3Ie${IfcVCVG%Fw(BhYC&~Fxd zzrE-aH))NydmRVhp1Y|Z6c>n3g+IMAaH{pu!t9(i5w=807tuG4Gi z&8;mZ1^h9(T&isxgmRFx0VG^UQ^+krWl({=1B!|%mJ_u)x~^0BZp*o4vw$|B)}y## z7(PL2Z2|4ns*wql$K=po2fk(J+_x?QI(n%0BAMtbs7f4P3!<~F&5?jR-Rh?J{^UiN zcKS&{G3yWDsy#DEe#D|z$0Wn18(2BZWU0K6&F6~4V^DNdPxE1?SyIgWSZ!T$ zp|#ubk5%Ij8{tPh{4gy@b#xihAF^Si>sFjnR#oB6`Qa1cXE7OK!^P6<#zP2%F`pbw z%P7G7(hF&4;ox={sPh~>CJmIB5KiKHfL_zb5tE#Z{bF|hVJ-rhUnFTTJ|;b-9Wm2r~3280N@dycwoT3^sM`{Bw{Rl zgKU^mhR@RRytz18eS1V&VyKnq_sOj3^iSB6nHfrI`IVsTX@h9{(aWHGrykx`Zci zK}*hmxd47S{P8{*2L_J3g;+bePCEV$cMXl;U=x)(bw;{49O$9;S~D&Vsgn_bH1pjysJW8V!8*LQ~Y;%;y zLm^bjaNPfd*MJg#4FokY|;_-UH4sK z^3Yt0lGgKuA*|gi|GWZ|Ie6hXW6s;d>-z<-=A(tL_5g{@^&Y-d0yvVj=r^f43fwyI_bI}8sKgZ0d0FY79 zzPH8V`#Z^n4Xl-G&`Q5+6+9}!n!x&7PZ^Z8#JE5>g7|UrbY(idtroLRx$8Uuf;QSi z|C6O~jKNMm@M&V?=xW)jpEup+T`ndf^R3;@a&yMr+LrV|40dNkxW%TG6S`T9LTG-M zezTU`G`1OX!5N?X`({Mhwv$bT|`8hlLX~Pd6X%K>87j$8tKs6$paBiX_0Mi~ zO62`10PS%gUaA}Q%zt8Q>;fQdFz+I+?}ws0?5*7*>9MwY7?QdK@R8 zomdeENyoq-G+!&4Wb|HJ=epXBY^ww)4-f&TsKe*`L#{#TihDA1eHe<%Xl#O8kFZ~7m0 zVFxfGY^^eTI?N$@13Gby{+QGRNjJx?GTx03SYD?;&cbnU!=3wh5W*E(fKwja<>U-M z=P{OdegvRwjE4#gWI&f4+;FPl9k0t80@lNCJNZZ$d_Lvj@Xi)I!=UGxzdsQXX_%gF zue>;NgE!V5=^|%AYh|9FkvGWgn}mQ;OboRhT)~6nn`>_TPJPn-MVeR>G#*~PdB5K6 z$d^o<1EroDwzE8tyyX!Q5g|L@k%*m(w~3NrKoZ7*?%5@ehFjWWqgo4wOY6Eez6F%9CVS?)hf{zA99wWvT5gyclN5Q z@Xr3YHY7RyRWg?z3W1!~aNVS$Vgu!q&w!N?w&^hvuhDg5LkU#ol!Jyav+-)T6B**@ zuAy&UR1Q*^%_my|t(9U;i-$mC9)?i$s$a$7 zDZsMG9qz63;LsUpC{!r5nXop``}L8=Ad0laT3&3k`HuacMrvI4*GBI9B2zgM0OFX2 zeW*@l?;?L}_uj{q@W#T)W#7#?>La70Dbe{=txTsEbuTNX8lp1p({J#5g3zDl&Jg0= zqa@hU^;O0Q^eJY%uYu?3Zh|(ihe4w-UfwoxKT>w(gwTiU)jgsDOibU~Jk8qGb$lsB zGgV*4jPi0Qf$a9q1YPrIH$B5$<}Sj%LKA5Q)e0NNg^T=@@o)XD z{J~y2nx!J`35=o|g2K6qa6-5c4;JfuaBs$sYdFHJ)Zjp3mz|iHGz^cL@4;gQi{h{u zVST}z?|+B=o=zfPw|{#1V0MH{vyvOt+MT-8#XIhogL%j*A3bMx{f1Q0b60|7CWt7g z8<+hq>s$MJPzY|OD6Jh&=8l{&Q!;44hV3dD*#=~6hC8>L{(+QD!!G%-lcOie-NP0r zM?zxqON{p(2x}tLv0jNSv;gxEX(P1-GdSp>jsIpb6R3c}Vvy`C$az({v$ZTsu?TJK zX;%KL9DNha3TCd0;rmP{Q{6zWfWD2gIi8!_$zHhO6>c39RuQy?t3rQo{!n0ozx$fjp| z6?Ia~XNauGW42ut4fF1wX?XHBO*_bSF><)MqD1lijrdQ)xsU4qNoYNRgF`@PMsTgu z+1kyd*XkQvmp+@VlLfiSQt7sR(9=s$@1K8fWnv7R-J|CT{X|3gcsc&!(B^6?;x4zu zQEu`zN^?o|fe2TM^2&^#a;RUbj^TTDI16EEpuF&0UoQ4;#DqNuycB49`(=mOs+?-` zi*UezeH&UD6;&4D4+)318>Ac9)3K-TGW~nbR!h|^c10+GU7K_+F24l(DtM*26{e(u z>Zz2Aa8wQsCv7R{ejs-d{t*BsrKxJ_e**B)iinED;0(#i7;TAZgB9si-fnq#L?}&3 zYZ*=)*C-p1rm+}0yHCsc?bBCNPjjY!TVv`ob0E!TX(f?h5k=u*h{bf|R2Ox`YE)3e zwR%j=qHo@z<_n4odrv5HjmaQeyimXc#(tJL%1z3?ZrSPmC zea>G9>pm9wVZIMhv*m=ruW~N`n`FMLo84a5g&_|vyH)bET5b7tE(RWklMMf3PsW7hbCQAEju;))G5;5`JE!uu(QCEqLl6p z=S)C&;aNcV9O2W%gYH}rIlCz~&)EDvp`~rCtb_1f0feN`7jnp`e=KMH<&amR5jq@4 zUL2w8{I<6THk_W5CS(!n;`86=duVzazO_&IV!4l(NnXozp*vSKts;SrfoY2Alz;1= zMdEo$ow=N*rfBRY3mLtQ>Tp!^L%%3I`za?Jfs~hT?Kr9P?1`~8>*A1%Ym$j;IE;8o zK8Nz>J;~lXdR`!QZWf?BA!Nag{ICJT7f$0sg zD<}?jr$olSFs-Gx_iPt8YKZOkTSQhObui2Pfmiq+b3TAJ^tvxDFBy>-8~0qJqOiWQ zjaRRC4Gno2dm#Uw6c(RUUnxSHUKfh;3@36ev-lLIA(^~&iCM~Ge z1IF03k=L+kHttDG_qc8o@jc^eK1)2GGEkM-^bf7b;? zSllzQ(4wOTlGeT_c$2<#$+v?$uR}r~k-2(t{Ll%yA_K>N0X;#o5^@$DUt&L^2Y2a<#IQ0W)`uz9^SjB-+IqtwjOE`Oc zp6%^jlt;dvP6+Z!y}Y>UZvfOMIgjmeWr6y8|Kn+t+2|>ATw892(yb5g--iZ4D`myc zjvY_|voAm$%BVL>b?zmTdu1xfI$l=jk=;+^GYjLh8AmYRxnne#uV3geuZ;P%OpNP| zIXT>cW!lOsDn?l3)u;n1UKRTQoFU=$I(9YdPW$ll=g;%59>B{)eHx;!28AOWX>7v2 ziz8n^;x}8J45og?iy94T;q0J|-e=Kns}HUxhhw#Vz9+{uETaPEU{|hOY4hp{)k*{% z!0Vf!!@Kn(4a^X{{rc_OR=WkK%ujYe#nH&CB~QCd85~}?2Tp77dhXj6<=tMZJM(e_ zCuWRJj}PYlxQn-gI@ox(oyS8l?tTgtQ6@dFgLKQm{KwF`V|yAg_hQSj%D&M~ar{?A zRmqE>Ee{ErBs!LjjEr`{h8=-+e6HKkdEI5rpf`TGT31)s8rQt2k|@&WrtR!pDhBHR zr=YNBwd3?>kTzIMTdtQ)B=WY(6etZ zx5HR%JTFniDGUgpKyNuKCr1(2>;$`&h4Ec^0Z}I+m#_yZ{}x_+M8r$1b4@Ms$Qkns ztHP)8ZE3e)M!XkYU5#K z>&#Hzd`8g=+z}kmq!9C!cjwhdTvsJnR20!>8JXsZk4~wjW+dy)8Z?GL$QzKDbJQ=e z$OOC!=UwtTVIGgFt9p4izmBTYnRaNqH*;{Kq z8@azw_y{1tbWoGwwHoGoG3gHIJS{Q4e%22G}N;LMDY ztn2<%fRYN=>X=_#^aW7OcG4`jO~g+hixy zvo(;Cvu$e0#2VlTr&0slyH^2woPqxX0It=C&MW!ugSxquC*MZE>663|VW*{t6PLQ9 zL^IZFl$1twYn96@0O>{rkBp2tk67)3QRB}B;`uF%$Ac82xa`JpdXFD}+SFhPlKM&b tarU_@G5;T3$$uSe`#<>C_sho;84l4OzIB{d0;dd-lU9~OOTK#hzW`#(g~I>< literal 14198 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 UZ&4eNdms>5DW#W%FW&n9FN;kgZU6uP diff --git a/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb b/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb index 66c3ce85c0..2ef7dee801 100644 --- a/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb +++ b/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb @@ -10,8 +10,8 @@ "\n", "**Author:** Mansi Mehta
\n", "**Date created:** 26/11/2025
\n", - "**Last modified:** 26/11/2025
\n", - "**Description:** Recommender System with Ranking and Retrival model for Marketing interaction." + "**Last modified:** 06/12/2025
\n", + "**Description:** Recommender System with Ranking and Retrieval model for Marketing interaction." ] }, { @@ -80,7 +80,7 @@ }, "outputs": [], "source": [ - "!!pip install -q keras-rs" + "!pip install -q keras-rs" ] }, { @@ -100,13 +100,11 @@ "import tensorflow as tf\n", "import pandas as pd\n", "import keras_rs\n", - "import tensorflow_datasets as tfds\n", - "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", + "\n", "from keras import layers\n", "from concurrent.futures import ThreadPoolExecutor\n", "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import MinMaxScaler\n", - "" + "from sklearn.preprocessing import MinMaxScaler\n" ] }, { @@ -127,7 +125,6 @@ "outputs": [], "source": [ "!pip install -q kaggle\n", - "!# Download the dataset (requires Kaggle API key in ~/.kaggle/kaggle.json)\n", "!kaggle datasets download -d mafrojaakter/ad-click-data --unzip -p ./ad_click_dataset" ] }, @@ -139,7 +136,7 @@ }, "outputs": [], "source": [ - "data_path = \"./ad_click_dataset/Ad_click_data.csv\"\n", + "data_path = \"./ad_click_dataset/Ad Click Data.csv\"\n", "if not os.path.exists(data_path):\n", " # Fallback for filenames with spaces or different casing\n", " data_path = \"./ad_click_dataset/Ad Click Data.csv\"\n", @@ -193,16 +190,17 @@ " continuous_features_list,\n", "):\n", "\n", - " # Filter for Positive Interactions (Cicks)\n", + " # Filter for Positive Interactions (Clicks)\n", " positive_interactions = data_df[data_df[\"Clicked on Ad\"] == 1].copy()\n", "\n", " if positive_interactions.empty:\n", " return None\n", "\n", " def sample_negative(positive_ad_id):\n", - " neg_ad_id = positive_ad_id\n", - " while neg_ad_id == positive_ad_id:\n", - " neg_ad_id = np.random.choice(all_ad_ids)\n", + " all_ad_ids_filtered = [aid for aid in all_ad_ids if aid != positive_ad_id]\n", + " if not all_ad_ids_filtered:\n", + " return positive_ad_id\n", + " neg_ad_id = np.random.choice(all_ad_ids_filtered)\n", " return neg_ad_id\n", "\n", " def create_triplets_row(pos_row):\n", @@ -224,7 +222,7 @@ " \"negative_ad\": neg_ad_features_dict,\n", " }\n", "\n", - " with ThreadPoolExecutor(max_workers=8) as executor:\n", + " with ThreadPoolExecutor(max_workers=os.cpu_count() or 8) as executor:\n", " triplets = list(\n", " executor.map(\n", " create_triplets_row, positive_interactions.itertuples(index=False)\n", @@ -315,7 +313,7 @@ "colab_type": "text" }, "source": [ - "# **Implement the Retrival Model**\n", + "# **Implement the Retrieval Model**\n", "For the Retrieval stage, we will build a Two-Tower Model.\n", "\n", "**The Architecture Components:**\n", @@ -391,15 +389,14 @@ "ad_tower = build_tower([\"ad_id\", \"ad_topic\"], name=\"ad_tower\")\n", "\n", "\n", - "def bpr_hinge_loss(y_true, y_pred):\n", - " margin = 1.0\n", + "def pairwise_logistic_loss(y_true, y_pred):\n", " return -tf.math.log(tf.nn.sigmoid(y_pred) + 1e-10)\n", "\n", "\n", "class RetrievalModel(keras.Model):\n", " def __init__(self, user_tower_instance, ad_tower_instance, **kwargs):\n", " super().__init__(**kwargs)\n", - " self.user_tower = user_tower\n", + " self.user_tower = user_tower_instance\n", " self.ad_tower = ad_tower\n", " self.ln_user = layers.LayerNormalization()\n", " self.ln_ad = layers.LayerNormalization()\n", @@ -421,12 +418,12 @@ "\n", "retrieval_model = RetrievalModel(user_tower, ad_tower)\n", "retrieval_model.compile(\n", - " optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=bpr_hinge_loss\n", + " optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=pairwise_logistic_loss\n", ")\n", "history = retrieval_model.fit(retrieval_train_dataset, epochs=30)\n", "\n", "pd.DataFrame(history.history).plot(\n", - " subplots=True, layout=(1, 3), figsize=(12, 4), title=\"Retrival Model Metrics\"\n", + " subplots=True, layout=(1, 3), figsize=(12, 4), title=\"Retrieval Model Metrics\"\n", ")\n", "plt.show()" ] @@ -437,10 +434,8 @@ "colab_type": "text" }, "source": [ - "# **Predictions of Retrival Model**\n", - "Two-Tower model is trained, we need to use it to generate candidates.\n", - "\n", - "We can implement inference pipeline using three steps:\n", + "# **Predictions of Retrieval Model**\n", + "We can implement inference pipeline for retrieval Model using three steps:\n", "1. Indexing: We can run the Item Tower once for all available ads to generate their\n", "embeddings.\n", "2. Query Encoding: When a user arrives, we pass their features through the User Tower to\n", @@ -527,7 +522,7 @@ "# **Implementation of Ranking Model**\n", "Retrieval model only calculates a simple similarity score (Dot Product). It doesn't\n", "account for complex feature interactions.\n", - "So we need to build ranking model after words retrival model.\n", + "So we need to build ranking model after words retrieval model.\n", "\n", "**Architecture**\n", "1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the\n", @@ -535,7 +530,7 @@ "change.\n", "2. **Interaction:** Instead of just a dot product, we concatenate three inputs- The User\n", "EmbeddingThe Ad EmbeddingThe Dot Product (Similarity)\n", - "3. **Scorer(MLP):** These concatenated inputs are fed into a Multi-Layer Perceptron\u2014a\n", + "3. **Scorer(MLP):** These concatenated inputs are fed into a Multi-Layer Perceptron—a\n", "stack of Dense layers. This network learns the non-linear relationships between the user\n", "and the ad.\n", "4. **Output:** The final layer uses a Sigmoid activation to output a single probability\n", @@ -659,10 +654,10 @@ "top_ads = retrieval_engine.decode_results(scores, indices)[0]\n", "final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model)\n", "print(f\"User: {sample_user['user_id']}\")\n", - "print(f\"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}\")\n", + "print(f\"{'Ad ID':<10} | {'Topic':<30} | {'Retrieval Score':<11} | {'Rank Probability'}\")\n", "for item in final_ranked_ads:\n", " print(\n", - " f\"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} |{item['ranking_score']*100:.2f}%\"\n", + " f\"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} | {item['ranking_score']*100:.2f}%\"\n", " )" ] } @@ -696,4 +691,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} \ No newline at end of file +} diff --git a/examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md b/examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md index 87c31267c8..5053f8d9f4 100644 --- a/examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md +++ b/examples/keras_rs/md/two_stage_rs_with_marketing_interaction.md @@ -2,8 +2,8 @@ **Author:** Mansi Mehta
**Date created:** 26/11/2025
-**Last modified:** 26/11/2025
-**Description:** Recommender System with Ranking and Retrival model for Marketing interaction. +**Last modified:** 06/12/2025
+**Description:** Recommender System with Ranking and Retrieval model for Marketing interaction. [**View in Colab**](https://colab.research.google.com/github/keras-team/keras-io/blob/master/examples/keras_rs/ipynb/two_stage_rs_with_marketing_interaction.ipynb) [**GitHub source**](https://github.com/keras-team/keras-io/blob/master/examples/keras_rs/two_stage_rs_with_marketing_interaction.py) @@ -32,7 +32,8 @@ A Deep Neural Network (MLP). Interaction: It takes the User Embedding, Ad Embedding, and their similarity score to predict a precise probability (0% to 100%) that the user will click. -![jpg](/img/examples/keras_rs/two_stage_rs_with_marketing_interaction/architecture.jpg) +![jpg](examples/keras_rs/img/two_stage_rs_with_marketing_interaction/architecture.jpg) + # **Dataset** We will use the [Ad Click @@ -56,11 +57,10 @@ recommendations for a specific user. ```python -!!pip install -q keras-rs +!pip install -q keras-rs ``` - ```python import os @@ -71,54 +71,27 @@ import numpy as np import tensorflow as tf import pandas as pd import keras_rs -import tensorflow_datasets as tfds -from mpl_toolkits.axes_grid1 import make_axes_locatable + from keras import layers from concurrent.futures import ThreadPoolExecutor from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler ``` -

# **Preparing Dataset** ```python !pip install -q kaggle -!# Download the dataset (requires Kaggle API key in ~/.kaggle/kaggle.json) !kaggle datasets download -d mafrojaakter/ad-click-data --unzip -p ./ad_click_dataset ``` - -
-``` -[notice] To update, run: pip install --upgrade pip - -Dataset URL: https://www.kaggle.com/datasets/mafrojaakter/ad-click-data -License(s): unknown - -Downloading ad-click-data.zip to ./ad_click_dataset -``` -
- - 0%| | 0.00/37.6k [00:00 +``` +['Dataset URL: https://www.kaggle.com/datasets/mafrojaakter/ad-click-data', + 'License(s): unknown', + 'Downloading ad-click-data.zip to ./ad_click_dataset', + '', + ' 0%| | 0.00/37.6k [00:00 -# **Implement the Retrival Model** +# **Implement the Retrieval Model** For the Retrieval stage, we will build a Two-Tower Model. **The Architecture Components:** @@ -357,15 +342,14 @@ user_tower = build_tower( ad_tower = build_tower(["ad_id", "ad_topic"], name="ad_tower") -def bpr_hinge_loss(y_true, y_pred): - margin = 1.0 +def pairwise_logistic_loss(y_true, y_pred): return -tf.math.log(tf.nn.sigmoid(y_pred) + 1e-10) class RetrievalModel(keras.Model): def __init__(self, user_tower_instance, ad_tower_instance, **kwargs): super().__init__(**kwargs) - self.user_tower = user_tower + self.user_tower = user_tower_instance self.ad_tower = ad_tower self.ln_user = layers.LayerNormalization() self.ln_ad = layers.LayerNormalization() @@ -387,12 +371,12 @@ class RetrievalModel(keras.Model): retrieval_model = RetrievalModel(user_tower, ad_tower) retrieval_model.compile( - optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=bpr_hinge_loss + optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=pairwise_logistic_loss ) history = retrieval_model.fit(retrieval_train_dataset, epochs=30) pd.DataFrame(history.history).plot( - subplots=True, layout=(1, 3), figsize=(12, 4), title="Retrival Model Metrics" + subplots=True, layout=(1, 3), figsize=(12, 4), title="Retrieval Model Metrics" ) plt.show() ``` @@ -401,123 +385,123 @@ plt.show() ``` Epoch 1/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 2s 2ms/step - loss: 2.8117 +6/6 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step - loss: 2.8780 Epoch 2/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 1.3631 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 1.3763 Epoch 3/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 1.0918 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 1.1240 Epoch 4/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.9143 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 975us/step - loss: 0.9370 Epoch 5/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.7872 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.8033 Epoch 6/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.6925 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.7029 Epoch 7/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.6203 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 979us/step - loss: 0.6264 Epoch 8/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.5641 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 992us/step - loss: 0.5672 Epoch 9/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.5190 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.5200 Epoch 10/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.4817 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.4814 Epoch 11/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.4499 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.4487 Epoch 12/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.4220 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.4201 Epoch 13/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 8ms/step - loss: 0.3970 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 942us/step - loss: 0.3948 Epoch 14/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 6ms/step - loss: 0.3743 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 943us/step - loss: 0.3719 Epoch 15/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.3537 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 952us/step - loss: 0.3510 Epoch 16/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - loss: 0.3346 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 961us/step - loss: 0.3318 Epoch 17/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.3171 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 979us/step - loss: 0.3142 Epoch 18/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.3009 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 935us/step - loss: 0.2979 Epoch 19/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2858 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 900us/step - loss: 0.2828 Epoch 20/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2718 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 915us/step - loss: 0.2687 Epoch 21/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2587 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 922us/step - loss: 0.2556 Epoch 22/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2465 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 970us/step - loss: 0.2434 Epoch 23/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2350 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 950us/step - loss: 0.2320 Epoch 24/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2243 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step - loss: 0.2212 Epoch 25/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2142 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 957us/step - loss: 0.2111 Epoch 26/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.2046 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 911us/step - loss: 0.2016 Epoch 27/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1956 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 907us/step - loss: 0.1926 Epoch 28/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1871 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 890us/step - loss: 0.1842 Epoch 29/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1791 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 964us/step - loss: 0.1762 Epoch 30/30 -6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - loss: 0.1715 +6/6 ━━━━━━━━━━━━━━━━━━━━ 0s 987us/step - loss: 0.1686 ``` @@ -525,10 +509,8 @@ Epoch 30/30 -# **Predictions of Retrival Model** -Two-Tower model is trained, we need to use it to generate candidates. - -We can implement inference pipeline using three steps: +# **Predictions of Retrieval Model** +We can implement inference pipeline for retrieval Model using three steps: 1. Indexing: We can run the Item Tower once for all available ads to generate their embeddings. 2. Query Encoding: When a user arrives, we pass their features through the User Tower to @@ -602,7 +584,7 @@ top_ads = retrieval_engine.decode_results(scores, indices)[0] # **Implementation of Ranking Model** Retrieval model only calculates a simple similarity score (Dot Product). It doesn't account for complex feature interactions. -So we need to build ranking model after words retrival model. +So we need to build ranking model after words retrieval model. **Architecture** 1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the @@ -680,83 +662,83 @@ ranking_model.evaluate(ranking_test_dataset) ``` Epoch 1/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 1s 5ms/step - AUC: 0.6079 - accuracy: 0.4961 - loss: 0.6890 +3/3 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - AUC: 0.6864 - accuracy: 0.5215 - loss: 0.6704 Epoch 2/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.8329 - accuracy: 0.5748 - loss: 0.6423 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.8450 - accuracy: 0.6689 - loss: 0.6268 Epoch 3/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step - AUC: 0.9284 - accuracy: 0.7467 - loss: 0.5995 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9313 - accuracy: 0.7846 - loss: 0.5877 Epoch 4/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9636 - accuracy: 0.8766 - loss: 0.5599 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9635 - accuracy: 0.8427 - loss: 0.5578 Epoch 5/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9763 - accuracy: 0.9213 - loss: 0.5229 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9785 - accuracy: 0.9075 - loss: 0.5191 Epoch 6/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9824 - accuracy: 0.9304 - loss: 0.4876 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9877 - accuracy: 0.9306 - loss: 0.4860 Epoch 7/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9862 - accuracy: 0.9331 - loss: 0.4540 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9882 - accuracy: 0.9368 - loss: 0.4592 Epoch 8/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9880 - accuracy: 0.9357 - loss: 0.4224 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9923 - accuracy: 0.9417 - loss: 0.4261 Epoch 9/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9898 - accuracy: 0.9436 - loss: 0.3920 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9926 - accuracy: 0.9480 - loss: 0.3950 Epoch 10/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9911 - accuracy: 0.9475 - loss: 0.3633 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9941 - accuracy: 0.9494 - loss: 0.3702 Epoch 11/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9914 - accuracy: 0.9528 - loss: 0.3361 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9950 - accuracy: 0.9603 - loss: 0.3443 Epoch 12/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9923 - accuracy: 0.9580 - loss: 0.3103 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9952 - accuracy: 0.9640 - loss: 0.3225 Epoch 13/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9925 - accuracy: 0.9619 - loss: 0.2866 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9956 - accuracy: 0.9693 - loss: 0.2917 Epoch 14/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9931 - accuracy: 0.9633 - loss: 0.2643 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9960 - accuracy: 0.9689 - loss: 0.2667 Epoch 15/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9935 - accuracy: 0.9633 - loss: 0.2436 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9963 - accuracy: 0.9685 - loss: 0.2506 Epoch 16/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9938 - accuracy: 0.9659 - loss: 0.2247 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9962 - accuracy: 0.9660 - loss: 0.2298 Epoch 17/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9942 - accuracy: 0.9646 - loss: 0.2076 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9963 - accuracy: 0.9724 - loss: 0.2133 Epoch 18/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step - AUC: 0.9945 - accuracy: 0.9659 - loss: 0.1918 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9959 - accuracy: 0.9696 - loss: 0.1973 Epoch 19/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9947 - accuracy: 0.9672 - loss: 0.1777 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9966 - accuracy: 0.9683 - loss: 0.1819 Epoch 20/20 -3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 4ms/step - AUC: 0.9953 - accuracy: 0.9685 - loss: 0.1645 +3/3 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step - AUC: 0.9955 - accuracy: 0.9665 - loss: 0.1645 ``` @@ -767,9 +749,9 @@ Epoch 20/20
``` -1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 230ms/step - AUC: 0.9904 - accuracy: 0.9476 - loss: 0.2319 +1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 110ms/step - AUC: 0.9908 - accuracy: 0.9634 - loss: 0.2025 -[0.2318607121706009, 0.9903508424758911, 0.9476439952850342] +[0.20246028900146484, 0.9908442497253418, 0.963350772857666] ```
@@ -811,26 +793,26 @@ scores, indices = retrieval_engine.query_batch(pd.DataFrame([sample_user])) top_ads = retrieval_engine.decode_results(scores, indices)[0] final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model) print(f"User: {sample_user['user_id']}") -print(f"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}") +print(f"{'Ad ID':<10} | {'Topic':<30} | {'Retrieval Score':<11} | {'Rank Probability'}") for item in final_ranked_ads: print( - f"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} |{item['ranking_score']*100:.2f}%" + f"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} | {item['ranking_score']*100:.2f}%" ) ```
``` User: user_216 -Ad ID | Topic | Retrival Score | Rank Probability -ad_305 | Front-line fault-tolerant in | 8.2131 |99.27% -ad_318 | Front-line upward-trending g | 7.6231 |99.17% -ad_758 | Right-sized multi-tasking so | 7.1814 |99.06% -ad_767 | Robust object-oriented Graph | 7.2068 |99.02% -ad_620 | Polarized modular function | 7.2857 |98.92% -ad_522 | Open-architected full-range | 7.0892 |98.82% -ad_771 | Robust web-enabled attitude | 7.3828 |98.81% -ad_810 | Sharable optimal capacity | 6.7046 |98.69% -ad_31 | Ameliorated well-modulated c | 6.9498 |98.40% -ad_104 | Configurable 24/7 hub | 6.7244 |98.39% +Ad ID | Topic | Retrieval Score | Rank Probability +ad_916 | Universal multi-state system | 6.7579 | 98.97% +ad_853 | Synergistic asynchronous sup | 7.0611 | 98.75% +ad_424 | Inverse discrete extranet | 6.6511 | 98.62% +ad_716 | Reactive bi-directional stan | 4.6533 | 98.51% +ad_861 | Synergized clear-thinking pr | 5.5220 | 98.49% +ad_981 | Vision-oriented asynchronous | 4.8622 | 98.34% +ad_842 | Synchronized full-range port | 4.8333 | 98.32% +ad_565 | Organic asynchronous hierarc | 4.6900 | 98.25% +ad_825 | Stand-alone tangible moderat | 4.7890 | 98.12% +ad_327 | Fully-configurable high-leve | 4.5719 | 97.52% ```
diff --git a/examples/keras_rs/two_stage_rs_with_marketing_interaction.py b/examples/keras_rs/two_stage_rs_with_marketing_interaction.py index b2c1e572ca..036debe0f7 100644 --- a/examples/keras_rs/two_stage_rs_with_marketing_interaction.py +++ b/examples/keras_rs/two_stage_rs_with_marketing_interaction.py @@ -2,8 +2,8 @@ Title: Two Stage Recommender System with Marketing Interaction Author: Mansi Mehta Date created: 26/11/2025 -Last modified: 26/11/2025 -Description: Recommender System with Ranking and Retrival model for Marketing interaction. +Last modified: 06/12/2025 +Description: Recommender System with Ranking and Retrieval model for Marketing interaction. Accelerator: GPU """ @@ -56,7 +56,7 @@ """ """shell -!pip install -q keras-rs +# !pip install -q keras-rs """ import os @@ -68,8 +68,7 @@ import tensorflow as tf import pandas as pd import keras_rs -import tensorflow_datasets as tfds -from mpl_toolkits.axes_grid1 import make_axes_locatable + from keras import layers from concurrent.futures import ThreadPoolExecutor from sklearn.model_selection import train_test_split @@ -81,11 +80,11 @@ """ """shell -pip install -q kaggle -# Download the dataset (requires Kaggle API key in ~/.kaggle/kaggle.json) -kaggle datasets download -d mafrojaakter/ad-click-data --unzip -p ./ad_click_dataset +!pip install -q kaggle +!kaggle datasets download -d mafrojaakter/ad-click-data --unzip -p ./ad_click_dataset """ -data_path = "./ad_click_dataset/Ad_click_data.csv" + +data_path = "./ad_click_dataset/Ad Click Data.csv" if not os.path.exists(data_path): # Fallback for filenames with spaces or different casing data_path = "./ad_click_dataset/Ad Click Data.csv" @@ -139,16 +138,17 @@ def create_retrieval_dataset( continuous_features_list, ): - # Filter for Positive Interactions (Cicks) + # Filter for Positive Interactions (Clicks) positive_interactions = data_df[data_df["Clicked on Ad"] == 1].copy() if positive_interactions.empty: return None def sample_negative(positive_ad_id): - neg_ad_id = positive_ad_id - while neg_ad_id == positive_ad_id: - neg_ad_id = np.random.choice(all_ad_ids) + all_ad_ids_filtered = [aid for aid in all_ad_ids if aid != positive_ad_id] + if not all_ad_ids_filtered: + return positive_ad_id + neg_ad_id = np.random.choice(all_ad_ids_filtered) return neg_ad_id def create_triplets_row(pos_row): @@ -170,7 +170,7 @@ def create_triplets_row(pos_row): "negative_ad": neg_ad_features_dict, } - with ThreadPoolExecutor(max_workers=8) as executor: + with ThreadPoolExecutor(max_workers=os.cpu_count() or 8) as executor: triplets = list( executor.map( create_triplets_row, positive_interactions.itertuples(index=False) @@ -255,7 +255,7 @@ def create_triplets_row(pos_row): ) """ -# **Implement the Retrival Model** +# **Implement the Retrieval Model** For the Retrieval stage, we will build a Two-Tower Model. **The Architecture Components:** @@ -323,15 +323,14 @@ def build_tower(feature_names, continuous_names=None, embed_dim=64, name="tower" ad_tower = build_tower(["ad_id", "ad_topic"], name="ad_tower") -def bpr_hinge_loss(y_true, y_pred): - margin = 1.0 +def pairwise_logistic_loss(y_true, y_pred): return -tf.math.log(tf.nn.sigmoid(y_pred) + 1e-10) class RetrievalModel(keras.Model): def __init__(self, user_tower_instance, ad_tower_instance, **kwargs): super().__init__(**kwargs) - self.user_tower = user_tower + self.user_tower = user_tower_instance self.ad_tower = ad_tower self.ln_user = layers.LayerNormalization() self.ln_ad = layers.LayerNormalization() @@ -353,20 +352,18 @@ def get_embeddings(self, inputs): retrieval_model = RetrievalModel(user_tower, ad_tower) retrieval_model.compile( - optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=bpr_hinge_loss + optimizer=keras.optimizers.Adam(learning_rate=1e-3), loss=pairwise_logistic_loss ) history = retrieval_model.fit(retrieval_train_dataset, epochs=30) pd.DataFrame(history.history).plot( - subplots=True, layout=(1, 3), figsize=(12, 4), title="Retrival Model Metrics" + subplots=True, layout=(1, 3), figsize=(12, 4), title="Retrieval Model Metrics" ) plt.show() """ -# **Predictions of Retrival Model** -Two-Tower model is trained, we need to use it to generate candidates. - -We can implement inference pipeline using three steps: +# **Predictions of Retrieval Model** +We can implement inference pipeline for retrieval Model using three steps: 1. Indexing: We can run the Item Tower once for all available ads to generate their embeddings. 2. Query Encoding: When a user arrives, we pass their features through the User Tower to @@ -439,7 +436,7 @@ def decode_results(self, scores, indices): # **Implementation of Ranking Model** Retrieval model only calculates a simple similarity score (Dot Product). It doesn't account for complex feature interactions. -So we need to build ranking model after words retrival model. +So we need to build ranking model after words retrieval model. **Architecture** 1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the @@ -549,8 +546,8 @@ def rerank_ads_for_user(user_row, retrieved_ads, ranking_model): top_ads = retrieval_engine.decode_results(scores, indices)[0] final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model) print(f"User: {sample_user['user_id']}") -print(f"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}") +print(f"{'Ad ID':<10} | {'Topic':<30} | {'Retrieval Score':<11} | {'Rank Probability'}") for item in final_ranked_ads: print( - f"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} |{item['ranking_score']*100:.2f}%" + f"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} | {item['ranking_score']*100:.2f}%" ) diff --git a/two_stage_rs_with_marketing_interaction.ipynb b/two_stage_rs_with_marketing_interaction.ipynb deleted file mode 100644 index cb1843b016..0000000000 --- a/two_stage_rs_with_marketing_interaction.ipynb +++ /dev/null @@ -1,1126 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "# **Introduction**\n", - "\n", - "This tutorial demonstrates a critical business scenario: a user lands on a website, and a marketing engine must decide which specific ad to display from an inventory of thousands.\n", - "The goal is to maximize the Click-Through Rate (CTR). Showing irrelevant ads wastes marketing budget and annoys the user. Therefore, we need a system that predicts the probability of a specific user clicking on a specific ad based on their demographics and browsing habits.\n", - "\n", - "**Architecture**\n", - "1. **The Retrieval Stage:** Efficiently select an initial set of roughly 10-100 candidates from millions of possibilities. It weeds out items the user is definitely not interested in.\n", - "User Tower: Embeds user features (ID, demographics, behavior) into a vector.\n", - "Item Tower: Embeds ad features (Ad ID, Topic) into a vector.\n", - "Interaction: The dot product of these two vectors represents similarity.\n", - "2. **The Ranking Stage:** It takes the output of the retrieval model and fine-tune the order to select the single best ad to show.\n", - "A Deep Neural Network (MLP).\n", - "Interaction: It takes the User Embedding, Ad Embedding, and their similarity score to predict a precise probability (0% to 100%) that the user will click.\n", - "\n", - "![marketing_usecase.jpg](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QBoRXhpZgAASUkqAAgAAAACADEBAgAHAAAAJgAAAGmHBAABAAAALgAAAAAAAABQaWNhc2EAAAIAAJAHAAQAAAAwMjIwA5ACABQAAABMAAAAAAAAADIwMjU6MTE6MjQgMTU6MDE6NTYA/+EDH2h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS41LjAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczpJcHRjNHhtcEV4dD0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcEV4dC8yMDA4LTAyLTI5LyIgZXhpZjpEYXRlVGltZU9yaWdpbmFsPSIyMDI1LTExLTI0VDE1OjAxOjU2KzAwOjAwIiBwaG90b3Nob3A6Q3JlZGl0PSJNYWRlIHdpdGggR29vZ2xlIEFJIiBwaG90b3Nob3A6RGF0ZUNyZWF0ZWQ9IjIwMjUtMTEtMjRUMTU6MDE6NTYrMDA6MDAiIElwdGM0eG1wRXh0OkRpZ2l0YWxTb3VyY2VmaWxlVHlwZT0iaHR0cDovL2N2LmlwdGMub3JnL25ld3Njb2Rlcy9kaWdpdGFsc291cmNldHlwZS90cmFpbmVkQWxnb3JpdGhtaWNNZWRpYSIgSXB0YzR4bXBFeHQ6RGlnaXRhbFNvdXJjZVR5cGU9Imh0dHA6Ly9jdi5pcHRjLm9yZy9uZXdzY29kZXMvZGlnaXRhbHNvdXJjZXR5cGUvdHJhaW5lZEFsZ29yaXRobWljTWVkaWEiLz4gPC9yZGY6UkRGPiA8L3g6eG1w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)" - ], - "metadata": { - "id": "y5jO6Y78Vf-N" - } - }, - { - "cell_type": "markdown", - "source": [ - "# **Dataset**\n", - "We will use the [Ad Click Prediction](https://www.kaggle.com/datasets/mafrojaakter/ad-click-data) Dataset from Kaggle\n", - "\n", - "**Feature Distribution of dataset:**\n", - "User Tower describes who is looking and features contains i.e Gender, City, Country, Age, Daily Internet Usage, Daily Time Spent on Site, and Area Income.\n", - "Item Tower describes what is being shown and features contains Ad Topic Line, Ad ID.\n", - "\n", - "In this tutorial, we are going to build and train a Two-Tower (User Tower and Ad Tower) model using the Ad Click Prediction dataset from Kaggle.\n", - "We're going to:\n", - "1. **Data Pipeline:** Get our data and preprocess it for both Retrieval (implicit feedback) and Ranking (explicit labels).\n", - "2. **Retrieval:** Implement and train a Two-Tower model to generate candidates.\n", - "3. **Ranking:** Implement and train a Neural Ranking model to predict click probabilities.\n", - "4. **Inference:** Run an end-to-end test (Retrieval --> Ranking) to generate recommendations for a specific user." - ], - "metadata": { - "id": "xcJBUXmeaavN" - } - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "id": "AL5vdFd8QOZl", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "8b519c48-1e1a-4e58-9325-6108cfb7b4da" - }, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/92.5 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m92.5/92.5 kB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25h" - ] - } - ], - "source": [ - "!pip install -q keras-rs" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "id": "2cdPdsiFQOZm" - }, - "outputs": [], - "source": [ - "import os\n", - "os.environ[\"KERAS_BACKEND\"] = \"tensorflow\"\n", - "import keras\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import tensorflow as tf\n", - "import pandas as pd\n", - "import keras_rs\n", - "import tensorflow_datasets as tfds\n", - "from mpl_toolkits.axes_grid1 import make_axes_locatable\n", - "from keras import layers\n", - "from concurrent.futures import ThreadPoolExecutor\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.preprocessing import MinMaxScaler\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# **Preparing Dataset**" - ], - "metadata": { - "id": "fdhb5tuL9UBe" - } - }, - { - "cell_type": "code", - "source": [ - "from google.colab import files\n", - "files.upload()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 91 - }, - "id": "RJN16Th-9W8E", - "outputId": "bfa060e0-25fe-41a4-cddd-b46aea023352" - }, - "execution_count": 3, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "" - ], - "text/html": [ - "\n", - " \n", - " \n", - " Upload widget is only available when the cell has been executed in the\n", - " current browser session. Please rerun this cell to enable.\n", - " \n", - " " - ] - }, - "metadata": {} - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Saving kaggle (1).json to kaggle (1).json\n" - ] - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'kaggle (1).json': b'{\"username\":\"mansim071\",\"key\":\"7b9249c264ac5cb7d295afcdd44f7ad1\"}'}" - ] - }, - "metadata": {}, - "execution_count": 3 - } - ] - }, - { - "cell_type": "code", - "source": [ - "!mkdir -p ~/.kaggle\n", - "!mv kaggle.json ~/.kaggle/\n", - "!chmod 600 ~/.kaggle/kaggle.json" - ], - "metadata": { - "id": "G4JgdNRp9tI3" - }, - "execution_count": 4, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "!kaggle datasets download -d mafrojaakter/ad-click-data\n", - "!unzip -o ad-click-data.zip -d ./ad_click_data" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "NOhaq3bl-bmp", - "outputId": "bcd54c95-28dc-42b5-8f82-39f8763db18a" - }, - "execution_count": 5, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Dataset URL: https://www.kaggle.com/datasets/mafrojaakter/ad-click-data\n", - "License(s): unknown\n", - "Downloading ad-click-data.zip to /content\n", - " 0% 0.00/37.6k [00:00" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAGHCAYAAAB7xLxyAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPERJREFUeJzt3Xl8VPW9//H3ZJtsk4RA9gQIiywii0EQUEShUgQKVhGhLajAdYlaBGvL7UWtyy/1WitVcUGvcKtFEBH1oojIKgVURFRAEJAlQHbITPaEzPn9ETISSYBMZjLJzOv5eJxHMmfOmfOZEx7Ht9/v93yPyTAMQwAAAGg0P08XAAAA0FoRpAAAAJxEkAIAAHASQQoAAMBJBCkAAAAnEaQAAACcRJACAABwEkEKAADASQQpAAAAJxGkAACtXseOHXXbbbe57fM3bNggk8mkDRs2uO0YTWUymfToo482er/Dhw/LZDJp0aJFLq+pOXj6b0OQAgA4ZdGiRTKZTI4lICBASUlJuu2223T8+HGnPnPPnj169NFHdfjwYdcW20zOPiebN28+533DMJSSkiKTyaQxY8Z4oELn1QYWk8mkN998s95thgwZIpPJpF69ejl1jMWLF2vevHlNqLL5BXi6AABA6/bYY48pNTVV5eXl2rZtmxYtWqTNmzdr165dCg4ObtRn7dmzR3/5y180bNgwdezY8aL327dvn/z8Wk7bQHBwsBYvXqyrrrqqzvqNGzfq2LFjMpvNHqqs6Wq/229/+9s66w8fPqwtW7Y0+m9+tsWLF2vXrl2aOXPmRe8zdOhQlZWVKSgoyOnjNkXL+VcHAGiVRo0apd/+9reaPn26XnvtNT344IM6ePCgPvjgA7ce1zAMlZWVSZLMZrMCAwPderzGuOGGG7Rs2TKdPn26zvrFixcrLS1N8fHxHqqs6W644QatWbNG+fn5ddYvXrxYcXFx6t+/f7PUUV5eLrvdLj8/PwUHB3ssSBOkAAAudfXVV0uSDh48WGf93r17dfPNNys6OlrBwcHq379/nbC1aNEiTZgwQZJ07bXXOrqRase+dOzYUWPGjNHq1avVv39/hYSE6JVXXnG8VztGavv27TKZTPrf//3fc2pbvXq1TCaTVq5cKUk6cuSI7rnnHnXr1k0hISFq27atJkyY0OSuxUmTJqmgoEBr1qxxrKusrNQ777yjyZMn17tPSUmJZs+erZSUFJnNZnXr1k1/+9vfZBhGne0qKir0wAMPKCYmRhaLRb/61a907Nixej/z+PHjuuOOOxQXFyez2axLL71Ur7/+epO+27hx42Q2m7Vs2bI66xcvXqxbbrlF/v7+9e735ptvKi0tTSEhIYqOjtatt96qzMxMx/vDhg3Thx9+qCNHjjj+9rWtkrXdikuWLNF//dd/KSkpSaGhobLZbA2Okfr88891ww03qE2bNgoLC1Pv3r31j3/8w/F+dna2br/9diUnJ8tsNishIUHjxo1r9N+erj0AgEvV/oeoTZs2jnW7d+/WkCFDlJSUpD/96U8KCwvT22+/rfHjx2v58uW68cYbNXToUN1///167rnn9J//+Z/q0aOHJDl+SjVdeJMmTdKdd96pGTNmqFu3buccv3///urUqZPefvttTZ06tc57S5cuVZs2bTRy5EhJ0pdffqktW7bo1ltvVXJysg4fPqyXXnpJw4YN0549exQaGurUOejYsaMGDRqkt956S6NGjZIkrVq1SlarVbfeequee+65OtsbhqFf/epXWr9+vaZNm6a+fftq9erV+sMf/qDjx4/r2WefdWw7ffp0vfnmm5o8ebIGDx6sdevWafTo0efUkJOToyuvvFImk0n33nuvYmJitGrVKk2bNk02m61R3WdnCw0N1bhx4/TWW2/p7rvvliR988032r17t1577TV9++235+zz5JNPau7cubrllls0ffp05eXl6fnnn9fQoUP19ddfKyoqSn/+859ltVp17Ngxx/cNDw+v8zmPP/64goKC9OCDD6qioqLB7rw1a9ZozJgxSkhI0O9//3vFx8fr+++/18qVK/X73/9eknTTTTdp9+7duu+++9SxY0fl5uZqzZo1Onr0aKO6lWUAAOCEhQsXGpKMTz/91MjLyzMyMzONd955x4iJiTHMZrORmZnp2Hb48OHGZZddZpSXlzvW2e12Y/DgwUbXrl0d65YtW2ZIMtavX3/O8Tp06GBIMj7++ON635s6darj9Zw5c4zAwEDj5MmTjnUVFRVGVFSUcccddzjWlZaWnvNZW7duNSQZ//znPx3r1q9f32Bd9Z2TL7/80njhhRcMi8XiOMaECROMa6+91lHv6NGjHfu99957hiTjiSeeqPN5N998s2EymYwDBw4YhmEYO3fuNCQZ99xzT53tJk+ebEgyHnnkEce6adOmGQkJCUZ+fn6dbW+99VYjMjLSUdehQ4cMScbChQvP+91qz8GyZcuMlStXGiaTyTh69KhhGIbxhz/8wejUqZNhGIZxzTXXGJdeeqljv8OHDxv+/v7Gk08+WefzvvvuOyMgIKDO+tGjRxsdOnRo8NidOnU652/287/N6dOnjdTUVKNDhw7GqVOn6mxrt9sNwzCMU6dOGZKMp59++rzf+WLQtQcAaJIRI0YoJiZGKSkpuvnmmxUWFqYPPvhAycnJkqSTJ09q3bp1uuWWW1RUVKT8/Hzl5+eroKBAI0eO1P79+y/6Lr/U1FRHa9L5TJw4UVVVVXr33Xcd6z755BMVFhZq4sSJjnUhISGO36uqqlRQUKAuXbooKipKO3bsuNhTUK9bbrlFZWVlWrlypYqKirRy5coGu/U++ugj+fv76/7776+zfvbs2TIMQ6tWrXJsJ+mc7X7eumQYhpYvX66xY8fKMAzHOc/Pz9fIkSNltVqb9P2uv/56RUdHa8mSJTIMQ0uWLNGkSZPq3fbdd9+V3W7XLbfcUqeO+Ph4de3aVevXr7/o406dOrXO36w+X3/9tQ4dOqSZM2cqKiqqznsmk0lSzd89KChIGzZs0KlTpy76+PWhaw8A0CTz58/XJZdcIqvVqtdff12bNm2qc1fagQMHZBiG5s6dq7lz59b7Gbm5uUpKSrrgsVJTUy+qpj59+qh79+5aunSppk2bJqmmW69du3a67rrrHNuVlZUpIyNDCxcu1PHjx+uMR7JarRd1rIbExMRoxIgRWrx4sUpLS1VdXa2bb7653m2PHDmixMREWSyWOutruzWPHDni+Onn56fOnTvX2e7nXZx5eXkqLCzUggULtGDBgnqPmZub69T3kqTAwEBNmDBBixcv1oABA5SZmdlgSNy/f78Mw1DXrl0b/KyLdTF//9qxeeebgsFsNuupp57S7NmzFRcXpyuvvFJjxozRlClTGn0jAEEKANAkAwYMcNypNX78eF111VWaPHmy9u3bp/DwcNntdknSgw8+2GBrUpcuXS7qWBdqjTjbxIkT9eSTTyo/P18Wi0UffPCBJk2apICAn/7Td99992nhwoWaOXOmBg0apMjISJlMJt16662Oupti8uTJmjFjhrKzszVq1KhzWkjcpbb23/72t+eME6vVu3fvJh1j8uTJevnll/Xoo4+qT58+6tmzZ4O1mEwmrVq1qt6B6D8fB3U+jfn7X8jMmTM1duxYvffee1q9erXmzp2rjIwMrVu3Tv369bvozyFIAQBcxt/fXxkZGbr22mv1wgsv6E9/+pM6deokqablYcSIEefdv7brxRUmTpyov/zlL1q+fLni4uJks9l066231tnmnXfe0dSpU/XMM8841pWXl6uwsNAlNdx444268847tW3bNi1durTB7Tp06KBPP/1URUVFdVql9u7d63i/9qfdbtfBgwfrtELt27evzufV3tFXXV19wXPurKuuukrt27fXhg0b9NRTTzW4XefOnWUYhlJTU3XJJZec9zNd8fevba3btWvXBb97586dNXv2bM2ePVv79+9X37599cwzzzQ44Wh9GCMFAHCpYcOGacCAAZo3b57Ky8sVGxurYcOG6ZVXXlFWVtY52+fl5Tl+DwsLkySXBJkePXrosssu09KlS7V06VIlJCRo6NChdbbx9/c/Z3qB559/XtXV1U0+vlTT2vLSSy/p0Ucf1dixYxvc7oYbblB1dbVeeOGFOuufffZZmUwmx51/tT9/ftffz2cD9/f310033aTly5dr165d5xzv7HPuLJPJpOeee06PPPKIfve73zW43a9//Wv5+/vrL3/5yznn2jAMFRQUOF6HhYU1uUv18ssvV2pqqubNm3fOv6Pa45eWlqq8vLzOe507d5bFYlFFRUWjjkeLFADA5f7whz9owoQJWrRoke666y7Nnz9fV111lS677DLNmDFDnTp1Uk5OjrZu3apjx47pm2++kST17dtX/v7+euqpp2S1WmU2m3XdddcpNjbWqTomTpyohx9+WMHBwZo2bdo5kzaOGTNGb7zxhiIjI9WzZ09t3bpVn376qdq2bdvkc1Croa61s40dO1bXXnut/vznP+vw4cPq06ePPvnkE73//vuaOXOmo5Wlb9++mjRpkl588UVZrVYNHjxYa9eu1YEDB875zL/+9a9av369Bg4cqBkzZqhnz546efKkduzYoU8//VQnT55s8ncbN26cxo0bd95tOnfurCeeeEJz5szR4cOHNX78eFksFh06dEgrVqzQf/zHf+jBBx+UJKWlpWnp0qWaNWuWrrjiCoWHh583gNbHz89PL730ksaOHau+ffvq9ttvV0JCgvbu3avdu3dr9erV+uGHHzR8+HDdcsst6tmzpwIC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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "# **Predictions of Retrival Model**\n", - "Two-Tower model is trained, we need to use it to generate candidates.\n", - "\n", - "We can implement inference pipeline using three steps:\n", - "1. Indexing: We can run the Item Tower once for all available ads to generate their embeddings.\n", - "2. Query Encoding: When a user arrives, we pass their features through the User Tower to generate a User Embedding.\n", - "3. Nearest Neighbor Search: We search the index to find the Ad Embeddings closest to the User Embedding (highest dot product).\n", - "\n", - "Keras-RS [BruteForceRetrieval layer](https://keras.io/keras_rs/api/retrieval_layers/brute_force_retrieval/) calculates dot product between the user and every single item in the index to find exact top-K matches" - ], - "metadata": { - "id": "_o0ILppGcknp" - } - }, - { - "cell_type": "code", - "source": [ - "USER_CATEGORICAL = [\"user_id\", \"gender\", \"city\", \"country\"]\n", - "CONTINUOUS_FEATURES = [\"time_on_site\", \"internet_usage\", \"area_income\", \"Age\"]\n", - "USER_FEATURES = USER_CATEGORICAL + CONTINUOUS_FEATURES\n", - "\n", - "class BruteForceRetrievalWrapper:\n", - " def __init__(self, model, ads_df, ad_features, user_features, k=10):\n", - " self.model, self.k = model, k\n", - " self.user_features = user_features\n", - " unique_ads = ads_df[ad_features].drop_duplicates(\"ad_id\").reset_index(drop=True)\n", - " self.ids = unique_ads[\"ad_id\"].values\n", - " self.topic_map = dict(zip(unique_ads[\"ad_id\"], unique_ads[\"ad_topic\"]))\n", - " ad_inputs = {\"ad_id\": tf.constant(self.ids.astype(str)),\n", - " \"ad_topic\": tf.constant(unique_ads[\"ad_topic\"].astype(str).values)\n", - " }\n", - " self.candidate_embs = model.ln_ad(model.ad_tower(ad_inputs))\n", - "\n", - " def query_batch(self, user_df):\n", - " inputs = {k: tf.constant(user_df[k].values.astype(float if k in CONTINUOUS_FEATURES else str))\n", - " for k in self.user_features if k in user_df.columns\n", - " }\n", - " u_emb = self.model.ln_user(self.model.user_tower(inputs))\n", - " scores = tf.linalg.matmul(u_emb, self.candidate_embs, transpose_b=True)\n", - " top_scores, top_indices = tf.math.top_k(scores, k=self.k)\n", - " return top_scores.numpy(), top_indices.numpy()\n", - "\n", - " def decode_results(self, scores, indices):\n", - " results = []\n", - " for row_scores, row_indices in zip(scores, indices):\n", - " retrieved_ids = self.ids[row_indices]\n", - " results.append([\n", - " {\"ad_id\": aid, \"ad_topic\": self.topic_map[aid], \"score\": float(s)}\n", - " for aid, s in zip(retrieved_ids, row_scores)\n", - " ])\n", - " return results\n", - "\n", - "retrieval_engine = BruteForceRetrievalWrapper(model=retrieval_model,ads_df=ads_df,ad_features=[\"ad_id\", \"ad_topic\"],\n", - " user_features=USER_FEATURES, k=10)\n", - "sample_user = pd.DataFrame([x_test.iloc[0]])\n", - "scores, indices = retrieval_engine.query_batch(sample_user)\n", - "top_ads = retrieval_engine.decode_results(scores, indices)[0]" - ], - "metadata": { - "id": "QrHPBLIml8Si" - }, - "execution_count": 51, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "# **Implementation of Ranking Model**\n", - "Retrieval model only calculates a simple similarity score (Dot Product). It doesn't account for complex feature interactions.\n", - "So we need to build ranking model after words retrival model.\n", - "\n", - "**Architecture**\n", - "1. **Feature Extraction:** We reuse the trained User Tower and Ad Tower from the Retrieval stage. We freeze these towers (trainable = False) so their weights don't change.\n", - "2. **Interaction:** Instead of just a dot product, we concatenate three inputs- The User EmbeddingThe Ad EmbeddingThe Dot Product (Similarity)\n", - "3. **Scorer(MLP):** These concatenated inputs are fed into a Multi-Layer Perceptron—a stack of Dense layers. This network learns the non-linear relationships between the user and the ad.\n", - "4. **Output:** The final layer uses a Sigmoid activation to output a single probability between 0.0 and 1.0 (Likelihood of a Click)." - ], - "metadata": { - "id": "xQtLgCfyeqYS" - } - }, - { - "cell_type": "code", - "source": [ - "retrieval_model.trainable = False\n", - "def create_ranking_ds(df):\n", - " inputs = {\"user\": dict_to_tensor_features(df[USER_FEATURES], continuous_features),\n", - " \"positive_ad\": dict_to_tensor_features(df[AD_FEATURES], continuous_features)\n", - " }\n", - " return tf.data.Dataset.from_tensor_slices((inputs, df[\"Clicked on Ad\"].values.\n", - " astype('float32'))).shuffle(10000).batch(256).prefetch(tf.data.AUTOTUNE)" - ], - "metadata": { - "id": "_j2PAllRvDOb" - }, - "execution_count": 39, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "ranking_train_dataset= create_ranking_ds(x_train)\n", - "ranking_test_dataset = create_ranking_ds(x_test)" - ], - "metadata": { - "id": "uhKCsNa8v0Uo" - }, - "execution_count": 40, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "class RankingModel(keras.Model):\n", - " def __init__(self, retrieval_model, **kwargs):\n", - " super().__init__(**kwargs)\n", - " self.retrieval = retrieval_model\n", - " self.mlp = keras.Sequential([\n", - " layers.Dense(256, activation=\"relu\"), layers.Dropout(0.2),\n", - " layers.Dense(128, activation=\"relu\"), layers.Dropout(0.2),\n", - " layers.Dense(64, activation=\"relu\"),\n", - " layers.Dense(1, activation=\"sigmoid\")\n", - " ])\n", - "\n", - " def call(self, inputs):\n", - " u_emb, ad_emb, dot = self.retrieval.get_embeddings(inputs)\n", - " return self.mlp(keras.ops.concatenate([u_emb, ad_emb, dot], axis=-1))" - ], - "metadata": { - "id": "mQCXdFFqvDRC" - }, - "execution_count": 41, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "ranking_model = RankingModel(retrieval_model)\n", - "ranking_model.compile(optimizer=keras.optimizers.Adam(1e-4), loss=\"binary_crossentropy\", metrics=[\"AUC\", \"accuracy\"])\n", - "history1 = ranking_model.fit(ranking_train_dataset, epochs=20)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "w5JPRvJ_vDUS", - "outputId": "cdc8c321-8722-48a9-f6e3-8516c9f5caa1" - }, - "execution_count": 42, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Epoch 1/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 75ms/step - AUC: 0.7137 - accuracy: 0.4999 - loss: 0.6688\n", - "Epoch 2/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 43ms/step - AUC: 0.8871 - accuracy: 0.6535 - loss: 0.6237\n", - "Epoch 3/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 51ms/step - AUC: 0.9528 - accuracy: 0.8104 - loss: 0.5837\n", - "Epoch 4/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 27ms/step - AUC: 0.9704 - accuracy: 0.8531 - loss: 0.5561 \n", - "Epoch 5/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step - AUC: 0.9826 - accuracy: 0.9023 - loss: 0.5173\n", - "Epoch 6/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 47ms/step - AUC: 0.9875 - accuracy: 0.9188 - loss: 0.4851\n", - "Epoch 7/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 58ms/step - AUC: 0.9866 - accuracy: 0.9337 - loss: 0.4533\n", - "Epoch 8/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 29ms/step - AUC: 0.9914 - accuracy: 0.9448 - loss: 0.4224 \n", - "Epoch 9/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step - AUC: 0.9903 - accuracy: 0.9441 - loss: 0.3910\n", - "Epoch 10/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 40ms/step - AUC: 0.9910 - accuracy: 0.9502 - loss: 0.3671\n", - "Epoch 11/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 20ms/step - AUC: 0.9938 - accuracy: 0.9616 - loss: 0.3386\n", - "Epoch 12/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step - AUC: 0.9922 - accuracy: 0.9628 - loss: 0.3158\n", - "Epoch 13/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 22ms/step - AUC: 0.9940 - accuracy: 0.9676 - loss: 0.2864\n", - "Epoch 14/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 24ms/step - AUC: 0.9948 - accuracy: 0.9657 - loss: 0.2607\n", - "Epoch 15/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - AUC: 0.9951 - accuracy: 0.9685 - loss: 0.2452\n", - "Epoch 16/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - AUC: 0.9943 - accuracy: 0.9689 - loss: 0.2243\n", - "Epoch 17/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - AUC: 0.9945 - accuracy: 0.9701 - loss: 0.2068\n", - "Epoch 18/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - AUC: 0.9942 - accuracy: 0.9682 - loss: 0.1947\n", - "Epoch 19/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - AUC: 0.9955 - accuracy: 0.9719 - loss: 0.1764\n", - "Epoch 20/20\n", - "\u001b[1m3/3\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - AUC: 0.9943 - accuracy: 0.9725 - loss: 0.1623\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "pd.DataFrame(history1.history).plot(subplots=True, layout=(1, 3), figsize=(12, 4), title=\"Ranking Model Metrics\")\n", - "plt.show()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 408 - }, - "id": "WoodoIYnFgsx", - "outputId": "ee8c8243-6c85-4831-f44a-167d1ecf7b06" - }, - "execution_count": 43, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAGHCAYAAABGc4o9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAh+xJREFUeJzs3Xt8zvX/x/HHdV3btZMdzGZzGHM+syJLiGq1kEonhwr74vtLKVm+scKkpBPpoFYiOn3TwbcTkRaViCIkEjkfNmOzsdnpuq7fH7OLZdj5s8Pzfrt9bte1z/U5PK8LH3td7/fn/TY5HA4HIiIiIiIiIlIuzEYHEBEREREREanOVHiLiIiIiIiIlCMV3iIiIiIiIiLlSIW3iIiIiIiISDlS4S0iIiIiIiJSjlR4i4iIiIiIiJQjFd4iIiIiIiIi5UiFt4iIiIiIiEg5UuEtIiIiIiIiUo5UeIuISLUzfPhwatWqdcntevfuTe/evcs/UCUydepUTCZTifYdPnw4oaGhZRuoAtXEP28REakcVHiLiEiZW7BgASaTybm4uLjQoEEDhg8fzqFDh4yOVymEhoZiMpmIiIgo9PW5c+c6P79ff/21gtOVTu/evTGZTLRo0aLQ11esWOF8b5988kmxj3/48GGmTp3Kpk2bSplURESkYrgYHUBERKqvadOm0aRJEzIzM/n5559ZsGABq1evZuvWrbi7uxsdj2+++cbQ87u7u7Ny5UoSEhIIDg4u8Nr777+Pu7s7mZmZBqUrHXd3d3bt2sX69evp2rVrgddK+94OHz7ME088QWhoKGFhYUXez+g/bxERqbnU4i0iIuWmT58+3HPPPYwcOZK33nqL8ePH8/fff/PFF18YHQ0Aq9WK1Wo17Pzdu3enVq1aLFq0qMD6gwcP8uOPP9KvXz+DkpVes2bNaNWqFf/9738LrM/MzOR///tfhb63jIwMwPg/bxERqblUeIuISIXp2bMnAH///bdzXXZ2NlOmTKFz5874+vri5eVFz549WblyZYF99+7di8lk4oUXXuDNN9+kWbNmuLm5ccUVV/DLL79c8tybNm0iMDCQ3r17c+rUKeD8e35XrVqFyWTio48+Yvr06TRs2BB3d3euu+46du3add4x58yZQ9OmTfHw8KBr1678+OOPxbqP2N3dndtuu40PPvigwPr//ve/1K5dm8jIyEL3++677+jZsydeXl74+flxyy23sH379vO2W716NVdccQXu7u40a9aMN95444JZ3nvvPTp37oyHhwf+/v4MGjSIAwcOFOl9XMjgwYNZtGgRdrvdue7LL78kIyODu+66q9B9Dh06xL/+9S+CgoJwc3OjXbt2zJ8/3/n6qlWruOKKKwCIiopydllfsGABkPdn2r59ezZs2MDVV1+Np6cnjz32mPO1f/7ZZGZmMnXqVFq2bIm7uzv16tXjtttuK/B39MMPP6Rz5854e3vj4+NDhw4deOmll0r12YiISM2iruYiIlJh9u7dC0Dt2rWd69LS0njrrbcYPHgwo0aN4uTJk8ybN4/IyEjWr19/XlfiDz74gJMnT/J///d/mEwmnnvuOW677TZ2796Nq6troef95ZdfiIyMpEuXLnz++ed4eHhcNOczzzyD2Wxm/PjxpKam8txzz3H33Xezbt065zavv/46Y8aMoWfPnowbN469e/dy6623Urt2bRo2bFjkz2TIkCHccMMN/P333zRr1sz5Hu+4445C38+3335Lnz59aNq0KVOnTuX06dO88sordO/enY0bNzoHP/v999+54YYbCAwMZOrUqeTm5hIbG0tQUNB5x5w+fTqTJ0/mrrvuYuTIkSQlJfHKK69w9dVX89tvv+Hn51fk9/PP9zZ16lRWrVrFtdde63xv1113HXXr1j1v+8TERK688kpMJhNjxowhMDCQr7/+mhEjRpCWlsbDDz9MmzZtmDZtGlOmTOHf//6388ucq666ynmc48eP06dPHwYNGsQ999xT6HsGsNls3HTTTcTHxzNo0CDGjh3LyZMnWbFiBVu3bqVZs2asWLGCwYMHc9111/Hss88CsH37dn766SfGjh1bos9FRERqIIeIiEgZe/vttx2A49tvv3UkJSU5Dhw44Pjkk08cgYGBDjc3N8eBAwec2+bm5jqysrIK7J+SkuIICgpy/Otf/3Ku27NnjwNw1KlTx5GcnOxc//nnnzsAx5dffulcN2zYMIeXl5fD4XA4Vq9e7fDx8XH069fPkZmZWeA8vXr1cvTq1cv588qVKx2Ao02bNgUyvfTSSw7A8fvvvzscDocjKyvLUadOHccVV1zhyMnJcW63YMECB1DgmBfSuHFjR79+/Ry5ubmO4OBgx5NPPulwOByObdu2OQDH999/7/wcf/nlF+d+YWFhjrp16zqOHz/uXLd582aH2Wx2DB061Lnu1ltvdbi7uzv27dvnXLdt2zaHxWJxnPvf/969ex0Wi8Uxffr0Avl+//13h4uLS4H1w4YNczRu3PiS761Xr16Odu3aORwOh6NLly6OESNGOByOvD9Xq9XqWLhwofOz/vjjj537jRgxwlGvXj3HsWPHChxv0KBBDl9fX0dGRobD4XA4fvnlFwfgePvttws9N+CIi4sr9LVz/2zmz5/vAByzZs06b1u73e5wOByOsWPHOnx8fBy5ubmXfN8iIiIXoq7mIiJSbiIiIggMDCQkJIQ77rgDLy8vvvjiiwItwhaLxXnfrd1uJzk5mdzcXLp06cLGjRvPO+bAgQMLtJjnt3ju3r37vG1XrlxJZGQk1113HYsXL8bNza1IuaOiogrcC/zPc/z6668cP36cUaNG4eJytvPY3XffXSBbUVgsFu666y7nvdDvv/8+ISEhznOe68iRI2zatInhw4fj7+/vXN+xY0euv/56li5dCuS15C5fvpxbb72VRo0aObdr06bNed3XFy9ejN1u56677uLYsWPOJTg4mBYtWpzX5b+4hgwZwuLFi8nOzuaTTz7BYrEwYMCA87ZzOBx8+umn9O/fH4fDUSBLZGQkqamphf59KIybmxtRUVGX3O7TTz8lICCABx988LzX8qdc8/PzIz09nRUrVhTp3CIiIoVR4S0iIuVmzpw5rFixgk8++YS+ffty7NixQovfhQsX0rFjR9zd3alTpw6BgYEsWbKE1NTU87Y9t5CEs93WU1JSCqzPzMykX79+XHbZZXz00UfFGlTrUufYt28fAM2bNy+wnYuLS4nmuR4yZAjbtm1j8+bNfPDBBwwaNKjQubbzz9uqVavzXmvTpg3Hjh0jPT2dpKQkTp8+Xeh0Xv/cd+fOnTgcDlq0aEFgYGCBZfv27Rw9erTY7+dcgwYNIjU1la+//pr333+fm266CW9v7/O2S0pK4sSJE7z55pvn5cgvoouapUGDBkX68/77779p1apVgS9P/un++++nZcuW9OnTh4YNG/Kvf/2LZcuWFSmHiIhIPt3jLSIi5aZr16506dIFgFtvvZUePXowZMgQduzYQa1atYC8Qb2GDx/Orbfeyn/+8x/q1q2LxWJhxowZBQa4ymexWAo9l8PhKPCzm5sbffv25fPPP2fZsmXcdNNNRc5d1HOUlfDwcJo1a8bDDz/Mnj17GDJkSLmcpzB2ux2TycTXX39d6PvO/3MqqXr16tG7d29mzpzJTz/9xKeffnrBHAD33HMPw4YNK3Sbjh07Fumcl7qHvzjq1q3Lpk2bWL58OV9//TVff/01b7/9NkOHDmXhwoVldh4REaneVHiLiEiFyC+mr7nmGl599VUmTpwIwCeffELTpk1ZvHhxgVbe2NjYUp3PZDLx/vvvc8stt3DnnXfy9ddfF3m08Utp3LgxALt27eKaa65xrs/NzWXv3r1FLhDPNXjwYJ566inatGlzwbmp88+7Y8eO8177888/CQgIwMvLC3d3dzw8PNi5c+d52/1z32bNmuFwOGjSpAktW7Ysdu6iGDJkCCNHjsTPz4++ffsWuk1gYCDe3t7YbDYiIiIuerzCegOURLNmzVi3bh05OTkXHJgP8qYh69+/P/3798dut3P//ffzxhtvMHny5PN6PYiIiBRGXc1FRKTC9O7dm65duzJ79mwyMzOBs63L57Ymr1u3jrVr15b6fFarlcWLF3PFFVfQv39/1q9fX+pjAnTp0oU6deowd+5ccnNznevff//987q8F9XIkSOJjY1l5syZF9ymXr16hIWFsXDhQk6cOOFcv3XrVr755htnUWuxWIiMjOSzzz5j//79zu22b9/O8uXLCxzztttuw2Kx8MQTT5zXou9wODh+/HiJ3s+57rjjDmJjY3nttdcu2AXcYrFw++238+mnn7J169bzXk9KSnI+9/LyAijwGZTE7bffzrFjx3j11VfPey3/s/jn+zebzc4vVrKyskp1fhERqTnU4i0iIhXqP//5D3feeScLFizgvvvu46abbmLx4sUMGDCAfv36sWfPHuLi4mjbtq1zvu3S8PDw4KuvvuLaa6+lT58+fP/997Rv375Ux7RarUydOpUHH3yQa6+9lrvuuou9e/eyYMECmjVrVqIW2caNGzN16tRLbvf888/Tp08funXrxogRI5zTifn6+hbY/4knnmDZsmX07NmT+++/n9zcXF555RXatWvHli1bnNs1a9aMp556ipiYGOeUaN7e3uzZs4f//e9//Pvf/2b8+PHFfj/n+me2C3nmmWdYuXIl4eHhjBo1irZt25KcnMzGjRv59ttvSU5Odmb28/MjLi4Ob29vvLy8CA8Pp0mTJsXKNXToUN555x2io6NZv349PXv2JD09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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "source": [ - "ranking_model.evaluate(ranking_test_dataset)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "RD4UirtNvDXT", - "outputId": "9964607f-eea1-4c1a-d117-2a847416cfec" - }, - "execution_count": 44, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 630ms/step - AUC: 0.9867 - accuracy: 0.9372 - loss: 0.2243\n" - ] - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[0.2243196964263916, 0.9866776466369629, 0.9371727705001831]" - ] - }, - "metadata": {}, - "execution_count": 44 - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "# **Predictions of Ranking Model**\n", - "The retrieval model gave us a list of ads that are generally relevant (high dot product similarity). The ranking model will now calculate the specific probability (0% to 100%) that the user will click each of those ads.\n", - "\n", - "The Ranking model expects pairs of (User, Ad). Since we are scoring 10 ads for 1 user, we cannot just pass the user features once.We effectively take user's features 10 times to create a batch." - ], - "metadata": { - "id": "XaLAPapNjdYm" - } - }, - { - "cell_type": "code", - "source": [ - "def rerank_ads_for_user(user_row, retrieved_ads, ranking_model):\n", - " ads_df = pd.DataFrame(retrieved_ads)\n", - " num_ads = len(ads_df)\n", - " user_inputs = { k: tf.fill((num_ads, 1), str(user_row[k]) if k not in continuous_features else float(user_row[k]))\n", - " for k in USER_FEATURES}\n", - " ad_inputs = {k: tf.reshape(tf.constant(ads_df[k].astype(str).values), (-1, 1)) for k in AD_FEATURES}\n", - " scores = ranking_model({\"user\": user_inputs, \"positive_ad\": ad_inputs}).numpy().flatten()\n", - " ads_df[\"ranking_score\"] = scores\n", - " return ads_df.sort_values(\"ranking_score\", ascending=False).to_dict(\"records\")\n", - "\n", - "sample_user = x_test.iloc[0]\n", - "scores, indices = retrieval_engine.query_batch(pd.DataFrame([sample_user]))\n", - "top_ads = retrieval_engine.decode_results(scores, indices)[0]\n", - "final_ranked_ads = rerank_ads_for_user(sample_user, top_ads, ranking_model)\n", - "print(f\"User: {sample_user['user_id']}\")\n", - "print(f\"{'Ad ID':<10} | {'Topic':<30} | {'Retrival Score':<11} | {'Rank Probability'}\")\n", - "for item in final_ranked_ads:\n", - " print(f\"{item['ad_id']:<10} | {item['ad_topic'][:28]:<30} | {item['score']:.4f} | {item['ranking_score']*100:.2f}%\")" - ], - "metadata": { - "id": "MvPsCaw_vDaT", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "7b16a6ac-679e-41b6-cce8-67b4f193b91a" - }, - "execution_count": 49, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "User: user_216\n", - "Ad ID | Topic | Retrival Score | Rank Probability\n", - "ad_660 | Profound optimizing utilizat | 8.1021 | 99.19%\n", - "ad_318 | Front-line upward-trending g | 6.6563 | 99.07%\n", - "ad_311 | Front-line methodical utiliz | 6.6728 | 98.77%\n", - "ad_31 | Ameliorated well-modulated c | 6.4871 | 98.65%\n", - "ad_861 | Synergized clear-thinking pr | 6.2368 | 98.57%\n", - "ad_387 | Implemented didactic support | 5.9674 | 98.47%\n", - "ad_799 | Self-enabling optimal initia | 5.8983 | 98.43%\n", - "ad_984 | Vision-oriented contextually | 5.9103 | 98.29%\n", - "ad_706 | Re-engineered demand-driven | 6.5815 | 98.22%\n", - "ad_916 | Universal multi-state system | 5.6566 | 98.17%\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "ECqj1I91JUgg" - }, - "execution_count": 45, - "outputs": [] - } - ] -} \ No newline at end of file