From c241cae9e304ca9675f442db1325a72da78e77cd Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 1 Jun 2022 13:54:18 +0200 Subject: [PATCH] Test cathedral level generation --- Source/gendung.h | 8 +- Source/setmaps.cpp | 6 +- test/drlg_l1_test.cpp | 138 ++++++++++++++++++++++++ test/fixtures/diablo/1-743271966.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/2-1383137027.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/3-844660068.dun | Bin 0 -> 54404 bytes test/fixtures/diablo/4-609325643.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/1-401921334.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/2-128964898.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/3-1799396623.dun | Bin 0 -> 54404 bytes test/fixtures/hellfire/4-1190318991.dun | Bin 0 -> 54404 bytes 11 files changed, 145 insertions(+), 7 deletions(-) create mode 100644 test/fixtures/diablo/1-743271966.dun create mode 100644 test/fixtures/diablo/2-1383137027.dun create mode 100644 test/fixtures/diablo/3-844660068.dun create mode 100644 test/fixtures/diablo/4-609325643.dun create mode 100644 test/fixtures/hellfire/1-401921334.dun create mode 100644 test/fixtures/hellfire/2-128964898.dun create mode 100644 test/fixtures/hellfire/3-1799396623.dun create mode 100644 test/fixtures/hellfire/4-1190318991.dun diff --git a/Source/gendung.h b/Source/gendung.h index 5ddf67524..3ac2bef82 100644 --- a/Source/gendung.h +++ b/Source/gendung.h @@ -134,7 +134,7 @@ struct ShadowStruct { }; /** Contains the tile IDs of the map. */ -extern uint8_t dungeon[DMAXX][DMAXY]; +extern DVL_API_FOR_TEST uint8_t dungeon[DMAXX][DMAXY]; /** Contains a backup of the tile IDs of the map. */ extern uint8_t pdungeon[DMAXX][DMAXY]; extern uint8_t dflags[DMAXX][DMAXY]; @@ -152,7 +152,7 @@ extern std::unique_ptr pSetPiece; extern bool setloadflag; extern std::optional pSpecialCels; /** Specifies the tile definitions of the active dungeon type; (e.g. levels/l1data/l1.til). */ -extern std::unique_ptr pMegaTiles; +extern DVL_API_FOR_TEST std::unique_ptr pMegaTiles; extern std::unique_ptr pLevelPieces; extern std::unique_ptr pDungeonCels; /** @@ -190,7 +190,7 @@ extern _setlevels setlvlnum; /** Specifies the player viewpoint X-coordinate of the map. */ extern dungeon_type setlvltype; /** Specifies the player viewpoint X,Y-coordinates of the map. */ -extern Point ViewPosition; +extern DVL_API_FOR_TEST Point ViewPosition; extern ScrollStruct ScrollInfo; extern int MicroTileLen; extern char TransVal; @@ -201,7 +201,7 @@ extern DVL_API_FOR_TEST int dPiece[MAXDUNX][MAXDUNY]; /** Specifies the dungeon piece information for a given coordinate and block number. */ extern MICROS dpiece_defs_map_2[MAXDUNX][MAXDUNY]; /** Specifies the transparency at each coordinate of the map. */ -extern int8_t dTransVal[MAXDUNX][MAXDUNY]; +extern DVL_API_FOR_TEST int8_t dTransVal[MAXDUNX][MAXDUNY]; extern DVL_API_FOR_TEST char dLight[MAXDUNX][MAXDUNY]; extern char dPreLight[MAXDUNX][MAXDUNY]; /** Holds various information about dungeon tiles, @see DungeonFlag */ diff --git a/Source/setmaps.cpp b/Source/setmaps.cpp index a7726866f..21f388d66 100644 --- a/Source/setmaps.cpp +++ b/Source/setmaps.cpp @@ -129,12 +129,12 @@ void SetMapTransparency(const char *path) width *= 2; height *= 2; - const uint16_t *transparantLayer = &dunData[layer2Offset + width * height * 3]; + const uint16_t *transparentLayer = &dunData[layer2Offset + width * height * 3]; for (int j = 0; j < height; j++) { for (int i = 0; i < width; i++) { - dTransVal[16 + i][16 + j] = SDL_SwapLE16(*transparantLayer); - transparantLayer++; + dTransVal[16 + i][16 + j] = SDL_SwapLE16(*transparentLayer); + transparentLayer++; } } } diff --git a/test/drlg_l1_test.cpp b/test/drlg_l1_test.cpp index 2a094b96b..c34b4a9e7 100644 --- a/test/drlg_l1_test.cpp +++ b/test/drlg_l1_test.cpp @@ -1,11 +1,18 @@ +#include #include #include "diablo.h" #include "drlg_l1.h" +#include "engine/load_file.hpp" #include "lighting.h" +#include "player.h" +#include "quests.h" +#include "utils/paths.h" using namespace devilution; +namespace { + TEST(Drlg_l1, DRLG_Init_Globals_noflag) { DisableLighting = false; @@ -19,3 +26,134 @@ TEST(Drlg_l1, DRLG_Init_Globals) DRLG_Init_Globals(); EXPECT_EQ(dLight[0][0], 0); } + +void TestCreateL5Dungeon(bool hellfire, int level, uint32_t seed, lvl_entry entry) +{ + pMegaTiles = std::make_unique(1648); + + MyPlayer->pOriginalCathedral = !hellfire; + + currlevel = level; + leveltype = DTYPE_CATHEDRAL; + + CreateL5Dungeon(seed, entry); + + std::string path = paths::BasePath(); + + paths::SetPrefPath(path); + std::string dunPath; + if (hellfire) + dunPath = fmt::format("../test/fixtures/hellfire/{}-{}.dun", level, seed); + else + dunPath = fmt::format("../test/fixtures/diablo/{}-{}.dun", level, seed); + auto dunData = LoadFileInMem(dunPath.c_str()); + ASSERT_EQ(DMAXX, dunData[0]); + ASSERT_EQ(DMAXY, dunData[1]); + + const uint16_t *tileLayer = &dunData[2]; + + for (int y = 0; y < DMAXY; y++) { + for (int x = 0; x < DMAXX; x++) { + auto tileId = static_cast(SDL_SwapLE16(*tileLayer)); + tileLayer++; + ASSERT_EQ(dungeon[x][y], tileId); + } + } + + const uint16_t *transparentLayer = &dunData[2 + DMAXX * DMAXY * 13]; + + for (int y = 16; y < 16 + DMAXY * 2; y++) { + for (int x = 16; x < 16 + DMAXX * 2; x++) { + auto sectorId = static_cast(SDL_SwapLE16(*transparentLayer)); + transparentLayer++; + ASSERT_EQ(dTransVal[x][y], sectorId) << "Room/region indexes don't match"; + } + } +} + +TEST(Drlg_l1, CreateL5Dungeon_diablo_1_743271966) +{ + TestCreateL5Dungeon(false, 1, 743271966, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 51); + EXPECT_EQ(ViewPosition.y, 82); + TestCreateL5Dungeon(false, 1, 743271966, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 81); + EXPECT_EQ(ViewPosition.y, 47); +} + +TEST(Drlg_l1, CreateL5Dungeon_diablo_2_1383137027) +{ + Quests[Q_PWATER]._qlevel = 2; + Quests[Q_PWATER]._qactive = QUEST_INIT; + + TestCreateL5Dungeon(false, 2, 1383137027, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 57); + EXPECT_EQ(ViewPosition.y, 74); + TestCreateL5Dungeon(false, 2, 1383137027, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 57); + EXPECT_EQ(ViewPosition.y, 79); +} + +TEST(Drlg_l1, CreateL5Dungeon_diablo_3_844660068) +{ + TestCreateL5Dungeon(false, 3, 844660068, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 67); + EXPECT_EQ(ViewPosition.y, 52); + TestCreateL5Dungeon(false, 3, 844660068, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 85); + EXPECT_EQ(ViewPosition.y, 45); +} + +TEST(Drlg_l1, CreateL5Dungeon_diablo_4_609325643) +{ + TestCreateL5Dungeon(false, 4, 609325643, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 85); + EXPECT_EQ(ViewPosition.y, 78); + TestCreateL5Dungeon(false, 4, 609325643, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 55); + EXPECT_EQ(ViewPosition.y, 47); +} + +TEST(Drlg_l1, CreateL5Dungeon_hellfire_1_401921334) +{ + TestCreateL5Dungeon(true, 1, 401921334, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 79); + EXPECT_EQ(ViewPosition.y, 80); + TestCreateL5Dungeon(true, 1, 401921334, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 49); + EXPECT_EQ(ViewPosition.y, 63); +} + +TEST(Drlg_l1, CreateL5Dungeon_hellfire_2_128964898) +{ + Quests[Q_PWATER]._qactive = QUEST_NOTAVAIL; + + TestCreateL5Dungeon(true, 2, 128964898, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 55); + EXPECT_EQ(ViewPosition.y, 68); + TestCreateL5Dungeon(true, 2, 128964898, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 49); + EXPECT_EQ(ViewPosition.y, 63); +} + +TEST(Drlg_l1, CreateL5Dungeon_hellfire_3_1799396623) +{ + TestCreateL5Dungeon(true, 3, 1799396623, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 59); + EXPECT_EQ(ViewPosition.y, 68); + TestCreateL5Dungeon(true, 3, 1799396623, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 47); + EXPECT_EQ(ViewPosition.y, 55); +} + +TEST(Drlg_l1, CreateL5Dungeon_hellfire_4_1190318991) +{ + TestCreateL5Dungeon(true, 4, 1190318991, ENTRY_MAIN); + EXPECT_EQ(ViewPosition.x, 67); + EXPECT_EQ(ViewPosition.y, 80); + TestCreateL5Dungeon(true, 4, 1190318991, ENTRY_PREV); + EXPECT_EQ(ViewPosition.x, 77); + EXPECT_EQ(ViewPosition.y, 45); +} + +} // namespace diff --git a/test/fixtures/diablo/1-743271966.dun b/test/fixtures/diablo/1-743271966.dun new file mode 100644 index 0000000000000000000000000000000000000000..fa943b67dc115018c1a256af45b6b0e880ac926c GIT binary patch literal 54404 zcmeI5TaOe)6vxlPvasR^;su0P9{2)2c)z}ynD_}4Np{yDYJ!C5CSt z2+{B4`BzPCUAnrvs;6(WoaxMV-Of4x^Q%)mvzV;c=o-B)*OC%grQ39ZF1DurYnspl zda|IuRo3*F{$(#Kbin>z;y!v!uN9iky{xI$Svn-dXqx%YG-H2fIoB1H?^*hd&U0&$ zoVkt;1wZh6jV%uye|MFyO^&ikU-4DGKibdrdGwjGn{sc)icZrr_Nib6~3Obu9tZYvffgWkV%Xt__&@X?D3E`mFKCW1MBYb`@UK~ zdAP)^XE9gZZSvja{sTJ2+5Smq zSd}|B;d~~ZK7BqWOcv^Q*f+9=Hsq%B#S;)atDg|qC#*$9Z}EF4@Mo(GnZh4@A#a`Q zj4h`}^#{JXQg&4|cy;q#QDi_z`k*{Aesa6WGE+D)!zU7z=rBCOwZPCO{=tKHb+ z{Bg?QH~!qh+L_{pRXZyFwxVWE{0a3eL5CfN=6%JJWJ8?> zQ=M96(I4h92X#7wRr-KFq>q>c7~te!&$S;^s(Tgv+1Y({BEbDVeL|nI4^0no_PDK| z(O2jy@AB3875e*+t{lyxc2S+TxYCd()Ed`=np%IPc!U@nY+pBwppX$ z0H2#jwX3T}@7~tYsQqT6u|6*Fe^L1je?vW7FfoO6V*@J+36=G31gr1`0krms4KmevkO?#iYM-)~0*4 zD~qhUj%Z`I-NKnI=F@f*_**_kzT%;t&iFfDb+7srbsl712s{r2hC0QDZTPun#`S%u zPycFFzDD$h(pgmEj^t+H+V;~Pze2;IFQwzGBtxOe-T&6m#6!M~{>`iITflI?pAG%g zttUDhn=);wCveykl(VyS^;t%u$@s8TwBodUbCp(AYFfl5JnL<$bk$pTzapnnt(w$R zXf2kd<Vw%lU` z%4;^Z+8+yd13R0(BSURVC$5kmh;S>FHuVy>h#VZhdyI zW6`Qf-B(>T-REQ34b{Sva8at|+RIN^xs5y1?hdr;ZE>Al=;^|zo9QyO?WcS*D$T46 zp+#%o`0?+HY4Uw_)iWB+y{kA){Tf~7-qcSQc1DxFn_d@@+VD9>ePh(r25a#l1cZPP z5CTF#2nYcoAOwWKauWEFejK&%JEK-dG$0zcHz;j68i<+E2ubG$WI04}n=OUxW ziNNiVC)1w3_B?fiZ0!2F$y&TF1A)($LFBQ}D5MwJ#&+n9{Yeac-Dqs@J8xWHd~}f= zZ`XG0`r6I5skbspWBJ#=xV}3h|JO+xy}qXPGFH2GJ}u(e#cMFWwx3Zy+wtk^hr;t0 zWo$eBX0QcS`Y=~DAGqqhJ9d4&16iVg{_}7+;fvIFA2}?dZ#b$t^4PWK=o`zo>+(Gv z&wu|f<2n|GW%|n59`~7jPSCt_bM5*mcsEzj0P77q+~t)^z@;YybLq)?As_^VfDjM@ zLO=)zf$~ zs4h=m%)U70>d5o&S}xiy>WYsn8mGB^Tu*Tn5t?(fmbR6qxu~RSB+X}WmFu%OTQ%ZZ z7Tc~RX5D^HdzI{!V^?>UeP5!_=Yd}J%UwVI{dLv$)lTQvmm)uo=<|8x_Tv0z!; z^nvXu=gMQ<4?oeDw=3c5vGb#&`pf-}(NF!kQ9`!Web>^qt8Mz6wVK>kp9-pDxvJbY ztccc}>olcbewF#XYCYj^Ij*K+yQ#j@fvY-A{(N9u(LJvE!jyeJ)xFTRs^6Snu~reM zI2s?R(&WyysSh<7R}&j`Rg|~u^y!GHaZ}epZ`!L)pYanT5RM^YI9A@T)>m#9&S*d3 z=;Hn3ug}z;PcUZ>t0=d@FYco%YWiH%~&Dts<+~h>aGTjg8p|)%wo33rpJT z{Qt-cFJF=0i|KL4!Z20*n(A8*g1GVP+rF{r%iG_u=7;82RPXO^^$7{r7W?7Z(0zYh kb8Bwx2?$cm!{9R>9-eC*slVKwkU!B0X?zMa{vGU literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/2-1383137027.dun b/test/fixtures/diablo/2-1383137027.dun new file mode 100644 index 0000000000000000000000000000000000000000..263f312cc7e24be6e5d96caf7243a6e18ee25a5b GIT binary patch literal 54404 zcmeHQ+m0N!5v`F{ca5}?9NSVJlNkPiJUI8;YXApMKESaIXoVaSi>c|n`ENH>XGJ1Ab=Qo6|lW(aX;G zEN|QFK@b9$p!<@(wct^-a@d?KY=KI+dqwA2cF3PE=^K3Bq31N=u_sxxpU_`SgD=7N zlC1?R{Oxf68ErEI(=2~)(=mOWzDalJYjlg-F}*==o9lVz?>0w4&Znm3viUh{&l=Gu zX1FT1{OmFedvCaPA@gAR_(S?(239n~N{$#Jg zSu!bO+Z=mJkJ%Ph82cmNAJS99DeCGzH@iwFtO+I#SRZZbjs1@AcMOU>`ZIlD#!z99 zBL+snE#`bg*ErVS>59>WC*Xf-&TdSsUBR`4`6H3nQJ;YTr((5dN^T?M?>| z^TpgAv-CdSKjEEkpR*+#LIZQ(GkT9%1IS?o{yygZ+~D5h^Pai;x2deZ8ul(Po@q z%=;dHj_5OE`H;^T!3Srlmxo5<3ZEf`9F;3Nz=!!BEJiR6Hn8(y50QJR2(g);jEM*F zxwo)`KcIqi$1p2sW%W#$PvisqLyn4=E><=2XmQWX%EH)9-g%GBj`9)jCwI)6d1ZEF ztW~$)*?muTYdZ!@u{pCq{f2q^Nh}}%d$JN`oo>;m{BBU)d$DpqT70&7R@k?y&-sa| zC-8_l>@fpanb?64Nmlbu2>UD=R`uL?fxfKadq!Kvp@G`G&tqVIpFiLi{yt_Ip1D7y zAJLBu8*j0;tp90r|C9NGPehdL$P7?Tc&1J1r}Q(90<4ztJG@KU{cpF14?e&ha*0f$ z(tz(S_wmgA0li1x;i{6|#MZr(ekM`(o8ep$`R^sT|;p5Vm=B&$D&#(1xx*rqsOBQPa=n5TaGr_4V4i3B}BpEsL)H6u&v@TSxvp zon{sBnESF|=n^rdo2p?q+rB+{f2?xV#n-UtERz2CtcPyb^xn|T*AUwM@ue!wB6WM8 z>)El~Yk!0}5gabp%dyMV3GJ3+*I+KzG4z(3JNAfv-&>3^H;n-XhF!0Y}cT!8xp}P8$O`?_uzftJfA!$LkENYQ1#d>*`4K-e+LB zcTL~ZQ2p`|E<1BPHHUa2JLX)k57r^DSscqD6E8#YXEExvI|HTX1T{TmU3X`!YB9`? zP>rE?%78NPx-hU?^h5;R?~BFw2ZO9!e8m#Calqc+IK=A#{PXpMJrz+)-)Bn4cPffR zCpkI;Pe+fKAMmq$)wOAs%-`Bb$qo$ml)-GeRMBIg{}cO`=ViEVe|&!$4peW?{%pqK zuNzb!UpLFwN4xy*LrO-tOY)7#SoJXWzsmJrw_{~i8<rPiOFHt4d1tIsKzxF!z$3$a8;C!vUGf5R#m#$4BVnGsKjr`b672X#dO8z@2lnHrRywm zGPg>d(($cwt}$Ql(1qBL%9VkQWZ<3RQ4jNL8^ups0V)H^K$L+A<+rGl0SEHYL38{= z@h!)>@~8aS8d#2rJZl@P&lSIh8f$sc+qL@OvNkbnB5#kKqhVvEuJ98YF9jc-6N)dK z?GP_b+4}gC$V6wo)0)8=P%1 zosj$@xfU9a%M>5DaqL~}l&{wJ(=zd~{NO-Rgo)80==(_4(_+0j8?DIp*E~n`0?S z_xadJDX+~jYt=no(^pE;KaRCbd2f!v3R0pgiRNZ)qgcD9$FL-1M|3sNTr9z5Ez|g{ z)@rXId{-kOQuyj)*2R=uv$D`Nj3Xuuc}VBCj_=CCg+qs4{D>h5%fo(}7*Z1Pu}SzG z;^zFrJjJ9nr$!-GbPgc zc$GDG7iJIA?uW%D*EBx7$N2aiqH0g^`7HVUGWZKsiK{?|(a)-T0u%oqbRflJK?7dU$+pcMBoR!x!5DtJePqC9Osz literal 0 HcmV?d00001 diff --git a/test/fixtures/diablo/3-844660068.dun b/test/fixtures/diablo/3-844660068.dun new file mode 100644 index 0000000000000000000000000000000000000000..817fa52fc7d891d26d1aca829212f30fb5bd13fa GIT binary patch literal 54404 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/hellfire/1-401921334.dun b/test/fixtures/hellfire/1-401921334.dun new file mode 100644 index 0000000000000000000000000000000000000000..0b3c3e611a30ed05f63aabd873fe79017b80ea6d GIT binary patch literal 54404 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/hellfire/3-1799396623.dun b/test/fixtures/hellfire/3-1799396623.dun new file mode 100644 index 0000000000000000000000000000000000000000..5f320c4e151123bc38e43d922c2e2c534e40f51c GIT binary patch literal 54404 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 PiKBimi?DuH^O64pf;+a? literal 0 HcmV?d00001 diff --git a/test/fixtures/hellfire/4-1190318991.dun b/test/fixtures/hellfire/4-1190318991.dun new file mode 100644 index 0000000000000000000000000000000000000000..90c13b3537e17413deeab4248efc1d86f5202794 GIT binary patch literal 54404 zcmeHQ>24gy5w4{u$+EOEMOmUv{R(0Set`tYef|v)AWsn33P|R#qgV=JSV$B=2Sr&i zk@GkAVI&CfJEgv^t?izf?m2shBc`^&o$jvd>#wW2cLh-VfIgs2`YmnHhy1fcH&<rR+oc#EmfH+ns`i+I~)RI-$q>v%T_mlWx-i&p?9r1-~z7pMRw7^BAMhLjB!l z*&fU0^dj&#W+ zUvpmlHhs+f$Bv~f?ty3F7+$yOE4szpyhj(D?8G5Ov@Z*6W4-&%@&y6=OV$UX`}~7> zSimz_K74!`q%9C zPeF=mxWWw;fhKr><0JY3eVe{R57_$yj;#5BYSZ>d?uD@+lN@`%%!4JV5Ja8P_vyRz zJ^CB{)%^e~b{^RRjvjL^$r+$Ea+5x1A2>%2oQ3c&^#gyB0kFntq51L~9?6~~H_O4 zRQ6}qU9b%6Jzjc5HKNkzoKtVH6z|BS=XA-je~w3wm$Q(;R%G|+oWp_H6Q_Z?J8=G< zGH#sD;6v*NUa>l<6v;%?3vv%ntWI=9OU9@-8-ojHGJ4j%Gak69v& zz^}>>`@~sb)uBIl@VKFOMCWV#xNFt3C*1@DAC-r8STP-^0~@41~ zUb%;a51Cy!8P+XQ&w=c(XGC-sd^_kFhZy1uCjyvLnRvlF7+dg}C;0Sc#5}CQi`-m# zc5C%MV@XJ z8BS-d^-o=`dgM5B{AnV3xI=`ixvPI7WhGeS0dw{NZfB(*D|H19$(b7VE zJ>~sJwIjcuxjGa~dSjlrT?#*~;8xyZZB+U-=NG2|8gBSa`u%c*PZ4q&%1MY%2Q#i| ze1-^5dbtTCr({*gJ|MzLh4TWR6kxO9(Sm-$cftND15ne*34e1yM^5(3tcQ&KHNQ*c zofK|}myGs@^dtH)BYxlEm)i=u-XF38`+?IOxAY?Lq1mB3cbixDQ~DXl#65!5U^d`t|DA7G@JY=KD|#h?Mf5m{4Nb%)5O+o zjki|nyQ^M(XQy7=AO&a2n?CDIZt-ux>uZ;P2e9}Gr6K{k90&zx8-yNF865@Ky_WS( zp8@>tZFRR!AD1FP-ub-O+3rvHXy>OJ8(^=SMGAX+geebW%(vrk3?#2xjNO5!aohFw zJM$%n``MXA=W@ z3RXY!H(8D;KP`0K@~NBlnEY9+?hNFhr)TKS0E98Wx#xh7n8Q4)&W#TK1R*f$Yiz8# zmm0tP6b3_tWsP-?fvySRI^#F{&X3OL0-|e%G$ToAOpTRua&2lb3YVo zUu3BF95wIb3v0^VP<(auq! zjLq>G81~tGe7qLX7%&Em0b{@zFb4jg8TeMl#pm<|Sf6FYme=OB?_rZR z0j_-5(sBAoLR?|Lk1w-1TMXQt_;SX>_l=1&F(r6;&(0~W%&-UpzgRmF>(8M-t$hu{ z0^A#BzE*2sn=-!m;``*(^|-6G&(>iLtM4ysM=~tHY4O*Dx{lu_Taz0D#(*(k48$0) zlQqVQ&W-ntRU>wLP90x$HB(1C4!)^>8t?LLE8hvyp8I>J@_nW~zG~hNotbvVU_YjX zaE!egvgY;T!(L2lKg#((guAk@;`o=VVff8^y?n1i_U^R7*G8v3fV|!iH?PNB-kRzl zSDg0DhnmeN=jq}D)+PqS^;q8+Fb0ePWnlVe2TtHF-*3<@?57 zzbccS9R|L6c9t^Pm5h4|bf-b_h2N{Ydoc@Rz!)$Fi~(c77|6@OjH)daVT1CuRE+X` z6&+^cuYBm>sol%)rC2xqQp~iQZ^s|B&IOHJJ;!b9;=*DxXtb(zqVquu=i^bTvqgMW zxz5z#Lp>JpsZ|l*c|YB%7h*&ILZqpqF8CBHY(xGO-$iO}ux*3y0u=ex2j3>!^~HCQ zZM)#BM_Aln@Tdl;)6}>6~kB73!^vp#kwoL7>?B3C6cB%n=yqN zz4ASZ*NpaI=Uilk_PjMEXS}SdEq;wRYdT!<{)KIJVGbcXa#4C*6 z+>hhZ+1&Vmuo+XRp-58CGQ!jyo7&yYW%c@9E=CVWv3?3ydOnRLE>UFiEb^C*(q9rs zk)Ex?7h?=_LtbelaY-M1`4ATOtIUUFYlyI3-`fviuxRUjR(nNF8CA8aGof8onw~ig zyEK}Z#3PJJ({ugp(mrF7{&CbY<~2RnHebbq#=tY}vnuIphdQo$OV7MXzNNLQlFQ^< zRa!S=_`r^5?{cU8I&1q|mnrL!b<4l?V5swI`0ChcmKlG|9Mx%b