From 945febbe96477fe66941e41e3e7d9a927d298053 Mon Sep 17 00:00:00 2001 From: Echo Date: Mon, 18 May 2026 03:35:46 +0000 Subject: [PATCH] feat(enrollment): add route-based IP selection and fix package versioning for v1.1.5 --- .a0proj/audit.db | Bin 4198400 -> 5021696 bytes Cargo.lock | 2 +- Cargo.toml | 2 +- build-alpine.sh | 2 +- build-arch.sh | 2 +- build-rpm.sh | 2 +- configs/config.yaml.example | 8 +- debian/changelog | 10 +++ src/enroll/client.rs | 9 +- src/enroll/identity.rs | 160 ++++++++++++++++++++++++++++++++-- src/enroll/mod.rs | 2 +- tests/unit/enroll_identity.rs | 68 +++++++++++++-- 12 files changed, 245 insertions(+), 22 deletions(-) mode change 100755 => 100644 build-rpm.sh diff --git a/.a0proj/audit.db b/.a0proj/audit.db index dc27d02db9c589500b25570f59d8505ebb0e716d..ccb126d6457938fd79316f4027eccb114f73d12d 100644 GIT binary patch delta 244154 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�II8QcMZr*Y_8{R9+~r#>QT(3~DESy(kSyPlMPL_R3@v(W&d%fsV}L2oI9L zRvO<+5t2B)1f-{y-b+ViTbOOiLWP=ucVu*Aa2PfuZGbVj_>)z$cqzN6|ED8s$wbK60?ky7*$VE|(uy8kGCdH5%a&25fc6mEJ>ZiuY8w zS!CCf)(YeRUZwGU2vuMt_Te3a*5r zD32z%WA?G*w?H28KJ>AVUuCHA^eGptQyMNrR=w@LGcx0(^G{}d3-=!h z-w^xAk*cgJ+D4#H@M6#_IzwvkO+`=Q`q$nfA#j8shghZHx%69z2BF6IjlvY2mA%|P zF&IQ>EW{xADiq?DUS4+xptvl9@xYnhlCAul?(RI@C5WB`Sc(kc@7Sdjgg|q5JD!v zHk#ljGG0ooD$HVdVmn~i{OSGiYbj{}K^cf?Matr^5;?tu)1J<*@-^1Z=M3gCQGIP0 zUcre5_%~crM>i#MeUrSToj$krX(2A#PP7yj@iiRovnYhq^G|b}T0s>P>vp+)>8ePwkNFJ<)S82N#eJjgMX|!6soiNJ${iCeig&BZ6x!@~}DPJQH4r zl>$fun)62s1%@UP!^gZ4C`Lez-VESHyMm)gG^mo&;1EH?DCQ&*hrH2tZE*Y3>H|ha z5c9OiBy>12lEFG>SON`ljnWc`-csDrf>#&@N`!CyFqS+Or5%;u>5jJD{C(EB=$a*+J2O*0gU_o?o3|dQLAtB(%v@9bfek{G7z*qI4%C>-Og;BB=!ZPtO-0p@R&98xU*Mnh_3*C5bj=r4jVV}sjwjJGMI z3ApbP@)n#0LH}-G{>XlyE!zd_C>^+KB}NdmrXgrk@P}NMnSU)-SRFrxP?iwM08s7Nz0BHf1H;>D&f^?EpUOa9t+#_1I z<>qZR6IeNPTL0}K%U9%ja0qWs-P;+3K#uefRqx8}Pw!A#zN~_Yh|ku$x~lpOeecosjJCk-{ZGFi)wSz)+FNmi^I`QX5lIkbe>d ziz{ZJKQ*9c9Qrd^UuatC^uWy-@XwV}rxKVBsL&)e!XcwttBJafdYAW;9H~)}27^Yk^SPcS z&lU9B)u zVzRFJ=0|pB8Xthx+pBwa^VUp+DD3G!)#ZIV?_+t_y>oN)_m_RG^FX5%J9AlQ%PJ7D#r^?sM#gS-L16{N(vPn+q~USfTJ+t)M6D*FD3YJ36PCed)0|3)wZ(b1dx2V{_KCiAU!&FFcEgzFqfm_LXCE zE^p*rJBtm8?o-S*J;$6v=d-PUYFm(|`$&UvlOBW?l?(Jc*y|6YGyn6*oJQ9B2zqok z^&=P@aP_IW?!Sme@4HZ_ZWUF`uLo$iQZiPy=t6w6MOOFTK}$pSwa7< z=KU-9ooNBHJvHY(aq?@Y8gcRgw&qc^@vW!kn2iX9JzlVIhvBqA%4q~C+l~K6p*YAG zB#!YtPZl<^(ZX5}JJsm6h%n-KI_0%(WgAX3^qm{L*>FrKFOA|h&wZ${l`upx+K@Bz z-<&4-oq-VN0UGs-nf`_1eba-tmG>Cp^CizF7yjNebLadml0N?(S#;7t6ouK?#x}fO zyf%Iw*x6;8{;imG-b6a~-zr=4teAC>KkB}Um{5Vi!TiJX?Ic+oY}qq~i-c5Oc3r^+;?Ri0M*`@& zm_7HB0gOG5l;@m*9q25;tq^3gu}ltWCCvcBp8P;*5>v!G*{N6RQyE8Ef*_)tepAx1 zyC8TU+oNQl>KPI=<@MEDE0S21jAxv*H}z=w2JkgMeRDxIk@-{+nG#QjU$y}RAn$v~ zmc_0;t}lg5McIM^W-Q}NayF`p{C_~d2np+SA~zrP6}l7oIAWvxHnzS#Z7>Q#j?GiH z_~Q9r)bhcGDthgBE@l2FWt_jcrg)by@rNG(3rYeV)<0r^Xcajf8lyo}#r`9@V&z?N zd4b9O?R~n>w@uyileNF?d0}T}T5xA(zRmPCElBWro$-3Z=M5Fua2zwJlS?O;i6BAc zq%Wrc>yX&t&t?x04H9IqVb)X?kzSXvP(ShsLP2cL5KsY(mYCE<6ima>kzZ5Wnjv6A zIG*Mjr0DI;oSVKg^J?FKd-K-G7cQJ^lMLyTW$)>@=FU8c7`8eF`kno)ZVPbX1K7$~ z1K67QTXQU}{#I)U@r(Wd=+a^o>C1kamOBqgTs)rBv6_5=glMF&9J%%2jpUBLog9QK zww4@2MQ%zsBxeII$!%;xNL+Jk;3{|)YjE~Gf2}{qJwl$Y9k?5wKq81u< z3l1iXnat_rDLEXpbbg|v525-HxNe67)WMi%Nm~S(3t(1Q0S|*j;ymow`)j~xQT+?v zs-%|SH4t^!H24$USGZ3R1D2jWn!d9||3wnue_MuM`oK*ZLJA?Qb%;780G8w(P6H?6 z6OS%hun-Y2euLM7!ZbWm$P}}ol6~PSLun+6pNXzg@?;}}ct^sj-8ff`S88%38;Qv%{C1}~1M@)Z$IdM-pz;OXH7 zB*u}j%lmu=7tnH(Gw<3K8YJGYRI9ibKRYq3t_sM<6L!Xbh|H#6Un zTFI_IkdkeI`%7t9-F=CZ$AM&+fSy{)2MxPxCfEjh^@j3_2qCVuDGr4EHn+XMuQ^`E z0Ci*wf3^`e=hu34v6A!2tlxBAj7>M;0It1_2Wx z90@H6OspS-|M2EYP#Qv`K$i)OfS6Ybs>2u0)e3q7U88lpcM#B;7;*2Z%k-Lukv4n0wB%;f1a@ocQ3MiBX0l`s;vMX|VN3rR#-iQWy35*3A zc{Py^W7Ws4Y3eKiih;C6$f1%e8Jai<5E=8557#Gf4t0No(RHfC(2Si9t=mh1)b z3>q}2urX+&c?L|dV;$P2$95{nFuU7$ASj((*4!1X`49ioFT z64{LQ65-Xx>;p5(F@4%QF69B((XLidigcRrI}_tV!( zcV;eBcV^bVO+O!@48wbLyY=tZ<+bLm&Fjk>&$~YF&b){7KAZPK-Y-(`NPWogy0J+A zZv6-KPw2m_|4;p|3~7c6L$hJI;R3@|hMk6c4aW>$oyu5t*VLz%O-0^gT%4j$ZA-m5 z_3qSfWrngpkb6n)J827Blv0&qppqPGJ5e!&?yozZd@L=fdph}8%4c++N6j_+e%(h?^vQjiTG#PdVQO3Q;YW*BH0cXdZ%#fwwV`v#=G1TL z$ea;BNw>*VuhxAo`B+nq?z2h9(x30v-DsLjZvWB$>U^KE(R9DANNZpITZlEKkFKe~ z-@douLY*%40Cul8r$&<6&YVQtZpN`Wy00f6i*)I}mVE4r4Z5!;9}BnWzLI=wv_to0 zc`OoL=_CJ7_od_$SN>S{#pGjcf6#p)`Ph(r7}goarL^+u1y;UUs?8i@zf>jt6J~b+MMvk@2*=rT!1qT^30v-&o9v3 zka*-9$83c^*nQQd^}vQh=3eimlY2?>v#Tc7HxJ zV3_)1SMAj2x{9YB?JAtQyQ^sGCVckcGk{MoKFjd2;8TH5IzGQ%Uo>?RpReQd6h05E zFHCvmynUrp-Ro4t%Wm z%)=)WpWm%5n))$5&*Af_wMEAJm6oZ!Yip;*@wXqJ_4q8trvaZ5d<^)!x~6FA`}llm zP2tqz`1gZril=VHzgOb#LHv6GJ{@a{jqmGUK9#$sW-1fk|Ni` zhtGBRbe&&1)pUOClo`L5;&W>C!l@suE}HuC>Y}29U*-9NM#Dq8tVsI#hKKZ&ym6Po zcl84!lPfeg(eC%GzV@kr+)xDqXN--<63YRq)G}z5@Gcatk(&{XtYQMdZ9iOEy(7wn zRL&iFpzt5^2T@nZl~A{&bD#WZqq>BpfFj2|chit>dKKTGJ<8_yG=93vd&sg?hMw7SDLlB`;ci(ocD2PO}#DPrkWDHzyo9vJ%(8;YgJ2VuiKj8MG+Cd0j zSUd7_K{#gdyFy+|zrD59;qD(8a601v1!f#$ z8e)N0g)a&CZ&q_%+FZ3K`Hj|Au6#z?0Lu;$^f&JQEONiTE23Th=2!k3J~O>4-5M(% zP5eZdUYnIP*72h{hf5*(T(r9rj&Zq5^dT!K`hs-AmCLKNwu4x603(Mq71|812=xyl zfu}*NBK~rMrllV~1^QOtwec+#AuuO@D`4E>DAmyt*N8nl9gXxgqvU{gn5qY?C2}tM zs(a0Oyo4n(Jh=RoFN(;TT3wIl+&wZ(`&2HZqmvHrCl~_Zd4Ow)yjc{lSPQr&wyi|E zNr$nOttZwiY-S^VZO1Bh_h^mlfM|6L=|_N5Dhxn1UZ7iVc1BKy5sXF-HFXxufK9~xlGd7eM?(3Nh1-iRWu7;i&_7eR>F(GmQuPdobw#= z1_94A%7fKh`3MG5cv58Q1s2|nGZWT5Vd}*4=3Z(joi3R&Egi>AnzJU!>)J%VM~T5~ z5x7UVTTl%U3r%p9CfsMebRo*FY2!=pNz{Yl2L&V?Ct{U}fJU^$U+i560!T5J$6f=? z=^{pgb>E?1!=8SmFuUSBqJ-2`NbETgPGB4UyR1AS;Hm?tR5t>qLtyH;($#vOuzq+D zfhXE(&NYf`VCEb8G!LEd#r4Q%*9J|9WzEB-#XX>~#wJkgbYc{*8Fz4LgRWT;ylHDI zDrFA@`b5*h2Zjczl_*_<;KSmXEpo!pBu`69^4Le|UPMw%V`BuJ*Rn>$9Xd6#k<(Jm z#QE=|&P3eLNoi29LK2sQ7*PHs8arzfN`FaC)uxCN1;vWncf&UX^?=9VDGq#DXn7B- zxut@|g*77Vun_pC;@?@}fI?ypf6Y-G5*d6nt7NN1#QE>t3_oYmKg1iF9^KywL$}2cUq;}VF|pFg z7Y(y8=s!dczH9pR2Yr?|1E%{|cifBGZC_ZV=&dodmvGpl+|b5+J77bYayFUfnNbM^ z0I{Ri5<8||D<+s}iOf!4;7Z#T_?{nIt4+Pi8XNlQYRoGD&7Rv(IF*vI(*!0xl3q0tpa>BoI(h zF+{7j+A37#X>S*yuJx+GwQX8&Zz0y&_O@2&a=Y0IwQ5~UYVBrizu)se=ggcepxxf@ zd%yQRtzl-)Isg6t{Gavr(8On&2hTpXdq+~l^yZ9z>fYv$>vMFx@VV+`N{$qf!Dg1Z z{M$2S{C$)Cchm##OEDy2-z;8yK;z6i29U?$FDB=Y-}l+(59$a9XHW`5Q=UAy1F&yM zpg7r^`Z*eYwE5C=%=rbynZ87{2P4%@;;nb!1*fY zko@GFv~k13$g!G8P4)i=Qz~bHgA?tc;*`SonJH8mOk)5ztDIhwU2^qSRY9bYko13~ zY1y6%$oO#cC1>5XyAB8n|wscK=ro}Tjee6CWR$w z&o7yl(y(A=hSl0ggmn_)8rak*o%Lw>&uW$S{2eJ+i_dx1{Pu6|Dc(RY8~M zfBP?nHLd$@UGbTB<~3ZN?##M8-F3|HA4)0*hIc3V ztAfS;!EeTDs-hBZg=C3ifLHB?_s%wUrRd$<&;B}m%S*rhW{mUBZvSvu(Ht%)n z$jIf1^dAysmo~fekqwD|!}q9{Uyb@G>zPVS3MIe_vlNF zMkTjL^)zyGJziO@z$NBw_vjC2k1Bq$?T20S7W5siTQ@wE*Fh4(Ovdslt zwRkB)tv_ulq3-X*GE<`B_LwVHH^(cB&-<5KT}H2$jxV={i-1zy!yQUsQ}a6VyXn|- zO~rE=n40f}sP);HTo&eMclR<@DdSLMeZd!2WZZ_=;J%gCfDs=56VJx{}^rCZOHwNw~+Un+ZKd+ z3%)qA{~dOz z7;Z_@c}bGtXD|brlbXJ?dTgQQRe9;1t}>q;aA#x_-a(S#0J^=D)< zUDcsMLvX9uDUMaS>@{3VTfWs)CIL)S1uhlXtN;ul$ z7TytBIhZ>bQc*yNaXIiM;~L;bJp!%Z#w~Q{3FJ5Dyiv(KYINdAtT+pUkQgOl5zLB@ zSvx;f>1r+s$BlrOGEy8D-V-0%o`iu;KcK9erp~vmCFM}h$4z|JbBK z>QT%O^A*2EVU?imnazb_MOUkLFNO_s6BNZNKCdvVz%;Uz@rTF|ahMHGI=#+eX>$s- ze88_2Q1SQI=8Fqny@ph2Wf zT@j;QgR1q2F|+#MGRbp!A>$IMuI`HGEzEXonG^;DP1#ysuPhfRSM??*VR6Dro6T)d z*=u5Im331CH~1lpkuVjaAYmp@OxeO4Q9!0~ytch;QXwIQK*5sy;w5JN` zl$&$X$6t6dw$?z8e!Z#6Aki~lYqH^=$*(ol;Ge>$n<^v#vfyxBhxGsm)t$R9b5vtz ziI0GLlYCy9cnbW3kAC@7%vRtRkM0`g%p&}x_(a=3mm$%IpGh~l-mgs$dVm*>-&+R&0pU zvwzLC8-p@^>KidP(q?}98?ibxWGI+kP=k{QWe54Bl!5_qRIoj13NI7{!tys`#ZHJ` zL-=pUR>h}zGlxB>`ekf=&eo;QFm@S@HqTj4$2;qTbSl=AX7u^#=pzBkxMxZJ%}FF( z70aN|t<{Be;-~J?@$VdH`n-`_5C|!}DgJH+h>w$h3Tr=6)?@CA^7to(iLFBp2q_Sy zwrgUQlyYf(E?Iw)Q(z1tTj&G@3AnipcX3Z^nV$^?CHUZ4J5fo$T5ydVaa1 zjWQpsFQJ82e>;WNK)JBwI z@PMCAA9qLbAwc^MHPsYwz7f87)Dvk&crsZZGeXvk%wjwpp`O+GL41hPu?cr6eeCY) zTw4E@C5?{X5UZyLE_U zL1ehEDM&YTx{7Jh>Bek2k(JrV>Wax92ayaoI}hKs9|!4F94}zs!lH1q4$aKo*i)Vpd}yNC$H> zFER$8w|uavRS+J8rPBme7a6fP^B!uFnDXp=e48=oqx}yxIe4d9*X8?p zr{dp2T9KbwoEj9obC5iy%tC7UEEeA0mvbuU#Jc=+V=zJ|KNMS+8I5;nPaW--Y6|F` zk5y;U9mh@8ykW;)&WX^yg}yv9&@0gu>`}hC>0xZ#F^-^FC=>n8ZTZWMdxI5rnX#PnxRp)y)~7;&6bDemE92VlVE0q^TK%_t{69 zYVws)6|)2B4D})0_=_Osdp{DZG(tW*^pTi14e}Z8M0}Lh1o|{dTMJVY9Z`I_``aRkCw7w{_$`}PrDXD5TMxj>wcs?3j zQdLtF)h!ZU8Bx(Cub9s>eK`8WaN$S?T?t#`1Y>xGq2U;Ce!o(k()Z+))hRSG(NN|a?rq@bi){$-z{G;FuNr+nAI)3Pq;Fw{K;WS!;x@qM4R4;#jRzQ6uv1MOPx?w})|uu0>=A4Z##sjaF!l|J-B zb|&S#-B3b}Ka8$ES1V}36tU2KKaBpGyLB~Ns2L;~hVaRvC58y7T@}NEx>fiL6IbOLZF^xzBE<6MLI4Bk4b7+dt5k zar9;7S%>u>ZMax?QQG^(YF%*o%(fea+I}}#->3RddG5 z@!aQX&LoZB_WKNf>iFJ&m%k?l`Z_xF0Jx65C`&_N4x+cUq0uEMw!7PkK}5upU1|2VX3^Fd;Wp1D%aspjb+4X=!1BLpj?u z7UBO2D*x*Q6}mgqSw(yAt<5xsWZHh(9itCq<~1wx*7iU(yM$a!UoP{P6swblFoCPo zi4%e%xKGH5WvZMQsDyTC$7T*P-vPHn_rOT^$k4WaM_rwCZPy@D_^}XaVdm7^nO{J8 zcRGX!SxnZKEC~_PLcKpL7b0Xycoq?IHVHDEkj}vT!{-3sWb{CZ

78L{|3qJPOW&ReZG&Di8LScdSR%d5W&ZE_tbfO|WhraOB9LxCS zWlbjy^dAp`wfNjmbBYMxeT8Qkh4D|8HQi&Nc@NncK_&>{`($ZBCr#l9Ri1MAK2Iu> z_VdmgAN!%}raAv=3iw|s$blFP1wv3$8_b)|d$RTJKYsSU&wk8&d3w{YFHdjXXFR0k z8u{jVso#W_`dDi72cF$Dwnzkrs&Wnz0z5zWkjX}m~Eie)j&D~J_K~f$ip|V35r9! z3gsH&5MUYV8|oKf#=@a_cmGZ`@BsQ8r1jke7)~w}@eslt7?z2F!TB(IvDQ_uyjBnw z0OcTX0eUwoncrAV$7)!PuHiQl4NzS7g?=10DXQqHAR&016~lTJxeBcg?KJC{xj=|_ z90tMNIcp#FY38_p3Eld9scJRHGH*mi+bjA9U1+YWfAeMpV+c$d0gWLNFADsW9%L7o z&)WCRjg1@);PH%T_5?12vNx25Z+~+}RQ%A%Zk8COhEnduQ~u zvNh<$R^+e{9fHqsqXef_eC?HbW)UWz(+B^sO_?1RmK`1aX>x7NjETj&N|D@e)xO}nbNlP(FJQI5YoQ>I zVs$UVqYJb=8mc8=iRz6na$AaZHg!Vjbbm_`2iq|EEH8UbDY0Se&_)r3G_5hv#w(FP z`V5Mzm9>U+GeTN~|MqMHkL{u;#?@s}&GnpnX*j6!hqabbfRxu^)Tb>JD7v9#SC@*| zdRRh1YY@iSfe6xUJN0pG8Qp!hr&^|nJDh*voGRCA#K0+Qg%xh zZ$X=SIDK%Blc|-07lHjQ40DMsrZ|TSBgyJz-K%tzCIK3;Tx}!v)sBrGPWJ|o_8xBQ z8r8PPqr{o8&bG7E?L=F>jw08z2rX@%F=I^8)F48TszFY#NW*e#0Wy^F-sp=Dsj`rH zT`MM_)%vJ5Ur)jgHLz2dp*HpR1^fLG4&z562@Z+N0yi?n3axZJt1w^u*@)j7bk{$7Vzp5! zF#F`Neq!-enOFziUM^SvjkDY1`af@Gr;b?V`TO;pPbYJ~+CG=F}yl=Va634bp<|RQ@u6qnBM_ zgntc_XHbdwx#j2yZU}~>-c5)-Rbrtv?*T0YI}wDpdK66eMTx{nt8n^?19KMcn4>!x z5NsHuIvazn@g~X{B-jBoOIW!TK19OlcoY7+na_44w`K`t6w7 ze-)C@bmkO!zcIUl?6Hx4WMDIZ`H)3dV*+MI2qR7uL|zL6*4|c;0T7(7@(ti@7|v~{ z7YDNvH7XV=WJjFf)0hgK(?HxkKojM&$G^Qk7%;GcIoB}$>0h}vq|zlf+82*6JL9_C zK%3hsr;SNc(X3c0$2WpwBb*K+FrF}w=OUW}&G zA8)l4&<#I_&HRn-po!4Zxpc`bawe7c1heV3Gm(l}3Rse;`p5O=_fb%qc8F2iLw3KS zSlXLctl}(7pNDxH*0gLI9LUe4!@sR@o@KBAHf*Eh2kq^%jZ~QS-(?s2PTF_By@jfG zM{bWd^yu!$H+hUcIDXAF5vw8o`{`D15k3F7rG~%c=TKKyc^Wq zzb`tFZ$yIb*I#pm=%)Me`lHuJ@@eaJkzC!Zcb`Gctl_51F2jgFcE&ZA)>-9T8oNJO zqrCC0EPFnE;~GyUSJST4FzvO6s$e`haIaEF%{hzDrrZy}cSAJjXQPqIb3VMB7D)bL z-IAL!T8p$Ppk7{g=NPqoPR9PBzHW9;bqKZNIfpTGM#1knoQdfcZJ9Pc?>Vf^Q)`^| z`pn^d&+29y=J$MQIcYXh=i6dN@(?u`xN>Q+pU$VUU7X$+hyaR|F0%!_P>DYkAvzDsb@NlDG0Bt z;93cH3G=kG%FP<~h(7=g`;v+CUTFQdP|QB`=R9cF|9E+NdyiqWs$n;L_B{N5D|GCi zGQ>W)YHYCzQuFEdkDD}*n&<|f+#Bgf_Maf~00sJx(mNve@}Gd*>)RB<-`<3dB9~?Q zHqPto+IscI#_Ovox3syK+HNUI-sbhWyxqOq`a%JQH-TEf!EUh3e!)My7tZEtSFyDcN0-3>#{Ngv+g}9EVB>iUBx!L$@n<#v$m88Tx@H9+E6YQ)@)&?2S7# z3=b7(A=bkETZE!0zpG&>ta;QSoOcag*uQP)N-(lrRi6Hx8$D`pi2AQ*8-Q#ET&%Zs zLotmUg>J^HqTW*(rGBnWEfsj8y+CV+<^gSW?cgF|8Gw)Rz%aCk8uCcj;DO1)fMJks z|6QRcb#RT+6QMCV_;lqQJC7g|kb-xV9J1T*R=%sv-zhlRUBfi-)k;f-?$+I(D5{JN zYCupUfGUNHwDh-hraY-6iIpY$?TEbYc&Vh&=7s!fZ#k*(CtsgPZL zJ9;+{4Z3&1gzJ-iA(tG4-}h>tuQBLr4EWu_Xfzy&td*oCD;BL}Tko!`y9I1(ckl23 zQc)lMoT;c%bD(eTs#3?n5D`g^m~3<^Qv)3CZ3-Sk_lVCw4mK!q0W(=K5Mq zE>B)2j8_bUy907rLU*c&IV{y_Vq@(JB@v~f-K>SUD~w7)9An+!VDC0M(N$$xKFe72 zK&WHg8eURm$^_aqiwZDcsrD9DEQ4ymrGErSACSxM2wKbg;h@dRt~D1fo1zSWx)_$d z9epBssoDk*CdY+~=1b9_&*O#TY8_02f`&ku%0W>vPdW%uxweyHROrrKqf z%m<BwISNYWeNKlSg z(PCL5Oa>uwJf2H7i5XT5+e{2p3$;MPf+5Q(0i}z1h4>PNS+YmtIC_LyjAu(*ZM-V^ zoX76wF2e{7^$i=>r5fzWN7vObv$cL{n5GO-^pvaIEiWsTGp{v;UnW?1ud`7p%Y~-$+Xt* z&7p%oaoT7f!U+}@7fSMQ^?lOZ`RBmyeosd7+isiKn^;Q~66=FFkh7yC_gsszsBDO)``bbJxq zp7%-4jM7lT!6itu5=|Y;$;PxWWi8 z^xHq~vd{xP_3j)51@q z7xa^snofAb@Bg1H6Sdvpg`bJ*>cD*D*BbtEO|vl) zA*fq@a6pfg7tpZVTh8-*JKbS#si4l1nj(^Jb=c^pQ<&>xLl_Uaul{@^9JG(# z>IfU7z$^H8Z8aV7cw1@YiQGJ@_XLF#`pJ#;g>-y-INykf(f$4PMO5=`j-`3Ymq|C* zw&c>UN1%a|c7$ta;g0$PaQ+NMq6jLfMqVgH9W~LB!Imr|_w=yWGTv70xhkDjJ=jn{ z2b1dTsT>)LNNc)hcZ<{DyL-%L#)zKY-BN{cDsOUK9sSR%_H6QuHKriCs3nIs{RC^^ zf>IlnR-rAI?tVeep%WYPlMi@2ZkjWZlXIXiKba01yd}1T>pf2f)|Uh?DedAA1jJy| zez&WrO2k~LUjIytN8BSrJ6M?A=@3>Y%z*WEd!bc{-&lEtLp&r(2rC7%JH7-@dFixm z6~JZ=8oi4U-etY6C5G@W`3<{|{wFgthvs@c5rjc)|Ap;*V+bMR9pz@a$LlGev{LB3 za+7U^nE8XLbxpLYqYg1SsdZT;GrExotv-_Moll|13$tnX)>>E&lU>O)oK}a4cqBic zYQJ)Hx~dMH{daZZW4($9_j9RlIDgMquT!xpgJV`#sj06dG8A z*^mOhv;(QO6#Bp#c=~f`^w?-i0i~qc^mY9rpw>nA&avguh7N3=gK34CQ_7!gY=AF4 z*DA`tFX$;$ivEq=a^NKhs&8l1=?net2|v~qO3Cl48tCh0ekI-q%Gu|tR2m!aLJH#A zyzn~RnO&mP@F6Ku2tt9@e|t+fom%d1Lbwul;X6w_Y2;bz$s=QGN5IJvIn2e3j<`sdLvv+K&}cxK&vI`XP5mFA>l75OD+9vzxvGo|o@ zaAB;q7t_xxY*q{RK9E>ng5)8}sP(&uV6gwzj-a9doqo64LBqebS8;^V#EmTuy15kr zTDQMqTT1uyr#H)Nc?WXp8mJ?~n^~k*X%^wH-+#9kdxl{a79E-C}+6hyp&(z&ljM8xy;b?pL6fFTLmD{co&M-9!QrFElO4 z+a_;>SRe3157XNpm0jUY{$8(d6NDl}Qr&Mbr*2$w(X#WmTtH(#POi$F2bgWCU2ymF zDDQ*m)fWXLI$Ibb)&t;zRGtR5eem%+cS{Wt))$0%h1J=`2pA1gSnBun<6o~=ys>$Q z@a0n70jcNC8nX*Lq^8DT1dUzDT(e`~8VD}1!6`Au@KphKB}}H|y~kK~;I5i%8o$z* zGe^09=kV(b>G+Mt1YL_0Z%;< zOie;iK6!s$T~aBKgCW}?Jq|3ghyoW;*qa8fR(yb{O|EM%)fX-Pj_^{SeC-EHnTh z8}3KoDcMxK0a_}h`W|>MZyXv`1-@>jCUIod^=OTP@lo>&X;fTw1Ol%BQN`FZJ3FmO z4z=N0syej;0I}WNkCTvnpSWUfbvL(qbnD+y<y?M96bMW>Lc zlEWx&0&RxOx&UO^pVbqI!^-vKMOZ|u&|u_c<@aqB(JH{956G^Qpe8}fRw^)^J2 zKrte3#Fj+XN7sf3ypSWI=!T6^ZzQ|{>^Q??Oxcs8I(JM=n$kE;RJuwiFtI?<1f96a z{>bW+*al*b!&p{cNt<6~Uh6c6Edc#sVMd@G^oQae$(#)dFvrbYI=gY|%4ao+N2Kav z=?xp6otzVbzbX#1&XM+>EUTixH;T6=TIM?h`vv*0v(&M!E`Foz!H2scK3xGJIVw9R(6P znxop(`DImgtX8eBXc?R#Hv-hUcNosEK*L62HtbUDi+%|#=I|~kscI9AVJ#F^c0Yd8 zjdU%D)9{vFxYA+#;HiAMz5-=iikBe0t|P7Y_95hR2MgRjSXCh zN%Bmkol3KK*$}2BETH$EaAPf zVrW`h;zg@ub2TPjBb%61sKU;=K;0?<6`Knhkg1EUj#rCLc&FoxcEG= zvk_0!j-g$fw?I!KJX2;aFtvF-LM&m~1q%Smhs3JmpV+&fX#y(NudUJDP=V}HwEYUr zSDUP^%O3r@>_Hm@hP8-%Z~>hgrHa|YNu;$RzCL?qTcADK3WXmrR^!ggFs3tB02eIO zLU4@TF~p0Jm*3S$qsT`dW4y3#=Q`xl6i487@I+UPAABHQ$IvJv_-FnQjE|o#1?0kJ zV>X=`ZcU{VpLC~$>+9Rm*6ZNc!_;M3?b?ENOgaBBVS~I}EThQVAQ%aR%D|6QWJg3% zi=o5ij3XmjY2sXrNnn~#Lqa#EqJ#_gV`PQfB#>r6kogovletgz_47pQ+Od^-;s;KT zi)pXrc z2nDq2Q>IkVC8eRP1l%Rasm5_lWw=DT!d|WIQh(ajNYcV6O4Pg7EVLYpAk}-5;lexo zHRsw<9QL>2zx~R&2eJioq|0FciL$851l7KB{Gb>k??zE@qyOS~0*PfsLkO_PIs8Oq;^VvKkZCLj;KQCMt|KR%=|N zI_gcU1RZH%btav>+hYPsi`L5cOK|d4Hs_3|)3r7Lq;2fy)kUkg4GB(WzM?SKwS1P+ zwI(T?a-ve8GY#}_?Hi#pH#!S}Q!^s0eYw^8g-$3wRGrd{{Q+t4F=ib2I2vz)dHA+E8HDP3lzxycSR+ zO*S~p^SJ+z#&&SFkXcrrXUa%23HN#-0P?tqwXWaRA?@wY=4&~KuS_0;{lklE-1;=*L81xm-x6*bV_71gzk zzmxC$lA#Rg9};jhYGkVt;sUjfydJ1G-+UU1o>OLLaT1=T(^(bfxo~J^MMNM>d8Ks~ zTt)(?bZQwQW^qzIeu57;a5Yg zNiYD=;a5YYGJeyIpGI0BTXKPkU|ywAgz?f?Qe7qeJSUt>Z(JCzP)sq}$)R}IC;u>RTraLC8)98+`IvZ0Xtiy&=E?Q)zj(eIiX!xausvMw)@&%POVwrJz zwvWjY?K@pPqO4@E1|G4Lq@juoqt`cn>c)oerxvNlbUZhS)U0^!j<;`YJSvv=-Q#(8 zM)n!#rh&%w`2dNM)~(wB(7Y{|vHA_D6oxFhtb(DUw)E~m(ENy20^b$*lQJ}8$!<$t zMA`~M+>G#1HoP)i)b{T=U=s0SVZByu9`!;^#GLDJ;u(N`g0i}{!UVY$zxwf-SAZcw z2el5dB{&89;S_WwHw6fw`e!jCfCI%LuwmC`U4a636h8mx#K55Ff;Xy|%ITIn8j7IA zKX^w&4^ofUnUFQW>{2#x`%788ftS*WV{%0jpKkV@b{BnlP+k`#eTWd*&wDRVw)e92-FM_+m+9$4&vr1^~UmC9;jj zBxt_?TI`=Mk<0Z+Y``l;D}Ys+eSz#YVk=DCjK={6_fobQ;CfNI<^s9K2w1DbA$!{e zK-1G-8}TZj^|VXaUsO8AeG3RZv4jXE{-PfgkSx)~wxx0bcjB>I9scc9$qRvqY3eWzTDqj4h3)&vN=5bf`j+e@b!&2%roZumy0 z3~MAH9`Ob}_#hDRMlO^YT=8g&UAp_iNInk%u(6)MP+o#D%54XLLGvoPc1eQHa$k5E zK`EkLLb(oXV!qI0Hlc}sggzg{D?SrUx*lC6hm|%r8|4sr+w6-_(-o`H6Ikck?A3Jf zf19(Z=`nj6?OlU_g|E)7%cozrVZ@&tZ2@%L8o8d{-ihFZHBN2TQAz^$tJl2rrs56tQ1mM=lB?0pz4KrWdgMwOu$vB6Hc8&Pt}0QkPgxdQp`hNhy>Ad_&Xsaq zNPWr|e@Y>8y8XltV@HX1oN#pH26y2Xv zC8fXMacqEBpf{+jG0|HPRPL={?!2Iui4I^KXYBx>X%)yfNM2V4)TYDvgRgkgN4)|l zludtpu@;eA%evwk(QMTYDDLtf4DUrs7?k2NrDcSJj;2w%+AaR4LRR#%7Gnt03*?Ov zNp|^y@YV!QbG$6Hf}XooHYamUG}&V>GU9aa{Q=C&Qm?%rx%S#UwdB1`E`)r*kJQnj zE8rAUe;mhl==bx$h)4Pzl)JjFzySQN=gKX#e5*T+el;P-K*xZGNT=pC zR8iKWNL+H$ny7ueHC8P&=awqo2}m} zux7lo{jiwuZc=kB%+^`HJ7v0|Ie_B4TP%u3X;%cyA-B;zf)MYWj#_tZoqG_Xv!jk> z8^|?|I=FE#pNcbUd&q7Y^#W2~f9c9&0^}0}C_43+?y6eO4&U4rQQNEohZC8U!IK=K zP<7>A3m+CilcIdWWGCw8cGJnXYD^irHqe>3YAlQRAzoX+lNA4`Fp`NS=EEU*wk5V< z2hdiytz@_ZE4l4XYm7NxAhV9)5Iprqy9-ebkdMiFS(Kw16u$U;@WnzA3}!(9XT7f~ zl$rJ6oaQS&v!n1w#?1O~Wb-xq%=(aMK)cjqX|SJJS0BU?{lx>t2NbqH%&YPL#Hjip zrRcA&s(I-CsOW!uu2jniPLIU;=4ukVhbg2_R(KPPxK9>)+XwC+U%>gt_qGp0&8!2@ z#8R>0bmMI5gHL83G6xE~8lZ1@{rkMiXy`@>3tu?hA454jo_T| zseB4Q)m4RqksrebfMPB&tjf6q^(Uyl@;-bj;aV-+;34PmC7LK$93NO5zLvy$tRF0{ zQdt<>Z|G0A@9Kx49C+{zZH#>OT%=Y)z!o4Q+C@UvhhxW@=6;Y-Kz z@Q;c0qAy$YG_f9(u@xnWI|;6J_Ay{(_9z@ep}K_YvpVl1O81o!7TpIM#j6Vp6#vyp zem=Mkopo6W^Q=ZieJbz7gCkmrQBh3q^p%V3A%{i;j}QP*)e zc$7L9*sb&Mv&z))>wNJb@UIE7E`}O>4qrUnV0OemVza?%rl@|k(HEqjUm_P7;kOF0 zXccmFKp5C{DWv_ct(DhU5`361q%2l0jP}12wIunVsv7MEJ^gG?T`nzJE9W+;fXV!f znqmOehLkA~t%2JrHvx{S{5PtjCt>Qj6hi8;CHA>=WG!T3sI(6D$x9jY+Iqgdq#7@% zTml#G#$4l6hi}SY|5gY9d>7Et>!9#hyiSHURFJM(Cod&)Uq&8%Z=DQprwILJo!pTI zJr*7Yq_Xr|dm(M>k^z70rPEj1%jnBpGD1s~0n_z7;yO*`O+$k^E<%SOLU_w>ojjR+P0=`wo=n_UJAbXgY?Pa5^(Hw+Egf(Y zgg&UZ!+wDgAn5#V8Ym8`0QR||6O#+i#Fd>W3F@Fd{c^t-yfl8`ela^`k?k_ z{T9mFB!?@fc_aE&(22*;P7~8{||ufn7hVa z#(UU0Ag{K-ON^h=4;nlU>Cd;xrS!mnY+~2*{~VAnfHFw#vUlL0u`YWH{yE-dzt9LK ze|V+ea^MO%nue{5lAwHUzXIzM%IE8^kSibw_+bthE2%N@@a(UEcHkRVC_DCf{F?^0 zACH6q((d&-lKj}0+c(u)EPj=l=as;+C`g+hLD8o-+6!pQRyi9ul61)HwG{YOB{U;N z`o(tjW4j)?#O|}GF40W%FNdrxHRB0rmnXc9m9+A9P~(P6?csKzUG{4p(s5OwUsW%2 z1FZb|R7ujG0KBJbx5=SGE?YSY#p)EB+YhhluWXb3#;AN?EoLcq3kYEMT6=M|NKxfi zIpzfQ@C$aAs|4NLJ1E<;P;4~5AL#x;*~(i)O?)6~g1%_)T6+n-JSbNOv9mwUCn^t_ zqUrFf@ap<=>=~lEICDeGhh!@TKA@5ft}dW*t%>3SD&-JuzGI!8 z+Z<4NSnkGyC59*q44gEY^w2ktCIpiESpyX0DokEqE+ z&+dZT?cuBJxyb<#6|P0?Ne87&{fD?riD`1rI zLsZ+`5sGX93PruwTbUF9nGstw06L>x>J|;a@P#eP9s^c;z+B9W2ZV<&G1Sm^@GsC{ z|LG&LjG{mpUX_>8uh-k>Bn4ppI&rmJ50Vi8(aHOyqmn#p0m1UXa+^f2-Yyr-4G8O3 z0Oqgu#brgbXE$gp7z^>`*lrn+w?XC0ZFk7EIRQ{4?mqYk{!3%W0;^F=6!g^&-MvgF zzf`x{0wo0Qf(#`VAy@~x=Q_J9DFAY0@Ol6Nuut~j8**J7ksE05J8~+u?MFbs-Pu6C z=-w|k&J94Vz~x|>ZLv3UM9f67&6X4ZF|xjCufhj(=>=N^AFu>Y)fVLkKzX!_n+cY| zx<_tdmZ5i#yb4BBIyt|gl%!F69Ue~b+2Y{{RlaSpkgd8gms&5k`^!}kUAHlH0y&Lc zZm+PT5*>l*su~(We6jj%6SDr z2%>x`kAfM&qh5L*rNO9$)p`XEl$;yvIXOX{uP-5U!U)B#Dj*a>7d0{M`MSBtLaFNEr-(nvoPD()md@Heuvud#8{ z2!_T*`&&GPh6ZYD3RNca{-UEluvN_I8fz0^3E+;@rY0uYZ{bpA9T9v;@!3} zQVznT8t%TqmQO#kAiU$1-3Xufv&EJ{&B=)S_|XDHwC%migy0^RD~;L;apO~E<$1KC z)Ha9XrE<{M?cek_(*lz@4-r#lC?yT~g@yE!hjP+uXY`l7J`$Z$ebwRD!EeZcNV1px z%x7~mm#(`Gdeww4xatZniP}o(_(y8zrU(lx^}g)|-aiK*?YqmBl456>i%x&577ron zX5K=fHDuq;ctx7KF4V!gwn2R$#!&~#s`y$V>daThaW}~%ZG+~ug+V^y3s&0%r z%54Y?3YVqOW&=WzZZQ?+aOm78XnRR*5yz4h(`^eqVl1>6xpLP9M%{d8@K8|H7#{fOs&c-ICN*@YMXETc;; z{z%bi1MgQX*ePoe5_jUe)U^xhGr#!7@745MC|`YZ$sj`uz||e08#4ZfOi*rFmc3Ww za`PX);vdxam``LC=_rJ2RY58=rXxa8B#KtPuahs6nniOYWNLA!KYA~dY9#sUMRFbA zl&|)}9N+L>qs2;5Xz6vc?eLCHi4@?>eLULAUujuqW${?SL9ACA8SdZ65aZlT_f^P|2n`yPTO2#V zZkQZCF?G-`RE$a}j@o|!v*YlWZ5g8w2)KA9oI75C`Xc+90xwn>M}7>sI>A=66Q<^Q z8h-`eBY;L0g{e+3+W6^)Pti8%0zI-h(j#6*H;o<0wUFynSq2C?Xk!EZIn>nPB6qH@ ze1J7l@n<VylfQ>4Cb#s?leH1UTTl~V$ zQs)b{!mRi!JRP)jd8CBO-L6zF0gAe}El0_Y! ztPDE1$;n6K2~%Mam9CTKg7?t|YT=F@4mbxRohmCx;++65Go%DWY=YhtzK9@G@nyvp zAE7#rKOVm)x}uiDen|Q?ynrFpv2YYLST+2H4W&#ec|C(XDzsb|$}-9@Ces%%Vs8`> zhq%WrYT{EJ$k=+%MnM<@P}#FO6=5CP;h_wj|gCHcFg7RT~-YWJ0Ct5@tfSinC)N z3<~Qt?$a!mJ6YRv&9aDd3an)S9# zbtP+CNAL|sl#tjGYXl;yHoI^j*KLV-W6!cB?pPj4q4DROS;=4(#nvdJ=G(AM#fD`b zMXk$10P0Dbk7FcWBp*_}@mRe0@>N$G&KxWz_~OERKBc2{{7)9!xhh#dy%L5IQKOTl zQhv26U~J+T+AMKMAnzHyKl$|9VRg-2Cz)Zf(YC&RE%+FKL_0PF0X)}oV8W+g5%D+m zbWkK6Rt*aYQXl4b9fEYuB%4?&VyU%Ytl9H{-5K!%1m_0Yzus3&S?0n#!Bx@;Yi*h! zsd@1Y$_tE3*HKcW$V{Q0`MGI=5mo}cc{&&AMmpYj zvyZaBaSCO4ul>*Gw|Z2nB(i^mX#(#W-ka?BQ4(Q4Sn(4-1Ji4K&1vyB`k#cY57tEd zM$N7Hh3#?L4}uTIe?Spcrmz|D6M%zA;-k$cE=oaSuW*t-ZVoQ#Oh7@v>N9o$@_jw{ zyuF0k>`&6f^DqMSe!x&fXWoXkYTq9ntLP?Yp_!gdt1Y9}PZg%ljSF;i@)X>x#%!L7 z6k$Up!|&yJ$Q~P>Prv??1JdI=js{xxjw6@?-8VRO>mQ(wKlY9TF0}7B>@@KUyRBTc z8}fMJ@P_43`@||B>iV<8O{YH}-a@@UvbpH=1QZ<$35Z|JX3qDbaWN8UxHho1EJ(3rzhPlJDPETgk#%HUs&W>c8cDrYq z4GRV6>{t9P-dkv<(A&NBt{O7@%07>_U)54a-k;enCdmj0i7}_g4rpu9N9_;Z*ZEuX zw|HqVW}&o$#yV>TY*u_r8U8Pam(a0S>|yFm0*Zu&`%#@LoLdy!k9rFfOWNgDOtA2d z7BC(WMrgd;&NU}i)KdHQ=a6^LeH`38QZq9C1I6(=VMm6|GGfphPz!>Mx?<%M2% z!DucMuh>IIAmrTRbk)Zv-A;>dab?ndyIbH9Dv(}at6-!TIPNmi%YhewO~P0%@oAoG zj_cXQ=wr?#=nA!I1_JO&H&3%U87GWHrzvcrj({(fe)dpKYW)nA!R-1Beslk#21TXe z`5RRlw0ATH3`0gJVXa20&}vv6G~viGGZ0C(UaxU<8!}HzPn&^H1Bj9(T~+_MdV{$M ziM&f%N)_h5;=%efN`I{qFe=<8ZNH?^<00;0Bs-ao??uM%H$n}WI+e#;U#!U|slFU} zZ26JeFdE8w54%nks%{!7VQLY1d;wF(>X5=TXfx3kU<6^`6d0pGB!X(BO7+3j?HlMB zc=IJtYs1H5&oYzCG>dlD)Tfu$f~EA_E| zvnfVKgTXotn`{85B?m6>E>kppkoKp+9%w<6;Ix2sz(J^@S!_RK%qOT``Rx@V7e|j* zAU6WqAp+zEeZ)HW2^E7-M7!hORfqrs#|kAT0$y3gg)p(503_H6)&VKCMXAf$S7>7e zE)N0yEbl8>n>f5j!B)fYL0gRoE>%}KMW$dNiV@VrWh&HUblRvnxsMPGT(375+$?2=(A)hM}7>iD2Op-)EaX;l8OF z(ed)UbLq7}P(M9Ix5e>@(8hUvh-jFcpIMUDED1fNlWtEhEP;>R`<1aL)1kB$Kt;BU zLeqg)>iAK9DTaJ4Hw zZL0Xq&bfRshvtRlo2%0x*Tl+tf1-F2!uzPFx86JoQ~4{oV|=EFAWx0W|7J{3;XHC4W@KH`V+Evv27Y09;#4$fc4TiwI9kUpssJh zV!Y<1?A!xy)#2#YboneN=RI9jD5NX<`;y6N_}`#v?+AO7X=jN;*+8Fv4xoM8Kkllc zhYzEk?`?xEQ4_=SeqLTk?((MeWjeWS`2CCF)4iP8mgWT)xiA-Qy)aH5I$T>p|M9XV zQRBW6pHk!K^cw#`nH&IsV&1hsqA62tpI+7df_H6Xl;fW?zi0hoIhVxFUeSC_Suf`j z+BFAierc-QK7R@rPeN|jJ5}>rili z??h}Rc^`-0ega6MF z;{dF`@qrgUw9?3 zpp(pg%tF#hf-5rt=P-&7UPd~U=dvd=o<)=n+yYwgJKU9iVOyBY?#OY-Llb^SqL^fF z4L*bw%)?-FUM`(k3@#MFhZ%W#7h>-D9y;}!%S?5#@(6wAw`Jxy-l2_dxHaEQz&l(> zZ_URIfp^&UN_i?B?c~+P0DebOY+3ZeP9D) zY2wq4QssT2N}pfjgMBan$UspAFak~VQXrzQ!g{|8LD}2@0dqL~rgJ)sBHi((Q&%XM z5bH0p3%S@7dg^``;~eJG+rdbgg3;K!x>jj(#Y~7pXvBQ%K?fG+9@?K)SULrPu*2a? zfGH-U9`CqI)RRotJA4`R$#kfx4n7qw#jW0}{Dr!K+HiZm+Kb1_(VC;T=g;WHc6W^l zUc0%OLJ;9zT#X{oi)3o_0=V-?6OzC%)FE}gWrA#k8$lg+BPJNl*Re0W>{N~=fgk9D z<40!QJle1b{yRNy!NCx}Z2y(5Bo7ZK+&{QDfq96CaXhf!0p~Af)@<{5Nm184Ut^h`)(FwspXzU_#J0xnXN(tLCmoE zbf>2%Rb}tuc#ZJXr34D%b*mZ#3Zlc$4!Qh-h}H4Iy>BWEq7Pb+DKLmWC_ToO<(f-; zB23e#hLp!0N!TkFIEd&8JZk`ic!3cfSiLW@e`A#`h+omaM$b~aFLAc`;M0c|sQM0F zNl@X$Je7DyV9g4QL?;(Fndvprss9dp?LMeKw0RWHd+e6WSE3Yn=mIIx0SB-ELnW@H z{&$1s6x0U~y#!9;POndglPGQj4e>)b|2M6NF1~6&Ue%_OLy+J3nh%0BPXX1dQ7pjA zI6IfBCt-EC8gR#+ySRjB=V;u0cS{bI> zX!1}-(I{Mw#p_sHa5}~W`&DTvJ~f)FaXeUHmOgWK&~715tNqovA)~(u84ZH>6q#-5 z*@QN|$Fk-)b*^p!B9TtN=qQQ$Ro7j30L zFQI8ZbAN`p{A>d%)Dogwc#=K4E6?^MR+QhT4gvdlTmN7;o$Fz5Q1|fBiyO@4vo|^7 z7XMS%s4p?J0(-!(s@M}l3;jA@x}nwiTPOpnL(kPstnM-1A#vrV7x2KsPY>aIZ@lQp z4*21{u3hi>zJ80H507{8B5yGfD&to}WpvF~7M-s7yfSocLlPR`gQ zIyH-C23uIJQ?$$sS)$&@9pTU#4$Sd$SDhWHpY9$GvfH*Sk? zc|U>Ks4Ynsa~#}@$Yc<-t;jmBN$nYHk%Vb!oofX}jM%J_3{ zRJ`2;ec+Q>v-zHN(AyW(#s?j|VBQlL^u+PPBdz2S5aSQ?4Ss;_g|Eb*t02?*K~Fe# zbh8B?tOg?us~bsYGQ&o?Sj`!$S?5RAAlyR~)8JzMiL?tcYhsOdE z0{>M8C$W&Vn0pn+W7<&c=)W9mIN{MVV@R~~ZB+0>aZ~{qgyL2QZOYiqWmX>-#QrGT zi)U$;L7HWZfMvkkkTyh!D?ELZqmX)R^{I=`T8~2ZbrA##!_dva<^#(3>B^1K{-N5^ z(Zoop>ZP-6`2i*IPkey7xfvtf?9-zzADu1=%STHTge85h!CEoHBM76V5d8N&TG%VD z-a*#@+$-tKCm@ym`X=dj}?NX1Q$}FkK$nwT#J~(x?)rK$^5zsdh?-1h~XwA zm^hYWYo~+Xx6P$v&7M=VqA8RoT=@?i^Ouc3)#7O~jIYSIRU6q>erSBV+16*sP>niK zgiw(8R7&ya46@KYU7F$k^M%2jdg#6%>yz^8*=3O&K%2&eGfj#SiE8b$k}O4xn<};x z)21KS=bVf0j>{<`(=8K2W-w>4A>y>wT8!?VMeNX?(D>llSsJudCwL_IY4r{lxJmHHQ7^H73TLHV(dz%-bge+W9~%*&ia(b+AAyK zZ{pUq`R5ffom2n&81*D52I!;*X{A07rm#e-U?xXMr+1c{TmM0RkerX%i8E0cRAhupf8JZe^g)KIQujtRs~b} z|JTOKGJVnMMyX}WDE-ZB^SOrxe%*TJb0+7jtr;xJ8C>uCVtNr0?KBlnt!6rpo1Wlt zsr$$E7Azh8ku{CEJ$XLjz~@`Td2Le!$iIV^6_qVN*E)rl%HPJsQr>D?HAz3JPgygy z&u3#xbp!lZbyJI0hjTUtlnxEMrQGSfC$(1DN^+*LoQakL9DT~7cn>a8*Mq-{ zffQX5dsJNp>{~yTr`GXx+@oT_{S=*z`{C{tm}X%M6I~pg*2VW^|8$*vpRC_Z&QB`? zJTg7zbJqbPfvj`oODwh7LUh9AyAKFQUW8Jw=R| zaq!)cnJ#(M_A=%C#Pz0NOxfdOg_^lFVHCa!=?JF`hq zBj95H*JMll+H014diBe8Sim9kjO_@+oCYkp7H`oUwo(F!bga{F#!WyrY^pE8hY%S? z!X?>kjMuI`u>)^HU;OAHmzCC!gsbScUKl5rZ?1R2uI{7fUUgQ|znOdu_y!c#3;oN4 z-M#a6M}@Gvdsq2O@gYJ-8(ON;6~qVZ%zJ6Ft+s?d(2Jyi6;-};`fUReJ&sm7QG9j)P;hW-c8W0&KJb6q z3QD~LzoH)iDQ6qDc;`MZ5MPh8f&cjH&U#kB7Lw#^$)LM;W?SgU_2D`?{%DTsA<*-U zntIysTfBQ}U;Z2b#FQ<}m1zC%oLLmO0nW>!Y{P!kBFfIc8AfhV_OQRDnu0e2UqW%P zx;{LYKI(5luEOiXPD;KJ?{aJDZGTHn4Wwuvoba_vd{qG^_>S=80Q5|IR&9_f$zjfA z;3&SZoACfZANEiBRwnu2$lcN9$EpmI;bjxN@2k+9znW_UwE7V*@)lM&meQi%oAPMw z?T!LG4v-A7oM4oG)9M43II*aMl-S8Rt^rW+p`X6!S(ZjpK zHerf>V-nN+(jzW04kohx9=;MiVGL#d(`Iy>SICK9In(GfTgvm(Q~^Ioo>M8MV#C1Y z_)v+X0j>v~2bD4$uxs_&veELd*JR`K_6y(yeWJLwgZ^X4k9?@Umbvu3KU69XM?91b zbnmTLE*Q#W3xhi8FV=Z6wA1g-`fwWE z*n<#qE*aGu<{^ZE%ckG<)aLRu>2aLISEWkvQK;A88guf#+E|`ub`&$jhDYl8LG4QH z6`(7uscp;kt42rVKDMagqFM`XBhT&!!?mm!xsTc}sx8M)0qVV|b~Qc(sqKc^F1)I& z4fWNql9ASr$?CYs*N5i-xb~W?{lQ#8^So+S}Fm0(%IHx#me75;j`jr_%Gb&Xe#En6Iv)PI)u=0 zn7imu8>qwmM;$rzmuvmG1^7`PDZ@I+0Ep*(P}ZG!$60O!Slo%XYKx7iPyTQipmCr| zpM@d7ud@yb7$g{m_+1+Nv$Kp77oWb;UqA<4zTzatjhejHAL6{lc@H?6GW|NI6gs{b z?qNT<)Q6!&=7QeqeTyl0t*d}uf55Sb!LGcwhhri?@q><7njdBl)DnWnOxS}?pS~T* zi{Vrj!H)=K8T&`6&R*Zu7gaQ1(Ap4&jkQ9JeoQ0p;uV70~2wfW#&? zf9{8BE9uF*!|Jl_@cL@-j<-Khj6LFO<%RYpmgn)0A|>qob6h#}l>^~a_`zVTC4(z! z#6F$4%;%zC4h66rA4bqrRVwz2C|h_=tym9lpgsZ#?=Tdm((5(1{rBDR8K3UY6& z&8DaL4dEQcVGjqk)Xr6+FOFvw<|-a~d;Pw-99N;HToru?rLn`2Nb-85)(TAkNPi+sVzDcJxpo>Q{Yq9J2)4l%> zdv5~Y)>Y;W*Gued-Z$Bf|W?!1p*tM^ut3-({E0WzbT~I=4 zDa=fpQpf?O(1f8-W@wwdEMX}$8HQmN3Q6HDFf-7GWtbUWAYpwOw(tL(d#~=5EG3TP zGV^`k`1fmLOZT4TInQ~{bDrh@yqiQQek*}Z7V~AN9OwX5aa-6EPvWbS#WnzIEye#X z7TZAVRz#^6}2 z!fnX9SaYfcpCaO@KM6BJ+r?a%99!PK0w10@2?|_vb}z#3@>dXb zbx!Fn!|$g`MST7bUG)0_H)7M?_jvch3dsn4fLM5%oe)+mrxzD?YE-@0)@`Q`exQFK zw076wgA1*`W)^>`yX;uRNr3E^K8n?(I5_-%RCX?B@h^3k^GYHG4`alfpR`e(5_}r> zXhS>l7vONdq}uqZsD^Ikx=I|lun;|3O&!Vw4Is!9-QD<|isl+&qO{FXJGY6^SlI`5 zK;=18f=b@JMGVn_H!gg@7~a-}4S4&#-kaH(QRf{d#81>NV~>9VO@ng=@xg&l)Hd{L>3X!v^aJ@#cvAWg|C4~` zfG7n}E*B7wfVA|~vF`O8Q0n4pXET05TIBxjK8`2_>Ej0QlY_+>FshLLLf}BQ@_Mn`rs~0UdY2 zk=K0cSCBuB2VJ&K4O@zu<#|>F8bv>*X2CxXx_a56Z$dBr&)>EppUd9~2t%MkJqvl1 zdU?fi`r~Y~?G_f_(_cn^oL?t46#+_$i6?tp3(z<|yYOMLi^adXqOQzsQh**{k3R41 zXaD|T+%PzJRO}&FIs5t1mP%IsPtr0Jj$v)RT_PzOA7tWRfNR}||GjWKirGB>wH0eQ zjFk9!{Pozwt{dug7%7?oaP>PtRVtn$H*|}566t{5T{pA%zW#Fj1s(EaPa}T8YTett zy2uTcM;vf;vax^es>fz9^bi`qk<9Dn*Ausf_?xDa8)}c^zV1%6gKNq^cdf!Nh-`e; z+eOfjM=VS0*cNdGsuJOr6RfUdV-NaD+2Mcbs;F^m(MWvIG-BXhUig{AU*v|~bN;7} zF8qShM)s~A`~pGotu9-a8-YOTB=I;YbZ)IofH5ApVIo#WqJ(NcumBX;JSD{jXx zUN$J$c96t+&RfSWzOj4tQnv<#OO#{60#6TH^EuC^N}tpxwA00UbZW9afNCe=pDtI^ zR}sq1O*ZjAct&ZUPc3V1WWggnYZj`>q(}jd@9y2k{%{28uT?jL9gn=JXBoELi6c0Q z&V8kCF^bys>|p0_cJb@Mq`UiOcKlr5ij?L;hZ1@jTMwmn==KK_7zkm30AeVYg@=%V zG&j3$R?rPLX>g3~$lqqGe^geoNAs=IATDqGn9+GQWJns&i4Q92t_SQu`x3V{V z1W=iABH_?2u67toU|yS>RAGmTJ+{G>FS3+NBY-;B)Iq z`>2IA8L6tMZpo{(a(D&GtEC?;-Hs><(|kHaA_=G>B+0V2ODpR;2=WG64JEkhKe>3W zrjD{z^&kBSl~JlhQ9WIFiYl!?J5>ZrR^Nzy5j(Tj?nIF?=sRKimSPc+&}=Ab-;R$U zO6$EV*t7rXD`&-3Jyop#?`oE_m}0*kUjp*&p`JGOzHj(T*zs?BmauOt_R@tgRFjbz zx6ohuI>-w6``Xpr7A&JMgaqS*h*aX$Imyx~0)!PdhDot+p?Qu_jJ( z?eJNYh4}b-SMTZLzxEXro_=nh{nNa9<1^4~R^G^t{{hJ%zkiQsDLb_u#X#{;Y5!I3 zGWPf`4^Hf-VMaXspbZ#**lC@!*l9^7{(5EYwQMz-^xU_Z`gSUv%6j=s))`w&?|cs1 z%e=dKr!uw|wVH2hvB5X^>)VjFt!^uNlz#LLlOe_{)$h_@^4)~WZ-Vg7*Zg&?XT)B1 z8r$bb1;i1*Eb7bE5Vo$?3jas%C(a6f0UO?vPkU?}PXk(Go3Ln$D!?!O9s-;a2-XQu~MF;Ivbg`^d#y=oMQ z?$+!%|T4i^4vNMe<29dkRt;5i|FTBvz56=L!Za5}b z-RV`8>`|X%F}JjWCaP-!hDLHtu%Evb`Ble%*nPXY=cga(S=EPm_H-I04P9X-H?p6POOgeja!3pBUj z#oPK;;ATCvs;UP6WEaLwsmD22?|Bhq3IJA@(5!|*C{pcX6P7Hr6WTb0>_k5lQ#u1| z&jhbWiS+4LjIC@hH=0CSS`pr<0`~@X{HLBa)^>w?H+$`?KyZ2W4u79YwXPf7yV%$* zy~RNP!KGwQqrTc9^Eu*w8TEddco$4z>lbOgb+m?v$m7{ zHD#ta8`zN6{FAl*SaWZ6j$+aoN_F-oGf|qYd8Ug>2e6C3^#pjysY<;dGmCww)57RX zV6Xkl;EQCM_{-BzeQWS51u0nNJ21bF%Um^09`F2@PFyZMDB;AL$`@c@z@r{aOhVTO z$L&Ci5dW~gL9qid_t^U~1JCKwh&%?h;dFe09-crEKzeY3`g5?7Y28q?s#qR`vvUrR|hBA>K6x>vaMejtf3Dt6ae*azUXk(L?9ZZu0({Z zq5xqb(F@t^5+Hi~DAew7)gQm;sAk81Ra8QyWQI<;YwF;CB4e+q<_v|h zuShxUC<_2up)5cL$+W*>_oYzh!i^9Tg7)X;TmbfW)>Bmg`qA+J$uRDQ{;NF%ztdsI zay+CiqxKNxCb_XJ>O+Wn;?Vz8BLFsA_3YE2|0(u^Y6ECbx{V?MEmZH%=oktmnHTvD zmyEav9+h^8h@--Bws!W3+w9~=I?R;@h!ak)dWYlHg35LnD`U#R(J54CgtfArKE6=E z-ttRnSNAM?V8+&ax?>Pb7D|ZKfz?NTYAGV$HAkl95%-FSb{F-ke*_x7cjn zKz@Tcv7mPr12g41sMK0*PIbsf8!VZj+#9(El9pJUF~z*knue-&?Z{4nP*a*{PnlJzzA@|G(pjeFHz;p$taRolps|p~LjPA&Z=7IqJ_6F@PIb5}?Pxw%l`G7X9t=`# z$y6%LSq{hz(zC_WX<9_8S!Cw=jI0GUnUmJt*iYt2>>L>kyYVn}q_R$Kp2aBUl%LDW zzwfu)HCtA_x&#Lffr_!C>QPtINETt0+^M%jn9CD2SMGw9T{vp3WzW~HE}fadaQGKe z9kgX4tdTW~1boLbWd2=k_QLGOW=cZfLu+1@F99K&9df0p^07v;#yYDsgjtQ&oIaqA zwjs}G*@1uc*VJTY4p5S)DG(eXa_`_4A6{Y_Sp(3VBOZiBVq>D{fNtEvJp%4=`oF0@ zr-(>EJ?Az<+^eb9$x#`(c?zmrkMjD*RMkL->!gWtfgcjJaX6ET|-s zC<>3X(7S-f}!TS13e{2yTA#=g3oc80(;Hca+zz7~l1%QWTCS|FzGd}%{X3e{n; z7&_F(e6cE_L6f*9_yKBNz2TEQgiwMW^(+B>KzkP0+xI)Fk0oGq`IjnZ*CLmfhgl;N zKr3Af0{|~wtHt{eqv@q24{>KaR8y#?6j&)NRdW@JV?P5|({z zxjB5E8)3|8spSR~yDm|)4rvoQOt$vu*3jDX(;{W0!|}r^5=C7nR7EpIXC(EEE-GLM zEOd^&0-KH&lxQHs&PbP}q)D#Dx=mQB1|}?yR(BC18989j<#TK=bxF+=CZGyp9L|3H zqBFnRDostta{6i1ifD$;^5T}uYOk#A9SEj(?6Vf%aP``&$5b7d=Ea1C%UhZC<%%+R zDl#KBUZ=xBJ?=eP;0}!e(%*yN^dJ5@&}cxGcwnT>!-IJgZI5O(oRx}b=*<`pd`2FT z`_9-qcUvpC)}6}E8`j3H!4Rrfol)gL8h*tLeS>4o0|Z){7-2f$|E8MC9@r=I%*>Q* zoQjkDOUE0jcUe+9=?7aZoo%cKbX^Im=6b?nHf2CUZG6aGs#enozk10yl*nJwga-=1LtT+QbCTv2g2RCYE{V!LPvZsI9Qkg?bNl#uS7~Ckq z>8Tl#gsdd`L86P5Y>iY~RV{RvXiJNx#V+C3RjXF9r5|%3C*+ZK7mGi%bO9OB5s`lc z@kV4BmeW!*&zfFFVp4aP=T;JG90}`x?%V%!-_8R;#jj7qO8Gb0f3N#?D#v~MiZ`g) z>mfvn{5l9!ko{Up{#EKA)b3>jVp{*8=jew^KX#;LRV`cfTo*yYT)`^F{`KybireRG z6N75}96bI8o|_rB?yB)=>{q8-u=97fEMxb715u`=Ot81MtSY$y&KVwQP5(Ni;zbn4?W%$x5tr`PCb_9r<#&AMK$sNyU@*p8WY zr1?F%4L-=G`K+voTukWOBpn*BZ=pOk!>OE_R4TVBMdY|L-7^f9q(#wd^pj2Zww_EW zVpyqI_sbO(oaXWjnwvmd=0#!RR5ycVAiDFRYOfyevAjEd&*X7`xWsF@$p~Olt$Fkj zuor&&CqOg$VAN4V$$X!QI&LlWAe(8pYjYv$$ebNY?sqH)bh`^E0!Nxw)D*hB>}V8LE zM2+MD`VP|<1FdZH zqmCN3@(o?yA)X)T(((g!Hw~UNfmgQC>zVdX7fb`%54&%|;Q`X2OM{@aveCP`>ev@2 z9LOkiAG@S7d=IAP;_R={M?CF@JtqOrCDB4Cp z8dxJcd?x~ae-Lws9l&ek-xy6wD!@MflpmbzNV`!UHzu30ZK70tpeL; zWVa#BIHqN{A)kMyT@CgbafW?{0DVEHG;GHFI03SaY@Fn!xQ#%Ic%D79-_dGjUykCB z8jG4?4d@o!u!hZ~|LBG_FQRkOhBajWlVPonEOYe3*;mK4CH57wqptp~0D+%93W9m# zyMXQh`&Ub~Ar19%vg8|UrhVPWZ>iL@9{-7(xB7g34e;u`C7FbxuDB^kg&Q7ak3p#D zlx;#u=)*?ub;30!pFoziT0H_vu!KTxqm(Lm24wq^w zXTr-B_3ZPdw%Q!Fmw9mns%956z%&hkkHCmw$Db*eQ7wi5p=pS!&^8naEe$@8`6Z9B z(4}EVQ@3D1JxbR^ICxSM$~IzR&@+vQZIJBph8ta>Hd_T@X2gL@NqNgHxvh)H%Rcap zp1Rs>-#)+cY~A9^fOJ-^wRxs}g)4{4WFyD)(@Hsf$LR>)TxxL2Y(b>y80Y1zw{hC; zsN3W+jgMxC=owo#1iw#yctmdgH)#~KxHDAfT=58?FV_wDDag4Wx$ABFtTj3KKTWH7 zQKdKUfTO6ES?4+I>*ZT=6EY5o5onX171 z2F&OGr;$vTrJ$&uq&<^I0M6?EPw#WNm9_y~NdTthUlCGjt_{=bOLM=8F?p!h*_yZJkWT+c+Fr(7&X2^C!v~#tL9cgpb zP-RzcK|RxkQjN1Tqdu|>5L={*-84U{7(22I5RugR=6P1b*oB)ts`r&FHvpQ%EZ^|D z`CX~EX7;>*^jbm&|9>w=bM_Xvg0e&0Mn6}h=$ILN#(qfgdVEIF_#FG;3QCSTpv!Io zU4zVau;NwrNSkYEM>LMy&()Xl`V6-pn+Al0?d6I^27BE#lfC9sqsij2?3H@Gr80za z#%iVVL`-H$uX$T7v%Dv5l)bslRoRlUQrRZl9BVW-bB*TLgqvQag(@%xVH~K|giG(f zo~#MCG2z1jp;++3E<3cXqLyv{aG-sO;KUwk1A&2Kc_CUZ>3e+v!X@JZ2E^8f?9z3(w3Z&yipsos)`Vhp5jL9vVH*A3B zaf+Q9k-Q}+!-p48oVa%f>#7WFCc|@E)Ul(OOm?R)eIf8l!2%S?#qVGKV&I?fJLMam ze*W(R@5S%*E<0-J-HE%#g_BYP;D6cqPg&KM+43(1fY0S%1&bwMd}2(NfSr)S;)|s= z_QNj)Rsh8dC61qzEKA%HT^dkq4eee3QeX!=`Vwa9_OX{51G`z>mPATJ2PzeFYih9Kd0x zLKHG9IJ>fbArebrmBJ7fw+EU6y!&t z8p+Q8)FoR(pUM6cl1D>IVk#ie|3|~ogni#+G=>1)kZg}D6PQWCzXVzr-~tHa<)xq6 z>X&6dm{bzr)9i;mxT|;6HR=!Jb>lKj@|``<5olb8j}5CgeQZa0H2|9+P8ui%$>gCP zm<6;dU-UKo7>{r`4;0ot^S3oktl~Y@_3YpeJWb32L_rpJH7#b24+AU|#^xqg*|1Ct z*@R6{51*x7TuZxHH3(|%7{T1)B0&Q!dw`987?CZ1vsm&I-ryhjzwo~7>I4`@b8iV- z^9}2gN&)5;tf;^}3W5){g}>YGq2$p2#m=r?(hU2(0H*?uS}K7nhylP^-{)^5p#f(C zVLl7+AmHomQ*vSo(2Ak`&;)^M#V+3GZv;L|h*jP1ud9zEHCahwO$5Xu;&ISF8ac$| zJ-v18uKNK}mbl;FvWR~#;d}Pp`~A)A>9y^afY8~LEEXILJ%Uhl_#))wp;(Bn8BCt`cP>(uY|#O` zf7H4P!VSr=Z^R<}`IiIbOt=uR)QWIQ(5tEmlI%nwnf>IOfll_~TLMe*hMT?i&A{3k zQHz12CsY<2Wy>E9c<=;LW-kP~JE#?ddyoz@wU^k%3^c`_+7f8I37?sur40TtSWL&4 z%H}VKPEk#R2EJ6KJz!%Wtyo%>+L&G#C4q>?D6+)mDYA&kw85hxLA1puVMz}w<2>sC zu~tYIkH-^}xJprzrl?&!hq_SHu_-`R3?)K=08(gshNdPbqM@BGr~0SEO3oA!(w=_C zC5rYR90YZrE6LzfIzGHO9=G)e7vXWg$G)0FI^_}cg zYi|wYjMaj+AqEs{6NQFX74+6D5^<=|Gk*5?Q`U|m!nPVa9|+(VKAMKs37mPt{i6xx z0A$_4XhNYq5D08j4oqXm+|N!v1Yo__UUn6Gbeb8nRtaH`C{v-mqe$cH5&MMA2>|~< zngjydl>=*&Q>^M2UA3(IEwzgltrA3%msr>%jZ5oR-4sn=OY&vY@=t`g5(`ttMvuP2 zs96!7;FsXLqsl>bd1=lnitVH0)|KpNO>ZfCte+K~Q z06{KZtl+o|^S;>Nlh%d`Du5B9$=Riqk&hS zKm$|nuvyp|G0@Mxw!>D*zVeH{MeOJy?-F*hHPDUr)~u~;pzoKlEjzGvtGcLqz_FeM zof=3bXF~iBf=)DL#XLZBg|9n=_}k|9bo9BCGXm5XxW|4_U$YR$GJWi3 zL%#s{Sm0i;~S@jUc06szOj-V%|XGc3zMJlTUyrX=`YhwEJbvC9YL zC=^^EQ5Ad%?uNg54El-tcP>N&KM0KZyY@=ui$utJdII>(4|^=NSXs3;C*r5{)jqc0 zTE~|SPWB5fsi{bWlYPs1tD9Z?TA;Z>G*y&0dPKd8-9QE3{wr&H3TM3>!T9tB)uSGj zOsQua=JcaGRom1Bx6>({m@@g7`F_`q^6ZB-X_)H;7)w{>XkL3`zjA0s7n~lNKG5HP z?4{Mqpj5(p{$|>ha8W-0h^HIBc-b%%5JIUCUkNla`*&BC;8UO{yb`c1Lc1ggaBhC4 zJqU4j=m)3K7CP4iS1=&#N^48g@i58O9vz4V zsSOmmI!-m^IZVgSZ8%>)xdIP@HD$bS!XNy=Zv;h4kZoHK^hby8?^ZYo7`J%*>w$SE(wQ2k0YIeu#r`=z3cv`}v}_Cf0V=SyKw80eGy$UR*2lqJINA6hEyDzLLH{}>oXDGC87)G?{9T0k0Y$8Kz3RkIh6 z_4?c`R*_wrwhk;5+!W#h_~}algb%&(qO}aAElvfc6->Nd>Mg_<1&uf;1vikx-v_d7 z{fU1iTmA{DsnU?RSWE$@`q-`3mAohiw8A2k7GWous>RHVxut*oZc>IndSIa?M1L2mp&FaNBJU0m(xX7Qh6s_WJxLZtG|Kr;H@id0d@ zg9l9)Wtsp`>q)nTc2mmEea~7>6+F0pi*HE3WpBT6Nj1Ce@2rd1@i$wW7b0K)Zy}vd z{IoR0P89Su)6Gje1Bt~AWrn@*$@WgxT->{amF)}&rw{#w)mcER=|^1Dss5%VbYate z*p^>e9f-67L^A(`lm%SahW-Vb*XN>AEtG8fQ6)Xk!lCa?f`@CFn$kfhHw5_cPatXY zN58W6vhOaiZ)973FZHN5=SLB##lii6tAD1tm&L0)ylhLLceDxRUuFc-aFdT)mDIpl zpDzK0%)G0XQTZh`klwkZMnD1Wt~`<&rYZf$B(+R6Z!#tInF6=;|7Rg>qj)Qi%kjX- zbzl3x*S&x6=ueNm?b2B9zQysi`xYl&DSTr02=ug%t0aYetgo(aAGGg-Nx_j6Y}`$@ zSH|U!a;^|l0u?W)C@~?qKN^oK;r718`eL*bz#nDxuU!uRKRdbu@hRfkgL@IMc~~p z+&UQ)?k6h`jq!fq5KiFMi!a#YKW(gIul6C4>cbzcF0c5`lMe~o)!E@O7i+z*wmy*g zp(LRNYLmL$31cI-Em5nP&xsSbgpc1>YZ=P?+^xO7&d{64IF+*jtt)o)T?5Uj89li5 zk=!sHMU2~xN-!$Ngr1#FRM4}|cv{puR-fLsW#f!TTpn#~>LWwrabP;=Po>gi$!ZBk zl)d^x>1QNgMpN3@K%@5@|H&sGBNn{hU_p)N`ZZPrb%$d+_9lP^j|HBHf;I=0L`nff zb8@c|#*z}kyEo)^hy4CA;X8-l0Tb^%J%%D`4QSZuSvWsj(}W=awu-b4tK)c@@Pc71 z;FzZb0`CaBea?szy`<1ha_SJ(%YDGJOENvi3<;}W6zs_L?hI9i^H27!P`sy0z#n<9q~36bU4q0{j_ z2^mO;(4b?&p~-2|oBOm4cc24BJDx9C+|7RYiRyQ&{*w#ijVrYS#8>2JFTQu6l0CU) z!4!MnpSLb%4gR7ZvsZs!+|;j;YFO>t2j0QndV0aq)A4&6HWWS~gzDJ2dm9)No-1!e;4kl<4Yt%-)CSi)G|<38 zqXSj!@UM$YPimfZD{I)r`cmz=-?IVSC1Dwp zhl*o|Eisyr&>3>GyrJXTquI2CZ0ZZre3&cg#u#ju(Q?9PV=R^T__4<3Ga zpsq-SL#FDUh8FV0&<_kG@g#936scEhsVv!%?IksAu(+g*ZIG)z%-T*{ym-sU4%C*m zvX+M{7qL$ru55T>YO0O>_5+rC*oi$QorS;^JX=(Z@SNgLa| z6n~!CTkK?KmXTWFb{IlbcefVY6PerBK@=-O>o_S&Nb z&FswMl{T)Dq0Zv>m-RAXq;4%+UE1ng7+Qb(hMV`^dMk5$vU(NUa2sy6wt_xH z+HVg*g2iy;a&X4z#GU|DD%sILolNwHfG3db*WPC0=HmJkN}(d>UG&);5Z?}$Z4%Z{ zn|$Z#0`||ZR4--h#^y5C|6(=WFpEFQ?DP6VPFEJM zxxIG3&x^Na&uUe<*?(uo!pzsO@^PDT&ArW<<95wUS99Vz4w(br>CjIXTAAbL)pk_L ztX)`4a+1AQthH>rK@|>Lz{zWgePdJGln88dv5*4TgGspBv?rjV!v@D$9A-Xvf}n0v zC_jfxf$UY^f&G-7I$OOgmfAW2qs>9f@h?9s1Rw-%_RFY=7EvmIZl zUZv`PTS}W&va!)R*fsyA`djSd+gmrX6KAXYa58`SY;_k-(uprr+Y5Z`$uCq}P&Q!I zUsv}Q5(@Gcsv8Rdf_&t!t2dG_@hg8_-NdSf>ss0I&sLYS$NsjOEL$fWHFfN~qt;&@ zjfKXi!wUSW#6|3>JK?gJ5Ao#kkTye%X>*{=t1BepBt*4cn*?EG^GQCJEfRE~fNmt{ z^7{Q*(#h+wdr;%g>G#dEc$%+ask zC_u$5sBT=w&V8|3f+MmW#xhp*57n)wA3In5&O$mAKgHyKt!`%D{DaVi?UssQ^FMX}L^7MOuU42sl`@b($uSp-fr`LSBx~!m6 zEk!Vy;OBWPK0URY>J1Ha!$O@HrC+<%-DJJiV^$JvBx-C<$?tGQe3A`^E0{Rq@Z0<@ zC2R}%J$}Gk`Q1J_`-t_4b~rITPS<>^bMrE$d>ovq&RuO+vu58+b#5-*Tm$doGVn|h zKUjCN*56gPWB3Ha=ig6E*d-<@*hK`#4Dyc2TM+UJ9%9jdF5ta8gc$ z+494E?C=dLi`}TzX3)-`gbD&*682e(FxMD-TKh*30yw=1&{H8 zY6Qiq@aOrr-VxYRDMW`plDW}Pea$z5(jcv^jVXLC3W%hdhUzNsQD0TN@{b7XI2H7+ zM8}Ar*;W%5lDH zsDdSr2#H3bA-XllAzW^fh)m6~qVc-_sUWc&;p{P1*xY!ND7syFl z2QwGQLd<6j;)Z!Q+#`eW3pax}GV8yyrZJ`Rh6t`%OV(ykh4@`Hv=2`^Ao|UN0}rX& zB+VdT8U2$S%;*IFSC13;KkertO$(!dR?469$QiQvKuXi><8{Dbt)`HqJ9=&^v3+ptm#Rm0a*cD4|)* z8Ix3J#b-$+onV*}CSy)WZ|nw&<}!RGpc!4c`HnJJ(uGB&k+a8sQ&+!GpEP^ywwlID zvw(47JxIdTWz5Z;XKpT#Hgj$+kk*Y_=3Xxr4uM)+*j#QsIj6&2VoX3-ziIorZ8z?K z`%g(6GA*RbBs5i)cWLWE4<%563-Lf);A`Ld*tx-0OTV^C5LWz&WIyc5{dYU;qTNd` zW=tPTGh_N97;8F_#mbUKP(D5`v?X;na9OMqScU^h=Q=n&1*2E9xR*e5m8~GqA(~oMT%|a!^9K!L* zCN2BcJx|_j_o*c|*-Vq*9gLlUTMMifTH(sv08RwV>B%y6Yq{_7cy`Ts04gt}_ zF>`lb(1q(&L`-*1VtPRuy>V5%c(q-dw>!`yPj{dT?`}{2?q)EG_p*%Q)ft7)%`DQq zW=6?9H{T3K@m+yYd^)4dAf-=dl)ZW9=9|GNz8s8VQipwcrIt_U6H1=|?N{cx~7e13@lExcMo}W{M(W z;=p*O>j%w48}!69zUR(h60p1U3yOaRzxhr4rtc=xn)pH1+)9#PXE>UiFX!ao&&*aF zknuDk_<}yTJe}@{hc=a}rEAj*N0Yo-G<2JTbUDz=)J5Qnz&(H~h{z6v4n}(UW)Na~ z*Y*uil2C!tJY#*rNUYK{qQ@`PH5eMv@z^7H{)SV*!JHoqY^7rF3_JCPJtH>cW%ubA?jD6 z{%9AHSy4od_2m}!vjc6O-gljIu4qg)#wBoZkar&u+o&JqmHgNqTPu)ezaWV z`wSqO_@Pik7s7Lp*$k%^Wm^x0YkaSlU&{^uHg4$LucgS5pbt(^o8tSzn?eyzFoG$*60 zYK=saAUWL;C}hNXoJOq2#sczTy}&LtSiINhRB}80M(jpV2}>@ACuj=?#js8CIbo`o zgKik@MN(Q&w#Mhn;vyHybvoTXpO=U_yD*_yG0}VtD<2bO#BR)q2(#v*jM$AicXbVH zgxubZt-IKnNJIJQQCGuQA>#A20}B#%i>j`X*i|j?$em(esjX>%5A^IU%}puDy-?JC zXaZ*rp3x2_vd<0CO*G>}oEvI%H2;*#O*%KsmQM<}^W(Qho8WiUY70ZbQFz&}$w{G8rQ#6g3jwLg-FK1^CT&11aJp3cuYwF5eSnjlm zn-z@KSW+%czcpw`wmsvzoi%#NV;(z{h79eSQoM2*sPo&WOAG^b2U5JwZf>YsO2$Fm z3eFDPWNA$0Ht89+W+_wM_DzU>^DwbM8N-DBd{tMs3h|tuUp0VU)4$M1DX+kn@F|rNL>oD8C zTZds{V`UF>#=as0qOtw6sOg(96VsjERx>YBv%B|J@ukUF_MxVl+HyDcka52z5dcYL z+^AGBO%_IDq*+&Y--OF)T6Z!rW)SqM@30-Q?K$tT8H2y{RRrLY@iKjT22?@4CFRz1 zc7q$p)@Teq>uL`1WflQsdCVBR$-V%c{K^;BYMwojvA@^>xxTKPESJW`m{n~9ow2By z#x=53<{heQ!X=sLOjgSoL%phd=Tfs2U>7^Fy~yC1zS=Ue(_%?^W^6Aqa2lh`vJH4A zB(tz0W2ZVw;{?;4_LPjJrj!U|6bI#~0&0R1v?zaM9BDuy<()6omlpzS=*kY% zfca7?D=tNr0gZ*jKbG5&Y77%V zGvsbb+v|~dWN@%o-BL3%b}%%Zm>?Qx2mBSv-(d%q)ie;*M z+1Bm#mMt@O2^m_A;h}nh1?;xg7lx?)LGX1XB;hL6o!8g z*&f`u>qL&6g4|5agYKVjo9IQ>;j0=3KP1S4oH>kCZo98Ri>y(2CXl0OY)3Kz^I>Rd zaA~Uz4?mz43&}9(00GF9Tc=yIXt9>iWrp7tfTpx{iv^@2xh5kSMhbaCY^Wbf;*7(A z+lp0EasNZsApH|gv&`U@-fI};(v0<_J52>3xMmJ>#_7N<$9YNVop5E25?cVys|2i9 z!RZMeZ=y~S=ymE*fcT|7fXB^Zb6_e2DDH#(+qdh=%DLGY!P7z66>$RW?8XL5Dxa-b zYo1GvOlC9RW4PIPP6P941N+r*O~q2|fXrcS1TI+isV|a2IWNV`$||=I^F>v+9xGVZ zR>Llg2sJHx0U|cF_YjV%JuoF^$^=n82Sl!#QnYt>3NFnK40W0u~zH(fTMYw}noJ}h`$24; zt*yqRf%h~e1j4O{&a{bWk_$o-@VMYu5V(V_Jd8Avj6(~6AyDVbMY<~cydH-bQGm`_ zFxs5!t}Igg3+D+Q$TEXElEWmck*fMSjd+XKQcsuW%<)dlyfljxB6B$ktBk{Cx@Hxl zyR+^H(m%p7ZGaboD5rlUv4W=>dy#B#q^2JDC0iPLkP!pRe?2l{URT3ELezD`f5hbq zxxFyihQu&JtX)AE{vAQ5O%6qZqO2guE#%EI*-D7DaG+?1$9c^*+c%hFtlh@2puvC6 zc1=UeXSdBX{u@2cy0=-IZ8MGkbL{CFthUIE(h>uB#$8ux{`2fqMuy~`O`=_D{xa=k zXsvhSilXJ(Wu~OLTrPL6EW4B%e4deKhmtSSwdUE)HqCB`CmLQ;o*hEoy^Gp)s%OWx z1LR4|V(LmKZ!ma!Zf7Uo)=*O91ZvdL8=GrS3ra&x0sm9{QeD%v`hVP_;s1f)_j;W! z5+O(@LZTcJi-LY~Du%of31_AcAblBm;_wXF{csey{j*QlsLqqSp1I-XZCv>zNu~#A zF5S&qlw^8<=GxUY$Pzbe6Bb!1hx0fSUaEUK%~7Whtg?g)uIvxm8f~bDncT6OsqSsCW*W@N{h!M=1J1LWE zIeZFIG-7~)0sfA0lv5l+77kB_jz@l=?MeuM2S6Jdnnp}Kpl3|4Lm^rhOSI?!hC3(> zI`awN2uI(k$ov#&&Hc5gyS~4so>}{A+bT1@h5`xP=-QeJb6;?TT40lajL(zk^OLgO>Kd6Y`kWG365GXE1GN`V1wfg-E8kI1zgj#>lb8l&d>!MRlsNJ zt1rFbasXRshKI?+>_z#C0!7WOC5ML^<)DUqsfW-~I)pR?uLyux8k%Zwqs%mv%;gBm zaNOrOg3Mxnb|=u}G7UoazxV{Q&GqoPMrGD(I(R6z*yD%*69fc+X<*6pq7w4_9z63ltbFnzZt4dAJ6_lE^I%B>@zg`;5l`hc)UTeN5&%8#P-OCgWxvn)E z&o)B~`eRt1@%yZPqfue21QMPjeCpT#bQ; z^1}Zq)yiiaz7d57fBd4OnjQaDQAvXbHTZA?L23^VN?yHsHGnsO?SJB~zLu1!cF)X` zit|#)9)%aC_9BT5=)^&_WCS3OwR$*i_MTsLmDTbhLORZ?R<@p9_*lm#cJ4(-3p;tl zQB3tOYID>Yf4zrD2!Qm%L6HkkmE%KQjpKhzO0nZ(cDE+>ftqs%;gaRC=sPpbB(P&% zvzY`=T$4Hxa=1J}Dde*u_EEy!Cm6EHB6NyS(CH0J0DA>mSf=QZTy8sn4uK>#zv{%i z4J)7IFzcyvBf_jjhgnaZdslOk9h|SEW52D;p-nii%1BbbmvSb#O`K;5TnSVhfqxVh zil{d;toW?0DBP5=ZFVeVTwt9*fQQ_`2jQTB9+eJ%+ zo^Jzxwq`PG+x|7`B$C5OIE)0{fHqQsHYcFmY?8+bry)rf#LvkdTt=J@Zw9oR*C9z> zJ3yGcj;jzX)0H_0EG;fBtb+22QUm~O4mo9Lu?|VG$!>Sp=0$!-Q1-h*t_W(BR~OWj>a`G# ze6zT{a(x^{ev&}(hH4`N%Z!!$Oz7`*!8hpf;V5$h&Kp54e#wT67Pn1_I7AP0<47pt zu*YM2+DD#f`$lIfDIZD--RrkxHr35R(UN-sdxt_WLeePGV5)dTg^mz#iOd!hBs3lo z?vBd%k6`3b${0{;u-WihE*zaACXXMwmuj;BCmeAGrM%cudmpRxlvq+!v7I(Z4cgXz;E^*WZg~OxnB1bbpU^f*!HWz2w zff0r%b^_6*$Ob|+C0-AOKwv!cloo3`iXK zBr=^q+X*H|=>R@7$&w8-8S6Ckrl9PR$AVhp4Z-=jgjz?-*tb-hr zUtKcd8nuk3*ACb^ULc9)O&r2)19AjjGz7Y!^0m=)YAVU6g{nury|-Z1=@pfG)XHFK ze!)cPJ9-;P9UN4V;1m;zmV%>%X$nNtG-DzK3^_8%T=kd$s?X2Y6lLZJghSNF7m=4` zr6n{?9+A@kJWk`W>hmYwq>^z|4k^|>C1{CM00benR53!sd~&GHq^(7IZUoCj-J~FA zXfw+CASn1-l!i0tgq7?^C{7lP%5%Ng!d45lRgz*GA)GwAs^t0)~Wxv!YxTF!lH(Id&?i7aZ%n&Qw^z zPK}~JF5T!M)6V6BjtdY}ek1lrk$b@9BtuF}PDFtojB;53+ZjYv?t*?QMB#SpcoWeu z${Y(KVBQ5F5K~cI`g`~?6Lao4EiHJC?i3yi=rT3F{{DAueE55VnwsZu ziEhQC_-xLw2Z0(+DPoi1*tAKK;_{0@e=y``k3U^do1x`-DY3avNFIuXxK0K^OmHQ_ zdMHJZBN?^spilA4X5>vKS=Haw3vBg0wWUA?agubwF`lO+B!m{=r=VBmtPN?_XUy@Z z-+A(hK0WA^|DF|M%0EL`Y04Z|%0EOfX=W@b|MYfVkz822VZCtExV#62BA+mKt(u<* z(+tSs$tfIJ`dq^SAc^xlAzsvxUhEU7awGp`D5Vx?RR17^GQD9e*T=|=1!&{`^qxb( zv3X!p;u-yVvDlDcvnYZ^&J*l8!hv7M_Kf)b8*paweB7;s+QGuS-$u%4!+_zjL!jVu~%ZZQ5 zKEM+Sv!Cp?EM)O|OJ@DL=2A-3zj{*A!E^(eqdDF_LTP4qOM^lUeVXvb!(P&<+1BTT zBXb6}L1b{)JP>QauqUYa!;TEIhEsI=?SL@w zIh|MGvqkNTE0x@vr!nO_LCiH;uD+|;oE^Ndp}9uO+`7@ljY--ZXllGd$vu_fwXmQZ zI;V54I;Yd^GV7d*$L&V}G#~grND*Zo7qm|)WFxDG8?o}>q|i0%oY&fCex0+G{l1~G zDMRP{Zy*Qm_#>&ebEfN+)Y}s&%eAVva~zwYM2hg^pmeKW^vo9GZ#Df2Ur+_84M!y87ZF1nfdkR+5|JW=NNooqpZxxaEW0HpE-B1Z_EWHetyNRs z?FgEKk;!CEA^VBhBuOR<`WhA{Xj>?`Lx}det%;Y|-a*DC732lF7nP#a%{Z`O$fOkQ z2k>s%Ok)=u>tU3IaW5upxMMA#dijk5w+iYSA3{fi{ZYh)Q1tkaa_>Tn&(j5cDIm;< zR#ficwMw|z4z?G~P6q|Xi|4tG4YnN=reB*L5l7sSgdV-hgmA;Un>KG-ryGFqxXb)F z#-xVsU>xQ_q|Da@txc|SZrZ#9)*4=Pk+%s=nkJmKK52F#QV_}BWFvz#8Hdy3NrM#W z=2|jMsbB<2qtkstJ5id3r&**;rY_jaV6i5ZQ?r~!ahv1CJ~h1*BXa0N;(b-rS-m)n@F6p! z(L{_H^l>I2K#&A*z=_>LsFT7gd2_W}BUZn56E$}+G@hJHTi4WzGSLX(Zvn^BXo$b?r28*Q4n5Jq;xX0CBJjo7@nX=`|CirQ7ZBw%cA%ch_+ zZgTGJ)tDt?%}qRLZj#?nz$JFgXiE&!gBvL7VF_be3g?)W=tj0xzE5c?DXN}Az5{Mw zMy)X1fw;$jFw}v!0Cpt!ZknXb=das}QBH;17I&l)mj{DsaX zsUCSezE=(^+;TvE4VX=pu$8ZnYDC3N4tG0MNNEhor_|fKL#^&XS3(S)7M@?p0=>Nm z1hnIV{*apKN<_x88MNxrnJ1A_4bp)6fRx+;bAd`ejeSsy*1pHyr%uPsLDn>&AI|6; zsvi!fIKb^=zyOEAduM!40?sV+KG1>w(LHeym~1#E*#Uk|7W@<}80Lq;>6ooPae7|I zFj>Ea`$5P84H$iZlaC+5p5g+vw>LV0g1=Eh*C!Y*8GaZrIEewe7pq$eywTgsZPl7* zhg+$8H8VBYfptMZ5_!1YuuyYB+nr%ck4J=ngOOsEemeqi@V!RHQN_v_Zd6CeNLOK<%X zcu7;6@!yB;&<@k$XRa%Lrsy>srcV}Me{9E*O`3=F$o0(o_Jc(Q@Q@Z%d3`>Qq5%IJ z)@czT!mgk#=z)jS2~aC{$nOl{G@W5OW3N5jT;k#~vZXz(5VqPzp>u{d{1uLwd(2{S$85H=dPJmD+r=!; z2wkMBf*^ZGs57^!0zmVzs7|Ey>IT%^jj$C0RZkwrnD@{k(og$ZIk9Kb4(L62Uvc~- zbwxu^!PU4kO51#3ZFn}p3wyAud9QS~>RuMkhLBv~8BNxK!P(ZGwGCxzDJj%{BUd3S z3zW68pG*Vyk36FOA(WE?HTWRawbX`5;z5_19OO%Nv+=T2GzumbwBD8i2kWwdwm>e? z-Up+qE{SN%a+l-{95xJZXk9@3f9LQ!kV}~+2lD3OP$PpR_oa`i1Q|0^M3_p+K%XSC zjHv{H$mOOnec+%el?z`lz}Yn@jBzIA9j1v_fXeXE&q-MCwZ!JI0`nYpkJ@#ost0Q)gX|3%bJDw&? z)!l);r4LOPsoII8mP8TkVWlmo*G*CP8oB6z+zQ7tkLtmeU>7$u*QR<@>Z!+wX^g69 z(fp`AM4o%BD|57-XZ1paN0PH6BCvq*@a&vE6u*PCL!=h)q>Z}q#3yYn@4mE%r- z{y(a(V0`SsbsMWhp;Ui;S7PwQ7Y}{#<4Y>`Ek4qS|JFNpkHA6mMO=f$V_#f!^XZfO zinc5`{ldMAghJMtD4Jwv{<32gt4uDku-fk|5y_J2l2Dn1K&58z>E4`q@nAgVw2&o&QjMy~PCk5B$XY^)C@AyVv3@qX_>SwQ_7pcHx8d zP3(+fDJw*=pMpCY+S%79np+A*K=0ns&{$(`N*w}F{uPVm*aMal)FrSEx3(=YJ;RR2 znyqX!*4*4Ap?1>^sHAIHRusdj*eT^euhua~e; zX=3W{y4i(Y4a*B94-vGjP(n!ON9r3il5w({+ttRygpbtgWaZD8aQyX#+0aO<{tS`6 zcIGo~2X)rQ#$wG)jp`cA?99yy?zLFhnFlPL+A}#CV)DI~c6M~iQdgy}m8l)}?~0|D zf2XZuj`y*(u#Q#gI-1}8WW?g!u6}HKO zmUYbr6t9W*3FBT=my9L%TJ8qxg2qjYjfdI!XX^!nt8uAK<43b2QOk{0DlJVQq3rl` zgdFtM))w=#TlQI;?9s2bmToW_(5FUl?&{QZ)+ID|1Ft!2YE&Updz{^|Ki|{{Zyj}R zh#T2&_FL{|Lw7bbn@9AQ)JApnb9|3N zJm3PF?5#5=OPJ(*^gg{gTE;YFZPr`~R9t*`>?KVWGDqUxH2<(6f}`=$wU_-P>U@WuQ=!ctd4Q7Z^jcx_ihD{Dzw))F9V z7URAriS_l)Sl|Clf@5Ydt+p1xe>TKK4nq9n6c(0PyVf*Lm4c}H$Jru3oxqK>^EsVz zy^m^4`qwF=`7{{`&zZA=M;|P~7Wt5kC3<9sGnBYebXtml zxUYhg&$AW;WaPwYhmBQ4Fw9%;w$y^oB--(}kIQ!U)q|E!&Q1AA4OnHyc%i{wk9&R01c1FjTq5 z%oeO-xFH{5sDKSs=ip2MQzQ|l(5)W$MWS0h@!1C-ur!evVt>CobNY+lXldhL^bEIl zn1yuwjrr-~;S4m8gVN}ZpX1NfH|C-auSZR1qf4ib$HhJ}(%QUAq+%?baIUOP!;4Ov z^djUgWm3mOI%Y#2zVU!>phv3Y@u+-L2rM*p(|Eat*;WVv0o`J4jtPO~6jkY1mV-gO zT%~Z_U}gkd8p*1q$tJ2$l7)Be#rU)EuDxDXkg`|{y*_pz)KF95n@9>f6cmbqu_yq| z?!eEg8;V3PU<#=Cr4O*^uUqj;mqT*+(kW#AuqXyapac4pFx@f{b>;Ip!ic4DhI|O6 zL6UnW)R#+=e0H$9XZD5!^|LWN%8`@#;IEeqgA*)W2!lIvDSNyf2pTQ~egQCEZ zkt18Gd4xgpn@Y>7aQ5R)ili|_)cG7pNk$P=7{t5)>GA`9)EROBGX=p1VJXOy#wxV+ zymi~oO`Fzly7`I6e_&x1?t%r#r9kQhteD8JfTvBN;=I6#g(r)!^|!$Tgzbz>||sj8g6X znw2z38BTnTFum)xcFhtRlP8|2{JZY8auQxnYAkKU)+$D7t@9T2cVp8NK}yk4+lVFv zw1Qykt@YK->$LZgT!wPFYFZK;DY#rtkQ0;po&#n-P}+&4cMRulfSr9tsF$2Jaa5iN zdnB07gF=tV+n^1^n%NMdodaymOV>9_k&xuF-{bR);@w1iLg+#ESD4(nh!;S9jU(&D zAp}J8H!T61_EvoV9y?-e?e`+4nPR%9j2z75iclTG2m+7Bk?{qVhN~2wT77&%Br!Q*_W8hpg368Llu-Sg zBWhY?JKJ(=@ltkpU+t1c-FvJp7|n&pAtc#dx7S9aH0GR-AQohDKYXd2!!oIL5V@K> za^Zd*8dTVED6RIv%#+4SRAg$Nv$Weytf| zoOCk@^RU!EG8^LUAp8Kn`*c$tuhx{AebY_y7H>1pG*^q*3+eVG7qvGW>+Rh(iNGnI zg@*V9p0J1A#tyvJRkI_LZMdKq(>V}sdD?H}kM9@8%#1h&p``6eHSmJ33MVwUon6fE zgQ;0!GD&6K*Ub0E%#A_ID5*)8y}er!lc=_iO%D#IVN-5K=4dsKqsHj8&9tQ@W=~D< z_B9?CdepqSw1Au8-?hST2@VHyj*X4s%-A~|)9KLJvj1$FZNnox?V6FO~R}@tocDnaW}C5g{+WV(*k4=OEZ1XDAE%{dq?GX zRMSVspAD1m&{s^)P6*F2z2Y=;S* zM+DHa8mU9HIq7MH%%t@cJe@8YM^BF>6QO=3#{A#zs7ldZ!#T|N*;q8Lz9=AnMp%X8 zj`C=t@zs10j9@o)_n|%`lB3W#^dg?2l1?l|W1QO(s2RDJZy7z%N$reW<=9!2u#`ev z140GJPY*dxqoepLbsIFCQsgCB#y_@ z^g(WJYzi>`_Jn#;V6!B!48yVhRDVCxq~KQOQG7Hiby`ViZ@j)Q8bhv5o~co8J<$lG zMCbizYbPBH)J(1catwe>B0DrHuO34K@#&xti4pNf`TC8jqoBmz^jfeBj+Hg+u0wt0 z>~9;FFDs13*=XzX`eyzDl2Z}*g!kze;}xNL`6_3(d2zedz&mJc(8a(hPQ#x+2+X&^ z>xqxpnSX5QU?(^B|38hLK}!Nb6vr>3b|?aig4mia?rzYkWDu6pAp#@BP98!w#g&#; zR@_x65$O|Dr};Xavx9yF>D-}XxBhR|9We;HExR*s-n@Blm|=czC(g$YsR-Y$CB0WlfPlgu~;(Leogm^D&op44@G$P1kh@CU6FSl7sxmBjuQvN=lSQp^QX4 z3yWsI4aSRz(ccW0uwDpt(TPUG>M_f|O*8nj#6F4kVqLqzux!V4DO!W{3i%h7Rx~s! z%0pw@BC@aM;KI?NC`JGX&XovTBDJB4;UW9jH{tKd9mKlC(sb4j`F+M9_tJH7NhvDM zgbFSN-d_*c(Rp+%)Pk3QL-K5Fqmd2m*M@Na7Gi}+Qo$MFSsIG$CHsNf*SlDnft7=% zkb-ua$ZDe)2sF5}?lA#1f(i~?vjuZD37|8{OnHoy<5{y|2zz|^?=FK>mBRSsJCopr zuf!7njP1ovVN2M(Sng%RDPi7e>ICYNc@3d?E_YIF_p%7rPC?TR+cRB0K1*%z=jn1} zho%(h`d4v&Rn4sN>bn}}>FG-3f{K#}$93Cv>{BpI$t2sw8;Nn70g0j|sjU1=e|$$R rOk}eUeDbDl@|%&Wugmy>BJ!C}N9q=TecF$%A}m=RUMBW)`RnQrt0us$ delta 2431 zcmZ9Odr(y86~OQNeebfc2v-6uvb$lCHzalCu{g4qnxG(YF-mZZkEAkcVly?^)QZuB z;vL%NdEZ%1l-cVZzobf3^Uv`?U$CS?2$TCVIO_v}| z`c0Q0xzpscT2m>q0bMw(JDXF21PLx4q0SR1&uTP2C2ka3#cpvxyeke%oTN($QnBQg z)=JfqAAN2$e4*#*Oon9L>~^+^y&^4Fc4=$1D(Jk7RLo2SLlt}H%$YSO9}P`0CYys8 zouP~wvkE+Ub>ODmsH0uMFeLeS$Q9osrsT;~ZQT4PQ#;Rj(U9ASMOWQM2s+|69H

Wo5!c#^aq~SPa&k>7Z*^XR*4lTCjePwE=4-)&eX8D}B0Q zNqUuj;zzx;@)gPqZ-e;%x8YX#g|Ux^8}#u-Z*}$;6)}6QR%+8=N!4Hp2~YqHFaQg1 z01pU&2uOeoD1ZuRfC&f!%s?;@0$6}hU=k1pga-yo^t4$U7LW%C(^XTOX|rjeDb*xs z*R*5WR&5D+P@ATi)GyUu)u)!LxoVj5t#VqaS6)~0l_+^cJ|{QJ6>_2MkRC{%NgqmY zOADkFNf57#$Hi^pQgON%Bzz_G34ah)3NwYt{2l%b-^8!w3;0;>2ks*G0ry+Z%jG9< zG&{r|W~p-pVw&NP4}nYvbSGNTrYE8!ExH}e=z?g0FU%HR8b^D{l$7+eB}+0~iK!{6>4_Om z+DoB5VYxQ6xLxN0UmVr@N%Ys_`T+VQpkMS2B|FfzeflVBYtdT*zuB*UOES0%x=g)WE%o=L1ny*HYt;&e-v~o__tNfa~PFz;za+&0PB~E@Q zU!k9;Kb70$&2p)nCX4J$X_&q%1*G?+da+h~jXTaF(V&~) ztVW54{AKb5K2?kq?g?kj5d4x)O*ZR3cJvAE!Sw~Zp&(ZESP z32mVoZi*i%G2^mL#fyJ72HKWu$a z57poFLUmh{Cmt=TgQd3tqC2;BdV8(Th>u6!55UyOx+b3w&&l+vv` z8PiLTZlu(CipLwg_UB19G*st#0kt&1bK3o$+2|9$$BFb^pq0Bk188ZZ$2neX9u;lq zTBD~0U2XC>eFu`AsJ9E|alvHc6}N`NZRj5-^cT^hZkYQ}w_c3iI;lUpnI=;<(t;-U z>ifpaI}AvKqZ@sCCF=ZGw=wWd?1Q7&z4HPC-_|J|m<&V!PXUoY6c7zqff!&45DVA> z>?!-hCT2OAN1&fCcKjt*o+i(g%jHe7Up^+Em%ma7MOV_4=aps3dS$25p`1}}C_ktn zYJ%!f7pZTmHR=JiU;Vp!Pg6CA<_-kE?0AQ#n6^%{^#FtNUUr05&0pmJo(AFoClC)z z1rmTnAPGnYQh-z-4M+zvfM02eSF$ON*0Y#=8vf0euAZLOP7^68`W3~D{u zO$so=elqaJh; diff --git a/Cargo.lock b/Cargo.lock index 6162503..d272224 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1916,7 +1916,7 @@ dependencies = [ [[package]] name = "linux-patch-api" -version = "0.3.12" +version = "1.1.5" dependencies = [ "actix", "actix-rt", diff --git a/Cargo.toml b/Cargo.toml index 1a96694..c9e73d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "linux-patch-api" -version = "0.3.12" +version = "1.1.5" edition = "2021" authors = ["Echo "] description = "Secure remote package management API for Linux systems" diff --git a/build-alpine.sh b/build-alpine.sh index 9ec5b23..3556653 100644 --- a/build-alpine.sh +++ b/build-alpine.sh @@ -64,7 +64,7 @@ WORKSPACE_DIR=/home/builduser echo "Creating APKBUILD..." cat > APKBUILD << EOF pkgname=linux-patch-api -pkgver=1.0.0 +pkgver=$(grep '^version' Cargo.toml | head -1 | sed 's/.*=.*"\([^"]*\)".*/\1/') pkgrel=1 pkgdesc="Secure remote package management API for Linux systems" url="https://gitea.moon-dragon.us/echo/linux_patch_api" diff --git a/build-arch.sh b/build-arch.sh index f761149..1d62d53 100644 --- a/build-arch.sh +++ b/build-arch.sh @@ -40,7 +40,7 @@ cp configs/whitelist.yaml.example "$PKGDIR"/etc/linux_patch_api/whitelist.yaml echo "Creating PKGBUILD..." cat > PKGBUILD << 'EOF' pkgname=linux-patch-api -pkgver=1.0.0 +pkgver=$(grep '^version' Cargo.toml | head -1 | sed 's/.*=.*"\([^"]*\)".*/\1/') pkgrel=1 pkgdesc="Secure remote package management API for Linux systems" url="https://gitea.moon-dragon.us/echo/linux_patch_api" diff --git a/build-rpm.sh b/build-rpm.sh old mode 100755 new mode 100644 index 3e2196b..4bc23cb --- a/build-rpm.sh +++ b/build-rpm.sh @@ -26,7 +26,7 @@ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} # Create source tarball (required by %autosetup in spec file) echo "Creating source tarball..." -VERSION="1.0.0" +VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/.*=.*"\([^"]*\)".*/\1/') TMPDIR=$(mktemp -d) mkdir -p "$TMPDIR/linux-patch-api-${VERSION}" # Copy files excluding unwanted directories using find diff --git a/configs/config.yaml.example b/configs/config.yaml.example index 4f86ee6..e09d5e8 100644 --- a/configs/config.yaml.example +++ b/configs/config.yaml.example @@ -62,6 +62,12 @@ package_manager: # # Example: "eth0", "ens192", "enp0s3" # report_interface: "eth0" # # Explicit IPv4 address reported to the manager. -# # Highest priority — overrides both report_interface and auto-detect. +# # Highest priority — overrides both report_interface and route-based selection. # # Useful when the host has multiple IPs or runs inside a container. # report_ip: "192.168.3.36" +# # Route-based IP selection is enabled by default when manager_url is set. +# The agent resolves the manager hostname to an IP, then uses `ip route get ` +# to determine which local source IP the kernel would use to reach the manager. +# This is the most accurate method for multi-homed hosts because it queries +# the kernel routing table directly. +# Priority order: report_ip > report_interface > route-based > auto-detect diff --git a/debian/changelog b/debian/changelog index ec62ece..2bd5114 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,13 @@ +linux-patch-api (1.1.5-1) unstable; urgency=low + + * Fix enrollment IP detection: filter Docker bridge subnets (172.16.0.0/12) + * Fix enrollment IP detection: filter link-local addresses (169.254.0.0/16) + * Add report_interface and report_ip config options for explicit IP override + * Add route-based IP selection using kernel routing table + * Fix package versioning to derive from Cargo.toml + + -- Echo Sun, 18 May 2026 02:00:00 -0500 + linux-patch-api (0.3.12-1) unstable; urgency=low * Fix socket activation detection to use resolved service name diff --git a/src/enroll/client.rs b/src/enroll/client.rs index a337fbd..b0677da 100644 --- a/src/enroll/client.rs +++ b/src/enroll/client.rs @@ -103,7 +103,8 @@ impl EnrollmentClient { /// See [`identity::get_primary_ip`] for resolution priority: /// 1. `report_ip` — explicit IP (highest priority) /// 2. `report_interface` — IP from named interface - /// 3. Auto-detect — first routable IP (container bridge subnets filtered) + /// 3. Route-based — IP from kernel routing table for reaching the manager + /// 4. Auto-detect — first routable IP (container bridge subnets filtered) pub fn with_ip_overrides( manager_url: &str, report_interface: Option, @@ -202,7 +203,10 @@ impl EnrollmentClient { /// - `Ok(EnrollmentResponse)` with the polling token on HTTP 202 /// - Error on 429 (rate limited), 5xx (server error), or network failure pub async fn register(&self) -> Result { - // 1. Collect identity data + // 1. Resolve manager IP for route-based IP selection + let route_target = self.manager_ip().await.ok(); + + // 2. Collect identity data let machine_id = identity::get_machine_id() .context("Failed to read machine-id — host cannot enroll without identity")?; let fqdn = identity::get_fqdn() @@ -210,6 +214,7 @@ impl EnrollmentClient { let ip_address = identity::get_primary_ip( self.report_interface.as_deref(), self.report_ip.as_deref(), + route_target.as_deref(), ) .context("Failed to determine reportable IP address — check network configuration or set report_interface/report_ip in config")?; let os_details = identity::get_os_details() diff --git a/src/enroll/identity.rs b/src/enroll/identity.rs index 7e75152..21874bd 100644 --- a/src/enroll/identity.rs +++ b/src/enroll/identity.rs @@ -123,6 +123,60 @@ pub fn is_link_local(addr: &Ipv4Addr) -> bool { octets[0] == 169 && octets[1] == 254 } +/// Determine the local source IP that would be used to reach a target IP. +/// Uses the kernel routing table via `ip route get `. +/// +/// This is the most accurate way to select the correct local IP because it +/// queries the kernel routing table directly, which accounts for all routing +/// rules, interface priorities, and source address selection. +pub fn get_route_source_ip(target_ip: &str) -> Result { + let output = Command::new("ip") + .args(["route", "get", target_ip]) + .output() + .context("Failed to execute 'ip route get' — is iproute2 installed?")?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + return Err(anyhow!( + "'ip route get {}' failed: {}", + target_ip, + stderr.trim() + )); + } + + let stdout = String::from_utf8_lossy(&output.stdout); + + // Parse output like: "192.168.3.36 via 192.168.1.1 dev eth0 src 192.168.3.36 uid ..." + // We want the 'src' field value + let mut found_src = false; + for part in stdout.split_whitespace() { + if found_src { + // Validate it's a valid IPv4 address + if part.parse::().is_ok() { + let addr = part.parse::().unwrap(); + if !addr.is_loopback() && !is_container_bridge(&addr) && !is_link_local(&addr) { + tracing::info!( + target_ip = target_ip, + source_ip = part, + "Route-based IP selection: local source IP for reaching target" + ); + return Ok(part.to_string()); + } + } + break; + } + if part == "src" { + found_src = true; + } + } + + Err(anyhow!( + "Could not determine source IP for route to '{}' — 'ip route get' output: {}", + target_ip, + stdout.trim() + )) +} + /// Get the IPv4 address of a specific network interface by name. /// /// Returns the first non-loopback IPv4 address on the named interface. @@ -158,8 +212,13 @@ pub fn get_ip_for_interface(interface_name: &str) -> Result { /// Resolution priority: /// 1. `report_ip` — explicit IP from config (highest priority) /// 2. `report_interface` — IP from a named interface -/// 3. Auto-detect — first IP from `get_ip_addresses()` (bridge subnets already filtered) -pub fn get_primary_ip(report_interface: Option<&str>, report_ip: Option<&str>) -> Result { +/// 3. `route_target` — route-based selection using kernel routing table +/// 4. Auto-detect — first IP from `get_ip_addresses()` (bridge subnets already filtered) +pub fn get_primary_ip( + report_interface: Option<&str>, + report_ip: Option<&str>, + route_target: Option<&str>, +) -> Result { // Priority 1: Explicit IP override if let Some(ip) = report_ip { // Validate it parses as IPv4 @@ -188,13 +247,34 @@ pub fn get_primary_ip(report_interface: Option<&str>, report_ip: Option<&str>) - tracing::warn!( interface = iface, error = %e, - "Configured report_interface lookup failed — falling back to auto-detect" + "Configured report_interface lookup failed — falling back to route-based or auto-detect" ); } } } - // Priority 3: Auto-detect (bridge subnets already filtered by get_ip_addresses) + // Priority 3: Route-based selection using kernel routing table + if let Some(target) = route_target { + match get_route_source_ip(target) { + Ok(ip) => { + tracing::info!( + target = target, + ip = %ip, + "Using route-based IP selection for target" + ); + return Ok(ip); + } + Err(e) => { + tracing::warn!( + target = target, + error = %e, + "Route-based IP selection failed — falling back to auto-detect" + ); + } + } + } + + // Priority 4: Auto-detect (bridge subnets already filtered by get_ip_addresses) let addrs = get_ip_addresses()?; addrs .first() @@ -368,7 +448,7 @@ mod tests { fn test_get_primary_ip_auto_detect() { // Without overrides, should return a valid non-bridge IP // In Docker containers, auto-detect may find no routable IPs — that's valid - match get_primary_ip(None, None) { + match get_primary_ip(None, None, None) { Ok(ip) => { assert!(!ip.is_empty(), "Primary IP should not be empty"); let parsed: Ipv4Addr = ip.parse().expect("Primary IP should be valid IPv4"); @@ -386,7 +466,7 @@ mod tests { #[test] fn test_get_primary_ip_explicit_override() { // Explicit IP should be returned as-is - let ip = get_primary_ip(None, Some("10.99.99.1")).expect("Failed with explicit IP"); + let ip = get_primary_ip(None, Some("10.99.99.1"), None).expect("Failed with explicit IP"); assert_eq!(ip, "10.99.99.1"); } @@ -394,7 +474,7 @@ mod tests { fn test_get_primary_ip_rejects_loopback_override() { // Loopback in report_ip should fall back to auto-detect // In Docker containers, auto-detect may also fail — that's valid - match get_primary_ip(None, Some("127.0.0.1")) { + match get_primary_ip(None, Some("127.0.0.1"), None) { Ok(ip) => assert_ne!(ip, "127.0.0.1"), Err(_) => { eprintln!( @@ -408,7 +488,7 @@ mod tests { fn test_get_primary_ip_invalid_override_falls_back() { // Invalid IP in report_ip should fall back to auto-detect // In Docker containers, auto-detect may also fail — that's valid - match get_primary_ip(None, Some("not-an-ip")) { + match get_primary_ip(None, Some("not-an-ip"), None) { Ok(ip) => assert!(!ip.is_empty()), Err(_) => { eprintln!( @@ -417,4 +497,68 @@ mod tests { } } } + + #[test] + fn test_get_primary_ip_route_target_priority() { + // Route-based selection should be tried before auto-detect + // We test with a well-known IP; if iproute2 is available this may succeed, + // otherwise it falls back gracefully + match get_primary_ip(None, None, Some("8.8.8.8")) { + Ok(ip) => { + assert!(!ip.is_empty(), "Route-based IP should not be empty"); + let parsed: Ipv4Addr = ip.parse().expect("Route-based IP should be valid IPv4"); + assert!( + !is_container_bridge(&parsed), + "Route-based IP should not be Docker bridge" + ); + assert!( + !parsed.is_loopback(), + "Route-based IP should not be loopback" + ); + } + Err(_) => { + eprintln!( + "NOTE: Route-based selection failed — iproute2 may not be available in this environment" + ); + } + } + } + + #[test] + fn test_get_primary_ip_explicit_overrides_route_target() { + // Explicit report_ip should take priority over route_target + let ip = get_primary_ip(None, Some("10.99.99.1"), Some("8.8.8.8")) + .expect("Explicit IP should override route_target"); + assert_eq!(ip, "10.99.99.1"); + } + + #[test] + fn test_get_route_source_ip_known_target() { + // Test route-based IP detection with a well-known target + // This test requires iproute2 to be installed + match get_route_source_ip("8.8.8.8") { + Ok(ip) => { + let parsed: Ipv4Addr = ip.parse().expect("Route source IP should be valid IPv4"); + assert!( + !parsed.is_loopback(), + "Route source IP should not be loopback" + ); + assert!( + !is_container_bridge(&parsed), + "Route source IP should not be Docker bridge" + ); + assert!( + !is_link_local(&parsed), + "Route source IP should not be link-local" + ); + } + Err(e) => { + // Acceptable in containers without iproute2 or routing + eprintln!( + "NOTE: Route-based IP detection failed: {} — may be unavailable in this environment", + e + ); + } + } + } } diff --git a/src/enroll/mod.rs b/src/enroll/mod.rs index 8e32f1a..54e76dd 100644 --- a/src/enroll/mod.rs +++ b/src/enroll/mod.rs @@ -17,7 +17,7 @@ pub use client::{ /// Re-export identity extraction functions. pub use identity::{ get_fqdn, get_ip_addresses, get_ip_for_interface, get_machine_id, get_os_details, - get_primary_ip, is_container_bridge, is_link_local, + get_primary_ip, get_route_source_ip, is_container_bridge, is_link_local, }; /// Run the full enrollment flow against the manager at the given URL. diff --git a/tests/unit/enroll_identity.rs b/tests/unit/enroll_identity.rs index 1e1e953..f1afbfa 100644 --- a/tests/unit/enroll_identity.rs +++ b/tests/unit/enroll_identity.rs @@ -5,7 +5,7 @@ use linux_patch_api::enroll::identity::{ get_fqdn, get_ip_addresses, get_machine_id, get_os_details, get_primary_ip, - is_container_bridge, is_link_local, + get_route_source_ip, is_container_bridge, is_link_local, }; use linux_patch_api::enroll::EnrollmentRequest; use serde_json::Value; @@ -586,7 +586,7 @@ fn test_get_ip_addresses_excludes_link_local() { #[test] fn test_get_primary_ip_auto_detect_no_bridge() { // In Docker containers, auto-detect may find no routable IPs — that's valid - match get_primary_ip(None, None) { + match get_primary_ip(None, None, None) { Ok(ip) => { assert!(!ip.is_empty(), "Primary IP should not be empty"); let parsed: std::net::Ipv4Addr = ip.parse().expect("Primary IP should be valid IPv4"); @@ -603,14 +603,14 @@ fn test_get_primary_ip_auto_detect_no_bridge() { #[test] fn test_get_primary_ip_explicit_override() { - let ip = get_primary_ip(None, Some("10.99.99.1")).expect("Failed with explicit IP"); + let ip = get_primary_ip(None, Some("10.99.99.1"), None).expect("Failed with explicit IP"); assert_eq!(ip, "10.99.99.1"); } #[test] fn test_get_primary_ip_rejects_loopback_override() { // Loopback override should fall back to auto-detect; if auto-detect also fails, that's valid - match get_primary_ip(None, Some("127.0.0.1")) { + match get_primary_ip(None, Some("127.0.0.1"), None) { Ok(ip) => assert_ne!(ip, "127.0.0.1"), Err(_) => { eprintln!( @@ -623,7 +623,7 @@ fn test_get_primary_ip_rejects_loopback_override() { #[test] fn test_get_primary_ip_invalid_override_falls_back() { // Invalid IP override should fall back to auto-detect; if auto-detect also fails, that's valid - match get_primary_ip(None, Some("not-an-ip")) { + match get_primary_ip(None, Some("not-an-ip"), None) { Ok(ip) => assert!(!ip.is_empty()), Err(_) => { eprintln!( @@ -632,3 +632,61 @@ fn test_get_primary_ip_invalid_override_falls_back() { } } } + +#[test] +fn test_get_primary_ip_route_target_priority() { + // Route-based selection should be tried before auto-detect + // If iproute2 is available this may succeed, otherwise falls back gracefully + match get_primary_ip(None, None, Some("8.8.8.8")) { + Ok(ip) => { + assert!(!ip.is_empty(), "Route-based IP should not be empty"); + let parsed: std::net::Ipv4Addr = + ip.parse().expect("Route-based IP should be valid IPv4"); + assert!( + !is_container_bridge(&parsed), + "Route-based IP should not be Docker bridge" + ); + assert!(!parsed.is_loopback(), "Route-based IP should not be loopback"); + } + Err(_) => { + eprintln!( + "NOTE: Route-based selection failed — iproute2 may not be available in this environment" + ); + } + } +} + +#[test] +fn test_get_primary_ip_explicit_overrides_route_target() { + // Explicit report_ip should take priority over route_target + let ip = get_primary_ip(None, Some("10.99.99.1"), Some("8.8.8.8")) + .expect("Explicit IP should override route_target"); + assert_eq!(ip, "10.99.99.1"); +} + +#[test] +fn test_get_route_source_ip_known_target() { + // Test route-based IP detection with a well-known target + // Requires iproute2 to be installed + match get_route_source_ip("8.8.8.8") { + Ok(ip) => { + let parsed: std::net::Ipv4Addr = + ip.parse().expect("Route source IP should be valid IPv4"); + assert!(!parsed.is_loopback(), "Route source IP should not be loopback"); + assert!( + !is_container_bridge(&parsed), + "Route source IP should not be Docker bridge" + ); + assert!( + !is_link_local(&parsed), + "Route source IP should not be link-local" + ); + } + Err(e) => { + eprintln!( + "NOTE: Route-based IP detection failed: {} — may be unavailable in this environment", + e + ); + } + } +}