From 3c061abe43acec0cb66f58ee683c155646444cd1 Mon Sep 17 00:00:00 2001 From: Wxx <2563806166@qq.com> Date: Sat, 8 Mar 2025 01:36:27 +0800 Subject: [PATCH] step4:snowflake --- .../main/java/common/trace/TraceContext.java | 1 - .../classes/common/message/RequestType.class | Bin 0 -> 1196 bytes .../RpcRequest$RpcRequestBuilder.class | Bin 2248 -> 2527 bytes .../classes/common/message/RpcRequest.class | Bin 3779 -> 4670 bytes .../java/com/kama/trace/TraceIdGenerator.java | 65 +++++++++++++++++- .../kama/client/netty/HeartbeatHandler.class | Bin 1369 -> 1564 bytes .../client/netty/NettyClientHandler.class | Bin 2135 -> 2114 bytes .../kama/server/netty/HeartbeatHandler.class | Bin 2150 -> 2267 bytes .../server/netty/NettyServerInitializer.class | Bin 1995 -> 1995 bytes ...raceIdGenerator$SnowflakeIdGenerator.class | Bin 0 -> 1385 bytes .../com/kama/trace/TraceIdGenerator.class | Bin 908 -> 1342 bytes 11 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 version6/krpc-common/target/classes/common/message/RequestType.class create mode 100644 version6/krpc-core/target/classes/com/kama/trace/TraceIdGenerator$SnowflakeIdGenerator.class diff --git a/version6/krpc-common/src/main/java/common/trace/TraceContext.java b/version6/krpc-common/src/main/java/common/trace/TraceContext.java index 22c83e3..8b4bdb5 100644 --- a/version6/krpc-common/src/main/java/common/trace/TraceContext.java +++ b/version6/krpc-common/src/main/java/common/trace/TraceContext.java @@ -47,7 +47,6 @@ public class TraceContext { } public static void clone(Map context){ for(Map.Entry entry:context.entrySet()){ - System.out.println(entry.getKey()+":"+entry.getValue()); MDC.put(entry.getKey(),entry.getValue()); } } diff --git a/version6/krpc-common/target/classes/common/message/RequestType.class b/version6/krpc-common/target/classes/common/message/RequestType.class new file mode 100644 index 0000000000000000000000000000000000000000..0430f78298587ca22434940dd38a1c0c612d4946 GIT binary patch literal 1196 zcmaJBoh)gNr<1iT4zbu>DH0>KlwpH zg=jQ<_Kz~&+tn}u*AIQYujib5-g)=e?{7Z=JVGIifI!M(<}DH6sv^RRj?d2(52yJ}*}V($)VH3d|T$5n)E;S*5&Le^M#edH0+O6{7;-*{yQ* zMWrT?c{xl;!8oE}jH;MGOdx33ZO0UdXSM2%zN_bL-D&1G8at-p78JyBA&f~C30xEy zI|fvoUWUPiEcrCD;9bm88dbe8`*r>T3%V`z{JFtLvs+5XLNK+n0`xW^RYuxm* ziYZ*7aEg{=xhn#bgZjSQnzl89ph6kUFnm@ZaTdyhMHqHNMHU)I<@xRkOl7s9VUdHs zP_=)=)6v~thj?<94oX8(G;BXJg3`wPfF6fl9A<5$AfVLRy^di%wfJz+ zfvKJ6>n|-*kZ~Gwxs>Dq256P+}r?i1SAfj1T;SpQjzw=jO3MmB1oy`wDqlSs|GFjO2$C z1c+T;>aspH65fp2j3G*hXK2zc>a7OCEYTs_@YH zmNZWjm7{OiK^J$MMX?|wD6DxLAk`6Gv56P>p$+B044{?1T X3VZB_s`$Rr;IF=$`*=YA19e literal 0 HcmV?d00001 diff --git a/version6/krpc-common/target/classes/common/message/RpcRequest$RpcRequestBuilder.class b/version6/krpc-common/target/classes/common/message/RpcRequest$RpcRequestBuilder.class index f5d58a69d75848897a68fb8226767f3945e7e33c..649584d2ad88eae945e7db4e2bb9565dd294c9f9 100644 GIT binary patch literal 2527 zcmbtW>uwWA6#mA!*l{;??htAq&`@j>F!bI!Nl8r808Wrdl&a#_#GWQg>|J+vjG8y; zW3&<#6_xq`eW~8IK*0mDxV`t9Hob#RQoY}wsdHWZDH9X5Ag^@HyEsSAYVCtoO zCCg3e9F?CPzEpKBFurO#wq6$)DHIPTkikS6SqtyM61Y=$TP@cqx0LV8BUOIhu0K~l zb(F7{d*o)vZZ?!BFse`6N+4f5D;0|D^R!|Vyl)|gDS=7b(aQT#*43_TQE;Z#vu;m& zwsRD)&sdl>?Aeym$8N*$8kBhp3%Er4+tQOQUtsn{Og{83kYBWL1s_m8WHe?_SDd-p zl)hg{V`fBdBzNNKBU|HJp+&`mENPlv{!ctNy{!XW?ux9A31v^hA(7X#Vo1BvSG zg3c`ThnW{E3iYETxXIW>gEe+&T8qHd!VpQOD5JaeKS$O?7vbICb30yLZP}(ea=qSl z&+rmpmo07E_1O-mHeFZy+LP^_pxyYnacpF^RB`%1ZIlO(!&@@l@be zB9MdPlg5s~wc)IM2f|?D2H%DhyW1E?K4PR&=D7)Gz9YfRha;HzE`YCGK(A2FNR4yn zE~zqSVRlMyAbty2?r}87z&wvZ@PGmL@qjBqbsuvy!WAktMx;x3e&_Hj$rR3tFN7?S zIGF=`jn*7K83Z(WZXn~Z0h%2QG<|L$6EOp{fKNFlT$?*LkO{c~x`NN>wgKAV+>O!Y z0BGbKF$#0`IRV1(rwO@2;4q6{kopo|aWpEn7*ms?{GZ7GPs^WD^b&6I|iPgo-cbBXeOcz@uAf#mcSw}D}}OA+oUR*972kJ@@L=kX2a4DlcG W+rliq6jKb6_uzla5CzFz$ThN@CTes?BCGL zP0!*{5+RzBc=BMldGX4fKf?H(*+v^;lx*I-_h#OH-kb04UiMqNxBIj91;7=|R=wrw zMzN5VXoVE;R-&~ht4sG5R-z`P&@Pcdwz}W#bV~R*qOzhVnG?vV%|tHkA;2*S8+m~{ zCH28BsJCLc`8ZCvI4RMEQ|gDf@AOEVMz0#M^46ocs%B@Dw)fV%k8cv&B7NE8ELUAj z>e4Co*#6p87MP!Vwm26(Uyoj{4gCqr>ra=Lq8BAK>pT=QYQqV|E%n_Q8BM}MGbHb2 z>B|_;>5b>?5Gb0s1ee~1!<{}g?fS)#xz2!2^mCOawlRP~W`fiqQ~TNtDhF$Qb_0oV zt&a2zf=_Gw7EdQwW2(abZM1}&+_Lb0kiLWlWpIXTp8-`GNNtBEX&E%h$1po<(%r_9 zIt(arh>`q?5%Mevu}ChNC6Z%l&oLUod9J!gxh`t3gWy591(()BYom31!qLC$5Oagy z;*a7&oi~FdUg@utZ-jkDLG$Qp=m!1;&DWtxTqMQ97%mwfV4Ob1HWRdITw|8ud5S;y Nbu{4yZsIm_zW^&)U4;Mu diff --git a/version6/krpc-common/target/classes/common/message/RpcRequest.class b/version6/krpc-common/target/classes/common/message/RpcRequest.class index 6f245599a2b8a435d1f733773952a8cd023948f1..60d5f9622e2099badbeb68034325c361b98779ba 100644 GIT binary patch literal 4670 zcmcgv`%@d&75=VRX@yuG#s*ssad3AHWP-0I1&o!oV&a07PGrfrDAV6+0{~R)wx-9DxQM5QOy@Now7o9 zWOV7@0*C54vsz)Q9Z9sCNLlEBrEs!YSFf;syW}XeFU-%ZuFuZTtSbz(tWrl#rO<_L z6FnA=pjTn6+311itqv&|p1;_WBZsZ}&c zDA{Fux1w$V(ETRjy)W>D^@(a=#h};4?UW#R{uLmL;{$|DID|jBJXC`oO0eS@mQ ztCrdCYhn6)=E4*)+m2oKW*wU))6i6RFXfBQN_BU`DX(ioy-RM+E?lu`oQ4CT;ce%+ z^M_h$(m^Ss`R)Iim$2VKvW7)EX-2Oo^fx-miWxY%^MCO{=oB}OM6{b)|e+FzEFsnkxQLjcAf~`_Ou|Co>us7Im(9c5Y|cE(HOPUtV2Yo>x$d ztgU6IQY|pKPdF#1O`&6j_l#vnjtP%J z&#dcu6|ZcUbSx^}3H&gHAK}L)ej?@LrwT*$@|`cR>d9Z{ zJ5X=I+(+j=j{cqk7C$}{Y=K9q!W(O#G8m{N|Aelm-^TG~bRTiNW(DX;qQ!=lc^eO9 z-omLpoc;sHG2gzt=0TSXoIqYs8jBm);YjQhh!97A!#2ToIAkX?Mq`=rJ)Fr*>~SV- z>>-m$$Mr=wb^T^_S>iE6ZHarh;W?)aOv#9QIihr-tRO=Iaj2^^E!=6E5S} zWna505{DAaZjmnYBE_e;oMkIEDP#Z5GH~UDwI))vUBD^?Z`2bztFC;ufEh5DojvJg6N>KC$y0o)1V~ z3iA_6^~3qmWuTtA2|smfh2b_=;B{Vms;+W{c6$8gSmt+#8~4Wkir5>7x7{223u4RT znSFf7AF}hYm2o~MjfuaZBW=8gBX?mX({))3Q^aYCji6Y02M67Qk+E;`fkbRq=`@^*YP5IaV+!g_jUFXEJZVTi9M4kHiehjOA-%;r^`(K zgAc^sN56>y{wLM@@>MC__Hehmo5uNJrg`>Dg=BhM2p0dtB_f>YwNp+gy%ztKd}L@d zYJqxE9NnI&^TxCvl!2b9ZH6S-GjVeH@2DN|hpqQ0hM6^)bcw8NzrCP{SCFq5zf%!Rp9nDZzB}y9ZVD2|6S7 zdr$}!^7xz4R9t0460W|BF9OYFPRC8Z9|i*&41CXz?rV6RtwFn8_&$3{_I|+M&+rS5 TdPzB(t1A z99j$=0;wCuEhASn%4@lED>ux7+kqtX7&>+AK$k%JxyK1~T4mR)UN;Knyiqa*x@Q~4 z7Tu~7wB{`2>v)>39Wu1mXpweClS+C<^qAw3^LalEQm+yoP0l5-PvY)P2TQ9>2$$JcE1bV&Nw(Q)ZS+$I! zb=z1e5|@reYpra!wJPbp7BnZb$MXWQ71fRcIhNIP8>+Q`sjDgYyJoGjIbSQSnAIh9 zaQCcTFpA3touMN>Q*+lXqOtq=htTBgOJNm^#V^tzOBG9IS)jk!5q78V%(?&V90{X5 zY9ORw6~rm0rG=aN-Y*Ghq?4kJHf096t~Y0R8T(4X*6C}i-Ub-ETKRS7h21^EHTY?x;M&zqf$xK5Y{(R7AqZF{3u z$-l6>n-t~v3lR_2x1XKhH1JJK8^z+H<(m08z7Uvd05Q^(x?^H&Zv#oWs(3d*gOXkx z6B$m%nR3~zdPQUsyPXY_{yiSUR{{rG;0i+_hHnJ+yjYa!SCH}gOY%+=_z)V}WHh(Ukzs<72L*@&cu#^0)j(_#KqW+0h3`WXB#Ll^uV8o@`os zfB|W-Jz%lNvv^c#`4*|~1uESb^g@*Z49d3%btNUk)v!of`64-I$x#3-(I>td_}d)N zeI#V;!GLy!2E?~Qh;nMX@?fYkpA#XLsLY4Ul@S$wv;XVeoEAI(WRsjen5?k0uee4B34Y!keSv#^wWiegEr7(YbUe=DxyR>r|SA1}0 zgK@Rg)brv}P12~Es8==hw)u=F@ZG396%v&gk-IaR{SguE-sm4l{(wmPz0u#1oEytN z#BOg%;??;v{!D1&eOZF?%;D=Wdwb2aE;yBhGDG2Ag>)+?yZp0I7+5a zAQfSM=0dD)aK(|VZ;Zh;0YWR5*+DZ zu(N_mh-^6+po)pDFk7G5YH&oShq<=A0l;ux{TJ$q8QKH*qSq^XUDS3lb`0p0J 1023) { + throw new IllegalArgumentException("Worker ID 必须在 0~1023 之间"); + } + this.workerId = workerId; + } + + // 生成下一个 ID + public synchronized long nextId() { + long timestamp = System.currentTimeMillis(); + + // 如果当前时间小于上一次生成 ID 的时间,说明时钟回拨 + if (timestamp < lastTimestamp) { + throw new RuntimeException("时钟回拨!"); + } + + // 如果当前时间等于上一次生成 ID 的时间,递增序列号 + if (timestamp == lastTimestamp) { + sequence = (sequence + 1) & 0xFFF; // 12 位序列号,最大 4095 + if (sequence == 0) { + // 如果序列号溢出,等待下一毫秒 + timestamp = waitNextMillis(lastTimestamp); + } + } else { + // 如果当前时间大于上一次生成 ID 的时间,重置序列号 + sequence = 0L; + } + + // 更新上一次生成 ID 的时间戳 + lastTimestamp = timestamp; + + // 生成 ID + return ((timestamp - epoch) << 22) | (workerId << 12) | sequence; + } + + // 等待下一毫秒 + private long waitNextMillis(long lastTimestamp) { + long timestamp = System.currentTimeMillis(); + while (timestamp <= lastTimestamp) { + timestamp = System.currentTimeMillis(); + } + return timestamp; + } + } } diff --git a/version6/krpc-core/target/classes/com/kama/client/netty/HeartbeatHandler.class b/version6/krpc-core/target/classes/com/kama/client/netty/HeartbeatHandler.class index 7d8d2797071f710065e3b275b7b5260f6caba067..a451e3870a748a9892097a8f124280092538dc4e 100644 GIT binary patch delta 741 zcmZ{i&2G~`5Xb*(J2-I`2@={6nvgWKA&HZiLV(be0xc~RMI4GKNSs{DHK`K2*apF= z;(&MnpO83%#H~T}g99H|-hemgQy|6(0#w9h=0Cf$Grt+_cjYx#zWw<43BYCC+ES8i zRlzZg$Qb2F;W$IuaC$w*)_SJr>6WQ2Zy3wwqsOM_GsGU6y6exGI_Yew-2QKBD~=Nw zlab-b;$(22x$!*4WfVA0VIp`gs70~sSPY4_<64^6U2CjsZO5`qw-rT^LEYbevH$sH zGbpl&r8r6`%cyXus4^Tm_=G{~*lP~MNU6Q9Khd?WZd=+N-|g5|tGuE>K%GOwnLrWm zK2UHL=VUZE&f@|@>R`1+-S8dv8BJ@M{*Z}b^6$#?UET9q<$uwGcfx9*i~YhPL-G&F z!c)WC@H>vp5S=l)9lPVt1{JBanI|%U(XMDKq(ssY93p#>B8@yFAF1qsZIKYrBpY4> z30xw}hY6TQiy{`zNLk_I4^%8dzFGYW`4wu_FOYB7wh^0_(o!FX-yo%K?jpH|w19hk zPb?j1L9{Vu}1NrrskL S;;{kVa34o0x=CjOmVN@Dii?~8 delta 497 zcmZvZ$xZ@65QhJT!GUow$_^qfAnPD5xPi;n#3d#qdX)nq7#4%0i6>6R2bhzIiHR}Z zAqJNimn(1J-2)F{jMaljFMm~cb^Tv;_m%u9Nu8hPR{*P6Z%TG%F~h+S{d&CBwhf^H zsUI%5MR;U*;nNzdzUjw^h=7byj4=!z=1=pfa=uzj<<5@PLWRLtJ5d>&TY9BbOYPQ6 zRW+y93;9acj0uKhw|(AyyZA$FNC;t4L|8@yQ3m@zeGK9ecPUrNINEdWF;&_wW@CFI z;@US$Xl3Jp_F~9s9pgP)(HeqByAi^T7z}hnkTRIiN1C8jiXx+Eia&rg^|C_B%YYS0 zQn_~kQ*;=VPh*Bmc=I(y6GcV&fOv_B@(yt)*@h(}c!d_McW@+Z_9r+E*l)BjY#VPQ z$RS2>NB|<~5UGtI4pJ97O_M_ VE$a-HK!y^5N?BMK{Vu=#+AoSzRzLs% diff --git a/version6/krpc-core/target/classes/com/kama/client/netty/NettyClientHandler.class b/version6/krpc-core/target/classes/com/kama/client/netty/NettyClientHandler.class index a6cecd45981413cbb45afa454f8b9348a1334d8f..43f66cb1c7d028c0ca2d4c9d22ae1044040b82cc 100644 GIT binary patch delta 596 zcmYk2NlzO=5QV=UuZ#yY*at937*8O8ZI%#10$~kH*deR2ID*9`B2ogU9QX}r?)eYI z5=#yUaYP)rapsR8s%J(6hpwuAUGKf>y0for^ZMcc1u#zK*t}KsbvV38&|%TZOSjEf zP~GmXkxLaQCMa3-(&ru-D~$sduNYLswtxKmT~#=)ty<0bgZ+bF)%OX8+`C#~>GkEk??YYMIb)o+jZ!MSs-oGd*Ixjbh$IMWR; zLzx#g6_*jJib`;6RRUiRsCqE23)xY|Y{p$Cm<$f|N@B?7Rq#(2(q-PbO!GFdti$Xq zb2jrX?|9!nvQCv+Yp0WkDqlv6v*K9@mntcBl9Y_i;5gOOS`aNC*2N_`@8LgtchUy@m^b$G03ba<+%cgSlZr9)A%doBkpLbz|5dc~xlK8Z0*-WXMl z-YUgT!exnN<6hzupT#XjfiHX&&^G~v$s%P%l<%S>L|K(@osBr-zU)}Cllv(#YZ9wr zg|S}7iL^=d$Q&t;44`@nT(Oe%ge)*D_Hl>iIOy~!e=7-_$vS;S~dl7g*%>V!Z diff --git a/version6/krpc-core/target/classes/com/kama/server/netty/HeartbeatHandler.class b/version6/krpc-core/target/classes/com/kama/server/netty/HeartbeatHandler.class index a5f169298ab0b26a23c916b3a04c24ec5670e7b5..739f1edbb03468065f0ada5e7dbc47998dc6fbe8 100644 GIT binary patch delta 1009 zcmZ8fNl#N@6g{^CkCsQlG8Sc~Kow{~L~Id}Nzn?*AP6YbT57R*kGvLxD-z=nV~m=o z3lbA!G`KT>5dn=u;>urObY(&dYj-X*-WH<`n{%i0ecw6vy=eNk9mdbU*WLj*2>+t7 zgw#TDx&JT|khI_s>uPs*m_aBKP^T{FvS-cEpk72V_7QBA?n%#Ok3Hy-{PvC+ zuWu?GkR_Kbq1zW$0+Qbqld)e!V@!kIrzo;wgcB|SO(J_~Cgf}v*6HzvW#tON;P-{M z3=yoAWeIn;1wEkuIN!O2|jZN?`xjN6>o1GX(WJ<*8q^Y3j7DF@=!a0cT=fht*R3CvlWezqx#U^Zm_Qhx$WbGjfhly49$2grZANqK|Gx zZp=j=E=2FVsPbO)NRlt;ETUwL6D*Nu*Ea6mSYNxn{$@FH_x{F%$C0;JBP%OJ5WASE z#O?S(0=#Tg?a^D41h9t!P77uUNp4xbG(E*?GWipLzeyf)kjt5tb3Kw64{>GZNF4RM zUxOAo(V&GfHU`pgm{Hs!pcQRg5!%tgEIv%TIO@44SAB#qhoPzu5V{#=g=H9=I*V=z zsq-jWLdKp|SO{w<1XfY10oOLd;B#1Gr0RL(Cy*T5N#<^zR)#Ae;5h=5m^ceC&jS(TM^UUx)$T#we_OtQ6z?i%BSt8*FB~B2Jk*oF=n z+g0p#?8+KEVM&G+gbjsQO?gPnR-z zgP|#PT{8?lJEm*bXwqCU&Hq^A&7%rVVNAxjNqCwM+rBiNW$0Zl-(CK6&){x*C^1QK z^}&nk!}8MX!qWWn>g>DkuU=OlEmY^`e}1^{TLq5!Sio1$KJhUIH9>@h!K_v+>O~nB z_)~kA^%8@ZKeK!J54-A!!a^GXBpTTUJK28TD!XEPC}&2%TExhz;%q}4dnsbH!~N9R zPv@89ZRDeY&yXLZhikHPX8jvDy5GaYP{AgkjI9)PGE6K|r34e*3z=*iSqGsz>2qTv zJhZM2h`=XU`v_S@Ck|kMx}20fNF7#_ZB>bRI)p)?E{ek#A~i=aBL<4#C{=#u!3G8)Kq8@3KjC82j@hGP~)q0HJDuuW*3eN<~m<^m`X7HAaz**T1j<03@XavH$=8 delta 12 UcmX@jf0}>7HAbF|*T1j<03>|{ssI20 diff --git a/version6/krpc-core/target/classes/com/kama/trace/TraceIdGenerator$SnowflakeIdGenerator.class b/version6/krpc-core/target/classes/com/kama/trace/TraceIdGenerator$SnowflakeIdGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..de725b3e997456a4925b8edfa4084480eab94840 GIT binary patch literal 1385 zcmbW1&2Jl36vfZ8#~FJviCt%ss0HeA+NQQcmLgW|h6Pg706}C8e+Q|Q6+2cH=Dw-hgbE1>OMc&T@9&;>W`6tY zr(XcPhf5kFh^kO@#L&TzTH!Z&(c$iL@#^A=umXmT3$|+q;|$SUz7hl2&F%3T64218 zLf6rSZicrkuUcH?RbC8yZi(W8Y)eZY2v_(#@ciRt*IWC<;j0H18DgU5SvMHijEtAk zaYzP>*Tts|;aVcrYX9VJuZ}*s+vV_juwYk3J>bWTb8H=w&%w2Iz#p&&tDb3S-NQM?tHQL?e^~dN9M?9r$^45HGlu{_THVx8V=*A z6eYvZo15K_TMm5NT^`F4xdKPyo+_&Yty{H5?B=))4|8whO1W^vSwK~UZ?RXt7ftHpS60+p*UKzBq*YGWI z*_If+uNrDtDn(YAr{h<=dZ1#8A@d(R40_2WM^2N4>VhgT{>_#!NyiA8NmZUyPdohesdyZyb(UVc?M+;kE1q13P5{1Mjk~B_l!pJ0=_t2R! z(BFK3u5BE?o_=i$Z|oE@n=ro*!=0yg0C8&b6wE{?jv<9X^rL_i7(x-J2xb^>(}}(i zb`ZwfmpJ+B>7gy0 z+IhZo7lQ@bOKRM}@aM7!nk1TcVaR3U2}UL!BL2KQ;y0))RiygXY12&U>l^a;#&?t^ z3RzTvv;|pIAz9F^AHD;;eRY3O=Tfmb?jBTpZD7=vRgm z5`awKE^CEi%U7a@%9_e%nqNbcqlc|Ov-=onIt0v9dzFAbr0cvErZYoDdR}VTBfmKm lSV1yO91Rnb0iHpjZ)TK;r6bm?F^vEK literal 0 HcmV?d00001 diff --git a/version6/krpc-core/target/classes/com/kama/trace/TraceIdGenerator.class b/version6/krpc-core/target/classes/com/kama/trace/TraceIdGenerator.class index 5bbe78752493bd2fed1cf63be214e1f214eecfa1..ed9fb11aa763fa8bf7ea897cbe43061f9e813e6c 100644 GIT binary patch literal 1342 zcmbVM=}y}~5dIbdPK+CZNoeWCQQC&nJt#dwX=%6u0e*x-{Znai7GiL0>ev+Cs)qzo zEA;{TP*rDhks>Oj%F^!4?A-H>fBpXc6ToY%sAxf}f{=zbv@^u^`4Km4?(7-sJNv@) z8QP~U$MR}T?oGL}`ukxplYCvW?Bn%p8O2aVPH< ztBjtkd1xq9?E5tgV2~l~yY*o4x@KhvwOC;cF|hG49xy;f62l5cG>l^GuaVV#D4sa9 zX%Y-`$)?291@7g<$3QryNc~HGX{8e|6g<-KSPq~GBe|23FNzFZX5e|k@i(lZShZ~1 zD#;|DYM7MmRgSnFi1l4L$SDc5=L{k0=@wmSH&1DHW-Ujo1;riVZSWnNBzo30xxK|b zOY${g$S+tWhJmYalp>FNRSb$6BpJFdNUDPg1%XANh*jHhJ{_8$e5rR-Z)#Uk)zN`lz#;^ z6`fjD0Vzxq7olInAW5Y0V8u1*eT8z0Yh`qQCMj$3&`J6;4gC*jr4NXg(YrEoioWcq zeow!DiifLX(y|&`M~G;7c9V62sGdq5{bU&f$00l8J>NEBAd}%ibmlVNY;WyEYTgJ*C;YXsTC@W HWrY6#PZKWQ delta 386 zcmYk2%T5A85JgYV06jE~;E0O&7!Z`V_+n-J0Ut5`fQcrulBK$I>Bg9t{t?|EaY0=3 zQO25(7<*Aw_jcV|m716rZKgk86X2Nso9Sf@0cnk~WU%g1^@D&pOOCvIRkdQMP~Cun z0>cu^nxbWelAEeQW{q{th9#oxj=XwF;WwHmao?t;N=>03uJ7(|F9xooiYd*uB68ne zo>ZQ2`+vhC!ST~$R>xFgfAw$If}jK8JPv;W15hVZ