From 658b6af8d2db5ad4b9dcbce636eda076c1ca687c Mon Sep 17 00:00:00 2001 From: onebeastchris Date: Tue, 2 Dec 2025 01:59:23 +0100 Subject: [PATCH] Initial 1.21.130 support --- README.md | 2 +- .../geyser/entity/type/BoatEntity.java | 9 - .../geysermc/geyser/network/GameProtocol.java | 5 +- .../populator/BlockRegistryPopulator.java | 6 +- .../populator/ItemRegistryPopulator.java | 5 +- .../populator/TagRegistryPopulator.java | 5 +- .../entity/JavaUpdateMobEffectTranslator.java | 1 + .../bedrock/creative_items.1_21_130.json | 9620 +++++++++++++ .../resources/bedrock/entity_identifiers.dat | Bin 8513 -> 8777 bytes .../bedrock/item_components.1_21_130.nbt | Bin 0 -> 16211 bytes .../resources/bedrock/item_tags.1_21_120.json | 896 ++ .../bedrock/runtime_item_states.1_21_130.json | 11432 ++++++++++++++++ gradle/libs.versions.toml | 6 +- 13 files changed, 21970 insertions(+), 17 deletions(-) create mode 100644 core/src/main/resources/bedrock/creative_items.1_21_130.json create mode 100644 core/src/main/resources/bedrock/item_components.1_21_130.nbt create mode 100644 core/src/main/resources/bedrock/item_tags.1_21_120.json create mode 100644 core/src/main/resources/bedrock/runtime_item_states.1_21_130.json diff --git a/README.md b/README.md index 5a734f18b..aea70840e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The ultimate goal of this project is to allow Minecraft: Bedrock Edition users t Special thanks to the DragonProxy project for being a trailblazer in protocol translation and for all the team members who have joined us here! ## Supported Versions -Geyser is currently supporting Minecraft Bedrock 1.21.90 - 1.21.124 and Minecraft Java 1.21.9 - 1.21.10. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/). +Geyser is currently supporting Minecraft Bedrock 1.21.90 - 1.21.130 and Minecraft Java 1.21.9 - 1.21.10. For more information, please see [here](https://geysermc.org/wiki/geyser/supported-versions/). ## Setting Up Take a look [here](https://geysermc.org/wiki/geyser/setup/) for how to set up Geyser. diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java index 3b77b1eec..9652f481a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/BoatEntity.java @@ -29,7 +29,6 @@ import lombok.Getter; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; -import org.cloudburstmc.protocol.bedrock.packet.AnimatePacket; import org.cloudburstmc.protocol.bedrock.packet.MoveEntityAbsolutePacket; import org.geysermc.geyser.entity.EntityDefinition; import org.geysermc.geyser.entity.EntityDefinitions; @@ -220,14 +219,6 @@ public class BoatEntity extends Entity implements Leashable, Tickable { return leashHolderBedrockId; } - private void sendAnimationPacket(GeyserSession session, Entity rower, AnimatePacket.Action action, float rowTime) { - AnimatePacket packet = new AnimatePacket(); - packet.setRuntimeEntityId(rower.getGeyserId()); - packet.setAction(action); - packet.setRowingTime(rowTime); - session.sendUpstreamPacket(packet); - } - /** * Ordered by Bedrock ordinal */ diff --git a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java index d4f427124..ecd7311ca 100644 --- a/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java +++ b/core/src/main/java/org/geysermc/geyser/network/GameProtocol.java @@ -34,6 +34,8 @@ import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; +import org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860; +import org.cloudburstmc.protocol.bedrock.codec.v897.Bedrock_v897; import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec; import org.geysermc.geyser.api.util.MinecraftVersion; import org.geysermc.geyser.impl.MinecraftVersionImpl; @@ -89,7 +91,8 @@ public final class GameProtocol { register(Bedrock_v827.CODEC, "1.21.100", "1.21.101"); register(Bedrock_v844.CODEC, "1.21.111", "1.21.112", "1.21.113", "1.21.114"); register(Bedrock_v859.CODEC, "1.21.120", "1.21.121", "1.21.122", "1.21.123"); - register(Bedrock_v859.CODEC.toBuilder().protocolVersion(860).minecraftVersion("1.21.124").build()); + register(Bedrock_v860.CODEC); + register(Bedrock_v897.CODEC); MinecraftVersion latestBedrock = SUPPORTED_BEDROCK_VERSIONS.get(SUPPORTED_BEDROCK_VERSIONS.size() - 1); DEFAULT_BEDROCK_VERSION = latestBedrock.versionString(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index e4296d7fa..14c825908 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -49,6 +49,8 @@ import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; +import org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860; +import org.cloudburstmc.protocol.bedrock.codec.v897.Bedrock_v897; import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.geysermc.geyser.GeyserImpl; @@ -129,7 +131,9 @@ public final class BlockRegistryPopulator { .put(ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()), tag -> tag) // 1.21.110 -> 1.21.12x doesn't change the block palette .put(ObjectIntPair.of("1_21_110", Bedrock_v859.CODEC.getProtocolVersion()), tag -> tag) - .put(ObjectIntPair.of("1_21_110", 860), tag -> tag) + .put(ObjectIntPair.of("1_21_110", Bedrock_v860.CODEC.getProtocolVersion()), tag -> tag) + // No changes in .130 block palette either! + .put(ObjectIntPair.of("1_21_110", Bedrock_v897.CODEC.getProtocolVersion()), tag -> tag) .build(); // We can keep this strong as nothing should be garbage collected diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index e68783e49..253748c1d 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -50,6 +50,8 @@ import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; +import org.cloudburstmc.protocol.bedrock.codec.v860.Bedrock_v860; +import org.cloudburstmc.protocol.bedrock.codec.v897.Bedrock_v897; import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.SimpleItemDefinition; @@ -200,7 +202,8 @@ public class ItemRegistryPopulator { paletteVersions.add(new PaletteVersion("1_21_100", Bedrock_v827.CODEC.getProtocolVersion(), eightTwoSevenFallbacks, Conversion844_827::remapItem)); paletteVersions.add(new PaletteVersion("1_21_110", Bedrock_v844.CODEC.getProtocolVersion())); paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v859.CODEC.getProtocolVersion())); - paletteVersions.add(new PaletteVersion("1_21_120", 860)); + paletteVersions.add(new PaletteVersion("1_21_120", Bedrock_v860.CODEC.getProtocolVersion())); + paletteVersions.add(new PaletteVersion("1_21_130", Bedrock_v897.CODEC.getProtocolVersion())); GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap(); diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java index a27a83176..cc2c76876 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/TagRegistryPopulator.java @@ -37,6 +37,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v818.Bedrock_v818; import org.cloudburstmc.protocol.bedrock.codec.v819.Bedrock_v819; import org.cloudburstmc.protocol.bedrock.codec.v827.Bedrock_v827; import org.cloudburstmc.protocol.bedrock.codec.v844.Bedrock_v844; +import org.cloudburstmc.protocol.bedrock.codec.v859.Bedrock_v859; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.item.type.Item; @@ -73,7 +74,9 @@ public final class TagRegistryPopulator { // Not a typo, it's the same file ObjectIntPair.of("1_21_90", Bedrock_v819.CODEC.getProtocolVersion()), ObjectIntPair.of("1_21_100", Bedrock_v827.CODEC.getProtocolVersion()), - ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()) + ObjectIntPair.of("1_21_110", Bedrock_v844.CODEC.getProtocolVersion()), + ObjectIntPair.of("1_21_120", Bedrock_v859.CODEC.getProtocolVersion()) + // TODO .130! ); Type type = new TypeToken>>() {}.getType(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaUpdateMobEffectTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaUpdateMobEffectTranslator.java index 572a309a7..7f288554d 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaUpdateMobEffectTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/entity/JavaUpdateMobEffectTranslator.java @@ -70,6 +70,7 @@ public class JavaUpdateMobEffectTranslator extends PacketTranslatorFi-D6ZGbJapxP+^ZX|f}u#N@LI+#3zfDomUpJb5n*H(y?2X-Q^IX)!Z% zQD(}j$%b<33X-{*d8x@oiD@NPRr$F|nW^z8iq?P>O|IkQ<}FApO3p}40c%|c7Oi37 a7D!IaP0fkVC@szgOKbp2h)n*g-~s^ItT9{w delta 34 qcmX@`OYUGOH`6vnq4)qnpLkz<>uZ;DdoV&7Kz6Kfnjy4Ih2boPGA$fZ?n6vX1wa z84)jDRgvm$wxkkfB(gH|<;(Zt#pf>~cA{t}x;D$_*|<(7?LRv#%QTzEO_e3}PP8*F zXH_}R=54bRUCP^R7FTsyWp$fp%~tewQWWK3TuvtOG?}N-R&;%w%;Pj`+PYlC`8*!i zS<>bQ+1A|WE3(YY5yr*W50au&&t2Mz&P~d^fWh9J)X5B9T6XhRjkpzERFjRf-*uP2kMcdI^@Jv46Q$J+sH-CU}qPLrA*%hf;yec`I z!>lgpH)Ux&TEuD6CNP1EU6aMhJfFdWmGej~VDy&yE$wRa)7AeMMHiwAdaK%G59Sa> zXQHd#2Ezu{(Yt8sjoWkdaOy*`oB8=1o;3i+B!ubl%<)T~pKl9FyYb>N-4m1w9GxALT{fE_R}e z<{hyjgmHE@Itv>GAD*f|<$9gm?hQ}DZ@+;N(b6D7f)DaY&3(b8h-~_#%L=p{zr7!+ zBXxbafl?bf5sK0N0wyn1sMk&m2ni#+R)9&tebU|Ivf7ffb9bK}+&B`>NDALitx|hs= z#Ph0v-@n=2-8~a+r!eLsy0jC$2m3oyCoepaC>1AS-Y`t$xBpK6aB-Tqqw;w?OX|IR z{`DW!w_e$wm*f4BI+o$LJYVZA-~PkyE{wR1m-auCrH$yuQI3Fj_x<6f3RY&U&il*k zq5Q4OW=4)jomEL*D_Xt~y=DFqt78R>95}*-XuJOl@Yr+ucm>1&jC;`zkm$WUAMIq% zD`0SqTG&rv%@xP{ylkgg{p+uP-(~gU^E#U)hQ|#j?o9NvgRIsMT~u6(PC;?2=c+a-$COtUSnOAnN=3lwg9n19{i2`ReGZKX({;n+loU@KcT`{8jQFS%^FCG=8mN|&}L2~Wu zCsU@xV8#t!0diMqEJ<;gESeb3q!O}D?7`B`l#qu-K))$D2X|eVcWs?pF}w{=mGf9j z=dt?jpWq)jclNhBneV|O!DGLLf4To}NAERBYu9X8^!NY#cju$aU86`1jusGY+r(|D zP6=K=rW}BRb&c+J&-tS0eni)P2BVK-V9g*^k~)Qpx3LsVvl?`uSnDBiwzo%j5)L2y za0joo-k!a(0G$J-)pkl!V>M!$)Z;QK=p;Z#1i6o2g2=VV_ol7c*!U5Z(oG9{d1@5Y zGq0$iZl5v*^-Z*_uR}w_YSgT^*PyPJc@27swH|pmq^;72YC#ijYCTpLTApx&}wP>?CPl^-Q zMZb-rb#+n8oR%x0*ZiB-&_37Z(#N8FzK!O*MC-gh<@2w<`|dBt zqI}*(BvQi*t+I%eKQsVb{4w|-ubna#Z%3``sqjJC4L(8@ui4!_79S)g#pBWO?!J|Lv7Di;F)5%_928WA`3iTu-z3+x0YyZ@-^rv0jLDqgnWT{v1x^#;bEctcn7HBoCJE+RX`=DjeNsY1$WPYg!uTI3J^Tr9p6VHvxL#0Cm z`GIjQt#Iu8f~#l1CDc*!^s}p&qwE#Hv!+>+(nzA>#~`6ViJGT{(xvvTx`w&={!ZPC|%4u*VJu0L9wGza!FPfv}0d+rtW+nrOU-(DmOd-4kI zS*lT*xoCEZj!p{%*G$TKrk7I7rXx~-|M*hyzH@6Rz}NLLCaZcZ8t@x8UP%Mq`9WyF z|KnIR;Q#pNzw0&No%J-}->jzr-~WCZ@OpaoPg(;GiGq_oNv z<3_QnH35ofiG%>?`UgZ=W*# zWM^2_*P)uc$F}#ifsM|tp_N?GCtz5x;|U1<<0~m7Z~q{4jsJBlx<-SbMsFRduJOh9 z(>2xut^cHT4UxaUCZLg?z)u!vv@R=toyr9QfFDk^Rx0TgXeCF5`ub6)B2}kAYltMR z;oKai6i^qU_0@&w7}bS$%nHV^R`Xafz37_##Vm0D`}ycHzI6hG)JE6+d-Vm3PQtew zuOg!U!HS4wV<@-M&LsyXQ=6#a+34MQHv_uP4*Pvm55Bc7W5$QOEo&vf)C9Jon}+7* zKx6P7_*%1dA-brq!Uf}cG*f?Tl+5SuH_ch4+#IAuyUXYkl^0OG58ZVZM3S1n{j_gs zK7gCqVWu_pB8PK+7St(t0{>(md=Pxl@qn|@HT#PagXptigmZjDG;;uQh7$$n%7&_u zo7N=58Y^|kRUonK`GyM|0~fezf6?o^oC#d>Zsk1SO?1bG1#DOVS+Y_?HR84d@@0UQ z0m{;~4$h+Vg1Vt0kUFV={wM037qB-B?xKAU8y0bFEJCmEdMskNHN+xD`lB~2V#6X3 zF^)AH0*^|vJc(|AZc4KRNTVC69W#YaT%{762BW>02Jyx$j9P)uHjLx=EDXKCYg!n? zy+I2@-Ll~w8{R=&%CO({e!+Eu!=wgsb_NH@Sl5M%nxvR1I{txSjsNDD(#LO*-OuVn zRfZvM=Pljns+)ik=CNc%J4%_Gbq;sJnl| zp^uzHd%uXh+5ZV~p2C&02|758BIkmbzCK_ zz2_EQxdT}FnrKf*Z?np2Ro46CX?ZfKaOY1%J$RqY%BIN|c02_Tvf2%#1o`b;x;I z*6N$<8P7%BQ$cFw71A2YeQwN4yL+XIKW1|ji)BzTJIqWM$huo{11Ac5yRI|YA zIZ@HQAt$Q7WplEO1 z!NxbtegYcHjZdMlO5zZFtFsm+W8&s>)ym3$2*YeX=F+sG)%8JS)p~ z8vnja>h{IJMG%v!$~I}sA6m)ZC2j{Y`v#8A`RL6ta6FZds1Dn^{M)nULUdmBYH8!7 zJ+Ju>x@Q8b3fEu_Zn}Hma4q5nOlF{-uAU@dyTP~jSM?8PfDNuR7g3ldD-0(1;S*}< zndBz5b2W9049U%w29l~`{CV_s~n-r247cJ@N_vurZS#;rbm=U}6gSyi~Sgstu9 z4U^?zpv@P7UybX$Qs4eB)95`|clguib+(tyGqWUThfEb1;O^PzOs*0GcHF^z3*Q{E z_nlq-zRUJ~$*3vo%75E)_qJ>9Z9BuQ{9Vy{?{dknD$xbKYwI)jt~dL44Y$7JyRO=I zschSSz3P2$x%XWn$+_mG_>`VILT^j>lzzX+>TN7=O!XyF^85pQ#;t3s?Lfy#%gzWd z?bX8Y|4!Fn@N}t-r{yGcsWtp9w*wC>*QGYTmyIsv=~7cTFAE^>5f!!Y#*Nu@j80X( zzUw(vhg(BV)k3Q#n}fYM*q`A@U(&S342nUanZ*sfYO2Ts9&rAa%lQ6TmFPsk8@@uZ z;RHv{32xY5+!8Nm2JcIEbAIqPy=lV|HY_1j$?LGxkPEq^B&>ZAym*-8Ee(R(^qUQj zIC380qAqrYm$Qf)!p)pRTqO5w7{rD_NFCKIIs+*OBeg!If*O6~`BNKp0yIj7IusCx zP+fkD4Tm^J4q;b#Jr03y4si%`&xS*6I0WGkzw73EYSr_-IrSr8=oWGuno1nB8a&#j z+7J+s$#}|p04ccGhGQH#$GBpDQOmoWU0mgNa$d1B+^}I38%9A&@aW9hwi~&;*+bQq zcaqF05IoJYs!_g(xJatJ0lk!E&>H@+VFSko{xS=^9{3C08v=jnTQiVA&E>K-$JM1~1mQ{V%&=9vbTp<(yHymb}8G{ysA(Pw2>>+A`ZeS*xDMW*+3 z!*!0$T(K*>p1Fc=4w)u=Ysa6K&NYmpu6Rh1ql>8eVvuI9`n6T`k5 z4=r}YB!?P1*(cy2B>qA6d{rFTtExIy)lpiCu025}dxS~7!7Rzu=-SKt+g}^F_7)ba zb)K>WVI(p8JWQRJ0rEXz(LQ?;dqSb`>0Ad1@P|)xI4s9h2WMRYVR&yqKup0nQEG*V zxxL&A2y@#h6%c5DOZcM_%rM8Ki1)L_k6ccCF9T*>IdR!r)l(@hZfSAh&DBT^Pc=@` zSi_%PnE=X?5m3g?p5Hyc9gR#QU)b*K!2n7&SboG6PQ1Ur0e6F!21o^n$jNZoQw z3JbG9O;+(VsppwSAYR4G0jJW`-;g2$ebr5D&mICFibq*p!?F1hb&`IGZ5)8ZF|Ws(WIf6vs82etEbv2I^CdpMEaVXgu8bo3EKtF|AAOaE5(O%h>dc>6dV8J9@WB zIv^qQ-nfA&WZ(RE-9kw>u2Jp)yt>=QVT&Jfw*&onw{Jza^^kUWwUzu9wy33srCR?i zuDqViMrG;nCMez^K8jAXU#BSdWNG;13wpvvpbDfkmXoM3t{*zZ#d<>d*T62`qQQUvp-?PmzMFm(~rg9$|>**vJlv z2Uv_;8B%Em$CVw{Q3t~^T1@L4-n5?;C!@BV%xW%Muy;Ht0(|kfQ^us!$t8PUl}%qW znkvawVL37Ja!P8LU%@Lds}i`X6%jdwERr2G}>vZd0d^4JLL%F z>QQxHF=%+pAALT1Vx2yAelVRr5KY=#9eBsM&NMU_$JaGv!%;Fam8VIan&#icUgl53 zQoaJZ7$GgVR}Y5C#`^c9W-f4NpQ6C6Q^y`ftbm3&mM{PH*MvdZY<7%`fVOOw z73Hf;`ieKi@lF{nQZi1)c@n$w(th>fL)gZb`WSf#?`tkJWmjnA*DHPmI>Qc#`3g%f zz&THbR;uz)!_w#FVdR&h?BgNmtY}Z{C<)~(ef0(P?^b1zfSs8obvW|Us-P9f$0fep z6=%#2am?7ctN!Oc{NgdaU;w96Q1%NN642b%bVKIs_8z{gsuuCyR8!wl+QtPkJBV?7S!+^m%5}G3f6;i zG%M%K2J#Xg(1Ms1bCNAK^eSL{LB?uJ3}@fqCSor9f_B78%{}D|PHFXKjD=A>6QsnN zs;o`LHZ&ET%;To=Azq;+4K*;l(v*S{3dIdoQe?ig?;J`-Ea} zHClz_^F2ZHq-*n{YcyMC8JupSj?h06C!--eWgVNJRMsj{KwgxyQ4V{W?}5+`x#L}D zVdY-70U$=wYSHNwOcxXC$wJNju6W6PMF_4d~9qrbO%4P zbNsn` z7!fw3JT!ky*i%@jS(3xq%!--bj2pt+9W}h~UmLdNs(;a3kepDK$)Z!BWs{ReqzC)L z{fd^31;~U__OoQnmOD-A{TM~X?K8hZCrUxZ5B|wIWDH$kDrd;lN#a)S+M}>WkOEp4FKmXBG#^; z9bQr-vx-u*eak?!5*qH2FHd{+jGe5la?DcIVq)4|QYN+6&3lyrmq*a8aJ`PMXiY}B z;tNeu73M|gk~3C>%zZ0PrX?ePrC%#KmCZsj*sPj)kZT``Mdb`lZ;qaY?jqg*3^z?e zveYP3L}qbC(3^qdC;m4%e4~Y&S>KIh6Fj9u+6U}$^0(WYgR8%sE*KZkt_3!R;v*X3 z3%`GkrkfY)Y^`E3SX3K=8rU=L=|K)9Ex~!)AA+=7yXjvqV5?vv4fSU1fuw9r2*MiV zMLuRyxF{8@+9V5J_Xl>$A~s!MGxuO7hslD8#9kng>7r3hUc5C>1qQ!#Er#LI*S;@Z zcawgX9-xtjQ#Tarw&yy#fL_C`1@{J0MW&v6(%?O^Y$ilORYEN~bwhSh@xg6k2E7P8B2Q~H+oY-m9gpKu4~eeWss1yU!UL8?kt zoE^h`Cze~&JS*6OYu-jylvZyrh9_crx(FBJsEPpld$B;u)X=3WJ53KGQGa#6KeCg+ zS3z?rCoyo5SOHNe@D&!lHF6OLKa_f6c={bYTUFGHOIpm_^J0InN02~Q^D`VDosu?5 zVHdLD0ixy2*=IP>q{<-r;>J(L*%2AzejbV z(@I!*Mr^^^Do=r05xrWfbw$m}>1&*{Tw$UX$w4xFBw{w8oTm9$8}4`t1O<@}Ph$7G zwbeaFg|upJ+-bJY769qO?)xO`%Hve%BS1t|I>$?)&W6dNw+x^(@msvjavMq;(L0v@ z@FAsy?4aa(hD7to7785e$ zyZDICT_6SP3!3S8o;d=ROii9J_a6(69BVkxJsKB!r$Oq%>Nia}qjU&d>R_R^hcR*B z(ODJpH#hTKZM?mJ+z!B*;pe>$Bzn&LQD~jK;tjzpa;uzUpb1FfW~AMxzrgH9d8-bM z#x@)b>tpBDUD5kx_F>|ExKtdafpME3=)(=P&E}^#xbGcsZ1UNc%mmRUlD+={CSNNh zy@HT_aZ3MblcXW(QUr)*mZ&S(u?H>xz#i(*_8aEndzz7RkFZR9v@*5ut${|+VXaZ< zSMKQ*V|$4kT!wh>VEQaU^e)NvI;?Yz5>pLXsl+UL6BtQF1$Crz)n4j(x3{Nx06916 z)hWEzq^A=fWGH~)wugfHK@NICpX4DK_l@Y`b`JDkOBcHe=9Xrn@kZiTu!bh|Dk$t> zBEzVpZZD}-tpjFsR*AuVpoO=T&IPrR!}KT$2kX%;J?C2aQkh!&9vPr>Zo?OZR&j9( zt0>`PfTQ4wgG7F98l=G(&O-DnO>lR~cP|7HfL2D=y_z#R({BP=v!azPyXk^wm?uWc z=?D=LMI@8vkbEdg5%Cy+Vh)OKYVEGT-jQ-o$<5G$`2iAFmcMrrVXYp_#fC6HY>Z`1 zRv%>PQ#yfi3|4*{5twD% z8@44#ZB822V2W|4U88=98En>BpB2UeC}Cu#f;A|mJlf?)o6Uj_eu&;SATi^io^>E_ zx|KcauF`S3T8J%Sb(j^Y();1jnQfY6UCDQa(?h*Ul;Uj#N%Dg?$EDdXTZkd?*ZOzU5tfl=@#0+1S#L^fRQQUJoh3RJkt0J*vAl zNaGF~C+qAQ*yYVq^H%fgb^cu@DES3DV}*huOuBk*VmfHI#Q&}HS|o|)vcS3F8K-+PVEucxKk>_qTs z`sL93QcKuHrz84-K!Q>K%|uXmE$!wjec$L6n#b6RR7ThRn6E|8Z#+OOKBkJ-&9a1X zZc7HeUk{gaPR&_vzsu6$CHC{kW>0}%_ z))n_N9_SkjHZ4G@ijzadanM6c5Vu=@{CftuQ>}kMLQm@MrE`y^nh{q#WbK>g4f+ME zQa}_m_vG=%#HFG-c&dt9y%!bhQCXUIvl#Zjoh}qisbeOY>7xQ7sVj1N%n9GvtG$EP zbPbS2t|~{q0>*jG>K&^RKom~yRAQWQz+YKozPrNr{8=@JvsUz+O4LvlaVUpZ$E;#5 zJB(#B3Kx3Opzo3xgO44v92|*vD=vJ?iFm}S%pw_ZN@E7b9`pF5N@Zo1i>H@cg_mj~ zxMYD-V13I4$+<~hC{{m9s)z+PGNW&zkJOg7)_TM6auZd953LzolE9egq=j;Xe&EAE zDBCPy3PZ1OF`vIt1V&&gaU77%(3$}^KB2_#qfF5H9?3$8)F)Z3R!!4bKEy$30rD4! zj!DD@3?}STqJjNcqJ{b_5}a{brzQ>#?4Y;dM9Mq6hZCInPDXNVum zro9nKu3%TBH9vtieJ|va2W>tW%_+-f3OesBbb6O~+|ab#p^Zol`8pr1()rL-Y}Gf0 zcEX1r2V^khZy!#Tva3SII0-h^EW`;XI~h;u6PC*Gc)wW1Slp_RW=0xd8URusNI+^_ z;Zhy+#&BRPvAtp?e$Q2@kkBZhwi*sPdw6eLd(c41Cf$4wNK#p^u>-%|ClqM3aLnx) zaL=AL<>3oB$7kipT;iGEb`q8*u%V^$Cr|<{K22cs#KKOZEf9k(Xo#A9kO1=ZfX(QG zO%lU0?D%+^6#K5`+D&p|c^fPoD>GteNVf{RVXVoDq0^vdsPm;TfDM1EE<%O+Fh%dE|;9 zQM&1xtrwFpo-yUYEs>w(ioVvEx4K5>3sCQCV^wuJHePNpm3;IfX@I&odw~CjxLY~ z70p&PJPDjPM*+Q~9jh0IdDG(agsU5oZ+zwh~`>7$`~tvLDDQJ z+gy+bF@q1heHA4Qj=WeXe6W?b0$c>7loqUhnliI6BJLfVr)Xc1pJ)ma?3+k#3bLAnOvSYtr?vGtx4*N#R#Nmz2@x~D6SbTQ+urn8uo z^ju!?&ZQ}CN))~kj89MySXnmk6{5-bk#s9PKE$-9j73e0DgqolO?Fm{cVTdw-{bN@ z_(TtSgOBeg8Zq`k6fnfXlfmeYd_FNf1kqYWYr#T{?-|3TETAQ@90ILH445CLGe2bm zog-tsr**Oy*8QE*A`kD@dT2s`5xJhDo}27&`UiKhUxZ%B33P0c=ve-f4(o+AMZ9{5 zTzY(m2YSQsTEq@HW-kj zt`Bb^EoelmO%u-UGYIX+KQO9tbwQV(N$+6Uc#4 zzcI@kv<$2I8q3>_wARO=lW1+*IRO|+S*ty!(Th9u<}X!XNXaF=b?6NkCuqc|f_=5q zh@l;^itr8}kV-hD8Op7F3~FGSr_6EDr#opQ)VV&1mEtnN@D1qbApD1xGz>j~E>99R zYn;KZ)cR>IDuq^;Bc)t9UK5u>m`}>Mt5P_Wk0M@@$(^)uy#P`w)MVc#tHGVa?wp|P z-#{A6u6i3mJDS8B{6X5paz1FR6j;M!md!@B2Yj`ye!S<*m*uf|rDxQGXBZ+-njv+%*?$9DjyGn zj4h5sw=G#5J0t7dARuH8+~4c;GA>_gjO;+q4%~-IwVUK5kr)Ie+9_3d2+^ ze~&bl-- zpB^YE=8H7&150tCE!VM-aS%a6DP$9SDU5+FE_qfM!;kG*{inx!;#@VH?m)evZ3&#U znlAb}H8=QIs*qaQ@v=`EZAjqc5}wDuixf;$dqxtPeZxjAuV24Zl!$y7l3wDj=_Y%A zB)5mxIcFFST@Us_sTQO$=8L3z?@|dhEe{KC?wCPnrb5b(VcfWZAu;T}llP)BG51m) zwS!gdKb`TQW5DlU48L<at4qI!=D9$0*wqp$jQ% z#-Wg_QXcX(aciH@7r6Wy7Of(%ab-+`tk^|Oklf5kIJkKaS2yg{#QaQ2jE00c9a7-Ns zxSm(a73qU%&Q3V}H-RUR=yu~3=6OQNc&vVQ#cAhOiuNS2H+QPG5S*&Wv0 zT%uB#n%cx9Mjv5Ht1O`?g{7V>8y}SbaNZq!euOnd3N0+5R}QV4liF=AxN(onsgS-J zrD!*BD&fisxk7wvTF~`=CCM&RB?k~XTnr z&6xU$F^JzwRzZAO^dnFj#0kDCH#k(-!+OTa<(vGlk*hQ;6nxSouac`cmJg?5OsXjh zDyHvXceFUwC|b4tg|0h^eHZmCNpmbg~KJ8(h7o;Fn#dh6^InDsOI zvr@3#j(Dnp45cHLyO5qPY%Ed%eEnb;-9uz}8Rh+1UFx#%%fsq<5r2kXRmm^4%@2=| z)L<-$9t0A~oVQQ%c7(`qcue<0*WxSkVj=Cv%3O=yzu?zpvL|wsG)d70o)Qc(cgYWN zn}a8%4->R=Z)Xx;2C65%E`*PT-pv@}qSJMkc@YtFY%b%yo~I_-?bSZ<{D+1yh!6oi z_;BSqA8WXTYvavTyR|mJOEmKf;Sn&Xg<&NLZ>0}f6I=j9qXQ{pP%&u8>A;>&?-%B$ z@7Ho=7#~NKjO-FW3L^xZ@lKka%<-m>FutW}^dc)YWJr+V&-Q}k`6FmJeC)N17Y8+2 zjrtoR7IMH!sqC?Ker^|r!VJ33tN73)o89o95UY!mgT)J84RINZ2Sd?zox!H_N`Qf+ z3sazE1OhVW%8n2m@bL?N32mF#!W`VUyeC5inMqk2_R;##`c>L(J}J>uS2G*Ml|5`a z7YnYu0gCChy!4k-zXq(2fWEeo1hf+fuO<06B-g=XdXk53CWz$xR2}iQ%lK@m-RH2| zy3}}CQ=Oamx0T~74MFn_e1>Nmqe=I8D*Uk+`d}&zdqZI1L((Uun)Uh&`&lF|qGhk3 z&$ZT$y?~36D?Vp`Mh=VtPwW&Mrp%)uG*|NrLUDM2t?+VBcu9C{Em`c?k{$UKlZHr5 zBX!KJA3fxx6ni{L6#9&_DfOUzA+y2kuQ-W`chnI4*IuU%cMoDAeMW?@yIZG;m)PKS zwbHC+Nhxk3$?SV@JxX0g&|UDJqnFWH)MdI#mJequE|ttoux@(uJ7Q4g2M=W8R0Yzc zT;+M0ejg==0omc*V>j47^)ghZgeNLyjZ4AVTmLG^af2~o#4|niOx-|U;~^#i|i><5kX}-524d5Y%&gMg-eGi$hL!^5rO8{XeP;CHNT2uFRbRJyX8T6 z83)e+A4l-Z2P*w|l_$6=BKY-{i=J0w^F5qWtz9}K_I2@cgn=ABKbJ#F%J-p9I2wdQ z5Dp%Lku$F9jI~)YT9C_rAI9PXkbGI`D$4M0USf+rigMPFX^Mm#+GVs zvR$WWTntn2EAn^{1bzvdX2^7*S6Jt*Tj8Y+0K$cOdo~l)?JSmu2DKLkaiEvl&BrRZ z<0XPOaQWsjOdK`B{q7{#5xYdKeE5`dhj8nUd(t_hS_2}ZWu8GyF+JkBkJjH8SCWo^ zChVuJIgarWoz0T6Q5e~3h#J`jJY|SJ`tdUQ4kkS*Ff&Ta{74u?&Y{2K6YomPK?fhC zSI8rHILPqF^AgB|z@Wq+l`wN;<+C2K#^?tj(hh#UjVc%;aQCX6_rXMN)GYoi_Z5-A)%pF{o z3m-(>PQ}7?S2=+1$&?25p+Ist^x&Vz%VZR?S)tn-VuHW>qsrDbqwBF^6>G^=(zl(hr3Rp&QwU=YA%N8ZI_d-1`)Q!P z4yU2nE4nc?OVLZSs?NryWrnFeVgvlL=>76bW+s|vUS{M+Arr^SjX;8ipW`@)EBZST z+Crm5uNw`sG3n+us$nyiLbuq%OqJ(6vng}l-PCR)_uODVI=ok?$T%oLyAdlZro2dwyCK<1hQ>LEEskC!l&q{O{O~A}LW!o{UBm)M$_`L%xBCu{98B!6j7k-w2io;R zBC*uHI0aS=vSq?8v!1$yK1$TrNXcW+!Rf-Pcf^J2+`@1J%#lYIgEZKPgalH41LoVf zKNB;#Y`&k!b9=AUQ~K4k6+8Pn&B9%j3Ky3#QPJTcwEPC5Bn@Y|p`X@jT#e`<#0OnH zD38D4!aUgTG~DrkP_e^S=?-bOv?pCZs~RBWH~K8aASOkx0ef6H&@|pDclma_}*@wE|jz&+SyIM@1d)LW_M58S*n2e+1aUWHK-dxrah+e$QE-uZR z8z-s}5^B|T%UfJB_&a!mY}6YU{!`F(oBKbmOID@a_{bw#M1G`uF)<2k#>r$-7O7_s z?}3c&jWL{-p7CaX$gJ}UBiP?1`^#P;j!nzY(B(VAWiqs6ZSr@>^;d=#8*=`oQjGG- zgt}!+a%*eBlQNmAku~UTKoKB0nbii2utx%sj?mc*_P8DrV|nCpr5LG9_{z-o1NL+P zE=%ASEIl^zTjDK&_45}7s`r00N}QI8U6zQA85 zt`^^1xx=%R3dW!w`sr0mBan{c+@GvLC+^-)*}Y38)MsmwPG};_3f}M*hhg!BQGmJ> zXCplB)6DXZ2;a{?VwrQB&mz1uUSrCzAm+p;-h`wCe2PJx5k^2t*k>HZ@0@-%KkrWH zNlnuc^M0Yche*!87Sa~+W4qx?j|E+VCPoJyd=kF&lpaG}Tt)B)=tt&5tHr=*Uq-A} z8z~bIEF^)4_$qwqStO*_@{qpml^04zVa_VuK2?aOlV=_+xyH~Qy5S`~mxDSam9Fpt z>b>DD;d<;P9J4b%cATFw6rPVHXpX($>1LFYLdYF|Slh4OpEW5&6nQS+{`cj@C#*B? znmpY|%mesB{`sN&^RE2!6Zz+-OxLrDx{x~9+spFLU&#VcQ=9brW2y<_Qko`htz6|{Sj9M$Y(@)ln)iqWB!r_A@c-$9(-vhqmM^6I3 zKMnjISj^qPdv^ox-DTQGU#EXXn0Yra-`&7`cLPhj8~ToC^6!rW-}g8$pT~juJPyp~ zF@sSW7qvk=Nw){4`Q&ln_b1GNRR6}Q1ky8ssXhrT-IKtao(7igX@E4I?goAjEcMgC zQa=sM|I5I9z6^y|0(|1j-DpKspl}JuF9UP_@++ols(^;#fXj~Sg*u?+sL54_ zsEDApy`IBf@kcCxQ1S(DA7GPtenge;$?TgfOV3AdDo>~?Tig{b!DIC4O&6l`x+znf zwCB}KVLAG1(QT9lrE<)m{^F`diX$2Fzt0$m0Zo!)LSJe;EIkh~itMk7v z9etYY0pUc|Y>nJctf{$YN@g?Q-y+mLM zX4NwUf>Il@pY^wx)j=${Rmd8anuj=S(C)TDwf?2JnzA!5NV*_N4A9U(50*f>uo@#5 zH;F=yL7`ru<88cqwLaetCV)P`Ap{&~X?5`}LodW_R*X$KiU-2id!Hw@s%D4?0_T}! zVs$zcTR`+h`UNSe8cPr>m&)UCJ(y@YcAj!i?E1com&)d0QA1KHTf^nHV4hcbs|!Tg zkj*{sJ>Hr!h@z;J%+ozPuqODFmy*rMuA z;aq=m>lcqfpgq^wg@{s?wF6n!!+l=1nUM0-GdnMZ3I*XJDZkU@iITzzhnDlss-#Z5 zc3PGUFjv6M&Z=y#TGGNSn?{#U;;p?YAoi~C6_nwvVhZjPJ{5L-o%Uj+D1tR${DdsW zWBo)kM-}M2xfupuPZ)hC^BBMIlgmXT9F*4bkb;pU-|kbq(LPrQg5*sk0=wzuQWln> z{MGW;NZ^aR%lDbCnye;74D30SatPw&k^9rJk6;lIAMQQ?N$fRr^lUkDU!7JkH`)+@ z23nO|M!W*a8l+rZWfTfD*7C?Xyhz1XR7YFUe39A+*fi!k$ywMXpC5phq#N~QX>I1c zq%Mi=jV7WaOwnP->6Z;+P9rYNVqEFcc|qT2+xqnDiz8H7a~Zz`4fKn{%i;KCWRz~Dx~mPwnTHc}Xi$1Q z%(WG@cNwo06D|n@MTF~@8bB9U6_61av8~Wx*)0}-<$)6H!fEo$W%{KcJn)q*>%%Dn zIp)JGP3k}4@Z?KWZC9`cvmr@UWfcIu`n=<$O^QXsir$z7<{FTnJK&bquR~;a1Fvkt znW|UVA{g7WAaSYuj%(P2lnW0s7CyXpmTnQ{rL)C2^V?(%mV*GhXDX`CP^H9wzXV_% z>SPu)a?4WjWTDiPxge#*I5plic)sTyq-CrRW!?*=W_nk#t^M-z;915w9vEq!93+yp z?XA_oZ*H+QVTJ!m)6l+-I{QG9(xWKM0nYma<<(UQxv9~|SWziA1F-xWt&or(E$|FK zEy<{FICSZHCEE#*1c4zZ4z*Wfg^s1@79kjA_ zxR7LDFXEug8UDd?oc;`9m)*QPq=$Jxfv|OZz;<6;3aJ!@H1R?C_A|M+B z-KL79$_IQ1X}HnX<@3!BLE^IM-R4`zwl;j-?5Nj+%t}+C^v6&}&TW{`08#2#qv{nK zLzsD*#O@qIB6fg9Id)DV&!LaE-pYV6;!yHP`eE^7O7Lg%retmbOh}l>cvCFNIVDd3nf)yl4`(oF}OO0nWI=c_ zZp%9{-iFv}@P3;e!W{y2RjpEtdmGCxU1F@Gx=G zGosDeT9@$9E$8Dpm0}EE ziKwJok;BuxzL3)12uK<0H%b@{79Xygn`NLIa4%+`id}Rwrh~)s=A&BY3^T1sQh{8n zxRRG!@gkhTsyHrF+A6H%XgZG`F&J*JMZqduxEsC4ygkEGbVgm{1NM>x_d=hizGtWh zIve4In<@=H|6qWcH;^Ps8R^{2;a!rJqf_K1jZ>e>Is==8zJuA$VnuSJmO5UY4tEHBrMpM}iqHDFUJko%MQhcOaQ9**nWz zC9Z@?xH2xTWGDCb95cwq_%pA9N8El8e(i>#&MA=$SG-3J z)0T@{N&A4BLGb?dXvb>F(S-J10u`5rv7uqG>=RwdC(1y+kA1*Q?lFc@c>vd2IP zu56MbeyIsOE(;-|GDLzqq}3G&G#s2CL8InZKrxaj6!zxa4AUFqE<@v(K>XV7FCn`7 xWQL1X5EP<^Q^{H