From b81cd1254ddc430120c64b1ddcc95e0537f32789 Mon Sep 17 00:00:00 2001 From: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> Date: Fri, 14 Jul 2023 15:58:59 +0800 Subject: Add rooms data saving and update reading to nio --- .../skyblock/dungeon/secrets/DungeonSecrets.java | 104 ++--- .../dungeons/catacombs/1x1/Admin-0.skeleton | Bin 0 -> 54016 bytes .../dungeons/catacombs/1x1/Andesite-2.skeleton | Bin 0 -> 60071 bytes .../dungeons/catacombs/1x1/Arrow-Trap-1.skeleton | 3 + .../dungeons/catacombs/1x1/Banners-1.skeleton | 1 + .../dungeons/catacombs/1x1/Basement-1.skeleton | 1 + .../dungeons/catacombs/1x1/Beams-2.skeleton | Bin 0 -> 40812 bytes .../dungeons/catacombs/1x1/Big-Red-Flag-2.skeleton | Bin 0 -> 54393 bytes .../dungeons/catacombs/1x1/Black-Flag-3.skeleton | Bin 0 -> 73609 bytes .../dungeons/catacombs/1x1/Blue-Skulls-1.skeleton | 61 +++ .../dungeons/catacombs/1x1/Cage-1.skeleton | 3 + .../dungeons/catacombs/1x1/Cages-2.skeleton | Bin 0 -> 79289 bytes .../dungeons/catacombs/1x1/Carpets-1.skeleton | 42 ++ .../dungeons/catacombs/1x1/Cell-1.skeleton | 4 + .../dungeons/catacombs/1x1/Chains-2.skeleton | 101 +++++ .../catacombs/1x1/Cobble-Wall-Pillar-2.skeleton | 17 + .../dungeons/catacombs/1x1/Dip-2.skeleton | Bin 0 -> 52231 bytes .../dungeons/catacombs/1x1/Dome-2.skeleton | Bin 0 -> 67944 bytes .../catacombs/1x1/Double-Diamond-3.skeleton | Bin 0 -> 59887 bytes .../dungeons/catacombs/1x1/Drop-2.skeleton | 55 +++ .../dungeons/catacombs/1x1/Dueces-3.skeleton | Bin 0 -> 73824 bytes .../dungeons/catacombs/1x1/Duncan-1.skeleton | Bin 0 -> 50596 bytes .../dungeons/catacombs/1x1/End-2.skeleton | Bin 0 -> 58841 bytes .../dungeons/catacombs/1x1/Golden-Oasis-1.skeleton | 3 + .../dungeons/catacombs/1x1/Granite-2.skeleton | Bin 0 -> 63175 bytes .../dungeons/catacombs/1x1/Hall-0.skeleton | 3 + .../catacombs/1x1/Hanging-Vines-1.skeleton | Bin 0 -> 50358 bytes .../catacombs/1x1/Jumping-Skulls-1.skeleton | Bin 0 -> 65927 bytes .../dungeons/catacombs/1x1/Knight-3.skeleton | Bin 0 -> 56966 bytes .../dungeons/catacombs/1x1/Lava-Pool-3.skeleton | Bin 0 -> 56989 bytes .../dungeons/catacombs/1x1/Leaves-1.skeleton | 39 ++ .../dungeons/catacombs/1x1/Locked-Away-1.skeleton | 2 + .../dungeons/catacombs/1x1/Logs-4.skeleton | 3 + .../dungeons/catacombs/1x1/Long-Hall-3.skeleton | Bin 0 -> 69349 bytes .../catacombs/1x1/Lots-Of-Floors-3.skeleton | 109 +++++ .../catacombs/1x1/Mini-Rail-Track-3.skeleton | Bin 0 -> 49753 bytes .../dungeons/catacombs/1x1/Mirror-1.skeleton | 32 ++ .../dungeons/catacombs/1x1/Multicolored-1.skeleton | 3 + .../dungeons/catacombs/1x1/Mural-1.skeleton | 145 ++++++ .../dungeons/catacombs/1x1/Mushroom-1.skeleton | Bin 0 -> 57976 bytes .../dungeons/catacombs/1x1/Overgrown-3.skeleton | 84 ++++ .../catacombs/1x1/Overgrown-Chains-2.skeleton | 114 +++++ .../dungeons/catacombs/1x1/Painting-2.skeleton | 23 + .../dungeons/catacombs/1x1/Perch-2.skeleton | Bin 0 -> 67789 bytes .../dungeons/catacombs/1x1/Pillars-1.skeleton | Bin 0 -> 46942 bytes .../dungeons/catacombs/1x1/Prison-Cell-1.skeleton | Bin 0 -> 60737 bytes .../dungeons/catacombs/1x1/Quad-Lava-2.skeleton | Bin 0 -> 60820 bytes .../dungeons/catacombs/1x1/Raccoon-4.skeleton | 218 +++++++++ .../dungeons/catacombs/1x1/Red-Green-3.skeleton | Bin 0 -> 69223 bytes .../dungeons/catacombs/1x1/Redstone-Key-3.skeleton | Bin 0 -> 66524 bytes .../dungeons/catacombs/1x1/Sand-Dragon-1.skeleton | Bin 0 -> 43279 bytes .../dungeons/catacombs/1x1/Sarcophagus-3.skeleton | 3 + .../dungeons/catacombs/1x1/Scaffolding-2.skeleton | 133 ++++++ .../catacombs/1x1/Silvers-Sword-1.skeleton | 149 +++++++ .../dungeons/catacombs/1x1/Slabs-2.skeleton | 80 ++++ .../dungeons/catacombs/1x1/Sloth-1.skeleton | Bin 0 -> 57924 bytes .../dungeons/catacombs/1x1/Small-Stairs-2.skeleton | Bin 0 -> 52757 bytes .../dungeons/catacombs/1x1/Spikes-3.skeleton | Bin 0 -> 60850 bytes .../dungeons/catacombs/1x1/Steps-1.skeleton | 3 + .../dungeons/catacombs/1x1/Stone-Window-2.skeleton | 89 ++++ .../dungeons/catacombs/1x1/Temple-3.skeleton | Bin 0 -> 66367 bytes .../dungeons/catacombs/1x1/Tombstone-2.skeleton | Bin 0 -> 54558 bytes .../dungeons/catacombs/1x1/Tomioka-0.skeleton | 3 + .../dungeons/catacombs/1x1/Water-2.skeleton | Bin 0 -> 65555 bytes .../dungeons/catacombs/1x1/Waterfall-2.skeleton | Bin 0 -> 54937 bytes .../dungeons/catacombs/1x2/Archway-3.skeleton | 44 ++ .../dungeons/catacombs/1x2/Balcony-4.skeleton | Bin 0 -> 185339 bytes .../dungeons/catacombs/1x2/Bridges-6.skeleton | Bin 0 -> 183319 bytes .../dungeons/catacombs/1x2/Crypt-5.skeleton | Bin 0 -> 125018 bytes .../dungeons/catacombs/1x2/Doors-5.skeleton | Bin 0 -> 130184 bytes .../dungeons/catacombs/1x2/Gold-1.skeleton | 48 ++ .../catacombs/1x2/Grand-Library-4.skeleton | Bin 0 -> 122338 bytes .../dungeons/catacombs/1x2/Grass-Ruin-3.skeleton | Bin 0 -> 175744 bytes .../dungeons/catacombs/1x2/Mage-4.skeleton | 97 ++++ .../dungeons/catacombs/1x2/Pedestal-5.skeleton | 240 ++++++++++ .../catacombs/1x2/Pressure-Plates-6.skeleton | 137 ++++++ .../dungeons/catacombs/1x2/Purple-Flags-5.skeleton | Bin 0 -> 168083 bytes .../catacombs/1x2/Redstone-Warrior-3.skeleton | Bin 0 -> 156903 bytes .../dungeons/catacombs/1x2/Skull-2.skeleton | 12 + .../dungeons/catacombs/1x3/Catwalk-6.skeleton | 492 +++++++++++++++++++++ .../dungeons/catacombs/1x3/Deathmite-6.skeleton | Bin 0 -> 180745 bytes .../dungeons/catacombs/1x3/Diagonal-4.skeleton | 25 ++ .../dungeons/catacombs/1x3/Gravel-6.skeleton | 34 ++ .../dungeons/catacombs/1x3/Red-Blue-4.skeleton | Bin 0 -> 101936 bytes .../dungeons/catacombs/1x3/Wizard-4.skeleton | Bin 0 -> 182969 bytes .../dungeons/catacombs/1x4/Hallway-3.skeleton | 351 +++++++++++++++ .../dungeons/catacombs/1x4/Mossy-4.skeleton | Bin 0 -> 168322 bytes .../dungeons/catacombs/1x4/Pit-5.skeleton | Bin 0 -> 227109 bytes .../catacombs/1x4/Quartz-Knight-7.skeleton | 248 +++++++++++ .../dungeons/catacombs/1x4/Waterfall-8.skeleton | Bin 0 -> 320732 bytes .../dungeons/catacombs/2x2/Atlas-6.skeleton | 125 ++++++ .../dungeons/catacombs/2x2/Buttons-5.skeleton | Bin 0 -> 271044 bytes .../dungeons/catacombs/2x2/Cathedral-8.skeleton | Bin 0 -> 235514 bytes .../dungeons/catacombs/2x2/Flags-7.skeleton | 271 ++++++++++++ .../catacombs/2x2/Mithril-Cave-10.skeleton | Bin 0 -> 475695 bytes .../dungeons/catacombs/2x2/Museum-5.skeleton | Bin 0 -> 315072 bytes .../dungeons/catacombs/2x2/Rail-Track-9.skeleton | 133 ++++++ .../dungeons/catacombs/2x2/Stairs-4.skeleton | 222 ++++++++++ .../dungeons/catacombs/2x2/Super-Tall-6.skeleton | Bin 0 -> 593719 bytes .../dungeons/catacombs/L-shape/Chambers-5.skeleton | Bin 0 -> 188127 bytes .../catacombs/L-shape/Dino-Dig-Site-4.skeleton | Bin 0 -> 239108 bytes .../catacombs/L-shape/Lava-Ravine-6.skeleton | Bin 0 -> 302614 bytes .../dungeons/catacombs/L-shape/Layers-8.skeleton | Bin 0 -> 175879 bytes .../dungeons/catacombs/L-shape/Market-5.skeleton | 181 ++++++++ .../dungeons/catacombs/L-shape/Melon-7.skeleton | 134 ++++++ .../dungeons/catacombs/L-shape/Spider-9.skeleton | Bin 0 -> 320358 bytes .../dungeons/catacombs/L-shape/Well-7.skeleton | Bin 0 -> 284551 bytes .../catacombs/L-shape/Withermancers-4.skeleton | Bin 0 -> 240571 bytes .../catacombs/Puzzle/Blaze-Room-1-High.skeleton | Bin 0 -> 90873 bytes .../catacombs/Puzzle/Blaze-Room-1-Low.skeleton | Bin 0 -> 91661 bytes .../dungeons/catacombs/Puzzle/Boxes-Room.skeleton | Bin 0 -> 55570 bytes .../catacombs/Puzzle/Creeper-Room.skeleton | Bin 0 -> 66692 bytes .../dungeons/catacombs/Puzzle/Defusal.skeleton | Bin 0 -> 60485 bytes .../dungeons/catacombs/Puzzle/Ice-Path.skeleton | Bin 0 -> 56698 bytes .../catacombs/Puzzle/Ice-Silverfish-Room.skeleton | Bin 0 -> 62071 bytes .../catacombs/Puzzle/Teleport-Pad-Room.skeleton | Bin 0 -> 61237 bytes .../catacombs/Puzzle/Three-Chests.skeleton | 2 + .../catacombs/Puzzle/Tic-Tac-Toe-1.skeleton | 4 + .../dungeons/catacombs/Puzzle/Trivia-Room.skeleton | 61 +++ .../catacombs/Puzzle/Water Puzzle.skeleton | Bin 0 -> 68504 bytes .../dungeons/catacombs/Trap/Trap-Hard-4.skeleton | Bin 0 -> 56218 bytes .../catacombs/Trap/Trap-Very-Hard-3.skeleton | Bin 0 -> 59774 bytes .../skyblock/dungeon/secrets/DungeonRoomsDFU.java | 137 +++--- 123 files changed, 4528 insertions(+), 100 deletions(-) create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Admin-0.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Andesite-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Arrow-Trap-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Banners-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Basement-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Beams-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Big-Red-Flag-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Black-Flag-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Blue-Skulls-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Cage-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Cages-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Carpets-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Cell-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Chains-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Cobble-Wall-Pillar-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Dip-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Dome-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Double-Diamond-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Drop-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Dueces-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Duncan-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/End-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Golden-Oasis-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Granite-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Hall-0.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Hanging-Vines-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Jumping-Skulls-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Knight-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Lava-Pool-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Leaves-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Locked-Away-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Logs-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Long-Hall-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Lots-Of-Floors-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Mini-Rail-Track-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Mirror-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Multicolored-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Mural-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Mushroom-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Overgrown-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Overgrown-Chains-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Painting-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Perch-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Pillars-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Prison-Cell-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Quad-Lava-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Raccoon-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Red-Green-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Redstone-Key-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Sand-Dragon-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Sarcophagus-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Scaffolding-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Silvers-Sword-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Slabs-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Sloth-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Small-Stairs-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Spikes-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Steps-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Stone-Window-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Temple-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Tombstone-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Tomioka-0.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Water-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Waterfall-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Archway-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Balcony-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Bridges-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Crypt-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Doors-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Gold-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Grand-Library-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Grass-Ruin-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Mage-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Pedestal-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Pressure-Plates-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Purple-Flags-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Redstone-Warrior-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x2/Skull-2.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x3/Catwalk-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x3/Deathmite-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x3/Diagonal-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x3/Gravel-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x3/Red-Blue-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x3/Wizard-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x4/Hallway-3.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x4/Mossy-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x4/Pit-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x4/Quartz-Knight-7.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/1x4/Waterfall-8.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Atlas-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Buttons-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Cathedral-8.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Flags-7.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Mithril-Cave-10.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Museum-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Rail-Track-9.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Stairs-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/2x2/Super-Tall-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Chambers-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Dino-Dig-Site-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Lava-Ravine-6.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Layers-8.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Market-5.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Melon-7.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Spider-9.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Well-7.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/L-shape/Withermancers-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Blaze-Room-1-High.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Blaze-Room-1-Low.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Boxes-Room.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Creeper-Room.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Defusal.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Ice-Path.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Ice-Silverfish-Room.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Teleport-Pad-Room.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Three-Chests.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Tic-Tac-Toe-1.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Trivia-Room.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Puzzle/Water Puzzle.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Trap/Trap-Hard-4.skeleton create mode 100644 src/main/resources/assets/skyblocker/dungeons/catacombs/Trap/Trap-Very-Hard-3.skeleton diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java index b689f828..9a9752fb 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java @@ -16,9 +16,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; -import java.io.File; import java.io.IOException; import java.io.ObjectInputStream; +import java.net.URL; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.zip.InflaterInputStream; @@ -29,6 +32,7 @@ public class DungeonSecrets { private static final HashMap>> ROOMS = new HashMap<>(); /** * Maps the block identifier string to a custom numeric block id used in dungeon rooms data. + * * @implNote Not using {@link net.minecraft.registry.Registry#getId(Object) Registry#getId(Block)} and {@link net.minecraft.block.Blocks Blocks} since this is also used by {@link me.xmrvizzy.skyblocker.skyblock.dungeon.secrets.DungeonRoomsDFU DungeonRoomsDFU}, which runs outside of Minecraft. */ @SuppressWarnings("JavadocReference") @@ -79,63 +83,63 @@ public class DungeonSecrets { } private static void load() { - try { - List> dungeonFutures = new ArrayList<>(); - //noinspection DataFlowIssue - File dungeons = new File(SkyblockerMod.class.getResource(DUNGEONS_DATA_DIR).getFile()); - int resourcePathIndex = dungeons.getPath().indexOf(DUNGEONS_DATA_DIR); - //noinspection DataFlowIssue - for (File dungeon : dungeons.listFiles()) { - if (!dungeon.isDirectory()) { - continue; - } - File[] roomShapes = dungeon.listFiles(); - if (roomShapes == null) { - LOGGER.error("Failed to load dungeon secrets for dungeon {}", dungeon.getName()); - continue; - } - ROOMS.put(dungeon.getName(), new HashMap<>()); - List> roomShapeFutures = new ArrayList<>(); - for (File roomShape : roomShapes) { - roomShapeFutures.add(CompletableFuture.supplyAsync(() -> readRooms(roomShape, resourcePathIndex)).thenAccept(rooms -> ROOMS.get(dungeon.getName()).put(roomShape.getName(), rooms))); + List> dungeonFutures = new ArrayList<>(); + URL dungeonsURL = SkyblockerMod.class.getResource(DUNGEONS_DATA_DIR); + if (dungeonsURL == null) { + LOGGER.error("Failed to load dungeon secrets, unable to find dungeon rooms data directory"); + return; + } + Path dungeonsDir = Path.of(dungeonsURL.getPath()); + int resourcePathIndex = dungeonsDir.toString().indexOf(DUNGEONS_DATA_DIR); + try (DirectoryStream dungeons = Files.newDirectoryStream(dungeonsDir, Files::isDirectory)) { + for (Path dungeon : dungeons) { + try (DirectoryStream roomShapes = Files.newDirectoryStream(dungeon, Files::isDirectory)) { + List> roomShapeFutures = new ArrayList<>(); + HashMap> roomShapesMap = new HashMap<>(); + for (Path roomShape : roomShapes) { + roomShapeFutures.add(CompletableFuture.supplyAsync(() -> readRooms(roomShape, resourcePathIndex)).thenAccept(rooms -> roomShapesMap.put(roomShape.getFileName().toString(), rooms))); + } + ROOMS.put(dungeon.getFileName().toString(), roomShapesMap); + dungeonFutures.add(CompletableFuture.allOf(roomShapeFutures.toArray(CompletableFuture[]::new)).thenRun(() -> LOGGER.info("Loaded dungeon secrets for dungeon {} with {} room shapes and {} rooms total", dungeon.getFileName(), roomShapesMap.size(), roomShapesMap.values().stream().mapToInt(HashMap::size).sum()))); + } catch (IOException e) { + LOGGER.error("Failed to load dungeon secrets for dungeon " + dungeon.getFileName(), e); } - dungeonFutures.add(CompletableFuture.allOf(roomShapeFutures.toArray(CompletableFuture[]::new)).thenRun(() -> LOGGER.debug("Loaded dungeon secrets for dungeon {} with {} room shapes and {} rooms total", dungeon.getName(), ROOMS.get(dungeon.getName()).size(), ROOMS.get(dungeon.getName()).values().stream().mapToInt(HashMap::size).sum()))); } - // Execute with MinecraftClient as executor since we need to wait for MinecraftClient#resourceManager to be set - dungeonFutures.add(CompletableFuture.runAsync(() -> { - try (BufferedReader roomsReader = MinecraftClient.getInstance().getResourceManager().openAsReader(new Identifier(SkyblockerMod.NAMESPACE, "dungeons/dungeonrooms.json")); BufferedReader waypointsReader = MinecraftClient.getInstance().getResourceManager().openAsReader(new Identifier(SkyblockerMod.NAMESPACE, "dungeons/secretlocations.json"))) { - roomsJson = SkyblockerMod.GSON.fromJson(roomsReader, JsonObject.class); - waypointsJson = SkyblockerMod.GSON.fromJson(waypointsReader, JsonObject.class); - LOGGER.debug("Loaded dungeon secrets json"); - } catch (Exception e) { - LOGGER.error("Failed to load dungeon secrets json", e); - } - }, MinecraftClient.getInstance())); - roomsLoaded = CompletableFuture.allOf(dungeonFutures.toArray(CompletableFuture[]::new)).thenRun(() -> LOGGER.info("Loaded dungeon secrets for {} dungeon(s), {} room shapes, and {} rooms total", ROOMS.size(), ROOMS.values().stream().mapToInt(HashMap::size).sum(), ROOMS.values().stream().map(HashMap::values).flatMap(Collection::stream).mapToInt(HashMap::size).sum())); - } catch (Exception e) { + } catch (IOException e) { LOGGER.error("Failed to load dungeon secrets", e); } + // Execute with MinecraftClient as executor since we need to wait for MinecraftClient#resourceManager to be set + dungeonFutures.add(CompletableFuture.runAsync(() -> { + try (BufferedReader roomsReader = MinecraftClient.getInstance().getResourceManager().openAsReader(new Identifier(SkyblockerMod.NAMESPACE, "dungeons/dungeonrooms.json")); BufferedReader waypointsReader = MinecraftClient.getInstance().getResourceManager().openAsReader(new Identifier(SkyblockerMod.NAMESPACE, "dungeons/secretlocations.json"))) { + roomsJson = SkyblockerMod.GSON.fromJson(roomsReader, JsonObject.class); + waypointsJson = SkyblockerMod.GSON.fromJson(waypointsReader, JsonObject.class); + LOGGER.debug("Loaded dungeon secrets json"); + } catch (Exception e) { + LOGGER.error("Failed to load dungeon secrets json", e); + } + }, MinecraftClient.getInstance())); + roomsLoaded = CompletableFuture.allOf(dungeonFutures.toArray(CompletableFuture[]::new)).thenRun(() -> LOGGER.info("Loaded dungeon secrets for {} dungeon(s), {} room shapes, and {} rooms total", ROOMS.size(), ROOMS.values().stream().mapToInt(HashMap::size).sum(), ROOMS.values().stream().map(HashMap::values).flatMap(Collection::stream).mapToInt(HashMap::size).sum())); } - private static HashMap readRooms(File roomShape, int resourcePathIndex) { - HashMap data = new HashMap<>(); - File[] rooms = roomShape.listFiles(); - if (rooms == null) { - LOGGER.error("Failed to load dungeon secrets room shape {}", roomShape.getName()); - return data; - } - for (File room : rooms) { - String name = room.getName(); - //noinspection DataFlowIssue - try (ObjectInputStream in = new ObjectInputStream(new InflaterInputStream(SkyblockerMod.class.getResourceAsStream(room.getPath().substring(resourcePathIndex))))) { - data.put(name.substring(0, name.length() - 9), (int[]) in.readObject()); - LOGGER.debug("Loaded dungeon secrets room {}", name); - } catch (NullPointerException | IOException | ClassNotFoundException e) { - LOGGER.error("Failed to load dungeon secrets room " + name, e); + private static HashMap readRooms(Path roomShape, int resourcePathIndex) { + try (DirectoryStream rooms = Files.newDirectoryStream(roomShape, Files::isRegularFile)) { + HashMap roomsData = new HashMap<>(); + for (Path room : rooms) { + String name = room.getFileName().toString(); + //noinspection DataFlowIssue + try (ObjectInputStream in = new ObjectInputStream(new InflaterInputStream(SkyblockerMod.class.getResourceAsStream(room.toString().substring(resourcePathIndex))))) { + roomsData.put(name.substring(0, name.length() - 9), (int[]) in.readObject()); + LOGGER.info("Loaded dungeon secrets room {}", name); + } catch (NullPointerException | IOException | ClassNotFoundException e) { + LOGGER.error("Failed to load dungeon secrets room " + name, e); + } } + LOGGER.info("Loaded dungeon secrets room shape {} with {} rooms", roomShape.getFileName(), roomsData.size()); + return roomsData; + } catch (IOException e) { + LOGGER.error("Failed to load dungeon secrets room shape " + roomShape.getFileName(), e); } - LOGGER.debug("Loaded dungeon secrets room shape {} with {} rooms", roomShape.getName(), data.size()); - return data; + return null; } private static void update() { diff --git a/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Admin-0.skeleton b/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Admin-0.skeleton new file mode 100644 index 00000000..4a6e7b6d Binary files /dev/null and b/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Admin-0.skeleton differ diff --git a/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Andesite-2.skeleton b/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Andesite-2.skeleton new file mode 100644 index 00000000..cae377ea Binary files /dev/null and b/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Andesite-2.skeleton differ diff --git a/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Arrow-Trap-1.skeleton b/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Arrow-Trap-1.skeleton new file mode 100644 index 00000000..36db1b7b --- /dev/null +++ b/src/main/resources/assets/skyblocker/dungeons/catacombs/1x1/Arrow-Trap-1.skeleton @@ -0,0 +1,3 @@ +xId׺W/sOƓ/!"I:'A@ԡEIE5I ,[mva_U}|?W۳_Ͽ_aiemckg~k=lm_z_}~_}~_}~_}~_}~_}~_}~_}?Uꃰ~c_}{_}G_owe_=}D'Ot>}Dߚ':Ot_owe||||||||||||||||||||||||||||||||||??Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|Y|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|9|,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~,~/Waٿ?z~s???????????'{'xWaٿ?·gccccccccccccccccccccccccccccccccccccccccccccc{gcccccccccccccccccccccc{[=ywGccccccccccccccccccccccccc{211111111111111111111111111}?|?|?|?|?|?|?|?|?|?g|?|?|?|?|?|?|?|?aޒDF\/$$ӽ!) w|k$N ?|?la?la?la?la?la?la?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p?\p~?~~?~~?~{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{|N}G}ҏI?/s~~~~~~~~/ŗP/}~ҏ~/U\^^^^^^^^^~5_?fzzzzzzzzzzzzzzzznfsznn.agNN???|>??f7o3ǃǃǃǃǃǃǃǃǃǃǃǃǃǃǃ'ߡT~}'9og쿝v;ogsypypypypypypypypypypypypypypypypypypypypypyryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryryry~.}'~ѯMr;/G}~/Ul6O6O6O6O6O6O6O6O6O6ϯfxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwww2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2v2vtttttttttttttttttt~s7wstrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqtqt}[]]]]_GGoI?'_~ӿ988888888888>xO5?g_gbbbbbbbbb. Q)FS~xOA$sssssssssssssssssss(~.~{r6???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?7?9Uh~n~n~n~n~n~?AI?'_~ӿtkFnFnFnFnFnFnFnFnFnFnFnFf|_IqqqqqqqqqqnLLLLLLLLLLL<<<<<<<<<<<<<o91ssssssssssssssssssssss˻j]˻w:gsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnsnspppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp|;;;;;#ssl߮VO{'~ѯMr;aaaaaaaaaaaaaaaaaaaaaǏéééééééééééååååååååååååààààààààààààààààààààààààààààààààààààÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ9/s^y2e˜9/s^y2e˜9/s^y2e˜9/s^y2e˜9/s^y2e˜9/s^y2e˜9/s^y2e˜9/s^y2e˜9/s^漟: +e\漟z^={?~/U_sy~ǻ_~xe˞=/{^yj-w^yr˝;/w^͞=/{^ye˞=/{?e˜9/s^y2e˜Or˝;/w^yr˝;/w^yr˝;/w^yr˝;/w^yr˝;/w^yr˝;/w^yr˝;/w^y˛7/o^޼yy˛7/o^޼yy˛7/o^޼yye˖-/[^lye˖-/[^lye˖-/[^lye߉_}N9-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lye˖-/[^lyr˕+/W^\yr˕+/W^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\S~^|^?>~OYW9ϝsrr~~ۯf~'ǖ˖˖˖˖˖˖˖˖˕˕˕˕˕˕˕˕˕˕˕3rrrrrrrrrrr++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)))))))))))))ogcǒ%K>|,Xcǒ%K>|,Xcǒ%K>|,Xcǒ%K>|,Xcǒ%K>|,Xcǒ%K>|,Xcǒ%K>|,Xcǒ%K>|,Xcǒ%K>|,Xcǒ%KךՋǐ!C>| 1cǐ!C>| 1}E7Yϒ%K>|_j-?>~|Ǐ?fǐ!C>| 1cǐ!?>~|Ǐ?>~|4Oѳ=8qǑ#G>|8qǑ#Go{8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8qǑ#G>|8q