From e83a912e38e09c425c08534bd4e84eb631b3fc92 Mon Sep 17 00:00:00 2001
From: lax1dude <cgiacun@gmail.com>
Date: Fri, 24 Jan 2025 18:39:36 -0800
Subject: [PATCH] Update #48 - Added some features from OptiFine

---
 CREDITS                                       |   52 +
 client_version                                |    2 +-
 .../net/minecraft/block/Block.edit.java       |   49 +-
 .../net/minecraft/block/BlockSlab.edit.java   |   13 +-
 .../net/minecraft/block/BlockStairs.edit.java |    9 +
 .../block/state/BlockStateBase.edit.java      |   36 +-
 .../pattern/FactoryBlockPattern.edit.java     |   35 +-
 .../net/minecraft/client/Minecraft.edit.java  |   12 +-
 .../client/gui/GuiOverlayDebug.edit.java      |    8 +-
 .../client/gui/GuiVideoSettings.edit.java     |   11 +-
 .../client/model/ModelRenderer.edit.java      |   21 +-
 .../multiplayer/ChunkProviderClient.edit.java |    7 +
 .../renderer/BlockModelRenderer.edit.java     |  183 +-
 .../renderer/BlockModelShapes.edit.java       |   16 +-
 .../client/renderer/EntityRenderer.edit.java  |   20 +-
 .../InventoryEffectRenderer.edit.java         |   12 +-
 .../client/renderer/ItemModelMesher.edit.java |   17 +-
 .../client/renderer/RenderGlobal.edit.java    |   80 +-
 .../renderer/block/model/BakedQuad.edit.java  |   78 +-
 .../block/model/BreakingFour.edit.java        |   24 +-
 .../renderer/block/model/FaceBakery.edit.java |    2 +-
 .../block/statemap/BlockStateMapper.edit.java |    4 +
 .../statemap/DefaultStateMapper.edit.java     |    4 +
 .../block/statemap/StateMap.edit.java         |    4 +
 .../block/statemap/StateMapperBase.edit.java  |    4 +
 .../renderer/entity/RenderItem.edit.java      |  207 +-
 .../entity/layers/LayerArmorBase.edit.java    |   42 +-
 .../renderer/texture/TextureClock.edit.java   |   18 +-
 .../renderer/texture/TextureCompass.edit.java |   30 +-
 .../renderer/texture/TextureMap.edit.java     |  133 +-
 .../resources/AbstractResourcePack.edit.java  |   17 +-
 .../resources/DefaultResourcePack.edit.java   |   47 +-
 .../client/resources/IResourcePack.edit.java  |   12 +-
 .../resources/model/ModelBakery.edit.java     |   85 +-
 .../resources/model/ModelManager.edit.java    |   16 +
 .../client/settings/GameSettings.edit.java    |  158 +-
 .../entity/EntityLivingBase.edit.java         |   24 +-
 .../play/server/S21PacketChunkData.edit.java  |    6 +-
 .../net/minecraft/util/BlockPos.edit.java     |   13 +-
 .../net/minecraft/util/EnumFacing.edit.java   |    6 +-
 .../net/minecraft/world/ChunkCache.edit.java  |   24 +-
 .../minecraft/world/EnumSkyBlock.edit.java    |   13 +
 .../minecraft/world/IBlockAccess.edit.java    |    5 +
 .../net/minecraft/world/World.edit.java       |  118 +-
 .../net/minecraft/world/WorldServer.edit.java |    6 +-
 .../net/minecraft/world/chunk/Chunk.edit.java |  544 ++++-
 .../world/chunk/IChunkProvider.edit.java      |    5 +
 .../chunk/storage/AnvilChunkLoader.edit.java  |   66 +-
 .../storage/ExtendedBlockStorage.edit.java    |   59 +
 .../world/gen/ChunkProviderDebug.edit.java    |   15 +
 .../world/gen/ChunkProviderEnd.edit.java      |    7 +
 .../world/gen/ChunkProviderFlat.edit.java     |    7 +
 .../world/gen/ChunkProviderGenerate.edit.java |    7 +
 .../world/gen/ChunkProviderHell.edit.java     |    7 +
 .../world/gen/ChunkProviderServer.edit.java   |    7 +
 .../black_stained_glass_pane.edit.json        |   25 +
 .../blue_stained_glass_pane.edit.json         |   25 +
 .../brown_stained_glass_pane.edit.json        |   25 +
 .../cyan_stained_glass_pane.edit.json         |   25 +
 .../gray_stained_glass_pane.edit.json         |   25 +
 .../green_stained_glass_pane.edit.json        |   25 +
 .../light_blue_stained_glass_pane.edit.json   |   25 +
 .../lime_stained_glass_pane.edit.json         |   25 +
 .../magenta_stained_glass_pane.edit.json      |   25 +
 .../orange_stained_glass_pane.edit.json       |   25 +
 .../pink_stained_glass_pane.edit.json         |   25 +
 .../purple_stained_glass_pane.edit.json       |   25 +
 .../red_stained_glass_pane.edit.json          |   25 +
 .../silver_stained_glass_pane.edit.json       |   25 +
 .../white_stained_glass_pane.edit.json        |   25 +
 .../yellow_stained_glass_pane.edit.json       |   25 +
 .../assets/minecraft/lang/en_US.edit.lang     |   10 +-
 .../minecraft/models/block/pane_n.edit.json   |   17 +
 .../minecraft/models/block/pane_ne.edit.json  |   16 +
 .../minecraft/models/block/pane_ns.edit.json  |   17 +
 .../minecraft/models/block/pane_nse.edit.json |   16 +
 .../v1_8/internal/OpenGLObjects.java          |   20 +-
 .../alfheim/lighting/LightingEngine.java      |  496 ++++
 .../alfheim/utils/DeduplicatedLongQueue.java  |   75 +
 .../alfheim/utils/EnumBoundaryFacing.java     |    5 +
 .../alfheim/utils/WorldChunkSlice.java        |   88 +
 .../dev/redstudio/redcore/math/ClampUtil.java |  201 ++
 sources/main/java/jdk_internal/bidi/Bidi.java |    2 +-
 .../java/jdk_internal/bidi/Normalizer.java    |    2 +-
 .../java/jdk_internal/bidi/SunNormalizer.java |    4 +-
 .../{bidi => }/icu/impl/BMPSet.java           |    6 +-
 .../{bidi => }/icu/impl/CharTrie.java         |    4 +-
 .../icu/impl/CharacterIteratorWrapper.java    |    4 +-
 .../{bidi => }/icu/impl/ICUBinary.java        |    4 +-
 .../{bidi => }/icu/impl/Norm2AllModes.java    |    4 +-
 .../{bidi => }/icu/impl/NormalizerImpl.java   |   12 +-
 .../{bidi => }/icu/impl/Punycode.java         |    6 +-
 .../impl/ReplaceableUCharacterIterator.java   |    8 +-
 .../icu/impl/StringPrepDataReader.java        |    2 +-
 .../{bidi => }/icu/impl/Trie.java             |    6 +-
 .../{bidi => }/icu/impl/Trie2.java            |    2 +-
 .../{bidi => }/icu/impl/Trie2_16.java         |    2 +-
 .../{bidi => }/icu/impl/UBiDiProps.java       |    5 +-
 .../icu/impl/UCharacterProperty.java          |   12 +-
 .../icu/impl/UnicodeSetStringSpan.java        |   10 +-
 .../{bidi => }/icu/impl/Utility.java          |    6 +-
 .../{bidi => }/icu/lang/UCharacter.java       |   12 +-
 .../icu/lang/UCharacterDirection.java         |    2 +-
 .../{bidi => }/icu/lang/UCharacterEnums.java  |    2 +-
 .../{bidi => }/icu/text/BidiBase.java         |    6 +-
 .../{bidi => }/icu/text/BidiLine.java         |    2 +-
 .../{bidi => }/icu/text/BidiRun.java          |    2 +-
 .../{bidi => }/icu/text/BidiWriter.java       |    4 +-
 .../icu/text/FilteredNormalizer2.java         |    2 +-
 .../{bidi => }/icu/text/Normalizer2.java      |    4 +-
 .../{bidi => }/icu/text/NormalizerBase.java   |    4 +-
 .../{bidi => }/icu/text/Replaceable.java      |    2 +-
 .../icu/text/ReplaceableString.java           |    2 +-
 .../{bidi => }/icu/text/StringPrep.java       |   14 +-
 .../icu/text/UCharacterIterator.java          |    8 +-
 .../{bidi => }/icu/text/UTF16.java            |    4 +-
 .../{bidi => }/icu/text/UnicodeSet.java       |   16 +-
 .../{bidi => }/icu/util/CodePointMap.java     |    2 +-
 .../{bidi => }/icu/util/CodePointTrie.java    |    6 +-
 .../{bidi => }/icu/util/OutputInt.java        |    2 +-
 .../{bidi => }/icu/util/VersionInfo.java      |    2 +-
 .../eaglercraft/v1_8/EaglerProperties.java    |  326 +++
 .../eaglercraft/v1_8/EaglercraftVersion.java  |    8 +-
 .../lax1dude/eaglercraft/v1_8/IOUtils.java    |    8 +-
 .../eaglercraft/v1_8/internal/ITextureGL.java |    6 +
 .../minecraft/EaglerFolderResourcePack.java   |  138 +-
 .../minecraft/EaglerTextureAtlasSprite.java   |   77 +-
 .../v1_8/minecraft/ResourceIndex.java         |   43 +
 .../v1_8/minecraft/TextureAnimationCache.java |   59 +-
 .../v1_8/opengl/EaglercraftGPU.java           |    5 +-
 .../v1_8/opengl/GlStateManager.java           |  418 ++--
 .../v1_8/opengl/SpriteLevelMixer.java         |   68 +-
 .../v1_8/opengl/TextureCopyUtil.java          |   11 +
 .../v1_8/opengl/WorldRenderer.java            |   21 +
 .../ext/deferred/EaglerDeferredPipeline.java  |   11 +-
 .../texture/EaglerTextureAtlasSpritePBR.java  |   81 +-
 .../deferred/texture/PBRTextureMapUtils.java  |   14 +-
 .../deferred/texture/TextureClockPBRImpl.java |   34 +-
 .../texture/TextureCompassPBRImpl.java        |   43 +-
 .../v1_8/sp/server/EaglerChunkLoader.java     |    1 +
 .../main/java/net/optifine/BetterGrass.java   |  243 ++
 .../main/java/net/optifine/BetterSnow.java    |   91 +
 sources/main/java/net/optifine/BlockDir.java  |   78 +
 sources/main/java/net/optifine/Config.java    |  339 +++
 .../net/optifine/ConnectedProperties.java     |  993 ++++++++
 .../java/net/optifine/ConnectedTextures.java  | 2102 +++++++++++++++++
 .../optifine/ConnectedTexturesCompact.java    |  450 ++++
 .../net/optifine/CustomItemProperties.java    |  972 ++++++++
 .../main/java/net/optifine/CustomItems.java   |  840 +++++++
 .../net/optifine/CustomItemsComparator.java   |   15 +
 sources/main/java/net/optifine/CustomSky.java |  149 ++
 .../java/net/optifine/CustomSkyLayer.java     |  434 ++++
 .../main/java/net/optifine/SmartLeaves.java   |  198 ++
 .../net/optifine/config/ConnectedParser.java  |  914 +++++++
 .../java/net/optifine/config/GlVersion.java   |   46 +
 .../java/net/optifine/config/INameGetter.java |    5 +
 .../net/optifine/config/IObjectLocator.java   |    7 +
 .../java/net/optifine/config/IParserInt.java  |    5 +
 .../java/net/optifine/config/ItemLocator.java |   11 +
 .../java/net/optifine/config/MatchBlock.java  |   61 +
 .../java/net/optifine/config/Matches.java     |   97 +
 .../java/net/optifine/config/NbtTagValue.java |  254 ++
 .../optifine/config/ParserEnchantmentId.java  |   10 +
 .../java/net/optifine/config/RangeInt.java    |   27 +
 .../net/optifine/config/RangeListInt.java     |   57 +
 .../java/net/optifine/config/Weather.java     |   18 +
 .../optifine/model/BlockModelCustomizer.java  |  100 +
 .../net/optifine/model/BlockModelUtils.java   |  173 ++
 .../net/optifine/model/ListQuadsOverlay.java  |   44 +
 .../java/net/optifine/model/ModelUtils.java   |   94 +
 .../java/net/optifine/model/QuadBounds.java   |  158 ++
 .../java/net/optifine/render/Blender.java     |  122 +
 .../java/net/optifine/render/RenderEnv.java   |  265 +++
 .../java/net/optifine/util/CounterInt.java    |   24 +
 .../java/net/optifine/util/MathUtils.java     |   74 +
 .../main/java/net/optifine/util/NumUtils.java |   17 +
 .../net/optifine/util/PropertiesOrdered.java  |   27 +
 .../main/java/net/optifine/util/ResUtils.java |   54 +
 .../java/net/optifine/util/SmoothFloat.java   |   77 +
 .../main/java/net/optifine/util/StrUtils.java |  603 +++++
 .../java/net/optifine/util/TextureUtils.java  |   96 +
 .../net/optifine/util/TileEntityUtils.java    |   22 +
 .../commons/lang3/StringEscapeUtils.java      |  849 +++++++
 .../text/translate/AggregateTranslator.java   |   60 +
 .../translate/CharSequenceTranslator.java     |  131 +
 .../text/translate/CodePointTranslator.java   |   53 +
 .../lang3/text/translate/EntityArrays.java    |  461 ++++
 .../text/translate/JavaUnicodeEscaper.java    |  112 +
 .../text/translate/LookupTranslator.java      |   85 +
 .../text/translate/NumericEntityEscaper.java  |  137 ++
 .../translate/NumericEntityUnescaper.java     |  140 ++
 .../lang3/text/translate/OctalUnescaper.java  |   86 +
 .../lang3/text/translate/UnicodeEscaper.java  |  156 ++
 .../text/translate/UnicodeUnescaper.java      |   65 +
 .../UnicodeUnpairedSurrogateRemover.java      |   43 +
 .../lang3/text/translate/package-info.java    |   30 +
 sources/resources/EPKVersionIdentifier.txt    |    2 +-
 sources/resources/assets/eagler/CREDITS.txt   |   52 +
 .../eagler/glsl/deferred/deferred_combine.fsh |    5 +-
 .../eagler/glsl/deferred/forward_core.fsh     |   11 +-
 .../eagler/glsl/deferred/forward_core.vsh     |    4 +-
 .../deferred/forward_glass_highlights.fsh     |    7 +-
 .../glsl/deferred/realistic_water_render.fsh  |    4 +-
 .../glsl/deferred/realistic_water_render.vsh  |    4 +-
 .../glsl/deferred/shader_pack_info.json       |    2 +-
 .../assets/eagler/glsl/texture_mix.fsh        |    8 +-
 .../minecraft/mcpatcher/ctm/default/0.png     |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/0_glass_white/0.png |  Bin 0 -> 202 bytes
 .../mcpatcher/ctm/default/0_glass_white/1.png |  Bin 0 -> 196 bytes
 .../ctm/default/0_glass_white/10.png          |  Bin 0 -> 173 bytes
 .../ctm/default/0_glass_white/11.png          |  Bin 0 -> 170 bytes
 .../ctm/default/0_glass_white/16.png          |  Bin 0 -> 199 bytes
 .../ctm/default/0_glass_white/17.png          |  Bin 0 -> 193 bytes
 .../ctm/default/0_glass_white/18.png          |  Bin 0 -> 185 bytes
 .../ctm/default/0_glass_white/19.png          |  Bin 0 -> 192 bytes
 .../mcpatcher/ctm/default/0_glass_white/2.png |  Bin 0 -> 188 bytes
 .../ctm/default/0_glass_white/20.png          |  Bin 0 -> 193 bytes
 .../ctm/default/0_glass_white/21.png          |  Bin 0 -> 194 bytes
 .../ctm/default/0_glass_white/22.png          |  Bin 0 -> 186 bytes
 .../ctm/default/0_glass_white/23.png          |  Bin 0 -> 188 bytes
 .../ctm/default/0_glass_white/24.png          |  Bin 0 -> 176 bytes
 .../ctm/default/0_glass_white/25.png          |  Bin 0 -> 180 bytes
 .../ctm/default/0_glass_white/26.png          |  Bin 0 -> 179 bytes
 .../ctm/default/0_glass_white/27.png          |  Bin 0 -> 171 bytes
 .../mcpatcher/ctm/default/0_glass_white/3.png |  Bin 0 -> 197 bytes
 .../ctm/default/0_glass_white/32.png          |  Bin 0 -> 195 bytes
 .../ctm/default/0_glass_white/33.png          |  Bin 0 -> 183 bytes
 .../ctm/default/0_glass_white/34.png          |  Bin 0 -> 168 bytes
 .../ctm/default/0_glass_white/35.png          |  Bin 0 -> 185 bytes
 .../ctm/default/0_glass_white/36.png          |  Bin 0 -> 188 bytes
 .../ctm/default/0_glass_white/37.png          |  Bin 0 -> 185 bytes
 .../ctm/default/0_glass_white/38.png          |  Bin 0 -> 184 bytes
 .../ctm/default/0_glass_white/39.png          |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/0_glass_white/4.png |  Bin 0 -> 194 bytes
 .../ctm/default/0_glass_white/40.png          |  Bin 0 -> 170 bytes
 .../ctm/default/0_glass_white/41.png          |  Bin 0 -> 169 bytes
 .../ctm/default/0_glass_white/42.png          |  Bin 0 -> 172 bytes
 .../ctm/default/0_glass_white/43.png          |  Bin 0 -> 176 bytes
 .../ctm/default/0_glass_white/48.png          |  Bin 0 -> 199 bytes
 .../ctm/default/0_glass_white/49.png          |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/0_glass_white/5.png |  Bin 0 -> 194 bytes
 .../ctm/default/0_glass_white/50.png          |  Bin 0 -> 178 bytes
 .../ctm/default/0_glass_white/51.png          |  Bin 0 -> 192 bytes
 .../ctm/default/0_glass_white/52.png          |  Bin 0 -> 181 bytes
 .../ctm/default/0_glass_white/53.png          |  Bin 0 -> 187 bytes
 .../ctm/default/0_glass_white/54.png          |  Bin 0 -> 185 bytes
 .../ctm/default/0_glass_white/55.png          |  Bin 0 -> 190 bytes
 .../ctm/default/0_glass_white/56.png          |  Bin 0 -> 175 bytes
 .../ctm/default/0_glass_white/57.png          |  Bin 0 -> 172 bytes
 .../ctm/default/0_glass_white/58.png          |  Bin 0 -> 176 bytes
 .../mcpatcher/ctm/default/0_glass_white/6.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/0_glass_white/7.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/0_glass_white/8.png |  Bin 0 -> 171 bytes
 .../mcpatcher/ctm/default/0_glass_white/9.png |  Bin 0 -> 177 bytes
 .../0_glass_white/glass_pane_white.properties |    7 +
 .../0_glass_white/glass_white.properties      |    6 +
 .../minecraft/mcpatcher/ctm/default/1.png     |  Bin 0 -> 167 bytes
 .../minecraft/mcpatcher/ctm/default/10.png    |  Bin 0 -> 126 bytes
 .../ctm/default/10_glass_purple/0.png         |  Bin 0 -> 206 bytes
 .../ctm/default/10_glass_purple/1.png         |  Bin 0 -> 200 bytes
 .../ctm/default/10_glass_purple/10.png        |  Bin 0 -> 178 bytes
 .../ctm/default/10_glass_purple/11.png        |  Bin 0 -> 174 bytes
 .../ctm/default/10_glass_purple/16.png        |  Bin 0 -> 203 bytes
 .../ctm/default/10_glass_purple/17.png        |  Bin 0 -> 197 bytes
 .../ctm/default/10_glass_purple/18.png        |  Bin 0 -> 188 bytes
 .../ctm/default/10_glass_purple/19.png        |  Bin 0 -> 195 bytes
 .../ctm/default/10_glass_purple/2.png         |  Bin 0 -> 191 bytes
 .../ctm/default/10_glass_purple/20.png        |  Bin 0 -> 197 bytes
 .../ctm/default/10_glass_purple/21.png        |  Bin 0 -> 197 bytes
 .../ctm/default/10_glass_purple/22.png        |  Bin 0 -> 189 bytes
 .../ctm/default/10_glass_purple/23.png        |  Bin 0 -> 188 bytes
 .../ctm/default/10_glass_purple/24.png        |  Bin 0 -> 181 bytes
 .../ctm/default/10_glass_purple/25.png        |  Bin 0 -> 184 bytes
 .../ctm/default/10_glass_purple/26.png        |  Bin 0 -> 182 bytes
 .../ctm/default/10_glass_purple/27.png        |  Bin 0 -> 175 bytes
 .../ctm/default/10_glass_purple/3.png         |  Bin 0 -> 200 bytes
 .../ctm/default/10_glass_purple/32.png        |  Bin 0 -> 198 bytes
 .../ctm/default/10_glass_purple/33.png        |  Bin 0 -> 183 bytes
 .../ctm/default/10_glass_purple/34.png        |  Bin 0 -> 172 bytes
 .../ctm/default/10_glass_purple/35.png        |  Bin 0 -> 186 bytes
 .../ctm/default/10_glass_purple/36.png        |  Bin 0 -> 190 bytes
 .../ctm/default/10_glass_purple/37.png        |  Bin 0 -> 189 bytes
 .../ctm/default/10_glass_purple/38.png        |  Bin 0 -> 184 bytes
 .../ctm/default/10_glass_purple/39.png        |  Bin 0 -> 191 bytes
 .../ctm/default/10_glass_purple/4.png         |  Bin 0 -> 197 bytes
 .../ctm/default/10_glass_purple/40.png        |  Bin 0 -> 173 bytes
 .../ctm/default/10_glass_purple/41.png        |  Bin 0 -> 173 bytes
 .../ctm/default/10_glass_purple/42.png        |  Bin 0 -> 175 bytes
 .../ctm/default/10_glass_purple/43.png        |  Bin 0 -> 181 bytes
 .../ctm/default/10_glass_purple/48.png        |  Bin 0 -> 203 bytes
 .../ctm/default/10_glass_purple/49.png        |  Bin 0 -> 191 bytes
 .../ctm/default/10_glass_purple/5.png         |  Bin 0 -> 198 bytes
 .../ctm/default/10_glass_purple/50.png        |  Bin 0 -> 181 bytes
 .../ctm/default/10_glass_purple/51.png        |  Bin 0 -> 193 bytes
 .../ctm/default/10_glass_purple/52.png        |  Bin 0 -> 184 bytes
 .../ctm/default/10_glass_purple/53.png        |  Bin 0 -> 187 bytes
 .../ctm/default/10_glass_purple/54.png        |  Bin 0 -> 188 bytes
 .../ctm/default/10_glass_purple/55.png        |  Bin 0 -> 191 bytes
 .../ctm/default/10_glass_purple/56.png        |  Bin 0 -> 179 bytes
 .../ctm/default/10_glass_purple/57.png        |  Bin 0 -> 174 bytes
 .../ctm/default/10_glass_purple/58.png        |  Bin 0 -> 180 bytes
 .../ctm/default/10_glass_purple/6.png         |  Bin 0 -> 189 bytes
 .../ctm/default/10_glass_purple/7.png         |  Bin 0 -> 192 bytes
 .../ctm/default/10_glass_purple/8.png         |  Bin 0 -> 176 bytes
 .../ctm/default/10_glass_purple/9.png         |  Bin 0 -> 181 bytes
 .../glass_pane_purple.properties              |    7 +
 .../10_glass_purple/glass_purple.properties   |    6 +
 .../minecraft/mcpatcher/ctm/default/11.png    |  Bin 0 -> 126 bytes
 .../mcpatcher/ctm/default/11_glass_blue/0.png |  Bin 0 -> 206 bytes
 .../mcpatcher/ctm/default/11_glass_blue/1.png |  Bin 0 -> 201 bytes
 .../ctm/default/11_glass_blue/10.png          |  Bin 0 -> 179 bytes
 .../ctm/default/11_glass_blue/11.png          |  Bin 0 -> 175 bytes
 .../ctm/default/11_glass_blue/16.png          |  Bin 0 -> 203 bytes
 .../ctm/default/11_glass_blue/17.png          |  Bin 0 -> 197 bytes
 .../ctm/default/11_glass_blue/18.png          |  Bin 0 -> 189 bytes
 .../ctm/default/11_glass_blue/19.png          |  Bin 0 -> 196 bytes
 .../mcpatcher/ctm/default/11_glass_blue/2.png |  Bin 0 -> 192 bytes
 .../ctm/default/11_glass_blue/20.png          |  Bin 0 -> 197 bytes
 .../ctm/default/11_glass_blue/21.png          |  Bin 0 -> 197 bytes
 .../ctm/default/11_glass_blue/22.png          |  Bin 0 -> 190 bytes
 .../ctm/default/11_glass_blue/23.png          |  Bin 0 -> 188 bytes
 .../ctm/default/11_glass_blue/24.png          |  Bin 0 -> 181 bytes
 .../ctm/default/11_glass_blue/25.png          |  Bin 0 -> 184 bytes
 .../ctm/default/11_glass_blue/26.png          |  Bin 0 -> 183 bytes
 .../ctm/default/11_glass_blue/27.png          |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/11_glass_blue/3.png |  Bin 0 -> 201 bytes
 .../ctm/default/11_glass_blue/32.png          |  Bin 0 -> 198 bytes
 .../ctm/default/11_glass_blue/33.png          |  Bin 0 -> 183 bytes
 .../ctm/default/11_glass_blue/34.png          |  Bin 0 -> 172 bytes
 .../ctm/default/11_glass_blue/35.png          |  Bin 0 -> 186 bytes
 .../ctm/default/11_glass_blue/36.png          |  Bin 0 -> 190 bytes
 .../ctm/default/11_glass_blue/37.png          |  Bin 0 -> 190 bytes
 .../ctm/default/11_glass_blue/38.png          |  Bin 0 -> 184 bytes
 .../ctm/default/11_glass_blue/39.png          |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/11_glass_blue/4.png |  Bin 0 -> 198 bytes
 .../ctm/default/11_glass_blue/40.png          |  Bin 0 -> 173 bytes
 .../ctm/default/11_glass_blue/41.png          |  Bin 0 -> 174 bytes
 .../ctm/default/11_glass_blue/42.png          |  Bin 0 -> 175 bytes
 .../ctm/default/11_glass_blue/43.png          |  Bin 0 -> 181 bytes
 .../ctm/default/11_glass_blue/48.png          |  Bin 0 -> 204 bytes
 .../ctm/default/11_glass_blue/49.png          |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/11_glass_blue/5.png |  Bin 0 -> 198 bytes
 .../ctm/default/11_glass_blue/50.png          |  Bin 0 -> 181 bytes
 .../ctm/default/11_glass_blue/51.png          |  Bin 0 -> 193 bytes
 .../ctm/default/11_glass_blue/52.png          |  Bin 0 -> 184 bytes
 .../ctm/default/11_glass_blue/53.png          |  Bin 0 -> 187 bytes
 .../ctm/default/11_glass_blue/54.png          |  Bin 0 -> 188 bytes
 .../ctm/default/11_glass_blue/55.png          |  Bin 0 -> 191 bytes
 .../ctm/default/11_glass_blue/56.png          |  Bin 0 -> 180 bytes
 .../ctm/default/11_glass_blue/57.png          |  Bin 0 -> 174 bytes
 .../ctm/default/11_glass_blue/58.png          |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/11_glass_blue/6.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/11_glass_blue/7.png |  Bin 0 -> 192 bytes
 .../mcpatcher/ctm/default/11_glass_blue/8.png |  Bin 0 -> 176 bytes
 .../mcpatcher/ctm/default/11_glass_blue/9.png |  Bin 0 -> 182 bytes
 .../11_glass_blue/glass_blue.properties       |    6 +
 .../11_glass_blue/glass_pane_blue.properties  |    7 +
 .../minecraft/mcpatcher/ctm/default/12.png    |  Bin 0 -> 372 bytes
 .../ctm/default/12_glass_brown/0.png          |  Bin 0 -> 205 bytes
 .../ctm/default/12_glass_brown/1.png          |  Bin 0 -> 200 bytes
 .../ctm/default/12_glass_brown/10.png         |  Bin 0 -> 177 bytes
 .../ctm/default/12_glass_brown/11.png         |  Bin 0 -> 173 bytes
 .../ctm/default/12_glass_brown/16.png         |  Bin 0 -> 202 bytes
 .../ctm/default/12_glass_brown/17.png         |  Bin 0 -> 196 bytes
 .../ctm/default/12_glass_brown/18.png         |  Bin 0 -> 188 bytes
 .../ctm/default/12_glass_brown/19.png         |  Bin 0 -> 195 bytes
 .../ctm/default/12_glass_brown/2.png          |  Bin 0 -> 191 bytes
 .../ctm/default/12_glass_brown/20.png         |  Bin 0 -> 197 bytes
 .../ctm/default/12_glass_brown/21.png         |  Bin 0 -> 196 bytes
 .../ctm/default/12_glass_brown/22.png         |  Bin 0 -> 189 bytes
 .../ctm/default/12_glass_brown/23.png         |  Bin 0 -> 188 bytes
 .../ctm/default/12_glass_brown/24.png         |  Bin 0 -> 180 bytes
 .../ctm/default/12_glass_brown/25.png         |  Bin 0 -> 183 bytes
 .../ctm/default/12_glass_brown/26.png         |  Bin 0 -> 181 bytes
 .../ctm/default/12_glass_brown/27.png         |  Bin 0 -> 174 bytes
 .../ctm/default/12_glass_brown/3.png          |  Bin 0 -> 200 bytes
 .../ctm/default/12_glass_brown/32.png         |  Bin 0 -> 198 bytes
 .../ctm/default/12_glass_brown/33.png         |  Bin 0 -> 183 bytes
 .../ctm/default/12_glass_brown/34.png         |  Bin 0 -> 171 bytes
 .../ctm/default/12_glass_brown/35.png         |  Bin 0 -> 185 bytes
 .../ctm/default/12_glass_brown/36.png         |  Bin 0 -> 190 bytes
 .../ctm/default/12_glass_brown/37.png         |  Bin 0 -> 189 bytes
 .../ctm/default/12_glass_brown/38.png         |  Bin 0 -> 184 bytes
 .../ctm/default/12_glass_brown/39.png         |  Bin 0 -> 191 bytes
 .../ctm/default/12_glass_brown/4.png          |  Bin 0 -> 197 bytes
 .../ctm/default/12_glass_brown/40.png         |  Bin 0 -> 173 bytes
 .../ctm/default/12_glass_brown/41.png         |  Bin 0 -> 173 bytes
 .../ctm/default/12_glass_brown/42.png         |  Bin 0 -> 175 bytes
 .../ctm/default/12_glass_brown/43.png         |  Bin 0 -> 180 bytes
 .../ctm/default/12_glass_brown/48.png         |  Bin 0 -> 203 bytes
 .../ctm/default/12_glass_brown/49.png         |  Bin 0 -> 191 bytes
 .../ctm/default/12_glass_brown/5.png          |  Bin 0 -> 197 bytes
 .../ctm/default/12_glass_brown/50.png         |  Bin 0 -> 181 bytes
 .../ctm/default/12_glass_brown/51.png         |  Bin 0 -> 193 bytes
 .../ctm/default/12_glass_brown/52.png         |  Bin 0 -> 184 bytes
 .../ctm/default/12_glass_brown/53.png         |  Bin 0 -> 187 bytes
 .../ctm/default/12_glass_brown/54.png         |  Bin 0 -> 188 bytes
 .../ctm/default/12_glass_brown/55.png         |  Bin 0 -> 191 bytes
 .../ctm/default/12_glass_brown/56.png         |  Bin 0 -> 178 bytes
 .../ctm/default/12_glass_brown/57.png         |  Bin 0 -> 174 bytes
 .../ctm/default/12_glass_brown/58.png         |  Bin 0 -> 179 bytes
 .../ctm/default/12_glass_brown/6.png          |  Bin 0 -> 189 bytes
 .../ctm/default/12_glass_brown/7.png          |  Bin 0 -> 191 bytes
 .../ctm/default/12_glass_brown/8.png          |  Bin 0 -> 175 bytes
 .../ctm/default/12_glass_brown/9.png          |  Bin 0 -> 180 bytes
 .../12_glass_brown/glass_brown.properties     |    6 +
 .../glass_pane_brown.properties               |    7 +
 .../minecraft/mcpatcher/ctm/default/13.png    |  Bin 0 -> 370 bytes
 .../ctm/default/13_glass_green/0.png          |  Bin 0 -> 204 bytes
 .../ctm/default/13_glass_green/1.png          |  Bin 0 -> 199 bytes
 .../ctm/default/13_glass_green/10.png         |  Bin 0 -> 176 bytes
 .../ctm/default/13_glass_green/11.png         |  Bin 0 -> 172 bytes
 .../ctm/default/13_glass_green/16.png         |  Bin 0 -> 201 bytes
 .../ctm/default/13_glass_green/17.png         |  Bin 0 -> 195 bytes
 .../ctm/default/13_glass_green/18.png         |  Bin 0 -> 187 bytes
 .../ctm/default/13_glass_green/19.png         |  Bin 0 -> 194 bytes
 .../ctm/default/13_glass_green/2.png          |  Bin 0 -> 190 bytes
 .../ctm/default/13_glass_green/20.png         |  Bin 0 -> 196 bytes
 .../ctm/default/13_glass_green/21.png         |  Bin 0 -> 196 bytes
 .../ctm/default/13_glass_green/22.png         |  Bin 0 -> 188 bytes
 .../ctm/default/13_glass_green/23.png         |  Bin 0 -> 188 bytes
 .../ctm/default/13_glass_green/24.png         |  Bin 0 -> 179 bytes
 .../ctm/default/13_glass_green/25.png         |  Bin 0 -> 182 bytes
 .../ctm/default/13_glass_green/26.png         |  Bin 0 -> 180 bytes
 .../ctm/default/13_glass_green/27.png         |  Bin 0 -> 173 bytes
 .../ctm/default/13_glass_green/3.png          |  Bin 0 -> 199 bytes
 .../ctm/default/13_glass_green/32.png         |  Bin 0 -> 198 bytes
 .../ctm/default/13_glass_green/33.png         |  Bin 0 -> 183 bytes
 .../ctm/default/13_glass_green/34.png         |  Bin 0 -> 170 bytes
 .../ctm/default/13_glass_green/35.png         |  Bin 0 -> 185 bytes
 .../ctm/default/13_glass_green/36.png         |  Bin 0 -> 190 bytes
 .../ctm/default/13_glass_green/37.png         |  Bin 0 -> 188 bytes
 .../ctm/default/13_glass_green/38.png         |  Bin 0 -> 184 bytes
 .../ctm/default/13_glass_green/39.png         |  Bin 0 -> 190 bytes
 .../ctm/default/13_glass_green/4.png          |  Bin 0 -> 196 bytes
 .../ctm/default/13_glass_green/40.png         |  Bin 0 -> 173 bytes
 .../ctm/default/13_glass_green/41.png         |  Bin 0 -> 172 bytes
 .../ctm/default/13_glass_green/42.png         |  Bin 0 -> 175 bytes
 .../ctm/default/13_glass_green/43.png         |  Bin 0 -> 179 bytes
 .../ctm/default/13_glass_green/48.png         |  Bin 0 -> 202 bytes
 .../ctm/default/13_glass_green/49.png         |  Bin 0 -> 190 bytes
 .../ctm/default/13_glass_green/5.png          |  Bin 0 -> 197 bytes
 .../ctm/default/13_glass_green/50.png         |  Bin 0 -> 180 bytes
 .../ctm/default/13_glass_green/51.png         |  Bin 0 -> 193 bytes
 .../ctm/default/13_glass_green/52.png         |  Bin 0 -> 183 bytes
 .../ctm/default/13_glass_green/53.png         |  Bin 0 -> 187 bytes
 .../ctm/default/13_glass_green/54.png         |  Bin 0 -> 187 bytes
 .../ctm/default/13_glass_green/55.png         |  Bin 0 -> 191 bytes
 .../ctm/default/13_glass_green/56.png         |  Bin 0 -> 177 bytes
 .../ctm/default/13_glass_green/57.png         |  Bin 0 -> 174 bytes
 .../ctm/default/13_glass_green/58.png         |  Bin 0 -> 178 bytes
 .../ctm/default/13_glass_green/6.png          |  Bin 0 -> 189 bytes
 .../ctm/default/13_glass_green/7.png          |  Bin 0 -> 190 bytes
 .../ctm/default/13_glass_green/8.png          |  Bin 0 -> 174 bytes
 .../ctm/default/13_glass_green/9.png          |  Bin 0 -> 179 bytes
 .../13_glass_green/glass_green.properties     |    6 +
 .../glass_pane_green.properties               |    7 +
 .../minecraft/mcpatcher/ctm/default/14.png    |  Bin 0 -> 374 bytes
 .../mcpatcher/ctm/default/14_glass_red/0.png  |  Bin 0 -> 204 bytes
 .../mcpatcher/ctm/default/14_glass_red/1.png  |  Bin 0 -> 199 bytes
 .../mcpatcher/ctm/default/14_glass_red/10.png |  Bin 0 -> 177 bytes
 .../mcpatcher/ctm/default/14_glass_red/11.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/14_glass_red/16.png |  Bin 0 -> 201 bytes
 .../mcpatcher/ctm/default/14_glass_red/17.png |  Bin 0 -> 196 bytes
 .../mcpatcher/ctm/default/14_glass_red/18.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/14_glass_red/19.png |  Bin 0 -> 194 bytes
 .../mcpatcher/ctm/default/14_glass_red/2.png  |  Bin 0 -> 190 bytes
 .../mcpatcher/ctm/default/14_glass_red/20.png |  Bin 0 -> 195 bytes
 .../mcpatcher/ctm/default/14_glass_red/21.png |  Bin 0 -> 196 bytes
 .../mcpatcher/ctm/default/14_glass_red/22.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/14_glass_red/23.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/14_glass_red/24.png |  Bin 0 -> 179 bytes
 .../mcpatcher/ctm/default/14_glass_red/25.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/14_glass_red/26.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/14_glass_red/27.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/14_glass_red/3.png  |  Bin 0 -> 199 bytes
 .../mcpatcher/ctm/default/14_glass_red/32.png |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/14_glass_red/33.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/14_glass_red/34.png |  Bin 0 -> 171 bytes
 .../mcpatcher/ctm/default/14_glass_red/35.png |  Bin 0 -> 186 bytes
 .../mcpatcher/ctm/default/14_glass_red/36.png |  Bin 0 -> 190 bytes
 .../mcpatcher/ctm/default/14_glass_red/37.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/14_glass_red/38.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/14_glass_red/39.png |  Bin 0 -> 190 bytes
 .../mcpatcher/ctm/default/14_glass_red/4.png  |  Bin 0 -> 196 bytes
 .../mcpatcher/ctm/default/14_glass_red/40.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/14_glass_red/41.png |  Bin 0 -> 172 bytes
 .../mcpatcher/ctm/default/14_glass_red/42.png |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/14_glass_red/43.png |  Bin 0 -> 179 bytes
 .../mcpatcher/ctm/default/14_glass_red/48.png |  Bin 0 -> 202 bytes
 .../mcpatcher/ctm/default/14_glass_red/49.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/14_glass_red/5.png  |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/14_glass_red/50.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/14_glass_red/51.png |  Bin 0 -> 193 bytes
 .../mcpatcher/ctm/default/14_glass_red/52.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/14_glass_red/53.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/14_glass_red/54.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/14_glass_red/55.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/14_glass_red/56.png |  Bin 0 -> 177 bytes
 .../mcpatcher/ctm/default/14_glass_red/57.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/14_glass_red/58.png |  Bin 0 -> 179 bytes
 .../mcpatcher/ctm/default/14_glass_red/6.png  |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/14_glass_red/7.png  |  Bin 0 -> 190 bytes
 .../mcpatcher/ctm/default/14_glass_red/8.png  |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/14_glass_red/9.png  |  Bin 0 -> 179 bytes
 .../14_glass_red/glass_pane_red.properties    |    7 +
 .../default/14_glass_red/glass_red.properties |    6 +
 .../minecraft/mcpatcher/ctm/default/15.png    |  Bin 0 -> 375 bytes
 .../ctm/default/15_glass_black/0.png          |  Bin 0 -> 203 bytes
 .../ctm/default/15_glass_black/1.png          |  Bin 0 -> 198 bytes
 .../ctm/default/15_glass_black/10.png         |  Bin 0 -> 175 bytes
 .../ctm/default/15_glass_black/11.png         |  Bin 0 -> 171 bytes
 .../ctm/default/15_glass_black/16.png         |  Bin 0 -> 200 bytes
 .../ctm/default/15_glass_black/17.png         |  Bin 0 -> 194 bytes
 .../ctm/default/15_glass_black/18.png         |  Bin 0 -> 185 bytes
 .../ctm/default/15_glass_black/19.png         |  Bin 0 -> 193 bytes
 .../ctm/default/15_glass_black/2.png          |  Bin 0 -> 189 bytes
 .../ctm/default/15_glass_black/20.png         |  Bin 0 -> 195 bytes
 .../ctm/default/15_glass_black/21.png         |  Bin 0 -> 195 bytes
 .../ctm/default/15_glass_black/22.png         |  Bin 0 -> 187 bytes
 .../ctm/default/15_glass_black/23.png         |  Bin 0 -> 188 bytes
 .../ctm/default/15_glass_black/24.png         |  Bin 0 -> 178 bytes
 .../ctm/default/15_glass_black/25.png         |  Bin 0 -> 181 bytes
 .../ctm/default/15_glass_black/26.png         |  Bin 0 -> 179 bytes
 .../ctm/default/15_glass_black/27.png         |  Bin 0 -> 172 bytes
 .../ctm/default/15_glass_black/3.png          |  Bin 0 -> 198 bytes
 .../ctm/default/15_glass_black/32.png         |  Bin 0 -> 196 bytes
 .../ctm/default/15_glass_black/33.png         |  Bin 0 -> 183 bytes
 .../ctm/default/15_glass_black/34.png         |  Bin 0 -> 169 bytes
 .../ctm/default/15_glass_black/35.png         |  Bin 0 -> 185 bytes
 .../ctm/default/15_glass_black/36.png         |  Bin 0 -> 189 bytes
 .../ctm/default/15_glass_black/37.png         |  Bin 0 -> 186 bytes
 .../ctm/default/15_glass_black/38.png         |  Bin 0 -> 184 bytes
 .../ctm/default/15_glass_black/39.png         |  Bin 0 -> 189 bytes
 .../ctm/default/15_glass_black/4.png          |  Bin 0 -> 195 bytes
 .../ctm/default/15_glass_black/40.png         |  Bin 0 -> 171 bytes
 .../ctm/default/15_glass_black/41.png         |  Bin 0 -> 170 bytes
 .../ctm/default/15_glass_black/42.png         |  Bin 0 -> 173 bytes
 .../ctm/default/15_glass_black/43.png         |  Bin 0 -> 178 bytes
 .../ctm/default/15_glass_black/48.png         |  Bin 0 -> 201 bytes
 .../ctm/default/15_glass_black/49.png         |  Bin 0 -> 189 bytes
 .../ctm/default/15_glass_black/5.png          |  Bin 0 -> 195 bytes
 .../ctm/default/15_glass_black/50.png         |  Bin 0 -> 179 bytes
 .../ctm/default/15_glass_black/51.png         |  Bin 0 -> 193 bytes
 .../ctm/default/15_glass_black/52.png         |  Bin 0 -> 182 bytes
 .../ctm/default/15_glass_black/53.png         |  Bin 0 -> 187 bytes
 .../ctm/default/15_glass_black/54.png         |  Bin 0 -> 186 bytes
 .../ctm/default/15_glass_black/55.png         |  Bin 0 -> 191 bytes
 .../ctm/default/15_glass_black/56.png         |  Bin 0 -> 176 bytes
 .../ctm/default/15_glass_black/57.png         |  Bin 0 -> 173 bytes
 .../ctm/default/15_glass_black/58.png         |  Bin 0 -> 177 bytes
 .../ctm/default/15_glass_black/6.png          |  Bin 0 -> 189 bytes
 .../ctm/default/15_glass_black/7.png          |  Bin 0 -> 189 bytes
 .../ctm/default/15_glass_black/8.png          |  Bin 0 -> 173 bytes
 .../ctm/default/15_glass_black/9.png          |  Bin 0 -> 179 bytes
 .../15_glass_black/glass_black.properties     |    6 +
 .../glass_pane_black.properties               |    7 +
 .../minecraft/mcpatcher/ctm/default/16.png    |  Bin 0 -> 178 bytes
 .../minecraft/mcpatcher/ctm/default/17.png    |  Bin 0 -> 157 bytes
 .../minecraft/mcpatcher/ctm/default/18.png    |  Bin 0 -> 135 bytes
 .../minecraft/mcpatcher/ctm/default/19.png    |  Bin 0 -> 165 bytes
 .../ctm/default/1_glass_orange/0.png          |  Bin 0 -> 206 bytes
 .../ctm/default/1_glass_orange/1.png          |  Bin 0 -> 201 bytes
 .../ctm/default/1_glass_orange/10.png         |  Bin 0 -> 178 bytes
 .../ctm/default/1_glass_orange/11.png         |  Bin 0 -> 174 bytes
 .../ctm/default/1_glass_orange/16.png         |  Bin 0 -> 203 bytes
 .../ctm/default/1_glass_orange/17.png         |  Bin 0 -> 198 bytes
 .../ctm/default/1_glass_orange/18.png         |  Bin 0 -> 189 bytes
 .../ctm/default/1_glass_orange/19.png         |  Bin 0 -> 196 bytes
 .../ctm/default/1_glass_orange/2.png          |  Bin 0 -> 192 bytes
 .../ctm/default/1_glass_orange/20.png         |  Bin 0 -> 197 bytes
 .../ctm/default/1_glass_orange/21.png         |  Bin 0 -> 197 bytes
 .../ctm/default/1_glass_orange/22.png         |  Bin 0 -> 190 bytes
 .../ctm/default/1_glass_orange/23.png         |  Bin 0 -> 188 bytes
 .../ctm/default/1_glass_orange/24.png         |  Bin 0 -> 181 bytes
 .../ctm/default/1_glass_orange/25.png         |  Bin 0 -> 184 bytes
 .../ctm/default/1_glass_orange/26.png         |  Bin 0 -> 182 bytes
 .../ctm/default/1_glass_orange/27.png         |  Bin 0 -> 175 bytes
 .../ctm/default/1_glass_orange/3.png          |  Bin 0 -> 201 bytes
 .../ctm/default/1_glass_orange/32.png         |  Bin 0 -> 198 bytes
 .../ctm/default/1_glass_orange/33.png         |  Bin 0 -> 183 bytes
 .../ctm/default/1_glass_orange/34.png         |  Bin 0 -> 172 bytes
 .../ctm/default/1_glass_orange/35.png         |  Bin 0 -> 186 bytes
 .../ctm/default/1_glass_orange/36.png         |  Bin 0 -> 190 bytes
 .../ctm/default/1_glass_orange/37.png         |  Bin 0 -> 190 bytes
 .../ctm/default/1_glass_orange/38.png         |  Bin 0 -> 184 bytes
 .../ctm/default/1_glass_orange/39.png         |  Bin 0 -> 191 bytes
 .../ctm/default/1_glass_orange/4.png          |  Bin 0 -> 198 bytes
 .../ctm/default/1_glass_orange/40.png         |  Bin 0 -> 173 bytes
 .../ctm/default/1_glass_orange/41.png         |  Bin 0 -> 173 bytes
 .../ctm/default/1_glass_orange/42.png         |  Bin 0 -> 175 bytes
 .../ctm/default/1_glass_orange/43.png         |  Bin 0 -> 181 bytes
 .../ctm/default/1_glass_orange/48.png         |  Bin 0 -> 204 bytes
 .../ctm/default/1_glass_orange/49.png         |  Bin 0 -> 191 bytes
 .../ctm/default/1_glass_orange/5.png          |  Bin 0 -> 199 bytes
 .../ctm/default/1_glass_orange/50.png         |  Bin 0 -> 181 bytes
 .../ctm/default/1_glass_orange/51.png         |  Bin 0 -> 193 bytes
 .../ctm/default/1_glass_orange/52.png         |  Bin 0 -> 184 bytes
 .../ctm/default/1_glass_orange/53.png         |  Bin 0 -> 187 bytes
 .../ctm/default/1_glass_orange/54.png         |  Bin 0 -> 188 bytes
 .../ctm/default/1_glass_orange/55.png         |  Bin 0 -> 191 bytes
 .../ctm/default/1_glass_orange/56.png         |  Bin 0 -> 179 bytes
 .../ctm/default/1_glass_orange/57.png         |  Bin 0 -> 174 bytes
 .../ctm/default/1_glass_orange/58.png         |  Bin 0 -> 180 bytes
 .../ctm/default/1_glass_orange/6.png          |  Bin 0 -> 189 bytes
 .../ctm/default/1_glass_orange/7.png          |  Bin 0 -> 192 bytes
 .../ctm/default/1_glass_orange/8.png          |  Bin 0 -> 176 bytes
 .../ctm/default/1_glass_orange/9.png          |  Bin 0 -> 181 bytes
 .../1_glass_orange/glass_orange.properties    |    6 +
 .../glass_pane_orange.properties              |    7 +
 .../minecraft/mcpatcher/ctm/default/2.png     |  Bin 0 -> 148 bytes
 .../minecraft/mcpatcher/ctm/default/20.png    |  Bin 0 -> 162 bytes
 .../minecraft/mcpatcher/ctm/default/21.png    |  Bin 0 -> 167 bytes
 .../minecraft/mcpatcher/ctm/default/22.png    |  Bin 0 -> 141 bytes
 .../minecraft/mcpatcher/ctm/default/23.png    |  Bin 0 -> 160 bytes
 .../minecraft/mcpatcher/ctm/default/24.png    |  Bin 0 -> 128 bytes
 .../minecraft/mcpatcher/ctm/default/25.png    |  Bin 0 -> 128 bytes
 .../minecraft/mcpatcher/ctm/default/26.png    |  Bin 0 -> 127 bytes
 .../minecraft/mcpatcher/ctm/default/27.png    |  Bin 0 -> 125 bytes
 .../ctm/default/2_glass_magenta/0.png         |  Bin 0 -> 206 bytes
 .../ctm/default/2_glass_magenta/1.png         |  Bin 0 -> 201 bytes
 .../ctm/default/2_glass_magenta/10.png        |  Bin 0 -> 179 bytes
 .../ctm/default/2_glass_magenta/11.png        |  Bin 0 -> 175 bytes
 .../ctm/default/2_glass_magenta/16.png        |  Bin 0 -> 203 bytes
 .../ctm/default/2_glass_magenta/17.png        |  Bin 0 -> 197 bytes
 .../ctm/default/2_glass_magenta/18.png        |  Bin 0 -> 189 bytes
 .../ctm/default/2_glass_magenta/19.png        |  Bin 0 -> 196 bytes
 .../ctm/default/2_glass_magenta/2.png         |  Bin 0 -> 192 bytes
 .../ctm/default/2_glass_magenta/20.png        |  Bin 0 -> 198 bytes
 .../ctm/default/2_glass_magenta/21.png        |  Bin 0 -> 197 bytes
 .../ctm/default/2_glass_magenta/22.png        |  Bin 0 -> 190 bytes
 .../ctm/default/2_glass_magenta/23.png        |  Bin 0 -> 188 bytes
 .../ctm/default/2_glass_magenta/24.png        |  Bin 0 -> 181 bytes
 .../ctm/default/2_glass_magenta/25.png        |  Bin 0 -> 184 bytes
 .../ctm/default/2_glass_magenta/26.png        |  Bin 0 -> 183 bytes
 .../ctm/default/2_glass_magenta/27.png        |  Bin 0 -> 175 bytes
 .../ctm/default/2_glass_magenta/3.png         |  Bin 0 -> 201 bytes
 .../ctm/default/2_glass_magenta/32.png        |  Bin 0 -> 198 bytes
 .../ctm/default/2_glass_magenta/33.png        |  Bin 0 -> 183 bytes
 .../ctm/default/2_glass_magenta/34.png        |  Bin 0 -> 172 bytes
 .../ctm/default/2_glass_magenta/35.png        |  Bin 0 -> 186 bytes
 .../ctm/default/2_glass_magenta/36.png        |  Bin 0 -> 190 bytes
 .../ctm/default/2_glass_magenta/37.png        |  Bin 0 -> 190 bytes
 .../ctm/default/2_glass_magenta/38.png        |  Bin 0 -> 184 bytes
 .../ctm/default/2_glass_magenta/39.png        |  Bin 0 -> 192 bytes
 .../ctm/default/2_glass_magenta/4.png         |  Bin 0 -> 198 bytes
 .../ctm/default/2_glass_magenta/40.png        |  Bin 0 -> 173 bytes
 .../ctm/default/2_glass_magenta/41.png        |  Bin 0 -> 174 bytes
 .../ctm/default/2_glass_magenta/42.png        |  Bin 0 -> 176 bytes
 .../ctm/default/2_glass_magenta/43.png        |  Bin 0 -> 181 bytes
 .../ctm/default/2_glass_magenta/48.png        |  Bin 0 -> 204 bytes
 .../ctm/default/2_glass_magenta/49.png        |  Bin 0 -> 191 bytes
 .../ctm/default/2_glass_magenta/5.png         |  Bin 0 -> 198 bytes
 .../ctm/default/2_glass_magenta/50.png        |  Bin 0 -> 181 bytes
 .../ctm/default/2_glass_magenta/51.png        |  Bin 0 -> 193 bytes
 .../ctm/default/2_glass_magenta/52.png        |  Bin 0 -> 184 bytes
 .../ctm/default/2_glass_magenta/53.png        |  Bin 0 -> 187 bytes
 .../ctm/default/2_glass_magenta/54.png        |  Bin 0 -> 188 bytes
 .../ctm/default/2_glass_magenta/55.png        |  Bin 0 -> 191 bytes
 .../ctm/default/2_glass_magenta/56.png        |  Bin 0 -> 180 bytes
 .../ctm/default/2_glass_magenta/57.png        |  Bin 0 -> 174 bytes
 .../ctm/default/2_glass_magenta/58.png        |  Bin 0 -> 181 bytes
 .../ctm/default/2_glass_magenta/6.png         |  Bin 0 -> 189 bytes
 .../ctm/default/2_glass_magenta/7.png         |  Bin 0 -> 192 bytes
 .../ctm/default/2_glass_magenta/8.png         |  Bin 0 -> 177 bytes
 .../ctm/default/2_glass_magenta/9.png         |  Bin 0 -> 182 bytes
 .../2_glass_magenta/glass_magenta.properties  |    6 +
 .../glass_pane_magenta.properties             |    7 +
 .../minecraft/mcpatcher/ctm/default/3.png     |  Bin 0 -> 175 bytes
 .../minecraft/mcpatcher/ctm/default/32.png    |  Bin 0 -> 172 bytes
 .../minecraft/mcpatcher/ctm/default/33.png    |  Bin 0 -> 149 bytes
 .../minecraft/mcpatcher/ctm/default/34.png    |  Bin 0 -> 123 bytes
 .../minecraft/mcpatcher/ctm/default/35.png    |  Bin 0 -> 155 bytes
 .../minecraft/mcpatcher/ctm/default/36.png    |  Bin 0 -> 151 bytes
 .../minecraft/mcpatcher/ctm/default/37.png    |  Bin 0 -> 136 bytes
 .../minecraft/mcpatcher/ctm/default/38.png    |  Bin 0 -> 149 bytes
 .../minecraft/mcpatcher/ctm/default/39.png    |  Bin 0 -> 136 bytes
 .../ctm/default/3_glass_light_blue/0.png      |  Bin 0 -> 204 bytes
 .../ctm/default/3_glass_light_blue/1.png      |  Bin 0 -> 199 bytes
 .../ctm/default/3_glass_light_blue/10.png     |  Bin 0 -> 177 bytes
 .../ctm/default/3_glass_light_blue/11.png     |  Bin 0 -> 173 bytes
 .../ctm/default/3_glass_light_blue/16.png     |  Bin 0 -> 201 bytes
 .../ctm/default/3_glass_light_blue/17.png     |  Bin 0 -> 195 bytes
 .../ctm/default/3_glass_light_blue/18.png     |  Bin 0 -> 187 bytes
 .../ctm/default/3_glass_light_blue/19.png     |  Bin 0 -> 194 bytes
 .../ctm/default/3_glass_light_blue/2.png      |  Bin 0 -> 190 bytes
 .../ctm/default/3_glass_light_blue/20.png     |  Bin 0 -> 196 bytes
 .../ctm/default/3_glass_light_blue/21.png     |  Bin 0 -> 196 bytes
 .../ctm/default/3_glass_light_blue/22.png     |  Bin 0 -> 188 bytes
 .../ctm/default/3_glass_light_blue/23.png     |  Bin 0 -> 188 bytes
 .../ctm/default/3_glass_light_blue/24.png     |  Bin 0 -> 180 bytes
 .../ctm/default/3_glass_light_blue/25.png     |  Bin 0 -> 183 bytes
 .../ctm/default/3_glass_light_blue/26.png     |  Bin 0 -> 181 bytes
 .../ctm/default/3_glass_light_blue/27.png     |  Bin 0 -> 173 bytes
 .../ctm/default/3_glass_light_blue/3.png      |  Bin 0 -> 199 bytes
 .../ctm/default/3_glass_light_blue/32.png     |  Bin 0 -> 198 bytes
 .../ctm/default/3_glass_light_blue/33.png     |  Bin 0 -> 183 bytes
 .../ctm/default/3_glass_light_blue/34.png     |  Bin 0 -> 171 bytes
 .../ctm/default/3_glass_light_blue/35.png     |  Bin 0 -> 186 bytes
 .../ctm/default/3_glass_light_blue/36.png     |  Bin 0 -> 190 bytes
 .../ctm/default/3_glass_light_blue/37.png     |  Bin 0 -> 188 bytes
 .../ctm/default/3_glass_light_blue/38.png     |  Bin 0 -> 184 bytes
 .../ctm/default/3_glass_light_blue/39.png     |  Bin 0 -> 190 bytes
 .../ctm/default/3_glass_light_blue/4.png      |  Bin 0 -> 196 bytes
 .../ctm/default/3_glass_light_blue/40.png     |  Bin 0 -> 173 bytes
 .../ctm/default/3_glass_light_blue/41.png     |  Bin 0 -> 172 bytes
 .../ctm/default/3_glass_light_blue/42.png     |  Bin 0 -> 175 bytes
 .../ctm/default/3_glass_light_blue/43.png     |  Bin 0 -> 180 bytes
 .../ctm/default/3_glass_light_blue/48.png     |  Bin 0 -> 202 bytes
 .../ctm/default/3_glass_light_blue/49.png     |  Bin 0 -> 190 bytes
 .../ctm/default/3_glass_light_blue/5.png      |  Bin 0 -> 197 bytes
 .../ctm/default/3_glass_light_blue/50.png     |  Bin 0 -> 180 bytes
 .../ctm/default/3_glass_light_blue/51.png     |  Bin 0 -> 193 bytes
 .../ctm/default/3_glass_light_blue/52.png     |  Bin 0 -> 183 bytes
 .../ctm/default/3_glass_light_blue/53.png     |  Bin 0 -> 187 bytes
 .../ctm/default/3_glass_light_blue/54.png     |  Bin 0 -> 187 bytes
 .../ctm/default/3_glass_light_blue/55.png     |  Bin 0 -> 191 bytes
 .../ctm/default/3_glass_light_blue/56.png     |  Bin 0 -> 177 bytes
 .../ctm/default/3_glass_light_blue/57.png     |  Bin 0 -> 174 bytes
 .../ctm/default/3_glass_light_blue/58.png     |  Bin 0 -> 179 bytes
 .../ctm/default/3_glass_light_blue/6.png      |  Bin 0 -> 189 bytes
 .../ctm/default/3_glass_light_blue/7.png      |  Bin 0 -> 190 bytes
 .../ctm/default/3_glass_light_blue/8.png      |  Bin 0 -> 174 bytes
 .../ctm/default/3_glass_light_blue/9.png      |  Bin 0 -> 179 bytes
 .../glass_light_blue.properties               |    6 +
 .../glass_pane_light_blue.properties          |    7 +
 .../minecraft/mcpatcher/ctm/default/4.png     |  Bin 0 -> 157 bytes
 .../minecraft/mcpatcher/ctm/default/40.png    |  Bin 0 -> 124 bytes
 .../minecraft/mcpatcher/ctm/default/41.png    |  Bin 0 -> 124 bytes
 .../minecraft/mcpatcher/ctm/default/42.png    |  Bin 0 -> 125 bytes
 .../minecraft/mcpatcher/ctm/default/43.png    |  Bin 0 -> 126 bytes
 .../minecraft/mcpatcher/ctm/default/48.png    |  Bin 0 -> 277 bytes
 .../minecraft/mcpatcher/ctm/default/49.png    |  Bin 0 -> 159 bytes
 .../ctm/default/4_glass_yellow/0.png          |  Bin 0 -> 205 bytes
 .../ctm/default/4_glass_yellow/1.png          |  Bin 0 -> 200 bytes
 .../ctm/default/4_glass_yellow/10.png         |  Bin 0 -> 177 bytes
 .../ctm/default/4_glass_yellow/11.png         |  Bin 0 -> 173 bytes
 .../ctm/default/4_glass_yellow/16.png         |  Bin 0 -> 202 bytes
 .../ctm/default/4_glass_yellow/17.png         |  Bin 0 -> 196 bytes
 .../ctm/default/4_glass_yellow/18.png         |  Bin 0 -> 188 bytes
 .../ctm/default/4_glass_yellow/19.png         |  Bin 0 -> 195 bytes
 .../ctm/default/4_glass_yellow/2.png          |  Bin 0 -> 191 bytes
 .../ctm/default/4_glass_yellow/20.png         |  Bin 0 -> 196 bytes
 .../ctm/default/4_glass_yellow/21.png         |  Bin 0 -> 197 bytes
 .../ctm/default/4_glass_yellow/22.png         |  Bin 0 -> 189 bytes
 .../ctm/default/4_glass_yellow/23.png         |  Bin 0 -> 188 bytes
 .../ctm/default/4_glass_yellow/24.png         |  Bin 0 -> 180 bytes
 .../ctm/default/4_glass_yellow/25.png         |  Bin 0 -> 183 bytes
 .../ctm/default/4_glass_yellow/26.png         |  Bin 0 -> 181 bytes
 .../ctm/default/4_glass_yellow/27.png         |  Bin 0 -> 174 bytes
 .../ctm/default/4_glass_yellow/3.png          |  Bin 0 -> 200 bytes
 .../ctm/default/4_glass_yellow/32.png         |  Bin 0 -> 198 bytes
 .../ctm/default/4_glass_yellow/33.png         |  Bin 0 -> 183 bytes
 .../ctm/default/4_glass_yellow/34.png         |  Bin 0 -> 171 bytes
 .../ctm/default/4_glass_yellow/35.png         |  Bin 0 -> 186 bytes
 .../ctm/default/4_glass_yellow/36.png         |  Bin 0 -> 190 bytes
 .../ctm/default/4_glass_yellow/37.png         |  Bin 0 -> 189 bytes
 .../ctm/default/4_glass_yellow/38.png         |  Bin 0 -> 184 bytes
 .../ctm/default/4_glass_yellow/39.png         |  Bin 0 -> 191 bytes
 .../ctm/default/4_glass_yellow/4.png          |  Bin 0 -> 197 bytes
 .../ctm/default/4_glass_yellow/40.png         |  Bin 0 -> 173 bytes
 .../ctm/default/4_glass_yellow/41.png         |  Bin 0 -> 173 bytes
 .../ctm/default/4_glass_yellow/42.png         |  Bin 0 -> 176 bytes
 .../ctm/default/4_glass_yellow/43.png         |  Bin 0 -> 180 bytes
 .../ctm/default/4_glass_yellow/48.png         |  Bin 0 -> 203 bytes
 .../ctm/default/4_glass_yellow/49.png         |  Bin 0 -> 191 bytes
 .../ctm/default/4_glass_yellow/5.png          |  Bin 0 -> 197 bytes
 .../ctm/default/4_glass_yellow/50.png         |  Bin 0 -> 181 bytes
 .../ctm/default/4_glass_yellow/51.png         |  Bin 0 -> 193 bytes
 .../ctm/default/4_glass_yellow/52.png         |  Bin 0 -> 184 bytes
 .../ctm/default/4_glass_yellow/53.png         |  Bin 0 -> 187 bytes
 .../ctm/default/4_glass_yellow/54.png         |  Bin 0 -> 188 bytes
 .../ctm/default/4_glass_yellow/55.png         |  Bin 0 -> 191 bytes
 .../ctm/default/4_glass_yellow/56.png         |  Bin 0 -> 178 bytes
 .../ctm/default/4_glass_yellow/57.png         |  Bin 0 -> 174 bytes
 .../ctm/default/4_glass_yellow/58.png         |  Bin 0 -> 179 bytes
 .../ctm/default/4_glass_yellow/6.png          |  Bin 0 -> 189 bytes
 .../ctm/default/4_glass_yellow/7.png          |  Bin 0 -> 191 bytes
 .../ctm/default/4_glass_yellow/8.png          |  Bin 0 -> 175 bytes
 .../ctm/default/4_glass_yellow/9.png          |  Bin 0 -> 180 bytes
 .../glass_pane_yellow.properties              |    7 +
 .../4_glass_yellow/glass_yellow.properties    |    6 +
 .../minecraft/mcpatcher/ctm/default/5.png     |  Bin 0 -> 167 bytes
 .../minecraft/mcpatcher/ctm/default/50.png    |  Bin 0 -> 137 bytes
 .../minecraft/mcpatcher/ctm/default/51.png    |  Bin 0 -> 164 bytes
 .../minecraft/mcpatcher/ctm/default/52.png    |  Bin 0 -> 137 bytes
 .../minecraft/mcpatcher/ctm/default/53.png    |  Bin 0 -> 157 bytes
 .../minecraft/mcpatcher/ctm/default/54.png    |  Bin 0 -> 138 bytes
 .../minecraft/mcpatcher/ctm/default/55.png    |  Bin 0 -> 158 bytes
 .../minecraft/mcpatcher/ctm/default/56.png    |  Bin 0 -> 125 bytes
 .../minecraft/mcpatcher/ctm/default/57.png    |  Bin 0 -> 124 bytes
 .../minecraft/mcpatcher/ctm/default/58.png    |  Bin 0 -> 130 bytes
 .../mcpatcher/ctm/default/5_glass_lime/0.png  |  Bin 0 -> 206 bytes
 .../mcpatcher/ctm/default/5_glass_lime/1.png  |  Bin 0 -> 200 bytes
 .../mcpatcher/ctm/default/5_glass_lime/10.png |  Bin 0 -> 177 bytes
 .../mcpatcher/ctm/default/5_glass_lime/11.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/5_glass_lime/16.png |  Bin 0 -> 203 bytes
 .../mcpatcher/ctm/default/5_glass_lime/17.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/5_glass_lime/18.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/5_glass_lime/19.png |  Bin 0 -> 196 bytes
 .../mcpatcher/ctm/default/5_glass_lime/2.png  |  Bin 0 -> 192 bytes
 .../mcpatcher/ctm/default/5_glass_lime/20.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/5_glass_lime/21.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/5_glass_lime/22.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/5_glass_lime/23.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/5_glass_lime/24.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/5_glass_lime/25.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/5_glass_lime/26.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/5_glass_lime/27.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/5_glass_lime/3.png  |  Bin 0 -> 201 bytes
 .../mcpatcher/ctm/default/5_glass_lime/32.png |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/5_glass_lime/33.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/5_glass_lime/34.png |  Bin 0 -> 172 bytes
 .../mcpatcher/ctm/default/5_glass_lime/35.png |  Bin 0 -> 186 bytes
 .../mcpatcher/ctm/default/5_glass_lime/36.png |  Bin 0 -> 190 bytes
 .../mcpatcher/ctm/default/5_glass_lime/37.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/5_glass_lime/38.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/5_glass_lime/39.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/5_glass_lime/4.png  |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/5_glass_lime/40.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/5_glass_lime/41.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/5_glass_lime/42.png |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/5_glass_lime/43.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/5_glass_lime/48.png |  Bin 0 -> 204 bytes
 .../mcpatcher/ctm/default/5_glass_lime/49.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/5_glass_lime/5.png  |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/5_glass_lime/50.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/5_glass_lime/51.png |  Bin 0 -> 193 bytes
 .../mcpatcher/ctm/default/5_glass_lime/52.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/5_glass_lime/53.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/5_glass_lime/54.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/5_glass_lime/55.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/5_glass_lime/56.png |  Bin 0 -> 178 bytes
 .../mcpatcher/ctm/default/5_glass_lime/57.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/5_glass_lime/58.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/5_glass_lime/6.png  |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/5_glass_lime/7.png  |  Bin 0 -> 192 bytes
 .../mcpatcher/ctm/default/5_glass_lime/8.png  |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/5_glass_lime/9.png  |  Bin 0 -> 180 bytes
 .../5_glass_lime/glass_lime.properties        |    6 +
 .../5_glass_lime/glass_pane_lime.properties   |    7 +
 .../minecraft/mcpatcher/ctm/default/6.png     |  Bin 0 -> 152 bytes
 .../minecraft/mcpatcher/ctm/default/66.png    |  Bin 0 -> 668 bytes
 .../mcpatcher/ctm/default/6_glass_pink/0.png  |  Bin 0 -> 206 bytes
 .../mcpatcher/ctm/default/6_glass_pink/1.png  |  Bin 0 -> 200 bytes
 .../mcpatcher/ctm/default/6_glass_pink/10.png |  Bin 0 -> 178 bytes
 .../mcpatcher/ctm/default/6_glass_pink/11.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/6_glass_pink/16.png |  Bin 0 -> 203 bytes
 .../mcpatcher/ctm/default/6_glass_pink/17.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/6_glass_pink/18.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/6_glass_pink/19.png |  Bin 0 -> 195 bytes
 .../mcpatcher/ctm/default/6_glass_pink/2.png  |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/6_glass_pink/20.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/6_glass_pink/21.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/6_glass_pink/22.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/6_glass_pink/23.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/6_glass_pink/24.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/6_glass_pink/25.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/6_glass_pink/26.png |  Bin 0 -> 182 bytes
 .../mcpatcher/ctm/default/6_glass_pink/27.png |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/6_glass_pink/3.png  |  Bin 0 -> 200 bytes
 .../mcpatcher/ctm/default/6_glass_pink/32.png |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/6_glass_pink/33.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/6_glass_pink/34.png |  Bin 0 -> 172 bytes
 .../mcpatcher/ctm/default/6_glass_pink/35.png |  Bin 0 -> 186 bytes
 .../mcpatcher/ctm/default/6_glass_pink/36.png |  Bin 0 -> 190 bytes
 .../mcpatcher/ctm/default/6_glass_pink/37.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/6_glass_pink/38.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/6_glass_pink/39.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/6_glass_pink/4.png  |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/6_glass_pink/40.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/6_glass_pink/41.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/6_glass_pink/42.png |  Bin 0 -> 176 bytes
 .../mcpatcher/ctm/default/6_glass_pink/43.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/6_glass_pink/48.png |  Bin 0 -> 203 bytes
 .../mcpatcher/ctm/default/6_glass_pink/49.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/6_glass_pink/5.png  |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/6_glass_pink/50.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/6_glass_pink/51.png |  Bin 0 -> 193 bytes
 .../mcpatcher/ctm/default/6_glass_pink/52.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/6_glass_pink/53.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/6_glass_pink/54.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/6_glass_pink/55.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/6_glass_pink/56.png |  Bin 0 -> 179 bytes
 .../mcpatcher/ctm/default/6_glass_pink/57.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/6_glass_pink/58.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/6_glass_pink/6.png  |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/6_glass_pink/7.png  |  Bin 0 -> 192 bytes
 .../mcpatcher/ctm/default/6_glass_pink/8.png  |  Bin 0 -> 176 bytes
 .../mcpatcher/ctm/default/6_glass_pink/9.png  |  Bin 0 -> 181 bytes
 .../6_glass_pink/glass_pane_pink.properties   |    7 +
 .../6_glass_pink/glass_pink.properties        |    6 +
 .../minecraft/mcpatcher/ctm/default/7.png     |  Bin 0 -> 138 bytes
 .../mcpatcher/ctm/default/7_glass_gray/0.png  |  Bin 0 -> 203 bytes
 .../mcpatcher/ctm/default/7_glass_gray/1.png  |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/7_glass_gray/10.png |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/7_glass_gray/11.png |  Bin 0 -> 171 bytes
 .../mcpatcher/ctm/default/7_glass_gray/16.png |  Bin 0 -> 200 bytes
 .../mcpatcher/ctm/default/7_glass_gray/17.png |  Bin 0 -> 194 bytes
 .../mcpatcher/ctm/default/7_glass_gray/18.png |  Bin 0 -> 185 bytes
 .../mcpatcher/ctm/default/7_glass_gray/19.png |  Bin 0 -> 193 bytes
 .../mcpatcher/ctm/default/7_glass_gray/2.png  |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/7_glass_gray/20.png |  Bin 0 -> 195 bytes
 .../mcpatcher/ctm/default/7_glass_gray/21.png |  Bin 0 -> 195 bytes
 .../mcpatcher/ctm/default/7_glass_gray/22.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/7_glass_gray/23.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/7_glass_gray/24.png |  Bin 0 -> 178 bytes
 .../mcpatcher/ctm/default/7_glass_gray/25.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/7_glass_gray/26.png |  Bin 0 -> 179 bytes
 .../mcpatcher/ctm/default/7_glass_gray/27.png |  Bin 0 -> 172 bytes
 .../mcpatcher/ctm/default/7_glass_gray/3.png  |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/7_glass_gray/32.png |  Bin 0 -> 196 bytes
 .../mcpatcher/ctm/default/7_glass_gray/33.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/7_glass_gray/34.png |  Bin 0 -> 169 bytes
 .../mcpatcher/ctm/default/7_glass_gray/35.png |  Bin 0 -> 185 bytes
 .../mcpatcher/ctm/default/7_glass_gray/36.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/7_glass_gray/37.png |  Bin 0 -> 186 bytes
 .../mcpatcher/ctm/default/7_glass_gray/38.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/7_glass_gray/39.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/7_glass_gray/4.png  |  Bin 0 -> 195 bytes
 .../mcpatcher/ctm/default/7_glass_gray/40.png |  Bin 0 -> 171 bytes
 .../mcpatcher/ctm/default/7_glass_gray/41.png |  Bin 0 -> 170 bytes
 .../mcpatcher/ctm/default/7_glass_gray/42.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/7_glass_gray/43.png |  Bin 0 -> 178 bytes
 .../mcpatcher/ctm/default/7_glass_gray/48.png |  Bin 0 -> 201 bytes
 .../mcpatcher/ctm/default/7_glass_gray/49.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/7_glass_gray/5.png  |  Bin 0 -> 195 bytes
 .../mcpatcher/ctm/default/7_glass_gray/50.png |  Bin 0 -> 179 bytes
 .../mcpatcher/ctm/default/7_glass_gray/51.png |  Bin 0 -> 193 bytes
 .../mcpatcher/ctm/default/7_glass_gray/52.png |  Bin 0 -> 182 bytes
 .../mcpatcher/ctm/default/7_glass_gray/53.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/7_glass_gray/54.png |  Bin 0 -> 186 bytes
 .../mcpatcher/ctm/default/7_glass_gray/55.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/7_glass_gray/56.png |  Bin 0 -> 176 bytes
 .../mcpatcher/ctm/default/7_glass_gray/57.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/7_glass_gray/58.png |  Bin 0 -> 177 bytes
 .../mcpatcher/ctm/default/7_glass_gray/6.png  |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/7_glass_gray/7.png  |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/7_glass_gray/8.png  |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/7_glass_gray/9.png  |  Bin 0 -> 179 bytes
 .../7_glass_gray/glass_gray.properties        |    6 +
 .../7_glass_gray/glass_pane_gray.properties   |    7 +
 .../minecraft/mcpatcher/ctm/default/8.png     |  Bin 0 -> 127 bytes
 .../ctm/default/8_glass_silver/0.png          |  Bin 0 -> 202 bytes
 .../ctm/default/8_glass_silver/1.png          |  Bin 0 -> 197 bytes
 .../ctm/default/8_glass_silver/10.png         |  Bin 0 -> 174 bytes
 .../ctm/default/8_glass_silver/11.png         |  Bin 0 -> 171 bytes
 .../ctm/default/8_glass_silver/16.png         |  Bin 0 -> 200 bytes
 .../ctm/default/8_glass_silver/17.png         |  Bin 0 -> 193 bytes
 .../ctm/default/8_glass_silver/18.png         |  Bin 0 -> 185 bytes
 .../ctm/default/8_glass_silver/19.png         |  Bin 0 -> 192 bytes
 .../ctm/default/8_glass_silver/2.png          |  Bin 0 -> 188 bytes
 .../ctm/default/8_glass_silver/20.png         |  Bin 0 -> 194 bytes
 .../ctm/default/8_glass_silver/21.png         |  Bin 0 -> 194 bytes
 .../ctm/default/8_glass_silver/22.png         |  Bin 0 -> 186 bytes
 .../ctm/default/8_glass_silver/23.png         |  Bin 0 -> 188 bytes
 .../ctm/default/8_glass_silver/24.png         |  Bin 0 -> 177 bytes
 .../ctm/default/8_glass_silver/25.png         |  Bin 0 -> 181 bytes
 .../ctm/default/8_glass_silver/26.png         |  Bin 0 -> 179 bytes
 .../ctm/default/8_glass_silver/27.png         |  Bin 0 -> 171 bytes
 .../ctm/default/8_glass_silver/3.png          |  Bin 0 -> 197 bytes
 .../ctm/default/8_glass_silver/32.png         |  Bin 0 -> 196 bytes
 .../ctm/default/8_glass_silver/33.png         |  Bin 0 -> 183 bytes
 .../ctm/default/8_glass_silver/34.png         |  Bin 0 -> 168 bytes
 .../ctm/default/8_glass_silver/35.png         |  Bin 0 -> 186 bytes
 .../ctm/default/8_glass_silver/36.png         |  Bin 0 -> 188 bytes
 .../ctm/default/8_glass_silver/37.png         |  Bin 0 -> 186 bytes
 .../ctm/default/8_glass_silver/38.png         |  Bin 0 -> 184 bytes
 .../ctm/default/8_glass_silver/39.png         |  Bin 0 -> 188 bytes
 .../ctm/default/8_glass_silver/4.png          |  Bin 0 -> 194 bytes
 .../ctm/default/8_glass_silver/40.png         |  Bin 0 -> 171 bytes
 .../ctm/default/8_glass_silver/41.png         |  Bin 0 -> 170 bytes
 .../ctm/default/8_glass_silver/42.png         |  Bin 0 -> 173 bytes
 .../ctm/default/8_glass_silver/43.png         |  Bin 0 -> 177 bytes
 .../ctm/default/8_glass_silver/48.png         |  Bin 0 -> 200 bytes
 .../ctm/default/8_glass_silver/49.png         |  Bin 0 -> 188 bytes
 .../ctm/default/8_glass_silver/5.png          |  Bin 0 -> 194 bytes
 .../ctm/default/8_glass_silver/50.png         |  Bin 0 -> 178 bytes
 .../ctm/default/8_glass_silver/51.png         |  Bin 0 -> 192 bytes
 .../ctm/default/8_glass_silver/52.png         |  Bin 0 -> 181 bytes
 .../ctm/default/8_glass_silver/53.png         |  Bin 0 -> 187 bytes
 .../ctm/default/8_glass_silver/54.png         |  Bin 0 -> 185 bytes
 .../ctm/default/8_glass_silver/55.png         |  Bin 0 -> 191 bytes
 .../ctm/default/8_glass_silver/56.png         |  Bin 0 -> 176 bytes
 .../ctm/default/8_glass_silver/57.png         |  Bin 0 -> 172 bytes
 .../ctm/default/8_glass_silver/58.png         |  Bin 0 -> 177 bytes
 .../ctm/default/8_glass_silver/6.png          |  Bin 0 -> 188 bytes
 .../ctm/default/8_glass_silver/7.png          |  Bin 0 -> 188 bytes
 .../ctm/default/8_glass_silver/8.png          |  Bin 0 -> 172 bytes
 .../ctm/default/8_glass_silver/9.png          |  Bin 0 -> 178 bytes
 .../glass_pane_silver.properties              |    7 +
 .../8_glass_silver/glass_silver.properties    |    6 +
 .../minecraft/mcpatcher/ctm/default/9.png     |  Bin 0 -> 128 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/0.png  |  Bin 0 -> 205 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/1.png  |  Bin 0 -> 200 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/10.png |  Bin 0 -> 177 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/11.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/16.png |  Bin 0 -> 203 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/17.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/18.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/19.png |  Bin 0 -> 195 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/2.png  |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/20.png |  Bin 0 -> 196 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/21.png |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/22.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/23.png |  Bin 0 -> 188 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/24.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/25.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/26.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/27.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/3.png  |  Bin 0 -> 200 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/32.png |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/33.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/34.png |  Bin 0 -> 172 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/35.png |  Bin 0 -> 186 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/36.png |  Bin 0 -> 190 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/37.png |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/38.png |  Bin 0 -> 184 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/39.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/4.png  |  Bin 0 -> 197 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/40.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/41.png |  Bin 0 -> 173 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/42.png |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/43.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/48.png |  Bin 0 -> 203 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/49.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/5.png  |  Bin 0 -> 198 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/50.png |  Bin 0 -> 181 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/51.png |  Bin 0 -> 193 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/52.png |  Bin 0 -> 183 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/53.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/54.png |  Bin 0 -> 187 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/55.png |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/56.png |  Bin 0 -> 178 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/57.png |  Bin 0 -> 174 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/58.png |  Bin 0 -> 180 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/6.png  |  Bin 0 -> 189 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/7.png  |  Bin 0 -> 191 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/8.png  |  Bin 0 -> 175 bytes
 .../mcpatcher/ctm/default/9_glass_cyan/9.png  |  Bin 0 -> 180 bytes
 .../9_glass_cyan/glass_cyan.properties        |    6 +
 .../9_glass_cyan/glass_pane_cyan.properties   |    7 +
 .../ctm/default/bookshelf.properties          |    7 +
 .../minecraft/mcpatcher/ctm/default/empty.png |  Bin 0 -> 133 bytes
 .../mcpatcher/ctm/default/glass.properties    |    6 +
 .../ctm/default/glasspane.properties          |    7 +
 .../ctm/default/sandstone.properties          |    7 +
 .../optifine/_property_files_index.json       |   41 +
 .../minecraft/optifine/bettergrass.properties |   33 +
 .../wasm_gc_teavm/javascript/epw_meta.txt     |    6 +-
 .../v1_8/internal/OpenGLObjects.java          |   18 +
 .../v1_8/internal/PlatformInput.java          |   13 +-
 .../v1_8/internal/teavm/ClientMain.java       |    5 +-
 .../v1_8/internal/OpenGLObjects.java          |   18 +
 .../js/clientPlatformSingleplayer.js          |   10 +-
 sources/wasm-gc-teavm/js/platformInput.js     |   13 +-
 1056 files changed, 17706 insertions(+), 898 deletions(-)
 create mode 100644 patches/minecraft/net/minecraft/world/EnumSkyBlock.edit.java
 create mode 100644 patches/minecraft/net/minecraft/world/chunk/storage/ExtendedBlockStorage.edit.java
 create mode 100644 patches/minecraft/net/minecraft/world/gen/ChunkProviderDebug.edit.java
 create mode 100644 patches/resources/assets/minecraft/blockstates/black_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/blue_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/brown_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/cyan_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/gray_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/green_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/light_blue_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/lime_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/magenta_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/orange_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/pink_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/purple_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/red_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/silver_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/white_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/blockstates/yellow_stained_glass_pane.edit.json
 create mode 100644 patches/resources/assets/minecraft/models/block/pane_n.edit.json
 create mode 100644 patches/resources/assets/minecraft/models/block/pane_ne.edit.json
 create mode 100644 patches/resources/assets/minecraft/models/block/pane_ns.edit.json
 create mode 100644 patches/resources/assets/minecraft/models/block/pane_nse.edit.json
 create mode 100644 sources/main/java/dev/redstudio/alfheim/lighting/LightingEngine.java
 create mode 100644 sources/main/java/dev/redstudio/alfheim/utils/DeduplicatedLongQueue.java
 create mode 100644 sources/main/java/dev/redstudio/alfheim/utils/EnumBoundaryFacing.java
 create mode 100644 sources/main/java/dev/redstudio/alfheim/utils/WorldChunkSlice.java
 create mode 100644 sources/main/java/dev/redstudio/redcore/math/ClampUtil.java
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/BMPSet.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/CharTrie.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/CharacterIteratorWrapper.java (97%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/ICUBinary.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/Norm2AllModes.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/NormalizerImpl.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/Punycode.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/ReplaceableUCharacterIterator.java (96%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/StringPrepDataReader.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/Trie.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/Trie2.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/Trie2_16.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/UBiDiProps.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/UCharacterProperty.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/UnicodeSetStringSpan.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/impl/Utility.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/lang/UCharacter.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/lang/UCharacterDirection.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/lang/UCharacterEnums.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/BidiBase.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/BidiLine.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/BidiRun.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/BidiWriter.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/FilteredNormalizer2.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/Normalizer2.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/NormalizerBase.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/Replaceable.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/ReplaceableString.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/StringPrep.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/UCharacterIterator.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/UTF16.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/text/UnicodeSet.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/util/CodePointMap.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/util/CodePointTrie.java (99%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/util/OutputInt.java (98%)
 rename sources/main/java/jdk_internal/{bidi => }/icu/util/VersionInfo.java (99%)
 create mode 100644 sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglerProperties.java
 create mode 100644 sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/ResourceIndex.java
 create mode 100644 sources/main/java/net/optifine/BetterGrass.java
 create mode 100644 sources/main/java/net/optifine/BetterSnow.java
 create mode 100644 sources/main/java/net/optifine/BlockDir.java
 create mode 100644 sources/main/java/net/optifine/Config.java
 create mode 100644 sources/main/java/net/optifine/ConnectedProperties.java
 create mode 100644 sources/main/java/net/optifine/ConnectedTextures.java
 create mode 100644 sources/main/java/net/optifine/ConnectedTexturesCompact.java
 create mode 100644 sources/main/java/net/optifine/CustomItemProperties.java
 create mode 100644 sources/main/java/net/optifine/CustomItems.java
 create mode 100644 sources/main/java/net/optifine/CustomItemsComparator.java
 create mode 100644 sources/main/java/net/optifine/CustomSky.java
 create mode 100644 sources/main/java/net/optifine/CustomSkyLayer.java
 create mode 100644 sources/main/java/net/optifine/SmartLeaves.java
 create mode 100644 sources/main/java/net/optifine/config/ConnectedParser.java
 create mode 100644 sources/main/java/net/optifine/config/GlVersion.java
 create mode 100644 sources/main/java/net/optifine/config/INameGetter.java
 create mode 100644 sources/main/java/net/optifine/config/IObjectLocator.java
 create mode 100644 sources/main/java/net/optifine/config/IParserInt.java
 create mode 100644 sources/main/java/net/optifine/config/ItemLocator.java
 create mode 100644 sources/main/java/net/optifine/config/MatchBlock.java
 create mode 100644 sources/main/java/net/optifine/config/Matches.java
 create mode 100644 sources/main/java/net/optifine/config/NbtTagValue.java
 create mode 100644 sources/main/java/net/optifine/config/ParserEnchantmentId.java
 create mode 100644 sources/main/java/net/optifine/config/RangeInt.java
 create mode 100644 sources/main/java/net/optifine/config/RangeListInt.java
 create mode 100644 sources/main/java/net/optifine/config/Weather.java
 create mode 100644 sources/main/java/net/optifine/model/BlockModelCustomizer.java
 create mode 100644 sources/main/java/net/optifine/model/BlockModelUtils.java
 create mode 100644 sources/main/java/net/optifine/model/ListQuadsOverlay.java
 create mode 100644 sources/main/java/net/optifine/model/ModelUtils.java
 create mode 100644 sources/main/java/net/optifine/model/QuadBounds.java
 create mode 100644 sources/main/java/net/optifine/render/Blender.java
 create mode 100644 sources/main/java/net/optifine/render/RenderEnv.java
 create mode 100644 sources/main/java/net/optifine/util/CounterInt.java
 create mode 100644 sources/main/java/net/optifine/util/MathUtils.java
 create mode 100644 sources/main/java/net/optifine/util/NumUtils.java
 create mode 100644 sources/main/java/net/optifine/util/PropertiesOrdered.java
 create mode 100644 sources/main/java/net/optifine/util/ResUtils.java
 create mode 100644 sources/main/java/net/optifine/util/SmoothFloat.java
 create mode 100644 sources/main/java/net/optifine/util/StrUtils.java
 create mode 100644 sources/main/java/net/optifine/util/TextureUtils.java
 create mode 100644 sources/main/java/net/optifine/util/TileEntityUtils.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/StringEscapeUtils.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/AggregateTranslator.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/CodePointTranslator.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/EntityArrays.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/JavaUnicodeEscaper.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityEscaper.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaper.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnescaper.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemover.java
 create mode 100644 sources/main/java/org/apache/commons/lang3/text/translate/package-info.java
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_pane_white.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_white.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_pane_purple.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_purple.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_blue.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_pane_blue.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_brown.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_pane_brown.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_green.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_pane_green.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_pane_red.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_red.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_black.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_pane_black.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_orange.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_pane_orange.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_magenta.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_pane_magenta.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_light_blue.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_pane_light_blue.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_pane_yellow.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_yellow.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_lime.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_pane_lime.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/66.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pane_pink.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pink.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_gray.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_pane_gray.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_pane_silver.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_silver.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/0.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/1.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/10.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/11.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/16.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/17.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/18.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/19.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/2.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/20.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/21.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/22.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/23.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/24.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/25.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/26.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/27.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/3.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/32.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/33.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/34.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/35.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/36.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/37.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/38.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/39.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/4.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/40.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/41.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/42.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/43.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/48.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/49.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/5.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/50.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/51.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/52.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/53.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/54.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/55.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/56.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/57.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/58.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/6.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/7.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/8.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/9.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_cyan.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_pane_cyan.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/bookshelf.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/empty.png
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/glass.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/glasspane.properties
 create mode 100644 sources/resources/assets/minecraft/mcpatcher/ctm/default/sandstone.properties
 create mode 100644 sources/resources/assets/minecraft/optifine/_property_files_index.json
 create mode 100644 sources/resources/assets/minecraft/optifine/bettergrass.properties

diff --git a/CREDITS b/CREDITS
index e72e0d4c..e2987d11 100644
--- a/CREDITS
+++ b/CREDITS
@@ -239,6 +239,58 @@
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
+ Project Name: Alfheim
+ Project Author: Red Studio
+ Project URL: https://github.com/Red-Studio-Ragnarok/Alfheim
+ 
+ Used For: Optimized lighting engine
+ 
+ * MIT License
+ *
+ * Copyright (c) 2023 Red Studio
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ 
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 
+ Project Name: OptiFine (1.8.9_HD_U_M6)
+ Project Author: sp614x
+ Project URL: https://optifine.net/
+ 
+ Used For: A few, limited portions we "borrowed" without the author's permission
+ 
+ Note: Eaglercraft is not OptiFine, we only use the code for connected textures
+       and maintaining compatibility with certain resource pack features
+ 
+ * The mod OptiFine is Copyright © 2011-2021 by sp614x and the intellectual
+ * property of the author.
+ * It may be not be reproduced under any circumstances except for personal,
+ * private use as long as it remains in its unaltered, unedited form.
+ * It may not be placed on any web site or otherwise distributed publicly
+ * without advance written permission.
+ * Use of this mod on any other website or as a part of any public display
+ * is strictly prohibited and a violation of copyright.
+ 
+ (sorry sp614x)
+ 
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 
  Project Name: Google Guava
  Project Author: Google
  Project URL: https://github.com/google/guava
diff --git a/client_version b/client_version
index 503c4b5b..ddc35e29 100644
--- a/client_version
+++ b/client_version
@@ -1 +1 @@
-u47
\ No newline at end of file
+u48
\ No newline at end of file
diff --git a/patches/minecraft/net/minecraft/block/Block.edit.java b/patches/minecraft/net/minecraft/block/Block.edit.java
index 4d942cde..79a0d980 100644
--- a/patches/minecraft/net/minecraft/block/Block.edit.java
+++ b/patches/minecraft/net/minecraft/block/Block.edit.java
@@ -5,12 +5,17 @@
 # Version: 1.0
 # Author: lax1dude
 
-> CHANGE  3 : 5  @  3 : 135
+> CHANGE  3 : 6  @  3 : 135
 
+~ 
 ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom;
 ~ 
 
-> CHANGE  354 : 355  @  354 : 355
+> INSERT  27 : 28  @  27
+
++ import net.minecraft.world.EnumSkyBlock;
+
+> CHANGE  327 : 328  @  327 : 328
 
 ~ 	public void randomTick(World world, BlockPos blockpos, IBlockState iblockstate, EaglercraftRandom random) {
 
@@ -85,11 +90,49 @@
 + 	}
 + 
 
-> INSERT  43 : 47  @  43
+> INSERT  43 : 85  @  43
 
 + 
 + 	public boolean eaglerShadersShouldRenderGlassHighlights() {
 + 		return false;
 + 	}
++ 
++ 	public int alfheim$getLightFor(final IBlockState blockState, final IBlockAccess blockAccess,
++ 			final EnumSkyBlock lightType, final BlockPos blockPos) {
++ 		int lightLevel = blockAccess.getLightFor(lightType, blockPos);
++ 
++ 		if (lightLevel == 15)
++ 			return lightLevel;
++ 
++ 		if (!getUseNeighborBrightness())
++ 			return lightLevel;
++ 
++ 		BlockPos tmp = new BlockPos();
++ 		EnumFacing[] facings = EnumFacing._VALUES;
++ 		for (int i = 0, l = facings.length; i < l; ++i) {
++ 			EnumFacing facing = facings[i];
++ 			if (alfheim$useNeighborBrightness(blockState, facing, blockAccess, blockPos)) {
++ 				int opacity = 0;
++ 				final int neighborLightLevel = blockAccess.getLightFor(lightType,
++ 						blockPos.offsetEvenFaster(facing, tmp));
++ 
++ 				if (opacity == 0
++ 						&& (lightType != EnumSkyBlock.SKY || neighborLightLevel != EnumSkyBlock.SKY.defaultLightValue))
++ 					opacity = 1;
++ 
++ 				lightLevel = Math.max(lightLevel, neighborLightLevel - opacity);
++ 
++ 				if (lightLevel == 15)
++ 					return lightLevel;
++ 			}
++ 		}
++ 
++ 		return lightLevel;
++ 	}
++ 
++ 	public boolean alfheim$useNeighborBrightness(final IBlockState blockState, final EnumFacing facing,
++ 			final IBlockAccess blockAccess, final BlockPos blockPos) {
++ 		return facing == EnumFacing.UP;
++ 	}
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/block/BlockSlab.edit.java b/patches/minecraft/net/minecraft/block/BlockSlab.edit.java
index a4fdd199..12300a9a 100644
--- a/patches/minecraft/net/minecraft/block/BlockSlab.edit.java
+++ b/patches/minecraft/net/minecraft/block/BlockSlab.edit.java
@@ -34,7 +34,7 @@
 
 ~ 	public int quantityDropped(EaglercraftRandom var1) {
 
-> INSERT  65 : 78  @  65
+> INSERT  65 : 89  @  65
 
 + 
 + 	public boolean onBlockActivated(World world, BlockPos blockpos, IBlockState var3, EntityPlayer entityplayer,
@@ -49,5 +49,16 @@
 + 		}
 + 		return super.onBlockActivated(world, blockpos, var3, entityplayer, var5, var6, var7, var8);
 + 	}
++ 
++ 	public boolean alfheim$useNeighborBrightness(final IBlockState blockState, final EnumFacing facing,
++ 			final IBlockAccess blockAccess, final BlockPos blockPos) {
++ 		if (isFullCube())
++ 			return false;
++ 
++ 		if (facing.getAxis() != EnumFacing.Axis.Y)
++ 			return true;
++ 
++ 		return facing == (blockState.getValue(HALF) == EnumBlockHalf.TOP ? EnumFacing.DOWN : EnumFacing.UP);
++ 	}
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/block/BlockStairs.edit.java b/patches/minecraft/net/minecraft/block/BlockStairs.edit.java
index da3726b4..c86ad037 100644
--- a/patches/minecraft/net/minecraft/block/BlockStairs.edit.java
+++ b/patches/minecraft/net/minecraft/block/BlockStairs.edit.java
@@ -60,4 +60,13 @@
 ~ 		for (int l = 0; l < amovingobjectposition.length; ++l) {
 ~ 			MovingObjectPosition movingobjectposition = amovingobjectposition[l];
 
+> INSERT  97 : 103  @  97
+
++ 
++ 	public boolean alfheim$useNeighborBrightness(final IBlockState blockState, final EnumFacing facing,
++ 			final IBlockAccess blockAccess, final BlockPos blockPos) {
++ 		return facing == (blockState.getValue(HALF) == EnumHalf.TOP ? EnumFacing.DOWN : EnumFacing.UP)
++ 				|| facing == blockState.getValue(FACING).getOpposite();
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/block/state/BlockStateBase.edit.java b/patches/minecraft/net/minecraft/block/state/BlockStateBase.edit.java
index 18983b44..418f5cf0 100644
--- a/patches/minecraft/net/minecraft/block/state/BlockStateBase.edit.java
+++ b/patches/minecraft/net/minecraft/block/state/BlockStateBase.edit.java
@@ -15,10 +15,44 @@
 + import com.google.common.collect.Iterables;
 + 
 
-> DELETE  2  @  2 : 3
+> CHANGE  2 : 3  @  2 : 3
+
+~ import net.minecraft.util.ResourceLocation;
 
 > CHANGE  16 : 17  @  16 : 17
 
 ~ 				(T) cyclePropertyValue(property.getAllowedValues(), this.getValue(property)));
 
+> INSERT  30 : 59  @  30
+
++ 
++ 	private int blockId = -1;
++ 	private int blockStateId = -1;
++ 	private int metadata = -1;
++ 	private ResourceLocation blockLocation = null;
++ 
++ 	public int getBlockId() {
++ 		if (this.blockId < 0) {
++ 			this.blockId = Block.getIdFromBlock(this.getBlock());
++ 		}
++ 
++ 		return this.blockId;
++ 	}
++ 
++ 	public int getBlockStateId() {
++ 		if (this.blockStateId < 0) {
++ 			this.blockStateId = Block.getStateId(this);
++ 		}
++ 
++ 		return this.blockStateId;
++ 	}
++ 
++ 	public int getMetadata() {
++ 		if (this.metadata < 0) {
++ 			this.metadata = this.getBlock().getMetaFromState(this);
++ 		}
++ 
++ 		return this.metadata;
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/block/state/pattern/FactoryBlockPattern.edit.java b/patches/minecraft/net/minecraft/block/state/pattern/FactoryBlockPattern.edit.java
index 9254dc94..3384cc2f 100644
--- a/patches/minecraft/net/minecraft/block/state/pattern/FactoryBlockPattern.edit.java
+++ b/patches/minecraft/net/minecraft/block/state/pattern/FactoryBlockPattern.edit.java
@@ -5,26 +5,29 @@
 # Version: 1.0
 # Author: lax1dude
 
-> INSERT  2 : 10  @  2
+> DELETE  2  @  2 : 8
 
-+ import java.util.ArrayList;
-+ import java.util.List;
-+ 
-+ import org.apache.commons.lang3.StringUtils;
-+ 
-+ import com.carrotsearch.hppc.CharObjectHashMap;
-+ import com.carrotsearch.hppc.CharObjectMap;
-+ import com.carrotsearch.hppc.cursors.CharObjectCursor;
+> INSERT  1 : 2  @  1
 
-> CHANGE  4 : 5  @  4 : 10
++ import java.util.HashMap;
+
+> CHANGE  3 : 4  @  3 : 6
 
 ~ 
 
-> DELETE  1  @  1 : 4
+> INSERT  2 : 9  @  2
 
-> CHANGE  4 : 5  @  4 : 5
++ import com.google.common.base.Joiner;
++ import com.google.common.base.Predicate;
++ import com.google.common.base.Predicates;
++ import com.google.common.collect.Lists;
++ 
++ import net.minecraft.block.state.BlockWorldState;
++ 
 
-~ 	private final CharObjectMap<Predicate<BlockWorldState>> symbolMap = new CharObjectHashMap<>();
+> CHANGE  3 : 4  @  3 : 4
+
+~ 	private final Map<Character, Predicate<BlockWorldState>> symbolMap = new HashMap<>();
 
 > CHANGE  4 : 5  @  4 : 5
 
@@ -59,10 +62,8 @@
 
 ~ 					apredicate[i][j][k] = this.symbolMap.get(((String[]) this.depth.get(i))[j].charAt(k));
 
-> CHANGE  10 : 13  @  10 : 13
+> CHANGE  10 : 11  @  10 : 11
 
-~ 		for (CharObjectCursor<Predicate<BlockWorldState>> entry : this.symbolMap) {
-~ 			if (entry.value == null) {
-~ 				arraylist.add(entry.key);
+~ 		for (Entry<Character, Predicate<BlockWorldState>> entry : this.symbolMap.entrySet()) {
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/Minecraft.edit.java b/patches/minecraft/net/minecraft/client/Minecraft.edit.java
index 434b4379..ad82de1f 100644
--- a/patches/minecraft/net/minecraft/client/Minecraft.edit.java
+++ b/patches/minecraft/net/minecraft/client/Minecraft.edit.java
@@ -149,7 +149,9 @@
 
 > DELETE  6  @  6 : 7
 
-> DELETE  1  @  1 : 19
+> CHANGE  1 : 2  @  1 : 19
+
+~ import net.optifine.Config;
 
 > CHANGE  1 : 2  @  1 : 2
 
@@ -272,10 +274,11 @@
 ~ 		} finally {
 ~ 			this.shutdownMinecraftApplet();
 
-> CHANGE  4 : 6  @  4 : 6
+> CHANGE  4 : 7  @  4 : 6
 
 ~ 	private void startGame() throws IOException {
 ~ 		this.gameSettings = new GameSettings(this);
+~ 		Config.setGameObj(this);
 
 > DELETE  1  @  1 : 2
 
@@ -1419,7 +1422,7 @@
 
 > DELETE  26  @  26 : 34
 
-> INSERT  7 : 44  @  7
+> INSERT  7 : 47  @  7
 
 + 
 + 	public static int getGLMaximumTextureSize() {
@@ -1458,5 +1461,8 @@
 + 		return EagRuntime.getConfiguration().isForceProfanityFilter() || gameSettings.enableProfanityFilter;
 + 	}
 + 
++ 	public DefaultResourcePack getDefaultResourcePack() {
++ 		return mcDefaultResourcePack;
++ 	}
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java
index 435d1b30..2d393a26 100644
--- a/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java
+++ b/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java
@@ -17,14 +17,13 @@
 
 + import java.util.Locale;
 
-> INSERT  1 : 18  @  1
+> INSERT  1 : 17  @  1
 
 + 
 + import org.apache.commons.lang3.StringUtils;
 + 
 + import java.util.TimeZone;
 + 
-+ import com.carrotsearch.hppc.cursors.ObjectCursor;
 + import com.google.common.base.Strings;
 + import com.google.common.collect.Lists;
 + 
@@ -108,7 +107,7 @@
 ~ 			}
 ~ 		}
 
-> INSERT  2 : 137  @  2
+> INSERT  2 : 136  @  2
 
 + 	private void drawFPS(int x, int y) {
 + 		this.fontRenderer.drawStringWithShadow(this.mc.renderGlobal.getDebugInfoShort(), x, y, 0xFFFFFF);
@@ -153,9 +152,8 @@
 + 		this.fontRenderer.drawStringWithShadow(line, x - lw, y - i, 0xFFFFFF);
 + 		i += 11;
 + 
-+ 		for (ObjectCursor<PotionEffect> ee : mc.thePlayer.getActivePotionEffects()) {
++ 		for (PotionEffect e : mc.thePlayer.getActivePotionEffectsList()) {
 + 			i += 11;
-+ 			PotionEffect e = ee.value;
 + 			int t = e.getDuration() / 20;
 + 			int m = t / 60;
 + 			int s = t % 60;
diff --git a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java
index 4c30fae2..4fa589d6 100644
--- a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java
+++ b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java
@@ -21,16 +21,19 @@
 + 	 * + An array of all of GameSettings.Options's video options.
 + 	 */
 
-> CHANGE  2 : 10  @  2 : 7
+> CHANGE  2 : 13  @  2 : 7
 
 ~ 			GameSettings.Options.FRAMERATE_LIMIT, GameSettings.Options.EAGLER_VSYNC, GameSettings.Options.ANAGLYPH,
 ~ 			GameSettings.Options.VIEW_BOBBING, GameSettings.Options.GUI_SCALE, GameSettings.Options.GAMMA,
 ~ 			GameSettings.Options.RENDER_CLOUDS, GameSettings.Options.PARTICLES, GameSettings.Options.FXAA,
 ~ 			GameSettings.Options.MIPMAP_LEVELS, GameSettings.Options.BLOCK_ALTERNATIVES,
 ~ 			GameSettings.Options.ENTITY_SHADOWS, GameSettings.Options.FOG, GameSettings.Options.EAGLER_DYNAMIC_LIGHTS,
-~ 			GameSettings.Options.FULLSCREEN, GameSettings.Options.FNAW_SKINS, GameSettings.Options.HUD_FPS,
-~ 			GameSettings.Options.HUD_COORDS, GameSettings.Options.HUD_PLAYER, GameSettings.Options.HUD_STATS,
-~ 			GameSettings.Options.HUD_WORLD, GameSettings.Options.HUD_24H, GameSettings.Options.CHUNK_FIX };
+~ 			GameSettings.Options.FULLSCREEN, GameSettings.Options.OF_CONNECTED_TEXTURES,
+~ 			GameSettings.Options.OF_BETTER_GRASS, GameSettings.Options.OF_CUSTOM_SKIES,
+~ 			GameSettings.Options.OF_SMART_LEAVES, GameSettings.Options.OF_CUSTOM_ITEMS, GameSettings.Options.FNAW_SKINS,
+~ 			GameSettings.Options.HUD_FPS, GameSettings.Options.HUD_COORDS, GameSettings.Options.HUD_PLAYER,
+~ 			GameSettings.Options.HUD_STATS, GameSettings.Options.HUD_WORLD, GameSettings.Options.HUD_24H,
+~ 			GameSettings.Options.CHUNK_FIX };
 
 > CHANGE  11 : 18  @  11 : 22
 
diff --git a/patches/minecraft/net/minecraft/client/model/ModelRenderer.edit.java b/patches/minecraft/net/minecraft/client/model/ModelRenderer.edit.java
index b53dbfd8..30747432 100644
--- a/patches/minecraft/net/minecraft/client/model/ModelRenderer.edit.java
+++ b/patches/minecraft/net/minecraft/client/model/ModelRenderer.edit.java
@@ -23,7 +23,26 @@
 
 > DELETE  1  @  1 : 3
 
-> CHANGE  214 : 216  @  214 : 216
+> CHANGE  126 : 127  @  126 : 129
+
+~ 					GlStateManager.rotateZYXRad(this.rotateAngleX, this.rotateAngleY, this.rotateAngleZ);
+
+> DELETE  1  @  1 : 9
+
+> DELETE  25  @  25 : 28
+
+> CHANGE  1 : 3  @  1 : 4
+
+~ 				// note: vanilla order for this function is YXZ not ZYX for some reason
+~ 				GlStateManager.rotateZYXRad(this.rotateAngleX, this.rotateAngleY, this.rotateAngleZ);
+
+> DELETE  1  @  1 : 5
+
+> CHANGE  21 : 22  @  21 : 32
+
+~ 					GlStateManager.rotateZYXRad(this.rotateAngleX, this.rotateAngleY, this.rotateAngleZ);
+
+> CHANGE  7 : 9  @  7 : 9
 
 ~ 		this.displayList = GLAllocation.generateDisplayLists();
 ~ 		EaglercraftGPU.glNewList(this.displayList, GL_COMPILE);
diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java b/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java
index ac50601a..66a8ff98 100644
--- a/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java
+++ b/patches/minecraft/net/minecraft/client/multiplayer/ChunkProviderClient.edit.java
@@ -55,4 +55,11 @@
 
 ~ 		return "MultiplayerChunkCache: " + this.chunkMapping.size() + ", " + this.chunkListing.size();
 
+> INSERT  20 : 24  @  20
+
++ 
++ 	public Chunk getLoadedChunk(int var1, int var2) {
++ 		return this.chunkMapping.get(ChunkCoordIntPair.chunkXZ2Int(var1, var2));
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java b/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java
index bee8911d..b229e828 100644
--- a/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java
@@ -16,25 +16,150 @@
 
 > DELETE  3  @  3 : 7
 
-> CHANGE  44 : 45  @  44 : 45
+> INSERT  8 : 9  @  8
 
-~ 		float[] afloat = new float[EnumFacing._VALUES.length * 2];
++ import net.minecraft.util.EnumWorldBlockLayer;
 
-> CHANGE  3 : 6  @  3 : 4
+> INSERT  4 : 9  @  4
+
++ import net.optifine.BetterSnow;
++ import net.optifine.Config;
++ import net.optifine.model.BlockModelCustomizer;
++ import net.optifine.model.ListQuadsOverlay;
++ import net.optifine.render.RenderEnv;
+
+> INSERT  2 : 5  @  2
+
++ 	private static final EnumWorldBlockLayer[] OVERLAY_LAYERS = new EnumWorldBlockLayer[] { EnumWorldBlockLayer.CUTOUT,
++ 			EnumWorldBlockLayer.CUTOUT_MIPPED, EnumWorldBlockLayer.TRANSLUCENT };
++ 
+
+> CHANGE  13 : 27  @  13 : 18
+
+~ 			RenderEnv renderenv = worldRendererIn.getRenderEnv(blockStateIn, blockPosIn);
+~ 			modelIn = BlockModelCustomizer.getRenderModel(modelIn, blockStateIn, renderenv);
+~ 			boolean flag1 = flag
+~ 					? this.renderModelAmbientOcclusion(blockAccessIn, modelIn, blockStateIn, blockPosIn,
+~ 							worldRendererIn, checkSides)
+~ 					: this.renderModelStandard(blockAccessIn, modelIn, blockStateIn, blockPosIn, worldRendererIn,
+~ 							checkSides);
+~ 
+~ 			if (flag1) {
+~ 				renderOverlayModels(blockAccessIn, modelIn, blockStateIn, blockPosIn, worldRendererIn, checkSides, 0L,
+~ 						renderenv, flag);
+~ 			}
+~ 
+~ 			return flag1;
+
+> CHANGE  9 : 72  @  9 : 11
+
+~ 	private void renderOverlayModels(IBlockAccess p_renderOverlayModels_1_, IBakedModel p_renderOverlayModels_2_,
+~ 			IBlockState p_renderOverlayModels_3_, BlockPos p_renderOverlayModels_4_,
+~ 			WorldRenderer p_renderOverlayModels_5_, boolean p_renderOverlayModels_6_, long p_renderOverlayModels_7_,
+~ 			RenderEnv p_renderOverlayModels_9_, boolean p_renderOverlayModels_10_) {
+~ 		if (p_renderOverlayModels_9_.isOverlaysRendered()) {
+~ 			for (int i = 0; i < OVERLAY_LAYERS.length; ++i) {
+~ 				EnumWorldBlockLayer enumworldblocklayer = OVERLAY_LAYERS[i];
+~ 				ListQuadsOverlay listquadsoverlay = p_renderOverlayModels_9_.getListQuadsOverlay(enumworldblocklayer);
+~ 
+~ 				if (listquadsoverlay.size() > 0) {
+~ 					RegionRenderCacheBuilder regionrendercachebuilder = p_renderOverlayModels_9_
+~ 							.getRegionRenderCacheBuilder();
+~ 
+~ 					if (regionrendercachebuilder != null) {
+~ 						WorldRenderer worldrenderer = regionrendercachebuilder
+~ 								.getWorldRendererByLayer(enumworldblocklayer);
+~ 
+~ //						if (!worldrenderer.isDrawing()) {
+~ //							worldrenderer.begin(7, DefaultVertexFormats.BLOCK);
+~ //							worldrenderer.setTranslation(p_renderOverlayModels_5_.getXOffset(),
+~ //									p_renderOverlayModels_5_.getYOffset(), p_renderOverlayModels_5_.getZOffset());
+~ //						}
+~ 
+~ 						for (int j = 0; j < listquadsoverlay.size(); ++j) {
+~ 							BakedQuad bakedquad = listquadsoverlay.getQuad(j);
+~ 							List<BakedQuad> list = listquadsoverlay.getListQuadsSingle(bakedquad);
+~ 							IBlockState iblockstate = listquadsoverlay.getBlockState(j);
+~ 
+~ //							if (bakedquad.getQuadEmissive() != null) {
+~ //								listquadsoverlay.addQuad(bakedquad.getQuadEmissive(), iblockstate);
+~ //							}
+~ 
+~ 							p_renderOverlayModels_9_.reset(iblockstate, p_renderOverlayModels_4_);
+~ 
+~ 							if (p_renderOverlayModels_10_) {
+~ 								this.renderModelAmbientOcclusionQuads(p_renderOverlayModels_1_, iblockstate,
+~ 										p_renderOverlayModels_4_, worldrenderer, list, p_renderOverlayModels_9_);
+~ 							} else {
+~ 								Block block = iblockstate.getBlock();
+~ 								int k = block.getMixedBrightnessForBlock(p_renderOverlayModels_1_,
+~ 										p_renderOverlayModels_4_.offset(bakedquad.getFace()));
+~ 								this.renderModelStandardQuads(p_renderOverlayModels_1_, block, p_renderOverlayModels_4_,
+~ 										bakedquad.getFace(), k, false, worldrenderer, list, p_renderOverlayModels_9_);
+~ 							}
+~ 						}
+~ 					}
+~ 
+~ 					listquadsoverlay.clear();
+~ 				}
+~ 			}
+~ 		}
+~ 
+~ 		if (Config.isBetterSnow() && !p_renderOverlayModels_9_.isBreakingAnimation() && BetterSnow
+~ 				.shouldRender(p_renderOverlayModels_1_, p_renderOverlayModels_3_, p_renderOverlayModels_4_)) {
+~ 			IBakedModel ibakedmodel = BetterSnow.getModelSnowLayer();
+~ 			IBlockState iblockstate1 = BetterSnow.getStateSnowLayer();
+~ 			this.renderModel(p_renderOverlayModels_1_, ibakedmodel, iblockstate1, p_renderOverlayModels_4_,
+~ 					p_renderOverlayModels_5_, p_renderOverlayModels_6_);
+~ 		}
+~ 	}
+~ 
+~ 	public boolean renderModelAmbientOcclusion(IBlockAccess blockAccessIn, IBakedModel modelIn,
+~ 			IBlockState blockStateIn, BlockPos blockPosIn, WorldRenderer worldRendererIn, boolean checkSides) {
+
+> CHANGE  1 : 4  @  1 : 4
+
+~ 		Block blockIn = blockStateIn.getBlock();
+~ 		RenderEnv renderenv = worldRendererIn.getRenderEnv(blockStateIn, blockPosIn);
+~ 		EnumWorldBlockLayer enumworldblocklayer = worldRendererIn.getBlockLayer();
+
+> CHANGE  1 : 4  @  1 : 2
 
 ~ 		EnumFacing[] facings = EnumFacing._VALUES;
 ~ 		for (int i = 0; i < facings.length; ++i) {
 ~ 			EnumFacing enumfacing = facings[i];
 
-> INSERT  23 : 24  @  23
+> CHANGE  4 : 8  @  4 : 6
 
-+ 		boolean isDeferred = DeferredStateManager.isDeferredRenderer();
+~ 					list = BlockModelCustomizer.getRenderQuads(list, blockAccessIn, blockStateIn, blockPosIn,
+~ 							enumfacing, enumworldblocklayer, 0L, renderenv);
+~ 					this.renderModelAmbientOcclusionQuads(blockAccessIn, blockStateIn, blockPosIn, worldRendererIn,
+~ 							list, renderenv);
 
-> INSERT  1 : 2  @  1
+> CHANGE  7 : 11  @  7 : 9
 
-+ 		float[] afloat = isDeferred ? new float[EnumFacing._VALUES.length * 2] : null;
+~ 			list1 = BlockModelCustomizer.getRenderQuads(list1, blockAccessIn, blockStateIn, blockPosIn,
+~ 					(EnumFacing) null, enumworldblocklayer, 0L, renderenv);
+~ 			this.renderModelAmbientOcclusionQuads(blockAccessIn, blockStateIn, blockPosIn, worldRendererIn, list1,
+~ 					renderenv);
 
-> CHANGE  2 : 6  @  2 : 3
+> CHANGE  6 : 7  @  6 : 7
+
+~ 	public boolean renderModelStandard(IBlockAccess blockAccessIn, IBakedModel modelIn, IBlockState blockStateIn,
+
+> INSERT  1 : 4  @  1
+
++ 		// boolean isDeferred = DeferredStateManager.isDeferredRenderer();
++ 		// float[] afloat = isDeferred ? new float[EnumFacing._VALUES.length * 2] :
++ 		// null;
+
+> CHANGE  1 : 4  @  1 : 2
+
+~ 		Block blockIn = blockStateIn.getBlock();
+~ 		RenderEnv renderenv = worldRendererIn.getRenderEnv(blockStateIn, blockPosIn);
+~ 		EnumWorldBlockLayer enumworldblocklayer = worldRendererIn.getBlockLayer();
+
+> CHANGE  1 : 5  @  1 : 2
 
 ~ 		BlockPos pointer = new BlockPos();
 ~ 		EnumFacing[] facings = EnumFacing._VALUES;
@@ -45,18 +170,34 @@
 
 ~ 				BlockPos blockpos = blockPosIn.offsetEvenFaster(enumfacing, pointer);
 
-> CHANGE  3 : 4  @  3 : 4
+> INSERT  2 : 4  @  2
 
-~ 							worldRendererIn, list, bitset, afloat);
++ 					list = BlockModelCustomizer.getRenderQuads(list, blockAccessIn, blockStateIn, blockPosIn,
++ 							enumfacing, enumworldblocklayer, 0L, renderenv);
 
-> CHANGE  8 : 9  @  8 : 9
+> CHANGE  1 : 2  @  1 : 2
 
-~ 					worldRendererIn, list1, bitset, afloat);
+~ 							worldRendererIn, list, renderenv);
 
-> INSERT  9 : 11  @  9
+> INSERT  7 : 9  @  7
 
-+ 		boolean isDeferred = DeferredStateManager.isDeferredRenderer();
-+ 		boolean isDynamicLights = isDeferred || DynamicLightsStateManager.isDynamicLightsRender();
++ 			list1 = BlockModelCustomizer.getRenderQuads(list1, blockAccessIn, blockStateIn, blockPosIn,
++ 					(EnumFacing) null, enumworldblocklayer, 0L, renderenv);
+
+> CHANGE  1 : 2  @  1 : 2
+
+~ 					worldRendererIn, list1, renderenv);
+
+> CHANGE  6 : 14  @  6 : 9
+
+~ 	private void renderModelAmbientOcclusionQuads(IBlockAccess blockAccessIn, IBlockState blockStateIn,
+~ 			BlockPos blockPosIn, WorldRenderer worldRendererIn, List<BakedQuad> listQuadsIn, RenderEnv renderenv) {
+~ 		boolean isDeferred = DeferredStateManager.isDeferredRenderer();
+~ 		boolean isDynamicLights = isDeferred || DynamicLightsStateManager.isDynamicLightsRender();
+~ 		float[] quadBounds = renderenv.getQuadBounds();
+~ 		BitSet boundsFlags = renderenv.getBoundsFlags();
+~ 		BlockModelRenderer.AmbientOcclusionFace aoFaceIn = renderenv.getAoFace();
+~ 		Block blockIn = blockStateIn.getBlock();
 
 > CHANGE  8 : 9  @  8 : 9
 
@@ -104,11 +245,13 @@
 + 	private final BlockPos blockpos5 = new BlockPos(0, 0, 0);
 + 
 
-> CHANGE  2 : 5  @  2 : 3
+> CHANGE  2 : 7  @  2 : 3
 
-~ 			List<BakedQuad> listQuadsIn, BitSet boundsFlags, float[] quadBounds) {
+~ 			List<BakedQuad> listQuadsIn, RenderEnv renderenv) {
 ~ 		boolean isDeferred = DeferredStateManager.isDeferredRenderer();
 ~ 		boolean isDynamicLights = isDeferred || DynamicLightsStateManager.isDynamicLightsRender();
+~ 		BitSet boundsFlags = renderenv.getBoundsFlags();
+~ 		float[] quadBounds = renderenv.getQuadBounds();
 
 > CHANGE  11 : 12  @  11 : 12
 
@@ -263,7 +406,11 @@
 ~ 			worldrenderer.putNormal((float) vec3i.getX(), (float) vec3i.getY(), (float) vec3i.getZ(),
 ~ 					VertexMarkerState.markId);
 
-> INSERT  9 : 16  @  9
+> CHANGE  5 : 6  @  5 : 6
+
+~ 	public static class AmbientOcclusionFace {
+
+> INSERT  3 : 10  @  3
 
 + 		private final BlockPos blockpos0 = new BlockPos(0, 0, 0);
 + 		private final BlockPos blockpos1 = new BlockPos(0, 0, 0);
diff --git a/patches/minecraft/net/minecraft/client/renderer/BlockModelShapes.edit.java b/patches/minecraft/net/minecraft/client/renderer/BlockModelShapes.edit.java
index 8417dbb5..df69ea00 100644
--- a/patches/minecraft/net/minecraft/client/renderer/BlockModelShapes.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/BlockModelShapes.edit.java
@@ -24,11 +24,23 @@
 
 ~ 			this.bakedModelStore.put((IBlockState) entry.getKey(),
 
-> CHANGE  175 : 176  @  175 : 176
+> CHANGE  157 : 158  @  157 : 158
+
+~ 						getPropertyString(linkedhashmap));
+
+> CHANGE  11 : 12  @  11 : 12
+
+~ 						getPropertyString(linkedhashmap));
+
+> CHANGE  5 : 6  @  5 : 6
 
 ~ 				String s = BlockDirt.VARIANT.getName((BlockDirt.DirtType) linkedhashmap.remove(BlockDirt.VARIANT));
 
-> CHANGE  10 : 12  @  10 : 11
+> CHANGE  4 : 5  @  4 : 5
+
+~ 				return new ModelResourceLocation(s, getPropertyString(linkedhashmap));
+
+> CHANGE  5 : 7  @  5 : 6
 
 ~ 				String s = BlockStoneSlab.VARIANT
 ~ 						.getName((BlockStoneSlab.EnumType) linkedhashmap.remove(BlockStoneSlab.VARIANT));
diff --git a/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java b/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java
index 869a2cf3..8fda3e06 100644
--- a/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java
@@ -79,7 +79,9 @@
 
 + import net.minecraft.util.Vec3i;
 
-> DELETE  2  @  2 : 9
+> CHANGE  2 : 3  @  2 : 9
+
+~ import net.optifine.Config;
 
 > CHANGE  9 : 10  @  9 : 10
 
@@ -92,10 +94,12 @@
 + 	private GameOverlayFramebuffer overlayFramebuffer;
 + 	private float eagPartialTicks = 0.0f;
 
-> INSERT  1 : 3  @  1
+> INSERT  1 : 5  @  1
 
 + 	public float currentProjMatrixFOV = 0.0f;
 + 
++ 	private boolean initializedOF = false;
++ 
 
 > DELETE  1  @  1 : 2
 
@@ -155,7 +159,11 @@
 
 ~ 				f = this.mc.isZoomKey ? this.mc.adjustedZoomValue : this.mc.gameSettings.fovSetting;
 
-> CHANGE  169 : 173  @  169 : 172
+> CHANGE  156 : 157  @  156 : 157
+
+~ 		this.farPlaneDistance = (float) (this.mc.gameSettings.renderDistanceChunks * 16 + 16);
+
+> CHANGE  12 : 16  @  12 : 15
 
 ~ 		float farPlane = this.farPlaneDistance * 2.0f * MathHelper.SQRT_2;
 ~ 		GlStateManager.gluPerspective(currentProjMatrixFOV = this.getFOVModifier(partialTicks, true),
@@ -215,8 +223,12 @@
 
 > DELETE  1  @  1 : 2
 
-> CHANGE  10 : 11  @  10 : 11
+> CHANGE  10 : 15  @  10 : 11
 
+~ 		if (!initializedOF) {
+~ 			Config.frameInitHook();
+~ 			initializedOF = true;
+~ 		}
 ~ 		boolean flag = Display.isActive() || mc.gameSettings.touchscreen;
 
 > CHANGE  1 : 2  @  1 : 2
diff --git a/patches/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.edit.java b/patches/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.edit.java
index 044f6faf..f205ee08 100644
--- a/patches/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/InventoryEffectRenderer.edit.java
@@ -5,10 +5,9 @@
 # Version: 1.0
 # Author: lax1dude
 
-> CHANGE  2 : 6  @  2 : 3
+> CHANGE  2 : 5  @  2 : 3
 
-~ import com.carrotsearch.hppc.ObjectContainer;
-~ import com.carrotsearch.hppc.cursors.ObjectCursor;
+~ import java.util.List;
 ~ 
 ~ import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
 
@@ -16,15 +15,14 @@
 
 > CHANGE  40 : 41  @  40 : 41
 
-~ 		ObjectContainer<PotionEffect> collection = this.mc.thePlayer.getActivePotionEffects();
+~ 		List<PotionEffect> collection = this.mc.thePlayer.getActivePotionEffectsList();
 
 > INSERT  3 : 4  @  3
 
 + 			GlStateManager.enableAlpha();
 
-> CHANGE  5 : 7  @  5 : 6
+> CHANGE  5 : 6  @  5 : 6
 
-~ 			for (ObjectCursor<PotionEffect> potioneffect_ : collection) {
-~ 				PotionEffect potioneffect = potioneffect_.value;
+~ 			for (PotionEffect potioneffect : collection) {
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/ItemModelMesher.edit.java b/patches/minecraft/net/minecraft/client/renderer/ItemModelMesher.edit.java
index e7704fe7..b6fd3ea5 100644
--- a/patches/minecraft/net/minecraft/client/renderer/ItemModelMesher.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/ItemModelMesher.edit.java
@@ -16,7 +16,13 @@
 ~ 
 ~ import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
 
-> CHANGE  7 : 9  @  7 : 9
+> INSERT  5 : 8  @  5
+
++ import net.minecraft.util.ResourceLocation;
++ import net.optifine.Config;
++ import net.optifine.CustomItems;
+
+> CHANGE  2 : 4  @  2 : 4
 
 ~ 	private final IntObjectMap<ModelResourceLocation> simpleShapes = new IntObjectHashMap<>();
 ~ 	private final IntObjectMap<IBakedModel> simpleShapesCache = new IntObjectHashMap<>();
@@ -33,7 +39,14 @@
 
 ~ 			ItemMeshDefinition itemmeshdefinition = this.shapers.get(item);
 
-> CHANGE  17 : 18  @  17 : 18
+> INSERT  9 : 13  @  9
+
++ 		if (Config.isCustomItems()) {
++ 			ibakedmodel = CustomItems.getCustomItemModel(stack, ibakedmodel, (ResourceLocation) null, true);
++ 		}
++ 
+
+> CHANGE  8 : 9  @  8 : 9
 
 ~ 		return this.simpleShapesCache.get(this.getIndex(item, meta));
 
diff --git a/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java b/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java
index 4b05bc03..f35b6ba6 100644
--- a/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java
@@ -16,13 +16,14 @@
 ~ import net.lax1dude.eaglercraft.v1_8.Keyboard;
 ~ 
 
-> INSERT  2 : 23  @  2
+> INSERT  2 : 24  @  2
 
 + 
 + import com.google.common.collect.Lists;
 + import com.google.common.collect.Maps;
 + import com.google.common.collect.Sets;
 + 
++ import dev.redstudio.alfheim.utils.DeduplicatedLongQueue;
 + import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 + import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 + import net.lax1dude.eaglercraft.v1_8.minecraft.ChunkUpdateManager;
@@ -59,7 +60,9 @@
 
 + import net.minecraft.util.EnumChatFormatting;
 
-> DELETE  13  @  13 : 18
+> CHANGE  13 : 14  @  13 : 18
+
+~ import net.optifine.CustomSky;
 
 > DELETE  20  @  20 : 24
 
@@ -72,7 +75,12 @@
 ~ 	private float lastViewProjMatrixFOV = Float.MIN_VALUE;
 ~ 	private final ChunkUpdateManager renderDispatcher = new ChunkUpdateManager();
 
-> CHANGE  22 : 24  @  22 : 24
+> INSERT  17 : 19  @  17
+
++ 	private final DeduplicatedLongQueue alfheim$lightUpdatesQueue = new DeduplicatedLongQueue(8192);
++ 
+
+> CHANGE  5 : 7  @  5 : 7
 
 ~ 		EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 ~ 		EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
@@ -615,7 +623,15 @@
 ~ 		}
 ~ 		return i;
 
-> CHANGE  92 : 93  @  92 : 102
+> CHANGE  18 : 19  @  18 : 19
+
+~ 		alfheim$processLightUpdates();
+
+> INSERT  71 : 72  @  71
+
++ 			GlStateManager.disableDepth();
+
+> CHANGE  2 : 3  @  2 : 12
 
 ~ 			GlStateManager.callList(this.glSkyList);
 
@@ -623,15 +639,42 @@
 
 ~ 							.pos((double) (f12 * 120.0F), (double) (f13 * 120.0F), (double) (f13 * 40.0F * afloat[3]))
 
-> CHANGE  42 : 43  @  42 : 52
+> INSERT  14 : 15  @  14
+
++ 			CustomSky.renderSky(this.theWorld, this.renderEngine, partialTicks);
+
+> CHANGE  26 : 28  @  26 : 27
+
+~ 			boolean b = !CustomSky.hasSkyLayers(this.theWorld);
+~ 			if (f15 > 0.0F && b) {
+
+> CHANGE  1 : 2  @  1 : 11
 
 ~ 				GlStateManager.callList(this.starGLCallList);
 
-> CHANGE  13 : 14  @  13 : 23
+> CHANGE  10 : 11  @  10 : 11
+
+~ 			if (d0 < 0.0D && b) {
+
+> CHANGE  2 : 3  @  2 : 12
 
 ~ 				GlStateManager.callList(this.glSkyList2);
 
-> CHANGE  372 : 373  @  372 : 373
+> CHANGE  35 : 42  @  35 : 39
+
+~ 			if (b) {
+~ 				GlStateManager.pushMatrix();
+~ 				GlStateManager.translate(0.0F, -((float) (d0 - 16.0D)), 0.0F);
+~ 				GlStateManager.callList(this.glSkyList2);
+~ 				GlStateManager.popMatrix();
+~ 			}
+~ 
+
+> INSERT  2 : 3  @  2
+
++ 			GlStateManager.enableDepth();
+
+> CHANGE  331 : 332  @  331 : 332
 
 ~ 		this.displayListEntitiesDirty |= this.renderDispatcher.updateChunks(finishTimeNano);
 
@@ -668,11 +711,15 @@
 
 ~ 			EaglercraftGPU.glLineWidth(2.0F);
 
-> CHANGE  240 : 241  @  240 : 241
+> CHANGE  111 : 112  @  111 : 115
+
+~ 		this.alfheim$lightUpdatesQueue.enqueue(blockpos.toLong());
+
+> CHANGE  125 : 126  @  125 : 126
 
 ~ 		EaglercraftRandom random = this.theWorld.rand;
 
-> INSERT  229 : 248  @  229
+> INSERT  229 : 263  @  229
 
 + 
 + 	public String getDebugInfoShort() {
@@ -693,5 +740,20 @@
 + 		return "" + Minecraft.getDebugFPS() + "fps | C: " + j + "/" + i + ", E: " + this.countEntitiesRendered + "+" + k
 + 				+ ", " + renderDispatcher.getDebugInfo();
 + 	}
++ 
++ 	public void alfheim$processLightUpdates() {
++ 		if (alfheim$lightUpdatesQueue.isEmpty())
++ 			return;
++ 
++ 		do {
++ 			final long longPos = alfheim$lightUpdatesQueue.dequeue();
++ 			final int x = (int) (longPos << 64 - BlockPos.X_SHIFT - BlockPos.NUM_X_BITS >> 64 - BlockPos.NUM_X_BITS);
++ 			final int y = (int) (longPos << 64 - BlockPos.Y_SHIFT - BlockPos.NUM_Y_BITS >> 64 - BlockPos.NUM_Y_BITS);
++ 			final int z = (int) (longPos << 64 - BlockPos.NUM_Z_BITS >> 64 - BlockPos.NUM_Z_BITS);
++ 			markBlocksForUpdate(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1);
++ 		} while (!alfheim$lightUpdatesQueue.isEmpty());
++ 
++ 		alfheim$lightUpdatesQueue.newDeduplicationSet();
++ 	}
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/BakedQuad.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/model/BakedQuad.edit.java
index f586a494..462db739 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/BakedQuad.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/block/model/BakedQuad.edit.java
@@ -5,29 +5,85 @@
 # Version: 1.0
 # Author: lax1dude
 
-> INSERT  6 : 7  @  6
+> INSERT  2 : 3  @  2
+
++ import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+
+> INSERT  1 : 2  @  1
+
++ import net.optifine.model.QuadBounds;
+
+> INSERT  3 : 4  @  3
 
 + 	protected final int[] vertexDataWithNormals;
 
-> INSERT  5 : 6  @  5
+> INSERT  2 : 4  @  2
 
-+ 		this.vertexDataWithNormals = null;
++ 	protected final EaglerTextureAtlasSprite sprite;
++ 	private QuadBounds quadBounds;
 
-> INSERT  4 : 11  @  4
+> CHANGE  1 : 3  @  1 : 2
+
+~ 	public BakedQuad(int[] vertexDataIn, int[] vertexDataWithNormalsIn, int tintIndexIn, EnumFacing faceIn,
+~ 			EaglerTextureAtlasSprite sprite) {
+
+> INSERT  1 : 2  @  1
 
-+ 	public BakedQuad(int[] vertexDataIn, int[] vertexDataWithNormalsIn, int tintIndexIn, EnumFacing faceIn) {
-+ 		this.vertexData = vertexDataIn;
 + 		this.vertexDataWithNormals = vertexDataWithNormalsIn;
-+ 		this.tintIndex = tintIndexIn;
-+ 		this.face = faceIn;
-+ 	}
-+ 
 
-> INSERT  4 : 8  @  4
+> INSERT  2 : 3  @  2
+
++ 		this.sprite = sprite;
+
+> INSERT  6 : 10  @  6
 
 + 	public int[] getVertexDataWithNormals() {
 + 		return this.vertexDataWithNormals;
 + 	}
 + 
 
+> INSERT  11 : 52  @  11
+
++ 
++ 	public EaglerTextureAtlasSprite getSprite() {
++ 		return sprite;
++ 	}
++ 
++ 	public QuadBounds getQuadBounds() {
++ 		if (this.quadBounds == null) {
++ 			this.quadBounds = new QuadBounds(this.getVertexData());
++ 		}
++ 
++ 		return this.quadBounds;
++ 	}
++ 
++ 	public float getMidX() {
++ 		QuadBounds quadbounds = this.getQuadBounds();
++ 		return (quadbounds.getMaxX() + quadbounds.getMinX()) / 2.0F;
++ 	}
++ 
++ 	public double getMidY() {
++ 		QuadBounds quadbounds = this.getQuadBounds();
++ 		return (double) ((quadbounds.getMaxY() + quadbounds.getMinY()) / 2.0F);
++ 	}
++ 
++ 	public double getMidZ() {
++ 		QuadBounds quadbounds = this.getQuadBounds();
++ 		return (double) ((quadbounds.getMaxZ() + quadbounds.getMinZ()) / 2.0F);
++ 	}
++ 
++ 	public boolean isFaceQuad() {
++ 		QuadBounds quadbounds = this.getQuadBounds();
++ 		return quadbounds.isFaceQuad(this.face);
++ 	}
++ 
++ 	public boolean isFullQuad() {
++ 		QuadBounds quadbounds = this.getQuadBounds();
++ 		return quadbounds.isFullQuad(this.face);
++ 	}
++ 
++ 	public boolean isFullFaceQuad() {
++ 		return this.isFullQuad() && this.isFaceQuad();
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/BreakingFour.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/model/BreakingFour.edit.java
index 661afea8..481a8be2 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/BreakingFour.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/block/model/BreakingFour.edit.java
@@ -12,24 +12,24 @@
 + import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
 + 
 
-> CHANGE  1 : 2  @  1 : 2
+> DELETE  1  @  1 : 2
 
-~ 	private final EaglerTextureAtlasSprite texture;
-
-> CHANGE  1 : 5  @  1 : 4
+> CHANGE  1 : 5  @  1 : 5
 
 ~ 	public BreakingFour(BakedQuad parBakedQuad, EaglerTextureAtlasSprite textureIn) {
 ~ 		super(Arrays.copyOf(parBakedQuad.getVertexData(), parBakedQuad.getVertexData().length),
 ~ 				Arrays.copyOf(parBakedQuad.getVertexDataWithNormals(), parBakedQuad.getVertexDataWithNormals().length),
-~ 				parBakedQuad.tintIndex, parBakedQuad.face);
+~ 				parBakedQuad.tintIndex, parBakedQuad.face, textureIn);
 
-> INSERT  46 : 52  @  46
+> CHANGE  43 : 51  @  43 : 45
 
-+ 		if (this.vertexDataWithNormals != null) {
-+ 			int i2 = 8 * parInt1;
-+ 			this.vertexDataWithNormals[i2 + 4] = this.vertexData[i + 4];
-+ 			this.vertexDataWithNormals[i2 + 4 + 1] = this.vertexData[i + 4 + 1];
-+ 
-+ 		}
+~ 		this.vertexData[i + 4] = Float.floatToRawIntBits(sprite.getInterpolatedU((double) f3));
+~ 		this.vertexData[i + 4 + 1] = Float.floatToRawIntBits(sprite.getInterpolatedV((double) f4));
+~ 		if (this.vertexDataWithNormals != null) {
+~ 			int i2 = 8 * parInt1;
+~ 			this.vertexDataWithNormals[i2 + 4] = this.vertexData[i + 4];
+~ 			this.vertexDataWithNormals[i2 + 4 + 1] = this.vertexData[i + 4 + 1];
+~ 
+~ 		}
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java
index 026f08d2..aff26eed 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java
@@ -47,7 +47,7 @@
 ~ 		}
 ~ 		stride = 7;
 ~ 
-~ 		return new BakedQuad(aint, aint2, face.tintIndex, enumfacing);
+~ 		return new BakedQuad(aint, aint2, face.tintIndex, enumfacing, sprite);
 
 > CHANGE  2 : 3  @  2 : 3
 
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/statemap/BlockStateMapper.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/statemap/BlockStateMapper.edit.java
index f68c81c5..aab3c777 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/statemap/BlockStateMapper.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/block/statemap/BlockStateMapper.edit.java
@@ -17,4 +17,8 @@
 
 > DELETE  2  @  2 : 4
 
+> CHANGE  3 : 4  @  3 : 4
+
+~ 	public Map<Block, IStateMapper> blockStateMap = Maps.newIdentityHashMap();
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/statemap/DefaultStateMapper.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/statemap/DefaultStateMapper.edit.java
index 4e68ba62..6972c301 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/statemap/DefaultStateMapper.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/block/statemap/DefaultStateMapper.edit.java
@@ -7,4 +7,8 @@
 
 > DELETE  4  @  4 : 5
 
+> CHANGE  7 : 8  @  7 : 8
+
+~ 				getPropertyString(iblockstate.getProperties()));
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMap.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMap.edit.java
index a7247f30..a9792d49 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMap.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMap.edit.java
@@ -24,4 +24,8 @@
 
 ~ 			s = this.name.getName(linkedhashmap.remove(this.name));
 
+> CHANGE  10 : 11  @  10 : 11
+
+~ 		return new ModelResourceLocation(s, getPropertyString(linkedhashmap));
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMapperBase.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMapperBase.edit.java
index 82d5311a..fcbd1922 100644
--- a/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMapperBase.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/block/statemap/StateMapperBase.edit.java
@@ -15,4 +15,8 @@
 
 > DELETE  3  @  3 : 4
 
+> CHANGE  5 : 6  @  5 : 6
+
+~ 	public static String getPropertyString(Map<IProperty, Comparable> parMap) {
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RenderItem.edit.java b/patches/minecraft/net/minecraft/client/renderer/entity/RenderItem.edit.java
index 88a65bc3..e8048a44 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/RenderItem.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/RenderItem.edit.java
@@ -27,104 +27,141 @@
 
 + import net.minecraft.util.EnumWorldBlockLayer;
 
-> CHANGE  55 : 58  @  55 : 56
+> INSERT  3 : 5  @  3
+
++ import net.optifine.Config;
++ import net.optifine.CustomItems;
+
+> INSERT  8 : 9  @  8
+
++ 	private ModelResourceLocation modelLocation = null;
+
+> CHANGE  35 : 36  @  35 : 36
+
+~ 	public void renderModel(IBakedModel model, int color) {
+
+> CHANGE  8 : 11  @  8 : 9
 
 ~ 		EnumFacing[] facings = EnumFacing._VALUES;
 ~ 		for (int i = 0; i < facings.length; ++i) {
 ~ 			EnumFacing enumfacing = facings[i];
 
-> INSERT  7 : 11  @  7
+> CHANGE  7 : 12  @  7 : 8
 
-+ 	public static float renderPosX = 0.0f;
-+ 	public static float renderPosY = 0.0f;
-+ 	public static float renderPosZ = 0.0f;
+~ 	public static float renderPosX = 0.0f;
+~ 	public static float renderPosY = 0.0f;
+~ 	public static float renderPosZ = 0.0f;
+~ 
+~ 	public void renderItem(ItemStack stack, IBakedModel model_) {
+
+> CHANGE  3 : 4  @  3 : 4
+
+~ 			if (model_.isBuiltInRenderer()) {
+
+> CHANGE  7 : 9  @  7 : 10
+
+~ 				if (Config.isCustomItems()) {
+~ 					model_ = CustomItems.getCustomItemModel(stack, model_, this.modelLocation, false);
+
+> INSERT  1 : 74  @  1
+
++ 				final IBakedModel model = model_;
 + 
++ 				if (DeferredStateManager.isInDeferredPass() && isTransparentItem(stack)) {
++ 					if (DeferredStateManager.forwardCallbackHandler != null) {
++ 						final Matrix4f mat = new Matrix4f(GlStateManager.getModelViewReference());
++ 						final float lx = GlStateManager.getTexCoordX(1), ly = GlStateManager.getTexCoordY(1);
++ 						DeferredStateManager.forwardCallbackHandler.push(new ShadersRenderPassFuture(renderPosX,
++ 								renderPosY, renderPosZ, EaglerDeferredPipeline.instance.getPartialTicks()) {
++ 							@Override
++ 							public void draw(PassType pass) {
++ 								if (pass == PassType.MAIN) {
++ 									DeferredStateManager.reportForwardRenderObjectPosition2(x, y, z);
++ 								}
++ 								EntityRenderer.enableLightmapStatic();
++ 								GlStateManager.pushMatrix();
++ 								GlStateManager.loadMatrix(mat);
++ 								GlStateManager.texCoords2DDirect(1, lx, ly);
++ 								Minecraft.getMinecraft().getTextureManager()
++ 										.bindTexture(TextureMap.locationBlocksTexture);
++ 								RenderItem.this.renderModel(model, stack);
++ 								if (pass != PassType.SHADOW && stack.hasEffect()) {
++ 									GlStateManager.color(1.5F, 0.5F, 1.5F, 1.0F);
++ 									DeferredStateManager.setDefaultMaterialConstants();
++ 									DeferredStateManager.setRoughnessConstant(0.05f);
++ 									DeferredStateManager.setMetalnessConstant(0.01f);
++ 									GlStateManager.blendFunc(768, 1);
++ 									renderEffect(model, stack);
++ 									DeferredStateManager.setHDRTranslucentPassBlendFunc();
++ 								}
++ 								GlStateManager.popMatrix();
++ 								EntityRenderer.disableLightmapStatic();
++ 								GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
++ 							}
++ 						});
++ 					}
++ 				} else {
++ 					this.renderModel(model, stack);
++ 					if (stack.hasEffect()) {
++ 						if (DeferredStateManager.isInDeferredPass()) {
++ 							if (DeferredStateManager.forwardCallbackHandler != null
++ 									&& !DeferredStateManager.isEnableShadowRender()) {
++ 								final Matrix4f mat = new Matrix4f(GlStateManager.getModelViewReference());
++ 								final float lx = GlStateManager.getTexCoordX(1), ly = GlStateManager.getTexCoordY(1);
++ 								DeferredStateManager.forwardCallbackHandler.push(new ShadersRenderPassFuture(renderPosX,
++ 										renderPosY, renderPosZ, EaglerDeferredPipeline.instance.getPartialTicks()) {
++ 									@Override
++ 									public void draw(PassType pass) {
++ 										if (pass == PassType.MAIN) {
++ 											DeferredStateManager.reportForwardRenderObjectPosition2(x, y, z);
++ 										}
++ 										EntityRenderer.enableLightmapStatic();
++ 										GlStateManager.color(1.5F, 0.5F, 1.5F, 1.0F);
++ 										DeferredStateManager.setDefaultMaterialConstants();
++ 										DeferredStateManager.setRoughnessConstant(0.05f);
++ 										DeferredStateManager.setMetalnessConstant(0.01f);
++ 										GlStateManager.pushMatrix();
++ 										GlStateManager.loadMatrix(mat);
++ 										GlStateManager.texCoords2DDirect(1, lx, ly);
++ 										GlStateManager.tryBlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE);
++ 										renderEffect(model, stack);
++ 										DeferredStateManager.setHDRTranslucentPassBlendFunc();
++ 										GlStateManager.popMatrix();
++ 										EntityRenderer.disableLightmapStatic();
++ 										GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
++ 									}
++ 								});
++ 							}
++ 						} else {
++ 							GlStateManager.blendFunc(768, 1);
++ 							this.renderEffect(model, stack);
++ 						}
++ 					}
++ 				}
 
-> CHANGE  12 : 82  @  12 : 15
+> CHANGE  6 : 15  @  6 : 7
 
-~ 				if (DeferredStateManager.isInDeferredPass() && isTransparentItem(stack)) {
-~ 					if (DeferredStateManager.forwardCallbackHandler != null) {
-~ 						final Matrix4f mat = new Matrix4f(GlStateManager.getModelViewReference());
-~ 						final float lx = GlStateManager.getTexCoordX(1), ly = GlStateManager.getTexCoordY(1);
-~ 						DeferredStateManager.forwardCallbackHandler.push(new ShadersRenderPassFuture(renderPosX,
-~ 								renderPosY, renderPosZ, EaglerDeferredPipeline.instance.getPartialTicks()) {
-~ 							@Override
-~ 							public void draw(PassType pass) {
-~ 								if (pass == PassType.MAIN) {
-~ 									DeferredStateManager.reportForwardRenderObjectPosition2(x, y, z);
-~ 								}
-~ 								EntityRenderer.enableLightmapStatic();
-~ 								GlStateManager.pushMatrix();
-~ 								GlStateManager.loadMatrix(mat);
-~ 								GlStateManager.texCoords2DDirect(1, lx, ly);
-~ 								Minecraft.getMinecraft().getTextureManager()
-~ 										.bindTexture(TextureMap.locationBlocksTexture);
-~ 								RenderItem.this.renderModel(model, stack);
-~ 								if (pass != PassType.SHADOW && stack.hasEffect()) {
-~ 									GlStateManager.color(1.5F, 0.5F, 1.5F, 1.0F);
-~ 									DeferredStateManager.setDefaultMaterialConstants();
-~ 									DeferredStateManager.setRoughnessConstant(0.05f);
-~ 									DeferredStateManager.setMetalnessConstant(0.01f);
-~ 									GlStateManager.blendFunc(768, 1);
-~ 									renderEffect(model);
-~ 									DeferredStateManager.setHDRTranslucentPassBlendFunc();
-~ 								}
-~ 								GlStateManager.popMatrix();
-~ 								EntityRenderer.disableLightmapStatic();
-~ 								GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
-~ 							}
-~ 						});
-~ 					}
-~ 				} else {
-~ 					this.renderModel(model, stack);
-~ 					if (stack.hasEffect()) {
-~ 						if (DeferredStateManager.isInDeferredPass()) {
-~ 							if (DeferredStateManager.forwardCallbackHandler != null
-~ 									&& !DeferredStateManager.isEnableShadowRender()) {
-~ 								final Matrix4f mat = new Matrix4f(GlStateManager.getModelViewReference());
-~ 								final float lx = GlStateManager.getTexCoordX(1), ly = GlStateManager.getTexCoordY(1);
-~ 								DeferredStateManager.forwardCallbackHandler.push(new ShadersRenderPassFuture(renderPosX,
-~ 										renderPosY, renderPosZ, EaglerDeferredPipeline.instance.getPartialTicks()) {
-~ 									@Override
-~ 									public void draw(PassType pass) {
-~ 										if (pass == PassType.MAIN) {
-~ 											DeferredStateManager.reportForwardRenderObjectPosition2(x, y, z);
-~ 										}
-~ 										EntityRenderer.enableLightmapStatic();
-~ 										GlStateManager.color(1.5F, 0.5F, 1.5F, 1.0F);
-~ 										DeferredStateManager.setDefaultMaterialConstants();
-~ 										DeferredStateManager.setRoughnessConstant(0.05f);
-~ 										DeferredStateManager.setMetalnessConstant(0.01f);
-~ 										GlStateManager.pushMatrix();
-~ 										GlStateManager.loadMatrix(mat);
-~ 										GlStateManager.texCoords2DDirect(1, lx, ly);
-~ 										GlStateManager.tryBlendFuncSeparate(GL_ONE, GL_ONE, GL_ZERO, GL_ONE);
-~ 										renderEffect(model);
-~ 										DeferredStateManager.setHDRTranslucentPassBlendFunc();
-~ 										GlStateManager.popMatrix();
-~ 										EntityRenderer.disableLightmapStatic();
-~ 										GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
-~ 									}
-~ 								});
-~ 							}
-~ 						} else {
-~ 							GlStateManager.blendFunc(768, 1);
-~ 							this.renderEffect(model);
-~ 						}
-~ 					}
+~ 	private static boolean isTransparentItem(ItemStack stack) {
+~ 		Item itm = stack.getItem();
+~ 		return itm instanceof ItemBlock
+~ 				&& ((ItemBlock) itm).getBlock().getBlockLayer() == EnumWorldBlockLayer.TRANSLUCENT;
+~ 	}
+~ 
+~ 	private void renderEffect(IBakedModel model, ItemStack stack) {
+~ 		if (Config.isCustomItems() && (CustomItems.renderCustomEffect(this, stack, model) || !CustomItems.isUseGlint()))
+~ 			return;
 
-> INSERT  7 : 13  @  7
+> DELETE  3  @  3 : 4
 
-+ 	private static boolean isTransparentItem(ItemStack stack) {
-+ 		Item itm = stack.getItem();
-+ 		return itm instanceof ItemBlock
-+ 				&& ((ItemBlock) itm).getBlock().getBlockLayer() == EnumWorldBlockLayer.TRANSLUCENT;
-+ 	}
-+ 
+> INSERT  104 : 105  @  104
 
-> DELETE  4  @  4 : 5
++ 					this.modelLocation = modelresourcelocation;
 
-> INSERT  123 : 124  @  123
+> INSERT  4 : 5  @  4
+
++ 			this.modelLocation = null;
+
+> INSERT  15 : 16  @  15
 
 + 		boolean flag = DeferredStateManager.isEnableShadowRender();
 
diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerArmorBase.edit.java b/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerArmorBase.edit.java
index 9c39ad06..639c41c0 100644
--- a/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerArmorBase.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerArmorBase.edit.java
@@ -25,13 +25,24 @@
 
 > DELETE  1  @  1 : 2
 
-> CHANGE  47 : 48  @  47 : 48
+> INSERT  4 : 6  @  4
+
++ import net.optifine.Config;
++ import net.optifine.CustomItems;
+
+> CHANGE  43 : 44  @  43 : 44
 
 ~ 			this.func_177179_a((T) modelbase, parInt1);
 
-> INSERT  2 : 3  @  2
+> CHANGE  1 : 8  @  1 : 2
 
-+ 			DeferredStateManager.setDefaultMaterialConstants();
+~ 
+~ 			if (!Config.isCustomItems()
+~ 					|| !CustomItems.bindCustomArmorTexture(itemstack, flag ? 2 : 1, (String) null)) {
+~ 				this.renderer.bindTexture(this.getArmorResource(itemarmor, flag));
+~ 			}
+~ 
+~ 			DeferredStateManager.setDefaultMaterialConstants();
 
 > INSERT  1 : 18  @  1
 
@@ -53,11 +64,18 @@
 + 			}
 + 			switch (itemarmor.getArmorMaterial()) {
 
-> INSERT  14 : 15  @  14
+> CHANGE  7 : 11  @  7 : 8
+
+~ 				if (!Config.isCustomItems()
+~ 						|| !CustomItems.bindCustomArmorTexture(itemstack, flag ? 2 : 1, "overlay")) {
+~ 					this.renderer.bindTexture(this.getArmorResource(itemarmor, flag, "overlay"));
+~ 				}
+
+> INSERT  6 : 7  @  6
 
 + 				DeferredStateManager.setDefaultMaterialConstants();
 
-> CHANGE  2 : 41  @  2 : 3
+> CHANGE  2 : 43  @  2 : 4
 
 ~ 					if (DeferredStateManager.isInDeferredPass()) {
 ~ 						if (!DeferredStateManager.isEnableShadowRender()
@@ -86,7 +104,8 @@
 ~ 									modelbase.setLivingAnimations(entitylivingbaseIn, armorSlot, parFloat2, parFloat3);
 ~ 									LayerArmorBase.this.func_177179_a((T) modelbase, parInt1);
 ~ 									LayerArmorBase.this.func_177183_a(entitylivingbaseIn, (T) modelbase, armorSlot,
-~ 											parFloat2, parFloat3, parFloat4, parFloat5, parFloat6, parFloat7);
+~ 											parFloat2, parFloat3, parFloat4, parFloat5, parFloat6, parFloat7,
+~ 											itemstack);
 ~ 									DeferredStateManager.setHDRTranslucentPassBlendFunc();
 ~ 									GlStateManager.enableBlend();
 ~ 									GlStateManager.popMatrix();
@@ -98,8 +117,17 @@
 ~ 						break;
 ~ 					}
 ~ 					this.func_177183_a(entitylivingbaseIn, (T) modelbase, armorSlot, parFloat2, parFloat3, parFloat4,
+~ 							parFloat5, parFloat6, parFloat7, itemstack);
 
-> CHANGE  27 : 31  @  27 : 28
+> CHANGE  19 : 24  @  19 : 20
+
+~ 			float parFloat3, float parFloat4, float parFloat5, float parFloat6, float parFloat7, ItemStack itemstack) {
+~ 		if (Config.isCustomItems() && CustomItems.renderCustomArmorEffect(entitylivingbaseIn, itemstack, modelbaseIn,
+~ 				parFloat1, parFloat2, parFloat3, parFloat4, parFloat5, parFloat6, parFloat7)) {
+~ 			return;
+~ 		}
+
+> CHANGE  6 : 10  @  6 : 7
 
 ~ 		boolean d = !DeferredStateManager.isInDeferredPass();
 ~ 		if (d) {
diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/TextureClock.edit.java b/patches/minecraft/net/minecraft/client/renderer/texture/TextureClock.edit.java
index fabebcdc..0f56e25b 100644
--- a/patches/minecraft/net/minecraft/client/renderer/texture/TextureClock.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/texture/TextureClock.edit.java
@@ -16,16 +16,22 @@
 
 ~ public class TextureClock extends EaglerTextureAtlasSprite {
 
-> CHANGE  7 : 8  @  7 : 8
+> CHANGE  41 : 48  @  41 : 43
 
-~ 	public void updateAnimation(IFramebufferGL[] copyColorFramebuffer) {
+~ 				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+~ 					animationCache.copyFrameToTex2D(this.frameCounter, mapLevel, this.originX >> mapLevel,
+~ 							this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+~ 							mapHeight);
+~ 				};
+~ 			} else {
+~ 				currentAnimUpdater = null;
 
-> CHANGE  33 : 35  @  33 : 35
+> INSERT  2 : 4  @  2
 
-~ 				animationCache.copyFrameLevelsToTex2D(this.frameCounter, this.originX, this.originY, this.width,
-~ 						this.height, copyColorFramebuffer);
++ 		} else {
++ 			currentAnimUpdater = null;
 
-> INSERT  4 : 5  @  4
+> INSERT  2 : 3  @  2
 
 + 
 
diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/TextureCompass.edit.java b/patches/minecraft/net/minecraft/client/renderer/texture/TextureCompass.edit.java
index 0b44a73a..ff9923fa 100644
--- a/patches/minecraft/net/minecraft/client/renderer/texture/TextureCompass.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/texture/TextureCompass.edit.java
@@ -16,28 +16,22 @@
 
 ~ public class TextureCompass extends EaglerTextureAtlasSprite {
 
-> CHANGE  9 : 10  @  9 : 10
+> CHANGE  62 : 69  @  62 : 64
 
-~ 	public void updateAnimation(IFramebufferGL[] copyColorFramebuffer) {
+~ 				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+~ 					animationCache.copyFrameToTex2D(this.frameCounter, mapLevel, this.originX >> mapLevel,
+~ 							this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+~ 							mapHeight);
+~ 				};
+~ 			} else {
+~ 				currentAnimUpdater = null;
 
-> CHANGE  3 : 4  @  3 : 4
+> INSERT  2 : 4  @  2
 
-~ 					(double) minecraft.thePlayer.rotationYaw, false, false, copyColorFramebuffer);
++ 		} else {
++ 			currentAnimUpdater = null;
 
-> CHANGE  1 : 2  @  1 : 2
-
-~ 			this.updateCompass((World) null, 0.0D, 0.0D, 0.0D, true, false, copyColorFramebuffer);
-
-> CHANGE  5 : 6  @  5 : 6
-
-~ 			boolean parFlag2, IFramebufferGL[] copyColorFramebuffer) {
-
-> CHANGE  40 : 42  @  40 : 42
-
-~ 				animationCache.copyFrameLevelsToTex2D(this.frameCounter, this.originX, this.originY, this.width,
-~ 						this.height, copyColorFramebuffer);
-
-> INSERT  4 : 5  @  4
+> INSERT  2 : 3  @  2
 
 + 
 
diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/TextureMap.edit.java b/patches/minecraft/net/minecraft/client/renderer/texture/TextureMap.edit.java
index 11758fce..9003e766 100644
--- a/patches/minecraft/net/minecraft/client/renderer/texture/TextureMap.edit.java
+++ b/patches/minecraft/net/minecraft/client/renderer/texture/TextureMap.edit.java
@@ -34,7 +34,12 @@
 
 > DELETE  2  @  2 : 8
 
-> DELETE  9  @  9 : 11
+> CHANGE  9 : 13  @  9 : 11
+
+~ import net.optifine.BetterGrass;
+~ import net.optifine.ConnectedTextures;
+~ import net.optifine.CustomItems;
+~ import net.optifine.util.CounterInt;
 
 > INSERT  1 : 3  @  1
 
@@ -47,7 +52,7 @@
 ~ 	private final Map<String, EaglerTextureAtlasSprite> mapRegisteredSprites;
 ~ 	private final Map<String, EaglerTextureAtlasSprite> mapUploadedSprites;
 
-> CHANGE  3 : 11  @  3 : 4
+> CHANGE  3 : 12  @  3 : 4
 
 ~ 	private final EaglerTextureAtlasSprite missingImage;
 ~ 	private final EaglerTextureAtlasSpritePBR missingImagePBR;
@@ -57,6 +62,7 @@
 ~ 	public int eaglerPBRMaterialTexture = -1;
 ~ 	private boolean hasAllocatedEaglerPBRMaterialTexture = false;
 ~ 	private boolean isGLES2 = false;
+~ 	private CounterInt counterIndexInMap;
 
 > INSERT  1 : 7  @  1
 
@@ -72,12 +78,15 @@
 ~ 		this.missingImage = new EaglerTextureAtlasSprite("missingno");
 ~ 		this.missingImagePBR = new EaglerTextureAtlasSpritePBR("missingno");
 
-> INSERT  2 : 3  @  2
+> INSERT  2 : 4  @  2
 
 + 		this.isGLES2 = EaglercraftGPU.checkOpenGLESVersion() == 200;
++ 		this.counterIndexInMap = new CounterInt(0);
 
-> INSERT  9 : 25  @  9
+> INSERT  9 : 28  @  9
 
++ 		int idx = this.counterIndexInMap.nextValue();
++ 		this.missingImage.setIndexInMap(idx);
 + 		this.missingImagePBR.setIconWidth(16);
 + 		this.missingImagePBR.setIconHeight(16);
 + 		int[][][] aint2 = new int[3][this.mipmapLevels + 1][];
@@ -94,6 +103,7 @@
 + 		aint2[2][0] = missingMaterial;
 + 		this.missingImagePBR.setFramesTextureDataPBR(new List[] { Lists.newArrayList(new int[][][] { aint2[0] }),
 + 				Lists.newArrayList(new int[][][] { aint2[1] }), Lists.newArrayList(new int[][][] { aint2[2] }) });
++ 		this.missingImagePBR.setIndexInMap(idx);
 
 > DELETE  6  @  6 : 7
 
@@ -101,7 +111,11 @@
 
 + 		destroyAnimationCaches();
 
-> INSERT  7 : 27  @  7
+> INSERT  1 : 2  @  1
+
++ 		this.counterIndexInMap.reset();
+
+> INSERT  6 : 26  @  6
 
 + 	public void deleteGlTexture() {
 + 		super.deleteGlTexture();
@@ -124,7 +138,13 @@
 + 	}
 + 
 
-> INSERT  8 : 44  @  8
+> INSERT  1 : 4  @  1
+
++ 		ConnectedTextures.updateIcons(this);
++ 		CustomItems.updateIcons(this);
++ 		BetterGrass.updateIcons(this);
+
+> INSERT  7 : 43  @  7
 
 + 		if (copyColorFramebuffer != null) {
 + 			for (int l = 0; l < copyColorFramebuffer.length; ++l) {
@@ -163,11 +183,12 @@
 + 		}
 + 
 
-> CHANGE  1 : 2  @  1 : 2
+> CHANGE  1 : 3  @  1 : 2
 
 ~ 			EaglerTextureAtlasSprite textureatlassprite = (EaglerTextureAtlasSprite) entry.getValue();
+~ 			textureatlassprite.updateIndexInMap(this.counterIndexInMap);
 
-> INSERT  3 : 105  @  3
+> INSERT  3 : 106  @  3
 
 + 			if (isEaglerPBRMode) {
 + 				try {
@@ -188,7 +209,7 @@
 + 					}
 + 					if (abufferedimageMaterial[0] == null) {
 + 						abufferedimageMaterial[0] = PBRTextureMapUtils.generateMaterialTextureFor(
-+ 								((EaglerTextureAtlasSprite) (entry.getValue())).getIconName());
++ 								textureatlassprite.getIconName(), textureatlassprite.optifineBaseTextureName);
 + 						dontAnimateMaterial = true;
 + 					}
 + 					PBRTextureMapUtils.unifySizes(0, abufferedimageColor, abufferedimageNormal, abufferedimageMaterial);
@@ -224,7 +245,8 @@
 + 									}
 + 									if (abufferedimageMaterial[i2] == null) {
 + 										abufferedimageMaterial[i2] = PBRTextureMapUtils.generateMaterialTextureFor(
-+ 												((EaglerTextureAtlasSprite) (entry.getValue())).getIconName());
++ 												textureatlassprite.getIconName(),
++ 												textureatlassprite.optifineBaseTextureName);
 + 									}
 + 									PBRTextureMapUtils.unifySizes(i2, abufferedimageColor, abufferedimageNormal,
 + 											abufferedimageMaterial);
@@ -382,13 +404,30 @@
 
 + 		_wglBindFramebuffer(_GL_FRAMEBUFFER, null);
 
-> CHANGE  5 : 7  @  5 : 7
+> CHANGE  3 : 12  @  3 : 8
 
-~ 						HString.format("%s/%s%s", new Object[] { this.basePath, location.getResourcePath(), ".png" }))
-~ 				: new ResourceLocation(location.getResourceDomain(), HString.format("%s/mipmaps/%s.%d%s",
+~ 		return isAbsoluteLocation(location)
+~ 				? new ResourceLocation(location.getResourceDomain(), location.getResourcePath() + ".png")
+~ 				: (parInt1 == 0
+~ 						? new ResourceLocation(location.getResourceDomain(),
+~ 								HString.format("%s/%s%s",
+~ 										new Object[] { this.basePath, location.getResourcePath(), ".png" }))
+~ 						: new ResourceLocation(location.getResourceDomain(),
+~ 								HString.format("%s/mipmaps/%s.%d%s", new Object[] { this.basePath,
+~ 										location.getResourcePath(), Integer.valueOf(parInt1), ".png" })));
 
-> CHANGE  3 : 5  @  3 : 5
+> CHANGE  2 : 14  @  2 : 4
 
+~ 	private boolean isAbsoluteLocation(ResourceLocation p_isAbsoluteLocation_1_) {
+~ 		String s = p_isAbsoluteLocation_1_.getResourcePath();
+~ 		return this.isAbsoluteLocationPath(s);
+~ 	}
+~ 
+~ 	private boolean isAbsoluteLocationPath(String p_isAbsoluteLocationPath_1_) {
+~ 		String s = p_isAbsoluteLocationPath_1_.toLowerCase();
+~ 		return s.startsWith("mcpatcher/") || s.startsWith("optifine/");
+~ 	}
+~ 
 ~ 	public EaglerTextureAtlasSprite getAtlasSprite(String iconName) {
 ~ 		EaglerTextureAtlasSprite textureatlassprite = (EaglerTextureAtlasSprite) this.mapUploadedSprites.get(iconName);
 
@@ -396,12 +435,26 @@
 
 ~ 			textureatlassprite = isEaglerPBRMode ? missingImagePBR : missingImage;
 
-> CHANGE  6 : 14  @  6 : 7
+> CHANGE  6 : 28  @  6 : 7
 
 ~ 		if (isEaglerPBRMode) {
-~ 			for (int i = 0, l = this.listAnimatedSprites.size(); i < l; ++i) {
-~ 				this.listAnimatedSprites.get(i).updateAnimationPBR(copyColorFramebuffer, copyMaterialFramebuffer,
-~ 						height);
+~ 			for (int j = 0, l = this.listAnimatedSprites.size(); j < l; ++j) {
+~ 				this.listAnimatedSprites.get(j).updateAnimationPBR();
+~ 			}
+~ 			for (int i = 0; i < copyColorFramebuffer.length; ++i) {
+~ 				int w = width >> i;
+~ 				int h = height >> i;
+~ 				_wglBindFramebuffer(_GL_FRAMEBUFFER, copyColorFramebuffer[i]);
+~ 				GlStateManager.viewport(0, 0, w, h);
+~ 				for (int j = 0, l = this.listAnimatedSprites.size(); j < l; ++j) {
+~ 					this.listAnimatedSprites.get(j).copyAnimationFramePBR(0, w, h, i);
+~ 				}
+~ 				_wglBindFramebuffer(_GL_FRAMEBUFFER, copyMaterialFramebuffer[i]);
+~ 				h <<= 1;
+~ 				GlStateManager.viewport(0, 0, w, h);
+~ 				for (int j = 0, l = this.listAnimatedSprites.size(); j < l; ++j) {
+~ 					this.listAnimatedSprites.get(j).copyAnimationFramePBR(1, w, h, i);
+~ 				}
 ~ 			}
 ~ 			_wglBindFramebuffer(_GL_FRAMEBUFFER, null);
 ~ 			return;
@@ -409,14 +462,24 @@
 
 > CHANGE  1 : 3  @  1 : 3
 
-~ 		for (int i = 0, l = this.listAnimatedSprites.size(); i < l; ++i) {
-~ 			this.listAnimatedSprites.get(i).updateAnimation(copyColorFramebuffer);
+~ 		for (int j = 0, l = this.listAnimatedSprites.size(); j < l; ++j) {
+~ 			this.listAnimatedSprites.get(j).updateAnimation();
 
-> INSERT  2 : 3  @  2
+> INSERT  2 : 13  @  2
 
++ 		for (int i = 0; i < copyColorFramebuffer.length; ++i) {
++ 			int w = width >> i;
++ 			int h = height >> i;
++ 			_wglBindFramebuffer(_GL_FRAMEBUFFER, copyColorFramebuffer[i]);
++ 			GlStateManager.viewport(0, 0, w, h);
++ 			for (int j = 0, l = this.listAnimatedSprites.size(); j < l; ++j) {
++ 				this.listAnimatedSprites.get(j).copyAnimationFrame(w, h, i);
++ 			}
++ 		}
++ 
 + 		_wglBindFramebuffer(_GL_FRAMEBUFFER, null);
 
-> CHANGE  2 : 9  @  2 : 3
+> CHANGE  2 : 13  @  2 : 3
 
 ~ 	private void destroyAnimationCaches() {
 ~ 		for (int i = 0, l = this.listAnimatedSprites.size(); i < l; ++i) {
@@ -425,21 +488,30 @@
 ~ 	}
 ~ 
 ~ 	public EaglerTextureAtlasSprite registerSprite(ResourceLocation location) {
+~ 		return registerSprite(location, null);
+~ 	}
+~ 
+~ 	public EaglerTextureAtlasSprite registerSprite(ResourceLocation location, String locationOptifineBase) {
 
 > CHANGE  3 : 5  @  3 : 4
 
 ~ 			EaglerTextureAtlasSprite textureatlassprite = (EaglerTextureAtlasSprite) this.mapRegisteredSprites
-~ 					.get(location);
+~ 					.get(location.toString());
 
-> CHANGE  1 : 6  @  1 : 2
+> CHANGE  1 : 7  @  1 : 2
 
 ~ 				if (isEaglerPBRMode) {
 ~ 					textureatlassprite = EaglerTextureAtlasSpritePBR.makeAtlasSprite(location);
 ~ 				} else {
 ~ 					textureatlassprite = EaglerTextureAtlasSprite.makeAtlasSprite(location);
 ~ 				}
+~ 				textureatlassprite.optifineBaseTextureName = locationOptifineBase;
 
-> CHANGE  12 : 18  @  12 : 13
+> INSERT  1 : 2  @  1
+
++ 				textureatlassprite.updateIndexInMap(this.counterIndexInMap);
+
+> CHANGE  11 : 17  @  11 : 12
 
 ~ 		if (!isGLES2) {
 ~ 			this.mipmapLevels = mipmapLevelsIn;
@@ -453,7 +525,7 @@
 ~ 	public EaglerTextureAtlasSprite getMissingSprite() {
 ~ 		return isEaglerPBRMode ? missingImagePBR : missingImage;
 
-> INSERT  1 : 27  @  1
+> INSERT  1 : 36  @  1
 
 + 
 + 	public int getWidth() {
@@ -481,5 +553,14 @@
 + 			}
 + 		}
 + 	}
++ 
++ 	public EaglerTextureAtlasSprite getSpriteSafe(String iconName) {
++ 		ResourceLocation resourcelocation = new ResourceLocation(iconName);
++ 		return this.mapRegisteredSprites.get(resourcelocation.toString());
++ 	}
++ 
++ 	public int getCountRegisteredSprites() {
++ 		return this.counterIndexInMap.getValue();
++ 	}
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/resources/AbstractResourcePack.edit.java b/patches/minecraft/net/minecraft/client/resources/AbstractResourcePack.edit.java
index c4aad381..d8eb1499 100644
--- a/patches/minecraft/net/minecraft/client/resources/AbstractResourcePack.edit.java
+++ b/patches/minecraft/net/minecraft/client/resources/AbstractResourcePack.edit.java
@@ -7,7 +7,7 @@
 
 > DELETE  2  @  2 : 9
 
-> CHANGE  2 : 13  @  2 : 3
+> CHANGE  2 : 14  @  2 : 3
 
 ~ import java.nio.charset.StandardCharsets;
 ~ 
@@ -19,15 +19,17 @@
 ~ import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 ~ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 ~ import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerFolderResourcePack;
+~ import net.lax1dude.eaglercraft.v1_8.minecraft.ResourceIndex;
 ~ import net.lax1dude.eaglercraft.v1_8.opengl.ImageData;
 
 > DELETE  1  @  1 : 2
 
 > DELETE  3  @  3 : 6
 
-> CHANGE  3 : 4  @  3 : 4
+> CHANGE  3 : 5  @  3 : 4
 
 ~ 	protected final String resourcePackFile;
+~ 	protected ResourceIndex resourceIndex;
 
 > CHANGE  1 : 2  @  1 : 2
 
@@ -50,11 +52,11 @@
 ~ 			throw e;
 ~ 		}
 
-> CHANGE  4 : 5  @  4 : 6
+> CHANGE  4 : 5  @  4 : 7
 
 ~ 		JSONObject jsonobject = null;
 
-> CHANGE  2 : 5  @  2 : 6
+> CHANGE  1 : 4  @  1 : 5
 
 ~ 			jsonobject = new JSONObject(IOUtils.inputStreamToString(parInputStream, StandardCharsets.UTF_8));
 ~ 		} catch (RuntimeException | IOException runtimeexception) {
@@ -72,4 +74,11 @@
 
 ~ 		return this.resourcePackFile;
 
+> INSERT  1 : 5  @  1
+
++ 
++ 	public ResourceIndex getEaglerFileIndex() {
++ 		return this.resourceIndex;
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/resources/DefaultResourcePack.edit.java b/patches/minecraft/net/minecraft/client/resources/DefaultResourcePack.edit.java
index 2c1f9b9f..e782916e 100644
--- a/patches/minecraft/net/minecraft/client/resources/DefaultResourcePack.edit.java
+++ b/patches/minecraft/net/minecraft/client/resources/DefaultResourcePack.edit.java
@@ -7,25 +7,44 @@
 
 > DELETE  2  @  2 : 6
 
-> DELETE  3  @  3 : 4
+> CHANGE  3 : 5  @  3 : 4
 
-> INSERT  1 : 6  @  1
+~ import java.util.Collection;
+~ import java.util.Collections;
+
+> INSERT  1 : 8  @  1
 
 + 
 + import com.google.common.collect.ImmutableSet;
 + 
 + import net.lax1dude.eaglercraft.v1_8.EagRuntime;
++ import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerFolderResourcePack;
++ import net.lax1dude.eaglercraft.v1_8.minecraft.ResourceIndex;
 + import net.lax1dude.eaglercraft.v1_8.opengl.ImageData;
 
 > DELETE  1  @  1 : 3
 
-> CHANGE  5 : 6  @  5 : 7
+> CHANGE  4 : 6  @  4 : 7
 
+~ public class DefaultResourcePack extends ResourceIndex implements IResourcePack {
 ~ 	public static final Set<String> defaultResourceDomains = ImmutableSet.of("minecraft", "eagler");
 
-> DELETE  1  @  1 : 5
+> CHANGE  1 : 13  @  1 : 3
 
-> CHANGE  15 : 16  @  15 : 17
+~ 	private final Collection<String> propertyFilesIndex;
+~ 
+~ 	public DefaultResourcePack() {
+~ 		String str = EagRuntime.getResourceString("/assets/minecraft/optifine/_property_files_index.json");
+~ 		if (str != null) {
+~ 			Collection<String> lst = EaglerFolderResourcePack.loadPropertyFileList(str);
+~ 			if (lst != null) {
+~ 				propertyFilesIndex = lst;
+~ 				return;
+~ 			}
+~ 		}
+~ 		propertyFilesIndex = Collections.emptyList();
+
+> CHANGE  17 : 18  @  17 : 19
 
 ~ 		return null;
 
@@ -52,4 +71,22 @@
 ~ 	public ImageData getPackImage() throws IOException {
 ~ 		return TextureUtil.readBufferedImage(EagRuntime.getRequiredResourceStream("pack.png"));
 
+> INSERT  5 : 20  @  5
+
++ 
++ 	@Override
++ 	public ResourceIndex getEaglerFileIndex() {
++ 		return this;
++ 	}
++ 
++ 	@Override
++ 	protected Collection<String> getPropertiesFiles0() {
++ 		return propertyFilesIndex;
++ 	}
++ 
++ 	@Override
++ 	protected Collection<String> getCITPotionsFiles0() {
++ 		return Collections.emptyList();
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/resources/IResourcePack.edit.java b/patches/minecraft/net/minecraft/client/resources/IResourcePack.edit.java
index 03f76d57..abb9e4e9 100644
--- a/patches/minecraft/net/minecraft/client/resources/IResourcePack.edit.java
+++ b/patches/minecraft/net/minecraft/client/resources/IResourcePack.edit.java
@@ -7,13 +7,23 @@
 
 > DELETE  2  @  2 : 3
 
-> INSERT  3 : 5  @  3
+> INSERT  2 : 3  @  2
+
++ import java.util.Collection;
+
+> INSERT  1 : 4  @  1
 
 + 
++ import net.lax1dude.eaglercraft.v1_8.minecraft.ResourceIndex;
 + import net.lax1dude.eaglercraft.v1_8.opengl.ImageData;
 
 > CHANGE  13 : 14  @  13 : 14
 
 ~ 	ImageData getPackImage() throws IOException;
 
+> INSERT  2 : 4  @  2
+
++ 
++ 	ResourceIndex getEaglerFileIndex();
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/resources/model/ModelBakery.edit.java b/patches/minecraft/net/minecraft/client/resources/model/ModelBakery.edit.java
index c2523cc9..08b8a0d7 100644
--- a/patches/minecraft/net/minecraft/client/resources/model/ModelBakery.edit.java
+++ b/patches/minecraft/net/minecraft/client/resources/model/ModelBakery.edit.java
@@ -13,7 +13,7 @@
 
 > DELETE  7  @  7 : 8
 
-> INSERT  1 : 16  @  1
+> INSERT  1 : 18  @  1
 
 + import java.util.Set;
 + 
@@ -29,13 +29,22 @@
 + import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
 + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.BlockVertexIDs;
 + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.VertexMarkerState;
++ import net.minecraft.block.Block;
++ import net.minecraft.block.state.IBlockState;
 + import net.minecraft.client.Minecraft;
 
-> DELETE  9  @  9 : 10
+> INSERT  8 : 10  @  8
+
++ import net.minecraft.client.renderer.block.statemap.IStateMapper;
++ import net.minecraft.client.renderer.block.statemap.StateMapperBase;
+
+> DELETE  1  @  1 : 2
 
 > DELETE  3  @  3 : 9
 
-> DELETE  7  @  7 : 10
+> CHANGE  7 : 8  @  7 : 10
+
+~ import net.optifine.CustomItems;
 
 > CHANGE  20 : 21  @  20 : 21
 
@@ -85,12 +94,44 @@
 
 ~ 			return modelblock;
 
-> CHANGE  21 : 23  @  21 : 22
+> INSERT  4 : 5  @  4
+
++ 		String path = parResourceLocation.getResourcePath();
+
+> CHANGE  1 : 2  @  1 : 2
+
+~ 				((path.startsWith("mcpatcher/") || path.startsWith("optifine/")) ? "" : "models/") + path + ".json");
+
+> CHANGE  15 : 17  @  15 : 16
 
 ~ 								+ Item.itemRegistry.getNameForObject(item) + "\'");
 ~ 						LOGGER.warn(exception);
 
-> INSERT  132 : 133  @  132
+> INSERT  7 : 23  @  7
+
++ 	public void loadItemModel(String p_loadItemModel_1_, ResourceLocation p_loadItemModel_2_,
++ 			ResourceLocation p_loadItemModel_3_) {
++ 		this.itemLocations.put(p_loadItemModel_1_, p_loadItemModel_2_);
++ 
++ 		if (this.models.get(p_loadItemModel_2_) == null) {
++ 			try {
++ 				ModelBlock modelblock = this.loadModel(p_loadItemModel_2_);
++ 				this.models.put(p_loadItemModel_2_, modelblock);
++ 			} catch (Exception exception) {
++ 				LOGGER.warn("Unable to load item model: \'{}\' for item: \'{}\'",
++ 						new Object[] { p_loadItemModel_2_, p_loadItemModel_3_ });
++ 				LOGGER.warn(exception.getClass().getName() + ": " + exception.getMessage());
++ 			}
++ 		}
++ 	}
++ 
+
+> INSERT  107 : 109  @  107
+
++ 		CustomItems.update();
++ 		CustomItems.loadModels(this);
+
+> INSERT  18 : 19  @  18
 
 + 		boolean deferred = Minecraft.getMinecraft().gameSettings.shaders;
 
@@ -168,4 +209,38 @@
 
 ~ 		for (EaglerTextureAtlasSprite textureatlassprite : this.sprites.values()) {
 
+> INSERT  11 : 42  @  11
+
++ 	// eagler hack
++ 	public String getBaseTextureForBlockPre(int blockId, int metadata) {
++ 		Block block = Block.blockRegistry.getObjectById(blockId);
++ 		if (block != null) {
++ 			IBlockState state = block.getStateFromMeta(metadata);
++ 			if (state != null) {
++ 				IStateMapper mapper = blockModelShapes.getBlockStateMapper().blockStateMap.get(block);
++ 				ModelResourceLocation loc = null;
++ 				if (mapper != null) {
++ 					loc = mapper.putStateModelLocations(block).get(state);
++ 				}
++ 				if (loc == null) {
++ 					loc = new ModelResourceLocation(Block.blockRegistry.getNameForObject(block),
++ 							StateMapperBase.getPropertyString(state.getProperties()));
++ 				}
++ 				ModelBlockDefinition.Variants v = variants.get(loc);
++ 				if (v != null && v.getVariants().size() > 0) {
++ 					ModelBlockDefinition.Variant vv = v.getVariants().get(0);
++ 					ModelBlock model = this.models.get(vv.getModelLocation());
++ 					if (model != null) {
++ 						String name = model.resolveTextureName("particle");
++ 						if (name != null) {
++ 							return name;
++ 						}
++ 					}
++ 				}
++ 			}
++ 		}
++ 		return null;
++ 	}
++ 
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/resources/model/ModelManager.edit.java b/patches/minecraft/net/minecraft/client/resources/model/ModelManager.edit.java
index 3df906f3..cea7ec8e 100644
--- a/patches/minecraft/net/minecraft/client/resources/model/ModelManager.edit.java
+++ b/patches/minecraft/net/minecraft/client/resources/model/ModelManager.edit.java
@@ -7,4 +7,20 @@
 
 > DELETE  6  @  6 : 9
 
+> INSERT  8 : 10  @  8
+
++ 	public ModelBakery modelbakerytmp; // eagler hack
++ 
+
+> CHANGE  6 : 14  @  6 : 10
+
+~ 		modelbakerytmp = new ModelBakery(iresourcemanager, this.texMap, this.modelProvider);
+~ 		try {
+~ 			this.modelRegistry = modelbakerytmp.setupModelRegistry();
+~ 			this.defaultModel = (IBakedModel) this.modelRegistry.getObject(ModelBakery.MODEL_MISSING);
+~ 			this.modelProvider.reloadModels();
+~ 		} finally {
+~ 			modelbakerytmp = null;
+~ 		}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java
index e520bb4d..ff3e01ab 100644
--- a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java
+++ b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java
@@ -52,7 +52,9 @@
 
 + import net.minecraft.util.EnumChatFormatting;
 
-> DELETE  2  @  2 : 8
+> CHANGE  2 : 3  @  2 : 8
+
+~ import net.optifine.CustomSky;
 
 > DELETE  3  @  3 : 8
 
@@ -124,7 +126,7 @@
 + 	public boolean hideDefaultUsernameWarning = false;
 + 	public boolean hideVideoSettingsWarning = EagRuntime.getPlatformType() == EnumPlatformType.DESKTOP;
 
-> CHANGE  1 : 15  @  1 : 2
+> CHANGE  1 : 21  @  1 : 2
 
 ~ 	public int voiceListenRadius = 16;
 ~ 	public float voiceListenVolume = 0.5f;
@@ -139,6 +141,12 @@
 ~ 	public float screenRecordGameVolume = ScreenRecordingController.DEFAULT_GAME_VOLUME;
 ~ 	public float screenRecordMicVolume = ScreenRecordingController.DEFAULT_MIC_VOLUME;
 ~ 
+~ 	public int betterGrassOF = 0;
+~ 	public int connectedTexturesOF = 1;
+~ 	public boolean customSkyOF = true;
+~ 	public boolean smartLeavesOF = false;
+~ 	public boolean customItemsOF = true;
+~ 
 ~ 	public GameSettings(Minecraft mcIn) {
 
 > CHANGE  4 : 6  @  4 : 7
@@ -240,53 +248,77 @@
 ~ 		if (parOptions == GameSettings.Options.HUD_STATS) {
 ~ 			this.hudStats = !this.hudStats;
 
-> CHANGE  2 : 4  @  2 : 5
+> CHANGE  2 : 32  @  2 : 3
 
 ~ 		if (parOptions == GameSettings.Options.HUD_WORLD) {
 ~ 			this.hudWorld = !this.hudWorld;
-
-> CHANGE  2 : 4  @  2 : 5
-
+~ 		}
+~ 
 ~ 		if (parOptions == GameSettings.Options.HUD_24H) {
 ~ 			this.hud24h = !this.hud24h;
-
-> CHANGE  2 : 4  @  2 : 5
-
+~ 		}
+~ 
 ~ 		if (parOptions == GameSettings.Options.CHUNK_FIX) {
 ~ 			this.chunkFix = !this.chunkFix;
-
-> CHANGE  2 : 4  @  2 : 4
-
+~ 		}
+~ 
 ~ 		if (parOptions == GameSettings.Options.FOG) {
 ~ 			this.fog = !this.fog;
+~ 		}
+~ 
+~ 		if (parOptions == GameSettings.Options.FXAA) {
+~ 			this.fxaa = (this.fxaa + parInt1) % 3;
+~ 		}
+~ 
+~ 		if (parOptions == GameSettings.Options.FULLSCREEN) {
+~ 			this.mc.toggleFullscreen();
+~ 		}
+~ 
+~ 		if (parOptions == GameSettings.Options.FNAW_SKINS) {
+~ 			this.enableFNAWSkins = !this.enableFNAWSkins;
+~ 			this.mc.getRenderManager().setEnableFNAWSkins(this.mc.getEnableFNAWSkins());
+~ 		}
+~ 
+~ 		if (parOptions == GameSettings.Options.EAGLER_VSYNC) {
+
+> DELETE  1  @  1 : 2
 
 > CHANGE  2 : 4  @  2 : 4
 
-~ 		if (parOptions == GameSettings.Options.FXAA) {
-~ 			this.fxaa = (this.fxaa + parInt1) % 3;
+~ 		if (parOptions == GameSettings.Options.EAGLER_DYNAMIC_LIGHTS) {
+~ 			this.enableDynamicLights = !this.enableDynamicLights;
 
-> INSERT  2 : 24  @  2
+> CHANGE  3 : 9  @  3 : 5
 
-+ 		if (parOptions == GameSettings.Options.FULLSCREEN) {
-+ 			this.mc.toggleFullscreen();
-+ 		}
-+ 
-+ 		if (parOptions == GameSettings.Options.FNAW_SKINS) {
-+ 			this.enableFNAWSkins = !this.enableFNAWSkins;
-+ 			this.mc.getRenderManager().setEnableFNAWSkins(this.mc.getEnableFNAWSkins());
-+ 		}
-+ 
-+ 		if (parOptions == GameSettings.Options.EAGLER_VSYNC) {
-+ 			this.enableVsync = !this.enableVsync;
-+ 		}
-+ 
-+ 		if (parOptions == GameSettings.Options.EAGLER_DYNAMIC_LIGHTS) {
-+ 			this.enableDynamicLights = !this.enableDynamicLights;
+~ 		if (parOptions == GameSettings.Options.EAGLER_PROFANITY_FILTER) {
+~ 			this.enableProfanityFilter = !this.enableProfanityFilter;
+~ 		}
+~ 
+~ 		if (parOptions == GameSettings.Options.OF_CONNECTED_TEXTURES) {
+~ 			this.connectedTexturesOF = (this.connectedTexturesOF + 1) % 3;
+
+> CHANGE  3 : 6  @  3 : 5
+
+~ 		if (parOptions == GameSettings.Options.OF_BETTER_GRASS) {
+~ 			this.betterGrassOF = (this.betterGrassOF + 1) % 3;
+~ 			this.mc.renderGlobal.loadRenderers();
+
+> CHANGE  2 : 5  @  2 : 4
+
+~ 		if (parOptions == GameSettings.Options.OF_CUSTOM_SKIES) {
+~ 			this.customSkyOF = !this.customSkyOF;
+~ 			CustomSky.update();
+
+> INSERT  2 : 12  @  2
+
++ 		if (parOptions == GameSettings.Options.OF_SMART_LEAVES) {
++ 			this.smartLeavesOF = !this.smartLeavesOF;
 + 			this.mc.renderGlobal.loadRenderers();
 + 		}
 + 
-+ 		if (parOptions == GameSettings.Options.EAGLER_PROFANITY_FILTER) {
-+ 			this.enableProfanityFilter = !this.enableProfanityFilter;
++ 		if (parOptions == GameSettings.Options.OF_CUSTOM_ITEMS) {
++ 			this.customItemsOF = !this.customItemsOF;
++ 			this.mc.renderGlobal.loadRenderers();
 + 		}
 + 
 
@@ -298,7 +330,7 @@
 
 > DELETE  20  @  20 : 30
 
-> INSERT  8 : 34  @  8
+> INSERT  8 : 40  @  8
 
 + 		case HUD_COORDS:
 + 			return this.hudCoords;
@@ -326,6 +358,12 @@
 + 			return this.enableDynamicLights;
 + 		case EAGLER_PROFANITY_FILTER:
 + 			return this.enableProfanityFilter;
++ 		case OF_CUSTOM_SKIES:
++ 			return this.customSkyOF;
++ 		case OF_SMART_LEAVES:
++ 			return this.smartLeavesOF;
++ 		case OF_CUSTOM_ITEMS:
++ 			return this.customItemsOF;
 
 > CHANGE  43 : 46  @  43 : 47
 
@@ -374,7 +412,7 @@
 
 > DELETE  11  @  11 : 19
 
-> INSERT  9 : 17  @  9
+> INSERT  9 : 33  @  9
 
 + 		} else if (parOptions == GameSettings.Options.FXAA) {
 + 			if (this.fxaa == 0) {
@@ -384,6 +422,22 @@
 + 			} else {
 + 				return s + I18n.format("options.off");
 + 			}
++ 		} else if (parOptions == GameSettings.Options.OF_CONNECTED_TEXTURES) {
++ 			if (this.connectedTexturesOF == 0) {
++ 				return s + I18n.format("options.off");
++ 			} else if (this.connectedTexturesOF == 1) {
++ 				return s + I18n.format("options.graphics.fast");
++ 			} else {
++ 				return s + I18n.format("options.graphics.fancy");
++ 			}
++ 		} else if (parOptions == GameSettings.Options.OF_BETTER_GRASS) {
++ 			if (this.betterGrassOF == 0) {
++ 				return s + I18n.format("options.off");
++ 			} else if (this.betterGrassOF == 1) {
++ 				return s + I18n.format("options.graphics.fast");
++ 			} else {
++ 				return s + I18n.format("options.graphics.fancy");
++ 			}
 
 > CHANGE  6 : 12  @  6 : 10
 
@@ -547,7 +601,7 @@
 
 ~ 					for (EnumPlayerModelParts enumplayermodelparts : EnumPlayerModelParts._VALUES) {
 
-> INSERT  4 : 74  @  4
+> INSERT  4 : 94  @  4
 
 + 
 + 					if (astring[0].equals("enableFNAWSkins")) {
@@ -618,6 +672,26 @@
 + 						hideVideoSettingsWarning = astring[1].equals("true");
 + 					}
 + 
++ 					if (astring[0].equals("betterGrassOF")) {
++ 						betterGrassOF = Integer.parseInt(astring[1]);
++ 					}
++ 
++ 					if (astring[0].equals("connectedTexturesOF")) {
++ 						connectedTexturesOF = Integer.parseInt(astring[1]);
++ 					}
++ 
++ 					if (astring[0].equals("customSkyOF")) {
++ 						customSkyOF = astring[1].equals("true");
++ 					}
++ 
++ 					if (astring[0].equals("smartLeavesOF")) {
++ 						smartLeavesOF = astring[1].equals("true");
++ 					}
++ 
++ 					if (astring[0].equals("customItemsOF")) {
++ 						customItemsOF = astring[1].equals("true");
++ 					}
++ 
 + 					deferredShaderConf.readOption(astring[0], astring[1]);
 
 > CHANGE  6 : 23  @  6 : 7
@@ -681,7 +755,7 @@
 
 > DELETE  9  @  9 : 20
 
-> INSERT  5 : 37  @  5
+> INSERT  5 : 42  @  5
 
 + 			printwriter.println("hudFps:" + this.hudFps);
 + 			printwriter.println("hudWorld:" + this.hudWorld);
@@ -715,6 +789,11 @@
 + 			printwriter.println("touchControlOpacity:" + this.touchControlOpacity);
 + 			printwriter.println("hideDefaultUsernameWarning:" + this.hideDefaultUsernameWarning);
 + 			printwriter.println("hideVideoSettingsWarning:" + this.hideVideoSettingsWarning);
++ 			printwriter.println("betterGrassOF:" + this.betterGrassOF);
++ 			printwriter.println("connectedTexturesOF:" + this.connectedTexturesOF);
++ 			printwriter.println("customSkyOF:" + this.customSkyOF);
++ 			printwriter.println("smartLeavesOF:" + this.smartLeavesOF);
++ 			printwriter.println("customItemsOF:" + this.customItemsOF);
 
 > CHANGE  5 : 8  @  5 : 6
 
@@ -780,7 +859,7 @@
 
 > DELETE  8  @  8 : 10
 
-> CHANGE  16 : 26  @  16 : 17
+> CHANGE  16 : 29  @  16 : 17
 
 ~ 		ENTITY_SHADOWS("options.entityShadows", false, true), HUD_FPS("options.hud.fps", false, true),
 ~ 		HUD_COORDS("options.hud.coords", false, true), HUD_STATS("options.hud.stats", false, true),
@@ -791,6 +870,9 @@
 ~ 		FNAW_SKINS("options.skinCustomisation.enableFNAWSkins", false, true),
 ~ 		EAGLER_VSYNC("options.vsync", false, true), EAGLER_DYNAMIC_LIGHTS("options.dynamicLights", false, true),
 ~ 		EAGLER_PROFANITY_FILTER("options.profanityFilterButton", false, true),
-~ 		EAGLER_TOUCH_CONTROL_OPACITY("options.touchControlOpacity", true, false);
+~ 		EAGLER_TOUCH_CONTROL_OPACITY("options.touchControlOpacity", true, false),
+~ 		OF_CONNECTED_TEXTURES("options.connectedTexturesOF", false, false),
+~ 		OF_BETTER_GRASS("options.betterGrassOF", false, false), OF_CUSTOM_SKIES("options.customSkiesOF", false, true),
+~ 		OF_SMART_LEAVES("options.smartLeavesOF", false, true), OF_CUSTOM_ITEMS("options.customItemsOF", false, true);
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java b/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java
index 6f8ec08d..b94f3e63 100644
--- a/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java
+++ b/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java
@@ -14,7 +14,11 @@
 + import com.carrotsearch.hppc.cursors.IntObjectCursor;
 + import com.carrotsearch.hppc.cursors.ObjectCursor;
 
-> DELETE  2  @  2 : 5
+> CHANGE  2 : 5  @  2 : 5
+
+~ 
+~ import java.util.Arrays;
+~ import java.util.Collections;
 
 > CHANGE  1 : 3  @  1 : 4
 
@@ -110,7 +114,23 @@
 
 ~ 	public ObjectContainer<PotionEffect> getActivePotionEffects() {
 
-> CHANGE  4 : 5  @  4 : 5
+> INSERT  3 : 16  @  3
+
++ 	public List<PotionEffect> getActivePotionEffectsList() {
++ 		if (activePotionsMap.isEmpty()) {
++ 			return Collections.emptyList();
++ 		}
++ 		PotionEffect[] arr = this.activePotionsMap.values().toArray(PotionEffect.class);
++ 		if (arr.length > 1) {
++ 			Arrays.sort(arr, (p1, p2) -> {
++ 				return p1.getPotionID() - p2.getPotionID();
++ 			});
++ 		}
++ 		return Arrays.asList(arr);
++ 	}
++ 
+
+> CHANGE  1 : 2  @  1 : 2
 
 ~ 		return this.activePotionsMap.containsKey(potionId);
 
diff --git a/patches/minecraft/net/minecraft/network/play/server/S21PacketChunkData.edit.java b/patches/minecraft/net/minecraft/network/play/server/S21PacketChunkData.edit.java
index 1cee1802..a9ee2041 100644
--- a/patches/minecraft/net/minecraft/network/play/server/S21PacketChunkData.edit.java
+++ b/patches/minecraft/net/minecraft/network/play/server/S21PacketChunkData.edit.java
@@ -13,7 +13,11 @@
 + import com.google.common.collect.Lists;
 + 
 
-> CHANGE  59 : 60  @  59 : 60
+> INSERT  19 : 20  @  19
+
++ 		chunkIn.alfheim$getLightingEngine().processLightUpdates();
+
+> CHANGE  40 : 41  @  40 : 41
 
 ~ 		ArrayList<ExtendedBlockStorage> arraylist = Lists.newArrayList();
 
diff --git a/patches/minecraft/net/minecraft/util/BlockPos.edit.java b/patches/minecraft/net/minecraft/util/BlockPos.edit.java
index 0b0ddaf1..4ba98c94 100644
--- a/patches/minecraft/net/minecraft/util/BlockPos.edit.java
+++ b/patches/minecraft/net/minecraft/util/BlockPos.edit.java
@@ -15,7 +15,18 @@
 
 > DELETE  1  @  1 : 5
 
-> INSERT  12 : 16  @  12
+> CHANGE  3 : 11  @  3 : 11
+
+~ 	public static final int NUM_X_BITS = 26;
+~ 	public static final int NUM_Z_BITS = NUM_X_BITS;
+~ 	public static final int NUM_Y_BITS = 64 - NUM_X_BITS - NUM_Z_BITS;
+~ 	public static final int Y_SHIFT = 0 + NUM_Z_BITS;
+~ 	public static final int X_SHIFT = Y_SHIFT + NUM_Y_BITS;
+~ 	public static final long X_MASK = (1L << NUM_X_BITS) - 1L;
+~ 	public static final long Y_MASK = (1L << NUM_Y_BITS) - 1L;
+~ 	public static final long Z_MASK = (1L << NUM_Z_BITS) - 1L;
+
+> INSERT  1 : 5  @  1
 
 + 	public BlockPos() {
 + 		super(0, 0, 0);
diff --git a/patches/minecraft/net/minecraft/util/EnumFacing.edit.java b/patches/minecraft/net/minecraft/util/EnumFacing.edit.java
index 3e4fc29c..41f6c677 100644
--- a/patches/minecraft/net/minecraft/util/EnumFacing.edit.java
+++ b/patches/minecraft/net/minecraft/util/EnumFacing.edit.java
@@ -19,7 +19,11 @@
 + 	public static final EnumFacing[] _VALUES = values();
 + 
 
-> CHANGE  162 : 164  @  162 : 164
+> CHANGE  8 : 9  @  8 : 9
+
+~ 	public static final EnumFacing[] HORIZONTALS = new EnumFacing[4];
+
+> CHANGE  153 : 155  @  153 : 155
 
 ~ 	public static EnumFacing random(EaglercraftRandom rand) {
 ~ 		return _VALUES[rand.nextInt(_VALUES.length)];
diff --git a/patches/minecraft/net/minecraft/world/ChunkCache.edit.java b/patches/minecraft/net/minecraft/world/ChunkCache.edit.java
index 4095d5dc..5fb1fa0d 100644
--- a/patches/minecraft/net/minecraft/world/ChunkCache.edit.java
+++ b/patches/minecraft/net/minecraft/world/ChunkCache.edit.java
@@ -5,24 +5,22 @@
 # Version: 1.0
 # Author: lax1dude
 
-> DELETE  8  @  8 : 12
+> INSERT  2 : 3  @  2
 
-> INSERT  75 : 79  @  75
++ import net.minecraft.block.Block;
 
-+ 	public int getBiomeColorForCoords(BlockPos var1, int index) {
-+ 		return this.worldObj.getBiomeColorForCoords(var1, index);
-+ 	}
-+ 
+> DELETE  6  @  6 : 10
 
-> CHANGE  2 : 3  @  2 : 3
+> CHANGE  47 : 51  @  47 : 49
 
-~ 			return Chunk.getNoSkyLightValue();
+~ 		IBlockState state = getBlockState(blockpos);
+~ 		Block b = state.getBlock();
+~ 		int j = b.alfheim$getLightFor(state, this, EnumSkyBlock.SKY, blockpos);
+~ 		int k = b.alfheim$getLightFor(state, this, EnumSkyBlock.BLOCK, blockpos);
 
-> CHANGE  4 : 8  @  4 : 6
+> CHANGE  26 : 28  @  26 : 53
 
-~ 				EnumFacing[] facings = EnumFacing._VALUES;
-~ 				BlockPos tmp = new BlockPos(0, 0, 0);
-~ 				for (int i = 0; i < facings.length; ++i) {
-~ 					int k = this.getLightFor(pos, parBlockPos.offsetEvenFaster(facings[i], tmp));
+~ 	public int getBiomeColorForCoords(BlockPos var1, int index) {
+~ 		return this.worldObj.getBiomeColorForCoords(var1, index);
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/EnumSkyBlock.edit.java b/patches/minecraft/net/minecraft/world/EnumSkyBlock.edit.java
new file mode 100644
index 00000000..c79c086c
--- /dev/null
+++ b/patches/minecraft/net/minecraft/world/EnumSkyBlock.edit.java
@@ -0,0 +1,13 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> INSERT  7 : 9  @  7
+
++ 	public static final EnumSkyBlock[] _VALUES = values();
++ 
+
+> EOF
diff --git a/patches/minecraft/net/minecraft/world/IBlockAccess.edit.java b/patches/minecraft/net/minecraft/world/IBlockAccess.edit.java
index 0dc2ed20..309a1daa 100644
--- a/patches/minecraft/net/minecraft/world/IBlockAccess.edit.java
+++ b/patches/minecraft/net/minecraft/world/IBlockAccess.edit.java
@@ -12,4 +12,9 @@
 + 	int getBiomeColorForCoords(BlockPos var1, int index);
 + 
 
+> INSERT  5 : 7  @  5
+
++ 
++ 	int getLightFor(final EnumSkyBlock lightType, final BlockPos blockPos);
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/World.edit.java b/patches/minecraft/net/minecraft/world/World.edit.java
index 2fc01b88..811d2e9f 100644
--- a/patches/minecraft/net/minecraft/world/World.edit.java
+++ b/patches/minecraft/net/minecraft/world/World.edit.java
@@ -12,8 +12,10 @@
 + import com.carrotsearch.hppc.LongHashSet;
 + import com.carrotsearch.hppc.LongSet;
 
-> INSERT  3 : 4  @  3
+> INSERT  3 : 6  @  3
 
++ 
++ import dev.redstudio.alfheim.lighting.LightingEngine;
 + 
 
 > DELETE  5  @  5 : 6
@@ -61,21 +63,26 @@
 
 ~ 	protected LongSet activeChunkSet = new LongHashSet();
 
-> INSERT  6 : 7  @  6
+> CHANGE  5 : 6  @  5 : 6
 
-+ 	public final boolean isRemote;
+~ 	public final boolean isRemote;
 
-> CHANGE  1 : 2  @  1 : 3
+> CHANGE  1 : 4  @  1 : 3
 
+~ 	private LightingEngine alfheim$lightingEngine;
+~ 
 ~ 	protected World(ISaveHandler saveHandlerIn, WorldInfo info, WorldProvider providerIn, boolean client) {
 
-> DELETE  5  @  5 : 6
+> DELETE  3  @  3 : 4
+
+> DELETE  1  @  1 : 2
 
 > DELETE  2  @  2 : 3
 
-> INSERT  1 : 2  @  1
+> INSERT  1 : 3  @  1
 
 + 		this.isRemote = client;
++ 		this.alfheim$lightingEngine = new LightingEngine(this);
 
 > CHANGE  17 : 19  @  17 : 18
 
@@ -125,29 +132,27 @@
 
 ~ 							return HString.format("ID #%d (%s // %s)",
 
-> CHANGE  60 : 66  @  60 : 65
+> CHANGE  58 : 60  @  58 : 68
 
-~ 				BlockPos tmp = new BlockPos(0, 0, 0);
-~ 				int i1 = this.getLight(pos.up(tmp), false);
-~ 				int i = this.getLight(pos.east(tmp), false);
-~ 				int j = this.getLight(pos.west(tmp), false);
-~ 				int k = this.getLight(pos.south(tmp), false);
-~ 				int l = this.getLight(pos.north(tmp), false);
+~ 		if (!checkNeighbors)
+~ 			return getLight(pos);
 
-> CHANGE  63 : 64  @  63 : 64
+> CHANGE  1 : 2  @  1 : 4
 
-~ 			return Chunk.getNoSkyLightValue();
+~ 		final IBlockState blockState = getBlockState(pos);
 
-> CHANGE  10 : 16  @  10 : 15
+> CHANGE  1 : 4  @  1 : 23
 
-~ 				BlockPos tmp = new BlockPos();
-~ 				int i1 = this.getLightFor(type, pos.up(tmp));
-~ 				int i = this.getLightFor(type, pos.east(tmp));
-~ 				int j = this.getLightFor(type, pos.west(tmp));
-~ 				int k = this.getLightFor(type, pos.south(tmp));
-~ 				int l = this.getLightFor(type, pos.north(tmp));
+~ 		return Math.max(blockState.getBlock().alfheim$getLightFor(blockState, this, EnumSkyBlock.BLOCK, pos),
+~ 				blockState.getBlock().alfheim$getLightFor(blockState, this, EnumSkyBlock.SKY, pos)
+~ 						- skylightSubtracted);
 
-> CHANGE  59 : 65  @  59 : 60
+> CHANGE  32 : 34  @  32 : 71
+
+~ 		IBlockState state = getBlockState(pos);
+~ 		return state.getBlock().alfheim$getLightFor(state, this, type, pos);
+
+> CHANGE  37 : 43  @  37 : 38
 
 ~ 		if (lightValue < 0) {
 ~ 			j += -lightValue;
@@ -260,11 +265,16 @@
 
 > DELETE  23  @  23 : 24
 
-> CHANGE  5 : 8  @  5 : 6
+> INSERT  1 : 7  @  1
 
-~ 			int l = this.getRenderDistanceChunks() - 1;
-~ 			if (l < 1)
-~ 				l = 1;
++ 		int l = this.getRenderDistanceChunks() - 1;
++ 		if (l > 7)
++ 			l = 7;
++ 		else if (l < 1)
++ 			l = 1;
++ 
+
+> DELETE  4  @  4 : 5
 
 > CHANGE  3 : 4  @  3 : 4
 
@@ -296,51 +306,12 @@
 ~ 				for (int m = 0; m < facings.length; ++m) {
 ~ 					EnumFacing enumfacing = facings[m];
 
-> DELETE  22  @  22 : 23
+> CHANGE  17 : 19  @  17 : 127
 
-> CHANGE  25 : 26  @  25 : 26
+~ 		alfheim$lightingEngine.scheduleLightUpdate(lightType, pos);
+~ 		return true;
 
-~ 								BlockPos blockpos$mutableblockpos = new BlockPos();
-
-> CHANGE  1 : 4  @  1 : 2
-
-~ 								EnumFacing[] facings = EnumFacing._VALUES;
-~ 								for (int m = 0; m < facings.length; ++m) {
-~ 									EnumFacing enumfacing = facings[m];
-
-> DELETE  20  @  20 : 23
-
-> INSERT  6 : 7  @  6
-
-+ 				BlockPos tmp = new BlockPos(0, 0, 0);
-
-> CHANGE  10 : 11  @  10 : 11
-
-~ 							if (this.getLightFor(lightType, blockpos1.west(tmp)) < j6) {
-
-> CHANGE  4 : 5  @  4 : 5
-
-~ 							if (this.getLightFor(lightType, blockpos1.east(tmp)) < j6) {
-
-> CHANGE  4 : 5  @  4 : 5
-
-~ 							if (this.getLightFor(lightType, blockpos1.down(tmp)) < j6) {
-
-> CHANGE  4 : 5  @  4 : 5
-
-~ 							if (this.getLightFor(lightType, blockpos1.up(tmp)) < j6) {
-
-> CHANGE  4 : 5  @  4 : 5
-
-~ 							if (this.getLightFor(lightType, blockpos1.north(tmp)) < j6) {
-
-> CHANGE  4 : 5  @  4 : 5
-
-~ 							if (this.getLightFor(lightType, blockpos1.south(tmp)) < j6) {
-
-> DELETE  8  @  8 : 9
-
-> CHANGE  30 : 33  @  30 : 33
+> CHANGE  28 : 31  @  28 : 31
 
 ~ 				Chunk chunk = this.getChunkFromChunkCoordsIfLoaded(i1, j1);
 ~ 				if (chunk != null) {
@@ -432,4 +403,11 @@
 + 				.getBoolean("loadSpawnChunks"))
 + 			return false;
 
+> INSERT  6 : 10  @  6
+
++ 
++ 	public LightingEngine alfheim$getLightingEngine() {
++ 		return alfheim$lightingEngine;
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/WorldServer.edit.java b/patches/minecraft/net/minecraft/world/WorldServer.edit.java
index dc974847..4e1a5568 100644
--- a/patches/minecraft/net/minecraft/world/WorldServer.edit.java
+++ b/patches/minecraft/net/minecraft/world/WorldServer.edit.java
@@ -42,7 +42,11 @@
 
 > DELETE  6  @  6 : 7
 
-> DELETE  11  @  11 : 12
+> INSERT  1 : 2  @  1
+
++ 		alfheim$getLightingEngine().processLightUpdates();
+
+> DELETE  10  @  10 : 11
 
 > DELETE  1  @  1 : 2
 
diff --git a/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java b/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java
index ecbf353c..bb8f2a49 100644
--- a/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java
+++ b/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java
@@ -5,7 +5,13 @@
 # Version: 1.0
 # Author: lax1dude
 
-> DELETE  4  @  4 : 5
+> CHANGE  4 : 9  @  4 : 5
+
+~ 
+~ import dev.redstudio.alfheim.lighting.LightingEngine;
+~ import dev.redstudio.alfheim.utils.EnumBoundaryFacing;
+~ import dev.redstudio.alfheim.utils.WorldChunkSlice;
+~ 
 
 > INSERT  1 : 2  @  1
 
@@ -36,7 +42,14 @@
 ~ 	private List<BlockPos> tileEntityPosQueue;
 ~ 	private final ChunkCoordIntPair coordsCache;
 
-> CHANGE  8 : 9  @  8 : 9
+> INSERT  1 : 5  @  1
+
++ 	private LightingEngine alfheim$lightingEngine;
++ 	private boolean alfheim$isLightInitialized;
++ 	public short[] alfheim$neighborLightChecks;
++ 
+
+> CHANGE  7 : 8  @  7 : 8
 
 ~ 		this.tileEntityPosQueue = new LinkedList();
 
@@ -44,7 +57,12 @@
 
 + 		this.coordsCache = new ChunkCoordIntPair(x, z);
 
-> CHANGE  38 : 39  @  38 : 39
+> INSERT  7 : 9  @  7
+
++ 
++ 		alfheim$lightingEngine = worldIn != null ? worldIn.alfheim$getLightingEngine() : null;
+
+> CHANGE  31 : 32  @  31 : 32
 
 ~ 		return this.getHeightValue(pos.x & 15, pos.z & 15);
 
@@ -58,40 +76,82 @@
 + 			++EaglerMinecraftServer.counterLightUpdate;
 + 		}
 
-> CHANGE  9 : 12  @  9 : 10
+> DELETE  3  @  3 : 8
+
+> CHANGE  1 : 4  @  1 : 11
+
+~ 		if (!worldObj.isAreaLoaded(new BlockPos((xPosition << 4) + 8, 0, (zPosition << 4) + 8), 16)) {
+~ 			return;
+~ 		}
+
+> CHANGE  1 : 4  @  1 : 5
 
 ~ 		if (!this.worldObj.isRemote) {
 ~ 			++EaglerMinecraftServer.counterLightUpdate;
 ~ 		}
 
-> CHANGE  10 : 13  @  10 : 11
+> CHANGE  1 : 2  @  1 : 2
 
-~ 						EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
-~ 						for (int m = 0; m < facings.length; ++m) {
-~ 							EnumFacing enumfacing = facings[m];
+~ 		final WorldChunkSlice slice = new WorldChunkSlice(worldObj.getChunkProvider(), xPosition, zPosition);
 
-> CHANGE  6 : 8  @  6 : 7
+> CHANGE  1 : 5  @  1 : 5
 
-~ 						for (int m = 0; m < facings.length; ++m) {
-~ 							EnumFacing enumfacing1 = facings[m];
+~ 		for (int x = 0; x < 16; ++x) {
+~ 			for (int z = 0; z < 16; ++z) {
+~ 				if (!alfheim$recheckGapsForColumn(slice, x, z))
+~ 					continue;
 
-> DELETE  5  @  5 : 6
+> CHANGE  1 : 3  @  1 : 7
 
-> DELETE  8  @  8 : 10
+~ 				if (parFlag)
+~ 					return;
 
-> CHANGE  94 : 97  @  94 : 95
+> DELETE  1  @  1 : 3
 
-~ 				EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
-~ 				for (int m = 0; m < facings.length; ++m) {
-~ 					EnumFacing enumfacing = facings[m];
+> CHANGE  2 : 3  @  2 : 3
 
-> INSERT  7 : 10  @  7
+~ 		isGapLightingUpdated = false;
 
-+ 			if (!this.worldObj.isRemote) {
-+ 				++EaglerMinecraftServer.counterLightUpdate;
-+ 			}
+> CHANGE  24 : 26  @  24 : 29
 
-> CHANGE  9 : 10  @  9 : 10
+~ 		int heightMapY = heightMap[z << 4 | x] & 255;
+~ 		int newHeightMapY = Math.max(y, heightMapY);
+
+> CHANGE  1 : 3  @  1 : 4
+
+~ 		while (newHeightMapY > 0 && getBlockLightOpacity(x, newHeightMapY - 1, z) == 0)
+~ 			--newHeightMapY;
+
+> CHANGE  1 : 3  @  1 : 26
+
+~ 		if (newHeightMapY == heightMapY)
+~ 			return;
+
+> CHANGE  1 : 4  @  1 : 2
+
+~ 		if (!this.worldObj.isRemote) {
+~ 			++EaglerMinecraftServer.counterLightUpdate;
+~ 		}
+
+> CHANGE  1 : 2  @  1 : 7
+
+~ 		heightMap[z << 4 | x] = newHeightMapY;
+
+> CHANGE  1 : 3  @  1 : 5
+
+~ 		if (!worldObj.provider.getHasNoSky())
+~ 			alfheim$relightSkylightColumn(x, z, heightMapY, newHeightMapY);
+
+> CHANGE  1 : 2  @  1 : 7
+
+~ 		final int heightMapY1 = heightMap[z << 4 | x];
+
+> CHANGE  1 : 3  @  1 : 23
+
+~ 		if (heightMapY1 < heightMapMinimum) {
+~ 			heightMapMinimum = heightMapY1;
+
+> CHANGE  8 : 9  @  8 : 9
 
 ~ 		return this.getBlock(x, y, z).getLightOpacity();
 
@@ -148,29 +208,40 @@
 ~ 		int j = pos.y;
 ~ 		int k = pos.z & 15;
 
-> CHANGE  86 : 89  @  86 : 89
+> CHANGE  21 : 23  @  21 : 22
 
-~ 		int i = blockpos.x & 15;
-~ 		int j = blockpos.y;
-~ 		int k = blockpos.z & 15;
+~ 				alfheim$initSkylightForSection(extendedblockstorage);
+~ 				// flag = j >= i1;
 
-> CHANGE  1 : 3  @  1 : 2
+> CHANGE  18 : 19  @  18 : 19
 
-~ 		return extendedblockstorage == null
-~ 				? (this.canSeeSky(blockpos) ? enumskyblock.defaultLightValue : getNoSkyLightValue())
+~ 					// int k1 = block1.getLightOpacity();
 
-> CHANGE  1 : 2  @  1 : 2
+> CHANGE  8 : 12  @  8 : 12
 
-~ 						? (this.worldObj.provider.getHasNoSky() ? getNoSkyLightValue()
+~ //					if (j1 != k1 && (j1 < k1 || this.getLightFor(EnumSkyBlock.SKY, pos) > 0
+~ //							|| this.getLightFor(EnumSkyBlock.BLOCK, pos) > 0)) {
+~ //						this.propagateSkylightOcclusion(i, k);
+~ //					}
 
-> CHANGE  6 : 9  @  6 : 9
+> CHANGE  33 : 35  @  33 : 43
+
+~ 		alfheim$lightingEngine.processLightUpdatesForType(enumskyblock);
+~ 		return alfheim$getCachedLightFor(enumskyblock, blockpos);
+
+> CHANGE  3 : 6  @  3 : 6
 
 ~ 		int j = blockpos.x & 15;
 ~ 		int k = blockpos.y;
 ~ 		int l = blockpos.z & 15;
 
-> CHANGE  19 : 22  @  19 : 22
+> CHANGE  4 : 5  @  4 : 5
 
+~ 			alfheim$initSkylightForSection(storageArrays[k >> 4]);
+
+> CHANGE  14 : 18  @  14 : 17
+
+~ 		alfheim$lightingEngine.processLightUpdates();
 ~ 		int j = blockpos.x & 15;
 ~ 		int k = blockpos.y;
 ~ 		int l = blockpos.z & 15;
@@ -214,7 +285,48 @@
 
 + 		blockpos = new BlockPos(blockpos);
 
-> CHANGE  94 : 96  @  94 : 96
+> INSERT  33 : 71  @  33
+
++ 		for (final EnumFacing facing : EnumFacing.HORIZONTALS) {
++ 			final int xOffset = facing.getFrontOffsetX();
++ 			final int zOffset = facing.getFrontOffsetZ();
++ 
++ 			final Chunk nChunk = worldObj.getChunkProvider().getLoadedChunk(xPosition + xOffset, zPosition + zOffset);
++ 
++ 			if (nChunk == null)
++ 				continue;
++ 
++ 			EnumSkyBlock[] lightTypes = EnumSkyBlock._VALUES;
++ 			EnumFacing.AxisDirection[] axisDirections = EnumFacing.AxisDirection._VALUES;
++ 			for (int ii = 0, ll = lightTypes.length; ii < ll; ++ii) {
++ 				final EnumSkyBlock lightType = lightTypes[ii];
++ 				for (int jj = 0, mm = axisDirections.length; jj < mm; ++jj) {
++ 					final EnumFacing.AxisDirection axisDir = axisDirections[jj];
++ 					// Merge flags upon loading of a chunk. This ensures that all flags are always
++ 					// already on the IN boundary below
++ 					alfheim$mergeFlags(lightType, this, nChunk, facing, axisDir);
++ 					alfheim$mergeFlags(lightType, nChunk, this, facing.getOpposite(), axisDir);
++ 
++ 					// Check everything that might have been canceled due to this chunk not being
++ 					// loaded.
++ 					// Also, pass in chunks if already known
++ 					// The boundary to the neighbor chunk (both ways)
++ 					alfheim$scheduleRelightChecksForBoundary(this, nChunk, null, lightType, xOffset, zOffset, axisDir);
++ 					alfheim$scheduleRelightChecksForBoundary(nChunk, this, null, lightType, -xOffset, -zOffset,
++ 							axisDir);
++ 					// The boundary to the diagonal neighbor (since the checks in that chunk were
++ 					// aborted if this chunk wasn't loaded, see
++ 					// alfheim$scheduleRelightChecksForBoundary)
++ 					alfheim$scheduleRelightChecksForBoundary(nChunk, null, this, lightType,
++ 							(zOffset != 0 ? axisDir.getOffset() : 0), (xOffset != 0 ? axisDir.getOffset() : 0),
++ 							facing.getAxisDirection() == EnumFacing.AxisDirection.POSITIVE
++ 									? EnumFacing.AxisDirection.NEGATIVE
++ 									: EnumFacing.AxisDirection.POSITIVE);
++ 				}
++ 			}
++ 		}
+
+> CHANGE  61 : 63  @  61 : 63
 
 ~ 						&& (predicate == null || predicate.apply((T) entity))) {
 ~ 					list.add((T) entity);
@@ -256,14 +368,366 @@
 ~ 					for (int m = 0; m < facings.length; ++m) {
 ~ 						BlockPos blockpos2 = blockpos1.offset(facings[m]);
 
-> CHANGE  29 : 32  @  29 : 30
+> DELETE  14  @  14 : 27
 
-~ 					EnumFacing[] facings = EnumFacing.Plane.HORIZONTAL.facingsArray;
-~ 					for (int i = 0; i < facings.length; ++i) {
-~ 						EnumFacing enumfacing = facings[i];
+> CHANGE  1 : 3  @  1 : 7
 
-> CHANGE  49 : 50  @  49 : 51
+~ 		if (!alfheim$isLightInitialized)
+~ 			alfheim$initChunkLighting(this, worldObj);
 
-~ 		BlockPos blockpos$mutableblockpos = new BlockPos((this.xPosition << 4) + x, 0, (this.zPosition << 4) + z);
+> CHANGE  1 : 10  @  1 : 5
+
+~ 		for (int x = -1; x <= 1; x++) {
+~ 			for (int z = -1; z <= 1; z++) {
+~ 				if (x == 0 && z == 0)
+~ 					continue;
+~ 
+~ 				final Chunk nChunk = worldObj.getChunkProvider().getLoadedChunk(xPosition + x, zPosition + z);
+~ 
+~ 				if (nChunk == null || !nChunk.alfheim$isLightInitialized())
+~ 					return;
+
+> INSERT  3 : 4  @  3
+
++ 		setLightPopulated(true);
+
+> DELETE  10  @  10 : 64
+
+> INSERT  79 : 413  @  79
+
++ 
++ 	private boolean alfheim$recheckGapsForColumn(final WorldChunkSlice slice, final int x, final int z) {
++ 		final int i = x + (z << 4);
++ 
++ 		if (updateSkylightColumns[i]) {
++ 			updateSkylightColumns[i] = false;
++ 
++ 			final int x1 = (this.xPosition << 4) + x;
++ 			final int z1 = (this.zPosition << 4) + z;
++ 
++ 			alfheim$recheckGapsSkylightNeighborHeight(slice, x1, z1, getHeightValue(x, z),
++ 					alfheim$recheckGapsGetLowestHeight(slice, x1, z1));
++ 
++ 			return true;
++ 		}
++ 
++ 		return false;
++ 	}
++ 
++ 	private int alfheim$recheckGapsGetLowestHeight(final WorldChunkSlice slice, final int x, final int z) {
++ 		int max = Integer.MAX_VALUE;
++ 
++ 		Chunk chunk = slice.getChunkFromWorldCoords(x + 1, z);
++ 
++ 		if (chunk != null)
++ 			max = Math.min(max, chunk.getLowestHeight());
++ 
++ 		chunk = slice.getChunkFromWorldCoords(x, z + 1);
++ 
++ 		if (chunk != null)
++ 			max = Math.min(max, chunk.getLowestHeight());
++ 
++ 		chunk = slice.getChunkFromWorldCoords(x - 1, z);
++ 
++ 		if (chunk != null)
++ 			max = Math.min(max, chunk.getLowestHeight());
++ 
++ 		chunk = slice.getChunkFromWorldCoords(x, z - 1);
++ 
++ 		if (chunk != null)
++ 			max = Math.min(max, chunk.getLowestHeight());
++ 
++ 		return max;
++ 	}
++ 
++ 	private void alfheim$recheckGapsSkylightNeighborHeight(final WorldChunkSlice slice, final int x, final int z,
++ 			final int height, final int max) {
++ 		alfheim$checkSkylightNeighborHeight(slice, x, z, max);
++ 		alfheim$checkSkylightNeighborHeight(slice, x + 1, z, height);
++ 		alfheim$checkSkylightNeighborHeight(slice, x, z + 1, height);
++ 		alfheim$checkSkylightNeighborHeight(slice, x - 1, z, height);
++ 		alfheim$checkSkylightNeighborHeight(slice, x, z - 1, height);
++ 	}
++ 
++ 	private void alfheim$checkSkylightNeighborHeight(final WorldChunkSlice slice, final int x, final int z,
++ 			final int maxValue) {
++ 		Chunk c = slice.getChunkFromWorldCoords(x, z);
++ 		if (c == null)
++ 			return;
++ 
++ 		final int y = c.getHeightValue(x & 15, z & 15);
++ 
++ 		if (y > maxValue)
++ 			alfheim$updateSkylightNeighborHeight(slice, x, z, maxValue, y + 1);
++ 		else if (y < maxValue)
++ 			alfheim$updateSkylightNeighborHeight(slice, x, z, y, maxValue + 1);
++ 	}
++ 
++ 	private void alfheim$updateSkylightNeighborHeight(final WorldChunkSlice slice, final int x, final int z,
++ 			final int startY, final int endY) {
++ 		if (endY < startY)
++ 			return;
++ 
++ 		if (!slice.isLoaded(x, z, 16))
++ 			return;
++ 
++ 		for (int y = startY; y < endY; ++y)
++ 			worldObj.checkLightFor(EnumSkyBlock.SKY, new BlockPos(x, y, z));
++ 
++ 		isModified = true;
++ 	}
++ 
++ 	private static void alfheim$mergeFlags(final EnumSkyBlock lightType, final Chunk inChunk, final Chunk outChunk,
++ 			final EnumFacing dir, final EnumFacing.AxisDirection axisDirection) {
++ 		if (outChunk.alfheim$neighborLightChecks == null)
++ 			return;
++ 
++ 		inChunk.alfheim$initNeighborLightChecks();
++ 
++ 		final int inIndex = alfheim$getFlagIndex(lightType, dir, axisDirection, EnumBoundaryFacing.IN);
++ 		final int outIndex = alfheim$getFlagIndex(lightType, dir.getOpposite(), axisDirection, EnumBoundaryFacing.OUT);
++ 
++ 		inChunk.alfheim$neighborLightChecks[inIndex] |= outChunk.alfheim$neighborLightChecks[outIndex];
++ 		// No need to call Chunk.setModified() since checks are not deleted from
++ 		// outChunk
++ 	}
++ 
++ 	private void alfheim$scheduleRelightChecksForBoundary(final Chunk chunk, Chunk nChunk, Chunk sChunk,
++ 			final EnumSkyBlock lightType, final int xOffset, final int zOffset,
++ 			final EnumFacing.AxisDirection axisDirection) {
++ 		if (chunk.alfheim$neighborLightChecks == null)
++ 			return;
++ 
++ 		final int flagIndex = alfheim$getFlagIndex(lightType, xOffset, zOffset, axisDirection, EnumBoundaryFacing.IN); // OUT
++ 																														// checks
++ 																														// from
++ 																														// neighbor
++ 																														// are
++ 																														// already
++ 																														// merged
++ 
++ 		final int flags = chunk.alfheim$neighborLightChecks[flagIndex];
++ 
++ 		if (flags == 0)
++ 			return;
++ 
++ 		if (nChunk == null) {
++ 			nChunk = worldObj.getChunkProvider().getLoadedChunk(chunk.xPosition + xOffset, chunk.zPosition + zOffset);
++ 
++ 			if (nChunk == null)
++ 				return;
++ 		}
++ 
++ 		if (sChunk == null) {
++ 			sChunk = worldObj.getChunkProvider().getLoadedChunk(
++ 					chunk.xPosition + (zOffset != 0 ? axisDirection.getOffset() : 0),
++ 					chunk.zPosition + (xOffset != 0 ? axisDirection.getOffset() : 0));
++ 
++ 			if (sChunk == null)
++ 				return; // Cancel, since the checks in the corner columns require the corner column of
++ 						// sChunk
++ 		}
++ 
++ 		final int reverseIndex = alfheim$getFlagIndex(lightType, -xOffset, -zOffset, axisDirection,
++ 				EnumBoundaryFacing.OUT);
++ 
++ 		chunk.alfheim$neighborLightChecks[flagIndex] = 0;
++ 
++ 		if (alfheim$neighborLightChecks != null)
++ 			nChunk.alfheim$neighborLightChecks[reverseIndex] = 0; // Clear only now that it's clear that the checks
++ 																	// are processed
++ 
++ 		chunk.setChunkModified();
++ 		nChunk.setChunkModified();
++ 
++ 		// Get the area to check
++ 		// Start in the corner...
++ 		int xMin = chunk.xPosition << 4;
++ 		int zMin = chunk.zPosition << 4;
++ 
++ 		// Move to other side of chunk if the direction is positive
++ 		if ((xOffset | zOffset) > 0) {
++ 			xMin += 15 * xOffset;
++ 			zMin += 15 * zOffset;
++ 		}
++ 
++ 		// Shift to other half if necessary (shift perpendicular to dir)
++ 		if (axisDirection == EnumFacing.AxisDirection.POSITIVE) {
++ 			xMin += 8 * (zOffset & 1); // x & 1 is same as abs(x) for x=-1,0,1
++ 			zMin += 8 * (xOffset & 1);
++ 		}
++ 
++ 		// Get maximal values (shift perpendicular to dir)
++ 		final int xMax = xMin + 7 * (zOffset & 1);
++ 		final int zMax = zMin + 7 * (xOffset & 1);
++ 
++ 		for (int y = 0; y < 16; ++y)
++ 			if ((flags & (1 << y)) != 0)
++ 				for (int x = xMin; x <= xMax; ++x)
++ 					for (int z = zMin; z <= zMax; ++z)
++ 						alfheim$scheduleRelightChecksForColumn(lightType, x, z, y << 4, (y << 4) + 15);
++ 	}
++ 
++ 	private void alfheim$initSkylightForSection(final ExtendedBlockStorage extendedBlockStorage) {
++ 		if (worldObj.provider.getHasNoSky())
++ 			return;
++ 
++ 		for (int x = 0; x < 16; ++x) {
++ 			for (int z = 0; z < 16; ++z) {
++ 				if (getHeightValue(x, z) > extendedBlockStorage.getYLocation())
++ 					continue;
++ 
++ 				for (int y = 0; y < 16; ++y)
++ 					extendedBlockStorage.setExtSkylightValue(x, y, z, EnumSkyBlock.SKY.defaultLightValue);
++ 			}
++ 		}
++ 	}
++ 
++ 	private void alfheim$scheduleRelightChecksForColumn(final EnumSkyBlock lightType, final int x, final int z,
++ 			final int yMin, final int yMax) {
++ 		final BlockPos mutableBlockPos = new BlockPos();
++ 
++ 		for (int y = yMin; y <= yMax; ++y)
++ 			worldObj.checkLightFor(lightType, mutableBlockPos.func_181079_c(x, y, z));
++ 	}
++ 
++ 	private static int alfheim$getFlagIndex(final EnumSkyBlock lightType, final int xOffset, final int zOffset,
++ 			final EnumFacing.AxisDirection axisDirection, final EnumBoundaryFacing boundaryFacing) {
++ 		return (lightType == EnumSkyBlock.BLOCK ? 0 : 16) | ((xOffset + 1) << 2) | ((zOffset + 1) << 1)
++ 				| (axisDirection.getOffset() + 1) | boundaryFacing.ordinal();
++ 	}
++ 
++ 	private static int alfheim$getFlagIndex(final EnumSkyBlock lightType, final EnumFacing facing,
++ 			final EnumFacing.AxisDirection axisDirection, final EnumBoundaryFacing boundaryFacing) {
++ 		return alfheim$getFlagIndex(lightType, facing.getFrontOffsetX(), facing.getFrontOffsetZ(), axisDirection,
++ 				boundaryFacing);
++ 	}
++ 
++ 	private static void alfheim$initChunkLighting(final Chunk chunk, final World world) {
++ 		final int xBase = chunk.xPosition << 4;
++ 		final int zBase = chunk.zPosition << 4;
++ 
++ 		final BlockPos mutableBlockPos = new BlockPos(xBase, 0, zBase);
++ 
++ 		if (world.isAreaLoaded(mutableBlockPos.add(-16, 0, -16), mutableBlockPos.add(31, 255, 31), false)) {
++ 			final ExtendedBlockStorage[] extendedBlockStorage = chunk.getBlockStorageArray();
++ 
++ 			for (int i = 0; i < extendedBlockStorage.length; ++i) {
++ 				final ExtendedBlockStorage storage = extendedBlockStorage[i];
++ 
++ 				if (storage == null)
++ 					continue;
++ 
++ 				int yBase = i * 16;
++ 
++ 				for (int y = 0; y < 16; y++) {
++ 					for (int z = 0; z < 16; z++) {
++ 						for (int x = 0; x < 16; x++) {
++ 							if (storage.getBlockByExtId(x, y, z).getLightValue() > 0) {
++ 								mutableBlockPos.func_181079_c(xBase + x, yBase + y, zBase + z);
++ 								world.checkLightFor(EnumSkyBlock.BLOCK, mutableBlockPos);
++ 							}
++ 						}
++ 					}
++ 				}
++ 			}
++ 
++ 			if (!world.provider.getHasNoSky())
++ 				chunk.alfheim$setSkylightUpdatedPublic();
++ 
++ 			chunk.alfheim$setLightInitialized(true);
++ 		}
++ 	}
++ 
++ 	private void alfheim$relightSkylightColumn(final int x, final int z, final int height1, final int height2) {
++ 		final int yMin = Math.min(height1, height2);
++ 		final int yMax = Math.max(height1, height2) - 1;
++ 
++ 		final ExtendedBlockStorage[] sections = getBlockStorageArray();
++ 
++ 		final int xBase = (xPosition << 4) + x;
++ 		final int zBase = (zPosition << 4) + z;
++ 
++ 		alfheim$scheduleRelightChecksForColumn(EnumSkyBlock.SKY, xBase, zBase, yMin, yMax);
++ 
++ 		if (sections[yMin >> 4] == null && yMin > 0) {
++ 			worldObj.checkLightFor(EnumSkyBlock.SKY, new BlockPos(xBase, yMin - 1, zBase));
++ 		}
++ 
++ 		short emptySections = 0;
++ 
++ 		for (int sec = yMax >> 4; sec >= yMin >> 4; --sec) {
++ 			if (sections[sec] == null) {
++ 				emptySections |= (short) (1 << sec);
++ 			}
++ 		}
++ 
++ 		if (emptySections != 0) {
++ 			for (final EnumFacing facing : EnumFacing.HORIZONTALS) {
++ 				final int xOffset = facing.getFrontOffsetX();
++ 				final int zOffset = facing.getFrontOffsetZ();
++ 
++ 				final boolean neighborColumnExists = (((x + xOffset) | (z + zOffset)) & 16) == 0
++ 						// Checks whether the position is at the specified border (the 16 bit is set for
++ 						// both 15+1 and 0-1)
++ 						|| worldObj.getChunkProvider().getLoadedChunk(xPosition + xOffset, zPosition + zOffset) != null;
++ 
++ 				if (neighborColumnExists) {
++ 					for (int sec = yMax >> 4; sec >= yMin >> 4; --sec) {
++ 						if ((emptySections & (1 << sec)) != 0)
++ 							alfheim$scheduleRelightChecksForColumn(EnumSkyBlock.SKY, xBase + xOffset, zBase + zOffset,
++ 									sec << 4, (sec << 4) + 15);
++ 					}
++ 				} else {
++ 					alfheim$initNeighborLightChecks();
++ 
++ 					final EnumFacing.AxisDirection axisDirection = ((facing.getAxis() == EnumFacing.Axis.X ? z : x)
++ 							& 15) < 8 ? EnumFacing.AxisDirection.NEGATIVE : EnumFacing.AxisDirection.POSITIVE;
++ 					alfheim$neighborLightChecks[alfheim$getFlagIndex(EnumSkyBlock.SKY, facing, axisDirection,
++ 							EnumBoundaryFacing.OUT)] |= emptySections;
++ 
++ 					setChunkModified();
++ 				}
++ 			}
++ 		}
++ 	}
++ 
++ 	public LightingEngine alfheim$getLightingEngine() {
++ 		return alfheim$lightingEngine;
++ 	}
++ 
++ 	public boolean alfheim$isLightInitialized() {
++ 		return alfheim$isLightInitialized;
++ 	}
++ 
++ 	public void alfheim$setLightInitialized(final boolean lightInitialized) {
++ 		alfheim$isLightInitialized = lightInitialized;
++ 	}
++ 
++ 	public void alfheim$setSkylightUpdatedPublic() {
++ 		func_177441_y();
++ 	}
++ 
++ 	public void alfheim$initNeighborLightChecks() {
++ 		if (alfheim$neighborLightChecks == null) {
++ 			alfheim$neighborLightChecks = new short[32];
++ 		}
++ 	}
++ 
++ 	public byte alfheim$getCachedLightFor(final EnumSkyBlock lightType, final BlockPos blockPos) {
++ 		final int x = blockPos.x & 15;
++ 		final int y = blockPos.y;
++ 		final int z = blockPos.z & 15;
++ 
++ 		final ExtendedBlockStorage extendedblockstorage = storageArrays[y >> 4];
++ 
++ 		if (extendedblockstorage == null)
++ 			return canSeeSky(blockPos) ? (byte) lightType.defaultLightValue : 0;
++ 		else if (lightType == EnumSkyBlock.SKY)
++ 			return !worldObj.provider.getHasNoSky() ? (byte) extendedblockstorage.getExtSkylightValue(x, y & 15, z) : 0;
++ 		else
++ 			return lightType == EnumSkyBlock.BLOCK ? (byte) extendedblockstorage.getExtBlocklightValue(x, y & 15, z)
++ 					: (byte) lightType.defaultLightValue;
++ 	}
 
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/chunk/IChunkProvider.edit.java b/patches/minecraft/net/minecraft/world/chunk/IChunkProvider.edit.java
index 9c7a8420..4fa2e5cd 100644
--- a/patches/minecraft/net/minecraft/world/chunk/IChunkProvider.edit.java
+++ b/patches/minecraft/net/minecraft/world/chunk/IChunkProvider.edit.java
@@ -11,4 +11,9 @@
 
 > DELETE  5  @  5 : 6
 
+> INSERT  29 : 31  @  29
+
++ 
++ 	Chunk getLoadedChunk(int var1, int var2);
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/chunk/storage/AnvilChunkLoader.edit.java b/patches/minecraft/net/minecraft/world/chunk/storage/AnvilChunkLoader.edit.java
index 18fcc1c3..30ada553 100644
--- a/patches/minecraft/net/minecraft/world/chunk/storage/AnvilChunkLoader.edit.java
+++ b/patches/minecraft/net/minecraft/world/chunk/storage/AnvilChunkLoader.edit.java
@@ -11,23 +11,30 @@
 
 > DELETE  3  @  3 : 4
 
-> DELETE  5  @  5 : 7
+> INSERT  2 : 3  @  2
+
++ import net.minecraft.nbt.NBTTagShort;
+
+> DELETE  3  @  3 : 5
 
 > CHANGE  4 : 6  @  4 : 11
 
 ~ import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 ~ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 
-> CHANGE  1 : 3  @  1 : 7
+> CHANGE  1 : 4  @  1 : 7
 
 ~ public abstract class AnvilChunkLoader implements IChunkLoader {
 ~ 	private static final Logger logger = LogManager.getLogger("AnvilChunkLoader");
+~ 	private static final String NEIGHBOR_LIGHT_CHECKS_KEY = "NeighborLightChecks";
 
 > DELETE  1  @  1 : 21
 
-> CHANGE  24 : 25  @  24 : 109
+> CHANGE  24 : 27  @  24 : 109
 
 ~ 	protected void writeChunkToNBT(Chunk chunkIn, World worldIn, NBTTagCompound parNBTTagCompound) {
+~ 		alfheim$writeNeighborLightChecksToNBT(chunkIn, parNBTTagCompound);
+~ 		parNBTTagCompound.setBoolean("LightPopulated", chunkIn.alfheim$isLightInitialized());
 
 > CHANGE  80 : 81  @  80 : 81
 
@@ -42,4 +49,57 @@
 
 ~ 	protected Chunk readChunkFromNBT(World worldIn, NBTTagCompound parNBTTagCompound) {
 
+> INSERT  102 : 105  @  102
+
++ 		alfheim$readNeighborLightChecksFromNBT(chunk, parNBTTagCompound);
++ 		chunk.alfheim$setLightInitialized(parNBTTagCompound.getBoolean("LightPopulated"));
++ 
+
+> INSERT  2 : 46  @  2
+
++ 
++ 	private static void alfheim$readNeighborLightChecksFromNBT(final Chunk chunk, final NBTTagCompound compound) {
++ 		if (!compound.hasKey(NEIGHBOR_LIGHT_CHECKS_KEY, 9)) {
++ 			return;
++ 		}
++ 
++ 		final NBTTagList tagList = compound.getTagList(NEIGHBOR_LIGHT_CHECKS_KEY, 2);
++ 
++ 		if (tagList.tagCount() != 32) {
++ 			return;
++ 		}
++ 
++ 		chunk.alfheim$initNeighborLightChecks();
++ 
++ 		final short[] neighborLightChecks = chunk.alfheim$neighborLightChecks;
++ 
++ 		for (int i = 0; i < 32; ++i) {
++ 			neighborLightChecks[i] = ((NBTTagShort) tagList.get(i)).getShort();
++ 		}
++ 	}
++ 
++ 	private static void alfheim$writeNeighborLightChecksToNBT(final Chunk chunk, final NBTTagCompound compound) {
++ 		final short[] neighborLightChecks = chunk.alfheim$neighborLightChecks;
++ 
++ 		if (neighborLightChecks == null) {
++ 			return;
++ 		}
++ 
++ 		boolean empty = true;
++ 
++ 		final NBTTagList list = new NBTTagList();
++ 
++ 		for (final short flags : neighborLightChecks) {
++ 			list.appendTag(new NBTTagShort(flags));
++ 
++ 			if (flags != 0) {
++ 				empty = false;
++ 			}
++ 		}
++ 
++ 		if (!empty) {
++ 			compound.setTag(NEIGHBOR_LIGHT_CHECKS_KEY, list);
++ 		}
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/chunk/storage/ExtendedBlockStorage.edit.java b/patches/minecraft/net/minecraft/world/chunk/storage/ExtendedBlockStorage.edit.java
new file mode 100644
index 00000000..51a230fe
--- /dev/null
+++ b/patches/minecraft/net/minecraft/world/chunk/storage/ExtendedBlockStorage.edit.java
@@ -0,0 +1,59 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> INSERT  15 : 17  @  15
+
++ 	private int alfheim$lightRefCount = -1;
++ 
+
+> CHANGE  46 : 59  @  46 : 47
+
+~ 		if (blockRefCount != 0)
+~ 			return false;
+~ 
+~ 		// -1 indicates the lightRefCount needs to be re-calculated
+~ 		if (alfheim$lightRefCount == -1) {
+~ 			if (alfheim$checkLightArrayEqual(skylightArray, (byte) 255)
+~ 					&& alfheim$checkLightArrayEqual(blocklightArray, (byte) 0))
+~ 				alfheim$lightRefCount = 0; // Lighting is trivial, don't send to clients
+~ 			else
+~ 				alfheim$lightRefCount = 1; // Lighting is not trivial, send to clients
+~ 		}
+~ 
+~ 		return alfheim$lightRefCount == 0;
+
+> INSERT  12 : 13  @  12
+
++ 		alfheim$lightRefCount = -1;
+
+> INSERT  8 : 9  @  8
+
++ 		alfheim$lightRefCount = -1;
+
+> INSERT  44 : 45  @  44
+
++ 		alfheim$lightRefCount = -1;
+
+> INSERT  4 : 5  @  4
+
++ 		alfheim$lightRefCount = -1;
+
+> INSERT  1 : 12  @  1
+
++ 
++ 	private boolean alfheim$checkLightArrayEqual(final NibbleArray storage, final byte targetValue) {
++ 		if (storage == null)
++ 			return true;
++ 
++ 		for (final byte currentByte : storage.getData())
++ 			if (currentByte != targetValue)
++ 				return false;
++ 
++ 		return true;
++ 	}
+
+> EOF
diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderDebug.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderDebug.edit.java
new file mode 100644
index 00000000..b3e731c2
--- /dev/null
+++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderDebug.edit.java
@@ -0,0 +1,15 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> INSERT  131 : 135  @  131
+
++ 
++ 	public Chunk getLoadedChunk(int var1, int var2) {
++ 		return provideChunk(var1, var2);
++ 	}
+
+> EOF
diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java
index ed422874..c4a42414 100644
--- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java
+++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java
@@ -19,4 +19,11 @@
 
 ~ 		this.endRNG = new EaglercraftRandom(parLong1, !worldIn.getWorldInfo().isOldEaglercraftRandom());
 
+> INSERT  246 : 250  @  246
+
++ 
++ 	public Chunk getLoadedChunk(int var1, int var2) {
++ 		return provideChunk(var1, var2);
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java
index 05157c7c..a87abf86 100644
--- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java
+++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java
@@ -55,4 +55,11 @@
 ~ 		for (int m = 0, n = this.structureGenerators.size(); m < n; ++m) {
 ~ 			this.structureGenerators.get(m).generate(this, this.worldObj, i, j, (ChunkPrimer) null);
 
+> INSERT  7 : 11  @  7
+
++ 
++ 	public Chunk getLoadedChunk(int var1, int var2) {
++ 		return provideChunk(var1, var2);
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java
index 3284fdb9..fdffb875 100644
--- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java
+++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java
@@ -37,4 +37,11 @@
 ~ 		this.ravineGenerator = new MapGenRavine(scramble);
 ~ 		this.oceanMonumentGenerator = new StructureOceanMonument(scramble);
 
+> INSERT  421 : 425  @  421
+
++ 
++ 	public Chunk getLoadedChunk(int var1, int var2) {
++ 		return provideChunk(var1, var2);
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java
index add0bf27..1cbb2639 100644
--- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java
+++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java
@@ -27,4 +27,11 @@
 ~ 		this.genNetherBridge = new MapGenNetherBridge(scramble);
 ~ 		this.netherCaveGenerator = new MapGenCavesHell(scramble);
 
+> INSERT  351 : 355  @  351
+
++ 
++ 	public Chunk getLoadedChunk(int var1, int var2) {
++ 		return provideChunk(var1, var2);
++ 	}
+
 > EOF
diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderServer.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderServer.edit.java
index 6b23f6db..626406cf 100644
--- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderServer.edit.java
+++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderServer.edit.java
@@ -127,4 +127,11 @@
 
 ~ 		return this.id2ChunkMap.size();
 
+> INSERT  8 : 12  @  8
+
++ 
++ 	public Chunk getLoadedChunk(int var1, int var2) {
++ 		return this.id2ChunkMap.get(ChunkCoordIntPair.chunkXZ2Int(var1, var2));
++ 	}
+
 > EOF
diff --git a/patches/resources/assets/minecraft/blockstates/black_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/black_stained_glass_pane.edit.json
new file mode 100644
index 00000000..319c020d
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/black_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "black_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "black_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "black_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "black_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "black_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "black_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "black_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "black_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/blue_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/blue_stained_glass_pane.edit.json
new file mode 100644
index 00000000..12853605
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/blue_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "blue_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "blue_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "blue_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "blue_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "blue_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "blue_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "blue_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "blue_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/brown_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/brown_stained_glass_pane.edit.json
new file mode 100644
index 00000000..04a456c2
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/brown_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "brown_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "brown_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "brown_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "brown_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "brown_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "brown_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "brown_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "brown_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/cyan_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/cyan_stained_glass_pane.edit.json
new file mode 100644
index 00000000..06029991
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/cyan_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "cyan_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "cyan_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "cyan_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "cyan_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "cyan_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "cyan_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "cyan_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "cyan_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/gray_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/gray_stained_glass_pane.edit.json
new file mode 100644
index 00000000..46e30290
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/gray_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "gray_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "gray_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "gray_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "gray_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "gray_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "gray_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "gray_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "gray_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/green_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/green_stained_glass_pane.edit.json
new file mode 100644
index 00000000..7f419f31
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/green_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "green_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "green_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "green_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "green_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "green_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "green_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "green_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "green_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/light_blue_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/light_blue_stained_glass_pane.edit.json
new file mode 100644
index 00000000..3bcd5094
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/light_blue_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "light_blue_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "light_blue_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "light_blue_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "light_blue_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "light_blue_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "light_blue_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "light_blue_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "light_blue_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/lime_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/lime_stained_glass_pane.edit.json
new file mode 100644
index 00000000..500b7875
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/lime_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "lime_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "lime_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "lime_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "lime_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "lime_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "lime_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "lime_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "lime_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/magenta_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/magenta_stained_glass_pane.edit.json
new file mode 100644
index 00000000..c95a15a6
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/magenta_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "magenta_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "magenta_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "magenta_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "magenta_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "magenta_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "magenta_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "magenta_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "magenta_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/orange_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/orange_stained_glass_pane.edit.json
new file mode 100644
index 00000000..2cfa4005
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/orange_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "orange_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "orange_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "orange_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "orange_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "orange_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "orange_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "orange_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "orange_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/pink_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/pink_stained_glass_pane.edit.json
new file mode 100644
index 00000000..de964b26
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/pink_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "pink_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "pink_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "pink_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "pink_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "pink_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "pink_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "pink_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "pink_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/purple_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/purple_stained_glass_pane.edit.json
new file mode 100644
index 00000000..d4a7d2a1
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/purple_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "purple_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "purple_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "purple_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "purple_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "purple_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "purple_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "purple_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "purple_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/red_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/red_stained_glass_pane.edit.json
new file mode 100644
index 00000000..199ba426
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/red_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "red_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "red_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "red_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "red_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "red_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "red_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "red_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "red_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/silver_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/silver_stained_glass_pane.edit.json
new file mode 100644
index 00000000..297916a8
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/silver_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "silver_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "silver_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "silver_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "silver_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "silver_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "silver_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "silver_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "silver_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/white_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/white_stained_glass_pane.edit.json
new file mode 100644
index 00000000..f39f15d7
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/white_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "white_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "white_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "white_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "white_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "white_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "white_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "white_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "white_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/blockstates/yellow_stained_glass_pane.edit.json b/patches/resources/assets/minecraft/blockstates/yellow_stained_glass_pane.edit.json
new file mode 100644
index 00000000..c3d80e48
--- /dev/null
+++ b/patches/resources/assets/minecraft/blockstates/yellow_stained_glass_pane.edit.json
@@ -0,0 +1,25 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  5 : 7  @  5 : 7
+
+~         "east=false,north=false,south=true,west=false": { "model": "yellow_pane_n", "y": 180 },
+~         "east=false,north=false,south=false,west=true": { "model": "yellow_pane_n", "y": 270 },
+
+> CHANGE  1 : 4  @  1 : 4
+
+~         "east=true,north=false,south=true,west=false": { "model": "yellow_pane_ne", "y": 90 },
+~         "east=false,north=false,south=true,west=true": { "model": "yellow_pane_ne", "y": 180 },
+~         "east=false,north=true,south=false,west=true": { "model": "yellow_pane_ne", "y": 270 },
+
+> CHANGE  3 : 6  @  3 : 6
+
+~         "east=true,north=false,south=true,west=true": { "model": "yellow_pane_nse", "y": 90 },
+~         "east=false,north=true,south=true,west=true": { "model": "yellow_pane_nse", "y": 180 },
+~         "east=true,north=true,south=false,west=true": { "model": "yellow_pane_nse", "y": 270 },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/lang/en_US.edit.lang b/patches/resources/assets/minecraft/lang/en_US.edit.lang
index a630d9a0..95db2ec7 100644
--- a/patches/resources/assets/minecraft/lang/en_US.edit.lang
+++ b/patches/resources/assets/minecraft/lang/en_US.edit.lang
@@ -1,6 +1,6 @@
 
 # Eagler Context Redacted Diff
-# Copyright (c) 2024 lax1dude. All rights reserved.
+# Copyright (c) 2025 lax1dude. All rights reserved.
 
 # Version: 1.0
 # Author: lax1dude
@@ -257,7 +257,7 @@
 + eaglercraft.command.clientStub=This command is client side!
 + 
 
-> INSERT  163 : 568  @  163
+> INSERT  163 : 574  @  163
 
 + eaglercraft.singleplayer.busy.killTask=Cancel Task
 + eaglercraft.singleplayer.busy.cancelWarning=Are you sure?
@@ -664,6 +664,12 @@
 + eaglercraft.options.vsyncReEnabled.3=VSync enabled causes bad input lag, sorry!
 + eaglercraft.options.vsyncReEnabled.continue=Continue
 + 
++ eaglercraft.options.connectedTexturesOF=Connected Textures
++ eaglercraft.options.betterGrassOF=Better Grass/Snow
++ eaglercraft.options.customSkiesOF=Custom Skies
++ eaglercraft.options.smartLeavesOF=Smart Leaves
++ eaglercraft.options.customItemsOF=Custom Items
++ 
 
 > INSERT  18 : 19  @  18
 
diff --git a/patches/resources/assets/minecraft/models/block/pane_n.edit.json b/patches/resources/assets/minecraft/models/block/pane_n.edit.json
new file mode 100644
index 00000000..f0982e67
--- /dev/null
+++ b/patches/resources/assets/minecraft/models/block/pane_n.edit.json
@@ -0,0 +1,17 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  10 : 16  @  10 : 16
+
+~                 "down":  { "uv": [ 7, 0, 9, 9 ], "texture": "#edge" },
+~                 "up":    { "uv": [ 7, 0, 9, 9 ], "texture": "#edge" },
+~                 "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#edge", "cullface": "north" },
+~                 "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#edge" },
+~                 "west":  { "uv": [ 0, 0, 9, 16 ], "texture": "#pane" },
+~                 "east":  { "uv": [ 7, 0, 16, 16 ], "texture": "#pane" }
+
+> EOF
diff --git a/patches/resources/assets/minecraft/models/block/pane_ne.edit.json b/patches/resources/assets/minecraft/models/block/pane_ne.edit.json
new file mode 100644
index 00000000..bf669d8a
--- /dev/null
+++ b/patches/resources/assets/minecraft/models/block/pane_ne.edit.json
@@ -0,0 +1,16 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  14 : 15  @  14 : 15
+
+~                 "west":  { "uv": [  0, 0,  9, 16 ], "texture": "#pane" },
+
+> CHANGE  9 : 10  @  9 : 10
+
+~                 "north": { "uv": [  0, 0,  7, 16 ], "texture": "#pane" },
+
+> EOF
diff --git a/patches/resources/assets/minecraft/models/block/pane_ns.edit.json b/patches/resources/assets/minecraft/models/block/pane_ns.edit.json
new file mode 100644
index 00000000..9a2f533c
--- /dev/null
+++ b/patches/resources/assets/minecraft/models/block/pane_ns.edit.json
@@ -0,0 +1,17 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  10 : 16  @  10 : 16
+
+~                 "down":  { "uv": [ 7, 0, 9, 16 ], "texture": "#edge", "cull": false },
+~                 "up":    { "uv": [ 7, 0, 9, 16 ], "texture": "#edge", "cull": false },
+~                 "north": { "uv": [ 7, 0, 9, 16 ], "texture": "#edge" },
+~                 "south": { "uv": [ 7, 0, 9, 16 ], "texture": "#edge" },
+~                 "west":  { "uv": [ 0, 0, 16, 16 ], "texture": "#pane", "cull": false },
+~                 "east":  { "uv": [ 0, 0, 16, 16 ], "texture": "#pane", "cull": false }
+
+> EOF
diff --git a/patches/resources/assets/minecraft/models/block/pane_nse.edit.json b/patches/resources/assets/minecraft/models/block/pane_nse.edit.json
new file mode 100644
index 00000000..0c9c19d4
--- /dev/null
+++ b/patches/resources/assets/minecraft/models/block/pane_nse.edit.json
@@ -0,0 +1,16 @@
+
+# Eagler Context Redacted Diff
+# Copyright (c) 2025 lax1dude. All rights reserved.
+
+# Version: 1.0
+# Author: lax1dude
+
+> CHANGE  14 : 15  @  14 : 15
+
+~                 "west":  { "uv": [  0, 0, 16, 16 ], "texture": "#pane" },
+
+> CHANGE  9 : 10  @  9 : 10
+
+~                 "north": { "uv": [  0, 0,  7, 16 ], "texture": "#pane" },
+
+> EOF
diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
index 693cbbe6..76039e8a 100644
--- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
+++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
@@ -58,6 +58,8 @@ class OpenGLObjects {
 	static class TextureGL implements ITextureGL {
 		
 		final int ptr;
+		int width;
+		int height;
 		
 		TextureGL(int ptr) {
 			this.ptr = ptr;
@@ -71,7 +73,23 @@ class OpenGLObjects {
 		public void free() {
 			PlatformOpenGL._wglDeleteTextures(this);
 		}
-		
+
+		@Override
+		public void setCacheSize(int w, int h) {
+			width = w;
+			height = h;
+		}
+
+		@Override
+		public int getWidth() {
+			return width;
+		}
+
+		@Override
+		public int getHeight() {
+			return height;
+		}
+
 	}
 
 	static class ProgramGL implements IProgramGL {
diff --git a/sources/main/java/dev/redstudio/alfheim/lighting/LightingEngine.java b/sources/main/java/dev/redstudio/alfheim/lighting/LightingEngine.java
new file mode 100644
index 00000000..dd0afdbb
--- /dev/null
+++ b/sources/main/java/dev/redstudio/alfheim/lighting/LightingEngine.java
@@ -0,0 +1,496 @@
+package dev.redstudio.alfheim.lighting;
+
+import dev.redstudio.alfheim.utils.DeduplicatedLongQueue;
+import dev.redstudio.redcore.math.ClampUtil;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.Vec3i;
+import net.minecraft.world.EnumSkyBlock;
+import net.minecraft.world.World;
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
+
+/**
+ * Modified by lax1dude not to abuse interfaces
+ * 
+ * @author Luna Lage (Desoroxxx)
+ * @author kappa-maintainer
+ * @author embeddedt
+ * @author Angeline (@jellysquid)
+ * @since 1.0
+ */
+public final class LightingEngine {
+
+	private static final byte MAX_LIGHT_LEVEL = 15;
+
+	private final World world;
+
+	// Layout of longs: [padding(4)] [y(8)] [x(26)] [z(26)]
+	private final DeduplicatedLongQueue[] lightUpdateQueues = new DeduplicatedLongQueue[EnumSkyBlock.values().length];
+
+	// Layout of longs: see above
+	private final DeduplicatedLongQueue[] darkeningQueues = new DeduplicatedLongQueue[MAX_LIGHT_LEVEL + 1];
+	private final DeduplicatedLongQueue[] brighteningQueues = new DeduplicatedLongQueue[MAX_LIGHT_LEVEL + 1];
+
+	// Layout of longs: [newLight(4)] [pos(60)]
+	private final DeduplicatedLongQueue initialBrightenings;
+	// Layout of longs: [padding(4)] [pos(60)]
+	private final DeduplicatedLongQueue initialDarkenings;
+
+	private boolean updating = false;
+
+	// Layout parameters
+	// Length of bit segments
+	private static final int L_X = 26, L_Y = 8, L_Z = 26, L_L = 4;
+
+	// Bit segment shifts/positions
+	private static final int S_Z = 0, S_X = S_Z + L_Z, S_Y = S_X + L_X, S_L = S_Y + L_Y;
+
+	// Bit segment masks
+	private static final long M_X = (1L << L_X) - 1, M_Y = (1L << L_Y) - 1, M_Z = (1L << L_Z) - 1,
+			M_L = (1L << L_L) - 1, M_POS = (M_Y << S_Y) | (M_X << S_X) | (M_Z << S_Z);
+
+	// Bit to check whether y had overflow
+	private static final long Y_CHECK = 1L << (S_Y + L_Y);
+
+	private static final long[] neighborShifts = new long[6];
+
+	static {
+		for (byte i = 0; i < 6; ++i) {
+			final Vec3i offset = EnumFacing._VALUES[i].getDirectionVec();
+			neighborShifts[i] = ((long) offset.getY() << S_Y) | ((long) offset.getX() << S_X)
+					| ((long) offset.getZ() << S_Z);
+		}
+	}
+
+	// Mask to extract chunk identifier
+	private static final long M_CHUNK = ((M_X >> 4) << (4 + S_X)) | ((M_Z >> 4) << (4 + S_Z));
+
+	// Iteration state data
+	// Cache position to avoid allocation of new object each time
+	private final BlockPos currentPos = new BlockPos();
+	private Chunk currentChunk;
+	private long currentChunkIdentifier;
+	private long currentData;
+
+	// Cached data about neighboring blocks (of tempPos)
+	private boolean isNeighborDataValid = false;
+
+	private final NeighborInfo[] neighborInfos = new NeighborInfo[6];
+	private DeduplicatedLongQueue currentQueue;
+
+	public LightingEngine(final World world) {
+		this.world = world;
+
+		initialBrightenings = new DeduplicatedLongQueue(16384);
+		initialDarkenings = new DeduplicatedLongQueue(16384);
+
+		for (int i = 0; i < EnumSkyBlock.values().length; ++i)
+			lightUpdateQueues[i] = new DeduplicatedLongQueue(16384);
+
+		for (int i = 0; i < darkeningQueues.length; ++i)
+			darkeningQueues[i] = new DeduplicatedLongQueue(16384);
+
+		for (int i = 0; i < brighteningQueues.length; ++i)
+			brighteningQueues[i] = new DeduplicatedLongQueue(16384);
+
+		for (int i = 0; i < neighborInfos.length; ++i)
+			neighborInfos[i] = new NeighborInfo();
+	}
+
+	/**
+	 * Schedules a light update for the specified light type and position to be
+	 * processed later by
+	 * {@link LightingEngine#processLightUpdatesForType(EnumSkyBlock)}
+	 */
+	public void scheduleLightUpdate(final EnumSkyBlock lightType, final BlockPos pos) {
+		scheduleLightUpdate(lightType, encodeWorldCoord(pos));
+	}
+
+	/**
+	 * Schedules a light update for the specified light type and position to be
+	 * processed later by {@link LightingEngine#processLightUpdates()}
+	 */
+	private void scheduleLightUpdate(final EnumSkyBlock lightType, final long blockPos) {
+		lightUpdateQueues[lightType.ordinal()].enqueue(blockPos);
+	}
+
+	/**
+	 * Calls {@link LightingEngine#processLightUpdatesForType(EnumSkyBlock)} for
+	 * both light types
+	 */
+	public void processLightUpdates() {
+		processLightUpdatesForType(EnumSkyBlock.SKY);
+		processLightUpdatesForType(EnumSkyBlock.BLOCK);
+	}
+
+	/**
+	 * Processes light updates of the given light type
+	 */
+	public void processLightUpdatesForType(final EnumSkyBlock lightType) {
+		final DeduplicatedLongQueue queue = lightUpdateQueues[lightType.ordinal()];
+
+		// Quickly check if the queue is empty before we acquire a more expensive lock.
+		if (queue.isEmpty())
+			return;
+
+		processLightUpdatesForTypeInner(lightType, queue);
+	}
+
+	private void processLightUpdatesForTypeInner(final EnumSkyBlock lightType, final DeduplicatedLongQueue queue) {
+		// Avoid nested calls
+		if (updating)
+			throw new IllegalStateException("Already processing updates!");
+
+		updating = true;
+
+		currentChunkIdentifier = -1; // Reset chunk cache
+
+		currentQueue = queue;
+
+		if (currentQueue != null)
+			currentQueue.newDeduplicationSet();
+
+		// Process the queued updates and enqueue them for further processing
+		while (nextItem()) {
+			if (currentChunk == null)
+				continue;
+
+			final byte oldLight = getCursorCachedLight(lightType);
+			final byte newLight = calculateNewLightFromCursor(lightType);
+
+			if (oldLight < newLight)
+				initialBrightenings.enqueue(((long) newLight << S_L) | currentData); // Don't enqueue directly for
+																						// brightening to avoid
+																						// duplicate scheduling
+			else if (oldLight > newLight)
+				initialDarkenings.enqueue(currentData); // Don't enqueue directly for darkening to avoid duplicate
+														// scheduling
+		}
+
+		currentQueue = initialBrightenings;
+
+		if (currentQueue != null)
+			currentQueue.newDeduplicationSet();
+
+		while (nextItem()) {
+			final byte newLight = (byte) (currentData >> S_L & M_L);
+
+			if (newLight > getCursorCachedLight(lightType))
+				enqueueBrightening(currentPos, currentData & M_POS, newLight, currentChunk, lightType); // Sets the
+																										// light to
+																										// newLight to
+																										// only schedule
+																										// once. Clear
+																										// leading bits
+																										// of curData
+																										// for later
+		}
+
+		currentQueue = initialDarkenings;
+
+		if (currentQueue != null)
+			currentQueue.newDeduplicationSet();
+
+		while (nextItem()) {
+			final byte oldLight = getCursorCachedLight(lightType);
+
+			if (oldLight != 0)
+				enqueueDarkening(currentPos, currentData, oldLight, currentChunk, lightType); // Sets the light to zero
+																								// to only schedule once
+		}
+
+		// Iterate through enqueued updates (brightening and darkening in parallel) from
+		// brightest to darkest so that we only need to iterate once
+		for (byte currentLight = MAX_LIGHT_LEVEL; currentLight >= 0; --currentLight) {
+			currentQueue = darkeningQueues[currentLight];
+
+			if (currentQueue != null)
+				currentQueue.newDeduplicationSet();
+
+			while (nextItem()) {
+				// Don't darken if we got brighter due to some other change
+				if (getCursorCachedLight(lightType) >= currentLight)
+					continue;
+
+				final IBlockState blockState = currentChunk.getBlockState(currentPos);
+				final byte luminosity = getCursorLuminosity(blockState, lightType);
+				final byte opacity; // If luminosity is high enough, opacity is irrelevant
+
+				if (luminosity >= MAX_LIGHT_LEVEL - 1)
+					opacity = 1;
+				else
+					opacity = getPosOpacity(currentPos, blockState);
+
+				// Only darken neighbors if we indeed became darker
+				if (calculateNewLightFromCursor(luminosity, opacity, lightType) < currentLight) {
+					// Need to calculate new light value from neighbors IGNORING neighbors which are
+					// scheduled for darkening
+					byte newLight = luminosity;
+
+					fetchNeighborDataFromCursor(lightType);
+
+					for (final NeighborInfo neighborInfo : neighborInfos) {
+						final Chunk neighborChunk = neighborInfo.chunk;
+
+						if (neighborChunk == null)
+							continue;
+
+						final byte neighborLight = neighborInfo.light;
+
+						if (neighborLight == 0)
+							continue;
+
+						final BlockPos neighborPos = neighborInfo.mutableBlockPos;
+
+						if (currentLight - getPosOpacity(neighborPos, neighborChunk
+								.getBlockState(neighborPos)) >= neighborLight) /*
+																				 * Schedule neighbor for darkening if we
+																				 * possibly light it
+																				 */ {
+							enqueueDarkening(neighborPos, neighborInfo.key, neighborLight, neighborChunk, lightType);
+						} else /* Only use for new light calculation if not */ {
+							// If we can't darken the neighbor, no one else can (because of processing
+							// order) -> safe to let us be illuminated by it
+							newLight = (byte) Math.max(newLight, neighborLight - opacity);
+						}
+					}
+
+					// Schedule brightening since light level was set to 0
+					enqueueBrighteningFromCursor(newLight, lightType);
+				} else /*
+						 * We didn't become darker, so we need to re-set our initial light value (was
+						 * set to zero) and notify neighbors
+						 */ {
+					enqueueBrighteningFromCursor(currentLight, lightType); // Do not spread to neighbors immediately to
+																			// avoid scheduling multiple times
+				}
+			}
+
+			currentQueue = brighteningQueues[currentLight];
+
+			if (currentQueue != null)
+				currentQueue.newDeduplicationSet();
+
+			while (nextItem()) {
+				final byte oldLight = getCursorCachedLight(lightType);
+
+				// Only process this if nothing else has happened at this position since
+				// scheduling
+				if (oldLight == currentLight) {
+					world.notifyLightSet(currentPos);
+
+					if (currentLight > 1)
+						spreadLightFromCursor(currentLight, lightType);
+				}
+			}
+		}
+
+		updating = false;
+	}
+
+	/**
+	 * Gets data for neighbors of {@link #currentPos} and saves the results into
+	 * neighbor state data members. If a neighbor can't be accessed/doesn't exist,
+	 * the corresponding entry in neighborChunks is null - others are not reset
+	 */
+	private void fetchNeighborDataFromCursor(final EnumSkyBlock lightType) {
+		// Only update if curPos was changed
+		if (isNeighborDataValid)
+			return;
+
+		isNeighborDataValid = true;
+
+		for (int i = 0; i < neighborInfos.length; ++i) {
+			final NeighborInfo neighborInfo = neighborInfos[i];
+			final long neighborLongPos = neighborInfo.key = currentData + neighborShifts[i];
+
+			if ((neighborLongPos & Y_CHECK) != 0) {
+				neighborInfo.chunk = null;
+				continue;
+			}
+
+			final BlockPos neighborPos = decodeWorldCoord(neighborInfo.mutableBlockPos, neighborLongPos);
+
+			final Chunk neighborChunk;
+
+			if ((neighborLongPos & M_CHUNK) == currentChunkIdentifier)
+				neighborChunk = neighborInfo.chunk = currentChunk;
+			else
+				neighborChunk = neighborInfo.chunk = getChunk(neighborPos);
+
+			if (neighborChunk != null) {
+				final ExtendedBlockStorage neighborSection = neighborChunk
+						.getBlockStorageArray()[neighborPos.getY() >> 4];
+
+				neighborInfo.light = getCachedLightFor(neighborChunk, neighborSection, neighborPos, lightType);
+			}
+		}
+	}
+
+	private static byte getCachedLightFor(final Chunk chunk, final ExtendedBlockStorage storage,
+			final BlockPos blockPos, final EnumSkyBlock type) {
+		final int x = blockPos.getX() & 15;
+		final int y = blockPos.getY();
+		final int z = blockPos.getZ() & 15;
+
+		if (storage == null)
+			return type == EnumSkyBlock.SKY && chunk.canSeeSky(blockPos) ? (byte) type.defaultLightValue : 0;
+		else if (type == EnumSkyBlock.SKY)
+			return chunk.getWorld().provider.getHasNoSky() ? 0 : (byte) storage.getExtSkylightValue(x, y & 15, z);
+		else
+			return type == EnumSkyBlock.BLOCK ? (byte) storage.getExtBlocklightValue(x, y & 15, z)
+					: (byte) type.defaultLightValue;
+	}
+
+	private byte calculateNewLightFromCursor(final EnumSkyBlock lightType) {
+		final IBlockState blockState = currentChunk.getBlockState(currentPos);
+
+		final byte luminosity = getCursorLuminosity(blockState, lightType);
+		final byte opacity;
+
+		if (luminosity >= MAX_LIGHT_LEVEL - 1)
+			opacity = 1;
+		else
+			opacity = getPosOpacity(currentPos, blockState);
+
+		return calculateNewLightFromCursor(luminosity, opacity, lightType);
+	}
+
+	private byte calculateNewLightFromCursor(final byte luminosity, final byte opacity, final EnumSkyBlock lightType) {
+		if (luminosity >= MAX_LIGHT_LEVEL - opacity)
+			return luminosity;
+
+		byte newLight = luminosity;
+
+		fetchNeighborDataFromCursor(lightType);
+
+		for (final NeighborInfo neighborInfo : neighborInfos) {
+			if (neighborInfo.chunk == null)
+				continue;
+
+			newLight = (byte) Math.max(neighborInfo.light - opacity, newLight);
+		}
+
+		return newLight;
+	}
+
+	private void spreadLightFromCursor(final byte currentLight, final EnumSkyBlock lightType) {
+		fetchNeighborDataFromCursor(lightType);
+
+		for (final NeighborInfo neighborInfo : neighborInfos) {
+			final Chunk neighborChunk = neighborInfo.chunk;
+
+			if (neighborChunk == null || currentLight < neighborInfo.light)
+				continue;
+
+			final BlockPos neighborBlockPos = neighborInfo.mutableBlockPos;
+
+			final byte newLight = (byte) (currentLight
+					- getPosOpacity(neighborBlockPos, neighborChunk.getBlockState(neighborBlockPos)));
+
+			if (newLight > neighborInfo.light)
+				enqueueBrightening(neighborBlockPos, neighborInfo.key, newLight, neighborChunk, lightType);
+		}
+	}
+
+	private void enqueueBrighteningFromCursor(final byte newLight, final EnumSkyBlock lightType) {
+		enqueueBrightening(currentPos, currentData, newLight, currentChunk, lightType);
+	}
+
+	/**
+	 * Enqueues the blockPos for brightening and sets its light value to newLight
+	 */
+	private void enqueueBrightening(final BlockPos blockPos, final long longPos, final byte newLight, final Chunk chunk,
+			final EnumSkyBlock lightType) {
+		brighteningQueues[newLight].enqueue(longPos);
+
+		chunk.setLightFor(lightType, blockPos, newLight);
+	}
+
+	/**
+	 * Enqueues the blockPos for darkening and sets its light value to 0
+	 */
+	private void enqueueDarkening(final BlockPos blockPos, final long longPos, final byte oldLight, final Chunk chunk,
+			final EnumSkyBlock lightType) {
+		darkeningQueues[oldLight].enqueue(longPos);
+
+		chunk.setLightFor(lightType, blockPos, 0);
+	}
+
+	private static BlockPos decodeWorldCoord(final BlockPos mutableBlockPos, final long longPos) {
+		return mutableBlockPos.func_181079_c((int) (longPos >> S_X & M_X) - (1 << L_X - 1), (int) (longPos >> S_Y & M_Y),
+				(int) (longPos >> S_Z & M_Z) - (1 << L_Z - 1));
+	}
+
+	private static long encodeWorldCoord(final BlockPos pos) {
+		return ((long) pos.getY() << S_Y) | ((long) pos.getX() + (1 << L_X - 1) << S_X)
+				| ((long) pos.getZ() + (1 << L_Z - 1) << S_Z);
+	}
+
+	/**
+	 * Polls a new item from {@link #currentQueue} and fills in state data members
+	 *
+	 * @return If there was an item to poll
+	 */
+	private boolean nextItem() {
+		if (currentQueue.isEmpty()) {
+			currentQueue = null;
+
+			return false;
+		}
+
+		currentData = currentQueue.dequeue();
+		isNeighborDataValid = false;
+
+		decodeWorldCoord(currentPos, currentData);
+
+		final long chunkIdentifier = currentData & M_CHUNK;
+
+		if (currentChunkIdentifier != chunkIdentifier) {
+			currentChunk = getChunk(currentPos);
+			currentChunkIdentifier = chunkIdentifier;
+		}
+
+		return true;
+	}
+
+	private byte getCursorCachedLight(final EnumSkyBlock lightType) {
+		return currentChunk.alfheim$getCachedLightFor(lightType, currentPos);
+	}
+
+	/**
+	 * Calculates the luminosity for {@link #currentPos}, taking into account the
+	 * light type
+	 */
+	private byte getCursorLuminosity(final IBlockState state, final EnumSkyBlock lightType) {
+		if (lightType == EnumSkyBlock.SKY) {
+			if (currentChunk.canSeeSky(currentPos))
+				return (byte) EnumSkyBlock.SKY.defaultLightValue;
+			else
+				return 0;
+		}
+
+		return (byte) ClampUtil.clampMinFirst(state.getBlock().getLightValue(), 0, MAX_LIGHT_LEVEL);
+	}
+
+	private byte getPosOpacity(final BlockPos blockPos, final IBlockState blockState) {
+		return (byte) ClampUtil.clampMinFirst(blockState.getBlock().getLightOpacity(), 1, MAX_LIGHT_LEVEL);
+	}
+
+	private Chunk getChunk(final BlockPos blockPos) {
+		return world.getChunkProvider().getLoadedChunk(blockPos.getX() >> 4, blockPos.getZ() >> 4);
+	}
+
+	private static final class NeighborInfo {
+
+		public final BlockPos mutableBlockPos = new BlockPos();
+
+		public Chunk chunk;
+
+		public byte light;
+
+		public long key;
+	}
+}
diff --git a/sources/main/java/dev/redstudio/alfheim/utils/DeduplicatedLongQueue.java b/sources/main/java/dev/redstudio/alfheim/utils/DeduplicatedLongQueue.java
new file mode 100644
index 00000000..133e7b7e
--- /dev/null
+++ b/sources/main/java/dev/redstudio/alfheim/utils/DeduplicatedLongQueue.java
@@ -0,0 +1,75 @@
+package dev.redstudio.alfheim.utils;
+
+import com.carrotsearch.hppc.LongArrayDeque;
+import com.carrotsearch.hppc.LongHashSet;
+
+/**
+ * A queue implementation for long values that are deduplicated on addition.
+ * <p>
+ * This is achieved by storing the values in a {@link LongOpenHashSet} and a
+ * {@link LongArrayFIFOQueue}.
+ *
+ * @author Luna Lage (Desoroxxx)
+ * @since 1.3
+ */
+public final class DeduplicatedLongQueue {
+
+	// TODO: Fully Implement my own implementation to get rid of the downsides of
+	// reduce etc...
+
+	private final LongArrayDeque queue;
+	private LongHashSet set;
+
+	/**
+	 * Creates a new deduplicated queue with the given capacity.
+	 *
+	 * @param capacity The capacity of the deduplicated queue
+	 */
+	public DeduplicatedLongQueue(final int capacity) {
+		set = new LongHashSet(capacity);
+		queue = new LongArrayDeque(capacity);
+	}
+
+	/**
+	 * Adds a value to the queue.
+	 *
+	 * @param value The value to add to the queue
+	 */
+	public void enqueue(final long value) {
+		if (set.add(value))
+			queue.addLast(value);
+	}
+
+	/**
+	 * Removes and returns the first value in the queue.
+	 *
+	 * @return The first value in the queue
+	 */
+	public long dequeue() {
+		return queue.removeFirst();
+	}
+
+	/**
+	 * Returns whether the queue is empty.
+	 *
+	 * @return {@code true} if the queue is empty, {@code false} otherwise
+	 */
+	public boolean isEmpty() {
+		return queue.isEmpty();
+	}
+
+	/**
+	 * Creates a new deduplication set.
+	 */
+	public void newDeduplicationSet() {
+		int i = queue.size();
+		if(i < 4) {
+			i = 4;
+		}
+		if((set.keys.length * 3 / 2) > i) {
+			set = new LongHashSet(i);
+		}else {
+			set.clear();
+		}
+	}
+}
diff --git a/sources/main/java/dev/redstudio/alfheim/utils/EnumBoundaryFacing.java b/sources/main/java/dev/redstudio/alfheim/utils/EnumBoundaryFacing.java
new file mode 100644
index 00000000..9daeeed2
--- /dev/null
+++ b/sources/main/java/dev/redstudio/alfheim/utils/EnumBoundaryFacing.java
@@ -0,0 +1,5 @@
+package dev.redstudio.alfheim.utils;
+
+public enum EnumBoundaryFacing {
+	IN, OUT
+}
diff --git a/sources/main/java/dev/redstudio/alfheim/utils/WorldChunkSlice.java b/sources/main/java/dev/redstudio/alfheim/utils/WorldChunkSlice.java
new file mode 100644
index 00000000..58c6b30e
--- /dev/null
+++ b/sources/main/java/dev/redstudio/alfheim/utils/WorldChunkSlice.java
@@ -0,0 +1,88 @@
+package dev.redstudio.alfheim.utils;
+
+import net.minecraft.world.chunk.Chunk;
+import net.minecraft.world.chunk.IChunkProvider;
+
+/**
+ * Represents a slice of a world containing a collection of chunks.
+ *
+ * @author Luna Lage (Desoroxxx)
+ * @author Angeline (@jellysquid)
+ * @since 1.0
+ */
+public class WorldChunkSlice {
+
+	private static final int DIAMETER = 5;
+	private static final int RADIUS = DIAMETER / 2;
+
+	private final int x, z;
+
+	private final Chunk[] chunks;
+
+	/**
+	 * Initializes a {@link WorldChunkSlice} object using a given chunk provider and
+	 * coordinates.
+	 *
+	 * @param chunkProvider The chunk provider to get chunks from
+	 * @param x             The X-coordinate of the center chunk
+	 * @param z             The Z-coordinate of the center chunk
+	 */
+	public WorldChunkSlice(final IChunkProvider chunkProvider, final int x, final int z) {
+		chunks = new Chunk[DIAMETER * DIAMETER];
+
+		for (int xDiff = -RADIUS; xDiff <= RADIUS; xDiff++)
+			for (int zDiff = -RADIUS; zDiff <= RADIUS; zDiff++)
+				chunks[((xDiff + RADIUS) * DIAMETER) + (zDiff + RADIUS)] = chunkProvider.getLoadedChunk(x + xDiff,
+						z + zDiff);
+
+		this.x = x - RADIUS;
+		this.z = z - RADIUS;
+	}
+
+	/**
+	 * Checks if all chunks within a radius around a coordinate are loaded.
+	 *
+	 * @param x      The X-coordinate to check around
+	 * @param z      The Z-coordinate to check around
+	 * @param radius The radius around the coordinates to check
+	 *
+	 * @return true if all chunks are loaded, false otherwise
+	 */
+	public boolean isLoaded(final int x, final int z, final int radius) {
+		final int xStart = ((x - radius) >> 4) - this.x;
+		final int zStart = ((z - radius) >> 4) - this.z;
+		final int xEnd = ((x + radius) >> 4) - this.x;
+		final int zEnd = ((z + radius) >> 4) - this.z;
+
+		for (int currentX = xStart; currentX <= xEnd; ++currentX)
+			for (int currentZ = zStart; currentZ <= zEnd; ++currentZ)
+				if (getChunk(currentX, currentZ) == null)
+					return false;
+
+		return true;
+	}
+
+	/**
+	 * Retrieves the chunk that includes the provided world coordinates.
+	 *
+	 * @param x The X-coordinate in the world
+	 * @param z The Z-coordinate in the world
+	 *
+	 * @return The Chunk object that includes these coordinates
+	 */
+	public Chunk getChunkFromWorldCoords(final int x, final int z) {
+		return getChunk((x >> 4) - this.x, (z >> 4) - this.z);
+	}
+
+	/**
+	 * Retrieves the chunk located at the given coordinates within this chunk slice.
+	 *
+	 * @param x The X-coordinate within the slice
+	 * @param z The Z-coordinate within the slice
+	 *
+	 * @return The Chunk object at these coordinates
+	 */
+	private Chunk getChunk(final int x, final int z) {
+		return chunks[(x * DIAMETER) + z];
+	}
+}
diff --git a/sources/main/java/dev/redstudio/redcore/math/ClampUtil.java b/sources/main/java/dev/redstudio/redcore/math/ClampUtil.java
new file mode 100644
index 00000000..91480943
--- /dev/null
+++ b/sources/main/java/dev/redstudio/redcore/math/ClampUtil.java
@@ -0,0 +1,201 @@
+package dev.redstudio.redcore.math;
+
+public class ClampUtil {
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the minimum
+	 * value first.
+	 * <p>
+	 * If the input is less than min, it returns min. If the input is greater than
+	 * max, it returns max. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 *
+	 * @return The clamped value
+	 */
+	public static byte clampMinFirst(final byte input, final byte min, final byte max) {
+		return input < min ? min : input > max ? max : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the minimum
+	 * value first.
+	 * <p>
+	 * If the input is less than min, it returns min. If the input is greater than
+	 * max, it returns max. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 *
+	 * @return The clamped value
+	 */
+	public static short clampMinFirst(final short input, final short min, final short max) {
+		return input < min ? min : input > max ? max : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the minimum
+	 * value first.
+	 * <p>
+	 * If the input is less than min, it returns min. If the input is greater than
+	 * max, it returns max. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 *
+	 * @return The clamped value
+	 */
+	public static int clampMinFirst(final int input, final int min, final int max) {
+		return input < min ? min : input > max ? max : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the minimum
+	 * value first.
+	 * <p>
+	 * If the input is less than min, it returns min. If the input is greater than
+	 * max, it returns max. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 *
+	 * @return The clamped value
+	 */
+	public static long clampMinFirst(final long input, final long min, final long max) {
+		return input < min ? min : input > max ? max : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the minimum
+	 * value first.
+	 * <p>
+	 * If the input is less than min, it returns min. If the input is greater than
+	 * max, it returns max. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 *
+	 * @return The clamped value
+	 */
+	public static float clampMinFirst(final float input, final float min, final float max) {
+		return input < min ? min : input > max ? max : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the minimum
+	 * value first.
+	 * <p>
+	 * If the input is less than min, it returns min. If the input is greater than
+	 * max, it returns max. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 *
+	 * @return The clamped value
+	 */
+	public static double clampMinFirst(final double input, final double min, final double max) {
+		return input < min ? min : input > max ? max : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the maximum
+	 * value first.
+	 * <p>
+	 * If the input is greater than max, it returns max. If the input is less than
+	 * min, it returns min. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 * @return The clamped value
+	 */
+	public static byte clampMaxFirst(final byte input, final byte min, final byte max) {
+		return input > max ? max : input < min ? min : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the maximum
+	 * value first.
+	 * <p>
+	 * If the input is greater than max, it returns max. If the input is less than
+	 * min, it returns min. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 * @return The clamped value
+	 */
+	public static short clampMaxFirst(final short input, final short min, final short max) {
+		return input > max ? max : input < min ? min : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the maximum
+	 * value first.
+	 * <p>
+	 * If the input is greater than max, it returns max. If the input is less than
+	 * min, it returns min. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 * @return The clamped value
+	 */
+	public static int clampMaxFirst(final int input, final int min, final int max) {
+		return input > max ? max : input < min ? min : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the maximum
+	 * value first.
+	 * <p>
+	 * If the input is greater than max, it returns max. If the input is less than
+	 * min, it returns min. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 * @return The clamped value
+	 */
+	public static long clampMaxFirst(final long input, final long min, final long max) {
+		return input > max ? max : input < min ? min : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the maximum
+	 * value first.
+	 * <p>
+	 * If the input is greater than max, it returns max. If the input is less than
+	 * min, it returns min. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 * @return The clamped value
+	 */
+	public static float clampMaxFirst(final float input, final float min, final float max) {
+		return input > max ? max : input < min ? min : input;
+	}
+
+	/**
+	 * Clamps a value within a specified range [min, max], checking for the maximum
+	 * value first.
+	 * <p>
+	 * If the input is greater than max, it returns max. If the input is less than
+	 * min, it returns min. Otherwise, it returns the input.
+	 *
+	 * @param input The input value to clamp
+	 * @param min   The minimum value to clamp to
+	 * @param max   The maximum value to clamp to
+	 * @return The clamped value
+	 */
+	public static double clampMaxFirst(final double input, final double min, final double max) {
+		return input > max ? max : input < min ? min : input;
+	}
+}
diff --git a/sources/main/java/jdk_internal/bidi/Bidi.java b/sources/main/java/jdk_internal/bidi/Bidi.java
index 8c698bea..5ea9ee48 100644
--- a/sources/main/java/jdk_internal/bidi/Bidi.java
+++ b/sources/main/java/jdk_internal/bidi/Bidi.java
@@ -35,7 +35,7 @@
 
 package jdk_internal.bidi;
 
-import jdk_internal.bidi.icu.text.BidiBase;
+import jdk_internal.icu.text.BidiBase;
 
 /**
  * This class implements the Unicode Bidirectional Algorithm.
diff --git a/sources/main/java/jdk_internal/bidi/Normalizer.java b/sources/main/java/jdk_internal/bidi/Normalizer.java
index 8029bd38..ce51a813 100644
--- a/sources/main/java/jdk_internal/bidi/Normalizer.java
+++ b/sources/main/java/jdk_internal/bidi/Normalizer.java
@@ -37,7 +37,7 @@
 
 package jdk_internal.bidi;
 
-import jdk_internal.bidi.icu.text.NormalizerBase;
+import jdk_internal.icu.text.NormalizerBase;
 
 /**
  * This class provides the method {@code normalize} which transforms Unicode
diff --git a/sources/main/java/jdk_internal/bidi/SunNormalizer.java b/sources/main/java/jdk_internal/bidi/SunNormalizer.java
index d1f57bca..f550f2db 100644
--- a/sources/main/java/jdk_internal/bidi/SunNormalizer.java
+++ b/sources/main/java/jdk_internal/bidi/SunNormalizer.java
@@ -25,8 +25,8 @@
 
 package jdk_internal.bidi;
 
-import jdk_internal.bidi.icu.lang.UCharacter;
-import jdk_internal.bidi.icu.text.NormalizerBase;
+import jdk_internal.icu.lang.UCharacter;
+import jdk_internal.icu.text.NormalizerBase;
 
 /**
  * This Normalizer is for Unicode 3.2 support for IDNA only. Developers should
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/BMPSet.java b/sources/main/java/jdk_internal/icu/impl/BMPSet.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/BMPSet.java
rename to sources/main/java/jdk_internal/icu/impl/BMPSet.java
index c7a9999d..78c62aa6 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/BMPSet.java
+++ b/sources/main/java/jdk_internal/icu/impl/BMPSet.java
@@ -32,10 +32,10 @@
  ******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
-import jdk_internal.bidi.icu.text.UnicodeSet.SpanCondition;
-import jdk_internal.bidi.icu.util.OutputInt;
+import jdk_internal.icu.text.UnicodeSet.SpanCondition;
+import jdk_internal.icu.util.OutputInt;
 
 /**
  * Helper class for frozen UnicodeSets, implements contains() and span()
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/CharTrie.java b/sources/main/java/jdk_internal/icu/impl/CharTrie.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/impl/CharTrie.java
rename to sources/main/java/jdk_internal/icu/impl/CharTrie.java
index aab129b7..7df38d6c 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/CharTrie.java
+++ b/sources/main/java/jdk_internal/icu/impl/CharTrie.java
@@ -30,12 +30,12 @@
  ******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.DataInputStream;
 import java.io.InputStream;
 
-import jdk_internal.bidi.icu.text.UTF16;
+import jdk_internal.icu.text.UTF16;
 
 import java.io.IOException;
 
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/CharacterIteratorWrapper.java b/sources/main/java/jdk_internal/icu/impl/CharacterIteratorWrapper.java
similarity index 97%
rename from sources/main/java/jdk_internal/bidi/icu/impl/CharacterIteratorWrapper.java
rename to sources/main/java/jdk_internal/icu/impl/CharacterIteratorWrapper.java
index 7d6fcede..72d0a79b 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/CharacterIteratorWrapper.java
+++ b/sources/main/java/jdk_internal/icu/impl/CharacterIteratorWrapper.java
@@ -35,10 +35,10 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import jdk_internal.bidi.CharacterIterator;
-import jdk_internal.bidi.icu.text.UCharacterIterator;
+import jdk_internal.icu.text.UCharacterIterator;
 
 /**
  * This class is a wrapper around CharacterIterator and implements the
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/ICUBinary.java b/sources/main/java/jdk_internal/icu/impl/ICUBinary.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/ICUBinary.java
rename to sources/main/java/jdk_internal/icu/impl/ICUBinary.java
index dbbe0b39..c1a3e472 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/ICUBinary.java
+++ b/sources/main/java/jdk_internal/icu/impl/ICUBinary.java
@@ -30,7 +30,7 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.DataInputStream;
 import java.io.InputStream;
@@ -40,7 +40,7 @@ import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.util.Arrays;
 
-import jdk_internal.bidi.icu.util.VersionInfo;
+import jdk_internal.icu.util.VersionInfo;
 import net.lax1dude.eaglercraft.v1_8.EagRuntime;
 
 public final class ICUBinary {
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/Norm2AllModes.java b/sources/main/java/jdk_internal/icu/impl/Norm2AllModes.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/Norm2AllModes.java
rename to sources/main/java/jdk_internal/icu/impl/Norm2AllModes.java
index aaabf2f0..58293e43 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/Norm2AllModes.java
+++ b/sources/main/java/jdk_internal/icu/impl/Norm2AllModes.java
@@ -30,11 +30,11 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.IOException;
 
-import jdk_internal.bidi.icu.text.Normalizer2;
+import jdk_internal.icu.text.Normalizer2;
 
 public final class Norm2AllModes {
 	// Public API dispatch via Normalizer2 subclasses -------------------------- ***
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/NormalizerImpl.java b/sources/main/java/jdk_internal/icu/impl/NormalizerImpl.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/NormalizerImpl.java
rename to sources/main/java/jdk_internal/icu/impl/NormalizerImpl.java
index 920aa7a0..00884aa7 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/NormalizerImpl.java
+++ b/sources/main/java/jdk_internal/icu/impl/NormalizerImpl.java
@@ -29,16 +29,16 @@
  *   Corporation and others.  All Rights Reserved.
  *******************************************************************************
  */
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
-import jdk_internal.bidi.icu.lang.UCharacter;
-import jdk_internal.bidi.icu.text.Normalizer2;
-import jdk_internal.bidi.icu.text.UTF16;
-import jdk_internal.bidi.icu.util.CodePointTrie;
-import jdk_internal.bidi.icu.util.VersionInfo;
+import jdk_internal.icu.lang.UCharacter;
+import jdk_internal.icu.text.Normalizer2;
+import jdk_internal.icu.text.UTF16;
+import jdk_internal.icu.util.CodePointTrie;
+import jdk_internal.icu.util.VersionInfo;
 
 // Original filename in ICU4J: Normalizer2Impl.java
 public final class NormalizerImpl {
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/Punycode.java b/sources/main/java/jdk_internal/icu/impl/Punycode.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/Punycode.java
rename to sources/main/java/jdk_internal/icu/impl/Punycode.java
index c6491b0c..5fe701a4 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/Punycode.java
+++ b/sources/main/java/jdk_internal/icu/impl/Punycode.java
@@ -37,12 +37,12 @@
 //      2007-08-14 Martin Buchholz
 //          - remove redundant casts
 //
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.text.ParseException;
 
-import jdk_internal.bidi.icu.lang.UCharacter;
-import jdk_internal.bidi.icu.text.UTF16;
+import jdk_internal.icu.lang.UCharacter;
+import jdk_internal.icu.text.UTF16;
 
 /**
  * Ported code from ICU punycode.c
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/ReplaceableUCharacterIterator.java b/sources/main/java/jdk_internal/icu/impl/ReplaceableUCharacterIterator.java
similarity index 96%
rename from sources/main/java/jdk_internal/bidi/icu/impl/ReplaceableUCharacterIterator.java
rename to sources/main/java/jdk_internal/icu/impl/ReplaceableUCharacterIterator.java
index 3e090726..c1b00bb2 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/ReplaceableUCharacterIterator.java
+++ b/sources/main/java/jdk_internal/icu/impl/ReplaceableUCharacterIterator.java
@@ -35,11 +35,11 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
-import jdk_internal.bidi.icu.text.Replaceable;
-import jdk_internal.bidi.icu.text.ReplaceableString;
-import jdk_internal.bidi.icu.text.UCharacterIterator;
+import jdk_internal.icu.text.Replaceable;
+import jdk_internal.icu.text.ReplaceableString;
+import jdk_internal.icu.text.UCharacterIterator;
 
 /**
  * DLF docs must define behavior when Replaceable is mutated underneath the
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/StringPrepDataReader.java b/sources/main/java/jdk_internal/icu/impl/StringPrepDataReader.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/StringPrepDataReader.java
rename to sources/main/java/jdk_internal/icu/impl/StringPrepDataReader.java
index 98aafc74..149155f0 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/StringPrepDataReader.java
+++ b/sources/main/java/jdk_internal/icu/impl/StringPrepDataReader.java
@@ -39,7 +39,7 @@
 //          - copy this file from icu4jsrc_3_2/src/com/ibm/icu/impl/StringPrepDataReader.java
 //          - move from package com.ibm.icu.impl to package sun.net.idn
 //
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.DataInputStream;
 import java.io.IOException;
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/Trie.java b/sources/main/java/jdk_internal/icu/impl/Trie.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/Trie.java
rename to sources/main/java/jdk_internal/icu/impl/Trie.java
index 2b5038ee..ea48c547 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/Trie.java
+++ b/sources/main/java/jdk_internal/icu/impl/Trie.java
@@ -30,13 +30,13 @@
  ******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.DataInputStream;
 import java.io.InputStream;
 
-import jdk_internal.bidi.icu.lang.UCharacter;
-import jdk_internal.bidi.icu.text.UTF16;
+import jdk_internal.icu.lang.UCharacter;
+import jdk_internal.icu.text.UTF16;
 
 import java.io.IOException;
 
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/Trie2.java b/sources/main/java/jdk_internal/icu/impl/Trie2.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/Trie2.java
rename to sources/main/java/jdk_internal/icu/impl/Trie2.java
index 94c72fcd..15347caf 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/Trie2.java
+++ b/sources/main/java/jdk_internal/icu/impl/Trie2.java
@@ -30,7 +30,7 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/Trie2_16.java b/sources/main/java/jdk_internal/icu/impl/Trie2_16.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/Trie2_16.java
rename to sources/main/java/jdk_internal/icu/impl/Trie2_16.java
index 770754a7..632ac070 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/Trie2_16.java
+++ b/sources/main/java/jdk_internal/icu/impl/Trie2_16.java
@@ -30,7 +30,7 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/UBiDiProps.java b/sources/main/java/jdk_internal/icu/impl/UBiDiProps.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/impl/UBiDiProps.java
rename to sources/main/java/jdk_internal/icu/impl/UBiDiProps.java
index b81ec6b7..70331b71 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/UBiDiProps.java
+++ b/sources/main/java/jdk_internal/icu/impl/UBiDiProps.java
@@ -41,11 +41,12 @@
  *   Java port of ubidi_props.h/.c.
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import jdk_internal.bidi.icu.lang.UCharacter;
+
+import jdk_internal.icu.lang.UCharacter;
 
 public final class UBiDiProps {
 	// constructors etc. --------------------------------------------------- ***
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/UCharacterProperty.java b/sources/main/java/jdk_internal/icu/impl/UCharacterProperty.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/impl/UCharacterProperty.java
rename to sources/main/java/jdk_internal/icu/impl/UCharacterProperty.java
index 7b77640f..1d838380 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/UCharacterProperty.java
+++ b/sources/main/java/jdk_internal/icu/impl/UCharacterProperty.java
@@ -29,17 +29,17 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Iterator;
 
-import jdk_internal.bidi.icu.lang.UCharacter.HangulSyllableType;
-import jdk_internal.bidi.icu.lang.UCharacter.NumericType;
-import jdk_internal.bidi.icu.text.UTF16;
-import jdk_internal.bidi.icu.text.UnicodeSet;
-import jdk_internal.bidi.icu.util.VersionInfo;
+import jdk_internal.icu.lang.UCharacter.HangulSyllableType;
+import jdk_internal.icu.lang.UCharacter.NumericType;
+import jdk_internal.icu.text.UTF16;
+import jdk_internal.icu.text.UnicodeSet;
+import jdk_internal.icu.util.VersionInfo;
 
 /**
  * <p>
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/UnicodeSetStringSpan.java b/sources/main/java/jdk_internal/icu/impl/UnicodeSetStringSpan.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/impl/UnicodeSetStringSpan.java
rename to sources/main/java/jdk_internal/icu/impl/UnicodeSetStringSpan.java
index c89f8b09..ddde4688 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/UnicodeSetStringSpan.java
+++ b/sources/main/java/jdk_internal/icu/impl/UnicodeSetStringSpan.java
@@ -32,14 +32,14 @@
  ******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.util.ArrayList;
 
-import jdk_internal.bidi.icu.text.UTF16;
-import jdk_internal.bidi.icu.text.UnicodeSet;
-import jdk_internal.bidi.icu.text.UnicodeSet.SpanCondition;
-import jdk_internal.bidi.icu.util.OutputInt;
+import jdk_internal.icu.text.UTF16;
+import jdk_internal.icu.text.UnicodeSet;
+import jdk_internal.icu.text.UnicodeSet.SpanCondition;
+import jdk_internal.icu.util.OutputInt;
 
 /*
  * Implement span() etc. for a set with strings.
diff --git a/sources/main/java/jdk_internal/bidi/icu/impl/Utility.java b/sources/main/java/jdk_internal/icu/impl/Utility.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/impl/Utility.java
rename to sources/main/java/jdk_internal/icu/impl/Utility.java
index 74d0852d..c1915b15 100644
--- a/sources/main/java/jdk_internal/bidi/icu/impl/Utility.java
+++ b/sources/main/java/jdk_internal/icu/impl/Utility.java
@@ -29,13 +29,13 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.impl;
+package jdk_internal.icu.impl;
 
 import java.io.IOException;
 import java.util.Locale;
 
-import jdk_internal.bidi.icu.lang.UCharacter;
-import jdk_internal.bidi.icu.text.UTF16;
+import jdk_internal.icu.lang.UCharacter;
+import jdk_internal.icu.text.UTF16;
 
 public final class Utility {
 
diff --git a/sources/main/java/jdk_internal/bidi/icu/lang/UCharacter.java b/sources/main/java/jdk_internal/icu/lang/UCharacter.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/lang/UCharacter.java
rename to sources/main/java/jdk_internal/icu/lang/UCharacter.java
index 3c0fce0e..e47952e0 100644
--- a/sources/main/java/jdk_internal/bidi/icu/lang/UCharacter.java
+++ b/sources/main/java/jdk_internal/icu/lang/UCharacter.java
@@ -30,13 +30,13 @@
 *******************************************************************************
 */
 
-package jdk_internal.bidi.icu.lang;
+package jdk_internal.icu.lang;
 
-import jdk_internal.bidi.icu.impl.UBiDiProps;
-import jdk_internal.bidi.icu.impl.UCharacterProperty;
-import jdk_internal.bidi.icu.text.Normalizer2;
-import jdk_internal.bidi.icu.text.UTF16;
-import jdk_internal.bidi.icu.util.VersionInfo;
+import jdk_internal.icu.impl.UBiDiProps;
+import jdk_internal.icu.impl.UCharacterProperty;
+import jdk_internal.icu.text.Normalizer2;
+import jdk_internal.icu.text.UTF16;
+import jdk_internal.icu.util.VersionInfo;
 
 /**
  * <p>
diff --git a/sources/main/java/jdk_internal/bidi/icu/lang/UCharacterDirection.java b/sources/main/java/jdk_internal/icu/lang/UCharacterDirection.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/lang/UCharacterDirection.java
rename to sources/main/java/jdk_internal/icu/lang/UCharacterDirection.java
index 7a3c8035..af9f455d 100644
--- a/sources/main/java/jdk_internal/bidi/icu/lang/UCharacterDirection.java
+++ b/sources/main/java/jdk_internal/icu/lang/UCharacterDirection.java
@@ -35,7 +35,7 @@
 //          - move from package com.ibm.icu.lang to package sun.net.idn
 //
 
-package jdk_internal.bidi.icu.lang;
+package jdk_internal.icu.lang;
 
 /**
  * Enumerated Unicode character linguistic direction constants. Used as return
diff --git a/sources/main/java/jdk_internal/bidi/icu/lang/UCharacterEnums.java b/sources/main/java/jdk_internal/icu/lang/UCharacterEnums.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/lang/UCharacterEnums.java
rename to sources/main/java/jdk_internal/icu/lang/UCharacterEnums.java
index dd09e6f6..1e196dc5 100644
--- a/sources/main/java/jdk_internal/bidi/icu/lang/UCharacterEnums.java
+++ b/sources/main/java/jdk_internal/icu/lang/UCharacterEnums.java
@@ -51,7 +51,7 @@
 //              DIRECTIONALITY_BOUNDARY_NEUTRAL, DIRECTIONALITY_UNDEFINED
 //
 
-package jdk_internal.bidi.icu.lang;
+package jdk_internal.icu.lang;
 
 /**
  * A container for the different 'enumerated types' used by UCharacter.
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/BidiBase.java b/sources/main/java/jdk_internal/icu/text/BidiBase.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/BidiBase.java
rename to sources/main/java/jdk_internal/icu/text/BidiBase.java
index ce33152a..9f4f24dc 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/BidiBase.java
+++ b/sources/main/java/jdk_internal/icu/text/BidiBase.java
@@ -46,7 +46,7 @@
  * fallbacks for unsupported combinations.
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 import java.lang.reflect.Array;
 import java.util.Arrays;
@@ -55,8 +55,8 @@ import jdk_internal.bidi.AttributedCharacterIterator;
 import jdk_internal.bidi.Bidi;
 import jdk_internal.bidi.NumericShaper;
 import jdk_internal.bidi.TextAttribute;
-import jdk_internal.bidi.icu.impl.UBiDiProps;
-import jdk_internal.bidi.icu.lang.UCharacter;
+import jdk_internal.icu.impl.UBiDiProps;
+import jdk_internal.icu.lang.UCharacter;
 
 /**
  *
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/BidiLine.java b/sources/main/java/jdk_internal/icu/text/BidiLine.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/BidiLine.java
rename to sources/main/java/jdk_internal/icu/text/BidiLine.java
index 19d8e73e..56620549 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/BidiLine.java
+++ b/sources/main/java/jdk_internal/icu/text/BidiLine.java
@@ -33,7 +33,7 @@
  * (ported from C code written by Markus W. Scherer)
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 import java.util.Arrays;
 
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/BidiRun.java b/sources/main/java/jdk_internal/icu/text/BidiRun.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/BidiRun.java
rename to sources/main/java/jdk_internal/icu/text/BidiRun.java
index 97b0e810..333af89e 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/BidiRun.java
+++ b/sources/main/java/jdk_internal/icu/text/BidiRun.java
@@ -37,7 +37,7 @@
  * (ported from C code written by Markus W. Scherer)
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 /**
  * A BidiRun represents a sequence of characters at the same embedding level.
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/BidiWriter.java b/sources/main/java/jdk_internal/icu/text/BidiWriter.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/BidiWriter.java
rename to sources/main/java/jdk_internal/icu/text/BidiWriter.java
index e9fa71e6..60339207 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/BidiWriter.java
+++ b/sources/main/java/jdk_internal/icu/text/BidiWriter.java
@@ -33,9 +33,9 @@
  * (ported from C code written by Markus W. Scherer)
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
-import jdk_internal.bidi.icu.lang.UCharacter;
+import jdk_internal.icu.lang.UCharacter;
 
 final class BidiWriter {
 
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/FilteredNormalizer2.java b/sources/main/java/jdk_internal/icu/text/FilteredNormalizer2.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/FilteredNormalizer2.java
rename to sources/main/java/jdk_internal/icu/text/FilteredNormalizer2.java
index 3f9046bb..f3915e57 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/FilteredNormalizer2.java
+++ b/sources/main/java/jdk_internal/icu/text/FilteredNormalizer2.java
@@ -29,7 +29,7 @@
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 */
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 import java.io.IOException;
 
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/Normalizer2.java b/sources/main/java/jdk_internal/icu/text/Normalizer2.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/Normalizer2.java
rename to sources/main/java/jdk_internal/icu/text/Normalizer2.java
index f833478f..5471fcd1 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/Normalizer2.java
+++ b/sources/main/java/jdk_internal/icu/text/Normalizer2.java
@@ -30,9 +30,9 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
-import jdk_internal.bidi.icu.impl.Norm2AllModes;
+import jdk_internal.icu.impl.Norm2AllModes;
 
 /**
  * Unicode normalization functionality for standard Unicode normalization or for
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/NormalizerBase.java b/sources/main/java/jdk_internal/icu/text/NormalizerBase.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/NormalizerBase.java
rename to sources/main/java/jdk_internal/icu/text/NormalizerBase.java
index 5887aecb..d10b15f0 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/NormalizerBase.java
+++ b/sources/main/java/jdk_internal/icu/text/NormalizerBase.java
@@ -29,11 +29,11 @@
  * others. All Rights Reserved.
  *******************************************************************************
  */
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 import jdk_internal.bidi.CharacterIterator;
 import jdk_internal.bidi.Normalizer;
-import jdk_internal.bidi.icu.impl.Norm2AllModes;
+import jdk_internal.icu.impl.Norm2AllModes;
 
 /**
  * Unicode Normalization
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/Replaceable.java b/sources/main/java/jdk_internal/icu/text/Replaceable.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/Replaceable.java
rename to sources/main/java/jdk_internal/icu/text/Replaceable.java
index 22c7fff6..cd843b17 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/Replaceable.java
+++ b/sources/main/java/jdk_internal/icu/text/Replaceable.java
@@ -35,7 +35,7 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 /**
  * <code>Replaceable</code> is an interface representing a string of characters
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/ReplaceableString.java b/sources/main/java/jdk_internal/icu/text/ReplaceableString.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/ReplaceableString.java
rename to sources/main/java/jdk_internal/icu/text/ReplaceableString.java
index 661eccac..c9b75d6d 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/ReplaceableString.java
+++ b/sources/main/java/jdk_internal/icu/text/ReplaceableString.java
@@ -30,7 +30,7 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 /**
  * <code>ReplaceableString</code> is an adapter class that implements the
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/StringPrep.java b/sources/main/java/jdk_internal/icu/text/StringPrep.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/text/StringPrep.java
rename to sources/main/java/jdk_internal/icu/text/StringPrep.java
index da41151a..656c484b 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/StringPrep.java
+++ b/sources/main/java/jdk_internal/icu/text/StringPrep.java
@@ -40,7 +40,7 @@
 //      2007-08-14 Martin Buchholz
 //          - remove redundant casts
 //
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
@@ -50,12 +50,12 @@ import java.io.InputStream;
 import jdk_internal.bidi.Normalizer;
 import jdk_internal.bidi.ParseException;
 import jdk_internal.bidi.SunNormalizer;
-import jdk_internal.bidi.icu.impl.CharTrie;
-import jdk_internal.bidi.icu.impl.StringPrepDataReader;
-import jdk_internal.bidi.icu.impl.Trie;
-import jdk_internal.bidi.icu.lang.UCharacter;
-import jdk_internal.bidi.icu.lang.UCharacterDirection;
-import jdk_internal.bidi.icu.util.VersionInfo;
+import jdk_internal.icu.impl.CharTrie;
+import jdk_internal.icu.impl.StringPrepDataReader;
+import jdk_internal.icu.impl.Trie;
+import jdk_internal.icu.lang.UCharacter;
+import jdk_internal.icu.lang.UCharacterDirection;
+import jdk_internal.icu.util.VersionInfo;
 
 /**
  * StringPrep API implements the StingPrep framework as described by
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/UCharacterIterator.java b/sources/main/java/jdk_internal/icu/text/UCharacterIterator.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/text/UCharacterIterator.java
rename to sources/main/java/jdk_internal/icu/text/UCharacterIterator.java
index 656b4df5..55031d63 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/UCharacterIterator.java
+++ b/sources/main/java/jdk_internal/icu/text/UCharacterIterator.java
@@ -30,12 +30,12 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 import jdk_internal.bidi.CharacterIterator;
-import jdk_internal.bidi.icu.impl.CharacterIteratorWrapper;
-import jdk_internal.bidi.icu.impl.ReplaceableUCharacterIterator;
-import jdk_internal.bidi.icu.impl.UCharacterProperty;
+import jdk_internal.icu.impl.CharacterIteratorWrapper;
+import jdk_internal.icu.impl.ReplaceableUCharacterIterator;
+import jdk_internal.icu.impl.UCharacterProperty;
 
 /**
  * Abstract class that defines an API for iteration on text objects.This is an
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/UTF16.java b/sources/main/java/jdk_internal/icu/text/UTF16.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/UTF16.java
rename to sources/main/java/jdk_internal/icu/text/UTF16.java
index 5a39fedf..3efde5af 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/UTF16.java
+++ b/sources/main/java/jdk_internal/icu/text/UTF16.java
@@ -29,9 +29,9 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
-import jdk_internal.bidi.icu.impl.UCharacterProperty;
+import jdk_internal.icu.impl.UCharacterProperty;
 
 /**
  * <p>
diff --git a/sources/main/java/jdk_internal/bidi/icu/text/UnicodeSet.java b/sources/main/java/jdk_internal/icu/text/UnicodeSet.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/text/UnicodeSet.java
rename to sources/main/java/jdk_internal/icu/text/UnicodeSet.java
index 5797c6be..cd46cdc4 100644
--- a/sources/main/java/jdk_internal/bidi/icu/text/UnicodeSet.java
+++ b/sources/main/java/jdk_internal/icu/text/UnicodeSet.java
@@ -29,19 +29,19 @@
  * others. All Rights Reserved.
  *******************************************************************************
  */
-package jdk_internal.bidi.icu.text;
+package jdk_internal.icu.text;
 
 import java.text.ParsePosition;
 import java.util.ArrayList;
 import java.util.TreeSet;
 
-import jdk_internal.bidi.icu.impl.BMPSet;
-import jdk_internal.bidi.icu.impl.UCharacterProperty;
-import jdk_internal.bidi.icu.impl.UnicodeSetStringSpan;
-import jdk_internal.bidi.icu.impl.Utility;
-import jdk_internal.bidi.icu.lang.UCharacter;
-import jdk_internal.bidi.icu.util.OutputInt;
-import jdk_internal.bidi.icu.util.VersionInfo;
+import jdk_internal.icu.impl.BMPSet;
+import jdk_internal.icu.impl.UCharacterProperty;
+import jdk_internal.icu.impl.UnicodeSetStringSpan;
+import jdk_internal.icu.impl.Utility;
+import jdk_internal.icu.lang.UCharacter;
+import jdk_internal.icu.util.OutputInt;
+import jdk_internal.icu.util.VersionInfo;
 
 /**
  * A mutable set of Unicode characters and multicharacter strings. Objects of
diff --git a/sources/main/java/jdk_internal/bidi/icu/util/CodePointMap.java b/sources/main/java/jdk_internal/icu/util/CodePointMap.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/util/CodePointMap.java
rename to sources/main/java/jdk_internal/icu/util/CodePointMap.java
index 358b631b..e7b0c4ed 100644
--- a/sources/main/java/jdk_internal/bidi/icu/util/CodePointMap.java
+++ b/sources/main/java/jdk_internal/icu/util/CodePointMap.java
@@ -27,7 +27,7 @@
 
 // created: 2018may10 Markus W. Scherer
 
-package jdk_internal.bidi.icu.util;
+package jdk_internal.icu.util;
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
diff --git a/sources/main/java/jdk_internal/bidi/icu/util/CodePointTrie.java b/sources/main/java/jdk_internal/icu/util/CodePointTrie.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/util/CodePointTrie.java
rename to sources/main/java/jdk_internal/icu/util/CodePointTrie.java
index e84c2d0e..30f1bb76 100644
--- a/sources/main/java/jdk_internal/bidi/icu/util/CodePointTrie.java
+++ b/sources/main/java/jdk_internal/icu/util/CodePointTrie.java
@@ -27,9 +27,9 @@
 
 // created: 2018may04 Markus W. Scherer
 
-package jdk_internal.bidi.icu.util;
+package jdk_internal.icu.util;
 
-import static jdk_internal.bidi.icu.impl.NormalizerImpl.UTF16Plus;
+import static jdk_internal.icu.impl.NormalizerImpl.UTF16Plus;
 
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -38,7 +38,7 @@ import java.io.OutputStream;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 
-import jdk_internal.bidi.icu.impl.ICUBinary;
+import jdk_internal.icu.impl.ICUBinary;
 
 /**
  * Immutable Unicode code point trie. Fast, reasonably compact, map from Unicode
diff --git a/sources/main/java/jdk_internal/bidi/icu/util/OutputInt.java b/sources/main/java/jdk_internal/icu/util/OutputInt.java
similarity index 98%
rename from sources/main/java/jdk_internal/bidi/icu/util/OutputInt.java
rename to sources/main/java/jdk_internal/icu/util/OutputInt.java
index 433bf28a..973e4168 100644
--- a/sources/main/java/jdk_internal/bidi/icu/util/OutputInt.java
+++ b/sources/main/java/jdk_internal/icu/util/OutputInt.java
@@ -29,7 +29,7 @@
  * others. All Rights Reserved.
  *******************************************************************************
  */
-package jdk_internal.bidi.icu.util;
+package jdk_internal.icu.util;
 
 /**
  * Simple struct-like class for int output parameters. Like
diff --git a/sources/main/java/jdk_internal/bidi/icu/util/VersionInfo.java b/sources/main/java/jdk_internal/icu/util/VersionInfo.java
similarity index 99%
rename from sources/main/java/jdk_internal/bidi/icu/util/VersionInfo.java
rename to sources/main/java/jdk_internal/icu/util/VersionInfo.java
index d6abf225..06724a83 100644
--- a/sources/main/java/jdk_internal/bidi/icu/util/VersionInfo.java
+++ b/sources/main/java/jdk_internal/icu/util/VersionInfo.java
@@ -34,7 +34,7 @@
  *******************************************************************************
  */
 
-package jdk_internal.bidi.icu.util;
+package jdk_internal.icu.util;
 
 import java.util.HashMap;
 
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglerProperties.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglerProperties.java
new file mode 100644
index 00000000..fc4311ef
--- /dev/null
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglerProperties.java
@@ -0,0 +1,326 @@
+/*
+ * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+package net.lax1dude.eaglercraft.v1_8;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.Properties;
+
+public class EaglerProperties extends Properties {
+
+	public void load(Reader reader) throws IOException {
+		load0(new LineReader(reader));
+	}
+
+	public void load(InputStream inStream) throws IOException {
+		load0(new LineReader(inStream));
+	}
+
+	private void load0(LineReader lr) throws IOException {
+		StringBuilder outBuffer = new StringBuilder();
+		int limit;
+		int keyLen;
+		int valueStart;
+		boolean hasSep;
+		boolean precedingBackslash;
+		boolean first = true;
+
+		while ((limit = lr.readLine()) >= 0) {
+			keyLen = 0;
+			valueStart = limit;
+			hasSep = false;
+			if(first && limit > 0) {
+				if(lr.lineBuf[0] == 65279) {
+					keyLen = 1;
+				}
+			}
+			first = false;
+
+			// System.out.println("line=<" + new String(lineBuf, 0, limit) + ">");
+			precedingBackslash = false;
+			while (keyLen < limit) {
+				char c = lr.lineBuf[keyLen];
+				// need check if escaped.
+				if ((c == '=' || c == ':') && !precedingBackslash) {
+					valueStart = keyLen + 1;
+					hasSep = true;
+					break;
+				} else if ((c == ' ' || c == '\t' || c == '\f') && !precedingBackslash) {
+					valueStart = keyLen + 1;
+					break;
+				}
+				if (c == '\\') {
+					precedingBackslash = !precedingBackslash;
+				} else {
+					precedingBackslash = false;
+				}
+				keyLen++;
+			}
+			while (valueStart < limit) {
+				char c = lr.lineBuf[valueStart];
+				if (c != ' ' && c != '\t' && c != '\f') {
+					if (!hasSep && (c == '=' || c == ':')) {
+						hasSep = true;
+					} else {
+						break;
+					}
+				}
+				valueStart++;
+			}
+			String key = loadConvert(lr.lineBuf, 0, keyLen, outBuffer);
+			String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, outBuffer);
+			put(key, value);
+		}
+	}
+
+	/*
+	 * Read in a "logical line" from an InputStream/Reader, skip all comment and
+	 * blank lines and filter out those leading whitespace characters (\u0020,
+	 * \u0009 and \u000c) from the beginning of a "natural line". Method returns the
+	 * char length of the "logical line" and stores the line in "lineBuf".
+	 */
+	private static class LineReader {
+		LineReader(InputStream inStream) {
+			this.inStream = inStream;
+			inByteBuf = new byte[8192];
+		}
+
+		LineReader(Reader reader) {
+			this.reader = reader;
+			inCharBuf = new char[8192];
+		}
+
+		char[] lineBuf = new char[1024];
+		private byte[] inByteBuf;
+		private char[] inCharBuf;
+		private int inLimit = 0;
+		private int inOff = 0;
+		private InputStream inStream;
+		private Reader reader;
+
+		int readLine() throws IOException {
+			// use locals to optimize for interpreted performance
+			int len = 0;
+			int off = inOff;
+			int limit = inLimit;
+
+			boolean skipWhiteSpace = true;
+			boolean appendedLineBegin = false;
+			boolean precedingBackslash = false;
+			boolean fromStream = inStream != null;
+			byte[] byteBuf = inByteBuf;
+			char[] charBuf = inCharBuf;
+			char[] lineBuf = this.lineBuf;
+			char c;
+
+			while (true) {
+				if (off >= limit) {
+					inLimit = limit = fromStream ? inStream.read(byteBuf) : reader.read(charBuf);
+					if (limit <= 0) {
+						if (len == 0) {
+							return -1;
+						}
+						return precedingBackslash ? len - 1 : len;
+					}
+					off = 0;
+				}
+
+				// (char)(byte & 0xFF) is equivalent to calling a ISO8859-1 decoder.
+				c = (fromStream) ? (char) (byteBuf[off++] & 0xFF) : charBuf[off++];
+
+				if (skipWhiteSpace) {
+					if (c == ' ' || c == '\t' || c == '\f') {
+						continue;
+					}
+					if (!appendedLineBegin && (c == '\r' || c == '\n')) {
+						continue;
+					}
+					skipWhiteSpace = false;
+					appendedLineBegin = false;
+
+				}
+				if (len == 0) { // Still on a new logical line
+					if (c == '#' || c == '!') {
+						// Comment, quickly consume the rest of the line
+
+						// When checking for new line characters a range check,
+						// starting with the higher bound ('\r') means one less
+						// branch in the common case.
+						commentLoop: while (true) {
+							if (fromStream) {
+								byte b;
+								while (off < limit) {
+									b = byteBuf[off++];
+									if (b <= '\r' && (b == '\r' || b == '\n'))
+										break commentLoop;
+								}
+								if (off == limit) {
+									inLimit = limit = inStream.read(byteBuf);
+									if (limit <= 0) { // EOF
+										return -1;
+									}
+									off = 0;
+								}
+							} else {
+								while (off < limit) {
+									c = charBuf[off++];
+									if (c <= '\r' && (c == '\r' || c == '\n'))
+										break commentLoop;
+								}
+								if (off == limit) {
+									inLimit = limit = reader.read(charBuf);
+									if (limit <= 0) { // EOF
+										return -1;
+									}
+									off = 0;
+								}
+							}
+						}
+						skipWhiteSpace = true;
+						continue;
+					}
+				}
+
+				if (c != '\n' && c != '\r') {
+					lineBuf[len++] = c;
+					if (len == lineBuf.length) {
+						lineBuf = new char[len + (len << 1)];
+						System.arraycopy(this.lineBuf, 0, lineBuf, 0, len);
+						this.lineBuf = lineBuf;
+					}
+					// flip the preceding backslash flag
+					precedingBackslash = (c == '\\') ? !precedingBackslash : false;
+				} else {
+					// reached EOL
+					if (len == 0) {
+						skipWhiteSpace = true;
+						continue;
+					}
+					if (off >= limit) {
+						inLimit = limit = fromStream ? inStream.read(byteBuf) : reader.read(charBuf);
+						off = 0;
+						if (limit <= 0) { // EOF
+							return precedingBackslash ? len - 1 : len;
+						}
+					}
+					if (precedingBackslash) {
+						// backslash at EOL is not part of the line
+						len -= 1;
+						// skip leading whitespace characters in the following line
+						skipWhiteSpace = true;
+						appendedLineBegin = true;
+						precedingBackslash = false;
+						// take care not to include any subsequent \n
+						if (c == '\r') {
+							if (fromStream) {
+								if (byteBuf[off] == '\n') {
+									off++;
+								}
+							} else {
+								if (charBuf[off] == '\n') {
+									off++;
+								}
+							}
+						}
+					} else {
+						inOff = off;
+						return len;
+					}
+				}
+			}
+		}
+	}
+
+	/*
+	 * Converts encoded &#92;uxxxx to unicode chars and changes special saved chars
+	 * to their original forms
+	 */
+	private String loadConvert(char[] in, int off, int len, StringBuilder out) {
+		char aChar;
+		int end = off + len;
+		int start = off;
+		while (off < end) {
+			aChar = in[off++];
+			if (aChar == '\\') {
+				break;
+			}
+		}
+		if (off == end) { // No backslash
+			return new String(in, start, len);
+		}
+
+		// backslash found at off - 1, reset the shared buffer, rewind offset
+		out.setLength(0);
+		off--;
+		out.append(in, start, off - start);
+
+		while (off < end) {
+			aChar = in[off++];
+			if (aChar == '\\') {
+				// No need to bounds check since LineReader::readLine excludes
+				// unescaped \s at the end of the line
+				aChar = in[off++];
+				if (aChar == 'u') {
+					// Read the xxxx
+					if (off > end - 4)
+						throw new IllegalArgumentException("Malformed \\uxxxx encoding.");
+					int value = 0;
+					for (int i = 0; i < 4; i++) {
+						aChar = in[off++];
+						switch (aChar) {
+						case '0':
+						case '1':
+						case '2':
+						case '3':
+						case '4':
+						case '5':
+						case '6':
+						case '7':
+						case '8':
+						case '9':
+							value = (value << 4) + aChar - '0';
+							break;
+						case 'a':
+						case 'b':
+						case 'c':
+						case 'd':
+						case 'e':
+						case 'f':
+							value = (value << 4) + 10 + aChar - 'a';
+							break;
+						case 'A':
+						case 'B':
+						case 'C':
+						case 'D':
+						case 'E':
+						case 'F':
+							value = (value << 4) + 10 + aChar - 'A';
+							break;
+						default:
+							throw new IllegalArgumentException("Malformed \\uxxxx encoding.");
+						};
+					}
+					out.append((char) value);
+				} else {
+					if (aChar == 't')
+						aChar = '\t';
+					else if (aChar == 'r')
+						aChar = '\r';
+					else if (aChar == 'n')
+						aChar = '\n';
+					else if (aChar == 'f')
+						aChar = '\f';
+					out.append(aChar);
+				}
+			} else {
+				out.append(aChar);
+			}
+		}
+		return out.toString();
+	}
+
+}
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java
index 6d00bc72..bb1c3c03 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java
@@ -10,7 +10,7 @@ public class EaglercraftVersion {
 	/// Customize these to fit your fork:
 	
 	public static final String projectForkName = "EaglercraftX";
-	public static final String projectForkVersion = "u47";
+	public static final String projectForkVersion = "u48";
 	public static final String projectForkVendor = "lax1dude";
 	
 	public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8";
@@ -20,20 +20,20 @@ public class EaglercraftVersion {
 	public static final String projectOriginName = "EaglercraftX";
 	public static final String projectOriginAuthor = "lax1dude";
 	public static final String projectOriginRevision = "1.8";
-	public static final String projectOriginVersion = "u47";
+	public static final String projectOriginVersion = "u48";
 	
 	public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace
 	
 	// EPK Version Identifier
 	
-	public static final String EPKVersionIdentifier = "u47"; // Set to null to disable EPK version check
+	public static final String EPKVersionIdentifier = "u48"; // Set to null to disable EPK version check
 	
 	// Updating configuration
 	
 	public static final boolean enableUpdateService = true;
 
 	public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client";
-	public static final int updateBundlePackageVersionInt = 47;
+	public static final int updateBundlePackageVersionInt = 48;
 
 	public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName;
 
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/IOUtils.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/IOUtils.java
index 83655734..0e4191fd 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/IOUtils.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/IOUtils.java
@@ -6,6 +6,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -64,7 +65,12 @@ public class IOUtils {
 				while((s = rd.readLine()) != null) {
 					b.append(s).append('\n');
 				}
-				return b.toString();
+				// Handle BOM
+				if(c == StandardCharsets.UTF_8 && b.length() > 0 && b.charAt(0) == 65279) {
+					return b.substring(1, b.length());
+				}else {
+					return b.toString();
+				}
 			}finally {
 				is.close();
 			}
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/ITextureGL.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/ITextureGL.java
index c073a19e..669f9ddb 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/ITextureGL.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/ITextureGL.java
@@ -17,4 +17,10 @@ package net.lax1dude.eaglercraft.v1_8.internal;
  */
 public interface ITextureGL extends IObjectGL {
 
+	void setCacheSize(int w, int h);
+
+	int getWidth();
+
+	int getHeight();
+
 }
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFolderResourcePack.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFolderResourcePack.java
index aecdb25d..a3af8354 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFolderResourcePack.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFolderResourcePack.java
@@ -3,6 +3,7 @@ package net.lax1dude.eaglercraft.v1_8.minecraft;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -19,6 +20,7 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
 import net.lax1dude.eaglercraft.v1_8.ArrayUtils;
+import net.lax1dude.eaglercraft.v1_8.EagRuntime;
 import net.lax1dude.eaglercraft.v1_8.EaglerInputStream;
 import net.lax1dude.eaglercraft.v1_8.crypto.SHA1Digest;
 import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime;
@@ -28,7 +30,7 @@ import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 import net.minecraft.client.resources.AbstractResourcePack;
 
 /**
- * Copyright (c) 2024 lax1dude. All Rights Reserved.
+ * Copyright (c) 2024-2025 lax1dude. All Rights Reserved.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -70,6 +72,80 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
 		this.prefix = prefix;
 		this.domains = domains;
 		this.timestamp = timestamp;
+		this.resourceIndex = new ResourceIndex() {
+
+			@Override
+			protected Collection<String> getPropertiesFiles0() {
+				VFile2 file = new VFile2(prefix, resourcePackFile, "assets/minecraft/optifine/_property_files_index.json");
+				String str = file.getAllChars();
+				Collection<String> propertyFiles = null;
+				if(str != null) {
+					propertyFiles = loadPropertyFileList(str);
+					if(propertyFiles != null) {
+						return propertyFiles;
+					}
+				}
+				VFile2 mcDir = new VFile2(prefix, resourcePackFile, "assets/minecraft");
+				int pfxLen = mcDir.getPath().length() + 1;
+				List<String> philes = mcDir.listFilenames(true);
+				propertyFiles = new ArrayList<>();
+				JSONArray arr = new JSONArray();
+				for(int i = 0, l = philes.size(); i < l; ++i) {
+					String name = philes.get(i);
+					if(name.length() > pfxLen && name.endsWith(".properties")) {
+						name = name.substring(pfxLen);
+						propertyFiles.add(name);
+						arr.put(name);
+					}
+				}
+				JSONObject json = new JSONObject();
+				json.put("propertyFiles", arr);
+				file.setAllChars(json.toString());
+				return propertyFiles;
+			}
+
+			@Override
+			protected Collection<String> getCITPotionsFiles0() {
+				VFile2 file = new VFile2(prefix, resourcePackFile, "assets/minecraft/mcpatcher/cit/potion/_potions_files_index.json");
+				String str = file.getAllChars();
+				Collection<String> propertyFiles = null;
+				if(str != null) {
+					propertyFiles = loadPotionsFileList(str);
+					if(propertyFiles != null) {
+						return propertyFiles;
+					}
+				}
+				VFile2 mcDir = new VFile2(prefix, resourcePackFile, "assets/minecraft/mcpatcher/cit/potion");
+				int pfxLen = mcDir.getPath().length() - 20;
+				List<String> philes = mcDir.listFilenames(true);
+				propertyFiles = new ArrayList<>();
+				JSONArray arr = new JSONArray();
+				for(int i = 0, l = philes.size(); i < l; ++i) {
+					String name = philes.get(i);
+					if(name.length() > pfxLen && name.endsWith(".png")) {
+						name = name.substring(pfxLen);
+						propertyFiles.add(name);
+						arr.put(name);
+					}
+				}
+				mcDir = new VFile2(prefix, resourcePackFile, "assets/minecraft/optifine/cit/potion");
+				pfxLen = mcDir.getPath().length() - 19;
+				philes = mcDir.listFilenames(true);
+				for(int i = 0, l = philes.size(); i < l; ++i) {
+					String name = philes.get(i);
+					if(name.length() > pfxLen && name.endsWith(".png")) {
+						name = name.substring(pfxLen);
+						propertyFiles.add(name);
+						arr.put(name);
+					}
+				}
+				JSONObject json = new JSONObject();
+				json.put("potionsFiles", arr);
+				file.setAllChars(json.toString());
+				return propertyFiles;
+			}
+
+		};
 	}
 
 	@Override
@@ -177,6 +253,8 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
 		}
 		
 		Set<String> domainsList = Sets.newHashSet();
+		JSONArray propertyFiles = new JSONArray();
+		JSONArray potionsFiles = new JSONArray();
 		String fn;
 		for(int i = 0, l = fileNames.size(); i < l; ++i) {
 			fn = fileNames.get(i);
@@ -184,7 +262,18 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
 				fn = fn.substring(prefixLen + 7);
 				int j = fn.indexOf('/');
 				if(j != -1) {
-					domainsList.add(fn.substring(0, j));
+					String dm = fn.substring(0, j);
+					domainsList.add(dm);
+					if("minecraft".equals(dm)) {
+						if(fn.endsWith(".properties")) {
+							propertyFiles.put(fn.substring(10));
+						}else if((fn.startsWith("minecraft/mcpatcher/cit/potion/")
+								|| fn.startsWith("minecraft/mcpatcher/cit/Potion/")) && fn.endsWith(".png")) {
+							potionsFiles.put(fn.substring(10));
+						}else if(fn.startsWith("minecraft/optifine/cit/potion/") && fn.endsWith(".png")) {
+							potionsFiles.put(fn.substring(10));
+						}
+					}
 				}
 			}
 		}
@@ -234,9 +323,19 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
 			}
 			throw ex;
 		}
-		
+
 		logger.info("Updating manifest...");
 		
+		JSONObject json = new JSONObject();
+		json.put("propertyFiles", propertyFiles);
+		(new VFile2(prefix, folderName, "assets/minecraft/optifine/_property_files_index.json"))
+				.setAllChars(json.toString());
+		
+		json = new JSONObject();
+		json.put("potionsFiles", propertyFiles);
+		(new VFile2(prefix, folderName, "assets/minecraft/mcpatcher/cit/potion/_potions_files_index.json"))
+				.setAllChars(json.toString());
+		
 		VFile2 manifestFile = new VFile2(prefix, "manifest.json");
 		String str = manifestFile.getAllChars();
 		JSONArray arr = null;
@@ -363,4 +462,37 @@ public class EaglerFolderResourcePack extends AbstractResourcePack {
 			}
 		}
 	}
+
+	public static Collection<String> loadPropertyFileList(String str) {
+		try {
+			JSONObject json = new JSONObject(str);
+			JSONArray arr = json.getJSONArray("propertyFiles");
+			int l = arr.length();
+			Collection<String> ret = new ArrayList<>(l);
+			for(int i = 0; i < l; ++i) {
+				ret.add(arr.getString(i));
+			}
+			return ret;
+		}catch(JSONException ex) {
+			EagRuntime.debugPrintStackTrace(ex);
+			return null;
+		}
+	}
+
+	public static Collection<String> loadPotionsFileList(String str) {
+		try {
+			JSONObject json = new JSONObject(str);
+			JSONArray arr = json.getJSONArray("potionsFiles");
+			int l = arr.length();
+			Collection<String> ret = new ArrayList<>(l);
+			for(int i = 0; i < l; ++i) {
+				ret.add(arr.getString(i));
+			}
+			return ret;
+		}catch(JSONException ex) {
+			EagRuntime.debugPrintStackTrace(ex);
+			return null;
+		}
+	}
+
 }
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerTextureAtlasSprite.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerTextureAtlasSprite.java
index 9fe6a8c7..7a08b2be 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerTextureAtlasSprite.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerTextureAtlasSprite.java
@@ -8,10 +8,10 @@ import com.carrotsearch.hppc.cursors.IntCursor;
 import com.google.common.collect.Lists;
 
 import net.lax1dude.eaglercraft.v1_8.HString;
-import net.lax1dude.eaglercraft.v1_8.internal.IFramebufferGL;
 import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 import net.lax1dude.eaglercraft.v1_8.opengl.ImageData;
+import net.minecraft.client.Minecraft;
 import net.minecraft.client.renderer.texture.TextureClock;
 import net.minecraft.client.renderer.texture.TextureCompass;
 import net.minecraft.client.renderer.texture.TextureUtil;
@@ -21,9 +21,10 @@ import net.minecraft.crash.CrashReport;
 import net.minecraft.crash.CrashReportCategory;
 import net.minecraft.util.ReportedException;
 import net.minecraft.util.ResourceLocation;
+import net.optifine.util.CounterInt;
 
 /**
- * Copyright (c) 2022 lax1dude. All Rights Reserved.
+ * Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -56,11 +57,14 @@ public class EaglerTextureAtlasSprite {
 	protected float maxV;
 	protected int frameCounter;
 	protected int tickCounter;
+    private int indexInMap = -1;
 	protected static String locationNameClock = "builtin/clock";
 	protected static String locationNameCompass = "builtin/compass";
 
 	protected TextureAnimationCache animationCache = null;
 
+	public String optifineBaseTextureName = null;
+
 	public EaglerTextureAtlasSprite(String spriteName) {
 		this.iconName = spriteName;
 	}
@@ -101,6 +105,9 @@ public class EaglerTextureAtlasSprite {
 		this.maxU = atlasSpirit.maxU;
 		this.minV = atlasSpirit.minV;
 		this.maxV = atlasSpirit.maxV;
+		if (atlasSpirit != Minecraft.getMinecraft().getTextureMapBlocks().getMissingSprite()) {
+			this.indexInMap = atlasSpirit.indexInMap;
+		}
 	}
 
 	public int getOriginX() {
@@ -149,7 +156,13 @@ public class EaglerTextureAtlasSprite {
 		return this.iconName;
 	}
 
-	public void updateAnimation(IFramebufferGL[] copyColorFramebuffer) {
+	protected static interface IAnimCopyFunction {
+		void updateAnimation(int mapWidth, int mapHeight, int mapLevel);
+	}
+
+	protected IAnimCopyFunction currentAnimUpdater = null;
+
+	public void updateAnimation() {
 		if(animationCache == null) {
 			throw new IllegalStateException("Animation cache for '" + this.iconName + "' was never baked!");
 		}
@@ -162,7 +175,12 @@ public class EaglerTextureAtlasSprite {
 			this.tickCounter = 0;
 			int k = this.animationMetadata.getFrameIndex(this.frameCounter);
 			if (i != k && k >= 0 && k < this.framesTextureData.size()) {
-				animationCache.copyFrameLevelsToTex2D(k, this.originX, this.originY, this.width, this.height, copyColorFramebuffer);
+				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+					animationCache.copyFrameToTex2D(k, mapLevel, this.originX >> mapLevel, this.originY >> mapLevel,
+							this.width >> mapLevel, this.height >> mapLevel, mapWidth, mapHeight);
+				};
+			}else {
+				currentAnimUpdater = null;
 			}
 		} else if (this.animationMetadata.isInterpolate()) {
 			float f = 1.0f - (float) this.tickCounter / (float) this.animationMetadata.getFrameTimeSingle(this.frameCounter);
@@ -171,8 +189,22 @@ public class EaglerTextureAtlasSprite {
 					: this.animationMetadata.getFrameCount();
 			int k = this.animationMetadata.getFrameIndex((this.frameCounter + 1) % j);
 			if (i != k && k >= 0 && k < this.framesTextureData.size()) {
-				animationCache.copyInterpolatedFrameLevelsToTex2D(i, k, f, this.originX, this.originY, this.width, this.height, copyColorFramebuffer);
+				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+					animationCache.copyInterpolatedFrameToTex2D(i, k, f, mapLevel, this.originX >> mapLevel,
+							this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+							mapHeight);
+				};
+			}else {
+				currentAnimUpdater = null;
 			}
+		} else {
+			currentAnimUpdater = null;
+		}
+	}
+
+	public void copyAnimationFrame(int mapWidth, int mapHeight, int mapLevel) {
+		if(currentAnimUpdater != null) {
+			currentAnimUpdater.updateAnimation(mapWidth, mapHeight, mapLevel);
 		}
 	}
 
@@ -367,7 +399,7 @@ public class EaglerTextureAtlasSprite {
 		}
 	}
 
-	public void updateAnimationPBR(IFramebufferGL[] copyColorFramebuffer, IFramebufferGL[] copyMaterialFramebuffer, int materialTexOffset) {
+	public void updateAnimationPBR() {
 		Throwable t = new UnsupportedOperationException("PBR is not enabled");
 		try {
 			throw t;
@@ -375,4 +407,37 @@ public class EaglerTextureAtlasSprite {
 			logger.error(t);
 		}
 	}
+
+	public void copyAnimationFramePBR(int pass, int width, int height, int level) {
+		Throwable t = new UnsupportedOperationException("PBR is not enabled");
+		try {
+			throw t;
+		}catch(Throwable tt) {
+			logger.error(t);
+		}
+	}
+
+	public int getIndexInMap() {
+		return this.indexInMap;
+	}
+
+	public void setIndexInMap(int p_setIndexInMap_1_) {
+		this.indexInMap = p_setIndexInMap_1_;
+	}
+
+	public void updateIndexInMap(CounterInt p_updateIndexInMap_1_) {
+		if (this.indexInMap < 0) {
+			this.indexInMap = p_updateIndexInMap_1_.nextValue();
+		}
+	}
+
+	public double getSpriteU16(float p_getSpriteU16_1_) {
+		float f = this.maxU - this.minU;
+		return (double) ((p_getSpriteU16_1_ - this.minU) / f * 16.0F);
+	}
+
+	public double getSpriteV16(float p_getSpriteV16_1_) {
+		float f = this.maxV - this.minV;
+		return (double) ((p_getSpriteV16_1_ - this.minV) / f * 16.0F);
+	}
 }
\ No newline at end of file
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/ResourceIndex.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/ResourceIndex.java
new file mode 100644
index 00000000..c581f30d
--- /dev/null
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/ResourceIndex.java
@@ -0,0 +1,43 @@
+package net.lax1dude.eaglercraft.v1_8.minecraft;
+
+import java.util.Collection;
+
+/**
+ * Copyright (c) 2025 lax1dude. All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+public abstract class ResourceIndex {
+
+	protected Collection<String> propertiesCache = null;
+	protected Collection<String> citPotionsCache = null;
+
+	public Collection<String> getPropertiesFiles() {
+		if(propertiesCache == null) {
+			propertiesCache = getPropertiesFiles0();
+		}
+		return propertiesCache;
+	}
+
+	protected abstract Collection<String> getPropertiesFiles0();
+
+	public Collection<String> getCITPotionsFiles() {
+		if(citPotionsCache == null) {
+			citPotionsCache = getCITPotionsFiles0();
+		}
+		return citPotionsCache;
+	}
+
+	protected abstract Collection<String> getCITPotionsFiles0();
+
+}
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/TextureAnimationCache.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/TextureAnimationCache.java
index b20d3fc0..5caf01bb 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/TextureAnimationCache.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/TextureAnimationCache.java
@@ -1,22 +1,19 @@
 package net.lax1dude.eaglercraft.v1_8.minecraft;
 
-import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*;
 import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;
 
 import java.util.List;
 
 import net.lax1dude.eaglercraft.v1_8.EagRuntime;
-import net.lax1dude.eaglercraft.v1_8.internal.IFramebufferGL;
 import net.lax1dude.eaglercraft.v1_8.internal.buffer.IntBuffer;
 import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
 import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
 import net.lax1dude.eaglercraft.v1_8.opengl.SpriteLevelMixer;
 import net.lax1dude.eaglercraft.v1_8.opengl.TextureCopyUtil;
-import net.lax1dude.eaglercraft.v1_8.vector.Matrix3f;
 import net.minecraft.client.renderer.GLAllocation;
 
 /**
- * Copyright (c) 2022 lax1dude. All Rights Reserved.
+ * Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -40,8 +37,6 @@ public class TextureAnimationCache {
 
 	private int[] cacheTextures = null;
 
-	public static final int _GL_FRAMEBUFFER = 0x8D40;
-
 	public TextureAnimationCache(int width, int height, int mipLevels) {
 		this.width = width;
 		this.height = height;
@@ -105,76 +100,40 @@ public class TextureAnimationCache {
 		}
 	}
 
-	public void copyFrameLevelsToTex2D(int animationFrame, int dx, int dy, int w, int h, IFramebufferGL[] dstFramebuffers) {
-		copyFrameLevelsToTex2D(animationFrame, mipLevels, dx, dy, w, h, dstFramebuffers);
-	}
-
-	/**
-	 * WARNING: call <code>_wglBindFramebuffer(_GL_FRAMEBUFFER, null);</code> when complete
-	 */
-	public void copyFrameLevelsToTex2D(int animationFrame, int levels, int dx, int dy, int w, int h, IFramebufferGL[] dstFramebuffers) {
-		for(int i = 0; i < levels; ++i) {
-			_wglBindFramebuffer(_GL_FRAMEBUFFER, dstFramebuffers[i]);
-			copyFrameToTex2D(animationFrame, i, dx >> i, dy >> i, w >> i, h >> i);
-		}
-	}
-
-	public void copyFrameToTex2D(int animationFrame, int level, int dx, int dy, int w, int h) {
+	public void copyFrameToTex2D(int animationFrame, int level, int dx, int dy, int w, int h, int mapWidth, int mapHeight) {
 		if(cacheTextures == null) {
 			throw new IllegalStateException("Cannot copy from uninitialized TextureAnimationCache");
 		}
 		GlStateManager.disableBlend();
-		GlStateManager.disableAlpha();
 		GlStateManager.bindTexture(cacheTextures[level]);
 		TextureCopyUtil.srcSize(width >> level, (height >> level) * frameCount);
-		TextureCopyUtil.blitTextureUsingViewports(0, h * animationFrame, dx, dy, w, h);
-	}
-
-	public void copyInterpolatedFrameLevelsToTex2D(int animationFrameFrom, int animationFrameTo, float factor, int dx,
-			int dy, int w, int h, IFramebufferGL[] dstFramebuffers) {
-		copyInterpolatedFrameLevelsToTex2D(animationFrameFrom, animationFrameTo, factor, mipLevels, dx, dy, w, h, dstFramebuffers);
-	}
-
-	/**
-	 * WARNING: call <code>_wglBindFramebuffer(_GL_FRAMEBUFFER, null);</code> when complete
-	 */
-	public void copyInterpolatedFrameLevelsToTex2D(int animationFrameFrom, int animationFrameTo, float factor,
-			int levels, int dx, int dy, int w, int h, IFramebufferGL[] dstFramebuffers) {
-		for(int i = 0; i < levels; ++i) {
-			_wglBindFramebuffer(_GL_FRAMEBUFFER, dstFramebuffers[i]);
-			copyInterpolatedFrameToTex2D(animationFrameFrom, animationFrameTo, factor, i, dx >> i, dy >> i, w >> i, h >> i);
-		}
+		TextureCopyUtil.dstSize(mapWidth, mapHeight);
+		TextureCopyUtil.blitTexture(0, h * animationFrame, dx, dy, w, h);
 	}
 
 	public void copyInterpolatedFrameToTex2D(int animationFrameFrom, int animationFrameTo, float factor, int level,
-			int dx, int dy, int w, int h) {
+			int dx, int dy, int w, int h, int mapWidth, int mapHeight) {
 		if(cacheTextures == null) {
 			throw new IllegalStateException("Cannot copy from uninitialized TextureAnimationCache");
 		}
 		
-		GlStateManager.viewport(dx, dy, w, h);
 		GlStateManager.bindTexture(cacheTextures[level]);
 		GlStateManager.disableBlend();
 		
-		Matrix3f matrix = new Matrix3f();
-		matrix.m11 = 1.0f / frameCount;
-		matrix.m21 = matrix.m11 * animationFrameFrom;
-		
-		SpriteLevelMixer.setMatrix3f(matrix);
+		SpriteLevelMixer.srcSize(width >> level, (height >> level) * frameCount);
+		SpriteLevelMixer.dstSize(mapWidth, mapHeight);
 		SpriteLevelMixer.setBlendColor(factor, factor, factor, factor);
 		SpriteLevelMixer.setBiasColor(0.0f, 0.0f, 0.0f, 0.0f);
 		
-		SpriteLevelMixer.drawSprite(0);
+		SpriteLevelMixer.drawSprite(0, 0, h * animationFrameFrom, w, h, dx, dy, w, h);
 		
-		matrix.m21 = matrix.m11 * animationFrameTo;
-		SpriteLevelMixer.setMatrix3f(matrix);
 		float fac1 = 1.0f - factor;
 		SpriteLevelMixer.setBlendColor(fac1, fac1, fac1, fac1);
 		
 		GlStateManager.enableBlend();
 		GlStateManager.blendFunc(GL_ONE, GL_ONE);
 		
-		SpriteLevelMixer.drawSprite(0);
+		SpriteLevelMixer.drawSprite(0, 0, h * animationFrameTo, w, h, dx, dy, w, h);
 		
 		GlStateManager.disableBlend();
 		GlStateManager.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/EaglercraftGPU.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/EaglercraftGPU.java
index 41866dae..a32b3b37 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/EaglercraftGPU.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/EaglercraftGPU.java
@@ -246,6 +246,7 @@ public class EaglercraftGPU {
 
 	public static final void glTexImage2D(int target, int level, int internalFormat, int w, int h, int unused,
 			int format, int type, ByteBuffer pixels) {
+		GlStateManager.setTextureCachedSize(target, w, h);
 		if(glesVers >= 300) {
 			_wglTexImage2D(target, level, internalFormat, w, h, unused, format, type, pixels);
 		}else {
@@ -256,6 +257,7 @@ public class EaglercraftGPU {
 
 	public static final void glTexImage2D(int target, int level, int internalFormat, int w, int h, int unused,
 			int format, int type, IntBuffer pixels) {
+		GlStateManager.setTextureCachedSize(target, w, h);
 		if(glesVers >= 300) {
 			_wglTexImage2D(target, level, internalFormat, w, h, unused, format, type, pixels);
 		}else {
@@ -270,6 +272,7 @@ public class EaglercraftGPU {
 	}
 
 	public static final void glTexStorage2D(int target, int levels, int internalFormat, int w, int h) {
+		GlStateManager.setTextureCachedSize(target, w, h);
 		if(texStorageCapable && (glesVers >= 300 || levels == 1 || (MathHelper.calculateLogBaseTwo(Math.max(w, h)) + 1) == levels)) {
 			_wglTexStorage2D(target, levels, internalFormat, w, h);
 		}else {
@@ -914,7 +917,6 @@ public class EaglercraftGPU {
 		PlatformOpenGL.enterVAOEmulationHook();
 		GLSLHeader.init();
 		DrawUtils.init();
-		SpriteLevelMixer.initialize();
 		if(instancingCapable) {
 			InstancedFontRenderer.initialize();
 			InstancedParticleRenderer.initialize();
@@ -928,7 +930,6 @@ public class EaglercraftGPU {
 	public static final void destroyCache() {
 		GLSLHeader.destroy();
 		DrawUtils.destroy();
-		SpriteLevelMixer.destroy();
 		InstancedFontRenderer.destroy();
 		InstancedParticleRenderer.destroy();
 		EffectPipelineFXAA.destroy();
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java
index 537dfb50..1041c98b 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java
@@ -1,11 +1,13 @@
 package net.lax1dude.eaglercraft.v1_8.opengl;
 
+import net.lax1dude.eaglercraft.v1_8.internal.ITextureGL;
 import net.lax1dude.eaglercraft.v1_8.internal.buffer.FloatBuffer;
 import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 import net.lax1dude.eaglercraft.v1_8.vector.Matrix4f;
 import net.lax1dude.eaglercraft.v1_8.vector.Vector3f;
 import net.lax1dude.eaglercraft.v1_8.vector.Vector4f;
+import net.minecraft.util.MathHelper;
 
 import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;
 import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*;
@@ -159,8 +161,8 @@ public class GlStateManager {
 	
 	static final Matrix4f[][] textureMatrixStack = new Matrix4f[8][8];
 	static final int[][] textureMatrixStackAccessSerial = new int[8][8];
-	static int[] textureMatrixAccessSerial = new int[8];
-	static int[] textureMatrixStackPointer = new int[8];
+	static final int[] textureMatrixAccessSerial = new int[8];
+	static final int[] textureMatrixStackPointer = new int[8];
 	
 	static boolean stateUseExtensionPipeline = false;
 	
@@ -821,6 +823,32 @@ public class GlStateManager {
 		}
 	}
 
+	private static Matrix4f getMatrixIncr() {
+		Matrix4f mat;
+		int _i, _j;
+		switch(stateMatrixMode) {
+		case GL_MODELVIEW:
+			_j = modelMatrixStackPointer;
+			mat = modelMatrixStack[_j];
+			modelMatrixStackAccessSerial[_j] = ++modelMatrixAccessSerial;
+			break;
+		case GL_PROJECTION:
+			_j = projectionMatrixStackPointer;
+			mat = projectionMatrixStack[_j];
+			projectionMatrixStackAccessSerial[_j] = ++projectionMatrixAccessSerial;
+			break;
+		case GL_TEXTURE:
+			_i = activeTexture;
+			_j = textureMatrixStackPointer[_i];
+			mat = textureMatrixStack[_i][_j];
+			textureMatrixStackAccessSerial[_i][_j] = ++textureCoordsAccessSerial[_i];
+			break;
+		default:
+			throw new IllegalStateException();
+		}
+		return mat;
+	}
+
 	public static final void getFloat(int pname, float[] params) {
 		switch(pname) {
 		case GL_MODELVIEW_MATRIX:
@@ -854,24 +882,7 @@ public class GlStateManager {
 	}
 
 	public static final void ortho(double left, double right, double bottom, double top, double zNear, double zFar) {
-		Matrix4f matrix;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-			matrix = modelMatrixStack[modelMatrixStackPointer];
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-		default:
-			matrix = projectionMatrixStack[projectionMatrixStackPointer];
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			matrix = textureMatrixStack[activeTexture][ptr];
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
+		Matrix4f matrix = getMatrixIncr();
 		paramMatrix.m00 = 2.0f / (float)(right - left);
 		paramMatrix.m01 = 0.0f;
 		paramMatrix.m02 = 0.0f;
@@ -894,169 +905,200 @@ public class GlStateManager {
 	private static final Vector3f paramVector = new Vector3f();
 	private static final float toRad = 0.0174532925f;
 	public static final void rotate(float angle, float x, float y, float z) {
-		paramVector.x = x;
-		paramVector.y = y;
-		paramVector.z = z;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-		default:
-			modelMatrixStack[modelMatrixStackPointer].rotate(angle * toRad, paramVector);
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-			projectionMatrixStack[projectionMatrixStackPointer].rotate(angle * toRad, paramVector);
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			textureMatrixStack[activeTexture][ptr].rotate(angle * toRad, paramVector);
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
+		Matrix4f matrix = getMatrixIncr();
+		if(x == 0.0f) {
+			if(y == 0.0f) {
+				if(z == 1.0f || z == -1.0f) {
+					_glRotatefZ(matrix, toRad * angle * z);
+					return;
+				}
+			}else if((y == 1.0f || y == -1.0f) && z == 0.0f) {
+				_glRotatefY(matrix, toRad * angle * y);
+				return;
+			}
+		}else if((x == 1.0f || x == -1.0f) && y == 0.0f && z == 0.0f) {
+			_glRotatefX(matrix, toRad * angle * x);
+			return;
 		}
+		_glRotatef(matrix, toRad * angle, x, y, z);
+	}
+
+	public static final void rotateXYZ(float x, float y, float z) {
+		Matrix4f matrix = getMatrixIncr();
+		if(x != 0.0f) _glRotatefX(matrix, toRad * x);
+		if(y != 0.0f) _glRotatefY(matrix, toRad * y);
+		if(z != 0.0f) _glRotatefZ(matrix, toRad * z);
+	}
+
+	public static final void rotateZYX(float x, float y, float z) {
+		Matrix4f matrix = getMatrixIncr();
+		if(z != 0.0f) _glRotatefZ(matrix, toRad * z);
+		if(y != 0.0f) _glRotatefY(matrix, toRad * y);
+		if(x != 0.0f) _glRotatefX(matrix, toRad * x);
+	}
+
+	public static final void rotateXYZRad(float x, float y, float z) {
+		Matrix4f matrix = getMatrixIncr();
+		if(x != 0.0f) _glRotatefX(matrix, x);
+		if(y != 0.0f) _glRotatefY(matrix, y);
+		if(z != 0.0f) _glRotatefZ(matrix, z);
+	}
+
+	public static final void rotateZYXRad(float x, float y, float z) {
+		Matrix4f matrix = getMatrixIncr();
+		if(z != 0.0f) _glRotatefZ(matrix, z);
+		if(y != 0.0f) _glRotatefY(matrix, y);
+		if(x != 0.0f) _glRotatefX(matrix, x);
+	}
+
+	private static void _glRotatefX(Matrix4f mat, float angle) {
+		float sin = MathHelper.sin(angle);
+		float cos = MathHelper.cos(angle);
+		float lm10 = mat.m10, lm11 = mat.m11, lm12 = mat.m12, lm13 = mat.m13, lm20 = mat.m20, lm21 = mat.m21,
+				lm22 = mat.m22, lm23 = mat.m23;
+		mat.m20 = lm10 * -sin + lm20 * cos;
+		mat.m21 = lm11 * -sin + lm21 * cos;
+		mat.m22 = lm12 * -sin + lm22 * cos;
+		mat.m23 = lm13 * -sin + lm23 * cos;
+		mat.m10 = lm10 * cos + lm20 * sin;
+		mat.m11 = lm11 * cos + lm21 * sin;
+		mat.m12 = lm12 * cos + lm22 * sin;
+		mat.m13 = lm13 * cos + lm23 * sin;
+	}
+
+	private static void _glRotatefY(Matrix4f mat, float angle) {
+		float sin = MathHelper.sin(angle);
+		float cos = MathHelper.cos(angle);
+		float nm00 = mat.m00 * cos + mat.m20 * -sin;
+		float nm01 = mat.m01 * cos + mat.m21 * -sin;
+		float nm02 = mat.m02 * cos + mat.m22 * -sin;
+		float nm03 = mat.m03 * cos + mat.m23 * -sin;
+		mat.m20 = mat.m00 * sin + mat.m20 * cos;
+		mat.m21 = mat.m01 * sin + mat.m21 * cos;
+		mat.m22 = mat.m02 * sin + mat.m22 * cos;
+		mat.m23 = mat.m03 * sin + mat.m23 * cos;
+		mat.m00 = nm00;
+		mat.m01 = nm01;
+		mat.m02 = nm02;
+		mat.m03 = nm03;
+	}
+
+	private static void _glRotatefZ(Matrix4f mat, float angle) {
+		float dirX = MathHelper.sin(angle);
+		float dirY = MathHelper.cos(angle);
+		float nm00 = mat.m00 * dirY + mat.m10 * dirX;
+		float nm01 = mat.m01 * dirY + mat.m11 * dirX;
+		float nm02 = mat.m02 * dirY + mat.m12 * dirX;
+		float nm03 = mat.m03 * dirY + mat.m13 * dirX;
+		mat.m10 = mat.m00 * -dirX + mat.m10 * dirY;
+		mat.m11 = mat.m01 * -dirX + mat.m11 * dirY;
+		mat.m12 = mat.m02 * -dirX + mat.m12 * dirY;
+		mat.m13 = mat.m03 * -dirX + mat.m13 * dirY;
+		mat.m00 = nm00;
+		mat.m01 = nm01;
+		mat.m02 = nm02;
+		mat.m03 = nm03;
+	}
+
+	private static void _glRotatef(Matrix4f mat, float angle, float x, float y, float z) {
+		float s = MathHelper.sin(angle);
+		float c = MathHelper.cos(angle);
+		float C = 1.0f - c;
+		float xx = x * x, xy = x * y, xz = x * z;
+		float yy = y * y, yz = y * z;
+		float zz = z * z;
+		float rm00 = xx * C + c;
+		float rm01 = xy * C + z * s;
+		float rm02 = xz * C - y * s;
+		float rm10 = xy * C - z * s;
+		float rm11 = yy * C + c;
+		float rm12 = yz * C + x * s;
+		float rm20 = xz * C + y * s;
+		float rm21 = yz * C - x * s;
+		float rm22 = zz * C + c;
+		float nm00 = mat.m00 * rm00 + mat.m10 * rm01 + mat.m20 * rm02;
+		float nm01 = mat.m01 * rm00 + mat.m11 * rm01 + mat.m21 * rm02;
+		float nm02 = mat.m02 * rm00 + mat.m12 * rm01 + mat.m22 * rm02;
+		float nm03 = mat.m03 * rm00 + mat.m13 * rm01 + mat.m23 * rm02;
+		float nm10 = mat.m00 * rm10 + mat.m10 * rm11 + mat.m20 * rm12;
+		float nm11 = mat.m01 * rm10 + mat.m11 * rm11 + mat.m21 * rm12;
+		float nm12 = mat.m02 * rm10 + mat.m12 * rm11 + mat.m22 * rm12;
+		float nm13 = mat.m03 * rm10 + mat.m13 * rm11 + mat.m23 * rm12;
+		mat.m20 = mat.m00 * rm20 + mat.m10 * rm21 + mat.m20 * rm22;
+		mat.m21 = mat.m01 * rm20 + mat.m11 * rm21 + mat.m21 * rm22;
+		mat.m22 = mat.m02 * rm20 + mat.m12 * rm21 + mat.m22 * rm22;
+		mat.m23 = mat.m03 * rm20 + mat.m13 * rm21 + mat.m23 * rm22;
+		mat.m00 = nm00;
+		mat.m01 = nm01;
+		mat.m02 = nm02;
+		mat.m03 = nm03;
+		mat.m10 = nm10;
+		mat.m11 = nm11;
+		mat.m12 = nm12;
+		mat.m13 = nm13;
 	}
 
 	public static final void scale(float x, float y, float z) {
-		paramVector.x = x;
-		paramVector.y = y;
-		paramVector.z = z;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-		default:
-			modelMatrixStack[modelMatrixStackPointer].scale(paramVector);
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-			projectionMatrixStack[projectionMatrixStackPointer].scale(paramVector);
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			textureMatrixStack[activeTexture][ptr].scale(paramVector);
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
+		Matrix4f matrix = getMatrixIncr();
+		matrix.m00 *= x;
+		matrix.m01 *= x;
+		matrix.m02 *= x;
+		matrix.m03 *= x;
+		matrix.m10 *= y;
+		matrix.m11 *= y;
+		matrix.m12 *= y;
+		matrix.m13 *= y;
+		matrix.m20 *= z;
+		matrix.m21 *= z;
+		matrix.m22 *= z;
+		matrix.m23 *= z;
 	}
 
 	public static final void scale(double x, double y, double z) {
-		paramVector.x = (float)x;
-		paramVector.y = (float)y;
-		paramVector.z = (float)z;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-		default:
-			modelMatrixStack[modelMatrixStackPointer].scale(paramVector);
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-			projectionMatrixStack[projectionMatrixStackPointer].scale(paramVector);
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			textureMatrixStack[activeTexture][ptr].scale(paramVector);
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
+		Matrix4f matrix = getMatrixIncr();
+		matrix.m00 *= x;
+		matrix.m01 *= x;
+		matrix.m02 *= x;
+		matrix.m03 *= x;
+		matrix.m10 *= y;
+		matrix.m11 *= y;
+		matrix.m12 *= y;
+		matrix.m13 *= y;
+		matrix.m20 *= z;
+		matrix.m21 *= z;
+		matrix.m22 *= z;
+		matrix.m23 *= z;
 	}
 
 	public static final void translate(float x, float y, float z) {
-		paramVector.x = x;
-		paramVector.y = y;
-		paramVector.z = z;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-		default:
-			modelMatrixStack[modelMatrixStackPointer].translate(paramVector);
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-			projectionMatrixStack[projectionMatrixStackPointer].translate(paramVector);
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			textureMatrixStack[activeTexture][ptr].translate(paramVector);
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
+		Matrix4f matrix = getMatrixIncr();
+		matrix.m30 = matrix.m00 * x + matrix.m10 * y + matrix.m20 * z + matrix.m30;
+		matrix.m31 = matrix.m01 * x + matrix.m11 * y + matrix.m21 * z + matrix.m31;
+		matrix.m32 = matrix.m02 * x + matrix.m12 * y + matrix.m22 * z + matrix.m32;
+		matrix.m33 = matrix.m03 * x + matrix.m13 * y + matrix.m23 * z + matrix.m33;
 	}
 
 	public static final void translate(double x, double y, double z) {
-		paramVector.x = (float)x;
-		paramVector.y = (float)y;
-		paramVector.z = (float)z;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-		default:
-			modelMatrixStack[modelMatrixStackPointer].translate(paramVector);
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-			projectionMatrixStack[projectionMatrixStackPointer].translate(paramVector);
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			textureMatrixStack[activeTexture][ptr].translate(paramVector);
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
+		float _x = (float)x;
+		float _y = (float)y;
+		float _z = (float)z;
+		Matrix4f matrix = getMatrixIncr();
+		matrix.m30 = matrix.m00 * _x + matrix.m10 * _y + matrix.m20 * _z + matrix.m30;
+		matrix.m31 = matrix.m01 * _x + matrix.m11 * _y + matrix.m21 * _z + matrix.m31;
+		matrix.m32 = matrix.m02 * _x + matrix.m12 * _y + matrix.m22 * _z + matrix.m32;
+		matrix.m33 = matrix.m03 * _x + matrix.m13 * _y + matrix.m23 * _z + matrix.m33;
 	}
 
 	private static final Matrix4f paramMatrix = new Matrix4f();
 	public static final void multMatrix(float[] matrix) {
-		Matrix4f modeMatrix;
-		
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-		default:
-			modeMatrix = modelMatrixStack[modelMatrixStackPointer];
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-			modeMatrix = projectionMatrixStack[projectionMatrixStackPointer];
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			modeMatrix = textureMatrixStack[activeTexture][ptr];
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
-		
 		paramMatrix.load(matrix);
-		
-		Matrix4f.mul(modeMatrix, paramMatrix, modeMatrix);
+		Matrix4f mat = getMatrixIncr();
+		Matrix4f.mul(mat, paramMatrix, mat);
 	}
 
 	public static final void multMatrix(Matrix4f matrix) {
-		Matrix4f modeMatrix;
-		
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-		default:
-			modeMatrix = modelMatrixStack[modelMatrixStackPointer];
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-			modeMatrix = projectionMatrixStack[projectionMatrixStackPointer];
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			modeMatrix = textureMatrixStack[activeTexture][ptr];
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
-		
-		Matrix4f.mul(modeMatrix, matrix, modeMatrix);
+		Matrix4f mat = getMatrixIncr();
+		Matrix4f.mul(mat, matrix, mat);
 	}
 
 	public static final void color(float colorRed, float colorGreen, float colorBlue, float colorAlpha) {
@@ -1088,24 +1130,7 @@ public class GlStateManager {
 	}
 
 	public static final void gluPerspective(float fovy, float aspect, float zNear, float zFar) {
-		Matrix4f matrix;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-			matrix = modelMatrixStack[modelMatrixStackPointer];
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-		default:
-			matrix = projectionMatrixStack[projectionMatrixStackPointer];
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			matrix = textureMatrixStack[activeTexture][ptr];
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
+		Matrix4f matrix = getMatrixIncr();
 		float cotangent = (float) Math.cos(fovy * toRad * 0.5f) / (float) Math.sin(fovy * toRad * 0.5f);
 		paramMatrix.m00 = cotangent / aspect;
 		paramMatrix.m01 = 0.0f;
@@ -1127,24 +1152,7 @@ public class GlStateManager {
 	}
 
 	public static final void gluLookAt(Vector3f eye, Vector3f center, Vector3f up) {
-		Matrix4f matrix;
-		switch(stateMatrixMode) {
-		case GL_MODELVIEW:
-			matrix = modelMatrixStack[modelMatrixStackPointer];
-			modelMatrixStackAccessSerial[modelMatrixStackPointer] = ++modelMatrixAccessSerial;
-			break;
-		case GL_PROJECTION:
-		default:
-			matrix = projectionMatrixStack[projectionMatrixStackPointer];
-			projectionMatrixStackAccessSerial[projectionMatrixStackPointer] = ++projectionMatrixAccessSerial;
-			break;
-		case GL_TEXTURE:
-			int ptr = textureMatrixStackPointer[activeTexture];
-			matrix = textureMatrixStack[activeTexture][ptr];
-			textureMatrixStackAccessSerial[activeTexture][textureMatrixStackPointer[activeTexture]] =
-					++textureMatrixAccessSerial[activeTexture];
-			break;
-		}
+		Matrix4f matrix = getMatrixIncr();
 		float x = center.x - eye.x;
 		float y = center.y - eye.y;
 		float z = center.z - eye.z;
@@ -1262,4 +1270,18 @@ public class GlStateManager {
 	public static void recompileShaders() {
 		FixedFunctionPipeline.flushCache();
 	}
+
+	public static int getBoundTexture() {
+		return boundTexture[activeTexture];
+	}
+
+	static void setTextureCachedSize(int target, int w, int h) {
+		if(target == GL_TEXTURE_2D) {
+			ITextureGL tex = EaglercraftGPU.getNativeTexture(boundTexture[activeTexture]);
+			if(tex != null) {
+				tex.setCacheSize(w, h);
+			}
+		}
+	}
+
 }
\ No newline at end of file
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/SpriteLevelMixer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/SpriteLevelMixer.java
index e01dbd39..3d454556 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/SpriteLevelMixer.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/SpriteLevelMixer.java
@@ -1,6 +1,9 @@
 package net.lax1dude.eaglercraft.v1_8.opengl;
 
 import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*;
+
+import java.util.List;
+
 import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*;
 
 import net.lax1dude.eaglercraft.v1_8.EagRuntime;
@@ -10,10 +13,11 @@ import net.lax1dude.eaglercraft.v1_8.internal.IUniformGL;
 import net.lax1dude.eaglercraft.v1_8.internal.buffer.FloatBuffer;
 import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
+import net.lax1dude.eaglercraft.v1_8.opengl.VSHInputLayoutParser.ShaderInput;
 import net.lax1dude.eaglercraft.v1_8.vector.Matrix3f;
 
 /**
- * Copyright (c) 2022-2023 lax1dude. All Rights Reserved.
+ * Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -39,7 +43,8 @@ public class SpriteLevelMixer {
 	private static IUniformGL u_textureLod1f = null;
 	private static IUniformGL u_blendFactor4f = null;
 	private static IUniformGL u_blendBias4f = null;
-	private static IUniformGL u_matrixTransform = null;
+	private static IUniformGL u_srcCoords4f = null;
+	private static IUniformGL u_dstCoords4f = null;
 
 	private static FloatBuffer matrixCopyBuffer = null;
 
@@ -55,12 +60,15 @@ public class SpriteLevelMixer {
 	private static float biasColorB = 0.0f;
 	private static float biasColorA = 0.0f;
 
-	private static boolean matrixChanged = true;
-	private static final Matrix3f transformMatrix = new Matrix3f();
+	private static float srcViewW = 100.0f;
+	private static float srcViewH = 100.0f;
+
+	private static float dstViewW = 50.0f;
+	private static float dstViewH = 50.0f;
 
 	private static final Matrix3f identityMatrix = new Matrix3f();
 
-	static void initialize() {
+	static void initialize(IShaderGL vertexShader, List<ShaderInput> vshSourceLayout) {
 		String fragmentSource = EagRuntime.getRequiredResourceString(fragmentShaderPath);
 
 		IShaderGL frag = _wglCreateShader(GL_FRAGMENT_SHADER);
@@ -82,16 +90,16 @@ public class SpriteLevelMixer {
 
 		shaderProgram = _wglCreateProgram();
 
-		_wglAttachShader(shaderProgram, DrawUtils.vshLocal);
+		_wglAttachShader(shaderProgram, vertexShader);
 		_wglAttachShader(shaderProgram, frag);
 
 		if(EaglercraftGPU.checkOpenGLESVersion() == 200) {
-			VSHInputLayoutParser.applyLayout(shaderProgram, DrawUtils.vshLocalLayout);
+			VSHInputLayoutParser.applyLayout(shaderProgram, vshSourceLayout);
 		}
 
 		_wglLinkProgram(shaderProgram);
 
-		_wglDetachShader(shaderProgram, DrawUtils.vshLocal);
+		_wglDetachShader(shaderProgram, vertexShader);
 		_wglDetachShader(shaderProgram, frag);
 
 		_wglDeleteShader(frag);
@@ -115,7 +123,8 @@ public class SpriteLevelMixer {
 		u_textureLod1f = _wglGetUniformLocation(shaderProgram, "u_textureLod1f");
 		u_blendFactor4f = _wglGetUniformLocation(shaderProgram, "u_blendFactor4f");
 		u_blendBias4f = _wglGetUniformLocation(shaderProgram, "u_blendBias4f");
-		u_matrixTransform = _wglGetUniformLocation(shaderProgram, "u_matrixTransform");
+		u_srcCoords4f = _wglGetUniformLocation(shaderProgram, "u_srcCoords4f");
+		u_dstCoords4f = _wglGetUniformLocation(shaderProgram, "u_dstCoords4f");
 
 		_wglUniform1i(_wglGetUniformLocation(shaderProgram, "u_inputTexture"), 0);
 
@@ -141,25 +150,31 @@ public class SpriteLevelMixer {
 		}
 	}
 
-	public static void setIdentityMatrix() {
-		setMatrix3f(identityMatrix);
+	public static void srcSize(int w, int h) {
+		srcViewW = w;
+		srcViewH = h;
 	}
 
-	public static void setMatrix3f(Matrix3f matrix) {
-		if(!matrix.equals(transformMatrix)) {
-			matrixChanged = true;
-			transformMatrix.load(matrix);
-		}
+	public static void dstSize(int w, int h) {
+		dstViewW = w * 0.5f;
+		dstViewH = h * 0.5f;
 	}
 
-	public static void drawSprite(float level) {
+	public static void srcDstSize(int w, int h) {
+		srcViewW = w;
+		srcViewH = h;
+		dstViewW = w * 0.5f;
+		dstViewH = h * 0.5f;
+	}
+
+	public static void drawSprite(int lvl, int srcX, int srcY, int srcW, int srcH, int dstX, int dstY, int dstW, int dstH) {
 		EaglercraftGPU.bindGLShaderProgram(shaderProgram);
 		
 		if(EaglercraftGPU.checkTextureLODCapable()) {
-			_wglUniform1f(u_textureLod1f, level);
+			_wglUniform1f(u_textureLod1f, lvl);
 		}else {
-			if(level != 0.0f) {
-				LOGGER.error("Tried to copy from mipmap level {}, but this GPU does not support textureLod!", level);
+			if(lvl != 0) {
+				LOGGER.error("Tried to copy from mipmap level {}, but this GPU does not support textureLod!", lvl);
 			}
 			_wglUniform1f(u_textureLod1f, 0.0f);
 		}
@@ -174,13 +189,9 @@ public class SpriteLevelMixer {
 			biasColorChanged = false;
 		}
 		
-		if(matrixChanged) {
-			matrixCopyBuffer.clear();
-			transformMatrix.store(matrixCopyBuffer);
-			matrixCopyBuffer.flip();
-			_wglUniformMatrix3fv(u_matrixTransform, false, matrixCopyBuffer);
-			matrixChanged = false;
-		}
+		_wglUniform4f(u_srcCoords4f, (float)srcX / srcViewW, (float)srcY / srcViewH, (float)srcW / srcViewW, (float)srcH / srcViewH);
+		_wglUniform4f(u_dstCoords4f, (float) dstX / dstViewW - 1.0f, (float) dstY / dstViewH - 1.0f,
+				(float) dstW / dstViewW, (float) dstH / dstViewH);
 		
 		DrawUtils.drawStandardQuad2D();
 	}
@@ -197,7 +208,8 @@ public class SpriteLevelMixer {
 		u_textureLod1f = null;
 		u_blendFactor4f = null;
 		u_blendBias4f = null;
-		u_matrixTransform = null;
+		u_srcCoords4f = null;
+		u_dstCoords4f = null;
 	}
 
 }
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/TextureCopyUtil.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/TextureCopyUtil.java
index b5f6f9f4..1416e5dd 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/TextureCopyUtil.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/TextureCopyUtil.java
@@ -113,6 +113,8 @@ public class TextureCopyUtil {
 		if(EaglercraftGPU.checkOpenGLESVersion() == 200) {
 			vshSourceLayout = VSHInputLayoutParser.getShaderInputs(vshSource);
 		}
+
+		SpriteLevelMixer.initialize(vshShader, vshSourceLayout);
 	}
 
 	private static TextureCopyShader compileShader(boolean align, boolean depth) {
@@ -283,18 +285,22 @@ public class TextureCopyUtil {
 		DrawUtils.drawStandardQuad2D();
 	}
 
+	@Deprecated
 	public static void blitTextureUsingViewports(int srcX, int srcY, int dstX, int dstY, int w, int h) {
 		blitTextureUsingViewports(0, srcX, srcY, w, h, dstX, dstY, w, h);
 	}
 
+	@Deprecated
 	public static void blitTextureUsingViewports(int lvl, int srcX, int srcY, int dstX, int dstY, int w, int h) {
 		blitTextureUsingViewports(lvl, srcX, srcY, w, h, dstX, dstY, w, h);
 	}
 
+	@Deprecated
 	public static void blitTextureUsingViewports(int srcX, int srcY, int srcW, int srcH, int dstX, int dstY, int dstW, int dstH) {
 		blitTextureUsingViewports(0, srcX, srcY, srcW, srcH, dstX, dstY, dstW, dstH);
 	}
 
+	@Deprecated
 	public static void blitTextureUsingViewports(int lvl, int srcX, int srcY, int srcW, int srcH, int dstX, int dstY, int dstW, int dstH) {
 		TextureCopyShader shaderObj = getShaderObj(isAligned, false);
 		EaglercraftGPU.bindGLShaderProgram(shaderObj.shaderProgram);
@@ -376,18 +382,22 @@ public class TextureCopyUtil {
 		DrawUtils.drawStandardQuad2D();
 	}
 
+	@Deprecated
 	public static void blitTextureDepthUsingViewports(int srcX, int srcY, int dstX, int dstY, int w, int h) {
 		blitTextureDepthUsingViewports(0, srcX, srcY, w, h, dstX, dstY, w, h);
 	}
 
+	@Deprecated
 	public static void blitTextureDepthUsingViewports(int lvl, int srcX, int srcY, int dstX, int dstY, int w, int h) {
 		blitTextureDepthUsingViewports(lvl, srcX, srcY, w, h, dstX, dstY, w, h);
 	}
 
+	@Deprecated
 	public static void blitTextureDepthUsingViewports(int srcX, int srcY, int srcW, int srcH, int dstX, int dstY, int dstW, int dstH) {
 		blitTextureDepthUsingViewports(0, srcX, srcY, srcW, srcH, dstX, dstY, dstW, dstH);
 	}
 
+	@Deprecated
 	public static void blitTextureDepthUsingViewports(int lvl, int srcX, int srcY, int srcW, int srcH, int dstX, int dstY, int dstW, int dstH) {
 		TextureCopyShader shaderObj = getShaderObj(isAligned, true);
 		EaglercraftGPU.bindGLShaderProgram(shaderObj.shaderProgram);
@@ -431,5 +441,6 @@ public class TextureCopyUtil {
 			textureBlitDepthAligned.destroy();
 			textureBlitDepthAligned = null;
 		}
+		SpriteLevelMixer.destroy();
 	}
 }
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java
index c5397b4c..42372b3d 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java
@@ -12,8 +12,12 @@ import net.lax1dude.eaglercraft.v1_8.EagRuntime;
 import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 import net.lax1dude.eaglercraft.v1_8.vector.Vector3f;
+import net.minecraft.block.state.IBlockState;
 import net.minecraft.client.renderer.GLAllocation;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumWorldBlockLayer;
 import net.minecraft.util.MathHelper;
+import net.optifine.render.RenderEnv;
 
 /**
  * Copyright (c) 2022-2023 lax1dude, ayunami2000. All Rights Reserved.
@@ -50,6 +54,9 @@ public class WorldRenderer {
 	
 	private boolean hasBeenFreed = false;
 
+	private EnumWorldBlockLayer blockLayer = null;
+	public RenderEnv renderEnv = null;
+
 	public WorldRenderer(int bufferSizeIn) {
 		this.byteBuffer = GLAllocation.createDirectByteBuffer(bufferSizeIn << 2);
 		this.intBuffer = this.byteBuffer.asIntBuffer();
@@ -555,6 +562,20 @@ public class WorldRenderer {
 
 	}
 
+	public RenderEnv getRenderEnv(IBlockState p_getRenderEnv_1_, BlockPos p_getRenderEnv_2_) {
+		if (this.renderEnv == null) {
+			this.renderEnv = new RenderEnv(p_getRenderEnv_1_, p_getRenderEnv_2_);
+			return this.renderEnv;
+		} else {
+			this.renderEnv.reset(p_getRenderEnv_1_, p_getRenderEnv_2_);
+			return this.renderEnv;
+		}
+	}
+
+	public EnumWorldBlockLayer getBlockLayer() {
+		return this.blockLayer;
+	}
+
 	public class State {
 		private final IntBuffer stateRawBuffer;
 		private final VertexFormat stateVertexFormat;
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java
index d5ebccf1..8886ed8a 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java
@@ -2440,6 +2440,15 @@ public class EaglerDeferredPipeline {
 		GlStateManager.setActiveTexture(GL_TEXTURE10);
 		GlStateManager.bindTexture(skyIrradianceTexture);
 		GlStateManager.setActiveTexture(GL_TEXTURE0);
+		GlStateManager.disableDepth();
+		GlStateManager.disableBlend();
+		GlStateManager.depthMask(false);
+		GlStateManager.bindTexture(envMapSkyTexture);
+		GlStateManager.viewport(0, 0, 128, 256);
+		TextureCopyUtil.blitTexture();
+		GlStateManager.depthMask(true);
+		GlStateManager.enableBlend();
+		GlStateManager.enableDepth();
 		DeferredStateManager.checkGLError("Post: beginDrawEnvMap()");
 	}
 
@@ -2470,7 +2479,7 @@ public class EaglerDeferredPipeline {
 	public void beginDrawEnvMapTranslucent() {
 		DeferredStateManager.checkGLError("Pre: beginDrawEnvMapTranslucent()");
 		GlStateManager.enableBlend();
-		GlStateManager.tryBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE);
+		GlStateManager.tryBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE);
 		bindEnvMapBlockTexture();
 		DeferredStateManager.checkGLError("Post: beginDrawEnvMapTranslucent()");
 	}
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/EaglerTextureAtlasSpritePBR.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/EaglerTextureAtlasSpritePBR.java
index 05d31bdf..aa4f946b 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/EaglerTextureAtlasSpritePBR.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/EaglerTextureAtlasSpritePBR.java
@@ -8,7 +8,6 @@ import com.carrotsearch.hppc.cursors.IntCursor;
 import com.google.common.collect.Lists;
 
 import net.lax1dude.eaglercraft.v1_8.HString;
-import net.lax1dude.eaglercraft.v1_8.internal.IFramebufferGL;
 import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
 import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
 import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
@@ -219,7 +218,9 @@ public class EaglerTextureAtlasSpritePBR extends EaglerTextureAtlasSprite {
 		}
 	}
 
-	public void updateAnimationPBR(IFramebufferGL[] copyColorFramebuffer, IFramebufferGL[] copyMaterialFramebuffer, int materialTexOffset) {
+	protected IAnimCopyFunction currentAnimUpdaterPBR = null;
+
+	public void updateAnimationPBR() {
 		if(animationCachePBR[0] == null || (!dontAnimateNormals && animationCachePBR[1] == null)
 				|| (!dontAnimateMaterial && animationCachePBR[2] == null)) {
 			throw new IllegalStateException("Animation cache for '" + this.iconName + "' was never baked!");
@@ -233,9 +234,28 @@ public class EaglerTextureAtlasSpritePBR extends EaglerTextureAtlasSprite {
 			this.tickCounter = 0;
 			int k = this.animationMetadata.getFrameIndex(this.frameCounter);
 			if (i != k && k >= 0 && k < this.frameTextureDataPBR[0].size()) {
-				animationCachePBR[0].copyFrameLevelsToTex2D(k, this.originX, this.originY, this.width, this.height, copyColorFramebuffer);
-				if(!dontAnimateNormals) animationCachePBR[1].copyFrameLevelsToTex2D(k, this.originX, this.originY, this.width, this.height, copyMaterialFramebuffer);
-				if(!dontAnimateMaterial) animationCachePBR[2].copyFrameLevelsToTex2D(k, this.originX, this.originY + materialTexOffset, this.width, this.height, copyMaterialFramebuffer);
+				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+					animationCachePBR[0].copyFrameToTex2D(k, mapLevel, this.originX >> mapLevel,
+							this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+							mapHeight);
+				};
+				if(!dontAnimateNormals || !dontAnimateMaterial) {
+					currentAnimUpdaterPBR = (mapWidth, mapHeight, mapLevel) -> {
+						if (!dontAnimateNormals)
+							animationCachePBR[1].copyFrameToTex2D(k, mapLevel, this.originX >> mapLevel,
+									this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+									mapHeight);
+						if (!dontAnimateMaterial)
+							animationCachePBR[2].copyFrameToTex2D(k, mapLevel, this.originX >> mapLevel,
+									(this.originY >> mapLevel) + (mapHeight >> 1), this.width >> mapLevel,
+									this.height >> mapLevel, mapWidth, mapHeight);
+					};
+				}else {
+					currentAnimUpdaterPBR = null;
+				}
+			}else {
+				currentAnimUpdater = null;
+				currentAnimUpdaterPBR = null;
 			}
 		} else if (this.animationMetadata.isInterpolate()) {
 			float f = 1.0f - (float) this.tickCounter / (float) this.animationMetadata.getFrameTimeSingle(this.frameCounter);
@@ -244,9 +264,43 @@ public class EaglerTextureAtlasSpritePBR extends EaglerTextureAtlasSprite {
 					: this.animationMetadata.getFrameCount();
 			int k = this.animationMetadata.getFrameIndex((this.frameCounter + 1) % j);
 			if (i != k && k >= 0 && k < this.frameTextureDataPBR[0].size()) {
-				animationCachePBR[0].copyInterpolatedFrameLevelsToTex2D(i, k, f, this.originX, this.originY, this.width, this.height, copyColorFramebuffer);
-				if(!dontAnimateNormals) animationCachePBR[1].copyInterpolatedFrameLevelsToTex2D(i, k, f, this.originX, this.originY, this.width, this.height, copyMaterialFramebuffer);
-				if(!dontAnimateMaterial) animationCachePBR[2].copyInterpolatedFrameLevelsToTex2D(i, k, f, this.originX, this.originY + materialTexOffset, this.width, this.height, copyMaterialFramebuffer);
+				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+					animationCachePBR[0].copyInterpolatedFrameToTex2D(i, k, f, mapLevel, this.originX >> mapLevel,
+							this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+							mapHeight);
+				};
+				if(!dontAnimateNormals || !dontAnimateMaterial) {
+					currentAnimUpdaterPBR = (mapWidth, mapHeight, mapLevel) -> {
+						if (!dontAnimateNormals)
+							animationCachePBR[1].copyInterpolatedFrameToTex2D(i, k, f, mapLevel,
+									this.originX >> mapLevel, this.originY >> mapLevel, this.width >> mapLevel,
+									this.height >> mapLevel, mapWidth, mapHeight);
+						if (!dontAnimateMaterial)
+							animationCachePBR[2].copyInterpolatedFrameToTex2D(i, k, f, mapLevel,
+									this.originX >> mapLevel, (this.originY >> mapLevel) + (mapHeight >> 1),
+									this.width >> mapLevel, this.height >> mapLevel, mapWidth, mapHeight);
+					};
+				}else {
+					currentAnimUpdaterPBR = null;
+				}
+			}else {
+				currentAnimUpdater = null;
+				currentAnimUpdaterPBR = null;
+			}
+		}else {
+			currentAnimUpdater = null;
+			currentAnimUpdaterPBR = null;
+		}
+	}
+
+	public void copyAnimationFramePBR(int pass, int mapWidth, int mapHeight, int mapLevel) {
+		if(pass == 0) {
+			if(currentAnimUpdater != null) {
+				currentAnimUpdater.updateAnimation(mapWidth, mapHeight, mapLevel);
+			}
+		}else {
+			if(currentAnimUpdaterPBR != null) {
+				currentAnimUpdaterPBR.updateAnimation(mapWidth, mapHeight, mapLevel);
 			}
 		}
 	}
@@ -279,7 +333,7 @@ public class EaglerTextureAtlasSpritePBR extends EaglerTextureAtlasSprite {
 		}
 	}
 
-	public void updateAnimation(IFramebufferGL[] fb) {
+	public void updateAnimation() {
 		Throwable t = new UnsupportedOperationException("Cannot call regular updateAnimation in PBR mode, use updateAnimationPBR");
 		try {
 			throw t;
@@ -288,6 +342,15 @@ public class EaglerTextureAtlasSpritePBR extends EaglerTextureAtlasSprite {
 		}
 	}
 
+	public void copyAnimationFrame(int mapWidth, int mapHeight, int mapLevel) {
+		Throwable t = new UnsupportedOperationException("Cannot call regular copyAnimationFrame in PBR mode, use updateAnimationPBR");
+		try {
+			throw t;
+		}catch(Throwable tt) {
+			logger.error(t);
+		}
+	}
+
 	protected void resetSprite() {
 		this.animationMetadata = null;
 		this.setFramesTextureDataPBR(new List[] { Lists.newArrayList(), Lists.newArrayList(), Lists.newArrayList() });
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/PBRTextureMapUtils.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/PBRTextureMapUtils.java
index e29938ff..065958a0 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/PBRTextureMapUtils.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/PBRTextureMapUtils.java
@@ -27,7 +27,7 @@ import net.minecraft.util.ResourceLocation;
  */
 public class PBRTextureMapUtils {
 
-	public static final ImageData defaultNormalsTexture = new ImageData(1, 1, new int[] { 0 }, true);
+	public static final ImageData defaultNormalsTexture = new ImageData(1, 1, new int[] { 0xFFFF7F7F }, true);
 
 	public static final PBRMaterialConstants blockMaterialConstants = new PBRMaterialConstants(new ResourceLocation("eagler:glsl/deferred/material_block_constants.csv"));
 
@@ -125,13 +125,17 @@ public class PBRTextureMapUtils {
 		}
 	}
 
-	public static ImageData generateMaterialTextureFor(String iconName) {
+	public static ImageData generateMaterialTextureFor(String iconName, String iconName2) {
 		if(iconName.startsWith("minecraft:")) {
 			iconName = iconName.substring(10);
 		}
 		Integer in = blockMaterialConstants.spriteNameToMaterialConstants.get(iconName);
 		if(in == null) {
-			return new ImageData(1, 1, new int[] { blockMaterialConstants.defaultMaterial }, true);
+			if(iconName2 != null) {
+				return generateMaterialTextureFor(iconName2, null);
+			}else {
+				return new ImageData(1, 1, new int[] { blockMaterialConstants.defaultMaterial }, true);
+			}
 		}else {
 			return new ImageData(1, 1, new int[] { in.intValue() }, true);
 		}
@@ -150,8 +154,8 @@ public class PBRTextureMapUtils {
 					ret[i] = new int[len];
 					int x, y, s1, s2, s3, s4, c1, c2, c3, c4;
 					for(int j = 0; j < len; ++j) {
-						x = (j % len) << 1;
-						y = (j / len) << 1;
+						x = (j % lvlW) << 1;
+						y = (j / lvlW) << 1;
 						s1 = ret[i - 1][x + y * lvl2W];
 						s2 = ret[i - 1][x + y * lvl2W + 1];
 						s3 = ret[i - 1][x + y * lvl2W + lvl2W];
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureClockPBRImpl.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureClockPBRImpl.java
index 620ad6d8..c7d4321d 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureClockPBRImpl.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureClockPBRImpl.java
@@ -27,7 +27,7 @@ public class TextureClockPBRImpl extends EaglerTextureAtlasSpritePBR {
 		super(spriteName);
 	}
 
-	public void updateAnimationPBR(IFramebufferGL[] copyColorFramebuffer, IFramebufferGL[] copyMaterialFramebuffer, int materialTexOffset) {
+	public void updateAnimationPBR() {
 		if (!this.frameTextureDataPBR[0].isEmpty()) {
 			Minecraft minecraft = Minecraft.getMinecraft();
 			double d0 = 0.0;
@@ -59,16 +59,32 @@ public class TextureClockPBRImpl extends EaglerTextureAtlasSpritePBR {
 
 			if (i != this.frameCounter) {
 				this.frameCounter = i;
-				animationCachePBR[0].copyFrameLevelsToTex2D(this.frameCounter, this.originX, this.originY, this.width,
-						this.height, copyColorFramebuffer);
-				if (!dontAnimateNormals)
-					animationCachePBR[1].copyFrameLevelsToTex2D(this.frameCounter, this.originX, this.originY,
-							this.width, this.height, copyMaterialFramebuffer);
-				if (!dontAnimateMaterial)
-					animationCachePBR[2].copyFrameLevelsToTex2D(this.frameCounter, this.originX,
-							this.originY + materialTexOffset, this.width, this.height, copyMaterialFramebuffer);
+				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+					animationCachePBR[0].copyFrameToTex2D(this.frameCounter, mapLevel, this.originX >> mapLevel,
+							this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+							mapHeight);
+				};
+				if(!dontAnimateNormals || !dontAnimateMaterial) {
+					currentAnimUpdaterPBR = (mapWidth, mapHeight, mapLevel) -> {
+						if (!dontAnimateNormals)
+							animationCachePBR[1].copyFrameToTex2D(this.frameCounter, mapLevel, this.originX,
+									this.originY, this.width, this.height, mapWidth, mapHeight);
+						if (!dontAnimateMaterial)
+							animationCachePBR[2].copyFrameToTex2D(this.frameCounter, mapLevel, this.originX >> mapLevel,
+									(this.originY >> mapLevel) + (mapHeight >> 1), this.width >> mapLevel,
+									this.height >> mapLevel, mapWidth, mapHeight);
+					};
+				}else {
+					currentAnimUpdaterPBR = null;
+				}
+			}else {
+				currentAnimUpdater = null;
+				currentAnimUpdaterPBR = null;
 			}
 
+		}else {
+			currentAnimUpdater = null;
+			currentAnimUpdaterPBR = null;
 		}
 	}
 
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureCompassPBRImpl.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureCompassPBRImpl.java
index b4ac23a2..7f1f97b1 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureCompassPBRImpl.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/texture/TextureCompassPBRImpl.java
@@ -29,18 +29,17 @@ public class TextureCompassPBRImpl extends EaglerTextureAtlasSpritePBR {
 		super(spriteName);
 	}
 
-	public void updateAnimationPBR(IFramebufferGL[] copyColorFramebuffer, IFramebufferGL[] copyMaterialFramebuffer, int materialOffset) {
+	public void updateAnimationPBR() {
 		Minecraft minecraft = Minecraft.getMinecraft();
 		if (minecraft.theWorld != null && minecraft.thePlayer != null) {
 			this.updateCompassPBR(minecraft.theWorld, minecraft.thePlayer.posX, minecraft.thePlayer.posZ,
-					(double) minecraft.thePlayer.rotationYaw, false, copyColorFramebuffer, copyMaterialFramebuffer, materialOffset);
+					(double) minecraft.thePlayer.rotationYaw, false);
 		} else {
-			this.updateCompassPBR((World) null, 0.0, 0.0, 0.0, true, copyColorFramebuffer, copyMaterialFramebuffer, materialOffset);
+			this.updateCompassPBR((World) null, 0.0, 0.0, 0.0, true);
 		}
 	}
 
-	public void updateCompassPBR(World worldIn, double playerX, double playerY, double playerZ, boolean noWorld,
-			IFramebufferGL[] copyColorFramebuffer, IFramebufferGL[] copyMaterialFramebuffer, int materialOffset) {
+	public void updateCompassPBR(World worldIn, double playerX, double playerY, double playerZ, boolean noWorld) {
 		if (!this.frameTextureDataPBR[0].isEmpty()) {
 			double d0 = 0.0;
 			if (worldIn != null && !noWorld) {
@@ -76,15 +75,33 @@ public class TextureCompassPBRImpl extends EaglerTextureAtlasSpritePBR {
 
 			if (i != this.frameCounter) {
 				this.frameCounter = i;
-				animationCachePBR[0].copyFrameLevelsToTex2D(this.frameCounter, this.originX, this.originY, this.width,
-						this.height, copyColorFramebuffer);
-				if (!dontAnimateNormals)
-					animationCachePBR[1].copyFrameLevelsToTex2D(this.frameCounter, this.originX, this.originY,
-							this.width, this.height, copyMaterialFramebuffer);
-				if (!dontAnimateMaterial)
-					animationCachePBR[2].copyFrameLevelsToTex2D(this.frameCounter, this.originX,
-							this.originY + materialOffset, this.width, this.height, copyMaterialFramebuffer);
+				currentAnimUpdater = (mapWidth, mapHeight, mapLevel) -> {
+					animationCachePBR[0].copyFrameToTex2D(this.frameCounter, mapLevel, this.originX >> mapLevel,
+							this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+							mapHeight);
+				};
+				if(!dontAnimateNormals || !dontAnimateMaterial) {
+					currentAnimUpdaterPBR = (mapWidth, mapHeight, mapLevel) -> {
+						if (!dontAnimateNormals)
+							animationCachePBR[1].copyFrameToTex2D(this.frameCounter, mapLevel, this.originX >> mapLevel,
+									this.originY >> mapLevel, this.width >> mapLevel, this.height >> mapLevel, mapWidth,
+									mapHeight);
+						if (!dontAnimateMaterial)
+							animationCachePBR[2].copyFrameToTex2D(this.frameCounter, mapLevel, this.originX >> mapLevel,
+									(this.originY >> mapLevel) + (mapHeight >> 1), this.width >> mapLevel,
+									this.height >> mapLevel, mapWidth, mapHeight);
+					};
+				}else {
+					currentAnimUpdaterPBR = null;
+				}
+			}else {
+				currentAnimUpdater = null;
+				currentAnimUpdaterPBR = null;
 			}
+
+		}else {
+			currentAnimUpdater = null;
+			currentAnimUpdaterPBR = null;
 		}
 	}
 
diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java
index c8a8a9e2..17e079df 100644
--- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java
+++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java
@@ -88,6 +88,7 @@ public class EaglerChunkLoader extends AnvilChunkLoader {
 
 	@Override
 	public void saveChunk(World var1, Chunk var2) throws IOException {
+		var1.alfheim$getLightingEngine().processLightUpdates();
 		NBTTagCompound chunkData = new NBTTagCompound();
 		this.writeChunkToNBT(var2, var1, chunkData);
 		NBTTagCompound fileData = new NBTTagCompound();
diff --git a/sources/main/java/net/optifine/BetterGrass.java b/sources/main/java/net/optifine/BetterGrass.java
new file mode 100644
index 00000000..f9892db9
--- /dev/null
+++ b/sources/main/java/net/optifine/BetterGrass.java
@@ -0,0 +1,243 @@
+package net.optifine;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+
+import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockDirt;
+import net.minecraft.block.BlockGrass;
+import net.minecraft.block.BlockMycelium;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.IBlockAccess;
+import net.optifine.model.BlockModelUtils;
+import net.optifine.util.PropertiesOrdered;
+
+public class BetterGrass {
+	private static boolean betterGrass = true;
+	private static boolean betterMycelium = true;
+	private static boolean betterPodzol = true;
+	private static boolean betterGrassSnow = true;
+	private static boolean betterMyceliumSnow = true;
+	private static boolean betterPodzolSnow = true;
+	private static boolean grassMultilayer = false;
+	private static EaglerTextureAtlasSprite spriteGrass = null;
+	private static EaglerTextureAtlasSprite spriteGrassSide = null;
+	private static EaglerTextureAtlasSprite spriteMycelium = null;
+	private static EaglerTextureAtlasSprite spritePodzol = null;
+	private static EaglerTextureAtlasSprite spriteSnow = null;
+	private static boolean spritesLoaded = false;
+	private static IBakedModel modelCubeGrass = null;
+	private static IBakedModel modelCubeMycelium = null;
+	private static IBakedModel modelCubePodzol = null;
+	private static IBakedModel modelCubeSnow = null;
+	private static boolean modelsLoaded = false;
+	private static final String TEXTURE_GRASS_DEFAULT = "blocks/grass_top";
+	private static final String TEXTURE_GRASS_SIDE_DEFAULT = "blocks/grass_side";
+	private static final String TEXTURE_MYCELIUM_DEFAULT = "blocks/mycelium_top";
+	private static final String TEXTURE_PODZOL_DEFAULT = "blocks/dirt_podzol_top";
+	private static final String TEXTURE_SNOW_DEFAULT = "blocks/snow";
+
+	public static void updateIcons(TextureMap textureMap) {
+		spritesLoaded = false;
+		modelsLoaded = false;
+		loadProperties(textureMap);
+	}
+
+	public static void update() {
+		if (spritesLoaded) {
+			modelCubeGrass = BlockModelUtils.makeModelCube(spriteGrass, 0);
+
+			if (grassMultilayer) {
+				IBakedModel ibakedmodel = BlockModelUtils.makeModelCube(spriteGrassSide, -1);
+				modelCubeGrass = BlockModelUtils.joinModelsCube(ibakedmodel, modelCubeGrass);
+			}
+
+			modelCubeMycelium = BlockModelUtils.makeModelCube(spriteMycelium, -1);
+			modelCubePodzol = BlockModelUtils.makeModelCube(spritePodzol, 0);
+			modelCubeSnow = BlockModelUtils.makeModelCube(spriteSnow, -1);
+			modelsLoaded = true;
+		}
+	}
+
+	private static void loadProperties(TextureMap textureMap) {
+		betterGrass = true;
+		betterMycelium = true;
+		betterPodzol = true;
+		betterGrassSnow = true;
+		betterMyceliumSnow = true;
+		betterPodzolSnow = true;
+		spriteGrass = textureMap.registerSprite(new ResourceLocation("blocks/grass_top"));
+		spriteGrassSide = textureMap.registerSprite(new ResourceLocation("blocks/grass_side"));
+		spriteMycelium = textureMap.registerSprite(new ResourceLocation("blocks/mycelium_top"));
+		spritePodzol = textureMap.registerSprite(new ResourceLocation("blocks/dirt_podzol_top"));
+		spriteSnow = textureMap.registerSprite(new ResourceLocation("blocks/snow"));
+		spritesLoaded = true;
+		String s = "optifine/bettergrass.properties";
+
+		try (InputStream inputstream = Minecraft.getMinecraft().getResourceManager()
+				.getResource(new ResourceLocation(s)).getInputStream()) {
+			Properties properties = new PropertiesOrdered();
+			properties.load(inputstream);
+			inputstream.close();
+			betterGrass = getBoolean(properties, "grass", true);
+			betterMycelium = getBoolean(properties, "mycelium", true);
+			betterPodzol = getBoolean(properties, "podzol", true);
+			betterGrassSnow = getBoolean(properties, "grass.snow", true);
+			betterMyceliumSnow = getBoolean(properties, "mycelium.snow", true);
+			betterPodzolSnow = getBoolean(properties, "podzol.snow", true);
+			grassMultilayer = getBoolean(properties, "grass.multilayer", false);
+			spriteGrass = registerSprite(properties, "texture.grass", "blocks/grass_top", textureMap);
+			spriteGrassSide = registerSprite(properties, "texture.grass_side", "blocks/grass_side", textureMap);
+			spriteMycelium = registerSprite(properties, "texture.mycelium", "blocks/mycelium_top", textureMap);
+			spritePodzol = registerSprite(properties, "texture.podzol", "blocks/dirt_podzol_top", textureMap);
+			spriteSnow = registerSprite(properties, "texture.snow", "blocks/snow", textureMap);
+		} catch (IOException ioexception) {
+			Config.warn(
+					"Error reading: " + s + ", " + ioexception.getClass().getName() + ": " + ioexception.getMessage());
+		}
+	}
+
+	private static EaglerTextureAtlasSprite registerSprite(Properties props, String key, String textureDefault,
+			TextureMap textureMap) {
+		String s = props.getProperty(key);
+
+		if (s == null) {
+			s = textureDefault;
+		}
+
+//		ResourceLocation resourcelocation = new ResourceLocation("textures/" + s + ".png");
+//
+//		if (!Config.hasResource(resourcelocation)) {
+//			Config.warn("BetterGrass texture not found: " + resourcelocation);
+//			s = textureDefault;
+//		}
+
+		ResourceLocation resourcelocation1 = new ResourceLocation(s);
+		EaglerTextureAtlasSprite textureatlassprite = textureMap.registerSprite(resourcelocation1, key);
+		return textureatlassprite;
+	}
+
+	public static List getFaceQuads(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
+			EnumFacing facing, List quads) {
+		if (facing != EnumFacing.UP && facing != EnumFacing.DOWN) {
+			if (!modelsLoaded) {
+				return quads;
+			} else {
+				Block block = blockState.getBlock();
+				return block instanceof BlockMycelium
+						? getFaceQuadsMycelium(blockAccess, blockState, blockPos, facing, quads)
+						: (block instanceof BlockDirt
+								? getFaceQuadsDirt(blockAccess, blockState, blockPos, facing, quads)
+								: (block instanceof BlockGrass
+										? getFaceQuadsGrass(blockAccess, blockState, blockPos, facing, quads)
+										: quads));
+			}
+		} else {
+			return quads;
+		}
+	}
+
+	private static List getFaceQuadsMycelium(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
+			EnumFacing facing, List quads) {
+		Block block = blockAccess.getBlockState(blockPos.up()).getBlock();
+		boolean flag = block == Blocks.snow || block == Blocks.snow_layer;
+
+		if (Config.isBetterGrassFancy()) {
+			if (flag) {
+				if (betterMyceliumSnow && getBlockAt(blockPos, facing, blockAccess) == Blocks.snow_layer) {
+					return modelCubeSnow.getFaceQuads(facing);
+				}
+			} else if (betterMycelium && getBlockAt(blockPos.down(), facing, blockAccess) == Blocks.mycelium) {
+				return modelCubeMycelium.getFaceQuads(facing);
+			}
+		} else if (flag) {
+			if (betterMyceliumSnow) {
+				return modelCubeSnow.getFaceQuads(facing);
+			}
+		} else if (betterMycelium) {
+			return modelCubeMycelium.getFaceQuads(facing);
+		}
+
+		return quads;
+	}
+
+	private static List getFaceQuadsDirt(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
+			EnumFacing facing, List quads) {
+		Block block = getBlockAt(blockPos, EnumFacing.UP, blockAccess);
+
+		if (blockState.getValue(BlockDirt.VARIANT) != BlockDirt.DirtType.PODZOL) {
+			return quads;
+		} else {
+			boolean flag = block == Blocks.snow || block == Blocks.snow_layer;
+
+			if (Config.isBetterGrassFancy()) {
+				if (flag) {
+					if (betterPodzolSnow && getBlockAt(blockPos, facing, blockAccess) == Blocks.snow_layer) {
+						return modelCubeSnow.getFaceQuads(facing);
+					}
+				} else if (betterPodzol) {
+					BlockPos blockpos = blockPos.down().offset(facing);
+					IBlockState iblockstate = blockAccess.getBlockState(blockpos);
+
+					if (iblockstate.getBlock() == Blocks.dirt
+							&& iblockstate.getValue(BlockDirt.VARIANT) == BlockDirt.DirtType.PODZOL) {
+						return modelCubePodzol.getFaceQuads(facing);
+					}
+				}
+			} else if (flag) {
+				if (betterPodzolSnow) {
+					return modelCubeSnow.getFaceQuads(facing);
+				}
+			} else if (betterPodzol) {
+				return modelCubePodzol.getFaceQuads(facing);
+			}
+
+			return quads;
+		}
+	}
+
+	private static List getFaceQuadsGrass(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
+			EnumFacing facing, List quads) {
+		Block block = blockAccess.getBlockState(blockPos.up()).getBlock();
+		boolean flag = block == Blocks.snow || block == Blocks.snow_layer;
+
+		if (Config.isBetterGrassFancy()) {
+			if (flag) {
+				if (betterGrassSnow && getBlockAt(blockPos, facing, blockAccess) == Blocks.snow_layer) {
+					return modelCubeSnow.getFaceQuads(facing);
+				}
+			} else if (betterGrass && getBlockAt(blockPos.down(), facing, blockAccess) == Blocks.grass) {
+				return modelCubeGrass.getFaceQuads(facing);
+			}
+		} else if (flag) {
+			if (betterGrassSnow) {
+				return modelCubeSnow.getFaceQuads(facing);
+			}
+		} else if (betterGrass) {
+			return modelCubeGrass.getFaceQuads(facing);
+		}
+
+		return quads;
+	}
+
+	private static Block getBlockAt(BlockPos blockPos, EnumFacing facing, IBlockAccess blockAccess) {
+		BlockPos blockpos = blockPos.offset(facing);
+		Block block = blockAccess.getBlockState(blockpos).getBlock();
+		return block;
+	}
+
+	private static boolean getBoolean(Properties props, String key, boolean def) {
+		String s = props.getProperty(key);
+		return s == null ? def : Boolean.parseBoolean(s);
+	}
+}
diff --git a/sources/main/java/net/optifine/BetterSnow.java b/sources/main/java/net/optifine/BetterSnow.java
new file mode 100644
index 00000000..4ba85cde
--- /dev/null
+++ b/sources/main/java/net/optifine/BetterSnow.java
@@ -0,0 +1,91 @@
+package net.optifine;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockBush;
+import net.minecraft.block.BlockDoublePlant;
+import net.minecraft.block.BlockFence;
+import net.minecraft.block.BlockFenceGate;
+import net.minecraft.block.BlockFlower;
+import net.minecraft.block.BlockFlowerPot;
+import net.minecraft.block.BlockLever;
+import net.minecraft.block.BlockMushroom;
+import net.minecraft.block.BlockPane;
+import net.minecraft.block.BlockRedstoneTorch;
+import net.minecraft.block.BlockReed;
+import net.minecraft.block.BlockSapling;
+import net.minecraft.block.BlockSnow;
+import net.minecraft.block.BlockTallGrass;
+import net.minecraft.block.BlockTorch;
+import net.minecraft.block.BlockWall;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.world.IBlockAccess;
+
+public class BetterSnow {
+	private static IBakedModel modelSnowLayer = null;
+
+	public static void update() {
+		modelSnowLayer = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes()
+				.getModelForState(Blocks.snow_layer.getDefaultState());
+	}
+
+	public static IBakedModel getModelSnowLayer() {
+		return modelSnowLayer;
+	}
+
+	public static IBlockState getStateSnowLayer() {
+		return Blocks.snow_layer.getDefaultState();
+	}
+
+	public static boolean shouldRender(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos) {
+		Block block = blockState.getBlock();
+		return !checkBlock(block, blockState) ? false : hasSnowNeighbours(blockAccess, blockPos);
+	}
+
+	private static boolean hasSnowNeighbours(IBlockAccess blockAccess, BlockPos pos) {
+		Block block = Blocks.snow_layer;
+		return blockAccess.getBlockState(pos.north()).getBlock() != block
+				&& blockAccess.getBlockState(pos.south()).getBlock() != block
+				&& blockAccess.getBlockState(pos.west()).getBlock() != block
+				&& blockAccess.getBlockState(pos.east()).getBlock() != block ? false
+						: blockAccess.getBlockState(pos.down()).getBlock().isOpaqueCube();
+	}
+
+	private static boolean checkBlock(Block block, IBlockState blockState) {
+		if (block.isFullCube()) {
+			return false;
+		} else if (block.isOpaqueCube()) {
+			return false;
+		} else if (block instanceof BlockSnow) {
+			return false;
+		} else if (!(block instanceof BlockBush) || !(block instanceof BlockDoublePlant)
+				&& !(block instanceof BlockFlower) && !(block instanceof BlockMushroom)
+				&& !(block instanceof BlockSapling) && !(block instanceof BlockTallGrass)) {
+			if (!(block instanceof BlockFence) && !(block instanceof BlockFenceGate)
+					&& !(block instanceof BlockFlowerPot) && !(block instanceof BlockPane)
+					&& !(block instanceof BlockReed) && !(block instanceof BlockWall)) {
+				if (block instanceof BlockRedstoneTorch && blockState.getValue(BlockTorch.FACING) == EnumFacing.UP) {
+					return true;
+				} else {
+					if (block instanceof BlockLever) {
+						Object object = blockState.getValue(BlockLever.FACING);
+
+						if (object == BlockLever.EnumOrientation.UP_X || object == BlockLever.EnumOrientation.UP_Z) {
+							return true;
+						}
+					}
+
+					return false;
+				}
+			} else {
+				return true;
+			}
+		} else {
+			return true;
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/BlockDir.java b/sources/main/java/net/optifine/BlockDir.java
new file mode 100644
index 00000000..71742435
--- /dev/null
+++ b/sources/main/java/net/optifine/BlockDir.java
@@ -0,0 +1,78 @@
+package net.optifine;
+
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+
+public enum BlockDir {
+	DOWN(EnumFacing.DOWN), UP(EnumFacing.UP), NORTH(EnumFacing.NORTH), SOUTH(EnumFacing.SOUTH), WEST(EnumFacing.WEST),
+	EAST(EnumFacing.EAST), NORTH_WEST(EnumFacing.NORTH, EnumFacing.WEST), NORTH_EAST(EnumFacing.NORTH, EnumFacing.EAST),
+	SOUTH_WEST(EnumFacing.SOUTH, EnumFacing.WEST), SOUTH_EAST(EnumFacing.SOUTH, EnumFacing.EAST),
+	DOWN_NORTH(EnumFacing.DOWN, EnumFacing.NORTH), DOWN_SOUTH(EnumFacing.DOWN, EnumFacing.SOUTH),
+	UP_NORTH(EnumFacing.UP, EnumFacing.NORTH), UP_SOUTH(EnumFacing.UP, EnumFacing.SOUTH),
+	DOWN_WEST(EnumFacing.DOWN, EnumFacing.WEST), DOWN_EAST(EnumFacing.DOWN, EnumFacing.EAST),
+	UP_WEST(EnumFacing.UP, EnumFacing.WEST), UP_EAST(EnumFacing.UP, EnumFacing.EAST);
+
+	private EnumFacing facing1;
+	private EnumFacing facing2;
+
+	private BlockDir(EnumFacing facing1) {
+		this.facing1 = facing1;
+	}
+
+	private BlockDir(EnumFacing facing1, EnumFacing facing2) {
+		this.facing1 = facing1;
+		this.facing2 = facing2;
+	}
+
+	public EnumFacing getFacing1() {
+		return this.facing1;
+	}
+
+	public EnumFacing getFacing2() {
+		return this.facing2;
+	}
+
+	BlockPos offset(BlockPos pos) {
+		pos = pos.offset(this.facing1, 1);
+
+		if (this.facing2 != null) {
+			pos = pos.offset(this.facing2, 1);
+		}
+
+		return pos;
+	}
+
+	public int getOffsetX() {
+		int i = this.facing1.getFrontOffsetX();
+
+		if (this.facing2 != null) {
+			i += this.facing2.getFrontOffsetX();
+		}
+
+		return i;
+	}
+
+	public int getOffsetY() {
+		int i = this.facing1.getFrontOffsetY();
+
+		if (this.facing2 != null) {
+			i += this.facing2.getFrontOffsetY();
+		}
+
+		return i;
+	}
+
+	public int getOffsetZ() {
+		int i = this.facing1.getFrontOffsetZ();
+
+		if (this.facing2 != null) {
+			i += this.facing2.getFrontOffsetZ();
+		}
+
+		return i;
+	}
+
+	public boolean isDouble() {
+		return this.facing2 != null;
+	}
+}
diff --git a/sources/main/java/net/optifine/Config.java b/sources/main/java/net/optifine/Config.java
new file mode 100644
index 00000000..3c0fb325
--- /dev/null
+++ b/sources/main/java/net/optifine/Config.java
@@ -0,0 +1,339 @@
+package net.optifine;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import net.lax1dude.eaglercraft.v1_8.log4j.LogManager;
+import net.lax1dude.eaglercraft.v1_8.log4j.Logger;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.DefaultResourcePack;
+import net.minecraft.client.resources.IResourcePack;
+import net.minecraft.client.resources.ResourcePackRepository;
+import net.minecraft.client.settings.GameSettings;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.ResourceLocation;
+import net.optifine.util.TextureUtils;
+
+public class Config {
+
+	private static final Logger logger = LogManager.getLogger("OptiFine");
+
+	private static Minecraft mc;
+	private static GameSettings gameSettings;
+
+	public static void setGameObj(Minecraft mc) {
+		Config.mc = mc;
+		Config.gameSettings = mc.gameSettings;
+	}
+
+	public static String[] tokenize(String p_tokenize_0_, String p_tokenize_1_) {
+		StringTokenizer stringtokenizer = new StringTokenizer(p_tokenize_0_, p_tokenize_1_);
+		List list = new ArrayList();
+
+		while (stringtokenizer.hasMoreTokens()) {
+			String s = stringtokenizer.nextToken();
+			list.add(s);
+		}
+
+		String[] astring = (String[]) list.toArray(new String[list.size()]);
+		return astring;
+	}
+
+	public static boolean isCustomSky() {
+		return gameSettings.customSkyOF;
+	}
+
+	public static boolean isBetterGrass() {
+		return gameSettings.betterGrassOF != 0;
+	}
+
+	public static boolean isBetterGrassFancy() {
+		return gameSettings.betterGrassOF == 2;
+	}
+
+	public static boolean isBetterSnow() {
+		return gameSettings.betterGrassOF != 0;
+	}
+
+	public static boolean isConnectedTextures() {
+		return gameSettings.connectedTexturesOF != 0;
+	}
+
+	public static boolean isConnectedTexturesFancy() {
+		return gameSettings.connectedTexturesOF == 2;
+	}
+
+	public static boolean isTreesFancy() {
+		return gameSettings.fancyGraphics;
+	}
+
+	public static boolean isTreesSmart() {
+		return gameSettings.fancyGraphics && gameSettings.smartLeavesOF;
+	}
+
+	public static boolean isCullFacesLeaves() {
+		return !gameSettings.fancyGraphics;
+	}
+
+	public static boolean isCustomItems() {
+		return gameSettings.customItemsOF;
+	}
+
+	public static void dbg(String string) {
+		logger.debug(string);
+	}
+
+	public static void warn(String string) {
+		logger.warn(string);
+	}
+
+	public static void error(String string) {
+		logger.error(string);
+	}
+
+	public static int limit(int p_limit_0_, int p_limit_1_, int p_limit_2_) {
+		return p_limit_0_ < p_limit_1_ ? p_limit_1_ : (p_limit_0_ > p_limit_2_ ? p_limit_2_ : p_limit_0_);
+	}
+
+	public static float limit(float p_limit_0_, float p_limit_1_, float p_limit_2_) {
+		return p_limit_0_ < p_limit_1_ ? p_limit_1_ : (p_limit_0_ > p_limit_2_ ? p_limit_2_ : p_limit_0_);
+	}
+
+	public static double limit(double p_limit_0_, double p_limit_2_, double p_limit_4_) {
+		return p_limit_0_ < p_limit_2_ ? p_limit_2_ : (p_limit_0_ > p_limit_4_ ? p_limit_4_ : p_limit_0_);
+	}
+
+	public static int parseInt(String p_parseInt_0_, int p_parseInt_1_) {
+		try {
+			if (p_parseInt_0_ == null) {
+				return p_parseInt_1_;
+			} else {
+				p_parseInt_0_ = p_parseInt_0_.trim();
+				return Integer.parseInt(p_parseInt_0_);
+			}
+		} catch (NumberFormatException var3) {
+			return p_parseInt_1_;
+		}
+	}
+
+	public static float parseFloat(String p_parseFloat_0_, float p_parseFloat_1_) {
+		try {
+			if (p_parseFloat_0_ == null) {
+				return p_parseFloat_1_;
+			} else {
+				p_parseFloat_0_ = p_parseFloat_0_.trim();
+				return Float.parseFloat(p_parseFloat_0_);
+			}
+		} catch (NumberFormatException var3) {
+			return p_parseFloat_1_;
+		}
+	}
+
+	public static boolean parseBoolean(String p_parseBoolean_0_, boolean p_parseBoolean_1_) {
+		try {
+			if (p_parseBoolean_0_ == null) {
+				return p_parseBoolean_1_;
+			} else {
+				p_parseBoolean_0_ = p_parseBoolean_0_.trim();
+				return Boolean.parseBoolean(p_parseBoolean_0_);
+			}
+		} catch (NumberFormatException var3) {
+			return p_parseBoolean_1_;
+		}
+	}
+
+	public static int[] addIntToArray(int[] p_addIntToArray_0_, int p_addIntToArray_1_) {
+		if (p_addIntToArray_0_ != null) {
+			int[] ret = new int[p_addIntToArray_0_.length + 1];
+			System.arraycopy(p_addIntToArray_0_, 0, ret, 0, p_addIntToArray_0_.length);
+			ret[p_addIntToArray_0_.length] = p_addIntToArray_1_;
+			return ret;
+		} else {
+			throw new NullPointerException("The given array is NULL");
+		}
+	}
+
+	public static int[] addIntsToArray(int[] p_addIntsToArray_0_, int[] p_addIntsToArray_1_) {
+		if (p_addIntsToArray_0_ != null && p_addIntsToArray_1_ != null) {
+			int i = p_addIntsToArray_0_.length;
+			int j = i + p_addIntsToArray_1_.length;
+			int[] aint = new int[j];
+			System.arraycopy(p_addIntsToArray_0_, 0, aint, 0, i);
+
+			for (int k = 0; k < p_addIntsToArray_1_.length; ++k) {
+				aint[k + i] = p_addIntsToArray_1_[k];
+			}
+
+			return aint;
+		} else {
+			throw new NullPointerException("The given array is NULL");
+		}
+	}
+
+	public static String arrayToString(Object[] p_arrayToString_0_) {
+		return arrayToString(p_arrayToString_0_, ", ");
+	}
+
+	public static String arrayToString(Object[] p_arrayToString_0_, String p_arrayToString_1_) {
+		if (p_arrayToString_0_ == null) {
+			return "";
+		} else {
+			StringBuffer stringbuffer = new StringBuffer(p_arrayToString_0_.length * 5);
+
+			for (int i = 0; i < p_arrayToString_0_.length; ++i) {
+				Object object = p_arrayToString_0_[i];
+
+				if (i > 0) {
+					stringbuffer.append(p_arrayToString_1_);
+				}
+
+				stringbuffer.append(String.valueOf(object));
+			}
+
+			return stringbuffer.toString();
+		}
+	}
+
+	public static String arrayToString(int[] p_arrayToString_0_) {
+		return arrayToString(p_arrayToString_0_, ", ");
+	}
+
+	public static String arrayToString(int[] p_arrayToString_0_, String p_arrayToString_1_) {
+		if (p_arrayToString_0_ == null) {
+			return "";
+		} else {
+			StringBuffer stringbuffer = new StringBuffer(p_arrayToString_0_.length * 5);
+
+			for (int i = 0; i < p_arrayToString_0_.length; ++i) {
+				int j = p_arrayToString_0_[i];
+
+				if (i > 0) {
+					stringbuffer.append(p_arrayToString_1_);
+				}
+
+				stringbuffer.append(String.valueOf(j));
+			}
+
+			return stringbuffer.toString();
+		}
+	}
+
+	public static int[] toPrimitive(Integer[] p_toPrimitive_0_) {
+		if (p_toPrimitive_0_ == null) {
+			return null;
+		} else if (p_toPrimitive_0_.length == 0) {
+			return new int[0];
+		} else {
+			int[] aint = new int[p_toPrimitive_0_.length];
+
+			for (int i = 0; i < aint.length; ++i) {
+				aint[i] = p_toPrimitive_0_[i].intValue();
+			}
+
+			return aint;
+		}
+	}
+
+	public static boolean isSameOne(Object p_isSameOne_0_, Object[] p_isSameOne_1_) {
+		if (p_isSameOne_1_ == null) {
+			return false;
+		} else {
+			for (int i = 0; i < p_isSameOne_1_.length; ++i) {
+				Object object = p_isSameOne_1_[i];
+
+				if (p_isSameOne_0_ == object) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static boolean equals(Object p_equals_0_, Object p_equals_1_) {
+		return p_equals_0_ == p_equals_1_ ? true : (p_equals_0_ == null ? false : p_equals_0_.equals(p_equals_1_));
+	}
+
+	public static boolean isFromDefaultResourcePack(ResourceLocation p_isFromDefaultResourcePack_0_) {
+		IResourcePack iresourcepack = getDefiningResourcePack(p_isFromDefaultResourcePack_0_);
+		return iresourcepack == mc.getDefaultResourcePack();
+	}
+
+	public static IResourcePack getDefiningResourcePack(ResourceLocation p_getDefiningResourcePack_0_) {
+		ResourcePackRepository resourcepackrepository = mc.getResourcePackRepository();
+		IResourcePack iresourcepack = resourcepackrepository.getResourcePackInstance();
+
+		if (iresourcepack != null && iresourcepack.resourceExists(p_getDefiningResourcePack_0_)) {
+			return iresourcepack;
+		} else {
+			List<ResourcePackRepository.Entry> list = resourcepackrepository.getRepositoryEntries();
+
+			for (int i = list.size() - 1; i >= 0; --i) {
+				ResourcePackRepository.Entry resourcepackrepository$entry = (ResourcePackRepository.Entry) list.get(i);
+				IResourcePack iresourcepack1 = resourcepackrepository$entry.getResourcePack();
+
+				if (iresourcepack1.resourceExists(p_getDefiningResourcePack_0_)) {
+					return iresourcepack1;
+				}
+			}
+
+			DefaultResourcePack res = mc.getDefaultResourcePack();
+			if (res.resourceExists(p_getDefiningResourcePack_0_)) {
+				return res;
+			} else {
+				return null;
+			}
+		}
+	}
+
+	public static boolean hasResource(ResourceLocation p_hasResource_0_) {
+		if (p_hasResource_0_ == null) {
+			return false;
+		} else {
+			IResourcePack iresourcepack = getDefiningResourcePack(p_hasResource_0_);
+			return iresourcepack != null;
+		}
+	}
+
+	public static IResourcePack[] getResourcePacks() {
+		ResourcePackRepository resourcepackrepository = mc.getResourcePackRepository();
+		List list = resourcepackrepository.getRepositoryEntries();
+		List list1 = new ArrayList();
+
+		for (Object resourcepackrepository$entry0 : list) {
+			ResourcePackRepository.Entry resourcepackrepository$entry = (ResourcePackRepository.Entry) resourcepackrepository$entry0;
+			list1.add(resourcepackrepository$entry.getResourcePack());
+		}
+
+		if (resourcepackrepository.getResourcePackInstance() != null) {
+			list1.add(resourcepackrepository.getResourcePackInstance());
+		}
+
+		IResourcePack[] airesourcepack = (IResourcePack[]) ((IResourcePack[]) list1
+				.toArray(new IResourcePack[list1.size()]));
+		return airesourcepack;
+	}
+
+	public static int intHash(int p_intHash_0_) {
+		p_intHash_0_ = p_intHash_0_ ^ 61 ^ p_intHash_0_ >> 16;
+		p_intHash_0_ = p_intHash_0_ + (p_intHash_0_ << 3);
+		p_intHash_0_ = p_intHash_0_ ^ p_intHash_0_ >> 4;
+		p_intHash_0_ = p_intHash_0_ * 668265261;
+		p_intHash_0_ = p_intHash_0_ ^ p_intHash_0_ >> 15;
+		return p_intHash_0_;
+	}
+
+	public static int getRandom(BlockPos p_getRandom_0_, int p_getRandom_1_) {
+		int i = intHash(p_getRandom_1_ + 37);
+		i = intHash(i + p_getRandom_0_.getX());
+		i = intHash(i + p_getRandom_0_.getZ());
+		i = intHash(i + p_getRandom_0_.getY());
+		return i;
+	}
+
+	public static void frameInitHook() {
+		TextureUtils.registerResourceListener();
+	}
+
+}
diff --git a/sources/main/java/net/optifine/ConnectedProperties.java b/sources/main/java/net/optifine/ConnectedProperties.java
new file mode 100644
index 00000000..c91405de
--- /dev/null
+++ b/sources/main/java/net/optifine/ConnectedProperties.java
@@ -0,0 +1,993 @@
+package net.optifine;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.function.Function;
+
+import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+import net.minecraft.block.Block;
+import net.minecraft.block.properties.IProperty;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.EnumWorldBlockLayer;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.optifine.config.ConnectedParser;
+import net.optifine.config.MatchBlock;
+import net.optifine.config.Matches;
+import net.optifine.config.NbtTagValue;
+import net.optifine.config.RangeInt;
+import net.optifine.config.RangeListInt;
+import net.optifine.util.MathUtils;
+import net.optifine.util.TextureUtils;
+
+public class ConnectedProperties {
+	public String name = null;
+	public String basePath = null;
+	public MatchBlock[] matchBlocks = null;
+	public int[] metadatas = null;
+	public String[] matchTiles = null;
+	public int method = 0;
+	public String[] tiles = null;
+	public int connect = 0;
+	public int faces = 63;
+	public BiomeGenBase[] biomes = null;
+	public RangeListInt heights = null;
+	public int renderPass = 0;
+	public boolean innerSeams = false;
+	public int[] ctmTileIndexes = null;
+	public int width = 0;
+	public int height = 0;
+	public int[] weights = null;
+	public int randomLoops = 0;
+	public int symmetry = 1;
+	public boolean linked = false;
+	public NbtTagValue nbtName = null;
+	public int[] sumWeights = null;
+	public int sumAllWeights = 1;
+	public EaglerTextureAtlasSprite[] matchTileIcons = null;
+	public EaglerTextureAtlasSprite[] tileIcons = null;
+	public MatchBlock[] connectBlocks = null;
+	public String[] connectTiles = null;
+	public EaglerTextureAtlasSprite[] connectTileIcons = null;
+	public int tintIndex = -1;
+	public IBlockState tintBlockState = Blocks.air.getDefaultState();
+	public EnumWorldBlockLayer layer = null;
+	public static final int METHOD_NONE = 0;
+	public static final int METHOD_CTM = 1;
+	public static final int METHOD_HORIZONTAL = 2;
+	public static final int METHOD_TOP = 3;
+	public static final int METHOD_RANDOM = 4;
+	public static final int METHOD_REPEAT = 5;
+	public static final int METHOD_VERTICAL = 6;
+	public static final int METHOD_FIXED = 7;
+	public static final int METHOD_HORIZONTAL_VERTICAL = 8;
+	public static final int METHOD_VERTICAL_HORIZONTAL = 9;
+	public static final int METHOD_CTM_COMPACT = 10;
+	public static final int METHOD_OVERLAY = 11;
+	public static final int METHOD_OVERLAY_FIXED = 12;
+	public static final int METHOD_OVERLAY_RANDOM = 13;
+	public static final int METHOD_OVERLAY_REPEAT = 14;
+	public static final int METHOD_OVERLAY_CTM = 15;
+	public static final int CONNECT_NONE = 0;
+	public static final int CONNECT_BLOCK = 1;
+	public static final int CONNECT_TILE = 2;
+	public static final int CONNECT_MATERIAL = 3;
+	public static final int CONNECT_UNKNOWN = 128;
+	public static final int FACE_BOTTOM = 1;
+	public static final int FACE_TOP = 2;
+	public static final int FACE_NORTH = 4;
+	public static final int FACE_SOUTH = 8;
+	public static final int FACE_WEST = 16;
+	public static final int FACE_EAST = 32;
+	public static final int FACE_SIDES = 60;
+	public static final int FACE_ALL = 63;
+	public static final int FACE_UNKNOWN = 128;
+	public static final int SYMMETRY_NONE = 1;
+	public static final int SYMMETRY_OPPOSITE = 2;
+	public static final int SYMMETRY_ALL = 6;
+	public static final int SYMMETRY_UNKNOWN = 128;
+	public static final String TILE_SKIP_PNG = "<skip>.png";
+	public static final String TILE_DEFAULT_PNG = "<default>.png";
+
+	public ConnectedProperties(Properties props, String path) {
+		ConnectedParser connectedparser = new ConnectedParser("ConnectedTextures");
+		this.name = connectedparser.parseName(path);
+		this.basePath = connectedparser.parseBasePath(path);
+		this.matchBlocks = connectedparser.parseMatchBlocks(props.getProperty("matchBlocks"));
+		this.metadatas = connectedparser.parseIntList(props.getProperty("metadata"));
+		this.matchTiles = this.parseMatchTiles(props.getProperty("matchTiles"));
+		this.method = parseMethod(props.getProperty("method"));
+		this.tiles = this.parseTileNames(props.getProperty("tiles"));
+		this.connect = parseConnect(props.getProperty("connect"));
+		this.faces = parseFaces(props.getProperty("faces"));
+		this.biomes = connectedparser.parseBiomes(props.getProperty("biomes"));
+		this.heights = connectedparser.parseRangeListInt(props.getProperty("heights"));
+
+		if (this.heights == null) {
+			int i = connectedparser.parseInt(props.getProperty("minHeight"), -1);
+			int j = connectedparser.parseInt(props.getProperty("maxHeight"), 1024);
+
+			if (i != -1 || j != 1024) {
+				this.heights = new RangeListInt(new RangeInt(i, j));
+			}
+		}
+
+		this.renderPass = connectedparser.parseInt(props.getProperty("renderPass"), -1);
+		this.innerSeams = connectedparser.parseBoolean(props.getProperty("innerSeams"), false);
+		this.ctmTileIndexes = this.parseCtmTileIndexes(props);
+		this.width = connectedparser.parseInt(props.getProperty("width"), -1);
+		this.height = connectedparser.parseInt(props.getProperty("height"), -1);
+		this.weights = connectedparser.parseIntList(props.getProperty("weights"));
+		this.randomLoops = connectedparser.parseInt(props.getProperty("randomLoops"), 0);
+		this.symmetry = parseSymmetry(props.getProperty("symmetry"));
+		this.linked = connectedparser.parseBoolean(props.getProperty("linked"), false);
+		this.nbtName = connectedparser.parseNbtTagValue("name", props.getProperty("name"));
+		this.connectBlocks = connectedparser.parseMatchBlocks(props.getProperty("connectBlocks"));
+		this.connectTiles = this.parseMatchTiles(props.getProperty("connectTiles"));
+		this.tintIndex = connectedparser.parseInt(props.getProperty("tintIndex"), -1);
+		this.tintBlockState = connectedparser.parseBlockState(props.getProperty("tintBlock"),
+				Blocks.air.getDefaultState());
+		this.layer = connectedparser.parseBlockRenderLayer(props.getProperty("layer"),
+				EnumWorldBlockLayer.CUTOUT_MIPPED);
+	}
+
+	private int[] parseCtmTileIndexes(Properties props) {
+		if (this.tiles == null) {
+			return null;
+		} else {
+			Map<Integer, Integer> map = new HashMap();
+
+			for (Object object : props.keySet()) {
+				if (object instanceof String) {
+					String s = (String) object;
+					String s1 = "ctm.";
+
+					if (s.startsWith(s1)) {
+						String s2 = s.substring(s1.length());
+						String s3 = props.getProperty(s);
+
+						if (s3 != null) {
+							s3 = s3.trim();
+							int i = Config.parseInt(s2, -1);
+
+							if (i >= 0 && i <= 46) {
+								int j = Config.parseInt(s3, -1);
+
+								if (j >= 0 && j < this.tiles.length) {
+									map.put(Integer.valueOf(i), Integer.valueOf(j));
+								} else {
+									Config.warn("Invalid CTM tile index: " + s3);
+								}
+							} else {
+								Config.warn("Invalid CTM index: " + s2);
+							}
+						}
+					}
+				}
+			}
+
+			if (map.isEmpty()) {
+				return null;
+			} else {
+				int[] aint = new int[47];
+
+				for (int k = 0; k < aint.length; ++k) {
+					aint[k] = -1;
+
+					if (map.containsKey(Integer.valueOf(k))) {
+						aint[k] = ((Integer) map.get(Integer.valueOf(k))).intValue();
+					}
+				}
+
+				return aint;
+			}
+		}
+	}
+
+	private String[] parseMatchTiles(String str) {
+		if (str == null) {
+			return null;
+		} else {
+			String[] astring = Config.tokenize(str, " ");
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+
+				if (s.endsWith(".png")) {
+					s = s.substring(0, s.length() - 4);
+				}
+
+				s = TextureUtils.fixResourcePath(s, this.basePath);
+				astring[i] = s;
+			}
+
+			return astring;
+		}
+	}
+
+	private static String parseName(String path) {
+		String s = path;
+		int i = path.lastIndexOf(47);
+
+		if (i >= 0) {
+			s = path.substring(i + 1);
+		}
+
+		int j = s.lastIndexOf(46);
+
+		if (j >= 0) {
+			s = s.substring(0, j);
+		}
+
+		return s;
+	}
+
+	private static String parseBasePath(String path) {
+		int i = path.lastIndexOf(47);
+		return i < 0 ? "" : path.substring(0, i);
+	}
+
+	private String[] parseTileNames(String str) {
+		if (str == null) {
+			return null;
+		} else {
+			List list = new ArrayList();
+			String[] astring = Config.tokenize(str, " ,");
+			label32:
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+
+				if (s.contains("-")) {
+					String[] astring1 = Config.tokenize(s, "-");
+
+					if (astring1.length == 2) {
+						int j = Config.parseInt(astring1[0], -1);
+						int k = Config.parseInt(astring1[1], -1);
+
+						if (j >= 0 && k >= 0) {
+							if (j > k) {
+								Config.warn("Invalid interval: " + s + ", when parsing: " + str);
+								continue;
+							}
+
+							int l = j;
+
+							while (true) {
+								if (l > k) {
+									continue label32;
+								}
+
+								list.add(String.valueOf(l));
+								++l;
+							}
+						}
+					}
+				}
+
+				list.add(s);
+			}
+
+			String[] astring2 = (String[]) list.toArray(new String[list.size()]);
+
+			for (int i1 = 0; i1 < astring2.length; ++i1) {
+				String s1 = astring2[i1];
+				s1 = TextureUtils.fixResourcePath(s1, this.basePath);
+
+				if (!s1.startsWith(this.basePath) && !s1.startsWith("textures/") && !s1.startsWith("mcpatcher/")) {
+					s1 = this.basePath + "/" + s1;
+				}
+
+				if (s1.endsWith(".png")) {
+					s1 = s1.substring(0, s1.length() - 4);
+				}
+
+				if (s1.startsWith("/")) {
+					s1 = s1.substring(1);
+				}
+
+				astring2[i1] = s1;
+			}
+
+			return astring2;
+		}
+	}
+
+	private static int parseSymmetry(String str) {
+		if (str == null) {
+			return 1;
+		} else {
+			str = str.trim();
+
+			if (str.equals("opposite")) {
+				return 2;
+			} else if (str.equals("all")) {
+				return 6;
+			} else {
+				Config.warn("Unknown symmetry: " + str);
+				return 1;
+			}
+		}
+	}
+
+	private static int parseFaces(String str) {
+		if (str == null) {
+			return 63;
+		} else {
+			String[] astring = Config.tokenize(str, " ,");
+			int i = 0;
+
+			for (int j = 0; j < astring.length; ++j) {
+				String s = astring[j];
+				int k = parseFace(s);
+				i |= k;
+			}
+
+			return i;
+		}
+	}
+
+	private static int parseFace(String str) {
+		str = str.toLowerCase();
+
+		if (!str.equals("bottom") && !str.equals("down")) {
+			if (!str.equals("top") && !str.equals("up")) {
+				if (str.equals("north")) {
+					return 4;
+				} else if (str.equals("south")) {
+					return 8;
+				} else if (str.equals("east")) {
+					return 32;
+				} else if (str.equals("west")) {
+					return 16;
+				} else if (str.equals("sides")) {
+					return 60;
+				} else if (str.equals("all")) {
+					return 63;
+				} else {
+					Config.warn("Unknown face: " + str);
+					return 128;
+				}
+			} else {
+				return 2;
+			}
+		} else {
+			return 1;
+		}
+	}
+
+	private static int parseConnect(String str) {
+		if (str == null) {
+			return 0;
+		} else {
+			str = str.trim();
+
+			if (str.equals("block")) {
+				return 1;
+			} else if (str.equals("tile")) {
+				return 2;
+			} else if (str.equals("material")) {
+				return 3;
+			} else {
+				Config.warn("Unknown connect: " + str);
+				return 128;
+			}
+		}
+	}
+
+	public static IProperty getProperty(String key, Collection properties) {
+		for (Object iproperty0 : properties) {
+			IProperty iproperty = (IProperty) iproperty0;
+			if (key.equals(iproperty.getName())) {
+				return iproperty;
+			}
+		}
+
+		return null;
+	}
+
+	private static int parseMethod(String str) {
+		if (str == null) {
+			return 1;
+		} else {
+			str = str.trim();
+
+			if (!str.equals("ctm") && !str.equals("glass")) {
+				if (str.equals("ctm_compact")) {
+					return 10;
+				} else if (!str.equals("horizontal") && !str.equals("bookshelf")) {
+					if (str.equals("vertical")) {
+						return 6;
+					} else if (str.equals("top")) {
+						return 3;
+					} else if (str.equals("random")) {
+						return 4;
+					} else if (str.equals("repeat")) {
+						return 5;
+					} else if (str.equals("fixed")) {
+						return 7;
+					} else if (!str.equals("horizontal+vertical") && !str.equals("h+v")) {
+						if (!str.equals("vertical+horizontal") && !str.equals("v+h")) {
+							if (str.equals("overlay")) {
+								return 11;
+							} else if (str.equals("overlay_fixed")) {
+								return 12;
+							} else if (str.equals("overlay_random")) {
+								return 13;
+							} else if (str.equals("overlay_repeat")) {
+								return 14;
+							} else if (str.equals("overlay_ctm")) {
+								return 15;
+							} else {
+								Config.warn("Unknown method: " + str);
+								return 0;
+							}
+						} else {
+							return 9;
+						}
+					} else {
+						return 8;
+					}
+				} else {
+					return 2;
+				}
+			} else {
+				return 1;
+			}
+		}
+	}
+
+	public boolean isValid(String path) {
+		if (this.name != null && this.name.length() > 0) {
+			if (this.basePath == null) {
+				Config.warn("No base path found: " + path);
+				return false;
+			} else {
+				if (this.matchBlocks == null) {
+					this.matchBlocks = this.detectMatchBlocks();
+				}
+
+				if (this.matchTiles == null && this.matchBlocks == null) {
+					this.matchTiles = this.detectMatchTiles();
+				}
+
+				if (this.matchBlocks == null && this.matchTiles == null) {
+					Config.warn("No matchBlocks or matchTiles specified: " + path);
+					return false;
+				} else if (this.method == 0) {
+					Config.warn("No method: " + path);
+					return false;
+				} else if (this.tiles != null && this.tiles.length > 0) {
+					if (this.connect == 0) {
+						this.connect = this.detectConnect();
+					}
+
+					if (this.connect == 128) {
+						Config.warn("Invalid connect in: " + path);
+						return false;
+					} else if (this.renderPass > 0) {
+						Config.warn("Render pass not supported: " + this.renderPass);
+						return false;
+					} else if ((this.faces & 128) != 0) {
+						Config.warn("Invalid faces in: " + path);
+						return false;
+					} else if ((this.symmetry & 128) != 0) {
+						Config.warn("Invalid symmetry in: " + path);
+						return false;
+					} else {
+						switch (this.method) {
+						case 1:
+							return this.isValidCtm(path);
+
+						case 2:
+							return this.isValidHorizontal(path);
+
+						case 3:
+							return this.isValidTop(path);
+
+						case 4:
+							return this.isValidRandom(path);
+
+						case 5:
+							return this.isValidRepeat(path);
+
+						case 6:
+							return this.isValidVertical(path);
+
+						case 7:
+							return this.isValidFixed(path);
+
+						case 8:
+							return this.isValidHorizontalVertical(path);
+
+						case 9:
+							return this.isValidVerticalHorizontal(path);
+
+						case 10:
+							return this.isValidCtmCompact(path);
+
+						case 11:
+							return this.isValidOverlay(path);
+
+						case 12:
+							return this.isValidOverlayFixed(path);
+
+						case 13:
+							return this.isValidOverlayRandom(path);
+
+						case 14:
+							return this.isValidOverlayRepeat(path);
+
+						case 15:
+							return this.isValidOverlayCtm(path);
+
+						default:
+							Config.warn("Unknown method: " + path);
+							return false;
+						}
+					}
+				} else {
+					Config.warn("No tiles specified: " + path);
+					return false;
+				}
+			}
+		} else {
+			Config.warn("No name found: " + path);
+			return false;
+		}
+	}
+
+	private int detectConnect() {
+		return this.matchBlocks != null ? 1 : (this.matchTiles != null ? 2 : 128);
+	}
+
+	private MatchBlock[] detectMatchBlocks() {
+		int[] aint = this.detectMatchBlockIds();
+
+		if (aint == null) {
+			return null;
+		} else {
+			MatchBlock[] amatchblock = new MatchBlock[aint.length];
+
+			for (int i = 0; i < amatchblock.length; ++i) {
+				amatchblock[i] = new MatchBlock(aint[i]);
+			}
+
+			return amatchblock;
+		}
+	}
+
+	private int[] detectMatchBlockIds() {
+		if (!this.name.startsWith("block")) {
+			return null;
+		} else {
+			int i = "block".length();
+			int j;
+
+			for (j = i; j < this.name.length(); ++j) {
+				char c0 = this.name.charAt(j);
+
+				if (c0 < 48 || c0 > 57) {
+					break;
+				}
+			}
+
+			if (j == i) {
+				return null;
+			} else {
+				String s = this.name.substring(i, j);
+				int k = Config.parseInt(s, -1);
+				return k < 0 ? null : new int[] { k };
+			}
+		}
+	}
+
+	private String[] detectMatchTiles() {
+		EaglerTextureAtlasSprite textureatlassprite = getIcon(this.name);
+		return textureatlassprite == null ? null : new String[] { this.name };
+	}
+
+	private static EaglerTextureAtlasSprite getIcon(String iconName) {
+		TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
+		EaglerTextureAtlasSprite textureatlassprite = texturemap.getSpriteSafe(iconName);
+
+		if (textureatlassprite != null) {
+			return textureatlassprite;
+		} else {
+			textureatlassprite = texturemap.getSpriteSafe("blocks/" + iconName);
+			return textureatlassprite;
+		}
+	}
+
+	private boolean isValidCtm(String path) {
+		if (this.tiles == null) {
+			this.tiles = this.parseTileNames("0-11 16-27 32-43 48-58");
+		}
+
+		if (this.tiles.length < 47) {
+			Config.warn("Invalid tiles, must be at least 47: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidCtmCompact(String path) {
+		if (this.tiles == null) {
+			this.tiles = this.parseTileNames("0-4");
+		}
+
+		if (this.tiles.length < 5) {
+			Config.warn("Invalid tiles, must be at least 5: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidOverlay(String path) {
+		if (this.tiles == null) {
+			this.tiles = this.parseTileNames("0-16");
+		}
+
+		if (this.tiles.length < 17) {
+			Config.warn("Invalid tiles, must be at least 17: " + path);
+			return false;
+		} else if (this.layer != null && this.layer != EnumWorldBlockLayer.SOLID) {
+			return true;
+		} else {
+			Config.warn("Invalid overlay layer: " + this.layer);
+			return false;
+		}
+	}
+
+	private boolean isValidOverlayFixed(String path) {
+		if (!this.isValidFixed(path)) {
+			return false;
+		} else if (this.layer != null && this.layer != EnumWorldBlockLayer.SOLID) {
+			return true;
+		} else {
+			Config.warn("Invalid overlay layer: " + this.layer);
+			return false;
+		}
+	}
+
+	private boolean isValidOverlayRandom(String path) {
+		if (!this.isValidRandom(path)) {
+			return false;
+		} else if (this.layer != null && this.layer != EnumWorldBlockLayer.SOLID) {
+			return true;
+		} else {
+			Config.warn("Invalid overlay layer: " + this.layer);
+			return false;
+		}
+	}
+
+	private boolean isValidOverlayRepeat(String path) {
+		if (!this.isValidRepeat(path)) {
+			return false;
+		} else if (this.layer != null && this.layer != EnumWorldBlockLayer.SOLID) {
+			return true;
+		} else {
+			Config.warn("Invalid overlay layer: " + this.layer);
+			return false;
+		}
+	}
+
+	private boolean isValidOverlayCtm(String path) {
+		if (!this.isValidCtm(path)) {
+			return false;
+		} else if (this.layer != null && this.layer != EnumWorldBlockLayer.SOLID) {
+			return true;
+		} else {
+			Config.warn("Invalid overlay layer: " + this.layer);
+			return false;
+		}
+	}
+
+	private boolean isValidHorizontal(String path) {
+		if (this.tiles == null) {
+			this.tiles = this.parseTileNames("12-15");
+		}
+
+		if (this.tiles.length != 4) {
+			Config.warn("Invalid tiles, must be exactly 4: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidVertical(String path) {
+		if (this.tiles == null) {
+			Config.warn("No tiles defined for vertical: " + path);
+			return false;
+		} else if (this.tiles.length != 4) {
+			Config.warn("Invalid tiles, must be exactly 4: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidHorizontalVertical(String path) {
+		if (this.tiles == null) {
+			Config.warn("No tiles defined for horizontal+vertical: " + path);
+			return false;
+		} else if (this.tiles.length != 7) {
+			Config.warn("Invalid tiles, must be exactly 7: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidVerticalHorizontal(String path) {
+		if (this.tiles == null) {
+			Config.warn("No tiles defined for vertical+horizontal: " + path);
+			return false;
+		} else if (this.tiles.length != 7) {
+			Config.warn("Invalid tiles, must be exactly 7: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidRandom(String path) {
+		if (this.tiles != null && this.tiles.length > 0) {
+			if (this.weights != null) {
+				if (this.weights.length > this.tiles.length) {
+					Config.warn("More weights defined than tiles, trimming weights: " + path);
+					int[] aint = new int[this.tiles.length];
+					System.arraycopy(this.weights, 0, aint, 0, aint.length);
+					this.weights = aint;
+				}
+
+				if (this.weights.length < this.tiles.length) {
+					Config.warn("Less weights defined than tiles, expanding weights: " + path);
+					int[] aint1 = new int[this.tiles.length];
+					System.arraycopy(this.weights, 0, aint1, 0, this.weights.length);
+					int i = MathUtils.getAverage(this.weights);
+
+					for (int j = this.weights.length; j < aint1.length; ++j) {
+						aint1[j] = i;
+					}
+
+					this.weights = aint1;
+				}
+
+				this.sumWeights = new int[this.weights.length];
+				int k = 0;
+
+				for (int l = 0; l < this.weights.length; ++l) {
+					k += this.weights[l];
+					this.sumWeights[l] = k;
+				}
+
+				this.sumAllWeights = k;
+
+				if (this.sumAllWeights <= 0) {
+					Config.warn("Invalid sum of all weights: " + k);
+					this.sumAllWeights = 1;
+				}
+			}
+
+			if (this.randomLoops >= 0 && this.randomLoops <= 9) {
+				return true;
+			} else {
+				Config.warn("Invalid randomLoops: " + this.randomLoops);
+				return false;
+			}
+		} else {
+			Config.warn("Tiles not defined: " + path);
+			return false;
+		}
+	}
+
+	private boolean isValidRepeat(String path) {
+		if (this.tiles == null) {
+			Config.warn("Tiles not defined: " + path);
+			return false;
+		} else if (this.width <= 0) {
+			Config.warn("Invalid width: " + path);
+			return false;
+		} else if (this.height <= 0) {
+			Config.warn("Invalid height: " + path);
+			return false;
+		} else if (this.tiles.length != this.width * this.height) {
+			Config.warn("Number of tiles does not equal width x height: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidFixed(String path) {
+		if (this.tiles == null) {
+			Config.warn("Tiles not defined: " + path);
+			return false;
+		} else if (this.tiles.length != 1) {
+			Config.warn("Number of tiles should be 1 for method: fixed.");
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	private boolean isValidTop(String path) {
+		if (this.tiles == null) {
+			this.tiles = this.parseTileNames("66");
+		}
+
+		if (this.tiles.length != 1) {
+			Config.warn("Invalid tiles, must be exactly 1: " + path);
+			return false;
+		} else {
+			return true;
+		}
+	}
+
+	public void updateIcons(TextureMap textureMap) {
+		String baseName = null;
+		if (this.matchTiles != null) {
+			this.matchTileIcons = registerIcons(this.matchTiles, null, textureMap, false, false);
+			if(this.matchTiles.length > 0) {
+				baseName = "blocks/" + this.matchTiles[0];
+			}
+		}
+
+		if(baseName == null) {
+			int blockBaseID = -1;
+			int metaBase = -1;
+			if(this.matchBlocks != null && this.matchBlocks.length > 0) {
+				MatchBlock b = this.matchBlocks[0];
+				blockBaseID = b.getBlockId();
+				int[] metas = b.getMetadatas();
+				if(metas != null && metas.length > 0) {
+					metaBase = metas[0];
+				}
+			}
+			if(blockBaseID != -1) {
+				if(metaBase == -1 && this.metadatas != null && this.metadatas.length > 0) {
+					metaBase = this.metadatas[0];
+				}
+				if(metaBase == -1) {
+					metaBase = 0;
+				}
+				baseName = Minecraft.getMinecraft().getModelManager().modelbakerytmp.getBaseTextureForBlockPre(blockBaseID, metaBase);
+			}
+		}
+
+		if (this.connectTiles != null) {
+			this.connectTileIcons = registerIcons(this.connectTiles, baseName, textureMap, false, false);
+		}
+
+		if (this.tiles != null) {
+			this.tileIcons = registerIcons(this.tiles, baseName, textureMap, true, !isMethodOverlay(this.method));
+		}
+	}
+
+	private static boolean isMethodOverlay(int method) {
+		switch (method) {
+		case 11:
+		case 12:
+		case 13:
+		case 14:
+		case 15:
+			return true;
+
+		default:
+			return false;
+		}
+	}
+
+	private static EaglerTextureAtlasSprite[] registerIcons(String[] tileNames, String baseName,
+			TextureMap textureMap, boolean skipTiles, boolean defaultTiles) {
+		if (tileNames == null) {
+			return null;
+		} else {
+			List list = new ArrayList();
+
+			for (int i = 0; i < tileNames.length; ++i) {
+				String s = tileNames[i];
+				ResourceLocation resourcelocation = new ResourceLocation(s);
+				String s1 = resourcelocation.getResourceDomain();
+				String s2 = resourcelocation.getResourcePath();
+
+				if (!s2.contains("/")) {
+					s2 = "textures/blocks/" + s2;
+				}
+
+				String s3 = s2 + ".png";
+
+				if (skipTiles && s3.endsWith("<skip>.png")) {
+					list.add(null);
+				} else if (defaultTiles && s3.endsWith("<default>.png")) {
+					list.add(ConnectedTextures.SPRITE_DEFAULT);
+				} else {
+					ResourceLocation resourcelocation1 = new ResourceLocation(s1, s3);
+					boolean flag = Config.hasResource(resourcelocation1);
+
+					if (!flag) {
+						Config.warn("File not found: " + s3);
+					}
+
+					String s4 = "textures/";
+					String s5 = s2;
+
+					if (s2.startsWith(s4)) {
+						s5 = s2.substring(s4.length());
+					}
+
+					ResourceLocation resourcelocation2 = new ResourceLocation(s1, s5);
+					EaglerTextureAtlasSprite textureatlassprite = textureMap.registerSprite(resourcelocation2, baseName);
+					list.add(textureatlassprite);
+				}
+			}
+
+			EaglerTextureAtlasSprite[] atextureatlassprite = (EaglerTextureAtlasSprite[]) list
+					.toArray(new EaglerTextureAtlasSprite[list.size()]);
+			return atextureatlassprite;
+		}
+	}
+
+	public boolean matchesBlockId(int blockId) {
+		return Matches.blockId(blockId, this.matchBlocks);
+	}
+
+	public boolean matchesBlock(int blockId, int metadata) {
+		return !Matches.block(blockId, metadata, this.matchBlocks) ? false : Matches.metadata(metadata, this.metadatas);
+	}
+
+	public boolean matchesIcon(EaglerTextureAtlasSprite icon) {
+		return Matches.sprite(icon, this.matchTileIcons);
+	}
+
+	public String toString() {
+		return "CTM name: " + this.name + ", basePath: " + this.basePath + ", matchBlocks: "
+				+ Config.arrayToString((Object[]) this.matchBlocks) + ", matchTiles: "
+				+ Config.arrayToString((Object[]) this.matchTiles);
+	}
+
+	public boolean matchesBiome(BiomeGenBase biome) {
+		return Matches.biome(biome, this.biomes);
+	}
+
+	public int getMetadataMax() {
+		int i = -1;
+		i = this.getMax(this.metadatas, i);
+
+		if (this.matchBlocks != null) {
+			for (int j = 0; j < this.matchBlocks.length; ++j) {
+				MatchBlock matchblock = this.matchBlocks[j];
+				i = this.getMax(matchblock.getMetadatas(), i);
+			}
+		}
+
+		return i;
+	}
+
+	private int getMax(int[] mds, int max) {
+		if (mds == null) {
+			return max;
+		} else {
+			for (int i = 0; i < mds.length; ++i) {
+				int j = mds[i];
+
+				if (j > max) {
+					max = j;
+				}
+			}
+
+			return max;
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/ConnectedTextures.java b/sources/main/java/net/optifine/ConnectedTextures.java
new file mode 100644
index 00000000..374da246
--- /dev/null
+++ b/sources/main/java/net/optifine/ConnectedTextures.java
@@ -0,0 +1,2102 @@
+package net.optifine;
+
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import net.lax1dude.eaglercraft.v1_8.IOUtils;
+import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockGlass;
+import net.minecraft.block.BlockPane;
+import net.minecraft.block.BlockQuartz;
+import net.minecraft.block.BlockRotatedPillar;
+import net.minecraft.block.BlockStainedGlass;
+import net.minecraft.block.BlockStainedGlassPane;
+import net.minecraft.block.state.BlockStateBase;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.resources.IResourcePack;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.optifine.config.Matches;
+import net.optifine.model.BlockModelUtils;
+import net.optifine.model.ListQuadsOverlay;
+import net.optifine.render.RenderEnv;
+import net.optifine.util.PropertiesOrdered;
+import net.optifine.util.ResUtils;
+import net.optifine.util.TileEntityUtils;
+
+public class ConnectedTextures {
+	private static Map[] spriteQuadMaps = null;
+	private static Map[] spriteQuadFullMaps = null;
+	private static Map[][] spriteQuadCompactMaps = (Map[][]) null;
+	private static ConnectedProperties[][] blockProperties = (ConnectedProperties[][]) null;
+	private static ConnectedProperties[][] tileProperties = (ConnectedProperties[][]) null;
+	private static boolean multipass = false;
+	protected static final int UNKNOWN = -1;
+	protected static final int Y_NEG_DOWN = 0;
+	protected static final int Y_POS_UP = 1;
+	protected static final int Z_NEG_NORTH = 2;
+	protected static final int Z_POS_SOUTH = 3;
+	protected static final int X_NEG_WEST = 4;
+	protected static final int X_POS_EAST = 5;
+	private static final int Y_AXIS = 0;
+	private static final int Z_AXIS = 1;
+	private static final int X_AXIS = 2;
+	public static final IBlockState AIR_DEFAULT_STATE = Blocks.air.getDefaultState();
+	private static EaglerTextureAtlasSprite emptySprite = null;
+	private static final BlockDir[] SIDES_Y_NEG_DOWN = new BlockDir[] { BlockDir.WEST, BlockDir.EAST, BlockDir.NORTH,
+			BlockDir.SOUTH };
+	private static final BlockDir[] SIDES_Y_POS_UP = new BlockDir[] { BlockDir.WEST, BlockDir.EAST, BlockDir.SOUTH,
+			BlockDir.NORTH };
+	private static final BlockDir[] SIDES_Z_NEG_NORTH = new BlockDir[] { BlockDir.EAST, BlockDir.WEST, BlockDir.DOWN,
+			BlockDir.UP };
+	private static final BlockDir[] SIDES_Z_POS_SOUTH = new BlockDir[] { BlockDir.WEST, BlockDir.EAST, BlockDir.DOWN,
+			BlockDir.UP };
+	private static final BlockDir[] SIDES_X_NEG_WEST = new BlockDir[] { BlockDir.NORTH, BlockDir.SOUTH, BlockDir.DOWN,
+			BlockDir.UP };
+	private static final BlockDir[] SIDES_X_POS_EAST = new BlockDir[] { BlockDir.SOUTH, BlockDir.NORTH, BlockDir.DOWN,
+			BlockDir.UP };
+	private static final BlockDir[] SIDES_Z_NEG_NORTH_Z_AXIS = new BlockDir[] { BlockDir.WEST, BlockDir.EAST,
+			BlockDir.UP, BlockDir.DOWN };
+	private static final BlockDir[] SIDES_X_POS_EAST_X_AXIS = new BlockDir[] { BlockDir.NORTH, BlockDir.SOUTH,
+			BlockDir.UP, BlockDir.DOWN };
+	private static final BlockDir[] EDGES_Y_NEG_DOWN = new BlockDir[] { BlockDir.NORTH_EAST, BlockDir.NORTH_WEST,
+			BlockDir.SOUTH_EAST, BlockDir.SOUTH_WEST };
+	private static final BlockDir[] EDGES_Y_POS_UP = new BlockDir[] { BlockDir.SOUTH_EAST, BlockDir.SOUTH_WEST,
+			BlockDir.NORTH_EAST, BlockDir.NORTH_WEST };
+	private static final BlockDir[] EDGES_Z_NEG_NORTH = new BlockDir[] { BlockDir.DOWN_WEST, BlockDir.DOWN_EAST,
+			BlockDir.UP_WEST, BlockDir.UP_EAST };
+	private static final BlockDir[] EDGES_Z_POS_SOUTH = new BlockDir[] { BlockDir.DOWN_EAST, BlockDir.DOWN_WEST,
+			BlockDir.UP_EAST, BlockDir.UP_WEST };
+	private static final BlockDir[] EDGES_X_NEG_WEST = new BlockDir[] { BlockDir.DOWN_SOUTH, BlockDir.DOWN_NORTH,
+			BlockDir.UP_SOUTH, BlockDir.UP_NORTH };
+	private static final BlockDir[] EDGES_X_POS_EAST = new BlockDir[] { BlockDir.DOWN_NORTH, BlockDir.DOWN_SOUTH,
+			BlockDir.UP_NORTH, BlockDir.UP_SOUTH };
+	private static final BlockDir[] EDGES_Z_NEG_NORTH_Z_AXIS = new BlockDir[] { BlockDir.UP_EAST, BlockDir.UP_WEST,
+			BlockDir.DOWN_EAST, BlockDir.DOWN_WEST };
+	private static final BlockDir[] EDGES_X_POS_EAST_X_AXIS = new BlockDir[] { BlockDir.UP_SOUTH, BlockDir.UP_NORTH,
+			BlockDir.DOWN_SOUTH, BlockDir.DOWN_NORTH };
+	public static final EaglerTextureAtlasSprite SPRITE_DEFAULT = new EaglerTextureAtlasSprite("<default>");
+
+	public static BakedQuad[] getConnectedTexture(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
+			BakedQuad quad, RenderEnv renderEnv) {
+		EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+
+		if (textureatlassprite == null) {
+			return renderEnv.getArrayQuadsCtm(quad);
+		} else {
+			Block block = blockState.getBlock();
+
+			if (skipConnectedTexture(blockAccess, blockState, blockPos, quad, renderEnv)) {
+				quad = getQuad(emptySprite, quad);
+				return renderEnv.getArrayQuadsCtm(quad);
+			} else {
+				EnumFacing enumfacing = quad.getFace();
+				BakedQuad[] abakedquad = getConnectedTextureMultiPass(blockAccess, blockState, blockPos, enumfacing,
+						quad, renderEnv);
+				return abakedquad;
+			}
+		}
+	}
+
+	private static boolean skipConnectedTexture(IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos,
+			BakedQuad quad, RenderEnv renderEnv) {
+		Block block = blockState.getBlock();
+
+		if (block instanceof BlockPane) {
+			EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+
+			if (textureatlassprite.getIconName().startsWith("minecraft:blocks/glass_pane_top")) {
+				IBlockState iblockstate1 = blockAccess.getBlockState(blockPos.offset(quad.getFace()));
+				return iblockstate1 == blockState;
+			}
+		}
+
+		if (block instanceof BlockPane) {
+			EnumFacing enumfacing = quad.getFace();
+
+			if (enumfacing != EnumFacing.UP && enumfacing != EnumFacing.DOWN) {
+				return false;
+			}
+
+			if (!quad.isFaceQuad()) {
+				return false;
+			}
+
+			BlockPos blockpos = blockPos.offset(quad.getFace());
+			IBlockState iblockstate = blockAccess.getBlockState(blockpos);
+
+			if (iblockstate.getBlock() != block) {
+				return false;
+			}
+
+			if (block == Blocks.stained_glass_pane && iblockstate.getValue(BlockStainedGlassPane.COLOR) != blockState
+					.getValue(BlockStainedGlassPane.COLOR)) {
+				return false;
+			}
+
+			iblockstate = iblockstate.getBlock().getActualState(iblockstate, blockAccess, blockpos);
+			double d0 = (double) quad.getMidX();
+
+			if (d0 < 0.4D) {
+				if (((Boolean) iblockstate.getValue(BlockPane.WEST)).booleanValue()) {
+					return true;
+				}
+			} else if (d0 > 0.6D) {
+				if (((Boolean) iblockstate.getValue(BlockPane.EAST)).booleanValue()) {
+					return true;
+				}
+			} else {
+				double d1 = quad.getMidZ();
+
+				if (d1 < 0.4D) {
+					if (((Boolean) iblockstate.getValue(BlockPane.NORTH)).booleanValue()) {
+						return true;
+					}
+				} else {
+					if (d1 <= 0.6D) {
+						return true;
+					}
+
+					if (((Boolean) iblockstate.getValue(BlockPane.SOUTH)).booleanValue()) {
+						return true;
+					}
+				}
+			}
+		}
+
+		return false;
+	}
+
+	protected static BakedQuad[] getQuads(EaglerTextureAtlasSprite sprite, BakedQuad quadIn, RenderEnv renderEnv) {
+		if (sprite == null) {
+			return null;
+		} else if (sprite == SPRITE_DEFAULT) {
+			return renderEnv.getArrayQuadsCtm(quadIn);
+		} else {
+			BakedQuad bakedquad = getQuad(sprite, quadIn);
+			BakedQuad[] abakedquad = renderEnv.getArrayQuadsCtm(bakedquad);
+			return abakedquad;
+		}
+	}
+
+	private static synchronized BakedQuad getQuad(EaglerTextureAtlasSprite sprite, BakedQuad quadIn) {
+		if (spriteQuadMaps == null) {
+			return quadIn;
+		} else {
+			int i = sprite.getIndexInMap();
+
+			if (i >= 0 && i < spriteQuadMaps.length) {
+				Map map = spriteQuadMaps[i];
+
+				if (map == null) {
+					map = new IdentityHashMap(1);
+					spriteQuadMaps[i] = map;
+				}
+
+				BakedQuad bakedquad = (BakedQuad) map.get(quadIn);
+
+				if (bakedquad == null) {
+					bakedquad = makeSpriteQuad(quadIn, sprite);
+					map.put(quadIn, bakedquad);
+				}
+
+				return bakedquad;
+			} else {
+				return quadIn;
+			}
+		}
+	}
+
+	private static synchronized BakedQuad getQuadFull(EaglerTextureAtlasSprite sprite, BakedQuad quadIn,
+			int tintIndex) {
+		if (spriteQuadFullMaps == null) {
+			return null;
+		} else if (sprite == null) {
+			return null;
+		} else {
+			int i = sprite.getIndexInMap();
+
+			if (i >= 0 && i < spriteQuadFullMaps.length) {
+				Map map = spriteQuadFullMaps[i];
+
+				if (map == null) {
+					map = new EnumMap(EnumFacing.class);
+					spriteQuadFullMaps[i] = map;
+				}
+
+				EnumFacing enumfacing = quadIn.getFace();
+				BakedQuad bakedquad = (BakedQuad) map.get(enumfacing);
+
+				if (bakedquad == null) {
+					bakedquad = BlockModelUtils.makeBakedQuad(enumfacing, sprite, tintIndex);
+					map.put(enumfacing, bakedquad);
+				}
+
+				return bakedquad;
+			} else {
+				return null;
+			}
+		}
+	}
+
+	private static BakedQuad makeSpriteQuad(BakedQuad quad, EaglerTextureAtlasSprite sprite) {
+		int[] aint = (int[]) quad.getVertexData().clone();
+		int[] aint2 = (int[]) quad.getVertexDataWithNormals().clone();
+		EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+
+		for (int i = 0; i < 4; ++i) {
+			fixVertex(aint, aint2, i, textureatlassprite, sprite);
+		}
+
+		BakedQuad bakedquad = new BakedQuad(aint, aint2, quad.getTintIndex(), quad.getFace(), sprite);
+		return bakedquad;
+	}
+
+	private static void fixVertex(int[] data, int[] data2, int vertex, EaglerTextureAtlasSprite spriteFrom,
+			EaglerTextureAtlasSprite spriteTo) {
+		int i = data.length / 4;
+		int j = i * vertex;
+		int i2 = data2.length / 4;
+		int j2 = i2 * vertex;
+		float f = Float.intBitsToFloat(data[j + 4]);
+		float f1 = Float.intBitsToFloat(data[j + 4 + 1]);
+		double d0 = spriteFrom.getSpriteU16(f);
+		double d1 = spriteFrom.getSpriteV16(f1);
+		data[j + 4] = data2[j2 + 4] = Float.floatToRawIntBits(spriteTo.getInterpolatedU(d0));
+		data[j + 4 + 1] = data2[j2 + 4 + 1] = Float.floatToRawIntBits(spriteTo.getInterpolatedV(d1));
+	}
+
+	private static BakedQuad[] getConnectedTextureMultiPass(IBlockAccess blockAccess, IBlockState blockState,
+			BlockPos blockPos, EnumFacing side, BakedQuad quad, RenderEnv renderEnv) {
+		BakedQuad[] abakedquad = getConnectedTextureSingle(blockAccess, blockState, blockPos, side, quad, true, 0,
+				renderEnv);
+
+		if (!multipass) {
+			return abakedquad;
+		} else if (abakedquad.length == 1 && abakedquad[0] == quad) {
+			return abakedquad;
+		} else {
+			List<BakedQuad> list = renderEnv.getListQuadsCtmMultipass(abakedquad);
+
+			for (int i = 0; i < list.size(); ++i) {
+				BakedQuad bakedquad = (BakedQuad) list.get(i);
+				BakedQuad bakedquad1 = bakedquad;
+
+				for (int j = 0; j < 3; ++j) {
+					BakedQuad[] abakedquad1 = getConnectedTextureSingle(blockAccess, blockState, blockPos, side,
+							bakedquad1, false, j + 1, renderEnv);
+
+					if (abakedquad1.length != 1 || abakedquad1[0] == bakedquad1) {
+						break;
+					}
+
+					bakedquad1 = abakedquad1[0];
+				}
+
+				list.set(i, bakedquad1);
+			}
+
+			for (int k = 0; k < abakedquad.length; ++k) {
+				abakedquad[k] = (BakedQuad) list.get(k);
+			}
+
+			return abakedquad;
+		}
+	}
+
+	public static BakedQuad[] getConnectedTextureSingle(IBlockAccess blockAccess, IBlockState blockState,
+			BlockPos blockPos, EnumFacing facing, BakedQuad quad, boolean checkBlocks, int pass, RenderEnv renderEnv) {
+		Block block = blockState.getBlock();
+
+		if (!(blockState instanceof BlockStateBase)) {
+			return renderEnv.getArrayQuadsCtm(quad);
+		} else {
+			BlockStateBase blockstatebase = (BlockStateBase) blockState;
+			EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+
+			if (tileProperties != null) {
+				int i = textureatlassprite.getIndexInMap();
+
+				if (i >= 0 && i < tileProperties.length) {
+					ConnectedProperties[] aconnectedproperties = tileProperties[i];
+
+					if (aconnectedproperties != null) {
+						int j = getSide(facing);
+
+						for (int k = 0; k < aconnectedproperties.length; ++k) {
+							ConnectedProperties connectedproperties = aconnectedproperties[k];
+
+							if (connectedproperties != null
+									&& connectedproperties.matchesBlockId(blockstatebase.getBlockId())) {
+								BakedQuad[] abakedquad = getConnectedTexture(connectedproperties, blockAccess,
+										blockstatebase, blockPos, j, quad, pass, renderEnv);
+
+								if (abakedquad != null) {
+									return abakedquad;
+								}
+							}
+						}
+					}
+				}
+			}
+
+			if (blockProperties != null && checkBlocks) {
+				int l = renderEnv.getBlockId();
+
+				if (l >= 0 && l < blockProperties.length) {
+					ConnectedProperties[] aconnectedproperties1 = blockProperties[l];
+
+					if (aconnectedproperties1 != null) {
+						int i1 = getSide(facing);
+
+						for (int j1 = 0; j1 < aconnectedproperties1.length; ++j1) {
+							ConnectedProperties connectedproperties1 = aconnectedproperties1[j1];
+
+							if (connectedproperties1 != null && connectedproperties1.matchesIcon(textureatlassprite)) {
+								BakedQuad[] abakedquad1 = getConnectedTexture(connectedproperties1, blockAccess,
+										blockstatebase, blockPos, i1, quad, pass, renderEnv);
+
+								if (abakedquad1 != null) {
+									return abakedquad1;
+								}
+							}
+						}
+					}
+				}
+			}
+
+			return renderEnv.getArrayQuadsCtm(quad);
+		}
+	}
+
+	public static int getSide(EnumFacing facing) {
+		if (facing == null) {
+			return -1;
+		} else {
+			switch (facing) {
+			case DOWN:
+				return 0;
+
+			case UP:
+				return 1;
+
+			case EAST:
+				return 5;
+
+			case WEST:
+				return 4;
+
+			case NORTH:
+				return 2;
+
+			case SOUTH:
+				return 3;
+
+			default:
+				return -1;
+			}
+		}
+	}
+
+	private static EnumFacing getFacing(int side) {
+		switch (side) {
+		case 0:
+			return EnumFacing.DOWN;
+
+		case 1:
+			return EnumFacing.UP;
+
+		case 2:
+			return EnumFacing.NORTH;
+
+		case 3:
+			return EnumFacing.SOUTH;
+
+		case 4:
+			return EnumFacing.WEST;
+
+		case 5:
+			return EnumFacing.EAST;
+
+		default:
+			return EnumFacing.UP;
+		}
+	}
+
+	private static BakedQuad[] getConnectedTexture(ConnectedProperties cp, IBlockAccess blockAccess,
+			BlockStateBase blockState, BlockPos blockPos, int side, BakedQuad quad, int pass, RenderEnv renderEnv) {
+		int i = 0;
+		int j = blockState.getMetadata();
+		int k = j;
+		Block block = blockState.getBlock();
+
+		if (block instanceof BlockRotatedPillar) {
+			i = getWoodAxis(side, j);
+
+			if (cp.getMetadataMax() <= 3) {
+				k = j & 3;
+			}
+		}
+
+		if (block instanceof BlockQuartz) {
+			i = getQuartzAxis(side, j);
+
+			if (cp.getMetadataMax() <= 2 && k > 2) {
+				k = 2;
+			}
+		}
+
+		if (!cp.matchesBlock(blockState.getBlockId(), k)) {
+			return null;
+		} else {
+			if (side >= 0 && cp.faces != 63) {
+				int l = side;
+
+				if (i != 0) {
+					l = fixSideByAxis(side, i);
+				}
+
+				if ((1 << l & cp.faces) == 0) {
+					return null;
+				}
+			}
+
+			int i1 = blockPos.getY();
+
+			if (cp.heights != null && !cp.heights.isInRange(i1)) {
+				return null;
+			} else {
+				if (cp.biomes != null) {
+					BiomeGenBase biomegenbase = blockAccess.getBiomeGenForCoords(blockPos);
+
+					if (!cp.matchesBiome(biomegenbase)) {
+						return null;
+					}
+				}
+
+				if (cp.nbtName != null) {
+					String s = TileEntityUtils.getTileEntityName(blockAccess, blockPos);
+
+					if (!cp.nbtName.matchesValue(s)) {
+						return null;
+					}
+				}
+
+				EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+
+				switch (cp.method) {
+				case 1:
+					return getQuads(getConnectedTextureCtm(cp, blockAccess, blockState, blockPos, i, side,
+							textureatlassprite, j, renderEnv), quad, renderEnv);
+
+				case 2:
+					return getQuads(getConnectedTextureHorizontal(cp, blockAccess, blockState, blockPos, i, side,
+							textureatlassprite, j), quad, renderEnv);
+
+				case 3:
+					return getQuads(getConnectedTextureTop(cp, blockAccess, blockState, blockPos, i, side,
+							textureatlassprite, j), quad, renderEnv);
+
+				case 4:
+					return getQuads(getConnectedTextureRandom(cp, blockAccess, blockState, blockPos, side), quad,
+							renderEnv);
+
+				case 5:
+					return getQuads(getConnectedTextureRepeat(cp, blockPos, side), quad, renderEnv);
+
+				case 6:
+					return getQuads(getConnectedTextureVertical(cp, blockAccess, blockState, blockPos, i, side,
+							textureatlassprite, j), quad, renderEnv);
+
+				case 7:
+					return getQuads(getConnectedTextureFixed(cp), quad, renderEnv);
+
+				case 8:
+					return getQuads(getConnectedTextureHorizontalVertical(cp, blockAccess, blockState, blockPos, i,
+							side, textureatlassprite, j), quad, renderEnv);
+
+				case 9:
+					return getQuads(getConnectedTextureVerticalHorizontal(cp, blockAccess, blockState, blockPos, i,
+							side, textureatlassprite, j), quad, renderEnv);
+
+				case 10:
+					if (pass == 0) {
+						return getConnectedTextureCtmCompact(cp, blockAccess, blockState, blockPos, i, side, quad, j,
+								renderEnv);
+					}
+
+				default:
+					return null;
+
+				case 11:
+					return getConnectedTextureOverlay(cp, blockAccess, blockState, blockPos, i, side, quad, j,
+							renderEnv);
+
+				case 12:
+					return getConnectedTextureOverlayFixed(cp, quad, renderEnv);
+
+				case 13:
+					return getConnectedTextureOverlayRandom(cp, blockAccess, blockState, blockPos, side, quad,
+							renderEnv);
+
+				case 14:
+					return getConnectedTextureOverlayRepeat(cp, blockPos, side, quad, renderEnv);
+
+				case 15:
+					return getConnectedTextureOverlayCtm(cp, blockAccess, blockState, blockPos, i, side, quad, j,
+							renderEnv);
+				}
+			}
+		}
+	}
+
+	private static int fixSideByAxis(int side, int vertAxis) {
+		switch (vertAxis) {
+		case 0:
+			return side;
+
+		case 1:
+			switch (side) {
+			case 0:
+				return 2;
+
+			case 1:
+				return 3;
+
+			case 2:
+				return 1;
+
+			case 3:
+				return 0;
+
+			default:
+				return side;
+			}
+
+		case 2:
+			switch (side) {
+			case 0:
+				return 4;
+
+			case 1:
+				return 5;
+
+			case 2:
+			case 3:
+			default:
+				return side;
+
+			case 4:
+				return 1;
+
+			case 5:
+				return 0;
+			}
+
+		default:
+			return side;
+		}
+	}
+
+	private static int getWoodAxis(int side, int metadata) {
+		int i = (metadata & 12) >> 2;
+
+		switch (i) {
+		case 1:
+			return 2;
+
+		case 2:
+			return 1;
+
+		default:
+			return 0;
+		}
+	}
+
+	private static int getQuartzAxis(int side, int metadata) {
+		switch (metadata) {
+		case 3:
+			return 2;
+
+		case 4:
+			return 1;
+
+		default:
+			return 0;
+		}
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureRandom(ConnectedProperties cp, IBlockAccess blockAccess,
+			BlockStateBase blockState, BlockPos blockPos, int side) {
+		if (cp.tileIcons.length == 1) {
+			return cp.tileIcons[0];
+		} else {
+			int i = side / cp.symmetry * cp.symmetry;
+
+			if (cp.linked) {
+				BlockPos blockpos = blockPos.down();
+
+				for (IBlockState iblockstate = blockAccess.getBlockState(blockpos); iblockstate.getBlock() == blockState
+						.getBlock(); iblockstate = blockAccess.getBlockState(blockpos)) {
+					blockPos = blockpos;
+					blockpos = blockpos.down();
+
+					if (blockpos.getY() < 0) {
+						break;
+					}
+				}
+			}
+
+			int l = Config.getRandom(blockPos, i) & Integer.MAX_VALUE;
+
+			for (int i1 = 0; i1 < cp.randomLoops; ++i1) {
+				l = Config.intHash(l);
+			}
+
+			int j1 = 0;
+
+			if (cp.weights == null) {
+				j1 = l % cp.tileIcons.length;
+			} else {
+				int j = l % cp.sumAllWeights;
+				int[] aint = cp.sumWeights;
+
+				for (int k = 0; k < aint.length; ++k) {
+					if (j < aint[k]) {
+						j1 = k;
+						break;
+					}
+				}
+			}
+
+			return cp.tileIcons[j1];
+		}
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureFixed(ConnectedProperties cp) {
+		return cp.tileIcons[0];
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureRepeat(ConnectedProperties cp, BlockPos blockPos,
+			int side) {
+		if (cp.tileIcons.length == 1) {
+			return cp.tileIcons[0];
+		} else {
+			int i = blockPos.getX();
+			int j = blockPos.getY();
+			int k = blockPos.getZ();
+			int l = 0;
+			int i1 = 0;
+
+			switch (side) {
+			case 0:
+				l = i;
+				i1 = -k - 1;
+				break;
+
+			case 1:
+				l = i;
+				i1 = k;
+				break;
+
+			case 2:
+				l = -i - 1;
+				i1 = -j;
+				break;
+
+			case 3:
+				l = i;
+				i1 = -j;
+				break;
+
+			case 4:
+				l = k;
+				i1 = -j;
+				break;
+
+			case 5:
+				l = -k - 1;
+				i1 = -j;
+			}
+
+			l = l % cp.width;
+			i1 = i1 % cp.height;
+
+			if (l < 0) {
+				l += cp.width;
+			}
+
+			if (i1 < 0) {
+				i1 += cp.height;
+			}
+
+			int j1 = i1 * cp.width + l;
+			return cp.tileIcons[j1];
+		}
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureCtm(ConnectedProperties cp, IBlockAccess blockAccess,
+			IBlockState blockState, BlockPos blockPos, int vertAxis, int side, EaglerTextureAtlasSprite icon,
+			int metadata, RenderEnv renderEnv) {
+		int i = getConnectedTextureCtmIndex(cp, blockAccess, blockState, blockPos, vertAxis, side, icon, metadata,
+				renderEnv);
+		return cp.tileIcons[i];
+	}
+
+	private static synchronized BakedQuad[] getConnectedTextureCtmCompact(ConnectedProperties cp,
+			IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side, BakedQuad quad,
+			int metadata, RenderEnv renderEnv) {
+		EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+		int i = getConnectedTextureCtmIndex(cp, blockAccess, blockState, blockPos, vertAxis, side, textureatlassprite,
+				metadata, renderEnv);
+		return ConnectedTexturesCompact.getConnectedTextureCtmCompact(i, cp, side, quad, renderEnv);
+	}
+
+	private static BakedQuad[] getConnectedTextureOverlay(ConnectedProperties cp, IBlockAccess blockAccess,
+			IBlockState blockState, BlockPos blockPos, int vertAxis, int side, BakedQuad quad, int metadata,
+			RenderEnv renderEnv) {
+		if (!quad.isFullQuad()) {
+			return null;
+		} else {
+			EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+			BlockDir[] ablockdir = getSideDirections(side, vertAxis);
+			boolean[] aboolean = renderEnv.getBorderFlags();
+
+			for (int i = 0; i < 4; ++i) {
+				aboolean[i] = isNeighbourOverlay(cp, blockAccess, blockState, ablockdir[i].offset(blockPos), side,
+						textureatlassprite, metadata);
+			}
+
+			ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
+			Object dirEdges;
+
+			try {
+				if (!aboolean[0] || !aboolean[1] || !aboolean[2] || !aboolean[3]) {
+					if (aboolean[0] && aboolean[1] && aboolean[2]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[5], quad, cp.tintIndex), cp.tintBlockState);
+						dirEdges = null;
+						return (BakedQuad[]) dirEdges;
+					}
+
+					if (aboolean[0] && aboolean[2] && aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[6], quad, cp.tintIndex), cp.tintBlockState);
+						dirEdges = null;
+						return (BakedQuad[]) dirEdges;
+					}
+
+					if (aboolean[1] && aboolean[2] && aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[12], quad, cp.tintIndex), cp.tintBlockState);
+						dirEdges = null;
+						return (BakedQuad[]) dirEdges;
+					}
+
+					if (aboolean[0] && aboolean[1] && aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[13], quad, cp.tintIndex), cp.tintBlockState);
+						dirEdges = null;
+						return (BakedQuad[]) dirEdges;
+					}
+
+					BlockDir[] ablockdir1 = getEdgeDirections(side, vertAxis);
+					boolean[] aboolean1 = renderEnv.getBorderFlags2();
+
+					for (int j = 0; j < 4; ++j) {
+						aboolean1[j] = isNeighbourOverlay(cp, blockAccess, blockState, ablockdir1[j].offset(blockPos),
+								side, textureatlassprite, metadata);
+					}
+
+					if (aboolean[1] && aboolean[2]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[3], quad, cp.tintIndex), cp.tintBlockState);
+
+						if (aboolean1[3]) {
+							listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[16], quad, cp.tintIndex),
+									cp.tintBlockState);
+						}
+
+						Object object4 = null;
+						return (BakedQuad[]) object4;
+					}
+
+					if (aboolean[0] && aboolean[2]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[4], quad, cp.tintIndex), cp.tintBlockState);
+
+						if (aboolean1[2]) {
+							listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[14], quad, cp.tintIndex),
+									cp.tintBlockState);
+						}
+
+						Object object3 = null;
+						return (BakedQuad[]) object3;
+					}
+
+					if (aboolean[1] && aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[10], quad, cp.tintIndex), cp.tintBlockState);
+
+						if (aboolean1[1]) {
+							listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[2], quad, cp.tintIndex),
+									cp.tintBlockState);
+						}
+
+						Object object2 = null;
+						return (BakedQuad[]) object2;
+					}
+
+					if (aboolean[0] && aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[11], quad, cp.tintIndex), cp.tintBlockState);
+
+						if (aboolean1[0]) {
+							listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[0], quad, cp.tintIndex),
+									cp.tintBlockState);
+						}
+
+						Object object1 = null;
+						return (BakedQuad[]) object1;
+					}
+
+					boolean[] aboolean2 = renderEnv.getBorderFlags3();
+
+					for (int k = 0; k < 4; ++k) {
+						aboolean2[k] = isNeighbourMatching(cp, blockAccess, blockState, ablockdir[k].offset(blockPos),
+								side, textureatlassprite, metadata);
+					}
+
+					if (aboolean[0]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[9], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					if (aboolean[1]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[7], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					if (aboolean[2]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[1], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					if (aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[15], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					if (aboolean1[0] && (aboolean2[1] || aboolean2[2]) && !aboolean[1] && !aboolean[2]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[0], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					if (aboolean1[1] && (aboolean2[0] || aboolean2[2]) && !aboolean[0] && !aboolean[2]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[2], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					if (aboolean1[2] && (aboolean2[1] || aboolean2[3]) && !aboolean[1] && !aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[14], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					if (aboolean1[3] && (aboolean2[0] || aboolean2[3]) && !aboolean[0] && !aboolean[3]) {
+						listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[16], quad, cp.tintIndex), cp.tintBlockState);
+					}
+
+					Object object5 = null;
+					return (BakedQuad[]) object5;
+				}
+
+				listquadsoverlay.addQuad(getQuadFull(cp.tileIcons[8], quad, cp.tintIndex), cp.tintBlockState);
+				dirEdges = null;
+			} finally {
+				if (listquadsoverlay.size() > 0) {
+					renderEnv.setOverlaysRendered(true);
+				}
+			}
+
+			return (BakedQuad[]) dirEdges;
+		}
+	}
+
+	private static BakedQuad[] getConnectedTextureOverlayFixed(ConnectedProperties cp, BakedQuad quad,
+			RenderEnv renderEnv) {
+		if (!quad.isFullQuad()) {
+			return null;
+		} else {
+			ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
+			Object object;
+
+			try {
+				EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureFixed(cp);
+
+				if (textureatlassprite != null) {
+					listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
+				}
+
+				object = null;
+			} finally {
+				if (listquadsoverlay.size() > 0) {
+					renderEnv.setOverlaysRendered(true);
+				}
+			}
+
+			return (BakedQuad[]) object;
+		}
+	}
+
+	private static BakedQuad[] getConnectedTextureOverlayRandom(ConnectedProperties cp, IBlockAccess blockAccess,
+			BlockStateBase blockState, BlockPos blockPos, int side, BakedQuad quad, RenderEnv renderEnv) {
+		if (!quad.isFullQuad()) {
+			return null;
+		} else {
+			ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
+			Object object;
+
+			try {
+				EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureRandom(cp, blockAccess, blockState,
+						blockPos, side);
+
+				if (textureatlassprite != null) {
+					listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
+				}
+
+				object = null;
+			} finally {
+				if (listquadsoverlay.size() > 0) {
+					renderEnv.setOverlaysRendered(true);
+				}
+			}
+
+			return (BakedQuad[]) object;
+		}
+	}
+
+	private static BakedQuad[] getConnectedTextureOverlayRepeat(ConnectedProperties cp, BlockPos blockPos, int side,
+			BakedQuad quad, RenderEnv renderEnv) {
+		if (!quad.isFullQuad()) {
+			return null;
+		} else {
+			ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
+			Object object;
+
+			try {
+				EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureRepeat(cp, blockPos, side);
+
+				if (textureatlassprite != null) {
+					listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
+				}
+
+				object = null;
+			} finally {
+				if (listquadsoverlay.size() > 0) {
+					renderEnv.setOverlaysRendered(true);
+				}
+			}
+
+			return (BakedQuad[]) object;
+		}
+	}
+
+	private static BakedQuad[] getConnectedTextureOverlayCtm(ConnectedProperties cp, IBlockAccess blockAccess,
+			IBlockState blockState, BlockPos blockPos, int vertAxis, int side, BakedQuad quad, int metadata,
+			RenderEnv renderEnv) {
+		if (!quad.isFullQuad()) {
+			return null;
+		} else {
+			ListQuadsOverlay listquadsoverlay = renderEnv.getListQuadsOverlay(cp.layer);
+			Object object;
+
+			try {
+				EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureCtm(cp, blockAccess, blockState,
+						blockPos, vertAxis, side, quad.getSprite(), metadata, renderEnv);
+
+				if (textureatlassprite != null) {
+					listquadsoverlay.addQuad(getQuadFull(textureatlassprite, quad, cp.tintIndex), cp.tintBlockState);
+				}
+
+				object = null;
+			} finally {
+				if (listquadsoverlay.size() > 0) {
+					renderEnv.setOverlaysRendered(true);
+				}
+			}
+
+			return (BakedQuad[]) object;
+		}
+	}
+
+	private static BlockDir[] getSideDirections(int side, int vertAxis) {
+		switch (side) {
+		case 0:
+			return SIDES_Y_NEG_DOWN;
+
+		case 1:
+			return SIDES_Y_POS_UP;
+
+		case 2:
+			if (vertAxis == 1) {
+				return SIDES_Z_NEG_NORTH_Z_AXIS;
+			}
+
+			return SIDES_Z_NEG_NORTH;
+
+		case 3:
+			return SIDES_Z_POS_SOUTH;
+
+		case 4:
+			return SIDES_X_NEG_WEST;
+
+		case 5:
+			if (vertAxis == 2) {
+				return SIDES_X_POS_EAST_X_AXIS;
+			}
+
+			return SIDES_X_POS_EAST;
+
+		default:
+			throw new IllegalArgumentException("Unknown side: " + side);
+		}
+	}
+
+	private static BlockDir[] getEdgeDirections(int side, int vertAxis) {
+		switch (side) {
+		case 0:
+			return EDGES_Y_NEG_DOWN;
+
+		case 1:
+			return EDGES_Y_POS_UP;
+
+		case 2:
+			if (vertAxis == 1) {
+				return EDGES_Z_NEG_NORTH_Z_AXIS;
+			}
+
+			return EDGES_Z_NEG_NORTH;
+
+		case 3:
+			return EDGES_Z_POS_SOUTH;
+
+		case 4:
+			return EDGES_X_NEG_WEST;
+
+		case 5:
+			if (vertAxis == 2) {
+				return EDGES_X_POS_EAST_X_AXIS;
+			}
+
+			return EDGES_X_POS_EAST;
+
+		default:
+			throw new IllegalArgumentException("Unknown side: " + side);
+		}
+	}
+
+	protected static Map[][] getSpriteQuadCompactMaps() {
+		return spriteQuadCompactMaps;
+	}
+
+	private static int getConnectedTextureCtmIndex(ConnectedProperties cp, IBlockAccess blockAccess,
+			IBlockState blockState, BlockPos blockPos, int vertAxis, int side, EaglerTextureAtlasSprite icon,
+			int metadata, RenderEnv renderEnv) {
+		boolean[] aboolean = renderEnv.getBorderFlags();
+
+		switch (side) {
+		case 0:
+			aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+			aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+			aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+			aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+
+			if (cp.innerSeams) {
+				BlockPos blockpos6 = blockPos.down();
+				aboolean[0] = aboolean[0]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos6.west(), side, icon, metadata);
+				aboolean[1] = aboolean[1]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos6.east(), side, icon, metadata);
+				aboolean[2] = aboolean[2]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos6.north(), side, icon, metadata);
+				aboolean[3] = aboolean[3]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos6.south(), side, icon, metadata);
+			}
+
+			break;
+
+		case 1:
+			aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+			aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+			aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+			aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+
+			if (cp.innerSeams) {
+				BlockPos blockpos5 = blockPos.up();
+				aboolean[0] = aboolean[0]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos5.west(), side, icon, metadata);
+				aboolean[1] = aboolean[1]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos5.east(), side, icon, metadata);
+				aboolean[2] = aboolean[2]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos5.south(), side, icon, metadata);
+				aboolean[3] = aboolean[3]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos5.north(), side, icon, metadata);
+			}
+
+			break;
+
+		case 2:
+			aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+			aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+			aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+			aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+
+			if (cp.innerSeams) {
+				BlockPos blockpos4 = blockPos.north();
+				aboolean[0] = aboolean[0]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos4.east(), side, icon, metadata);
+				aboolean[1] = aboolean[1]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos4.west(), side, icon, metadata);
+				aboolean[2] = aboolean[2]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos4.down(), side, icon, metadata);
+				aboolean[3] = aboolean[3]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos4.up(), side, icon, metadata);
+			}
+
+			if (vertAxis == 1) {
+				switchValues(0, 1, aboolean);
+				switchValues(2, 3, aboolean);
+			}
+
+			break;
+
+		case 3:
+			aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+			aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+			aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+			aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+
+			if (cp.innerSeams) {
+				BlockPos blockpos3 = blockPos.south();
+				aboolean[0] = aboolean[0]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos3.west(), side, icon, metadata);
+				aboolean[1] = aboolean[1]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos3.east(), side, icon, metadata);
+				aboolean[2] = aboolean[2]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos3.down(), side, icon, metadata);
+				aboolean[3] = aboolean[3]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos3.up(), side, icon, metadata);
+			}
+
+			break;
+
+		case 4:
+			aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+			aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+			aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+			aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+
+			if (cp.innerSeams) {
+				BlockPos blockpos2 = blockPos.west();
+				aboolean[0] = aboolean[0]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos2.north(), side, icon, metadata);
+				aboolean[1] = aboolean[1]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos2.south(), side, icon, metadata);
+				aboolean[2] = aboolean[2]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos2.down(), side, icon, metadata);
+				aboolean[3] = aboolean[3]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos2.up(), side, icon, metadata);
+			}
+
+			break;
+
+		case 5:
+			aboolean[0] = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+			aboolean[1] = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+			aboolean[2] = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+			aboolean[3] = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+
+			if (cp.innerSeams) {
+				BlockPos blockpos = blockPos.east();
+				aboolean[0] = aboolean[0]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos.south(), side, icon, metadata);
+				aboolean[1] = aboolean[1]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos.north(), side, icon, metadata);
+				aboolean[2] = aboolean[2]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos.down(), side, icon, metadata);
+				aboolean[3] = aboolean[3]
+						&& !isNeighbour(cp, blockAccess, blockState, blockpos.up(), side, icon, metadata);
+			}
+
+			if (vertAxis == 2) {
+				switchValues(0, 1, aboolean);
+				switchValues(2, 3, aboolean);
+			}
+		}
+
+		int i = 0;
+
+		if (aboolean[0] & !aboolean[1] & !aboolean[2] & !aboolean[3]) {
+			i = 3;
+		} else if (!aboolean[0] & aboolean[1] & !aboolean[2] & !aboolean[3]) {
+			i = 1;
+		} else if (!aboolean[0] & !aboolean[1] & aboolean[2] & !aboolean[3]) {
+			i = 12;
+		} else if (!aboolean[0] & !aboolean[1] & !aboolean[2] & aboolean[3]) {
+			i = 36;
+		} else if (aboolean[0] & aboolean[1] & !aboolean[2] & !aboolean[3]) {
+			i = 2;
+		} else if (!aboolean[0] & !aboolean[1] & aboolean[2] & aboolean[3]) {
+			i = 24;
+		} else if (aboolean[0] & !aboolean[1] & aboolean[2] & !aboolean[3]) {
+			i = 15;
+		} else if (aboolean[0] & !aboolean[1] & !aboolean[2] & aboolean[3]) {
+			i = 39;
+		} else if (!aboolean[0] & aboolean[1] & aboolean[2] & !aboolean[3]) {
+			i = 13;
+		} else if (!aboolean[0] & aboolean[1] & !aboolean[2] & aboolean[3]) {
+			i = 37;
+		} else if (!aboolean[0] & aboolean[1] & aboolean[2] & aboolean[3]) {
+			i = 25;
+		} else if (aboolean[0] & !aboolean[1] & aboolean[2] & aboolean[3]) {
+			i = 27;
+		} else if (aboolean[0] & aboolean[1] & !aboolean[2] & aboolean[3]) {
+			i = 38;
+		} else if (aboolean[0] & aboolean[1] & aboolean[2] & !aboolean[3]) {
+			i = 14;
+		} else if (aboolean[0] & aboolean[1] & aboolean[2] & aboolean[3]) {
+			i = 26;
+		}
+
+		if (i == 0) {
+			return i;
+		} else if (!Config.isConnectedTexturesFancy()) {
+			return i;
+		} else {
+			switch (side) {
+			case 0:
+				aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().north(), side, icon, metadata);
+				aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().north(), side, icon, metadata);
+				aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().south(), side, icon, metadata);
+				aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().south(), side, icon, metadata);
+
+				if (cp.innerSeams) {
+					BlockPos blockpos11 = blockPos.down();
+					aboolean[0] = aboolean[0] || isNeighbour(cp, blockAccess, blockState, blockpos11.east().north(),
+							side, icon, metadata);
+					aboolean[1] = aboolean[1] || isNeighbour(cp, blockAccess, blockState, blockpos11.west().north(),
+							side, icon, metadata);
+					aboolean[2] = aboolean[2] || isNeighbour(cp, blockAccess, blockState, blockpos11.east().south(),
+							side, icon, metadata);
+					aboolean[3] = aboolean[3] || isNeighbour(cp, blockAccess, blockState, blockpos11.west().south(),
+							side, icon, metadata);
+				}
+
+				break;
+
+			case 1:
+				aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().south(), side, icon, metadata);
+				aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().south(), side, icon, metadata);
+				aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().north(), side, icon, metadata);
+				aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().north(), side, icon, metadata);
+
+				if (cp.innerSeams) {
+					BlockPos blockpos10 = blockPos.up();
+					aboolean[0] = aboolean[0] || isNeighbour(cp, blockAccess, blockState, blockpos10.east().south(),
+							side, icon, metadata);
+					aboolean[1] = aboolean[1] || isNeighbour(cp, blockAccess, blockState, blockpos10.west().south(),
+							side, icon, metadata);
+					aboolean[2] = aboolean[2] || isNeighbour(cp, blockAccess, blockState, blockpos10.east().north(),
+							side, icon, metadata);
+					aboolean[3] = aboolean[3] || isNeighbour(cp, blockAccess, blockState, blockpos10.west().north(),
+							side, icon, metadata);
+				}
+
+				break;
+
+			case 2:
+				aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().down(), side, icon, metadata);
+				aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().down(), side, icon, metadata);
+				aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().up(), side, icon, metadata);
+				aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().up(), side, icon, metadata);
+
+				if (cp.innerSeams) {
+					BlockPos blockpos9 = blockPos.north();
+					aboolean[0] = aboolean[0]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos9.west().down(), side, icon, metadata);
+					aboolean[1] = aboolean[1]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos9.east().down(), side, icon, metadata);
+					aboolean[2] = aboolean[2]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos9.west().up(), side, icon, metadata);
+					aboolean[3] = aboolean[3]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos9.east().up(), side, icon, metadata);
+				}
+
+				if (vertAxis == 1) {
+					switchValues(0, 3, aboolean);
+					switchValues(1, 2, aboolean);
+				}
+
+				break;
+
+			case 3:
+				aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().down(), side, icon, metadata);
+				aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().down(), side, icon, metadata);
+				aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.east().up(), side, icon, metadata);
+				aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.west().up(), side, icon, metadata);
+
+				if (cp.innerSeams) {
+					BlockPos blockpos8 = blockPos.south();
+					aboolean[0] = aboolean[0]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos8.east().down(), side, icon, metadata);
+					aboolean[1] = aboolean[1]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos8.west().down(), side, icon, metadata);
+					aboolean[2] = aboolean[2]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos8.east().up(), side, icon, metadata);
+					aboolean[3] = aboolean[3]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos8.west().up(), side, icon, metadata);
+				}
+
+				break;
+
+			case 4:
+				aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().south(), side, icon, metadata);
+				aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().north(), side, icon, metadata);
+				aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().south(), side, icon, metadata);
+				aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().north(), side, icon, metadata);
+
+				if (cp.innerSeams) {
+					BlockPos blockpos7 = blockPos.west();
+					aboolean[0] = aboolean[0]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos7.down().south(), side, icon, metadata);
+					aboolean[1] = aboolean[1]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos7.down().north(), side, icon, metadata);
+					aboolean[2] = aboolean[2]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos7.up().south(), side, icon, metadata);
+					aboolean[3] = aboolean[3]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos7.up().north(), side, icon, metadata);
+				}
+
+				break;
+
+			case 5:
+				aboolean[0] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().north(), side, icon, metadata);
+				aboolean[1] = !isNeighbour(cp, blockAccess, blockState, blockPos.down().south(), side, icon, metadata);
+				aboolean[2] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().north(), side, icon, metadata);
+				aboolean[3] = !isNeighbour(cp, blockAccess, blockState, blockPos.up().south(), side, icon, metadata);
+
+				if (cp.innerSeams) {
+					BlockPos blockpos1 = blockPos.east();
+					aboolean[0] = aboolean[0]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos1.down().north(), side, icon, metadata);
+					aboolean[1] = aboolean[1]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos1.down().south(), side, icon, metadata);
+					aboolean[2] = aboolean[2]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos1.up().north(), side, icon, metadata);
+					aboolean[3] = aboolean[3]
+							|| isNeighbour(cp, blockAccess, blockState, blockpos1.up().south(), side, icon, metadata);
+				}
+
+				if (vertAxis == 2) {
+					switchValues(0, 3, aboolean);
+					switchValues(1, 2, aboolean);
+				}
+			}
+
+			if (i == 13 && aboolean[0]) {
+				i = 4;
+			} else if (i == 15 && aboolean[1]) {
+				i = 5;
+			} else if (i == 37 && aboolean[2]) {
+				i = 16;
+			} else if (i == 39 && aboolean[3]) {
+				i = 17;
+			} else if (i == 14 && aboolean[0] && aboolean[1]) {
+				i = 7;
+			} else if (i == 25 && aboolean[0] && aboolean[2]) {
+				i = 6;
+			} else if (i == 27 && aboolean[3] && aboolean[1]) {
+				i = 19;
+			} else if (i == 38 && aboolean[3] && aboolean[2]) {
+				i = 18;
+			} else if (i == 14 && !aboolean[0] && aboolean[1]) {
+				i = 31;
+			} else if (i == 25 && aboolean[0] && !aboolean[2]) {
+				i = 30;
+			} else if (i == 27 && !aboolean[3] && aboolean[1]) {
+				i = 41;
+			} else if (i == 38 && aboolean[3] && !aboolean[2]) {
+				i = 40;
+			} else if (i == 14 && aboolean[0] && !aboolean[1]) {
+				i = 29;
+			} else if (i == 25 && !aboolean[0] && aboolean[2]) {
+				i = 28;
+			} else if (i == 27 && aboolean[3] && !aboolean[1]) {
+				i = 43;
+			} else if (i == 38 && !aboolean[3] && aboolean[2]) {
+				i = 42;
+			} else if (i == 26 && aboolean[0] && aboolean[1] && aboolean[2] && aboolean[3]) {
+				i = 46;
+			} else if (i == 26 && !aboolean[0] && aboolean[1] && aboolean[2] && aboolean[3]) {
+				i = 9;
+			} else if (i == 26 && aboolean[0] && !aboolean[1] && aboolean[2] && aboolean[3]) {
+				i = 21;
+			} else if (i == 26 && aboolean[0] && aboolean[1] && !aboolean[2] && aboolean[3]) {
+				i = 8;
+			} else if (i == 26 && aboolean[0] && aboolean[1] && aboolean[2] && !aboolean[3]) {
+				i = 20;
+			} else if (i == 26 && aboolean[0] && aboolean[1] && !aboolean[2] && !aboolean[3]) {
+				i = 11;
+			} else if (i == 26 && !aboolean[0] && !aboolean[1] && aboolean[2] && aboolean[3]) {
+				i = 22;
+			} else if (i == 26 && !aboolean[0] && aboolean[1] && !aboolean[2] && aboolean[3]) {
+				i = 23;
+			} else if (i == 26 && aboolean[0] && !aboolean[1] && aboolean[2] && !aboolean[3]) {
+				i = 10;
+			} else if (i == 26 && aboolean[0] && !aboolean[1] && !aboolean[2] && aboolean[3]) {
+				i = 34;
+			} else if (i == 26 && !aboolean[0] && aboolean[1] && aboolean[2] && !aboolean[3]) {
+				i = 35;
+			} else if (i == 26 && aboolean[0] && !aboolean[1] && !aboolean[2] && !aboolean[3]) {
+				i = 32;
+			} else if (i == 26 && !aboolean[0] && aboolean[1] && !aboolean[2] && !aboolean[3]) {
+				i = 33;
+			} else if (i == 26 && !aboolean[0] && !aboolean[1] && aboolean[2] && !aboolean[3]) {
+				i = 44;
+			} else if (i == 26 && !aboolean[0] && !aboolean[1] && !aboolean[2] && aboolean[3]) {
+				i = 45;
+			}
+
+			return i;
+		}
+	}
+
+	private static void switchValues(int ix1, int ix2, boolean[] arr) {
+		boolean flag = arr[ix1];
+		arr[ix1] = arr[ix2];
+		arr[ix2] = flag;
+	}
+
+	private static boolean isNeighbourOverlay(ConnectedProperties cp, IBlockAccess iblockaccess, IBlockState blockState,
+			BlockPos blockPos, int side, EaglerTextureAtlasSprite icon, int metadata) {
+		IBlockState iblockstate = iblockaccess.getBlockState(blockPos);
+
+		if (!isFullCubeModel(iblockstate)) {
+			return false;
+		} else {
+			if (cp.connectBlocks != null) {
+				BlockStateBase blockstatebase = (BlockStateBase) iblockstate;
+
+				if (!Matches.block(blockstatebase.getBlockId(), blockstatebase.getMetadata(), cp.connectBlocks)) {
+					return false;
+				}
+			}
+
+			if (cp.connectTileIcons != null) {
+				EaglerTextureAtlasSprite textureatlassprite = getNeighbourIcon(iblockaccess, blockState, blockPos,
+						iblockstate, side);
+
+				if (!Config.isSameOne(textureatlassprite, cp.connectTileIcons)) {
+					return false;
+				}
+			}
+
+			IBlockState iblockstate1 = iblockaccess.getBlockState(blockPos.offset(getFacing(side)));
+			return iblockstate1.getBlock().isOpaqueCube() ? false
+					: (side == 1 && iblockstate1.getBlock() == Blocks.snow_layer ? false
+							: !isNeighbour(cp, iblockaccess, blockState, blockPos, iblockstate, side, icon, metadata));
+		}
+	}
+
+	private static boolean isFullCubeModel(IBlockState state) {
+		if (state.getBlock().isFullCube()) {
+			return true;
+		} else {
+			Block block = state.getBlock();
+			return block instanceof BlockGlass ? true : block instanceof BlockStainedGlass;
+		}
+	}
+
+	private static boolean isNeighbourMatching(ConnectedProperties cp, IBlockAccess iblockaccess,
+			IBlockState blockState, BlockPos blockPos, int side, EaglerTextureAtlasSprite icon, int metadata) {
+		IBlockState iblockstate = iblockaccess.getBlockState(blockPos);
+
+		if (iblockstate == AIR_DEFAULT_STATE) {
+			return false;
+		} else {
+			if (cp.matchBlocks != null && iblockstate instanceof BlockStateBase) {
+				BlockStateBase blockstatebase = (BlockStateBase) iblockstate;
+
+				if (!cp.matchesBlock(blockstatebase.getBlockId(), blockstatebase.getMetadata())) {
+					return false;
+				}
+			}
+
+			if (cp.matchTileIcons != null) {
+				EaglerTextureAtlasSprite textureatlassprite = getNeighbourIcon(iblockaccess, blockState, blockPos,
+						iblockstate, side);
+
+				if (textureatlassprite != icon) {
+					return false;
+				}
+			}
+
+			IBlockState iblockstate1 = iblockaccess.getBlockState(blockPos.offset(getFacing(side)));
+			return iblockstate1.getBlock().isOpaqueCube() ? false
+					: side != 1 || iblockstate1.getBlock() != Blocks.snow_layer;
+		}
+	}
+
+	private static boolean isNeighbour(ConnectedProperties cp, IBlockAccess iblockaccess, IBlockState blockState,
+			BlockPos blockPos, int side, EaglerTextureAtlasSprite icon, int metadata) {
+		IBlockState iblockstate = iblockaccess.getBlockState(blockPos);
+		return isNeighbour(cp, iblockaccess, blockState, blockPos, iblockstate, side, icon, metadata);
+	}
+
+	private static boolean isNeighbour(ConnectedProperties cp, IBlockAccess iblockaccess, IBlockState blockState,
+			BlockPos blockPos, IBlockState neighbourState, int side, EaglerTextureAtlasSprite icon, int metadata) {
+		if (blockState == neighbourState) {
+			return true;
+		} else if (cp.connect == 2) {
+			if (neighbourState == null) {
+				return false;
+			} else if (neighbourState == AIR_DEFAULT_STATE) {
+				return false;
+			} else {
+				EaglerTextureAtlasSprite textureatlassprite = getNeighbourIcon(iblockaccess, blockState, blockPos,
+						neighbourState, side);
+				return textureatlassprite == icon;
+			}
+		} else if (cp.connect == 3) {
+			return neighbourState == null ? false
+					: (neighbourState == AIR_DEFAULT_STATE ? false
+							: neighbourState.getBlock().getMaterial() == blockState.getBlock().getMaterial());
+		} else if (!(neighbourState instanceof BlockStateBase)) {
+			return false;
+		} else {
+			BlockStateBase blockstatebase = (BlockStateBase) neighbourState;
+			Block block = blockstatebase.getBlock();
+			int i = blockstatebase.getMetadata();
+			return block == blockState.getBlock() && i == metadata;
+		}
+	}
+
+	private static EaglerTextureAtlasSprite getNeighbourIcon(IBlockAccess iblockaccess, IBlockState blockState,
+			BlockPos blockPos, IBlockState neighbourState, int side) {
+		neighbourState = neighbourState.getBlock().getActualState(neighbourState, iblockaccess, blockPos);
+		IBakedModel ibakedmodel = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes()
+				.getModelForState(neighbourState);
+
+		if (ibakedmodel == null) {
+			return null;
+		} else {
+//			if (Reflector.ForgeBlock_getExtendedState.exists()) {
+//				neighbourState = (IBlockState) Reflector.call(neighbourState.getBlock(),
+//						Reflector.ForgeBlock_getExtendedState, new Object[] { neighbourState, iblockaccess, blockPos });
+//			}
+
+			EnumFacing enumfacing = getFacing(side);
+			List list = ibakedmodel.getFaceQuads(enumfacing);
+
+			if (list == null) {
+				return null;
+			} else {
+				if (Config.isBetterGrass()) {
+					list = BetterGrass.getFaceQuads(iblockaccess, neighbourState, blockPos, enumfacing, list);
+				}
+
+				if (list.size() > 0) {
+					BakedQuad bakedquad1 = (BakedQuad) list.get(0);
+					return bakedquad1.getSprite();
+				} else {
+					List list1 = ibakedmodel.getGeneralQuads();
+
+					if (list1 == null) {
+						return null;
+					} else {
+						for (int i = 0; i < list1.size(); ++i) {
+							BakedQuad bakedquad = (BakedQuad) list1.get(i);
+
+							if (bakedquad.getFace() == enumfacing) {
+								return bakedquad.getSprite();
+							}
+						}
+
+						return null;
+					}
+				}
+			}
+		}
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureHorizontal(ConnectedProperties cp,
+			IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
+			EaglerTextureAtlasSprite icon, int metadata) {
+		boolean flag;
+		boolean flag1;
+		flag = false;
+		flag1 = false;
+		label0:
+
+		switch (vertAxis) {
+		case 0:
+			switch (side) {
+			case 0:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				break label0;
+
+			case 1:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				break label0;
+
+			case 2:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				break label0;
+
+			case 3:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				break label0;
+
+			case 4:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+				break label0;
+
+			case 5:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+
+			default:
+				break label0;
+			}
+
+		case 1:
+			switch (side) {
+			case 0:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				break label0;
+
+			case 1:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				break label0;
+
+			case 2:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				break label0;
+
+			case 3:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+				break label0;
+
+			case 4:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+				break label0;
+
+			case 5:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+
+			default:
+				break label0;
+			}
+
+		case 2:
+			switch (side) {
+			case 0:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+				break;
+
+			case 1:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+				break;
+
+			case 2:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+				break;
+
+			case 3:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+				break;
+
+			case 4:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+				break;
+
+			case 5:
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+			}
+		}
+
+		int i = 3;
+
+		if (flag) {
+			if (flag1) {
+				i = 1;
+			} else {
+				i = 2;
+			}
+		} else if (flag1) {
+			i = 0;
+		} else {
+			i = 3;
+		}
+
+		return cp.tileIcons[i];
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureVertical(ConnectedProperties cp,
+			IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
+			EaglerTextureAtlasSprite icon, int metadata) {
+		boolean flag = false;
+		boolean flag1 = false;
+
+		switch (vertAxis) {
+		case 0:
+			if (side == 1) {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+			} else if (side == 0) {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+			} else {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+			}
+
+			break;
+
+		case 1:
+			if (side == 3) {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+			} else if (side == 2) {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+			} else {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.north(), side, icon, metadata);
+			}
+
+			break;
+
+		case 2:
+			if (side == 5) {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+			} else if (side == 4) {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.down(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+			} else {
+				flag = isNeighbour(cp, blockAccess, blockState, blockPos.west(), side, icon, metadata);
+				flag1 = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+			}
+		}
+
+		int i = 3;
+
+		if (flag) {
+			if (flag1) {
+				i = 1;
+			} else {
+				i = 2;
+			}
+		} else if (flag1) {
+			i = 0;
+		} else {
+			i = 3;
+		}
+
+		return cp.tileIcons[i];
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureHorizontalVertical(ConnectedProperties cp,
+			IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
+			EaglerTextureAtlasSprite icon, int metadata) {
+		EaglerTextureAtlasSprite[] atextureatlassprite = cp.tileIcons;
+		EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureHorizontal(cp, blockAccess, blockState,
+				blockPos, vertAxis, side, icon, metadata);
+
+		if (textureatlassprite != null && textureatlassprite != icon && textureatlassprite != atextureatlassprite[3]) {
+			return textureatlassprite;
+		} else {
+			EaglerTextureAtlasSprite textureatlassprite1 = getConnectedTextureVertical(cp, blockAccess, blockState,
+					blockPos, vertAxis, side, icon, metadata);
+			return textureatlassprite1 == atextureatlassprite[0] ? atextureatlassprite[4]
+					: (textureatlassprite1 == atextureatlassprite[1] ? atextureatlassprite[5]
+							: (textureatlassprite1 == atextureatlassprite[2] ? atextureatlassprite[6]
+									: textureatlassprite1));
+		}
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureVerticalHorizontal(ConnectedProperties cp,
+			IBlockAccess blockAccess, IBlockState blockState, BlockPos blockPos, int vertAxis, int side,
+			EaglerTextureAtlasSprite icon, int metadata) {
+		EaglerTextureAtlasSprite[] atextureatlassprite = cp.tileIcons;
+		EaglerTextureAtlasSprite textureatlassprite = getConnectedTextureVertical(cp, blockAccess, blockState, blockPos,
+				vertAxis, side, icon, metadata);
+
+		if (textureatlassprite != null && textureatlassprite != icon && textureatlassprite != atextureatlassprite[3]) {
+			return textureatlassprite;
+		} else {
+			EaglerTextureAtlasSprite textureatlassprite1 = getConnectedTextureHorizontal(cp, blockAccess, blockState,
+					blockPos, vertAxis, side, icon, metadata);
+			return textureatlassprite1 == atextureatlassprite[0] ? atextureatlassprite[4]
+					: (textureatlassprite1 == atextureatlassprite[1] ? atextureatlassprite[5]
+							: (textureatlassprite1 == atextureatlassprite[2] ? atextureatlassprite[6]
+									: textureatlassprite1));
+		}
+	}
+
+	private static EaglerTextureAtlasSprite getConnectedTextureTop(ConnectedProperties cp, IBlockAccess blockAccess,
+			IBlockState blockState, BlockPos blockPos, int vertAxis, int side, EaglerTextureAtlasSprite icon,
+			int metadata) {
+		boolean flag = false;
+
+		switch (vertAxis) {
+		case 0:
+			if (side == 1 || side == 0) {
+				return null;
+			}
+
+			flag = isNeighbour(cp, blockAccess, blockState, blockPos.up(), side, icon, metadata);
+			break;
+
+		case 1:
+			if (side == 3 || side == 2) {
+				return null;
+			}
+
+			flag = isNeighbour(cp, blockAccess, blockState, blockPos.south(), side, icon, metadata);
+			break;
+
+		case 2:
+			if (side == 5 || side == 4) {
+				return null;
+			}
+
+			flag = isNeighbour(cp, blockAccess, blockState, blockPos.east(), side, icon, metadata);
+		}
+
+		if (flag) {
+			return cp.tileIcons[0];
+		} else {
+			return null;
+		}
+	}
+
+	public static void updateIcons(TextureMap textureMap) {
+		blockProperties = (ConnectedProperties[][]) null;
+		tileProperties = (ConnectedProperties[][]) null;
+		spriteQuadMaps = null;
+		spriteQuadCompactMaps = (Map[][]) null;
+
+		if (Config.isConnectedTextures()) {
+			IResourcePack[] airesourcepack = Config.getResourcePacks();
+
+			for (int i = airesourcepack.length - 1; i >= 0; --i) {
+				IResourcePack iresourcepack = airesourcepack[i];
+				updateIcons(textureMap, iresourcepack);
+			}
+
+			updateIcons(textureMap, Minecraft.getMinecraft().getDefaultResourcePack());
+			ResourceLocation resourcelocation = new ResourceLocation("mcpatcher/ctm/default/empty");
+			emptySprite = textureMap.registerSprite(resourcelocation);
+			spriteQuadMaps = new Map[textureMap.getCountRegisteredSprites() + 1];
+			spriteQuadFullMaps = new Map[textureMap.getCountRegisteredSprites() + 1];
+			spriteQuadCompactMaps = new Map[textureMap.getCountRegisteredSprites() + 1][];
+
+			if (blockProperties.length <= 0) {
+				blockProperties = (ConnectedProperties[][]) null;
+			}
+
+			if (tileProperties.length <= 0) {
+				tileProperties = (ConnectedProperties[][]) null;
+			}
+		}
+	}
+
+	private static void updateIconEmpty(TextureMap textureMap) {
+	}
+
+	public static void updateIcons(TextureMap textureMap, IResourcePack rp) {
+		List<String> astring = ResUtils.collectPropertyFiles(rp, "mcpatcher/ctm/");
+		Collections.sort(astring);
+		List list = makePropertyList(tileProperties);
+		List list1 = makePropertyList(blockProperties);
+
+		for (int i = 0, l = astring.size(); i < l; ++i) {
+			String s = astring.get(i);
+			Config.dbg("ConnectedTextures: " + s);
+
+			try {
+				ResourceLocation resourcelocation = new ResourceLocation(s);
+				InputStream inputstream = rp.getInputStream(resourcelocation);
+
+				if (inputstream == null) {
+					Config.warn("ConnectedTextures file not found: " + s);
+				} else {
+					Properties properties = new PropertiesOrdered();
+					properties.load(inputstream);
+					inputstream.close();
+					ConnectedProperties connectedproperties = new ConnectedProperties(properties, s);
+
+					if (connectedproperties.isValid(s)) {
+						connectedproperties.updateIcons(textureMap);
+						addToTileList(connectedproperties, list);
+						addToBlockList(connectedproperties, list1);
+					}
+				}
+			} catch (FileNotFoundException var11) {
+				Config.warn("ConnectedTextures file not found: " + s);
+			} catch (Exception exception) {
+				exception.printStackTrace();
+			}
+		}
+
+		blockProperties = propertyListToArray(list1);
+		tileProperties = propertyListToArray(list);
+		multipass = detectMultipass();
+		Config.dbg("Multipass connected textures: " + multipass);
+	}
+
+	private static List makePropertyList(ConnectedProperties[][] propsArr) {
+		List list = new ArrayList();
+
+		if (propsArr != null) {
+			for (int i = 0; i < propsArr.length; ++i) {
+				ConnectedProperties[] aconnectedproperties = propsArr[i];
+				List list1 = null;
+
+				if (aconnectedproperties != null) {
+					list1 = new ArrayList(Arrays.asList(aconnectedproperties));
+				}
+
+				list.add(list1);
+			}
+		}
+
+		return list;
+	}
+
+	private static boolean detectMultipass() {
+		List list = new ArrayList();
+
+		for (int i = 0; i < tileProperties.length; ++i) {
+			ConnectedProperties[] aconnectedproperties = tileProperties[i];
+
+			if (aconnectedproperties != null) {
+				list.addAll(Arrays.asList(aconnectedproperties));
+			}
+		}
+
+		for (int k = 0; k < blockProperties.length; ++k) {
+			ConnectedProperties[] aconnectedproperties2 = blockProperties[k];
+
+			if (aconnectedproperties2 != null) {
+				list.addAll(Arrays.asList(aconnectedproperties2));
+			}
+		}
+
+		ConnectedProperties[] aconnectedproperties1 = (ConnectedProperties[]) ((ConnectedProperties[]) list
+				.toArray(new ConnectedProperties[list.size()]));
+		Set set1 = new HashSet();
+		Set set = new HashSet();
+
+		for (int j = 0; j < aconnectedproperties1.length; ++j) {
+			ConnectedProperties connectedproperties = aconnectedproperties1[j];
+
+			if (connectedproperties.matchTileIcons != null) {
+				set1.addAll(Arrays.asList(connectedproperties.matchTileIcons));
+			}
+
+			if (connectedproperties.tileIcons != null) {
+				set.addAll(Arrays.asList(connectedproperties.tileIcons));
+			}
+		}
+
+		set1.retainAll(set);
+		return !set1.isEmpty();
+	}
+
+	private static ConnectedProperties[][] propertyListToArray(List list) {
+		ConnectedProperties[][] aconnectedproperties = new ConnectedProperties[list.size()][];
+
+		for (int i = 0; i < list.size(); ++i) {
+			List list2 = (List) list.get(i);
+
+			if (list2 != null) {
+				ConnectedProperties[] aconnectedproperties1 = (ConnectedProperties[]) list2
+						.toArray(new ConnectedProperties[list2.size()]);
+				aconnectedproperties[i] = aconnectedproperties1;
+			}
+		}
+
+		return aconnectedproperties;
+	}
+
+	private static void addToTileList(ConnectedProperties cp, List tileList) {
+		if (cp.matchTileIcons != null) {
+			for (int i = 0; i < cp.matchTileIcons.length; ++i) {
+				EaglerTextureAtlasSprite textureatlassprite = cp.matchTileIcons[i];
+				int j = textureatlassprite.getIndexInMap();
+
+				if (j < 0) {
+					Config.warn("Invalid tile ID: " + j + ", icon: " + textureatlassprite.getIconName());
+				} else {
+					addToList(cp, tileList, j);
+				}
+			}
+		}
+	}
+
+	private static void addToBlockList(ConnectedProperties cp, List blockList) {
+		if (cp.matchBlocks != null) {
+			for (int i = 0; i < cp.matchBlocks.length; ++i) {
+				int j = cp.matchBlocks[i].getBlockId();
+
+				if (j < 0) {
+					Config.warn("Invalid block ID: " + j);
+				} else {
+					addToList(cp, blockList, j);
+				}
+			}
+		}
+	}
+
+	private static void addToList(ConnectedProperties cp, List list, int id) {
+		while (id >= list.size()) {
+			list.add(null);
+		}
+
+		List list1 = (List) list.get(id);
+
+		if (list1 == null) {
+			list1 = new ArrayList();
+			list.set(id, list1);
+		}
+
+		list1.add(cp);
+	}
+
+}
diff --git a/sources/main/java/net/optifine/ConnectedTexturesCompact.java b/sources/main/java/net/optifine/ConnectedTexturesCompact.java
new file mode 100644
index 00000000..7fb491ee
--- /dev/null
+++ b/sources/main/java/net/optifine/ConnectedTexturesCompact.java
@@ -0,0 +1,450 @@
+package net.optifine;
+
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.optifine.render.RenderEnv;
+
+public class ConnectedTexturesCompact {
+	private static final int COMPACT_NONE = 0;
+	private static final int COMPACT_ALL = 1;
+	private static final int COMPACT_V = 2;
+	private static final int COMPACT_H = 3;
+	private static final int COMPACT_HV = 4;
+
+	public static BakedQuad[] getConnectedTextureCtmCompact(int ctmIndex, ConnectedProperties cp, int side,
+			BakedQuad quad, RenderEnv renderEnv) {
+		if (cp.ctmTileIndexes != null && ctmIndex >= 0 && ctmIndex < cp.ctmTileIndexes.length) {
+			int i = cp.ctmTileIndexes[ctmIndex];
+
+			if (i >= 0 && i <= cp.tileIcons.length) {
+				return getQuadsCompact(i, cp.tileIcons, quad, renderEnv);
+			}
+		}
+
+		switch (ctmIndex) {
+		case 1:
+			return getQuadsCompactH(0, 3, cp.tileIcons, side, quad, renderEnv);
+
+		case 2:
+			return getQuadsCompact(3, cp.tileIcons, quad, renderEnv);
+
+		case 3:
+			return getQuadsCompactH(3, 0, cp.tileIcons, side, quad, renderEnv);
+
+		case 4:
+			return getQuadsCompact4(0, 3, 2, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 5:
+			return getQuadsCompact4(3, 0, 4, 2, cp.tileIcons, side, quad, renderEnv);
+
+		case 6:
+			return getQuadsCompact4(2, 4, 2, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 7:
+			return getQuadsCompact4(3, 3, 4, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 8:
+			return getQuadsCompact4(4, 1, 4, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 9:
+			return getQuadsCompact4(4, 4, 4, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 10:
+			return getQuadsCompact4(1, 4, 1, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 11:
+			return getQuadsCompact4(1, 1, 4, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 12:
+			return getQuadsCompactV(0, 2, cp.tileIcons, side, quad, renderEnv);
+
+		case 13:
+			return getQuadsCompact4(0, 3, 2, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 14:
+			return getQuadsCompactV(3, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 15:
+			return getQuadsCompact4(3, 0, 1, 2, cp.tileIcons, side, quad, renderEnv);
+
+		case 16:
+			return getQuadsCompact4(2, 4, 0, 3, cp.tileIcons, side, quad, renderEnv);
+
+		case 17:
+			return getQuadsCompact4(4, 2, 3, 0, cp.tileIcons, side, quad, renderEnv);
+
+		case 18:
+			return getQuadsCompact4(4, 4, 3, 3, cp.tileIcons, side, quad, renderEnv);
+
+		case 19:
+			return getQuadsCompact4(4, 2, 4, 2, cp.tileIcons, side, quad, renderEnv);
+
+		case 20:
+			return getQuadsCompact4(1, 4, 4, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 21:
+			return getQuadsCompact4(4, 4, 1, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 22:
+			return getQuadsCompact4(4, 4, 1, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 23:
+			return getQuadsCompact4(4, 1, 4, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 24:
+			return getQuadsCompact(2, cp.tileIcons, quad, renderEnv);
+
+		case 25:
+			return getQuadsCompactH(2, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 26:
+			return getQuadsCompact(1, cp.tileIcons, quad, renderEnv);
+
+		case 27:
+			return getQuadsCompactH(1, 2, cp.tileIcons, side, quad, renderEnv);
+
+		case 28:
+			return getQuadsCompact4(2, 4, 2, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 29:
+			return getQuadsCompact4(3, 3, 1, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 30:
+			return getQuadsCompact4(2, 1, 2, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 31:
+			return getQuadsCompact4(3, 3, 4, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 32:
+			return getQuadsCompact4(1, 1, 1, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 33:
+			return getQuadsCompact4(1, 1, 4, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 34:
+			return getQuadsCompact4(4, 1, 1, 4, cp.tileIcons, side, quad, renderEnv);
+
+		case 35:
+			return getQuadsCompact4(1, 4, 4, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 36:
+			return getQuadsCompactV(2, 0, cp.tileIcons, side, quad, renderEnv);
+
+		case 37:
+			return getQuadsCompact4(2, 1, 0, 3, cp.tileIcons, side, quad, renderEnv);
+
+		case 38:
+			return getQuadsCompactV(1, 3, cp.tileIcons, side, quad, renderEnv);
+
+		case 39:
+			return getQuadsCompact4(1, 2, 3, 0, cp.tileIcons, side, quad, renderEnv);
+
+		case 40:
+			return getQuadsCompact4(4, 1, 3, 3, cp.tileIcons, side, quad, renderEnv);
+
+		case 41:
+			return getQuadsCompact4(1, 2, 4, 2, cp.tileIcons, side, quad, renderEnv);
+
+		case 42:
+			return getQuadsCompact4(1, 4, 3, 3, cp.tileIcons, side, quad, renderEnv);
+
+		case 43:
+			return getQuadsCompact4(4, 2, 1, 2, cp.tileIcons, side, quad, renderEnv);
+
+		case 44:
+			return getQuadsCompact4(1, 4, 1, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 45:
+			return getQuadsCompact4(4, 1, 1, 1, cp.tileIcons, side, quad, renderEnv);
+
+		case 46:
+			return getQuadsCompact(4, cp.tileIcons, quad, renderEnv);
+
+		default:
+			return getQuadsCompact(0, cp.tileIcons, quad, renderEnv);
+		}
+	}
+
+	private static BakedQuad[] getQuadsCompactH(int indexLeft, int indexRight, EaglerTextureAtlasSprite[] sprites,
+			int side, BakedQuad quad, RenderEnv renderEnv) {
+		return getQuadsCompact(ConnectedTexturesCompact.Dir.LEFT, indexLeft, ConnectedTexturesCompact.Dir.RIGHT,
+				indexRight, sprites, side, quad, renderEnv);
+	}
+
+	private static BakedQuad[] getQuadsCompactV(int indexUp, int indexDown, EaglerTextureAtlasSprite[] sprites,
+			int side, BakedQuad quad, RenderEnv renderEnv) {
+		return getQuadsCompact(ConnectedTexturesCompact.Dir.UP, indexUp, ConnectedTexturesCompact.Dir.DOWN, indexDown,
+				sprites, side, quad, renderEnv);
+	}
+
+	private static BakedQuad[] getQuadsCompact4(int upLeft, int upRight, int downLeft, int downRight,
+			EaglerTextureAtlasSprite[] sprites, int side, BakedQuad quad, RenderEnv renderEnv) {
+		return upLeft == upRight ? (downLeft == downRight
+				? getQuadsCompact(ConnectedTexturesCompact.Dir.UP, upLeft, ConnectedTexturesCompact.Dir.DOWN, downLeft,
+						sprites, side, quad, renderEnv)
+				: getQuadsCompact(ConnectedTexturesCompact.Dir.UP, upLeft, ConnectedTexturesCompact.Dir.DOWN_LEFT,
+						downLeft, ConnectedTexturesCompact.Dir.DOWN_RIGHT, downRight, sprites, side, quad, renderEnv))
+				: (downLeft == downRight
+						? getQuadsCompact(ConnectedTexturesCompact.Dir.UP_LEFT, upLeft,
+								ConnectedTexturesCompact.Dir.UP_RIGHT, upRight, ConnectedTexturesCompact.Dir.DOWN,
+								downLeft, sprites, side, quad, renderEnv)
+						: (upLeft == downLeft
+								? (upRight == downRight ? getQuadsCompact(ConnectedTexturesCompact.Dir.LEFT, upLeft,
+										ConnectedTexturesCompact.Dir.RIGHT, upRight, sprites, side, quad, renderEnv)
+										: getQuadsCompact(ConnectedTexturesCompact.Dir.LEFT, upLeft,
+												ConnectedTexturesCompact.Dir.UP_RIGHT, upRight,
+												ConnectedTexturesCompact.Dir.DOWN_RIGHT, downRight, sprites, side, quad,
+												renderEnv))
+								: (upRight == downRight ? getQuadsCompact(ConnectedTexturesCompact.Dir.UP_LEFT, upLeft,
+										ConnectedTexturesCompact.Dir.DOWN_LEFT, downLeft,
+										ConnectedTexturesCompact.Dir.RIGHT, upRight, sprites, side, quad, renderEnv)
+										: getQuadsCompact(ConnectedTexturesCompact.Dir.UP_LEFT, upLeft,
+												ConnectedTexturesCompact.Dir.UP_RIGHT, upRight,
+												ConnectedTexturesCompact.Dir.DOWN_LEFT, downLeft,
+												ConnectedTexturesCompact.Dir.DOWN_RIGHT, downRight, sprites, side, quad,
+												renderEnv))));
+	}
+
+	private static BakedQuad[] getQuadsCompact(int index, EaglerTextureAtlasSprite[] sprites, BakedQuad quad,
+			RenderEnv renderEnv) {
+		EaglerTextureAtlasSprite textureatlassprite = sprites[index];
+		return ConnectedTextures.getQuads(textureatlassprite, quad, renderEnv);
+	}
+
+	private static BakedQuad[] getQuadsCompact(ConnectedTexturesCompact.Dir dir1, int index1,
+			ConnectedTexturesCompact.Dir dir2, int index2, EaglerTextureAtlasSprite[] sprites, int side, BakedQuad quad,
+			RenderEnv renderEnv) {
+		BakedQuad bakedquad = getQuadCompact(sprites[index1], dir1, side, quad, renderEnv);
+		BakedQuad bakedquad1 = getQuadCompact(sprites[index2], dir2, side, quad, renderEnv);
+		return renderEnv.getArrayQuadsCtm(bakedquad, bakedquad1);
+	}
+
+	private static BakedQuad[] getQuadsCompact(ConnectedTexturesCompact.Dir dir1, int index1,
+			ConnectedTexturesCompact.Dir dir2, int index2, ConnectedTexturesCompact.Dir dir3, int index3,
+			EaglerTextureAtlasSprite[] sprites, int side, BakedQuad quad, RenderEnv renderEnv) {
+		BakedQuad bakedquad = getQuadCompact(sprites[index1], dir1, side, quad, renderEnv);
+		BakedQuad bakedquad1 = getQuadCompact(sprites[index2], dir2, side, quad, renderEnv);
+		BakedQuad bakedquad2 = getQuadCompact(sprites[index3], dir3, side, quad, renderEnv);
+		return renderEnv.getArrayQuadsCtm(bakedquad, bakedquad1, bakedquad2);
+	}
+
+	private static BakedQuad[] getQuadsCompact(ConnectedTexturesCompact.Dir dir1, int index1,
+			ConnectedTexturesCompact.Dir dir2, int index2, ConnectedTexturesCompact.Dir dir3, int index3,
+			ConnectedTexturesCompact.Dir dir4, int index4, EaglerTextureAtlasSprite[] sprites, int side, BakedQuad quad,
+			RenderEnv renderEnv) {
+		BakedQuad bakedquad = getQuadCompact(sprites[index1], dir1, side, quad, renderEnv);
+		BakedQuad bakedquad1 = getQuadCompact(sprites[index2], dir2, side, quad, renderEnv);
+		BakedQuad bakedquad2 = getQuadCompact(sprites[index3], dir3, side, quad, renderEnv);
+		BakedQuad bakedquad3 = getQuadCompact(sprites[index4], dir4, side, quad, renderEnv);
+		return renderEnv.getArrayQuadsCtm(bakedquad, bakedquad1, bakedquad2, bakedquad3);
+	}
+
+	private static BakedQuad getQuadCompact(EaglerTextureAtlasSprite sprite, ConnectedTexturesCompact.Dir dir, int side,
+			BakedQuad quad, RenderEnv renderEnv) {
+		switch (dir) {
+		case UP:
+			return getQuadCompact(sprite, dir, 0, 0, 16, 8, side, quad, renderEnv);
+
+		case UP_RIGHT:
+			return getQuadCompact(sprite, dir, 8, 0, 16, 8, side, quad, renderEnv);
+
+		case RIGHT:
+			return getQuadCompact(sprite, dir, 8, 0, 16, 16, side, quad, renderEnv);
+
+		case DOWN_RIGHT:
+			return getQuadCompact(sprite, dir, 8, 8, 16, 16, side, quad, renderEnv);
+
+		case DOWN:
+			return getQuadCompact(sprite, dir, 0, 8, 16, 16, side, quad, renderEnv);
+
+		case DOWN_LEFT:
+			return getQuadCompact(sprite, dir, 0, 8, 8, 16, side, quad, renderEnv);
+
+		case LEFT:
+			return getQuadCompact(sprite, dir, 0, 0, 8, 16, side, quad, renderEnv);
+
+		case UP_LEFT:
+			return getQuadCompact(sprite, dir, 0, 0, 8, 8, side, quad, renderEnv);
+
+		default:
+			return quad;
+		}
+	}
+
+	private static BakedQuad getQuadCompact(EaglerTextureAtlasSprite sprite, ConnectedTexturesCompact.Dir dir, int x1,
+			int y1, int x2, int y2, int side, BakedQuad quadIn, RenderEnv renderEnv) {
+		Map[][] amap = ConnectedTextures.getSpriteQuadCompactMaps();
+
+		if (amap == null) {
+			return quadIn;
+		} else {
+			int i = sprite.getIndexInMap();
+
+			if (i >= 0 && i < amap.length) {
+				Map[] amap1 = amap[i];
+
+				if (amap1 == null) {
+					amap1 = new Map[ConnectedTexturesCompact.Dir.VALUES.length];
+					amap[i] = amap1;
+				}
+
+				Map<BakedQuad, BakedQuad> map = amap1[dir.ordinal()];
+
+				if (map == null) {
+					map = new IdentityHashMap(1);
+					amap1[dir.ordinal()] = map;
+				}
+
+				BakedQuad bakedquad = (BakedQuad) map.get(quadIn);
+
+				if (bakedquad == null) {
+					bakedquad = makeSpriteQuadCompact(quadIn, sprite, side, x1, y1, x2, y2);
+					map.put(quadIn, bakedquad);
+				}
+
+				return bakedquad;
+			} else {
+				return quadIn;
+			}
+		}
+	}
+
+	private static BakedQuad makeSpriteQuadCompact(BakedQuad quad, EaglerTextureAtlasSprite sprite, int side, int x1,
+			int y1, int x2, int y2) {
+		int[] aint = (int[]) quad.getVertexData().clone();
+		int[] aint2 = (int[]) quad.getVertexDataWithNormals().clone();
+		EaglerTextureAtlasSprite textureatlassprite = quad.getSprite();
+
+		for (int i = 0; i < 4; ++i) {
+			fixVertexCompact(aint, aint2, i, textureatlassprite, sprite, side, x1, y1, x2, y2);
+		}
+
+		BakedQuad bakedquad = new BakedQuad(aint, aint2, quad.getTintIndex(), quad.getFace(), sprite);
+		return bakedquad;
+	}
+
+	private static void fixVertexCompact(int[] data, int[] data2, int vertex, EaglerTextureAtlasSprite spriteFrom,
+			EaglerTextureAtlasSprite spriteTo, int side, int x1, int y1, int x2, int y2) {
+		int i = data.length / 4;
+		int j = i * vertex;
+		int i2 = data2.length / 4;
+		int j2 = i2 * vertex;
+		float f = Float.intBitsToFloat(data[j + 4]);
+		float f1 = Float.intBitsToFloat(data[j + 4 + 1]);
+		double d0 = spriteFrom.getSpriteU16(f);
+		double d1 = spriteFrom.getSpriteV16(f1);
+		float f2 = Float.intBitsToFloat(data[j + 0]);
+		float f3 = Float.intBitsToFloat(data[j + 1]);
+		float f4 = Float.intBitsToFloat(data[j + 2]);
+		float f5;
+		float f6;
+
+		switch (side) {
+		case 0:
+			f5 = f2;
+			f6 = 1.0F - f4;
+			break;
+
+		case 1:
+			f5 = f2;
+			f6 = f4;
+			break;
+
+		case 2:
+			f5 = 1.0F - f2;
+			f6 = 1.0F - f3;
+			break;
+
+		case 3:
+			f5 = f2;
+			f6 = 1.0F - f3;
+			break;
+
+		case 4:
+			f5 = f4;
+			f6 = 1.0F - f3;
+			break;
+
+		case 5:
+			f5 = 1.0F - f4;
+			f6 = 1.0F - f3;
+			break;
+
+		default:
+			return;
+		}
+
+		float f7 = 15.968F;
+		float f8 = 15.968F;
+
+		if (d0 < (double) x1) {
+			f5 = (float) ((double) f5 + ((double) x1 - d0) / (double) f7);
+			d0 = (double) x1;
+		}
+
+		if (d0 > (double) x2) {
+			f5 = (float) ((double) f5 - (d0 - (double) x2) / (double) f7);
+			d0 = (double) x2;
+		}
+
+		if (d1 < (double) y1) {
+			f6 = (float) ((double) f6 + ((double) y1 - d1) / (double) f8);
+			d1 = (double) y1;
+		}
+
+		if (d1 > (double) y2) {
+			f6 = (float) ((double) f6 - (d1 - (double) y2) / (double) f8);
+			d1 = (double) y2;
+		}
+
+		switch (side) {
+		case 0:
+			f2 = f5;
+			f4 = 1.0F - f6;
+			break;
+
+		case 1:
+			f2 = f5;
+			f4 = f6;
+			break;
+
+		case 2:
+			f2 = 1.0F - f5;
+			f3 = 1.0F - f6;
+			break;
+
+		case 3:
+			f2 = f5;
+			f3 = 1.0F - f6;
+			break;
+
+		case 4:
+			f4 = f5;
+			f3 = 1.0F - f6;
+			break;
+
+		case 5:
+			f4 = 1.0F - f5;
+			f3 = 1.0F - f6;
+			break;
+
+		default:
+			return;
+		}
+
+		data[j + 4] = data2[j2 + 4] = Float.floatToRawIntBits(spriteTo.getInterpolatedU(d0));
+		data[j + 4 + 1] = data2[j2 + 4 + 1] = Float.floatToRawIntBits(spriteTo.getInterpolatedV(d1));
+		data[j + 0] = data2[j2 + 0] = Float.floatToRawIntBits(f2);
+		data[j + 1] = data2[j2 + 1] = Float.floatToRawIntBits(f3);
+		data[j + 2] = data2[j2 + 2] = Float.floatToRawIntBits(f4);
+	}
+
+	private static enum Dir {
+		UP, UP_RIGHT, RIGHT, DOWN_RIGHT, DOWN, DOWN_LEFT, LEFT, UP_LEFT;
+
+		public static final ConnectedTexturesCompact.Dir[] VALUES = values();
+	}
+}
diff --git a/sources/main/java/net/optifine/CustomItemProperties.java b/sources/main/java/net/optifine/CustomItemProperties.java
new file mode 100644
index 00000000..c368b81d
--- /dev/null
+++ b/sources/main/java/net/optifine/CustomItemProperties.java
@@ -0,0 +1,972 @@
+package net.optifine;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.TreeSet;
+
+import net.lax1dude.eaglercraft.v1_8.internal.ITextureGL;
+import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU;
+import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.block.model.BlockPart;
+import net.minecraft.client.renderer.block.model.BlockPartFace;
+import net.minecraft.client.renderer.block.model.FaceBakery;
+import net.minecraft.client.renderer.block.model.ItemModelGenerator;
+import net.minecraft.client.renderer.block.model.ModelBlock;
+import net.minecraft.client.renderer.texture.ITextureObject;
+import net.minecraft.client.renderer.texture.TextureManager;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.client.resources.model.ModelBakery;
+import net.minecraft.client.resources.model.ModelManager;
+import net.minecraft.client.resources.model.ModelResourceLocation;
+import net.minecraft.client.resources.model.ModelRotation;
+import net.minecraft.client.resources.model.SimpleBakedModel;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.ResourceLocation;
+import net.optifine.config.IParserInt;
+import net.optifine.config.NbtTagValue;
+import net.optifine.config.ParserEnchantmentId;
+import net.optifine.config.RangeInt;
+import net.optifine.config.RangeListInt;
+import net.optifine.render.Blender;
+import net.optifine.util.StrUtils;
+import net.optifine.util.TextureUtils;
+
+public class CustomItemProperties {
+	public String name = null;
+	public String basePath = null;
+	public int type = 1;
+	public int[] items = null;
+	public String texture = null;
+	public Map<String, String> mapTextures = null;
+	public String model = null;
+	public Map<String, String> mapModels = null;
+	public RangeListInt damage = null;
+	public boolean damagePercent = false;
+	public int damageMask = 0;
+	public RangeListInt stackSize = null;
+	public RangeListInt enchantmentIds = null;
+	public RangeListInt enchantmentLevels = null;
+	public NbtTagValue[] nbtTagValues = null;
+	public int hand = 0;
+	public int blend = 1;
+	public float speed = 0.0F;
+	public float rotation = 0.0F;
+	public int layer = 0;
+	public float duration = 1.0F;
+	public int weight = 0;
+	public ResourceLocation textureLocation = null;
+	public Map mapTextureLocations = null;
+	public EaglerTextureAtlasSprite sprite = null;
+	public Map mapSprites = null;
+	public IBakedModel bakedModelTexture = null;
+	public Map<String, IBakedModel> mapBakedModelsTexture = null;
+	public IBakedModel bakedModelFull = null;
+	public Map<String, IBakedModel> mapBakedModelsFull = null;
+	private int textureWidth = 0;
+	private int textureHeight = 0;
+	public static final int TYPE_UNKNOWN = 0;
+	public static final int TYPE_ITEM = 1;
+	public static final int TYPE_ENCHANTMENT = 2;
+	public static final int TYPE_ARMOR = 3;
+	public static final int HAND_ANY = 0;
+	public static final int HAND_MAIN = 1;
+	public static final int HAND_OFF = 2;
+	public static final String INVENTORY = "inventory";
+
+	public CustomItemProperties(Properties props, String path) {
+		this.name = parseName(path);
+		this.basePath = parseBasePath(path);
+		this.type = this.parseType(props.getProperty("type"));
+		this.items = this.parseItems(props.getProperty("items"), props.getProperty("matchItems"));
+		this.mapModels = parseModels(props, this.basePath);
+		this.model = parseModel(props.getProperty("model"), path, this.basePath, this.type, this.mapModels);
+		this.mapTextures = parseTextures(props, this.basePath);
+		boolean flag = this.mapModels == null && this.model == null;
+		this.texture = parseTexture(props.getProperty("texture"), props.getProperty("tile"),
+				props.getProperty("source"), path, this.basePath, this.type, this.mapTextures, flag);
+		String s = props.getProperty("damage");
+
+		if (s != null) {
+			this.damagePercent = s.contains("%");
+			s = s.replace("%", "");
+			this.damage = this.parseRangeListInt(s);
+			this.damageMask = this.parseInt(props.getProperty("damageMask"), 0);
+		}
+
+		this.stackSize = this.parseRangeListInt(props.getProperty("stackSize"));
+		this.enchantmentIds = this.parseRangeListInt(props.getProperty("enchantmentIDs"), new ParserEnchantmentId());
+		this.enchantmentLevels = this.parseRangeListInt(props.getProperty("enchantmentLevels"));
+		this.nbtTagValues = this.parseNbtTagValues(props);
+		this.hand = this.parseHand(props.getProperty("hand"));
+		this.blend = Blender.parseBlend(props.getProperty("blend"));
+		this.speed = this.parseFloat(props.getProperty("speed"), 0.0F);
+		this.rotation = this.parseFloat(props.getProperty("rotation"), 0.0F);
+		this.layer = this.parseInt(props.getProperty("layer"), 0);
+		this.weight = this.parseInt(props.getProperty("weight"), 0);
+		this.duration = this.parseFloat(props.getProperty("duration"), 1.0F);
+	}
+
+	private static String parseName(String path) {
+		String s = path;
+		int i = path.lastIndexOf(47);
+
+		if (i >= 0) {
+			s = path.substring(i + 1);
+		}
+
+		int j = s.lastIndexOf(46);
+
+		if (j >= 0) {
+			s = s.substring(0, j);
+		}
+
+		return s;
+	}
+
+	private static String parseBasePath(String path) {
+		int i = path.lastIndexOf(47);
+		return i < 0 ? "" : path.substring(0, i);
+	}
+
+	private int parseType(String str) {
+		if (str == null) {
+			return 1;
+		} else if (str.equals("item")) {
+			return 1;
+		} else if (str.equals("enchantment")) {
+			return 2;
+		} else if (str.equals("armor")) {
+			return 3;
+		} else {
+			Config.warn("Unknown method: " + str);
+			return 0;
+		}
+	}
+
+	private int[] parseItems(String str, String str2) {
+		if (str == null) {
+			str = str2;
+		}
+
+		if (str == null) {
+			return null;
+		} else {
+			str = str.trim();
+			Set set = new TreeSet();
+			String[] astring = Config.tokenize(str, " ");
+			label45:
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+				int j = Config.parseInt(s, -1);
+
+				if (j >= 0) {
+					set.add(Integer.valueOf(j));
+				} else {
+					if (s.contains("-")) {
+						String[] astring1 = Config.tokenize(s, "-");
+
+						if (astring1.length == 2) {
+							int k = Config.parseInt(astring1[0], -1);
+							int l = Config.parseInt(astring1[1], -1);
+
+							if (k >= 0 && l >= 0) {
+								int i1 = Math.min(k, l);
+								int j1 = Math.max(k, l);
+								int k1 = i1;
+
+								while (true) {
+									if (k1 > j1) {
+										continue label45;
+									}
+
+									set.add(Integer.valueOf(k1));
+									++k1;
+								}
+							}
+						}
+					}
+
+					Item item = Item.getByNameOrId(s);
+
+					if (item == null) {
+						Config.warn("Item not found: " + s);
+					} else {
+						int i2 = Item.getIdFromItem(item);
+
+						if (i2 <= 0) {
+							Config.warn("Item not found: " + s);
+						} else {
+							set.add(Integer.valueOf(i2));
+						}
+					}
+				}
+			}
+
+			Integer[] ainteger = (Integer[]) ((Integer[]) set.toArray(new Integer[set.size()]));
+			int[] aint = new int[ainteger.length];
+
+			for (int l1 = 0; l1 < aint.length; ++l1) {
+				aint[l1] = ainteger[l1].intValue();
+			}
+
+			return aint;
+		}
+	}
+
+	private static String parseTexture(String texStr, String texStr2, String texStr3, String path, String basePath,
+			int type, Map<String, String> mapTexs, boolean textureFromPath) {
+		if (texStr == null) {
+			texStr = texStr2;
+		}
+
+		if (texStr == null) {
+			texStr = texStr3;
+		}
+
+		if (texStr != null) {
+			String s2 = ".png";
+
+			if (texStr.endsWith(s2)) {
+				texStr = texStr.substring(0, texStr.length() - s2.length());
+			}
+
+			texStr = fixTextureName(texStr, basePath);
+			return texStr;
+		} else if (type == 3) {
+			return null;
+		} else {
+			if (mapTexs != null) {
+				String s = (String) mapTexs.get("texture.bow_standby");
+
+				if (s != null) {
+					return s;
+				}
+			}
+
+			if (!textureFromPath) {
+				return null;
+			} else {
+				String s1 = path;
+				int i = path.lastIndexOf(47);
+
+				if (i >= 0) {
+					s1 = path.substring(i + 1);
+				}
+
+				int j = s1.lastIndexOf(46);
+
+				if (j >= 0) {
+					s1 = s1.substring(0, j);
+				}
+
+				s1 = fixTextureName(s1, basePath);
+				return s1;
+			}
+		}
+	}
+
+	private static Map parseTextures(Properties props, String basePath) {
+		String s = "texture.";
+		Map map = getMatchingProperties(props, s);
+
+		if (map.size() <= 0) {
+			return null;
+		} else {
+			Set set = map.keySet();
+			Map map1 = new LinkedHashMap();
+
+			for (Object e : set) {
+				String s1 = (String) e;
+				String s2 = (String) map.get(s1);
+				s2 = fixTextureName(s2, basePath);
+				map1.put(s1, s2);
+			}
+
+			return map1;
+		}
+	}
+
+	private static String fixTextureName(String iconName, String basePath) {
+		iconName = TextureUtils.fixResourcePath(iconName, basePath);
+
+		if (!iconName.startsWith(basePath) && !iconName.startsWith("textures/") && !iconName.startsWith("mcpatcher/")) {
+			iconName = basePath + "/" + iconName;
+		}
+
+		if (iconName.endsWith(".png")) {
+			iconName = iconName.substring(0, iconName.length() - 4);
+		}
+
+		if (iconName.startsWith("/")) {
+			iconName = iconName.substring(1);
+		}
+
+		return iconName;
+	}
+
+	private static String parseModel(String modelStr, String path, String basePath, int type,
+			Map<String, String> mapModelNames) {
+		if (modelStr != null) {
+			String s1 = ".json";
+
+			if (modelStr.endsWith(s1)) {
+				modelStr = modelStr.substring(0, modelStr.length() - s1.length());
+			}
+
+			modelStr = fixModelName(modelStr, basePath);
+			return modelStr;
+		} else if (type == 3) {
+			return null;
+		} else {
+			if (mapModelNames != null) {
+				String s = (String) mapModelNames.get("model.bow_standby");
+
+				if (s != null) {
+					return s;
+				}
+			}
+
+			return modelStr;
+		}
+	}
+
+	private static Map parseModels(Properties props, String basePath) {
+		String s = "model.";
+		Map map = getMatchingProperties(props, s);
+
+		if (map.size() <= 0) {
+			return null;
+		} else {
+			Set set = map.keySet();
+			Map map1 = new LinkedHashMap();
+
+			for (Object e : set) {
+				String s1 = (String) e;
+				String s2 = (String) map.get(s1);
+				s2 = fixModelName(s2, basePath);
+				map1.put(s1, s2);
+			}
+
+			return map1;
+		}
+	}
+
+	private static String fixModelName(String modelName, String basePath) {
+		modelName = TextureUtils.fixResourcePath(modelName, basePath);
+		boolean flag = modelName.startsWith("block/") || modelName.startsWith("item/");
+
+		if (!modelName.startsWith(basePath) && !flag && !modelName.startsWith("mcpatcher/")) {
+			modelName = basePath + "/" + modelName;
+		}
+
+		String s = ".json";
+
+		if (modelName.endsWith(s)) {
+			modelName = modelName.substring(0, modelName.length() - s.length());
+		}
+
+		if (modelName.startsWith("/")) {
+			modelName = modelName.substring(1);
+		}
+
+		return modelName;
+	}
+
+	private int parseInt(String str, int defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			str = str.trim();
+			int i = Config.parseInt(str, Integer.MIN_VALUE);
+
+			if (i == Integer.MIN_VALUE) {
+				Config.warn("Invalid integer: " + str);
+				return defVal;
+			} else {
+				return i;
+			}
+		}
+	}
+
+	private float parseFloat(String str, float defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			str = str.trim();
+			float f = Config.parseFloat(str, Float.MIN_VALUE);
+
+			if (f == Float.MIN_VALUE) {
+				Config.warn("Invalid float: " + str);
+				return defVal;
+			} else {
+				return f;
+			}
+		}
+	}
+
+	private RangeListInt parseRangeListInt(String str) {
+		return this.parseRangeListInt(str, (IParserInt) null);
+	}
+
+	private RangeListInt parseRangeListInt(String str, IParserInt parser) {
+		if (str == null) {
+			return null;
+		} else {
+			String[] astring = Config.tokenize(str, " ");
+			RangeListInt rangelistint = new RangeListInt();
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+
+				if (parser != null) {
+					int j = parser.parse(s, Integer.MIN_VALUE);
+
+					if (j != Integer.MIN_VALUE) {
+						rangelistint.addRange(new RangeInt(j, j));
+						continue;
+					}
+				}
+
+				RangeInt rangeint = this.parseRangeInt(s);
+
+				if (rangeint == null) {
+					Config.warn("Invalid range list: " + str);
+					return null;
+				}
+
+				rangelistint.addRange(rangeint);
+			}
+
+			return rangelistint;
+		}
+	}
+
+	private RangeInt parseRangeInt(String str) {
+		if (str == null) {
+			return null;
+		} else {
+			str = str.trim();
+			int i = str.length() - str.replace("-", "").length();
+
+			if (i > 1) {
+				Config.warn("Invalid range: " + str);
+				return null;
+			} else {
+				String[] astring = Config.tokenize(str, "- ");
+				int[] aint = new int[astring.length];
+
+				for (int j = 0; j < astring.length; ++j) {
+					String s = astring[j];
+					int k = Config.parseInt(s, -1);
+
+					if (k < 0) {
+						Config.warn("Invalid range: " + str);
+						return null;
+					}
+
+					aint[j] = k;
+				}
+
+				if (aint.length == 1) {
+					int i1 = aint[0];
+
+					if (str.startsWith("-")) {
+						return new RangeInt(0, i1);
+					} else if (str.endsWith("-")) {
+						return new RangeInt(i1, 65535);
+					} else {
+						return new RangeInt(i1, i1);
+					}
+				} else if (aint.length == 2) {
+					int l = Math.min(aint[0], aint[1]);
+					int j1 = Math.max(aint[0], aint[1]);
+					return new RangeInt(l, j1);
+				} else {
+					Config.warn("Invalid range: " + str);
+					return null;
+				}
+			}
+		}
+	}
+
+	private NbtTagValue[] parseNbtTagValues(Properties props) {
+		String s = "nbt.";
+		Map map = getMatchingProperties(props, s);
+
+		if (map.size() <= 0) {
+			return null;
+		} else {
+			List list = new ArrayList();
+
+			for (Object e : map.keySet()) {
+				String s1 = (String) e;
+				String s2 = (String) map.get(s1);
+				String s3 = s1.substring(s.length());
+				NbtTagValue nbttagvalue = new NbtTagValue(s3, s2);
+				list.add(nbttagvalue);
+			}
+
+			NbtTagValue[] anbttagvalue = (NbtTagValue[]) ((NbtTagValue[]) list.toArray(new NbtTagValue[list.size()]));
+			return anbttagvalue;
+		}
+	}
+
+	private static Map getMatchingProperties(Properties props, String keyPrefix) {
+		Map map = new LinkedHashMap();
+
+		for (Object e : props.keySet()) {
+			String s = (String) e;
+			String s1 = props.getProperty(s);
+
+			if (s.startsWith(keyPrefix)) {
+				map.put(s, s1);
+			}
+		}
+
+		return map;
+	}
+
+	private int parseHand(String str) {
+		if (str == null) {
+			return 0;
+		} else {
+			str = str.toLowerCase();
+
+			if (str.equals("any")) {
+				return 0;
+			} else if (str.equals("main")) {
+				return 1;
+			} else if (str.equals("off")) {
+				return 2;
+			} else {
+				Config.warn("Invalid hand: " + str);
+				return 0;
+			}
+		}
+	}
+
+	public boolean isValid(String path) {
+		if (this.name != null && this.name.length() > 0) {
+			if (this.basePath == null) {
+				Config.warn("No base path found: " + path);
+				return false;
+			} else if (this.type == 0) {
+				Config.warn("No type defined: " + path);
+				return false;
+			} else {
+				if (this.type == 1 || this.type == 3) {
+					if (this.items == null) {
+						this.items = this.detectItems();
+					}
+
+					if (this.items == null) {
+						Config.warn("No items defined: " + path);
+						return false;
+					}
+				}
+
+				if (this.texture == null && this.mapTextures == null && this.model == null && this.mapModels == null) {
+					Config.warn("No texture or model specified: " + path);
+					return false;
+				} else if (this.type == 2 && this.enchantmentIds == null) {
+					Config.warn("No enchantmentIDs specified: " + path);
+					return false;
+				} else {
+					return true;
+				}
+			}
+		} else {
+			Config.warn("No name found: " + path);
+			return false;
+		}
+	}
+
+	private int[] detectItems() {
+		Item item = Item.getByNameOrId(this.name);
+
+		if (item == null) {
+			return null;
+		} else {
+			int i = Item.getIdFromItem(item);
+			return i <= 0 ? null : new int[] { i };
+		}
+	}
+
+	public void updateIcons(TextureMap textureMap) {
+		if (this.texture != null) {
+			this.textureLocation = this.getTextureLocation(this.texture);
+
+			if (this.type == 1) {
+				ResourceLocation resourcelocation = this.getSpriteLocation(this.textureLocation);
+				this.sprite = textureMap.registerSprite(resourcelocation);
+			}
+		}
+
+		if (this.mapTextures != null) {
+			this.mapTextureLocations = new HashMap();
+			this.mapSprites = new HashMap();
+
+			for (String s : this.mapTextures.keySet()) {
+				String s1 = (String) this.mapTextures.get(s);
+				ResourceLocation resourcelocation1 = this.getTextureLocation(s1);
+				this.mapTextureLocations.put(s, resourcelocation1);
+
+				if (this.type == 1) {
+					ResourceLocation resourcelocation2 = this.getSpriteLocation(resourcelocation1);
+					EaglerTextureAtlasSprite textureatlassprite = textureMap.registerSprite(resourcelocation2);
+					this.mapSprites.put(s, textureatlassprite);
+				}
+			}
+		}
+	}
+
+	private ResourceLocation getTextureLocation(String texName) {
+		if (texName == null) {
+			return null;
+		} else {
+			ResourceLocation resourcelocation = new ResourceLocation(texName);
+			String s = resourcelocation.getResourceDomain();
+			String s1 = resourcelocation.getResourcePath();
+
+			if (!s1.contains("/")) {
+				s1 = "textures/items/" + s1;
+			}
+
+			String s2 = s1 + ".png";
+			ResourceLocation resourcelocation1 = new ResourceLocation(s, s2);
+			boolean flag = Config.hasResource(resourcelocation1);
+
+			if (!flag) {
+				Config.warn("File not found: " + s2);
+			}
+
+			return resourcelocation1;
+		}
+	}
+
+	private ResourceLocation getSpriteLocation(ResourceLocation resLoc) {
+		String s = resLoc.getResourcePath();
+		s = StrUtils.removePrefix(s, "textures/");
+		s = StrUtils.removeSuffix(s, ".png");
+		ResourceLocation resourcelocation = new ResourceLocation(resLoc.getResourceDomain(), s);
+		return resourcelocation;
+	}
+
+	public void updateModelTexture(TextureMap textureMap, ItemModelGenerator itemModelGenerator) {
+		if (this.texture != null || this.mapTextures != null) {
+			String[] astring = this.getModelTextures();
+			boolean flag = this.isUseTint();
+			this.bakedModelTexture = makeBakedModel(textureMap, itemModelGenerator, astring, flag);
+
+			if (this.type == 1 && this.mapTextures != null) {
+				for (String s : this.mapTextures.keySet()) {
+					String s1 = (String) this.mapTextures.get(s);
+					String s2 = StrUtils.removePrefix(s, "texture.");
+
+					if (s2.startsWith("bow") || s2.startsWith("fishing_rod") || s2.startsWith("shield")) {
+						String[] astring1 = new String[] { s1 };
+						IBakedModel ibakedmodel = makeBakedModel(textureMap, itemModelGenerator, astring1, flag);
+
+						if (this.mapBakedModelsTexture == null) {
+							this.mapBakedModelsTexture = new HashMap();
+						}
+
+						this.mapBakedModelsTexture.put(s2, ibakedmodel);
+					}
+				}
+			}
+		}
+	}
+
+	private boolean isUseTint() {
+		return true;
+	}
+
+	private static IBakedModel makeBakedModel(TextureMap textureMap, ItemModelGenerator itemModelGenerator,
+			String[] textures, boolean useTint) {
+		String[] astring = new String[textures.length];
+
+		for (int i = 0; i < astring.length; ++i) {
+			String s = textures[i];
+			astring[i] = StrUtils.removePrefix(s, "textures/");
+		}
+
+		ModelBlock modelblock = makeModelBlock(astring);
+		ModelBlock modelblock1 = itemModelGenerator.makeItemModel(textureMap, modelblock);
+		IBakedModel ibakedmodel = bakeModel(textureMap, modelblock1, useTint);
+		return ibakedmodel;
+	}
+
+	private String[] getModelTextures() {
+		if (this.type == 1 && this.items.length == 1) {
+			Item item = Item.getItemById(this.items[0]);
+
+			if (item == Items.potionitem && this.damage != null && this.damage.getCountRanges() > 0) {
+				RangeInt rangeint = this.damage.getRange(0);
+				int i = rangeint.getMin();
+				boolean flag = (i & 16384) != 0;
+				String s5 = this.getMapTexture(this.mapTextures, "texture.potion_overlay", "items/potion_overlay");
+				String s6 = null;
+
+				if (flag) {
+					s6 = this.getMapTexture(this.mapTextures, "texture.potion_bottle_splash",
+							"items/potion_bottle_splash");
+				} else {
+					s6 = this.getMapTexture(this.mapTextures, "texture.potion_bottle_drinkable",
+							"items/potion_bottle_drinkable");
+				}
+
+				return new String[] { s5, s6 };
+			}
+
+			if (item instanceof ItemArmor) {
+				ItemArmor itemarmor = (ItemArmor) item;
+
+				if (itemarmor.getArmorMaterial() == ItemArmor.ArmorMaterial.LEATHER) {
+					String s = "leather";
+					String s1 = "helmet";
+
+					if (itemarmor.armorType == 0) {
+						s1 = "helmet";
+					}
+
+					if (itemarmor.armorType == 1) {
+						s1 = "chestplate";
+					}
+
+					if (itemarmor.armorType == 2) {
+						s1 = "leggings";
+					}
+
+					if (itemarmor.armorType == 3) {
+						s1 = "boots";
+					}
+
+					String s2 = s + "_" + s1;
+					String s3 = this.getMapTexture(this.mapTextures, "texture." + s2, "items/" + s2);
+					String s4 = this.getMapTexture(this.mapTextures, "texture." + s2 + "_overlay",
+							"items/" + s2 + "_overlay");
+					return new String[] { s3, s4 };
+				}
+			}
+		}
+
+		return new String[] { this.texture };
+	}
+
+	private String getMapTexture(Map<String, String> map, String key, String def) {
+		if (map == null) {
+			return def;
+		} else {
+			String s = (String) map.get(key);
+			return s == null ? def : s;
+		}
+	}
+
+	private static ModelBlock makeModelBlock(String[] modelTextures) {
+		StringBuffer stringbuffer = new StringBuffer();
+		stringbuffer.append("{\"parent\": \"builtin/generated\",\"textures\": {");
+
+		for (int i = 0; i < modelTextures.length; ++i) {
+			String s = modelTextures[i];
+
+			if (i > 0) {
+				stringbuffer.append(", ");
+			}
+
+			stringbuffer.append("\"layer" + i + "\": \"" + s + "\"");
+		}
+
+		stringbuffer.append("}}");
+		String s1 = stringbuffer.toString();
+		ModelBlock modelblock = ModelBlock.deserialize(s1);
+		return modelblock;
+	}
+
+	private static IBakedModel bakeModel(TextureMap textureMap, ModelBlock modelBlockIn, boolean useTint) {
+		ModelRotation modelrotation = ModelRotation.X0_Y0;
+		boolean flag = false;
+		String s = modelBlockIn.resolveTextureName("particle");
+		EaglerTextureAtlasSprite textureatlassprite = textureMap.getAtlasSprite((new ResourceLocation(s)).toString());
+		SimpleBakedModel.Builder simplebakedmodel$builder = (new SimpleBakedModel.Builder(modelBlockIn))
+				.setTexture(textureatlassprite);
+
+		for (BlockPart blockpart : modelBlockIn.getElements()) {
+			for (EnumFacing enumfacing : blockpart.mapFaces.keySet()) {
+				BlockPartFace blockpartface = (BlockPartFace) blockpart.mapFaces.get(enumfacing);
+
+				if (!useTint) {
+					blockpartface = new BlockPartFace(blockpartface.cullFace, -1, blockpartface.texture,
+							blockpartface.blockFaceUV);
+				}
+
+				String s1 = modelBlockIn.resolveTextureName(blockpartface.texture);
+				EaglerTextureAtlasSprite textureatlassprite1 = textureMap
+						.getAtlasSprite((new ResourceLocation(s1)).toString());
+				BakedQuad bakedquad = makeBakedQuad(blockpart, blockpartface, textureatlassprite1, enumfacing,
+						modelrotation, flag);
+
+				if (blockpartface.cullFace == null) {
+					simplebakedmodel$builder.addGeneralQuad(bakedquad);
+				} else {
+					simplebakedmodel$builder.addFaceQuad(modelrotation.rotateFace(blockpartface.cullFace), bakedquad);
+				}
+			}
+		}
+
+		return simplebakedmodel$builder.makeBakedModel();
+	}
+
+	private static BakedQuad makeBakedQuad(BlockPart blockPart, BlockPartFace blockPartFace,
+			EaglerTextureAtlasSprite textureAtlasSprite, EnumFacing enumFacing, ModelRotation modelRotation,
+			boolean uvLocked) {
+		FaceBakery facebakery = new FaceBakery();
+		return facebakery.makeBakedQuad(blockPart.positionFrom, blockPart.positionTo, blockPartFace, textureAtlasSprite,
+				enumFacing, modelRotation, blockPart.partRotation, uvLocked, blockPart.shade);
+	}
+
+	public String toString() {
+		return "" + this.basePath + "/" + this.name + ", type: " + this.type + ", items: ["
+				+ Config.arrayToString(this.items) + "], textture: " + this.texture;
+	}
+
+	public float getTextureWidth(TextureManager textureManager) {
+		if (this.textureWidth <= 0) {
+			if (this.textureLocation != null) {
+				ITextureObject itextureobject = textureManager.getTexture(this.textureLocation);
+				ITextureGL nativeTex = EaglercraftGPU.getNativeTexture(itextureobject.getGlTextureId());
+				this.textureWidth = nativeTex != null ? nativeTex.getWidth() : 0;
+			}
+
+			if (this.textureWidth <= 0) {
+				this.textureWidth = 16;
+			}
+		}
+
+		return (float) this.textureWidth;
+	}
+
+	public float getTextureHeight(TextureManager textureManager) {
+		if (this.textureHeight <= 0) {
+			if (this.textureLocation != null) {
+				ITextureObject itextureobject = textureManager.getTexture(this.textureLocation);
+				ITextureGL nativeTex = EaglercraftGPU.getNativeTexture(itextureobject.getGlTextureId());
+				this.textureHeight = nativeTex != null ? nativeTex.getWidth() : 0;
+			}
+
+			if (this.textureHeight <= 0) {
+				this.textureHeight = 16;
+			}
+		}
+
+		return (float) this.textureHeight;
+	}
+
+	public IBakedModel getBakedModel(ResourceLocation modelLocation, boolean fullModel) {
+		IBakedModel ibakedmodel;
+		Map<String, IBakedModel> map;
+
+		if (fullModel) {
+			ibakedmodel = this.bakedModelFull;
+			map = this.mapBakedModelsFull;
+		} else {
+			ibakedmodel = this.bakedModelTexture;
+			map = this.mapBakedModelsTexture;
+		}
+
+		if (modelLocation != null && map != null) {
+			String s = modelLocation.getResourcePath();
+			IBakedModel ibakedmodel1 = (IBakedModel) map.get(s);
+
+			if (ibakedmodel1 != null) {
+				return ibakedmodel1;
+			}
+		}
+
+		return ibakedmodel;
+	}
+
+	public void loadModels(ModelBakery modelBakery) {
+		if (this.model != null) {
+			loadItemModel(modelBakery, this.model);
+		}
+
+		if (this.type == 1 && this.mapModels != null) {
+			for (String s : this.mapModels.keySet()) {
+				String s1 = (String) this.mapModels.get(s);
+				String s2 = StrUtils.removePrefix(s, "model.");
+
+				if (s2.startsWith("bow") || s2.startsWith("fishing_rod") || s2.startsWith("shield")) {
+					loadItemModel(modelBakery, s1);
+				}
+			}
+		}
+	}
+
+	public void updateModelsFull() {
+		ModelManager modelmanager = Minecraft.getMinecraft().getModelManager();
+		IBakedModel ibakedmodel = modelmanager.getMissingModel();
+
+		if (this.model != null) {
+			ResourceLocation resourcelocation = getModelLocation(this.model);
+			ModelResourceLocation modelresourcelocation = new ModelResourceLocation(resourcelocation, "inventory");
+			this.bakedModelFull = modelmanager.getModel(modelresourcelocation);
+
+			if (this.bakedModelFull == ibakedmodel) {
+				Config.warn("Custom Items: Model not found " + modelresourcelocation.getResourcePath());
+				this.bakedModelFull = null;
+			}
+		}
+
+		if (this.type == 1 && this.mapModels != null) {
+			for (String s : this.mapModels.keySet()) {
+				String s1 = (String) this.mapModels.get(s);
+				String s2 = StrUtils.removePrefix(s, "model.");
+
+				if (s2.startsWith("bow") || s2.startsWith("fishing_rod") || s2.startsWith("shield")) {
+					ResourceLocation resourcelocation1 = getModelLocation(s1);
+					ModelResourceLocation modelresourcelocation1 = new ModelResourceLocation(resourcelocation1,
+							"inventory");
+					IBakedModel ibakedmodel1 = modelmanager.getModel(modelresourcelocation1);
+
+					if (ibakedmodel1 == ibakedmodel) {
+						Config.warn("Custom Items: Model not found " + modelresourcelocation1.getResourcePath());
+					} else {
+						if (this.mapBakedModelsFull == null) {
+							this.mapBakedModelsFull = new HashMap();
+						}
+
+						this.mapBakedModelsFull.put(s2, ibakedmodel1);
+					}
+				}
+			}
+		}
+	}
+
+	private static void loadItemModel(ModelBakery modelBakery, String model) {
+		ResourceLocation resourcelocation = getModelLocation(model);
+		ModelResourceLocation modelresourcelocation = new ModelResourceLocation(resourcelocation, "inventory");
+		modelBakery.loadItemModel(resourcelocation.toString(), modelresourcelocation, resourcelocation);
+	}
+
+	private static ResourceLocation getModelLocation(String modelName) {
+//		return Reflector.ModelLoader.exists() && !modelName.startsWith("mcpatcher/")
+//				&& !modelName.startsWith("optifine/") ? new ResourceLocation("models/" + modelName)
+//						: new ResourceLocation(modelName);
+		return new ResourceLocation(modelName);
+	}
+}
diff --git a/sources/main/java/net/optifine/CustomItems.java b/sources/main/java/net/optifine/CustomItems.java
new file mode 100644
index 00000000..fa394d0d
--- /dev/null
+++ b/sources/main/java/net/optifine/CustomItems.java
@@ -0,0 +1,840 @@
+package net.optifine;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.model.ModelBase;
+import net.minecraft.client.renderer.block.model.ItemModelGenerator;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.client.renderer.texture.TextureManager;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.resources.IResourcePack;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.client.resources.model.ModelBakery;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.init.Items;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.potion.Potion;
+import net.minecraft.util.ResourceLocation;
+import net.optifine.config.NbtTagValue;
+import net.optifine.render.Blender;
+import net.optifine.util.PropertiesOrdered;
+import net.optifine.util.ResUtils;
+import net.optifine.util.StrUtils;
+
+public class CustomItems {
+	private static CustomItemProperties[][] itemProperties = (CustomItemProperties[][]) null;
+	private static CustomItemProperties[][] enchantmentProperties = (CustomItemProperties[][]) null;
+	private static Map mapPotionIds = null;
+	private static ItemModelGenerator itemModelGenerator = new ItemModelGenerator();
+	private static boolean useGlint = true;
+	private static boolean renderOffHand = false;
+	public static final int MASK_POTION_SPLASH = 16384;
+	public static final int MASK_POTION_NAME = 63;
+	public static final int MASK_POTION_EXTENDED = 64;
+	public static final String KEY_TEXTURE_OVERLAY = "texture.potion_overlay";
+	public static final String KEY_TEXTURE_SPLASH = "texture.potion_bottle_splash";
+	public static final String KEY_TEXTURE_DRINKABLE = "texture.potion_bottle_drinkable";
+	public static final String DEFAULT_TEXTURE_OVERLAY = "items/potion_overlay";
+	public static final String DEFAULT_TEXTURE_SPLASH = "items/potion_bottle_splash";
+	public static final String DEFAULT_TEXTURE_DRINKABLE = "items/potion_bottle_drinkable";
+	private static final int[][] EMPTY_INT2_ARRAY = new int[0][];
+	private static final String TYPE_POTION_NORMAL = "normal";
+	private static final String TYPE_POTION_SPLASH = "splash";
+	private static final String TYPE_POTION_LINGER = "linger";
+
+	public static void update() {
+		itemProperties = (CustomItemProperties[][]) null;
+		enchantmentProperties = (CustomItemProperties[][]) null;
+		useGlint = true;
+
+		if (Config.isCustomItems()) {
+			readCitProperties("mcpatcher/cit.properties");
+			IResourcePack[] airesourcepack = Config.getResourcePacks();
+
+			for (int i = airesourcepack.length - 1; i >= 0; --i) {
+				IResourcePack iresourcepack = airesourcepack[i];
+				update(iresourcepack);
+			}
+
+			update(Minecraft.getMinecraft().getDefaultResourcePack());
+
+			if (itemProperties.length <= 0) {
+				itemProperties = (CustomItemProperties[][]) null;
+			}
+
+			if (enchantmentProperties.length <= 0) {
+				enchantmentProperties = (CustomItemProperties[][]) null;
+			}
+		}
+	}
+
+	private static void readCitProperties(String fileName) {
+		ResourceLocation resourcelocation = new ResourceLocation(fileName);
+		try (InputStream inputstream = Minecraft.getMinecraft().getResourceManager().getResource(resourcelocation)
+				.getInputStream()) {
+			Config.dbg("CustomItems: Loading " + fileName);
+			Properties properties = new PropertiesOrdered();
+			properties.load(inputstream);
+			inputstream.close();
+			useGlint = Config.parseBoolean(properties.getProperty("useGlint"), true);
+		} catch (FileNotFoundException var4) {
+			return;
+		} catch (IOException ioexception) {
+			ioexception.printStackTrace();
+		}
+	}
+
+	private static void update(IResourcePack rp) {
+		List<String> astring = ResUtils.collectPropertyFiles(rp, "mcpatcher/cit/", "optifine/cit/");
+		Map map = makeAutoImageProperties(rp);
+
+		if (map.size() > 0) {
+			astring.addAll(map.keySet());
+		}
+
+		Collections.sort(astring);
+		List list = makePropertyList(itemProperties);
+		List list1 = makePropertyList(enchantmentProperties);
+
+		for (int i = 0; i < astring.size(); ++i) {
+			String s = astring.get(i);
+			Config.dbg("CustomItems: " + s);
+
+			try {
+				CustomItemProperties customitemproperties = null;
+
+				if (map.containsKey(s)) {
+					customitemproperties = (CustomItemProperties) map.get(s);
+				}
+
+				if (customitemproperties == null) {
+					ResourceLocation resourcelocation = new ResourceLocation(s);
+					InputStream inputstream = rp.getInputStream(resourcelocation);
+
+					if (inputstream == null) {
+						Config.warn("CustomItems file not found: " + s);
+						continue;
+					}
+
+					Properties properties = new PropertiesOrdered();
+					properties.load(inputstream);
+					inputstream.close();
+					customitemproperties = new CustomItemProperties(properties, s);
+				}
+
+				if (customitemproperties.isValid(s)) {
+					addToItemList(customitemproperties, list);
+					addToEnchantmentList(customitemproperties, list1);
+				}
+			} catch (FileNotFoundException var11) {
+				Config.warn("CustomItems file not found: " + s);
+			} catch (Exception exception) {
+				exception.printStackTrace();
+			}
+		}
+
+		itemProperties = propertyListToArray(list);
+		enchantmentProperties = propertyListToArray(list1);
+		Comparator comparator = getPropertiesComparator();
+
+		for (int j = 0; j < itemProperties.length; ++j) {
+			CustomItemProperties[] acustomitemproperties = itemProperties[j];
+
+			if (acustomitemproperties != null) {
+				Arrays.sort(acustomitemproperties, comparator);
+			}
+		}
+
+		for (int k = 0; k < enchantmentProperties.length; ++k) {
+			CustomItemProperties[] acustomitemproperties1 = enchantmentProperties[k];
+
+			if (acustomitemproperties1 != null) {
+				Arrays.sort(acustomitemproperties1, comparator);
+			}
+		}
+	}
+
+	private static Comparator getPropertiesComparator() {
+		Comparator comparator = new Comparator() {
+			public int compare(Object o1, Object o2) {
+				CustomItemProperties customitemproperties = (CustomItemProperties) o1;
+				CustomItemProperties customitemproperties1 = (CustomItemProperties) o2;
+				return customitemproperties.layer != customitemproperties1.layer
+						? customitemproperties.layer - customitemproperties1.layer
+						: (customitemproperties.weight != customitemproperties1.weight
+								? customitemproperties1.weight - customitemproperties.weight
+								: (!customitemproperties.basePath.equals(customitemproperties1.basePath)
+										? customitemproperties.basePath.compareTo(customitemproperties1.basePath)
+										: customitemproperties.name.compareTo(customitemproperties1.name)));
+			}
+		};
+		return comparator;
+	}
+
+	public static void updateIcons(TextureMap textureMap) {
+		for (CustomItemProperties customitemproperties : getAllProperties()) {
+			customitemproperties.updateIcons(textureMap);
+		}
+	}
+
+	public static void loadModels(ModelBakery modelBakery) {
+		for (CustomItemProperties customitemproperties : getAllProperties()) {
+			customitemproperties.loadModels(modelBakery);
+		}
+	}
+
+	public static void updateModels() {
+		for (CustomItemProperties customitemproperties : getAllProperties()) {
+			if (customitemproperties.type == 1) {
+				TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
+				customitemproperties.updateModelTexture(texturemap, itemModelGenerator);
+				customitemproperties.updateModelsFull();
+			}
+		}
+	}
+
+	private static List<CustomItemProperties> getAllProperties() {
+		List<CustomItemProperties> list = new ArrayList();
+		addAll(itemProperties, list);
+		addAll(enchantmentProperties, list);
+		return list;
+	}
+
+	private static void addAll(CustomItemProperties[][] cipsArr, List<CustomItemProperties> list) {
+		if (cipsArr != null) {
+			for (int i = 0; i < cipsArr.length; ++i) {
+				CustomItemProperties[] acustomitemproperties = cipsArr[i];
+
+				if (acustomitemproperties != null) {
+					for (int j = 0; j < acustomitemproperties.length; ++j) {
+						CustomItemProperties customitemproperties = acustomitemproperties[j];
+
+						if (customitemproperties != null) {
+							list.add(customitemproperties);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	private static Map makeAutoImageProperties(IResourcePack rp) {
+		Map map = new HashMap();
+		map.putAll(makePotionImageProperties(rp, "normal", Item.getIdFromItem(Items.potionitem)));
+		map.putAll(makePotionImageProperties(rp, "splash", Item.getIdFromItem(Items.potionitem)));
+		map.putAll(makePotionImageProperties(rp, "linger", Item.getIdFromItem(Items.potionitem)));
+		return map;
+	}
+
+	private static Map makePotionImageProperties(IResourcePack rp, String type, int itemId) {
+		Map map = new HashMap();
+		String s = type + "/";
+		String[] astring = new String[] { "mcpatcher/cit/potion/" + s, "mcpatcher/cit/Potion/" + s, "optifine/cit/potion/" + s };
+		String[] astring1 = new String[] { ".png" };
+		Collection<String> astring2 = ResUtils.collectPotionFiles(rp, astring);
+
+		for (String s1 : astring2) {
+			String name = StrUtils.removePrefixSuffix(s1, astring, astring1);
+			Properties properties = makePotionProperties(name, type, itemId, s1);
+
+			if (properties != null) {
+				String s3 = StrUtils.removeSuffix(s1, astring1) + ".properties";
+				CustomItemProperties customitemproperties = new CustomItemProperties(properties, s3);
+				map.put(s3, customitemproperties);
+			}
+		}
+
+		return map;
+	}
+
+	private static Properties makePotionProperties(String name, String type, int itemId, String path) {
+		if (StrUtils.endsWith(name, new String[] { "_n", "_s" })) {
+			return null;
+		} else if (name.equals("empty") && type.equals("normal")) {
+			itemId = Item.getIdFromItem(Items.glass_bottle);
+			Properties properties = new PropertiesOrdered();
+			properties.put("type", "item");
+			properties.put("items", "" + itemId);
+			return properties;
+		} else {
+			int[] aint = (int[]) ((int[]) getMapPotionIds().get(name));
+
+			if (aint == null) {
+				Config.warn("Potion not found for image: " + path);
+				return null;
+			} else {
+				StringBuffer stringbuffer = new StringBuffer();
+
+				for (int i = 0; i < aint.length; ++i) {
+					int j = aint[i];
+
+					if (type.equals("splash")) {
+						j |= 16384;
+					}
+
+					if (i > 0) {
+						stringbuffer.append(" ");
+					}
+
+					stringbuffer.append(j);
+				}
+
+				int k = 16447;
+
+				if (name.equals("water") || name.equals("mundane")) {
+					k |= 64;
+				}
+
+				Properties properties1 = new PropertiesOrdered();
+				properties1.put("type", "item");
+				properties1.put("items", "" + itemId);
+				properties1.put("damage", "" + stringbuffer.toString());
+				properties1.put("damageMask", "" + k);
+
+				if (type.equals("splash")) {
+					properties1.put("texture.potion_bottle_splash", name);
+				} else {
+					properties1.put("texture.potion_bottle_drinkable", name);
+				}
+
+				return properties1;
+			}
+		}
+	}
+
+	private static Map getMapPotionIds() {
+		if (mapPotionIds == null) {
+			mapPotionIds = new LinkedHashMap();
+			mapPotionIds.put("water", getPotionId(0, 0));
+			mapPotionIds.put("awkward", getPotionId(0, 1));
+			mapPotionIds.put("thick", getPotionId(0, 2));
+			mapPotionIds.put("potent", getPotionId(0, 3));
+			mapPotionIds.put("regeneration", getPotionIds(1));
+			mapPotionIds.put("movespeed", getPotionIds(2));
+			mapPotionIds.put("fireresistance", getPotionIds(3));
+			mapPotionIds.put("poison", getPotionIds(4));
+			mapPotionIds.put("heal", getPotionIds(5));
+			mapPotionIds.put("nightvision", getPotionIds(6));
+			mapPotionIds.put("clear", getPotionId(7, 0));
+			mapPotionIds.put("bungling", getPotionId(7, 1));
+			mapPotionIds.put("charming", getPotionId(7, 2));
+			mapPotionIds.put("rank", getPotionId(7, 3));
+			mapPotionIds.put("weakness", getPotionIds(8));
+			mapPotionIds.put("damageboost", getPotionIds(9));
+			mapPotionIds.put("moveslowdown", getPotionIds(10));
+			mapPotionIds.put("leaping", getPotionIds(11));
+			mapPotionIds.put("harm", getPotionIds(12));
+			mapPotionIds.put("waterbreathing", getPotionIds(13));
+			mapPotionIds.put("invisibility", getPotionIds(14));
+			mapPotionIds.put("thin", getPotionId(15, 0));
+			mapPotionIds.put("debonair", getPotionId(15, 1));
+			mapPotionIds.put("sparkling", getPotionId(15, 2));
+			mapPotionIds.put("stinky", getPotionId(15, 3));
+			mapPotionIds.put("mundane", getPotionId(0, 4));
+			mapPotionIds.put("speed", mapPotionIds.get("movespeed"));
+			mapPotionIds.put("fire_resistance", mapPotionIds.get("fireresistance"));
+			mapPotionIds.put("instant_health", mapPotionIds.get("heal"));
+			mapPotionIds.put("night_vision", mapPotionIds.get("nightvision"));
+			mapPotionIds.put("strength", mapPotionIds.get("damageboost"));
+			mapPotionIds.put("slowness", mapPotionIds.get("moveslowdown"));
+			mapPotionIds.put("instant_damage", mapPotionIds.get("harm"));
+			mapPotionIds.put("water_breathing", mapPotionIds.get("waterbreathing"));
+		}
+
+		return mapPotionIds;
+	}
+
+	private static int[] getPotionIds(int baseId) {
+		return new int[] { baseId, baseId + 16, baseId + 32, baseId + 48 };
+	}
+
+	private static int[] getPotionId(int baseId, int subId) {
+		return new int[] { baseId + subId * 16 };
+	}
+
+	private static int getPotionNameDamage(String name) {
+		String s = "potion." + name;
+		Potion[] apotion = Potion.potionTypes;
+
+		for (int i = 0; i < apotion.length; ++i) {
+			Potion potion = apotion[i];
+
+			if (potion != null) {
+				String s1 = potion.getName();
+
+				if (s.equals(s1)) {
+					return potion.getId();
+				}
+			}
+		}
+
+		return -1;
+	}
+
+	private static List makePropertyList(CustomItemProperties[][] propsArr) {
+		List list = new ArrayList();
+
+		if (propsArr != null) {
+			for (int i = 0; i < propsArr.length; ++i) {
+				CustomItemProperties[] acustomitemproperties = propsArr[i];
+				List list1 = null;
+
+				if (acustomitemproperties != null) {
+					list1 = new ArrayList(Arrays.asList(acustomitemproperties));
+				}
+
+				list.add(list1);
+			}
+		}
+
+		return list;
+	}
+
+	private static CustomItemProperties[][] propertyListToArray(List list) {
+		CustomItemProperties[][] acustomitemproperties = new CustomItemProperties[list.size()][];
+
+		for (int i = 0; i < list.size(); ++i) {
+			List list1 = (List) list.get(i);
+
+			if (list1 != null) {
+				CustomItemProperties[] acustomitemproperties1 = (CustomItemProperties[]) ((CustomItemProperties[]) list1
+						.toArray(new CustomItemProperties[list1.size()]));
+				Arrays.sort(acustomitemproperties1, new CustomItemsComparator());
+				acustomitemproperties[i] = acustomitemproperties1;
+			}
+		}
+
+		return acustomitemproperties;
+	}
+
+	private static void addToItemList(CustomItemProperties cp, List itemList) {
+		if (cp.items != null) {
+			for (int i = 0; i < cp.items.length; ++i) {
+				int j = cp.items[i];
+
+				if (j <= 0) {
+					Config.warn("Invalid item ID: " + j);
+				} else {
+					addToList(cp, itemList, j);
+				}
+			}
+		}
+	}
+
+	private static void addToEnchantmentList(CustomItemProperties cp, List enchantmentList) {
+		if (cp.type == 2) {
+			if (cp.enchantmentIds != null) {
+				for (int i = 0; i < 256; ++i) {
+					if (cp.enchantmentIds.isInRange(i)) {
+						addToList(cp, enchantmentList, i);
+					}
+				}
+			}
+		}
+	}
+
+	private static void addToList(CustomItemProperties cp, List list, int id) {
+		while (id >= list.size()) {
+			list.add(null);
+		}
+
+		List list1 = (List) list.get(id);
+
+		if (list1 == null) {
+			list1 = new ArrayList();
+			list.set(id, list1);
+		}
+
+		list1.add(cp);
+	}
+
+	public static IBakedModel getCustomItemModel(ItemStack itemStack, IBakedModel model, ResourceLocation modelLocation,
+			boolean fullModel) {
+		if (!fullModel && model.isGui3d()) {
+			return model;
+		} else if (itemProperties == null) {
+			return model;
+		} else {
+			CustomItemProperties customitemproperties = getCustomItemProperties(itemStack, 1);
+
+			if (customitemproperties == null) {
+				return model;
+			} else {
+				IBakedModel ibakedmodel = customitemproperties.getBakedModel(modelLocation, fullModel);
+				return ibakedmodel != null ? ibakedmodel : model;
+			}
+		}
+	}
+
+	public static boolean bindCustomArmorTexture(ItemStack itemStack, int layer, String overlay) {
+		if (itemProperties == null) {
+			return false;
+		} else {
+			ResourceLocation resourcelocation = getCustomArmorLocation(itemStack, layer, overlay);
+
+			if (resourcelocation == null) {
+				return false;
+			} else {
+				Minecraft.getMinecraft().getTextureManager().bindTexture(resourcelocation);
+				return true;
+			}
+		}
+	}
+
+	private static ResourceLocation getCustomArmorLocation(ItemStack itemStack, int layer, String overlay) {
+		CustomItemProperties customitemproperties = getCustomItemProperties(itemStack, 3);
+
+		if (customitemproperties == null) {
+			return null;
+		} else if (customitemproperties.mapTextureLocations == null) {
+			return customitemproperties.textureLocation;
+		} else {
+			Item item = itemStack.getItem();
+
+			if (!(item instanceof ItemArmor)) {
+				return null;
+			} else {
+				ItemArmor itemarmor = (ItemArmor) item;
+				String s = itemarmor.getArmorMaterial().getName();
+				StringBuffer stringbuffer = new StringBuffer();
+				stringbuffer.append("texture.");
+				stringbuffer.append(s);
+				stringbuffer.append("_layer_");
+				stringbuffer.append(layer);
+
+				if (overlay != null) {
+					stringbuffer.append("_");
+					stringbuffer.append(overlay);
+				}
+
+				String s1 = stringbuffer.toString();
+				ResourceLocation resourcelocation = (ResourceLocation) customitemproperties.mapTextureLocations.get(s1);
+				return resourcelocation == null ? customitemproperties.textureLocation : resourcelocation;
+			}
+		}
+	}
+
+	private static CustomItemProperties getCustomItemProperties(ItemStack itemStack, int type) {
+		if (itemProperties == null) {
+			return null;
+		} else if (itemStack == null) {
+			return null;
+		} else {
+			Item item = itemStack.getItem();
+			int i = Item.getIdFromItem(item);
+
+			if (i >= 0 && i < itemProperties.length) {
+				CustomItemProperties[] acustomitemproperties = itemProperties[i];
+
+				if (acustomitemproperties != null) {
+					for (int j = 0; j < acustomitemproperties.length; ++j) {
+						CustomItemProperties customitemproperties = acustomitemproperties[j];
+
+						if (customitemproperties.type == type
+								&& matchesProperties(customitemproperties, itemStack, (int[][]) null)) {
+							return customitemproperties;
+						}
+					}
+				}
+			}
+
+			return null;
+		}
+	}
+
+	private static boolean matchesProperties(CustomItemProperties cip, ItemStack itemStack,
+			int[][] enchantmentIdLevels) {
+		Item item = itemStack.getItem();
+
+		if (cip.damage != null) {
+			int i = itemStack.getItemDamage();
+
+			if (cip.damageMask != 0) {
+				i &= cip.damageMask;
+			}
+
+			if (cip.damagePercent) {
+				int j = item.getMaxDamage();
+				i = (int) ((double) (i * 100) / (double) j);
+			}
+
+			if (!cip.damage.isInRange(i)) {
+				return false;
+			}
+		}
+
+		if (cip.stackSize != null && !cip.stackSize.isInRange(itemStack.stackSize)) {
+			return false;
+		} else {
+			int[][] aint = enchantmentIdLevels;
+
+			if (cip.enchantmentIds != null) {
+				if (enchantmentIdLevels == null) {
+					aint = getEnchantmentIdLevels(itemStack);
+				}
+
+				boolean flag = false;
+
+				for (int k = 0; k < aint.length; ++k) {
+					int l = aint[k][0];
+
+					if (cip.enchantmentIds.isInRange(l)) {
+						flag = true;
+						break;
+					}
+				}
+
+				if (!flag) {
+					return false;
+				}
+			}
+
+			if (cip.enchantmentLevels != null) {
+				if (aint == null) {
+					aint = getEnchantmentIdLevels(itemStack);
+				}
+
+				boolean flag1 = false;
+
+				for (int i1 = 0; i1 < aint.length; ++i1) {
+					int k1 = aint[i1][1];
+
+					if (cip.enchantmentLevels.isInRange(k1)) {
+						flag1 = true;
+						break;
+					}
+				}
+
+				if (!flag1) {
+					return false;
+				}
+			}
+
+			if (cip.nbtTagValues != null) {
+				NBTTagCompound nbttagcompound = itemStack.getTagCompound();
+
+				for (int j1 = 0; j1 < cip.nbtTagValues.length; ++j1) {
+					NbtTagValue nbttagvalue = cip.nbtTagValues[j1];
+
+					if (!nbttagvalue.matches(nbttagcompound)) {
+						return false;
+					}
+				}
+			}
+
+			if (cip.hand != 0) {
+				if (cip.hand == 1 && renderOffHand) {
+					return false;
+				}
+
+				if (cip.hand == 2 && !renderOffHand) {
+					return false;
+				}
+			}
+
+			return true;
+		}
+	}
+
+	private static int[][] getEnchantmentIdLevels(ItemStack itemStack) {
+		Item item = itemStack.getItem();
+		NBTTagList nbttaglist = item == Items.enchanted_book ? Items.enchanted_book.getEnchantments(itemStack)
+				: itemStack.getEnchantmentTagList();
+
+		if (nbttaglist != null && nbttaglist.tagCount() > 0) {
+			int[][] aint = new int[nbttaglist.tagCount()][2];
+
+			for (int i = 0; i < nbttaglist.tagCount(); ++i) {
+				NBTTagCompound nbttagcompound = nbttaglist.getCompoundTagAt(i);
+				int j = nbttagcompound.getShort("id");
+				int k = nbttagcompound.getShort("lvl");
+				aint[i][0] = j;
+				aint[i][1] = k;
+			}
+
+			return aint;
+		} else {
+			return EMPTY_INT2_ARRAY;
+		}
+	}
+
+	public static boolean renderCustomEffect(RenderItem renderItem, ItemStack itemStack, IBakedModel model) {
+		if (enchantmentProperties == null) {
+			return false;
+		} else if (itemStack == null) {
+			return false;
+		} else {
+			int[][] aint = getEnchantmentIdLevels(itemStack);
+
+			if (aint.length <= 0) {
+				return false;
+			} else {
+				Set set = null;
+				boolean flag = false;
+				TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager();
+
+				for (int i = 0; i < aint.length; ++i) {
+					int j = aint[i][0];
+
+					if (j >= 0 && j < enchantmentProperties.length) {
+						CustomItemProperties[] acustomitemproperties = enchantmentProperties[j];
+
+						if (acustomitemproperties != null) {
+							for (int k = 0; k < acustomitemproperties.length; ++k) {
+								CustomItemProperties customitemproperties = acustomitemproperties[k];
+
+								if (set == null) {
+									set = new HashSet();
+								}
+
+								if (set.add(Integer.valueOf(j))
+										&& matchesProperties(customitemproperties, itemStack, aint)
+										&& customitemproperties.textureLocation != null) {
+									texturemanager.bindTexture(customitemproperties.textureLocation);
+									float f = customitemproperties.getTextureWidth(texturemanager);
+
+									if (!flag) {
+										flag = true;
+										GlStateManager.depthMask(false);
+										GlStateManager.depthFunc(514);
+										GlStateManager.disableLighting();
+										GlStateManager.matrixMode(5890);
+									}
+
+									Blender.setupBlend(customitemproperties.blend, 1.0F);
+									GlStateManager.pushMatrix();
+									GlStateManager.scale(f / 2.0F, f / 2.0F, f / 2.0F);
+									float f1 = customitemproperties.speed * (float) (Minecraft.getSystemTime() % 3000L)
+											/ 3000.0F / 8.0F;
+									GlStateManager.translate(f1, 0.0F, 0.0F);
+									GlStateManager.rotate(customitemproperties.rotation, 0.0F, 0.0F, 1.0F);
+									renderItem.renderModel(model, -1);
+									GlStateManager.popMatrix();
+								}
+							}
+						}
+					}
+				}
+
+				if (flag) {
+					GlStateManager.enableAlpha();
+					GlStateManager.enableBlend();
+					GlStateManager.blendFunc(770, 771);
+					GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+					GlStateManager.matrixMode(5888);
+					GlStateManager.enableLighting();
+					GlStateManager.depthFunc(515);
+					GlStateManager.depthMask(true);
+					texturemanager.bindTexture(TextureMap.locationBlocksTexture);
+				}
+
+				return flag;
+			}
+		}
+	}
+
+	public static boolean renderCustomArmorEffect(EntityLivingBase entity, ItemStack itemStack, ModelBase model,
+			float limbSwing, float prevLimbSwing, float partialTicks, float timeLimbSwing, float yaw, float pitch,
+			float scale) {
+		if (enchantmentProperties == null) {
+			return false;
+		} else if (itemStack == null) {
+			return false;
+		} else {
+			int[][] aint = getEnchantmentIdLevels(itemStack);
+
+			if (aint.length <= 0) {
+				return false;
+			} else {
+				Set set = null;
+				boolean flag = false;
+				TextureManager texturemanager = Minecraft.getMinecraft().getTextureManager();
+
+				for (int i = 0; i < aint.length; ++i) {
+					int j = aint[i][0];
+
+					if (j >= 0 && j < enchantmentProperties.length) {
+						CustomItemProperties[] acustomitemproperties = enchantmentProperties[j];
+
+						if (acustomitemproperties != null) {
+							for (int k = 0; k < acustomitemproperties.length; ++k) {
+								CustomItemProperties customitemproperties = acustomitemproperties[k];
+
+								if (set == null) {
+									set = new HashSet();
+								}
+
+								if (set.add(Integer.valueOf(j))
+										&& matchesProperties(customitemproperties, itemStack, aint)
+										&& customitemproperties.textureLocation != null) {
+									texturemanager.bindTexture(customitemproperties.textureLocation);
+									float f = customitemproperties.getTextureWidth(texturemanager);
+
+									if (!flag) {
+										flag = true;
+										GlStateManager.enableBlend();
+										GlStateManager.depthFunc(514);
+										GlStateManager.depthMask(false);
+									}
+
+									Blender.setupBlend(customitemproperties.blend, 1.0F);
+									GlStateManager.disableLighting();
+									GlStateManager.matrixMode(5890);
+									GlStateManager.loadIdentity();
+									GlStateManager.rotate(customitemproperties.rotation, 0.0F, 0.0F, 1.0F);
+									float f1 = f / 8.0F;
+									GlStateManager.scale(f1, f1 / 2.0F, f1);
+									float f2 = customitemproperties.speed * (float) (Minecraft.getSystemTime() % 3000L)
+											/ 3000.0F / 8.0F;
+									GlStateManager.translate(0.0F, f2, 0.0F);
+									GlStateManager.matrixMode(5888);
+									model.render(entity, limbSwing, prevLimbSwing, timeLimbSwing, yaw, pitch, scale);
+								}
+							}
+						}
+					}
+				}
+
+				if (flag) {
+					GlStateManager.enableAlpha();
+					GlStateManager.enableBlend();
+					GlStateManager.blendFunc(770, 771);
+					GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+					GlStateManager.matrixMode(5890);
+					GlStateManager.loadIdentity();
+					GlStateManager.matrixMode(5888);
+					GlStateManager.enableLighting();
+					GlStateManager.depthMask(true);
+					GlStateManager.depthFunc(515);
+					GlStateManager.disableBlend();
+				}
+
+				return flag;
+			}
+		}
+	}
+
+	public static boolean isUseGlint() {
+		return useGlint;
+	}
+}
diff --git a/sources/main/java/net/optifine/CustomItemsComparator.java b/sources/main/java/net/optifine/CustomItemsComparator.java
new file mode 100644
index 00000000..175241fe
--- /dev/null
+++ b/sources/main/java/net/optifine/CustomItemsComparator.java
@@ -0,0 +1,15 @@
+package net.optifine;
+
+import java.util.Comparator;
+
+public class CustomItemsComparator implements Comparator {
+	public int compare(Object o1, Object o2) {
+		CustomItemProperties customitemproperties = (CustomItemProperties) o1;
+		CustomItemProperties customitemproperties1 = (CustomItemProperties) o2;
+		return customitemproperties.weight != customitemproperties1.weight
+				? customitemproperties1.weight - customitemproperties.weight
+				: (!Config.equals(customitemproperties.basePath, customitemproperties1.basePath)
+						? customitemproperties.basePath.compareTo(customitemproperties1.basePath)
+						: customitemproperties.name.compareTo(customitemproperties1.name));
+	}
+}
diff --git a/sources/main/java/net/optifine/CustomSky.java b/sources/main/java/net/optifine/CustomSky.java
new file mode 100644
index 00000000..a72c2e24
--- /dev/null
+++ b/sources/main/java/net/optifine/CustomSky.java
@@ -0,0 +1,149 @@
+package net.optifine;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.texture.ITextureObject;
+import net.minecraft.client.renderer.texture.TextureManager;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.World;
+import net.optifine.render.Blender;
+import net.optifine.util.PropertiesOrdered;
+
+public class CustomSky {
+	private static CustomSkyLayer[][] worldSkyLayers = (CustomSkyLayer[][]) null;
+
+	public static void reset() {
+		worldSkyLayers = (CustomSkyLayer[][]) null;
+	}
+
+	public static void update() {
+		reset();
+
+		if (Config.isCustomSky()) {
+			worldSkyLayers = readCustomSkies();
+		}
+	}
+
+	private static CustomSkyLayer[][] readCustomSkies() {
+		CustomSkyLayer[][] acustomskylayer = new CustomSkyLayer[10][0];
+		String s = "mcpatcher/sky/world";
+		int i = -1;
+
+		for (int j = 0; j < acustomskylayer.length; ++j) {
+			String s1 = s + j + "/sky";
+			List list = new ArrayList();
+
+			for (int k = 1; k < 1000; ++k) {
+				String s2 = s1 + k + ".properties";
+				ResourceLocation resourcelocation = new ResourceLocation(s2);
+
+				try (InputStream inputstream = Minecraft.getMinecraft().getResourceManager()
+						.getResource(resourcelocation).getInputStream()) {
+					if (inputstream == null) {
+						break;
+					}
+
+					Properties properties = new PropertiesOrdered();
+					properties.load(inputstream);
+					inputstream.close();
+					Config.dbg("CustomSky properties: " + s2);
+					String s3 = s1 + k + ".png";
+					CustomSkyLayer customskylayer = new CustomSkyLayer(properties, s3);
+
+					if (customskylayer.isValid(s2)) {
+						ResourceLocation resourcelocation1 = new ResourceLocation(customskylayer.source);
+						TextureManager mgr = Minecraft.getMinecraft().getTextureManager();
+						mgr.bindTexture(resourcelocation1);
+						ITextureObject itextureobject = mgr.getTexture(resourcelocation1);
+
+						if (itextureobject == null) {
+							Config.warn("CustomSky: Texture not found: " + resourcelocation1);
+						} else {
+							customskylayer.textureId = itextureobject.getGlTextureId();
+							list.add(customskylayer);
+							inputstream.close();
+						}
+					}
+				} catch (FileNotFoundException var15) {
+					break;
+				} catch (IOException ioexception) {
+					ioexception.printStackTrace();
+				}
+			}
+
+			if (list.size() > 0) {
+				CustomSkyLayer[] acustomskylayer2 = (CustomSkyLayer[]) ((CustomSkyLayer[]) list
+						.toArray(new CustomSkyLayer[list.size()]));
+				acustomskylayer[j] = acustomskylayer2;
+				i = j;
+			}
+		}
+
+		if (i < 0) {
+			return (CustomSkyLayer[][]) null;
+		} else {
+			int l = i + 1;
+			CustomSkyLayer[][] acustomskylayer1 = new CustomSkyLayer[l][0];
+
+			for (int i1 = 0; i1 < acustomskylayer1.length; ++i1) {
+				acustomskylayer1[i1] = acustomskylayer[i1];
+			}
+
+			return acustomskylayer1;
+		}
+	}
+
+	public static void renderSky(World world, TextureManager re, float partialTicks) {
+		if (worldSkyLayers != null) {
+			int i = world.provider.getDimensionId();
+
+			if (i >= 0 && i < worldSkyLayers.length) {
+				CustomSkyLayer[] acustomskylayer = worldSkyLayers[i];
+
+				if (acustomskylayer != null) {
+					long j = world.getWorldTime();
+					int k = (int) (j % 24000L);
+					float f = world.getCelestialAngle(partialTicks);
+					float f1 = world.getRainStrength(partialTicks);
+					float f2 = world.getThunderStrength(partialTicks);
+
+					if (f1 > 0.0F) {
+						f2 /= f1;
+					}
+
+					for (int l = 0; l < acustomskylayer.length; ++l) {
+						CustomSkyLayer customskylayer = acustomskylayer[l];
+
+						if (customskylayer.isActive(world, k)) {
+							customskylayer.render(world, k, f, f1, f2);
+						}
+					}
+
+					float f3 = 1.0F - f1;
+					Blender.clearBlend(f3);
+				}
+			}
+		}
+	}
+
+	public static boolean hasSkyLayers(World world) {
+		if (worldSkyLayers == null) {
+			return false;
+		} else {
+			int i = world.provider.getDimensionId();
+
+			if (i >= 0 && i < worldSkyLayers.length) {
+				CustomSkyLayer[] acustomskylayer = worldSkyLayers[i];
+				return acustomskylayer == null ? false : acustomskylayer.length > 0;
+			} else {
+				return false;
+			}
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/CustomSkyLayer.java b/sources/main/java/net/optifine/CustomSkyLayer.java
new file mode 100644
index 00000000..4927fe7b
--- /dev/null
+++ b/sources/main/java/net/optifine/CustomSkyLayer.java
@@ -0,0 +1,434 @@
+package net.optifine;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
+import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.optifine.config.ConnectedParser;
+import net.optifine.config.Matches;
+import net.optifine.config.RangeListInt;
+import net.optifine.render.Blender;
+import net.optifine.util.NumUtils;
+import net.optifine.util.SmoothFloat;
+import net.optifine.util.TextureUtils;
+
+public class CustomSkyLayer {
+	public String source = null;
+	private int startFadeIn = -1;
+	private int endFadeIn = -1;
+	private int startFadeOut = -1;
+	private int endFadeOut = -1;
+	private int blend = 1;
+	private boolean rotate = false;
+	private float speed = 1.0F;
+	private float[] axis;
+	private RangeListInt days;
+	private int daysLoop;
+	private boolean weatherClear;
+	private boolean weatherRain;
+	private boolean weatherThunder;
+	public BiomeGenBase[] biomes;
+	public RangeListInt heights;
+	private float transition;
+	private SmoothFloat smoothPositionBrightness;
+	public int textureId;
+	private World lastWorld;
+	public static final float[] DEFAULT_AXIS = new float[] { 1.0F, 0.0F, 0.0F };
+	private static final String WEATHER_CLEAR = "clear";
+	private static final String WEATHER_RAIN = "rain";
+	private static final String WEATHER_THUNDER = "thunder";
+
+	public CustomSkyLayer(Properties props, String defSource) {
+		this.axis = DEFAULT_AXIS;
+		this.days = null;
+		this.daysLoop = 8;
+		this.weatherClear = true;
+		this.weatherRain = false;
+		this.weatherThunder = false;
+		this.biomes = null;
+		this.heights = null;
+		this.transition = 1.0F;
+		this.smoothPositionBrightness = null;
+		this.textureId = -1;
+		this.lastWorld = null;
+		ConnectedParser connectedparser = new ConnectedParser("CustomSky");
+		this.source = props.getProperty("source", defSource);
+		this.startFadeIn = this.parseTime(props.getProperty("startFadeIn"));
+		this.endFadeIn = this.parseTime(props.getProperty("endFadeIn"));
+		this.startFadeOut = this.parseTime(props.getProperty("startFadeOut"));
+		this.endFadeOut = this.parseTime(props.getProperty("endFadeOut"));
+		this.blend = Blender.parseBlend(props.getProperty("blend"));
+		this.rotate = this.parseBoolean(props.getProperty("rotate"), true);
+		this.speed = this.parseFloat(props.getProperty("speed"), 1.0F);
+		this.axis = this.parseAxis(props.getProperty("axis"), DEFAULT_AXIS);
+		this.days = connectedparser.parseRangeListInt(props.getProperty("days"));
+		this.daysLoop = connectedparser.parseInt(props.getProperty("daysLoop"), 8);
+		List<String> list = this.parseWeatherList(props.getProperty("weather", "clear"));
+		this.weatherClear = list.contains("clear");
+		this.weatherRain = list.contains("rain");
+		this.weatherThunder = list.contains("thunder");
+		this.biomes = connectedparser.parseBiomes(props.getProperty("biomes"));
+		this.heights = connectedparser.parseRangeListInt(props.getProperty("heights"));
+		this.transition = this.parseFloat(props.getProperty("transition"), 1.0F);
+	}
+
+	private List<String> parseWeatherList(String str) {
+		List<String> list = Arrays.<String>asList(new String[] { "clear", "rain", "thunder" });
+		List<String> list1 = new ArrayList();
+		String[] astring = Config.tokenize(str, " ");
+
+		for (int i = 0; i < astring.length; ++i) {
+			String s = astring[i];
+
+			if (!list.contains(s)) {
+				Config.warn("Unknown weather: " + s);
+			} else {
+				list1.add(s);
+			}
+		}
+
+		return list1;
+	}
+
+	private int parseTime(String str) {
+		if (str == null) {
+			return -1;
+		} else {
+			String[] astring = Config.tokenize(str, ":");
+
+			if (astring.length != 2) {
+				Config.warn("Invalid time: " + str);
+				return -1;
+			} else {
+				String s = astring[0];
+				String s1 = astring[1];
+				int i = Config.parseInt(s, -1);
+				int j = Config.parseInt(s1, -1);
+
+				if (i >= 0 && i <= 23 && j >= 0 && j <= 59) {
+					i = i - 6;
+
+					if (i < 0) {
+						i += 24;
+					}
+
+					int k = i * 1000 + (int) ((double) j / 60.0D * 1000.0D);
+					return k;
+				} else {
+					Config.warn("Invalid time: " + str);
+					return -1;
+				}
+			}
+		}
+	}
+
+	private boolean parseBoolean(String str, boolean defVal) {
+		if (str == null) {
+			return defVal;
+		} else if (str.toLowerCase().equals("true")) {
+			return true;
+		} else if (str.toLowerCase().equals("false")) {
+			return false;
+		} else {
+			Config.warn("Unknown boolean: " + str);
+			return defVal;
+		}
+	}
+
+	private float parseFloat(String str, float defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			float f = Config.parseFloat(str, Float.MIN_VALUE);
+
+			if (f == Float.MIN_VALUE) {
+				Config.warn("Invalid value: " + str);
+				return defVal;
+			} else {
+				return f;
+			}
+		}
+	}
+
+	private float[] parseAxis(String str, float[] defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			String[] astring = Config.tokenize(str, " ");
+
+			if (astring.length != 3) {
+				Config.warn("Invalid axis: " + str);
+				return defVal;
+			} else {
+				float[] afloat = new float[3];
+
+				for (int i = 0; i < astring.length; ++i) {
+					afloat[i] = Config.parseFloat(astring[i], Float.MIN_VALUE);
+
+					if (afloat[i] == Float.MIN_VALUE) {
+						Config.warn("Invalid axis: " + str);
+						return defVal;
+					}
+
+					if (afloat[i] < -1.0F || afloat[i] > 1.0F) {
+						Config.warn("Invalid axis values: " + str);
+						return defVal;
+					}
+				}
+
+				float f2 = afloat[0];
+				float f = afloat[1];
+				float f1 = afloat[2];
+
+				float l = f2 * f2 + f * f + f1 * f1;
+				if (l < 1.0E-5F) {
+					Config.warn("Invalid axis values: " + str);
+					return defVal;
+				} else {
+					l = MathHelper.sqrt_float(l);
+					return new float[] { f1 / l, f / l, -f2 / l };
+				}
+			}
+		}
+	}
+
+	public boolean isValid(String path) {
+		if (this.source == null) {
+			Config.warn("No source texture: " + path);
+			return false;
+		} else {
+			this.source = TextureUtils.fixResourcePath(this.source, TextureUtils.getBasePath(path));
+
+			if (this.startFadeIn >= 0 && this.endFadeIn >= 0 && this.endFadeOut >= 0) {
+				int i = this.normalizeTime(this.endFadeIn - this.startFadeIn);
+
+				if (this.startFadeOut < 0) {
+					this.startFadeOut = this.normalizeTime(this.endFadeOut - i);
+
+					if (this.timeBetween(this.startFadeOut, this.startFadeIn, this.endFadeIn)) {
+						this.startFadeOut = this.endFadeIn;
+					}
+				}
+
+				int j = this.normalizeTime(this.startFadeOut - this.endFadeIn);
+				int k = this.normalizeTime(this.endFadeOut - this.startFadeOut);
+				int l = this.normalizeTime(this.startFadeIn - this.endFadeOut);
+				int i1 = i + j + k + l;
+
+				if (i1 != 24000) {
+					Config.warn("Invalid fadeIn/fadeOut times, sum is not 24h: " + i1);
+					return false;
+				} else if (this.speed < 0.0F) {
+					Config.warn("Invalid speed: " + this.speed);
+					return false;
+				} else if (this.daysLoop <= 0) {
+					Config.warn("Invalid daysLoop: " + this.daysLoop);
+					return false;
+				} else {
+					return true;
+				}
+			} else {
+				Config.warn("Invalid times, required are: startFadeIn, endFadeIn and endFadeOut.");
+				return false;
+			}
+		}
+	}
+
+	private int normalizeTime(int timeMc) {
+		while (timeMc >= 24000) {
+			timeMc -= 24000;
+		}
+
+		while (timeMc < 0) {
+			timeMc += 24000;
+		}
+
+		return timeMc;
+	}
+
+	public void render(World world, int timeOfDay, float celestialAngle, float rainStrength, float thunderStrength) {
+		float f = this.getPositionBrightness(world);
+		float f1 = this.getWeatherBrightness(rainStrength, thunderStrength);
+		float f2 = this.getFadeBrightness(timeOfDay);
+		float f3 = f * f1 * f2;
+		f3 = Config.limit(f3, 0.0F, 1.0F);
+
+		if (f3 >= 1.0E-4F) {
+			GlStateManager.bindTexture(this.textureId);
+			Blender.setupBlend(this.blend, f3);
+			GlStateManager.pushMatrix();
+
+			if (this.rotate) {
+				float f4 = 0.0F;
+
+				if (this.speed != (float) Math.round(this.speed)) {
+					long i = (world.getWorldTime() + 18000L) / 24000L;
+					double d0 = (double) (this.speed % 1.0F);
+					double d1 = (double) i * d0;
+					f4 = (float) (d1 % 1.0D);
+				}
+
+				GlStateManager.rotate(360.0F * (f4 + celestialAngle * this.speed), this.axis[0], this.axis[1],
+						this.axis[2]);
+			}
+
+			Tessellator tessellator = Tessellator.getInstance();
+			GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F);
+			GlStateManager.rotate(-90.0F, 0.0F, 0.0F, 1.0F);
+			this.renderSide(tessellator, 4);
+			GlStateManager.pushMatrix();
+			GlStateManager.rotate(90.0F, 1.0F, 0.0F, 0.0F);
+			this.renderSide(tessellator, 1);
+			GlStateManager.popMatrix();
+			GlStateManager.pushMatrix();
+			GlStateManager.rotate(-90.0F, 1.0F, 0.0F, 0.0F);
+			this.renderSide(tessellator, 0);
+			GlStateManager.popMatrix();
+			GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F);
+			this.renderSide(tessellator, 5);
+			GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F);
+			this.renderSide(tessellator, 2);
+			GlStateManager.rotate(90.0F, 0.0F, 0.0F, 1.0F);
+			this.renderSide(tessellator, 3);
+			GlStateManager.popMatrix();
+		}
+	}
+
+	private float getPositionBrightness(World world) {
+		if (this.biomes == null && this.heights == null) {
+			return 1.0F;
+		} else {
+			float f = this.getPositionBrightnessRaw(world);
+
+			if (this.smoothPositionBrightness == null) {
+				this.smoothPositionBrightness = new SmoothFloat(f, this.transition);
+			}
+
+			f = this.smoothPositionBrightness.getSmoothValue(f);
+			return f;
+		}
+	}
+
+	private float getPositionBrightnessRaw(World world) {
+		Entity entity = Minecraft.getMinecraft().getRenderViewEntity();
+
+		if (entity == null) {
+			return 0.0F;
+		} else {
+			BlockPos blockpos = entity.getPosition();
+
+			if (this.biomes != null) {
+				BiomeGenBase biomegenbase = world.getBiomeGenForCoords(blockpos);
+
+				if (biomegenbase == null) {
+					return 0.0F;
+				}
+
+				if (!Matches.biome(biomegenbase, this.biomes)) {
+					return 0.0F;
+				}
+			}
+
+			return this.heights != null && !this.heights.isInRange(blockpos.getY()) ? 0.0F : 1.0F;
+		}
+	}
+
+	private float getWeatherBrightness(float rainStrength, float thunderStrength) {
+		float f = 1.0F - rainStrength;
+		float f1 = rainStrength - thunderStrength;
+		float f2 = 0.0F;
+
+		if (this.weatherClear) {
+			f2 += f;
+		}
+
+		if (this.weatherRain) {
+			f2 += f1;
+		}
+
+		if (this.weatherThunder) {
+			f2 += thunderStrength;
+		}
+
+		f2 = NumUtils.limit(f2, 0.0F, 1.0F);
+		return f2;
+	}
+
+	private float getFadeBrightness(int timeOfDay) {
+		if (this.timeBetween(timeOfDay, this.startFadeIn, this.endFadeIn)) {
+			int k = this.normalizeTime(this.endFadeIn - this.startFadeIn);
+			int l = this.normalizeTime(timeOfDay - this.startFadeIn);
+			return (float) l / (float) k;
+		} else if (this.timeBetween(timeOfDay, this.endFadeIn, this.startFadeOut)) {
+			return 1.0F;
+		} else if (this.timeBetween(timeOfDay, this.startFadeOut, this.endFadeOut)) {
+			int i = this.normalizeTime(this.endFadeOut - this.startFadeOut);
+			int j = this.normalizeTime(timeOfDay - this.startFadeOut);
+			return 1.0F - (float) j / (float) i;
+		} else {
+			return 0.0F;
+		}
+	}
+
+	private void renderSide(Tessellator tess, int side) {
+		WorldRenderer worldrenderer = tess.getWorldRenderer();
+		double d0 = (double) (side % 3) / 3.0D;
+		double d1 = (double) (side / 3) / 2.0D;
+		worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX);
+		worldrenderer.pos(-100.0D, -100.0D, -100.0D).tex(d0, d1).endVertex();
+		worldrenderer.pos(-100.0D, -100.0D, 100.0D).tex(d0, d1 + 0.5D).endVertex();
+		worldrenderer.pos(100.0D, -100.0D, 100.0D).tex(d0 + 0.3333333333333333D, d1 + 0.5D).endVertex();
+		worldrenderer.pos(100.0D, -100.0D, -100.0D).tex(d0 + 0.3333333333333333D, d1).endVertex();
+		tess.draw();
+	}
+
+	public boolean isActive(World world, int timeOfDay) {
+		if (world != this.lastWorld) {
+			this.lastWorld = world;
+			this.smoothPositionBrightness = null;
+		}
+
+		if (this.timeBetween(timeOfDay, this.endFadeOut, this.startFadeIn)) {
+			return false;
+		} else {
+			if (this.days != null) {
+				long i = world.getWorldTime();
+				long j;
+
+				for (j = i - (long) this.startFadeIn; j < 0L; j += (long) (24000 * this.daysLoop)) {
+					;
+				}
+
+				int k = (int) (j / 24000L);
+				int l = k % this.daysLoop;
+
+				if (!this.days.isInRange(l)) {
+					return false;
+				}
+			}
+
+			return true;
+		}
+	}
+
+	private boolean timeBetween(int timeOfDay, int timeStart, int timeEnd) {
+		return timeStart <= timeEnd ? timeOfDay >= timeStart && timeOfDay <= timeEnd
+				: timeOfDay >= timeStart || timeOfDay <= timeEnd;
+	}
+
+	public String toString() {
+		return "" + this.source + ", " + this.startFadeIn + "-" + this.endFadeIn + " " + this.startFadeOut + "-"
+				+ this.endFadeOut;
+	}
+}
diff --git a/sources/main/java/net/optifine/SmartLeaves.java b/sources/main/java/net/optifine/SmartLeaves.java
new file mode 100644
index 00000000..6bead825
--- /dev/null
+++ b/sources/main/java/net/optifine/SmartLeaves.java
@@ -0,0 +1,198 @@
+package net.optifine;
+
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockNewLeaf;
+import net.minecraft.block.BlockOldLeaf;
+import net.minecraft.block.BlockPlanks;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.resources.DefaultResourcePack;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.client.resources.model.ModelManager;
+import net.minecraft.client.resources.model.ModelResourceLocation;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.ResourceLocation;
+import net.optifine.model.ModelUtils;
+
+public class SmartLeaves {
+	private static IBakedModel modelLeavesCullAcacia = null;
+	private static IBakedModel modelLeavesCullBirch = null;
+	private static IBakedModel modelLeavesCullDarkOak = null;
+	private static IBakedModel modelLeavesCullJungle = null;
+	private static IBakedModel modelLeavesCullOak = null;
+	private static IBakedModel modelLeavesCullSpruce = null;
+	private static List generalQuadsCullAcacia = null;
+	private static List generalQuadsCullBirch = null;
+	private static List generalQuadsCullDarkOak = null;
+	private static List generalQuadsCullJungle = null;
+	private static List generalQuadsCullOak = null;
+	private static List generalQuadsCullSpruce = null;
+	private static IBakedModel modelLeavesDoubleAcacia = null;
+	private static IBakedModel modelLeavesDoubleBirch = null;
+	private static IBakedModel modelLeavesDoubleDarkOak = null;
+	private static IBakedModel modelLeavesDoubleJungle = null;
+	private static IBakedModel modelLeavesDoubleOak = null;
+	private static IBakedModel modelLeavesDoubleSpruce = null;
+
+	public static IBakedModel getLeavesModel(IBakedModel model, IBlockState stateIn) {
+		if (!Config.isTreesSmart()) {
+			return model;
+		} else {
+			List list = model.getGeneralQuads();
+			return list == generalQuadsCullAcacia ? modelLeavesDoubleAcacia
+					: (list == generalQuadsCullBirch ? modelLeavesDoubleBirch
+							: (list == generalQuadsCullDarkOak ? modelLeavesDoubleDarkOak
+									: (list == generalQuadsCullJungle ? modelLeavesDoubleJungle
+											: (list == generalQuadsCullOak ? modelLeavesDoubleOak
+													: (list == generalQuadsCullSpruce ? modelLeavesDoubleSpruce
+															: model)))));
+		}
+	}
+
+	public static boolean isSameLeaves(IBlockState state1, IBlockState state2) {
+		if (state1 == state2) {
+			return true;
+		} else {
+			Block block = state1.getBlock();
+			Block block1 = state2.getBlock();
+			return block != block1 ? false
+					: (block instanceof BlockOldLeaf
+							? ((BlockPlanks.EnumType) state1.getValue(BlockOldLeaf.VARIANT))
+									.equals(state2.getValue(BlockOldLeaf.VARIANT))
+							: (block instanceof BlockNewLeaf
+									? ((BlockPlanks.EnumType) state1.getValue(BlockNewLeaf.VARIANT)).equals(
+											state2.getValue(BlockNewLeaf.VARIANT))
+									: false));
+		}
+	}
+
+	public static void updateLeavesModels() {
+		List list = new ArrayList();
+		modelLeavesCullAcacia = getModelCull("acacia", list);
+		modelLeavesCullBirch = getModelCull("birch", list);
+		modelLeavesCullDarkOak = getModelCull("dark_oak", list);
+		modelLeavesCullJungle = getModelCull("jungle", list);
+		modelLeavesCullOak = getModelCull("oak", list);
+		modelLeavesCullSpruce = getModelCull("spruce", list);
+		generalQuadsCullAcacia = getGeneralQuadsSafe(modelLeavesCullAcacia);
+		generalQuadsCullBirch = getGeneralQuadsSafe(modelLeavesCullBirch);
+		generalQuadsCullDarkOak = getGeneralQuadsSafe(modelLeavesCullDarkOak);
+		generalQuadsCullJungle = getGeneralQuadsSafe(modelLeavesCullJungle);
+		generalQuadsCullOak = getGeneralQuadsSafe(modelLeavesCullOak);
+		generalQuadsCullSpruce = getGeneralQuadsSafe(modelLeavesCullSpruce);
+		modelLeavesDoubleAcacia = getModelDoubleFace(modelLeavesCullAcacia);
+		modelLeavesDoubleBirch = getModelDoubleFace(modelLeavesCullBirch);
+		modelLeavesDoubleDarkOak = getModelDoubleFace(modelLeavesCullDarkOak);
+		modelLeavesDoubleJungle = getModelDoubleFace(modelLeavesCullJungle);
+		modelLeavesDoubleOak = getModelDoubleFace(modelLeavesCullOak);
+		modelLeavesDoubleSpruce = getModelDoubleFace(modelLeavesCullSpruce);
+
+		if (list.size() > 0) {
+			Config.dbg("Enable face culling: " + Config.arrayToString(list.toArray()));
+		}
+	}
+
+	private static List getGeneralQuadsSafe(IBakedModel model) {
+		return model == null ? null : model.getGeneralQuads();
+	}
+
+	static IBakedModel getModelCull(String type, List updatedTypes) {
+		ModelManager modelmanager = Minecraft.getMinecraft().getModelManager();
+
+		if (modelmanager == null) {
+			return null;
+		} else {
+			ResourceLocation resourcelocation = new ResourceLocation("blockstates/" + type + "_leaves.json");
+
+			DefaultResourcePack res = Minecraft.getMinecraft().getDefaultResourcePack();
+			if (Config.getDefiningResourcePack(resourcelocation) != res) {
+				return null;
+			} else {
+				ResourceLocation resourcelocation1 = new ResourceLocation("models/block/" + type + "_leaves.json");
+
+				if (Config.getDefiningResourcePack(resourcelocation1) != res) {
+					return null;
+				} else {
+					ModelResourceLocation modelresourcelocation = new ModelResourceLocation(type + "_leaves", "normal");
+					IBakedModel ibakedmodel = modelmanager.getModel(modelresourcelocation);
+
+					if (ibakedmodel != null && ibakedmodel != modelmanager.getMissingModel()) {
+						List list = ibakedmodel.getGeneralQuads();
+
+						if (list.size() == 0) {
+							return ibakedmodel;
+						} else if (list.size() != 6) {
+							return null;
+						} else {
+							for (Object bakedquad0 : list) {
+								BakedQuad bakedquad = (BakedQuad) bakedquad0;
+								List list1 = ibakedmodel.getFaceQuads(bakedquad.getFace());
+
+								if (list1.size() > 0) {
+									return null;
+								}
+
+								list1.add(bakedquad);
+							}
+
+							list.clear();
+							updatedTypes.add(type + "_leaves");
+							return ibakedmodel;
+						}
+					} else {
+						return null;
+					}
+				}
+			}
+		}
+	}
+
+	private static IBakedModel getModelDoubleFace(IBakedModel model) {
+		if (model == null) {
+			return null;
+		} else if (model.getGeneralQuads().size() > 0) {
+			Config.warn("SmartLeaves: Model is not cube, general quads: " + model.getGeneralQuads().size() + ", model: "
+					+ model);
+			return model;
+		} else {
+			EnumFacing[] aenumfacing = EnumFacing._VALUES;
+
+			for (int i = 0; i < aenumfacing.length; ++i) {
+				EnumFacing enumfacing = aenumfacing[i];
+				List<BakedQuad> list = model.getFaceQuads(enumfacing);
+
+				if (list.size() != 1) {
+					Config.warn("SmartLeaves: Model is not cube, side: " + enumfacing + ", quads: " + list.size()
+							+ ", model: " + model);
+					return model;
+				}
+			}
+
+			IBakedModel ibakedmodel = ModelUtils.duplicateModel(model);
+			List[] alist = new List[aenumfacing.length];
+
+			for (int k = 0; k < aenumfacing.length; ++k) {
+				EnumFacing enumfacing1 = aenumfacing[k];
+				List<BakedQuad> list1 = ibakedmodel.getFaceQuads(enumfacing1);
+				BakedQuad bakedquad = (BakedQuad) list1.get(0);
+				BakedQuad bakedquad1 = new BakedQuad((int[]) bakedquad.getVertexData().clone(),
+						(int[]) bakedquad.getVertexDataWithNormals().clone(), bakedquad.getTintIndex(),
+						bakedquad.getFace(), bakedquad.getSprite());
+				int[] aint = bakedquad1.getVertexData();
+				int[] aint1 = (int[]) aint.clone();
+				int j = aint.length / 4;
+				System.arraycopy(aint, 0 * j, aint1, 3 * j, j);
+				System.arraycopy(aint, 1 * j, aint1, 2 * j, j);
+				System.arraycopy(aint, 2 * j, aint1, 1 * j, j);
+				System.arraycopy(aint, 3 * j, aint1, 0 * j, j);
+				System.arraycopy(aint1, 0, aint, 0, aint1.length);
+				list1.add(bakedquad1);
+			}
+
+			return ibakedmodel;
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/config/ConnectedParser.java b/sources/main/java/net/optifine/config/ConnectedParser.java
new file mode 100644
index 00000000..fe25b95f
--- /dev/null
+++ b/sources/main/java/net/optifine/config/ConnectedParser.java
@@ -0,0 +1,914 @@
+package net.optifine.config;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockDoublePlant;
+import net.minecraft.block.properties.IProperty;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.EnumDyeColor;
+import net.minecraft.item.Item;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumWorldBlockLayer;
+import net.minecraft.util.IStringSerializable;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.optifine.Config;
+import net.optifine.ConnectedProperties;
+
+public class ConnectedParser {
+	private String context = null;
+	public static final EnumDyeColor[] DYE_COLORS_INVALID = new EnumDyeColor[0];
+	private static final INameGetter<Enum> NAME_GETTER_ENUM = new INameGetter<Enum>() {
+		public String getName(Enum en) {
+			return en.name();
+		}
+	};
+	private static final INameGetter<EnumDyeColor> NAME_GETTER_DYE_COLOR = new INameGetter<EnumDyeColor>() {
+		public String getName(EnumDyeColor col) {
+			return col.getName();
+		}
+	};
+
+	public ConnectedParser(String context) {
+		this.context = context;
+	}
+
+	public String parseName(String path) {
+		String s = path;
+		int i = path.lastIndexOf(47);
+
+		if (i >= 0) {
+			s = path.substring(i + 1);
+		}
+
+		int j = s.lastIndexOf(46);
+
+		if (j >= 0) {
+			s = s.substring(0, j);
+		}
+
+		return s;
+	}
+
+	public String parseBasePath(String path) {
+		int i = path.lastIndexOf(47);
+		return i < 0 ? "" : path.substring(0, i);
+	}
+
+	public MatchBlock[] parseMatchBlocks(String propMatchBlocks) {
+		if (propMatchBlocks == null) {
+			return null;
+		} else {
+			List list = new ArrayList();
+			String[] astring = Config.tokenize(propMatchBlocks, " ");
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+				MatchBlock[] amatchblock = this.parseMatchBlock(s);
+
+				if (amatchblock != null) {
+					list.addAll(Arrays.asList(amatchblock));
+				}
+			}
+
+			MatchBlock[] amatchblock1 = (MatchBlock[]) ((MatchBlock[]) list.toArray(new MatchBlock[list.size()]));
+			return amatchblock1;
+		}
+	}
+
+	public IBlockState parseBlockState(String str, IBlockState def) {
+		MatchBlock[] amatchblock = this.parseMatchBlock(str);
+
+		if (amatchblock == null) {
+			return def;
+		} else if (amatchblock.length != 1) {
+			return def;
+		} else {
+			MatchBlock matchblock = amatchblock[0];
+			int i = matchblock.getBlockId();
+			Block block = Block.getBlockById(i);
+			return block.getDefaultState();
+		}
+	}
+
+	public MatchBlock[] parseMatchBlock(String blockStr) {
+		if (blockStr == null) {
+			return null;
+		} else {
+			blockStr = blockStr.trim();
+
+			if (blockStr.length() <= 0) {
+				return null;
+			} else {
+				String[] astring = Config.tokenize(blockStr, ":");
+				String s = "minecraft";
+				int i = 0;
+
+				if (astring.length > 1 && this.isFullBlockName(astring)) {
+					s = astring[0];
+					i = 1;
+				} else {
+					s = "minecraft";
+					i = 0;
+				}
+
+				String s1 = astring[i];
+				String[] astring1 = (String[]) Arrays.copyOfRange(astring, i + 1, astring.length);
+				Block[] ablock = this.parseBlockPart(s, s1);
+
+				if (ablock == null) {
+					return null;
+				} else {
+					MatchBlock[] amatchblock = new MatchBlock[ablock.length];
+
+					for (int j = 0; j < ablock.length; ++j) {
+						Block block = ablock[j];
+						int k = Block.getIdFromBlock(block);
+						int[] aint = null;
+
+						if (astring1.length > 0) {
+							aint = this.parseBlockMetadatas(block, astring1);
+
+							if (aint == null) {
+								return null;
+							}
+						}
+
+						MatchBlock matchblock = new MatchBlock(k, aint);
+						amatchblock[j] = matchblock;
+					}
+
+					return amatchblock;
+				}
+			}
+		}
+	}
+
+	public boolean isFullBlockName(String[] parts) {
+		if (parts.length < 2) {
+			return false;
+		} else {
+			String s = parts[1];
+			return s.length() < 1 ? false : (this.startsWithDigit(s) ? false : !s.contains("="));
+		}
+	}
+
+	public boolean startsWithDigit(String str) {
+		if (str == null) {
+			return false;
+		} else if (str.length() < 1) {
+			return false;
+		} else {
+			char c0 = str.charAt(0);
+			return Character.isDigit(c0);
+		}
+	}
+
+	public Block[] parseBlockPart(String domain, String blockPart) {
+		if (this.startsWithDigit(blockPart)) {
+			int[] aint = this.parseIntList(blockPart);
+
+			if (aint == null) {
+				return null;
+			} else {
+				Block[] ablock1 = new Block[aint.length];
+
+				for (int j = 0; j < aint.length; ++j) {
+					int i = aint[j];
+					Block block1 = Block.getBlockById(i);
+
+					if (block1 == null) {
+						this.warn("Block not found for id: " + i);
+						return null;
+					}
+
+					ablock1[j] = block1;
+				}
+
+				return ablock1;
+			}
+		} else {
+			String s = domain + ":" + blockPart;
+			Block block = Block.getBlockFromName(s);
+
+			if (block == null) {
+				this.warn("Block not found for name: " + s);
+				return null;
+			} else {
+				Block[] ablock = new Block[] { block };
+				return ablock;
+			}
+		}
+	}
+
+	public int[] parseBlockMetadatas(Block block, String[] params) {
+		if (params.length <= 0) {
+			return null;
+		} else {
+			String s = params[0];
+
+			if (this.startsWithDigit(s)) {
+				int[] aint = this.parseIntList(s);
+				return aint;
+			} else {
+				IBlockState iblockstate = block.getDefaultState();
+				Collection collection = iblockstate.getPropertyNames();
+				Map<IProperty, List<Comparable>> map = new HashMap();
+
+				for (int i = 0; i < params.length; ++i) {
+					String s1 = params[i];
+
+					if (s1.length() > 0) {
+						String[] astring = Config.tokenize(s1, "=");
+
+						if (astring.length != 2) {
+							this.warn("Invalid block property: " + s1);
+							return null;
+						}
+
+						String s2 = astring[0];
+						String s3 = astring[1];
+						IProperty iproperty = ConnectedProperties.getProperty(s2, collection);
+
+						if (iproperty == null) {
+							this.warn("Property not found: " + s2 + ", block: " + block);
+							return null;
+						}
+
+						List<Comparable> list = (List) map.get(s2);
+
+						if (list == null) {
+							list = new ArrayList();
+							map.put(iproperty, list);
+						}
+
+						String[] astring1 = Config.tokenize(s3, ",");
+
+						for (int j = 0; j < astring1.length; ++j) {
+							String s4 = astring1[j];
+							Comparable comparable = parsePropertyValue(iproperty, s4);
+
+							if (comparable == null) {
+								this.warn(
+										"Property value not found: " + s4 + ", property: " + s2 + ", block: " + block);
+								return null;
+							}
+
+							list.add(comparable);
+						}
+					}
+				}
+
+				if (map.isEmpty()) {
+					return null;
+				} else {
+					List<Integer> list1 = new ArrayList();
+
+					for (int k = 0; k < 16; ++k) {
+						int l = k;
+
+						try {
+							IBlockState iblockstate1 = this.getStateFromMeta(block, l);
+
+							if (this.matchState(iblockstate1, map)) {
+								list1.add(Integer.valueOf(l));
+							}
+						} catch (IllegalArgumentException var18) {
+							;
+						}
+					}
+
+					if (list1.size() == 16) {
+						return null;
+					} else {
+						int[] aint1 = new int[list1.size()];
+
+						for (int i1 = 0; i1 < aint1.length; ++i1) {
+							aint1[i1] = ((Integer) list1.get(i1)).intValue();
+						}
+
+						return aint1;
+					}
+				}
+			}
+		}
+	}
+
+	private IBlockState getStateFromMeta(Block block, int md) {
+		try {
+			IBlockState iblockstate = block.getStateFromMeta(md);
+
+			if (block == Blocks.double_plant && md > 7) {
+				IBlockState iblockstate1 = block.getStateFromMeta(md & 7);
+				iblockstate = iblockstate.withProperty(BlockDoublePlant.VARIANT,
+						iblockstate1.getValue(BlockDoublePlant.VARIANT));
+			}
+
+			return iblockstate;
+		} catch (IllegalArgumentException var5) {
+			return block.getDefaultState();
+		}
+	}
+
+	public static Comparable parsePropertyValue(IProperty prop, String valStr) {
+		Class oclass = prop.getValueClass();
+		Comparable comparable = parseValue(valStr, oclass);
+
+		if (comparable == null) {
+			Collection collection = prop.getAllowedValues();
+			comparable = getPropertyValue(valStr, collection);
+		}
+
+		return comparable;
+	}
+
+	public static Comparable getPropertyValue(String value, Collection propertyValues) {
+		for (Object comparable0 : propertyValues) {
+			Comparable comparable = (Comparable) comparable0;
+			if (getValueName(comparable).equals(value)) {
+				return comparable;
+			}
+		}
+
+		return null;
+	}
+
+	private static Object getValueName(Comparable obj) {
+		if (obj instanceof IStringSerializable) {
+			IStringSerializable istringserializable = (IStringSerializable) obj;
+			return istringserializable.getName();
+		} else {
+			return obj.toString();
+		}
+	}
+
+	public static Comparable parseValue(String str, Class cls) {
+		if (cls == String.class) {
+			return str;
+		} else if (cls == Boolean.class) {
+			return Boolean.valueOf(str);
+		} else if (cls == Float.class) {
+			return Float.valueOf(str);
+		} else if (cls == Double.class) {
+			return Double.valueOf(str);
+		} else if (cls == Integer.class) {
+			return Integer.valueOf(str);
+		} else {
+			return cls == Long.class ? Long.valueOf(str) : null;
+		}
+	}
+
+	public boolean matchState(IBlockState bs, Map<IProperty, List<Comparable>> mapPropValues) {
+		for (IProperty iproperty : mapPropValues.keySet()) {
+			List<Comparable> list = (List) mapPropValues.get(iproperty);
+			Comparable comparable = bs.getValue(iproperty);
+
+			if (comparable == null) {
+				return false;
+			}
+
+			if (!list.contains(comparable)) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+	public BiomeGenBase[] parseBiomes(String str) {
+		if (str == null) {
+			return null;
+		} else {
+			str = str.trim();
+			boolean flag = false;
+
+			if (str.startsWith("!")) {
+				flag = true;
+				str = str.substring(1);
+			}
+
+			String[] astring = Config.tokenize(str, " ");
+			List list = new ArrayList();
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+				BiomeGenBase biomegenbase = this.findBiome(s);
+
+				if (biomegenbase == null) {
+					this.warn("Biome not found: " + s);
+				} else {
+					list.add(biomegenbase);
+				}
+			}
+
+			if (flag) {
+				List<BiomeGenBase> list1 = new ArrayList(Arrays.asList(BiomeGenBase.getBiomeGenArray()));
+				list1.removeAll(list);
+				list = list1;
+			}
+
+			BiomeGenBase[] abiomegenbase = (BiomeGenBase[]) ((BiomeGenBase[]) list
+					.toArray(new BiomeGenBase[list.size()]));
+			return abiomegenbase;
+		}
+	}
+
+	public BiomeGenBase findBiome(String biomeName) {
+		biomeName = biomeName.toLowerCase();
+
+		if (biomeName.equals("nether")) {
+			return BiomeGenBase.hell;
+		} else {
+			BiomeGenBase[] abiomegenbase = BiomeGenBase.getBiomeGenArray();
+
+			for (int i = 0; i < abiomegenbase.length; ++i) {
+				BiomeGenBase biomegenbase = abiomegenbase[i];
+
+				if (biomegenbase != null) {
+					String s = biomegenbase.biomeName.replace(" ", "").toLowerCase();
+
+					if (s.equals(biomeName)) {
+						return biomegenbase;
+					}
+				}
+			}
+
+			return null;
+		}
+	}
+
+	public int parseInt(String str, int defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			str = str.trim();
+			int i = Config.parseInt(str, -1);
+
+			if (i < 0) {
+				this.warn("Invalid number: " + str);
+				return defVal;
+			} else {
+				return i;
+			}
+		}
+	}
+
+	public int[] parseIntList(String str) {
+		if (str == null) {
+			return null;
+		} else {
+			List<Integer> list = new ArrayList();
+			String[] astring = Config.tokenize(str, " ,");
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+
+				if (s.contains("-")) {
+					String[] astring1 = Config.tokenize(s, "-");
+
+					if (astring1.length != 2) {
+						this.warn("Invalid interval: " + s + ", when parsing: " + str);
+					} else {
+						int k = Config.parseInt(astring1[0], -1);
+						int l = Config.parseInt(astring1[1], -1);
+
+						if (k >= 0 && l >= 0 && k <= l) {
+							for (int i1 = k; i1 <= l; ++i1) {
+								list.add(Integer.valueOf(i1));
+							}
+						} else {
+							this.warn("Invalid interval: " + s + ", when parsing: " + str);
+						}
+					}
+				} else {
+					int j = Config.parseInt(s, -1);
+
+					if (j < 0) {
+						this.warn("Invalid number: " + s + ", when parsing: " + str);
+					} else {
+						list.add(Integer.valueOf(j));
+					}
+				}
+			}
+
+			int[] aint = new int[list.size()];
+
+			for (int j1 = 0; j1 < aint.length; ++j1) {
+				aint[j1] = ((Integer) list.get(j1)).intValue();
+			}
+
+			return aint;
+		}
+	}
+
+	public boolean[] parseFaces(String str, boolean[] defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			EnumSet enumset = EnumSet.allOf(EnumFacing.class);
+			String[] astring = Config.tokenize(str, " ,");
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+
+				if (s.equals("sides")) {
+					enumset.add(EnumFacing.NORTH);
+					enumset.add(EnumFacing.SOUTH);
+					enumset.add(EnumFacing.WEST);
+					enumset.add(EnumFacing.EAST);
+				} else if (s.equals("all")) {
+					enumset.addAll(Arrays.asList(EnumFacing._VALUES));
+				} else {
+					EnumFacing enumfacing = this.parseFace(s);
+
+					if (enumfacing != null) {
+						enumset.add(enumfacing);
+					}
+				}
+			}
+
+			boolean[] aboolean = new boolean[EnumFacing._VALUES.length];
+
+			for (int j = 0; j < aboolean.length; ++j) {
+				aboolean[j] = enumset.contains(EnumFacing._VALUES[j]);
+			}
+
+			return aboolean;
+		}
+	}
+
+	public EnumFacing parseFace(String str) {
+		str = str.toLowerCase();
+
+		if (!str.equals("bottom") && !str.equals("down")) {
+			if (!str.equals("top") && !str.equals("up")) {
+				if (str.equals("north")) {
+					return EnumFacing.NORTH;
+				} else if (str.equals("south")) {
+					return EnumFacing.SOUTH;
+				} else if (str.equals("east")) {
+					return EnumFacing.EAST;
+				} else if (str.equals("west")) {
+					return EnumFacing.WEST;
+				} else {
+					Config.warn("Unknown face: " + str);
+					return null;
+				}
+			} else {
+				return EnumFacing.UP;
+			}
+		} else {
+			return EnumFacing.DOWN;
+		}
+	}
+
+	public void dbg(String str) {
+		Config.dbg("" + this.context + ": " + str);
+	}
+
+	public void warn(String str) {
+		Config.warn("" + this.context + ": " + str);
+	}
+
+	public RangeListInt parseRangeListInt(String str) {
+		if (str == null) {
+			return null;
+		} else {
+			RangeListInt rangelistint = new RangeListInt();
+			String[] astring = Config.tokenize(str, " ,");
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+				RangeInt rangeint = this.parseRangeInt(s);
+
+				if (rangeint == null) {
+					return null;
+				}
+
+				rangelistint.addRange(rangeint);
+			}
+
+			return rangelistint;
+		}
+	}
+
+	private RangeInt parseRangeInt(String str) {
+		if (str == null) {
+			return null;
+		} else if (str.indexOf(45) >= 0) {
+			String[] astring = Config.tokenize(str, "-");
+
+			if (astring.length != 2) {
+				this.warn("Invalid range: " + str);
+				return null;
+			} else {
+				int j = Config.parseInt(astring[0], -1);
+				int k = Config.parseInt(astring[1], -1);
+
+				if (j >= 0 && k >= 0) {
+					return new RangeInt(j, k);
+				} else {
+					this.warn("Invalid range: " + str);
+					return null;
+				}
+			}
+		} else {
+			int i = Config.parseInt(str, -1);
+
+			if (i < 0) {
+				this.warn("Invalid integer: " + str);
+				return null;
+			} else {
+				return new RangeInt(i, i);
+			}
+		}
+	}
+
+	public boolean parseBoolean(String str, boolean defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			String s = str.toLowerCase().trim();
+
+			if (s.equals("true")) {
+				return true;
+			} else if (s.equals("false")) {
+				return false;
+			} else {
+				this.warn("Invalid boolean: " + str);
+				return defVal;
+			}
+		}
+	}
+
+	public Boolean parseBooleanObject(String str) {
+		if (str == null) {
+			return null;
+		} else {
+			String s = str.toLowerCase().trim();
+
+			if (s.equals("true")) {
+				return Boolean.TRUE;
+			} else if (s.equals("false")) {
+				return Boolean.FALSE;
+			} else {
+				this.warn("Invalid boolean: " + str);
+				return null;
+			}
+		}
+	}
+
+	public static int parseColor(String str, int defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			str = str.trim();
+
+			try {
+				int i = Integer.parseInt(str, 16) & 16777215;
+				return i;
+			} catch (NumberFormatException var3) {
+				return defVal;
+			}
+		}
+	}
+
+	public static int parseColor4(String str, int defVal) {
+		if (str == null) {
+			return defVal;
+		} else {
+			str = str.trim();
+
+			try {
+				int i = (int) (Long.parseLong(str, 16) & -1L);
+				return i;
+			} catch (NumberFormatException var3) {
+				return defVal;
+			}
+		}
+	}
+
+	public EnumWorldBlockLayer parseBlockRenderLayer(String str, EnumWorldBlockLayer def) {
+		if (str == null) {
+			return def;
+		} else {
+			str = str.toLowerCase().trim();
+			EnumWorldBlockLayer[] aenumworldblocklayer = EnumWorldBlockLayer.values();
+
+			for (int i = 0; i < aenumworldblocklayer.length; ++i) {
+				EnumWorldBlockLayer enumworldblocklayer = aenumworldblocklayer[i];
+
+				if (str.equals(enumworldblocklayer.name().toLowerCase())) {
+					return enumworldblocklayer;
+				}
+			}
+
+			return def;
+		}
+	}
+
+	public <T> T parseObject(String str, T[] objs, INameGetter nameGetter, String property) {
+		if (str == null) {
+			return (T) null;
+		} else {
+			String s = str.toLowerCase().trim();
+
+			for (int i = 0; i < objs.length; ++i) {
+				T t = objs[i];
+				String s1 = nameGetter.getName(t);
+
+				if (s1 != null && s1.toLowerCase().equals(s)) {
+					return t;
+				}
+			}
+
+			this.warn("Invalid " + property + ": " + str);
+			return (T) null;
+		}
+	}
+
+	public <T> T[] parseObjects(String str, T[] objs, INameGetter nameGetter, String property, T[] errValue) {
+		if (str == null) {
+			return null;
+		} else {
+			str = str.toLowerCase().trim();
+			String[] astring = Config.tokenize(str, " ");
+			T[] at = (T[]) Array.newInstance(objs.getClass().getComponentType(), astring.length);
+
+			for (int i = 0; i < astring.length; ++i) {
+				String s = astring[i];
+				T t = this.parseObject(s, objs, nameGetter, property);
+
+				if (t == null) {
+					return (T[]) errValue;
+				}
+
+				at[i] = t;
+			}
+
+			return at;
+		}
+	}
+
+	public Enum parseEnum(String str, Enum[] enums, String property) {
+		return (Enum) this.parseObject(str, enums, NAME_GETTER_ENUM, property);
+	}
+
+	public Enum[] parseEnums(String str, Enum[] enums, String property, Enum[] errValue) {
+		return (Enum[]) this.parseObjects(str, enums, NAME_GETTER_ENUM, property, errValue);
+	}
+
+	public EnumDyeColor[] parseDyeColors(String str, String property, EnumDyeColor[] errValue) {
+		return (EnumDyeColor[]) this.parseObjects(str, EnumDyeColor.values(), NAME_GETTER_DYE_COLOR, property,
+				errValue);
+	}
+
+	public Weather[] parseWeather(String str, String property, Weather[] errValue) {
+		return (Weather[]) this.parseObjects(str, Weather.values(), NAME_GETTER_ENUM, property, errValue);
+	}
+
+	public NbtTagValue parseNbtTagValue(String path, String value) {
+		return path != null && value != null ? new NbtTagValue(path, value) : null;
+	}
+
+	private static int parseProfessionId(String str) {
+		int i = Config.parseInt(str, -1);
+		return i >= 0 ? i
+				: (str.equals("farmer") ? 0
+						: (str.equals("librarian") ? 1
+								: (str.equals("priest") ? 2
+										: (str.equals("blacksmith") ? 3
+												: (str.equals("butcher") ? 4 : (str.equals("nitwit") ? 5 : -1))))));
+	}
+
+	private static int[] parseCareerIds(int prof, String str) {
+		Set<Integer> set = new HashSet();
+		String[] astring = Config.tokenize(str, ",");
+
+		for (int i = 0; i < astring.length; ++i) {
+			String s = astring[i];
+			int j = parseCareerId(prof, s);
+
+			if (j < 0) {
+				return null;
+			}
+
+			set.add(Integer.valueOf(j));
+		}
+
+		Integer[] ainteger = (Integer[]) ((Integer[]) set.toArray(new Integer[set.size()]));
+		int[] aint = new int[ainteger.length];
+
+		for (int k = 0; k < aint.length; ++k) {
+			aint[k] = ainteger[k].intValue();
+		}
+
+		return aint;
+	}
+
+	private static int parseCareerId(int prof, String str) {
+		int i = Config.parseInt(str, -1);
+
+		if (i >= 0) {
+			return i;
+		} else {
+			if (prof == 0) {
+				if (str.equals("farmer")) {
+					return 1;
+				}
+
+				if (str.equals("fisherman")) {
+					return 2;
+				}
+
+				if (str.equals("shepherd")) {
+					return 3;
+				}
+
+				if (str.equals("fletcher")) {
+					return 4;
+				}
+			}
+
+			if (prof == 1) {
+				if (str.equals("librarian")) {
+					return 1;
+				}
+
+				if (str.equals("cartographer")) {
+					return 2;
+				}
+			}
+
+			if (prof == 2 && str.equals("cleric")) {
+				return 1;
+			} else {
+				if (prof == 3) {
+					if (str.equals("armor")) {
+						return 1;
+					}
+
+					if (str.equals("weapon")) {
+						return 2;
+					}
+
+					if (str.equals("tool")) {
+						return 3;
+					}
+				}
+
+				if (prof == 4) {
+					if (str.equals("butcher")) {
+						return 1;
+					}
+
+					if (str.equals("leather")) {
+						return 2;
+					}
+				}
+
+				return prof == 5 && str.equals("nitwit") ? 1 : -1;
+			}
+		}
+	}
+
+	public int[] parseItems(String str) {
+		str = str.trim();
+		Set<Integer> set = new TreeSet();
+		String[] astring = Config.tokenize(str, " ");
+
+		for (int i = 0; i < astring.length; ++i) {
+			String s = astring[i];
+			ResourceLocation resourcelocation = new ResourceLocation(s);
+			Item item = (Item) Item.itemRegistry.getObject(resourcelocation);
+
+			if (item == null) {
+				this.warn("Item not found: " + s);
+			} else {
+				int j = Item.getIdFromItem(item);
+
+				if (j < 0) {
+					this.warn("Item has no ID: " + item + ", name: " + s);
+				} else {
+					set.add(Integer.valueOf(j));
+				}
+			}
+		}
+
+		Integer[] ainteger = (Integer[]) ((Integer[]) set.toArray(new Integer[set.size()]));
+		int[] aint = Config.toPrimitive(ainteger);
+		return aint;
+	}
+
+}
diff --git a/sources/main/java/net/optifine/config/GlVersion.java b/sources/main/java/net/optifine/config/GlVersion.java
new file mode 100644
index 00000000..7b2b06ab
--- /dev/null
+++ b/sources/main/java/net/optifine/config/GlVersion.java
@@ -0,0 +1,46 @@
+package net.optifine.config;
+
+public class GlVersion {
+	private int major;
+	private int minor;
+	private int release;
+	private String suffix;
+
+	public GlVersion(int major, int minor) {
+		this(major, minor, 0);
+	}
+
+	public GlVersion(int major, int minor, int release) {
+		this(major, minor, release, (String) null);
+	}
+
+	public GlVersion(int major, int minor, int release, String suffix) {
+		this.major = major;
+		this.minor = minor;
+		this.release = release;
+		this.suffix = suffix;
+	}
+
+	public int getMajor() {
+		return this.major;
+	}
+
+	public int getMinor() {
+		return this.minor;
+	}
+
+	public int getRelease() {
+		return this.release;
+	}
+
+	public int toInt() {
+		return this.minor > 9 ? this.major * 100 + this.minor
+				: (this.release > 9 ? this.major * 100 + this.minor * 10 + 9
+						: this.major * 100 + this.minor * 10 + this.release);
+	}
+
+	public String toString() {
+		return this.suffix == null ? "" + this.major + "." + this.minor + "." + this.release
+				: "" + this.major + "." + this.minor + "." + this.release + this.suffix;
+	}
+}
diff --git a/sources/main/java/net/optifine/config/INameGetter.java b/sources/main/java/net/optifine/config/INameGetter.java
new file mode 100644
index 00000000..361d6e4e
--- /dev/null
+++ b/sources/main/java/net/optifine/config/INameGetter.java
@@ -0,0 +1,5 @@
+package net.optifine.config;
+
+public interface INameGetter<T> {
+	String getName(T var1);
+}
diff --git a/sources/main/java/net/optifine/config/IObjectLocator.java b/sources/main/java/net/optifine/config/IObjectLocator.java
new file mode 100644
index 00000000..bdcc511d
--- /dev/null
+++ b/sources/main/java/net/optifine/config/IObjectLocator.java
@@ -0,0 +1,7 @@
+package net.optifine.config;
+
+import net.minecraft.util.ResourceLocation;
+
+public interface IObjectLocator {
+	Object getObject(ResourceLocation var1);
+}
diff --git a/sources/main/java/net/optifine/config/IParserInt.java b/sources/main/java/net/optifine/config/IParserInt.java
new file mode 100644
index 00000000..a4a06434
--- /dev/null
+++ b/sources/main/java/net/optifine/config/IParserInt.java
@@ -0,0 +1,5 @@
+package net.optifine.config;
+
+public interface IParserInt {
+	int parse(String var1, int var2);
+}
diff --git a/sources/main/java/net/optifine/config/ItemLocator.java b/sources/main/java/net/optifine/config/ItemLocator.java
new file mode 100644
index 00000000..92c0eebb
--- /dev/null
+++ b/sources/main/java/net/optifine/config/ItemLocator.java
@@ -0,0 +1,11 @@
+package net.optifine.config;
+
+import net.minecraft.item.Item;
+import net.minecraft.util.ResourceLocation;
+
+public class ItemLocator implements IObjectLocator {
+	public Object getObject(ResourceLocation loc) {
+		Item item = Item.getByNameOrId(loc.toString());
+		return item;
+	}
+}
diff --git a/sources/main/java/net/optifine/config/MatchBlock.java b/sources/main/java/net/optifine/config/MatchBlock.java
new file mode 100644
index 00000000..ad0f2d63
--- /dev/null
+++ b/sources/main/java/net/optifine/config/MatchBlock.java
@@ -0,0 +1,61 @@
+package net.optifine.config;
+
+import net.minecraft.block.state.BlockStateBase;
+import net.optifine.Config;
+
+public class MatchBlock {
+	private int blockId = -1;
+	private int[] metadatas = null;
+
+	public MatchBlock(int blockId) {
+		this.blockId = blockId;
+	}
+
+	public MatchBlock(int blockId, int metadata) {
+		this.blockId = blockId;
+
+		if (metadata >= 0 && metadata <= 15) {
+			this.metadatas = new int[] { metadata };
+		}
+	}
+
+	public MatchBlock(int blockId, int[] metadatas) {
+		this.blockId = blockId;
+		this.metadatas = metadatas;
+	}
+
+	public int getBlockId() {
+		return this.blockId;
+	}
+
+	public int[] getMetadatas() {
+		return this.metadatas;
+	}
+
+	public boolean matches(BlockStateBase blockState) {
+		return blockState.getBlockId() != this.blockId ? false
+				: Matches.metadata(blockState.getMetadata(), this.metadatas);
+	}
+
+	public boolean matches(int id, int metadata) {
+		return id != this.blockId ? false : Matches.metadata(metadata, this.metadatas);
+	}
+
+	public void addMetadata(int metadata) {
+		if (this.metadatas != null) {
+			if (metadata >= 0 && metadata <= 15) {
+				for (int i = 0; i < this.metadatas.length; ++i) {
+					if (this.metadatas[i] == metadata) {
+						return;
+					}
+				}
+
+				this.metadatas = Config.addIntToArray(this.metadatas, metadata);
+			}
+		}
+	}
+
+	public String toString() {
+		return "" + this.blockId + ":" + Config.arrayToString(this.metadatas);
+	}
+}
diff --git a/sources/main/java/net/optifine/config/Matches.java b/sources/main/java/net/optifine/config/Matches.java
new file mode 100644
index 00000000..791c43f9
--- /dev/null
+++ b/sources/main/java/net/optifine/config/Matches.java
@@ -0,0 +1,97 @@
+package net.optifine.config;
+
+import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+import net.minecraft.block.state.BlockStateBase;
+import net.minecraft.world.biome.BiomeGenBase;
+
+public class Matches {
+	public static boolean block(BlockStateBase blockStateBase, MatchBlock[] matchBlocks) {
+		if (matchBlocks == null) {
+			return true;
+		} else {
+			for (int i = 0; i < matchBlocks.length; ++i) {
+				MatchBlock matchblock = matchBlocks[i];
+
+				if (matchblock.matches(blockStateBase)) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static boolean block(int blockId, int metadata, MatchBlock[] matchBlocks) {
+		if (matchBlocks == null) {
+			return true;
+		} else {
+			for (int i = 0; i < matchBlocks.length; ++i) {
+				MatchBlock matchblock = matchBlocks[i];
+
+				if (matchblock.matches(blockId, metadata)) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static boolean blockId(int blockId, MatchBlock[] matchBlocks) {
+		if (matchBlocks == null) {
+			return true;
+		} else {
+			for (int i = 0; i < matchBlocks.length; ++i) {
+				MatchBlock matchblock = matchBlocks[i];
+
+				if (matchblock.getBlockId() == blockId) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static boolean metadata(int metadata, int[] metadatas) {
+		if (metadatas == null) {
+			return true;
+		} else {
+			for (int i = 0; i < metadatas.length; ++i) {
+				if (metadatas[i] == metadata) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static boolean sprite(EaglerTextureAtlasSprite sprite, EaglerTextureAtlasSprite[] sprites) {
+		if (sprites == null) {
+			return true;
+		} else {
+			for (int i = 0; i < sprites.length; ++i) {
+				if (sprites[i] == sprite) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static boolean biome(BiomeGenBase biome, BiomeGenBase[] biomes) {
+		if (biomes == null) {
+			return true;
+		} else {
+			for (int i = 0; i < biomes.length; ++i) {
+				if (biomes[i] == biome) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/config/NbtTagValue.java b/sources/main/java/net/optifine/config/NbtTagValue.java
new file mode 100644
index 00000000..3e6a0cb0
--- /dev/null
+++ b/sources/main/java/net/optifine/config/NbtTagValue.java
@@ -0,0 +1,254 @@
+package net.optifine.config;
+
+import java.util.Arrays;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagByte;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagDouble;
+import net.minecraft.nbt.NBTTagFloat;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagLong;
+import net.minecraft.nbt.NBTTagShort;
+import net.minecraft.nbt.NBTTagString;
+import net.optifine.Config;
+import net.optifine.util.StrUtils;
+
+public class NbtTagValue {
+	private String[] parents = null;
+	private String name = null;
+	private boolean negative = false;
+	private int type = 0;
+	private String value = null;
+	private int valueFormat = 0;
+	private static final int TYPE_TEXT = 0;
+	private static final int TYPE_PATTERN = 1;
+	private static final int TYPE_IPATTERN = 2;
+	private static final int TYPE_REGEX = 3;
+	private static final int TYPE_IREGEX = 4;
+	private static final String PREFIX_PATTERN = "pattern:";
+	private static final String PREFIX_IPATTERN = "ipattern:";
+	private static final String PREFIX_REGEX = "regex:";
+	private static final String PREFIX_IREGEX = "iregex:";
+	private static final int FORMAT_DEFAULT = 0;
+	private static final int FORMAT_HEX_COLOR = 1;
+	private static final String PREFIX_HEX_COLOR = "#";
+	private static final Pattern PATTERN_HEX_COLOR = Pattern.compile("^#[0-9a-f]{6}+$");
+
+	public NbtTagValue(String tag, String value) {
+		String[] astring = Config.tokenize(tag, ".");
+		this.parents = (String[]) Arrays.copyOfRange(astring, 0, astring.length - 1);
+		this.name = astring[astring.length - 1];
+
+		if (value.startsWith("!")) {
+			this.negative = true;
+			value = value.substring(1);
+		}
+
+		if (value.startsWith("pattern:")) {
+			this.type = 1;
+			value = value.substring("pattern:".length());
+		} else if (value.startsWith("ipattern:")) {
+			this.type = 2;
+			value = value.substring("ipattern:".length()).toLowerCase();
+		} else if (value.startsWith("regex:")) {
+			this.type = 3;
+			value = value.substring("regex:".length());
+		} else if (value.startsWith("iregex:")) {
+			this.type = 4;
+			value = value.substring("iregex:".length()).toLowerCase();
+		} else {
+			this.type = 0;
+		}
+
+		value = StringEscapeUtils.unescapeJava(value);
+
+		if (this.type == 0 && PATTERN_HEX_COLOR.matcher(value).matches()) {
+			this.valueFormat = 1;
+		}
+
+		this.value = value;
+	}
+
+	public boolean matches(NBTTagCompound nbt) {
+		return this.negative ? !this.matchesCompound(nbt) : this.matchesCompound(nbt);
+	}
+
+	public boolean matchesCompound(NBTTagCompound nbt) {
+		if (nbt == null) {
+			return false;
+		} else {
+			NBTBase nbtbase = nbt;
+
+			for (int i = 0; i < this.parents.length; ++i) {
+				String s = this.parents[i];
+				nbtbase = getChildTag(nbtbase, s);
+
+				if (nbtbase == null) {
+					return false;
+				}
+			}
+
+			if (this.name.equals("*")) {
+				return this.matchesAnyChild(nbtbase);
+			} else {
+				nbtbase = getChildTag(nbtbase, this.name);
+
+				if (nbtbase == null) {
+					return false;
+				} else if (this.matchesBase(nbtbase)) {
+					return true;
+				} else {
+					return false;
+				}
+			}
+		}
+	}
+
+	private boolean matchesAnyChild(NBTBase tagBase) {
+		if (tagBase instanceof NBTTagCompound) {
+			NBTTagCompound nbttagcompound = (NBTTagCompound) tagBase;
+
+			for (String s : nbttagcompound.getKeySet()) {
+				NBTBase nbtbase = nbttagcompound.getTag(s);
+
+				if (this.matchesBase(nbtbase)) {
+					return true;
+				}
+			}
+		}
+
+		if (tagBase instanceof NBTTagList) {
+			NBTTagList nbttaglist = (NBTTagList) tagBase;
+			int i = nbttaglist.tagCount();
+
+			for (int j = 0; j < i; ++j) {
+				NBTBase nbtbase1 = nbttaglist.get(j);
+
+				if (this.matchesBase(nbtbase1)) {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	private static NBTBase getChildTag(NBTBase tagBase, String tag) {
+		if (tagBase instanceof NBTTagCompound) {
+			NBTTagCompound nbttagcompound = (NBTTagCompound) tagBase;
+			return nbttagcompound.getTag(tag);
+		} else if (tagBase instanceof NBTTagList) {
+			NBTTagList nbttaglist = (NBTTagList) tagBase;
+
+			if (tag.equals("count")) {
+				return new NBTTagInt(nbttaglist.tagCount());
+			} else {
+				int i = Config.parseInt(tag, -1);
+				return i >= 0 && i < nbttaglist.tagCount() ? nbttaglist.get(i) : null;
+			}
+		} else {
+			return null;
+		}
+	}
+
+	public boolean matchesBase(NBTBase nbtBase) {
+		if (nbtBase == null) {
+			return false;
+		} else {
+			String s = getNbtString(nbtBase, this.valueFormat);
+			return this.matchesValue(s);
+		}
+	}
+
+	public boolean matchesValue(String nbtValue) {
+		if (nbtValue == null) {
+			return false;
+		} else {
+			switch (this.type) {
+			case 0:
+				return nbtValue.equals(this.value);
+
+			case 1:
+				return this.matchesPattern(nbtValue, this.value);
+
+			case 2:
+				return this.matchesPattern(nbtValue.toLowerCase(), this.value);
+
+			case 3:
+				return this.matchesRegex(nbtValue, this.value);
+
+			case 4:
+				return this.matchesRegex(nbtValue.toLowerCase(), this.value);
+
+			default:
+				throw new IllegalArgumentException("Unknown NbtTagValue type: " + this.type);
+			}
+		}
+	}
+
+	private boolean matchesPattern(String str, String pattern) {
+		return StrUtils.equalsMask(str, pattern, '*', '?');
+	}
+
+	private boolean matchesRegex(String str, String regex) {
+		return str.matches(regex);
+	}
+
+	private static String getNbtString(NBTBase nbtBase, int format) {
+		if (nbtBase == null) {
+			return null;
+		} else if (nbtBase instanceof NBTTagString) {
+			NBTTagString nbttagstring = (NBTTagString) nbtBase;
+			return nbttagstring.getString();
+		} else if (nbtBase instanceof NBTTagInt) {
+			NBTTagInt nbttagint = (NBTTagInt) nbtBase;
+			return format == 1 ? "#" + StrUtils.fillLeft(Integer.toHexString(nbttagint.getInt()), 6, '0')
+					: Integer.toString(nbttagint.getInt());
+		} else if (nbtBase instanceof NBTTagByte) {
+			NBTTagByte nbttagbyte = (NBTTagByte) nbtBase;
+			return Byte.toString(nbttagbyte.getByte());
+		} else if (nbtBase instanceof NBTTagShort) {
+			NBTTagShort nbttagshort = (NBTTagShort) nbtBase;
+			return Short.toString(nbttagshort.getShort());
+		} else if (nbtBase instanceof NBTTagLong) {
+			NBTTagLong nbttaglong = (NBTTagLong) nbtBase;
+			return Long.toString(nbttaglong.getLong());
+		} else if (nbtBase instanceof NBTTagFloat) {
+			NBTTagFloat nbttagfloat = (NBTTagFloat) nbtBase;
+			return Float.toString(nbttagfloat.getFloat());
+		} else if (nbtBase instanceof NBTTagDouble) {
+			NBTTagDouble nbttagdouble = (NBTTagDouble) nbtBase;
+			return Double.toString(nbttagdouble.getDouble());
+		} else {
+			return nbtBase.toString();
+		}
+	}
+
+	public String toString() {
+		StringBuffer stringbuffer = new StringBuffer();
+
+		for (int i = 0; i < this.parents.length; ++i) {
+			String s = this.parents[i];
+
+			if (i > 0) {
+				stringbuffer.append(".");
+			}
+
+			stringbuffer.append(s);
+		}
+
+		if (stringbuffer.length() > 0) {
+			stringbuffer.append(".");
+		}
+
+		stringbuffer.append(this.name);
+		stringbuffer.append(" = ");
+		stringbuffer.append(this.value);
+		return stringbuffer.toString();
+	}
+}
diff --git a/sources/main/java/net/optifine/config/ParserEnchantmentId.java b/sources/main/java/net/optifine/config/ParserEnchantmentId.java
new file mode 100644
index 00000000..a523331b
--- /dev/null
+++ b/sources/main/java/net/optifine/config/ParserEnchantmentId.java
@@ -0,0 +1,10 @@
+package net.optifine.config;
+
+import net.minecraft.enchantment.Enchantment;
+
+public class ParserEnchantmentId implements IParserInt {
+	public int parse(String str, int defVal) {
+		Enchantment enchantment = Enchantment.getEnchantmentByLocation(str);
+		return enchantment == null ? defVal : enchantment.effectId;
+	}
+}
diff --git a/sources/main/java/net/optifine/config/RangeInt.java b/sources/main/java/net/optifine/config/RangeInt.java
new file mode 100644
index 00000000..c544644a
--- /dev/null
+++ b/sources/main/java/net/optifine/config/RangeInt.java
@@ -0,0 +1,27 @@
+package net.optifine.config;
+
+public class RangeInt {
+	private int min;
+	private int max;
+
+	public RangeInt(int min, int max) {
+		this.min = Math.min(min, max);
+		this.max = Math.max(min, max);
+	}
+
+	public boolean isInRange(int val) {
+		return val < this.min ? false : val <= this.max;
+	}
+
+	public int getMin() {
+		return this.min;
+	}
+
+	public int getMax() {
+		return this.max;
+	}
+
+	public String toString() {
+		return "min: " + this.min + ", max: " + this.max;
+	}
+}
diff --git a/sources/main/java/net/optifine/config/RangeListInt.java b/sources/main/java/net/optifine/config/RangeListInt.java
new file mode 100644
index 00000000..1fed803e
--- /dev/null
+++ b/sources/main/java/net/optifine/config/RangeListInt.java
@@ -0,0 +1,57 @@
+package net.optifine.config;
+
+public class RangeListInt {
+	private RangeInt[] ranges = new RangeInt[0];
+
+	public RangeListInt() {
+	}
+
+	public RangeListInt(RangeInt ri) {
+		this.addRange(ri);
+	}
+
+	public void addRange(RangeInt ri) {
+		RangeInt[] newRanges = new RangeInt[ranges.length + 1];
+		System.arraycopy(ranges, 0, newRanges, 0, ranges.length);
+		newRanges[ranges.length] = ri;
+		this.ranges = newRanges;
+	}
+
+	public boolean isInRange(int val) {
+		for (int i = 0; i < this.ranges.length; ++i) {
+			RangeInt rangeint = this.ranges[i];
+
+			if (rangeint.isInRange(val)) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	public int getCountRanges() {
+		return this.ranges.length;
+	}
+
+	public RangeInt getRange(int i) {
+		return this.ranges[i];
+	}
+
+	public String toString() {
+		StringBuffer stringbuffer = new StringBuffer();
+		stringbuffer.append("[");
+
+		for (int i = 0; i < this.ranges.length; ++i) {
+			RangeInt rangeint = this.ranges[i];
+
+			if (i > 0) {
+				stringbuffer.append(", ");
+			}
+
+			stringbuffer.append(rangeint.toString());
+		}
+
+		stringbuffer.append("]");
+		return stringbuffer.toString();
+	}
+}
diff --git a/sources/main/java/net/optifine/config/Weather.java b/sources/main/java/net/optifine/config/Weather.java
new file mode 100644
index 00000000..376bf70e
--- /dev/null
+++ b/sources/main/java/net/optifine/config/Weather.java
@@ -0,0 +1,18 @@
+package net.optifine.config;
+
+import net.minecraft.world.World;
+
+public enum Weather {
+	CLEAR, RAIN, THUNDER;
+
+	public static Weather getWeather(World world, float partialTicks) {
+		float f = world.getThunderStrength(partialTicks);
+
+		if (f > 0.5F) {
+			return THUNDER;
+		} else {
+			float f1 = world.getRainStrength(partialTicks);
+			return f1 > 0.5F ? RAIN : CLEAR;
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/model/BlockModelCustomizer.java b/sources/main/java/net/optifine/model/BlockModelCustomizer.java
new file mode 100644
index 00000000..945c0543
--- /dev/null
+++ b/sources/main/java/net/optifine/model/BlockModelCustomizer.java
@@ -0,0 +1,100 @@
+package net.optifine.model;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumWorldBlockLayer;
+import net.minecraft.world.IBlockAccess;
+import net.optifine.BetterGrass;
+import net.optifine.Config;
+import net.optifine.ConnectedTextures;
+import net.optifine.SmartLeaves;
+import net.optifine.render.RenderEnv;
+
+public class BlockModelCustomizer {
+	private static final List<BakedQuad> NO_QUADS = ImmutableList.<BakedQuad>of();
+
+	public static IBakedModel getRenderModel(IBakedModel modelIn, IBlockState stateIn, RenderEnv renderEnv) {
+		if (renderEnv.isSmartLeaves()) {
+			modelIn = SmartLeaves.getLeavesModel(modelIn, stateIn);
+		}
+
+		return modelIn;
+	}
+
+	public static List<BakedQuad> getRenderQuads(List<BakedQuad> quads, IBlockAccess worldIn, IBlockState stateIn,
+			BlockPos posIn, EnumFacing enumfacing, EnumWorldBlockLayer layer, long rand, RenderEnv renderEnv) {
+		if (enumfacing != null) {
+			if (renderEnv.isSmartLeaves()
+					&& SmartLeaves.isSameLeaves(worldIn.getBlockState(posIn.offset(enumfacing)), stateIn)) {
+				return NO_QUADS;
+			}
+
+			if (!renderEnv.isBreakingAnimation(quads) && Config.isBetterGrass()) {
+				quads = BetterGrass.getFaceQuads(worldIn, stateIn, posIn, enumfacing, quads);
+			}
+		}
+
+		List<BakedQuad> list = renderEnv.getListQuadsCustomizer();
+		list.clear();
+
+		for (int i = 0; i < quads.size(); ++i) {
+			BakedQuad bakedquad = (BakedQuad) quads.get(i);
+			BakedQuad[] abakedquad = getRenderQuads(bakedquad, worldIn, stateIn, posIn, enumfacing, rand, renderEnv);
+
+			if (i == 0 && quads.size() == 1 && abakedquad.length == 1 && abakedquad[0] == bakedquad
+			/* && bakedquad.getQuadEmissive() == null */) {
+				return quads;
+			}
+
+			for (int j = 0; j < abakedquad.length; ++j) {
+				BakedQuad bakedquad1 = abakedquad[j];
+				list.add(bakedquad1);
+
+//				if (bakedquad1.getQuadEmissive() != null) {
+//					renderEnv.getListQuadsOverlay(getEmissiveLayer(layer)).addQuad(bakedquad1.getQuadEmissive(),
+//							stateIn);
+//					renderEnv.setOverlaysRendered(true);
+//				}
+			}
+		}
+
+		return list;
+	}
+
+	private static EnumWorldBlockLayer getEmissiveLayer(EnumWorldBlockLayer layer) {
+		return layer != null && layer != EnumWorldBlockLayer.SOLID ? layer : EnumWorldBlockLayer.CUTOUT_MIPPED;
+	}
+
+	private static BakedQuad[] getRenderQuads(BakedQuad quad, IBlockAccess worldIn, IBlockState stateIn, BlockPos posIn,
+			EnumFacing enumfacing, long rand, RenderEnv renderEnv) {
+		if (renderEnv.isBreakingAnimation(quad)) {
+			return renderEnv.getArrayQuadsCtm(quad);
+		} else {
+//			BakedQuad bakedquad = quad;
+
+			if (Config.isConnectedTextures()) {
+				BakedQuad[] abakedquad = ConnectedTextures.getConnectedTexture(worldIn, stateIn, posIn, quad,
+						renderEnv);
+
+				if (abakedquad.length != 1 || abakedquad[0] != quad) {
+					return abakedquad;
+				}
+			}
+
+//			if (Config.isNaturalTextures()) {
+//				quad = NaturalTextures.getNaturalTexture(posIn, quad);
+//
+//				if (quad != bakedquad) {
+//					return renderEnv.getArrayQuadsCtm(quad);
+//				}
+//			}
+
+			return renderEnv.getArrayQuadsCtm(quad);
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/model/BlockModelUtils.java b/sources/main/java/net/optifine/model/BlockModelUtils.java
new file mode 100644
index 00000000..ff0663b9
--- /dev/null
+++ b/sources/main/java/net/optifine/model/BlockModelUtils.java
@@ -0,0 +1,173 @@
+package net.optifine.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite;
+import net.lax1dude.eaglercraft.v1_8.vector.Vector3f;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.block.model.BlockFaceUV;
+import net.minecraft.client.renderer.block.model.BlockPartFace;
+import net.minecraft.client.renderer.block.model.BlockPartRotation;
+import net.minecraft.client.renderer.block.model.BreakingFour;
+import net.minecraft.client.renderer.block.model.FaceBakery;
+import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.client.resources.model.ModelManager;
+import net.minecraft.client.resources.model.ModelResourceLocation;
+import net.minecraft.client.resources.model.ModelRotation;
+import net.minecraft.client.resources.model.SimpleBakedModel;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+
+public class BlockModelUtils {
+	private static final float VERTEX_COORD_ACCURACY = 1.0E-6F;
+
+	public static IBakedModel makeModelCube(String spriteName, int tintIndex) {
+		EaglerTextureAtlasSprite textureatlassprite = Minecraft.getMinecraft().getTextureMapBlocks()
+				.getAtlasSprite(spriteName);
+		return makeModelCube(textureatlassprite, tintIndex);
+	}
+
+	public static IBakedModel makeModelCube(EaglerTextureAtlasSprite sprite, int tintIndex) {
+		List list = new ArrayList();
+		EnumFacing[] aenumfacing = EnumFacing._VALUES;
+		List<List<BakedQuad>> list1 = new ArrayList();
+
+		for (int i = 0; i < aenumfacing.length; ++i) {
+			EnumFacing enumfacing = aenumfacing[i];
+			List list2 = new ArrayList();
+			list2.add(makeBakedQuad(enumfacing, sprite, tintIndex));
+			list1.add(list2);
+		}
+
+		IBakedModel ibakedmodel = new SimpleBakedModel(list, list1, true, true, sprite, ItemCameraTransforms.DEFAULT);
+		return ibakedmodel;
+	}
+
+	public static IBakedModel joinModelsCube(IBakedModel modelBase, IBakedModel modelAdd) {
+		List<BakedQuad> list = new ArrayList();
+		list.addAll(modelBase.getGeneralQuads());
+		list.addAll(modelAdd.getGeneralQuads());
+		EnumFacing[] aenumfacing = EnumFacing._VALUES;
+		List list1 = new ArrayList();
+
+		for (int i = 0; i < aenumfacing.length; ++i) {
+			EnumFacing enumfacing = aenumfacing[i];
+			List list2 = new ArrayList();
+			list2.addAll(modelBase.getFaceQuads(enumfacing));
+			list2.addAll(modelAdd.getFaceQuads(enumfacing));
+			list1.add(list2);
+		}
+
+		boolean flag = modelBase.isAmbientOcclusion();
+		boolean flag1 = modelBase.isBuiltInRenderer();
+		EaglerTextureAtlasSprite textureatlassprite = modelBase.getParticleTexture();
+		ItemCameraTransforms itemcameratransforms = modelBase.getItemCameraTransforms();
+		IBakedModel ibakedmodel = new SimpleBakedModel(list, list1, flag, flag1, textureatlassprite,
+				itemcameratransforms);
+		return ibakedmodel;
+	}
+
+	public static BakedQuad makeBakedQuad(EnumFacing facing, EaglerTextureAtlasSprite sprite, int tintIndex) {
+		Vector3f vector3f = new Vector3f(0.0F, 0.0F, 0.0F);
+		Vector3f vector3f1 = new Vector3f(16.0F, 16.0F, 16.0F);
+		BlockFaceUV blockfaceuv = new BlockFaceUV(new float[] { 0.0F, 0.0F, 16.0F, 16.0F }, 0);
+		BlockPartFace blockpartface = new BlockPartFace(facing, tintIndex, "#" + facing.getName(), blockfaceuv);
+		ModelRotation modelrotation = ModelRotation.X0_Y0;
+		BlockPartRotation blockpartrotation = null;
+		boolean flag = false;
+		boolean flag1 = true;
+		FaceBakery facebakery = new FaceBakery();
+		BakedQuad bakedquad = facebakery.makeBakedQuad(vector3f, vector3f1, blockpartface, sprite, facing,
+				modelrotation, blockpartrotation, flag, flag1);
+		return bakedquad;
+	}
+
+	public static IBakedModel makeModel(String modelName, String spriteOldName, String spriteNewName) {
+		TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
+		EaglerTextureAtlasSprite textureatlassprite = texturemap.getAtlasSprite(spriteOldName); // getSpriteSafe
+		EaglerTextureAtlasSprite textureatlassprite1 = texturemap.getAtlasSprite(spriteNewName);
+		return makeModel(modelName, textureatlassprite, textureatlassprite1);
+	}
+
+	public static IBakedModel makeModel(String modelName, EaglerTextureAtlasSprite spriteOld,
+			EaglerTextureAtlasSprite spriteNew) {
+		if (spriteOld != null && spriteNew != null) {
+			ModelManager modelmanager = Minecraft.getMinecraft().getModelManager();
+
+			if (modelmanager == null) {
+				return null;
+			} else {
+				ModelResourceLocation modelresourcelocation = new ModelResourceLocation(modelName, "normal");
+				IBakedModel ibakedmodel = modelmanager.getModel(modelresourcelocation);
+
+				if (ibakedmodel != null && ibakedmodel != modelmanager.getMissingModel()) {
+					IBakedModel ibakedmodel1 = ModelUtils.duplicateModel(ibakedmodel);
+					EnumFacing[] aenumfacing = EnumFacing._VALUES;
+
+					for (int i = 0; i < aenumfacing.length; ++i) {
+						EnumFacing enumfacing = aenumfacing[i];
+						List<BakedQuad> list = ibakedmodel1.getFaceQuads(enumfacing);
+						replaceTexture(list, spriteOld, spriteNew);
+					}
+
+					List<BakedQuad> list1 = ibakedmodel1.getGeneralQuads();
+					replaceTexture(list1, spriteOld, spriteNew);
+					return ibakedmodel1;
+				} else {
+					return null;
+				}
+			}
+		} else {
+			return null;
+		}
+	}
+
+	private static void replaceTexture(List<BakedQuad> quads, EaglerTextureAtlasSprite spriteOld,
+			EaglerTextureAtlasSprite spriteNew) {
+		List<BakedQuad> list = new ArrayList();
+
+		for (BakedQuad bakedquad : quads) {
+			if (bakedquad.getSprite() == spriteOld) {
+				bakedquad = new BreakingFour(bakedquad, spriteNew);
+			}
+
+			list.add(bakedquad);
+		}
+
+		quads.clear();
+		quads.addAll(list);
+	}
+
+	public static void snapVertexPosition(Vector3f pos) {
+		pos.setX(snapVertexCoord(pos.getX()));
+		pos.setY(snapVertexCoord(pos.getY()));
+		pos.setZ(snapVertexCoord(pos.getZ()));
+	}
+
+	private static float snapVertexCoord(float x) {
+		return x > -1.0E-6F && x < 1.0E-6F ? 0.0F : (x > 0.999999F && x < 1.000001F ? 1.0F : x);
+	}
+
+	public static AxisAlignedBB getOffsetBoundingBox(AxisAlignedBB aabb, Block.EnumOffsetType offsetType,
+			BlockPos pos) {
+		int i = pos.getX();
+		int j = pos.getZ();
+		long k = (long) (i * 3129871) ^ (long) j * 116129781L;
+		k = k * k * 42317861L + k * 11L;
+		double d0 = ((double) ((float) (k >> 16 & 15L) / 15.0F) - 0.5D) * 0.5D;
+		double d1 = ((double) ((float) (k >> 24 & 15L) / 15.0F) - 0.5D) * 0.5D;
+		double d2 = 0.0D;
+
+		if (offsetType == Block.EnumOffsetType.XYZ) {
+			d2 = ((double) ((float) (k >> 20 & 15L) / 15.0F) - 1.0D) * 0.2D;
+		}
+
+		return aabb.offset(d0, d2, d1);
+	}
+}
diff --git a/sources/main/java/net/optifine/model/ListQuadsOverlay.java b/sources/main/java/net/optifine/model/ListQuadsOverlay.java
new file mode 100644
index 00000000..124b334d
--- /dev/null
+++ b/sources/main/java/net/optifine/model/ListQuadsOverlay.java
@@ -0,0 +1,44 @@
+package net.optifine.model;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.init.Blocks;
+
+public class ListQuadsOverlay {
+	private List<BakedQuad> listQuads = new ArrayList();
+	private List<IBlockState> listBlockStates = new ArrayList();
+	private List<BakedQuad> listQuadsSingle = Arrays.<BakedQuad>asList(new BakedQuad[1]);
+
+	public void addQuad(BakedQuad quad, IBlockState blockState) {
+		if (quad != null) {
+			this.listQuads.add(quad);
+			this.listBlockStates.add(blockState);
+		}
+	}
+
+	public int size() {
+		return this.listQuads.size();
+	}
+
+	public BakedQuad getQuad(int index) {
+		return (BakedQuad) this.listQuads.get(index);
+	}
+
+	public IBlockState getBlockState(int index) {
+		return index >= 0 && index < this.listBlockStates.size() ? (IBlockState) this.listBlockStates.get(index)
+				: Blocks.air.getDefaultState();
+	}
+
+	public List<BakedQuad> getListQuadsSingle(BakedQuad quad) {
+		this.listQuadsSingle.set(0, quad);
+		return this.listQuadsSingle;
+	}
+
+	public void clear() {
+		this.listQuads.clear();
+		this.listBlockStates.clear();
+	}
+}
diff --git a/sources/main/java/net/optifine/model/ModelUtils.java b/sources/main/java/net/optifine/model/ModelUtils.java
new file mode 100644
index 00000000..da2c6212
--- /dev/null
+++ b/sources/main/java/net/optifine/model/ModelUtils.java
@@ -0,0 +1,94 @@
+package net.optifine.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.resources.model.IBakedModel;
+import net.minecraft.client.resources.model.SimpleBakedModel;
+import net.minecraft.util.EnumFacing;
+
+public class ModelUtils {
+	public static void dbgModel(IBakedModel model) {
+		if (model != null) {
+			// Config.dbg("Model: " + model + ", ao: " + model.isAmbientOcclusion() + ",
+			// gui3d: " + model.isGui3d() + ", builtIn: " + model.isBuiltInRenderer() + ",
+			// particle: " + model.getParticleTexture());
+			EnumFacing[] aenumfacing = EnumFacing._VALUES;
+
+			for (int i = 0; i < aenumfacing.length; ++i) {
+				EnumFacing enumfacing = aenumfacing[i];
+				List list = model.getFaceQuads(enumfacing);
+				dbgQuads(enumfacing.getName(), list, "  ");
+			}
+
+			List list1 = model.getGeneralQuads();
+			dbgQuads("General", list1, "  ");
+		}
+	}
+
+	private static void dbgQuads(String name, List quads, String prefix) {
+		for (Object bakedquad0 : quads) {
+			BakedQuad bakedQuad = (BakedQuad) bakedquad0;
+			dbgQuad(name, bakedQuad, prefix);
+		}
+	}
+
+	public static void dbgQuad(String name, BakedQuad quad, String prefix) {
+		// Config.dbg(prefix + "Quad: " + quad.getClass().getName() + ", type: " + name
+		// + ", face: " + quad.getFace() + ", tint: " + quad.getTintIndex() + ", sprite:
+		// " + quad.getSprite());
+		dbgVertexData(quad.getVertexData(), "  " + prefix);
+	}
+
+	public static void dbgVertexData(int[] vd, String prefix) {
+		int i = vd.length / 4;
+		// Config.dbg(prefix + "Length: " + vd.length + ", step: " + i);
+
+		for (int j = 0; j < 4; ++j) {
+			int k = j * i;
+			float f = Float.intBitsToFloat(vd[k + 0]);
+			float f1 = Float.intBitsToFloat(vd[k + 1]);
+			float f2 = Float.intBitsToFloat(vd[k + 2]);
+			int l = vd[k + 3];
+			float f3 = Float.intBitsToFloat(vd[k + 4]);
+			float f4 = Float.intBitsToFloat(vd[k + 5]);
+			// Config.dbg(prefix + j + " xyz: " + f + "," + f1 + "," + f2 + " col: " + l + "
+			// u,v: " + f3 + "," + f4);
+		}
+	}
+
+	public static IBakedModel duplicateModel(IBakedModel model) {
+		List list = duplicateQuadList(model.getGeneralQuads());
+		EnumFacing[] aenumfacing = EnumFacing._VALUES;
+		List list1 = new ArrayList();
+
+		for (int i = 0; i < aenumfacing.length; ++i) {
+			EnumFacing enumfacing = aenumfacing[i];
+			List list2 = model.getFaceQuads(enumfacing);
+			List list3 = duplicateQuadList(list2);
+			list1.add(list3);
+		}
+
+		SimpleBakedModel simplebakedmodel = new SimpleBakedModel(list, list1, model.isAmbientOcclusion(),
+				model.isGui3d(), model.getParticleTexture(), model.getItemCameraTransforms());
+		return simplebakedmodel;
+	}
+
+	public static List duplicateQuadList(List lists) {
+		List list = new ArrayList();
+
+		for (Object e : lists) {
+			BakedQuad bakedquad = (BakedQuad) e;
+			BakedQuad bakedquad1 = duplicateQuad(bakedquad);
+			list.add(bakedquad1);
+		}
+
+		return list;
+	}
+
+	public static BakedQuad duplicateQuad(BakedQuad quad) {
+		BakedQuad bakedquad = new BakedQuad((int[]) quad.getVertexData().clone(),
+				(int[]) quad.getVertexDataWithNormals().clone(), quad.getTintIndex(), quad.getFace(), quad.getSprite());
+		return bakedquad;
+	}
+}
diff --git a/sources/main/java/net/optifine/model/QuadBounds.java b/sources/main/java/net/optifine/model/QuadBounds.java
new file mode 100644
index 00000000..850989f8
--- /dev/null
+++ b/sources/main/java/net/optifine/model/QuadBounds.java
@@ -0,0 +1,158 @@
+package net.optifine.model;
+
+import net.minecraft.util.EnumFacing;
+
+public class QuadBounds {
+	private float minX = Float.MAX_VALUE;
+	private float minY = Float.MAX_VALUE;
+	private float minZ = Float.MAX_VALUE;
+	private float maxX = -3.4028235E38F;
+	private float maxY = -3.4028235E38F;
+	private float maxZ = -3.4028235E38F;
+
+	public QuadBounds(int[] vertexData) {
+		int i = vertexData.length / 4;
+
+		for (int j = 0; j < 4; ++j) {
+			int k = j * i;
+			float f = Float.intBitsToFloat(vertexData[k + 0]);
+			float f1 = Float.intBitsToFloat(vertexData[k + 1]);
+			float f2 = Float.intBitsToFloat(vertexData[k + 2]);
+
+			if (this.minX > f) {
+				this.minX = f;
+			}
+
+			if (this.minY > f1) {
+				this.minY = f1;
+			}
+
+			if (this.minZ > f2) {
+				this.minZ = f2;
+			}
+
+			if (this.maxX < f) {
+				this.maxX = f;
+			}
+
+			if (this.maxY < f1) {
+				this.maxY = f1;
+			}
+
+			if (this.maxZ < f2) {
+				this.maxZ = f2;
+			}
+		}
+	}
+
+	public float getMinX() {
+		return this.minX;
+	}
+
+	public float getMinY() {
+		return this.minY;
+	}
+
+	public float getMinZ() {
+		return this.minZ;
+	}
+
+	public float getMaxX() {
+		return this.maxX;
+	}
+
+	public float getMaxY() {
+		return this.maxY;
+	}
+
+	public float getMaxZ() {
+		return this.maxZ;
+	}
+
+	public boolean isFaceQuad(EnumFacing face) {
+		float f;
+		float f1;
+		float f2;
+
+		switch (face) {
+		case DOWN:
+			f = this.getMinY();
+			f1 = this.getMaxY();
+			f2 = 0.0F;
+			break;
+
+		case UP:
+			f = this.getMinY();
+			f1 = this.getMaxY();
+			f2 = 1.0F;
+			break;
+
+		case NORTH:
+			f = this.getMinZ();
+			f1 = this.getMaxZ();
+			f2 = 0.0F;
+			break;
+
+		case SOUTH:
+			f = this.getMinZ();
+			f1 = this.getMaxZ();
+			f2 = 1.0F;
+			break;
+
+		case WEST:
+			f = this.getMinX();
+			f1 = this.getMaxX();
+			f2 = 0.0F;
+			break;
+
+		case EAST:
+			f = this.getMinX();
+			f1 = this.getMaxX();
+			f2 = 1.0F;
+			break;
+
+		default:
+			return false;
+		}
+
+		return f == f2 && f1 == f2;
+	}
+
+	public boolean isFullQuad(EnumFacing face) {
+		float f;
+		float f1;
+		float f2;
+		float f3;
+
+		switch (face) {
+		case DOWN:
+		case UP:
+			f = this.getMinX();
+			f1 = this.getMaxX();
+			f2 = this.getMinZ();
+			f3 = this.getMaxZ();
+			break;
+
+		case NORTH:
+		case SOUTH:
+			f = this.getMinX();
+			f1 = this.getMaxX();
+			f2 = this.getMinY();
+			f3 = this.getMaxY();
+			break;
+
+		case WEST:
+		case EAST:
+			f = this.getMinY();
+			f1 = this.getMaxY();
+			f2 = this.getMinZ();
+			f3 = this.getMaxZ();
+			break;
+
+		default:
+			return false;
+		}
+
+		return f == 0.0F && f1 == 1.0F && f2 == 0.0F && f3 == 1.0F;
+	}
+}
diff --git a/sources/main/java/net/optifine/render/Blender.java b/sources/main/java/net/optifine/render/Blender.java
new file mode 100644
index 00000000..29e76293
--- /dev/null
+++ b/sources/main/java/net/optifine/render/Blender.java
@@ -0,0 +1,122 @@
+package net.optifine.render;
+
+import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager;
+import net.optifine.Config;
+
+public class Blender {
+	public static final int BLEND_ALPHA = 0;
+	public static final int BLEND_ADD = 1;
+	public static final int BLEND_SUBSTRACT = 2;
+	public static final int BLEND_MULTIPLY = 3;
+	public static final int BLEND_DODGE = 4;
+	public static final int BLEND_BURN = 5;
+	public static final int BLEND_SCREEN = 6;
+	public static final int BLEND_OVERLAY = 7;
+	public static final int BLEND_REPLACE = 8;
+	public static final int BLEND_DEFAULT = 1;
+
+	public static int parseBlend(String str) {
+		if (str == null) {
+			return 1;
+		} else {
+			str = str.toLowerCase().trim();
+
+			if (str.equals("alpha")) {
+				return 0;
+			} else if (str.equals("add")) {
+				return 1;
+			} else if (str.equals("subtract")) {
+				return 2;
+			} else if (str.equals("multiply")) {
+				return 3;
+			} else if (str.equals("dodge")) {
+				return 4;
+			} else if (str.equals("burn")) {
+				return 5;
+			} else if (str.equals("screen")) {
+				return 6;
+			} else if (str.equals("overlay")) {
+				return 7;
+			} else if (str.equals("replace")) {
+				return 8;
+			} else {
+				Config.warn("Unknown blend: " + str);
+				return 1;
+			}
+		}
+	}
+
+	public static void setupBlend(int blend, float brightness) {
+		switch (blend) {
+		case 0:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(770, 771);
+			GlStateManager.color(1.0F, 1.0F, 1.0F, brightness);
+			break;
+
+		case 1:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(770, 1);
+			GlStateManager.color(1.0F, 1.0F, 1.0F, brightness);
+			break;
+
+		case 2:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(775, 0);
+			GlStateManager.color(brightness, brightness, brightness, 1.0F);
+			break;
+
+		case 3:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(774, 771);
+			GlStateManager.color(brightness, brightness, brightness, brightness);
+			break;
+
+		case 4:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(1, 1);
+			GlStateManager.color(brightness, brightness, brightness, 1.0F);
+			break;
+
+		case 5:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(0, 769);
+			GlStateManager.color(brightness, brightness, brightness, 1.0F);
+			break;
+
+		case 6:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(1, 769);
+			GlStateManager.color(brightness, brightness, brightness, 1.0F);
+			break;
+
+		case 7:
+			GlStateManager.disableAlpha();
+			GlStateManager.enableBlend();
+			GlStateManager.blendFunc(774, 768);
+			GlStateManager.color(brightness, brightness, brightness, 1.0F);
+			break;
+
+		case 8:
+			GlStateManager.enableAlpha();
+			GlStateManager.disableBlend();
+			GlStateManager.color(1.0F, 1.0F, 1.0F, brightness);
+		}
+
+		GlStateManager.enableTexture2D();
+	}
+
+	public static void clearBlend(float rainBrightness) {
+		GlStateManager.disableAlpha();
+		GlStateManager.enableBlend();
+		GlStateManager.blendFunc(770, 1);
+		GlStateManager.color(1.0F, 1.0F, 1.0F, rainBrightness);
+	}
+}
diff --git a/sources/main/java/net/optifine/render/RenderEnv.java b/sources/main/java/net/optifine/render/RenderEnv.java
new file mode 100644
index 00000000..78238def
--- /dev/null
+++ b/sources/main/java/net/optifine/render/RenderEnv.java
@@ -0,0 +1,265 @@
+package net.optifine.render;
+
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLeaves;
+import net.minecraft.block.state.BlockStateBase;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.renderer.BlockModelRenderer;
+import net.minecraft.client.renderer.RegionRenderCacheBuilder;
+import net.minecraft.client.renderer.block.model.BakedQuad;
+import net.minecraft.client.renderer.block.model.BreakingFour;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumWorldBlockLayer;
+import net.optifine.Config;
+import net.optifine.model.ListQuadsOverlay;
+
+public class RenderEnv {
+	private IBlockState blockState;
+	private BlockPos blockPos;
+	private int blockId = -1;
+	private int metadata = -1;
+	private int breakingAnimation = -1;
+	private int smartLeaves = -1;
+	private float[] quadBounds = new float[EnumFacing._VALUES.length * 2];
+	private BitSet boundsFlags = new BitSet(3);
+	private BlockModelRenderer.AmbientOcclusionFace aoFace = new BlockModelRenderer.AmbientOcclusionFace();
+	private BlockPos colorizerBlockPosM = null;
+	private boolean[] borderFlags = null;
+	private boolean[] borderFlags2 = null;
+	private boolean[] borderFlags3 = null;
+	private EnumFacing[] borderDirections = null;
+	private List<BakedQuad> listQuadsCustomizer = new ArrayList();
+	private List<BakedQuad> listQuadsCtmMultipass = new ArrayList();
+	private BakedQuad[] arrayQuadsCtm1 = new BakedQuad[1];
+	private BakedQuad[] arrayQuadsCtm2 = new BakedQuad[2];
+	private BakedQuad[] arrayQuadsCtm3 = new BakedQuad[3];
+	private BakedQuad[] arrayQuadsCtm4 = new BakedQuad[4];
+	private RegionRenderCacheBuilder regionRenderCacheBuilder = null;
+	private ListQuadsOverlay[] listsQuadsOverlay = new ListQuadsOverlay[EnumWorldBlockLayer.values().length];
+	private boolean overlaysRendered = false;
+	private static final int UNKNOWN = -1;
+	private static final int FALSE = 0;
+	private static final int TRUE = 1;
+
+	public RenderEnv(IBlockState blockState, BlockPos blockPos) {
+		this.blockState = blockState;
+		this.blockPos = blockPos;
+	}
+
+	public void reset(IBlockState blockStateIn, BlockPos blockPosIn) {
+		if (this.blockState != blockStateIn || this.blockPos != blockPosIn) {
+			this.blockState = blockStateIn;
+			this.blockPos = blockPosIn;
+			this.blockId = -1;
+			this.metadata = -1;
+			this.breakingAnimation = -1;
+			this.smartLeaves = -1;
+			this.boundsFlags.clear();
+		}
+	}
+
+	public int getBlockId() {
+		if (this.blockId < 0) {
+			if (this.blockState instanceof BlockStateBase) {
+				BlockStateBase blockstatebase = (BlockStateBase) this.blockState;
+				this.blockId = blockstatebase.getBlockId();
+			} else {
+				this.blockId = Block.getIdFromBlock(this.blockState.getBlock());
+			}
+		}
+
+		return this.blockId;
+	}
+
+	public int getMetadata() {
+		if (this.metadata < 0) {
+			if (this.blockState instanceof BlockStateBase) {
+				BlockStateBase blockstatebase = (BlockStateBase) this.blockState;
+				this.metadata = blockstatebase.getMetadata();
+			} else {
+				this.metadata = this.blockState.getBlock().getMetaFromState(this.blockState);
+			}
+		}
+
+		return this.metadata;
+	}
+
+	public float[] getQuadBounds() {
+		return this.quadBounds;
+	}
+
+	public BitSet getBoundsFlags() {
+		return this.boundsFlags;
+	}
+
+	public BlockModelRenderer.AmbientOcclusionFace getAoFace() {
+		return this.aoFace;
+	}
+
+	public boolean isBreakingAnimation(List listQuads) {
+		if (this.breakingAnimation == -1 && listQuads.size() > 0) {
+			if (listQuads.get(0) instanceof BreakingFour) {
+				this.breakingAnimation = 1;
+			} else {
+				this.breakingAnimation = 0;
+			}
+		}
+
+		return this.breakingAnimation == 1;
+	}
+
+	public boolean isBreakingAnimation(BakedQuad quad) {
+		if (this.breakingAnimation < 0) {
+			if (quad instanceof BreakingFour) {
+				this.breakingAnimation = 1;
+			} else {
+				this.breakingAnimation = 0;
+			}
+		}
+
+		return this.breakingAnimation == 1;
+	}
+
+	public boolean isBreakingAnimation() {
+		return this.breakingAnimation == 1;
+	}
+
+	public IBlockState getBlockState() {
+		return this.blockState;
+	}
+
+	public BlockPos getColorizerBlockPosM() {
+		if (this.colorizerBlockPosM == null) {
+			this.colorizerBlockPosM = new BlockPos(0, 0, 0);
+		}
+
+		return this.colorizerBlockPosM;
+	}
+
+	public boolean[] getBorderFlags() {
+		if (this.borderFlags == null) {
+			this.borderFlags = new boolean[4];
+		}
+
+		return this.borderFlags;
+	}
+
+	public boolean[] getBorderFlags2() {
+		if (this.borderFlags2 == null) {
+			this.borderFlags2 = new boolean[4];
+		}
+
+		return this.borderFlags2;
+	}
+
+	public boolean[] getBorderFlags3() {
+		if (this.borderFlags3 == null) {
+			this.borderFlags3 = new boolean[4];
+		}
+
+		return this.borderFlags3;
+	}
+
+	public EnumFacing[] getBorderDirections() {
+		if (this.borderDirections == null) {
+			this.borderDirections = new EnumFacing[4];
+		}
+
+		return this.borderDirections;
+	}
+
+	public EnumFacing[] getBorderDirections(EnumFacing dir0, EnumFacing dir1, EnumFacing dir2, EnumFacing dir3) {
+		EnumFacing[] aenumfacing = this.getBorderDirections();
+		aenumfacing[0] = dir0;
+		aenumfacing[1] = dir1;
+		aenumfacing[2] = dir2;
+		aenumfacing[3] = dir3;
+		return aenumfacing;
+	}
+
+	public boolean isSmartLeaves() {
+		if (this.smartLeaves == -1) {
+			if (Config.isTreesSmart() && this.blockState.getBlock() instanceof BlockLeaves) {
+				this.smartLeaves = 1;
+			} else {
+				this.smartLeaves = 0;
+			}
+		}
+
+		return this.smartLeaves == 1;
+	}
+
+	public List<BakedQuad> getListQuadsCustomizer() {
+		return this.listQuadsCustomizer;
+	}
+
+	public BakedQuad[] getArrayQuadsCtm(BakedQuad quad) {
+		this.arrayQuadsCtm1[0] = quad;
+		return this.arrayQuadsCtm1;
+	}
+
+	public BakedQuad[] getArrayQuadsCtm(BakedQuad quad0, BakedQuad quad1) {
+		this.arrayQuadsCtm2[0] = quad0;
+		this.arrayQuadsCtm2[1] = quad1;
+		return this.arrayQuadsCtm2;
+	}
+
+	public BakedQuad[] getArrayQuadsCtm(BakedQuad quad0, BakedQuad quad1, BakedQuad quad2) {
+		this.arrayQuadsCtm3[0] = quad0;
+		this.arrayQuadsCtm3[1] = quad1;
+		this.arrayQuadsCtm3[2] = quad2;
+		return this.arrayQuadsCtm3;
+	}
+
+	public BakedQuad[] getArrayQuadsCtm(BakedQuad quad0, BakedQuad quad1, BakedQuad quad2, BakedQuad quad3) {
+		this.arrayQuadsCtm4[0] = quad0;
+		this.arrayQuadsCtm4[1] = quad1;
+		this.arrayQuadsCtm4[2] = quad2;
+		this.arrayQuadsCtm4[3] = quad3;
+		return this.arrayQuadsCtm4;
+	}
+
+	public List<BakedQuad> getListQuadsCtmMultipass(BakedQuad[] quads) {
+		this.listQuadsCtmMultipass.clear();
+
+		if (quads != null) {
+			for (int i = 0; i < quads.length; ++i) {
+				BakedQuad bakedquad = quads[i];
+				this.listQuadsCtmMultipass.add(bakedquad);
+			}
+		}
+
+		return this.listQuadsCtmMultipass;
+	}
+
+	public RegionRenderCacheBuilder getRegionRenderCacheBuilder() {
+		return this.regionRenderCacheBuilder;
+	}
+
+	public void setRegionRenderCacheBuilder(RegionRenderCacheBuilder regionRenderCacheBuilder) {
+		this.regionRenderCacheBuilder = regionRenderCacheBuilder;
+	}
+
+	public ListQuadsOverlay getListQuadsOverlay(EnumWorldBlockLayer layer) {
+		ListQuadsOverlay listquadsoverlay = this.listsQuadsOverlay[layer.ordinal()];
+
+		if (listquadsoverlay == null) {
+			listquadsoverlay = new ListQuadsOverlay();
+			this.listsQuadsOverlay[layer.ordinal()] = listquadsoverlay;
+		}
+
+		return listquadsoverlay;
+	}
+
+	public boolean isOverlaysRendered() {
+		return this.overlaysRendered;
+	}
+
+	public void setOverlaysRendered(boolean overlaysRendered) {
+		this.overlaysRendered = overlaysRendered;
+	}
+}
diff --git a/sources/main/java/net/optifine/util/CounterInt.java b/sources/main/java/net/optifine/util/CounterInt.java
new file mode 100644
index 00000000..976aa695
--- /dev/null
+++ b/sources/main/java/net/optifine/util/CounterInt.java
@@ -0,0 +1,24 @@
+package net.optifine.util;
+
+public class CounterInt {
+	private int startValue;
+	private int value;
+
+	public CounterInt(int startValue) {
+		this.startValue = startValue;
+		this.value = startValue;
+	}
+
+	public int nextValue() {
+		int i = this.value++;
+		return i;
+	}
+
+	public void reset() {
+		this.value = this.startValue;
+	}
+
+	public int getValue() {
+		return this.value;
+	}
+}
diff --git a/sources/main/java/net/optifine/util/MathUtils.java b/sources/main/java/net/optifine/util/MathUtils.java
new file mode 100644
index 00000000..f8177687
--- /dev/null
+++ b/sources/main/java/net/optifine/util/MathUtils.java
@@ -0,0 +1,74 @@
+package net.optifine.util;
+
+import net.minecraft.util.MathHelper;
+
+public class MathUtils {
+	public static final float PI = (float) Math.PI;
+	public static final float PI2 = ((float) Math.PI * 2F);
+	public static final float PId2 = ((float) Math.PI / 2F);
+//	private static final float[] ASIN_TABLE = new float[65536];
+//
+//	public static float asin(float value) {
+//		return ASIN_TABLE[(int) ((double) (value + 1.0F) * 32767.5D) & 65535];
+//	}
+//
+//	public static float acos(float value) {
+//		return ((float) Math.PI / 2F) - ASIN_TABLE[(int) ((double) (value + 1.0F) * 32767.5D) & 65535];
+//	}
+
+	public static int getAverage(int[] vals) {
+		if (vals.length <= 0) {
+			return 0;
+		} else {
+			int i = getSum(vals);
+			int j = i / vals.length;
+			return j;
+		}
+	}
+
+	public static int getSum(int[] vals) {
+		if (vals.length <= 0) {
+			return 0;
+		} else {
+			int i = 0;
+
+			for (int j = 0; j < vals.length; ++j) {
+				int k = vals[j];
+				i += k;
+			}
+
+			return i;
+		}
+	}
+
+	public static int roundDownToPowerOfTwo(int val) {
+		int i = MathHelper.roundUpToPowerOfTwo(val);
+		return val == i ? i : i / 2;
+	}
+
+	public static boolean equalsDelta(float f1, float f2, float delta) {
+		return Math.abs(f1 - f2) <= delta;
+	}
+
+	public static float toDeg(float angle) {
+		return angle * 180.0F / PI;
+	}
+
+	public static float toRad(float angle) {
+		return angle / 180.0F * PI;
+	}
+
+	public static float roundToFloat(double d) {
+		return (float) ((double) Math.round(d * 1.0E8D) / 1.0E8D);
+	}
+
+//	static {
+//		for (int i = 0; i < 65536; ++i) {
+//			ASIN_TABLE[i] = (float) Math.asin((double) i / 32767.5D - 1.0D);
+//		}
+//
+//		for (int j = -1; j < 2; ++j) {
+//			ASIN_TABLE[(int) (((double) j + 1.0D) * 32767.5D) & 65535] = (float) Math.asin((double) j);
+//		}
+//	}
+}
diff --git a/sources/main/java/net/optifine/util/NumUtils.java b/sources/main/java/net/optifine/util/NumUtils.java
new file mode 100644
index 00000000..669b5ae2
--- /dev/null
+++ b/sources/main/java/net/optifine/util/NumUtils.java
@@ -0,0 +1,17 @@
+package net.optifine.util;
+
+public class NumUtils {
+	public static float limit(float val, float min, float max) {
+		return val < min ? min : (val > max ? max : val);
+	}
+
+	public static int mod(int x, int y) {
+		int i = x % y;
+
+		if (i < 0) {
+			i += y;
+		}
+
+		return i;
+	}
+}
diff --git a/sources/main/java/net/optifine/util/PropertiesOrdered.java b/sources/main/java/net/optifine/util/PropertiesOrdered.java
new file mode 100644
index 00000000..a8bcf459
--- /dev/null
+++ b/sources/main/java/net/optifine/util/PropertiesOrdered.java
@@ -0,0 +1,27 @@
+package net.optifine.util;
+
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import net.lax1dude.eaglercraft.v1_8.EaglerProperties;
+
+public class PropertiesOrdered extends EaglerProperties {
+	private Set<Object> keysOrdered = new LinkedHashSet();
+
+	public Object put(Object key, Object value) {
+		this.keysOrdered.add(key);
+		return super.put(key, value);
+	}
+
+	public Set<Object> keySet() {
+		Set<Object> set = super.keySet();
+		this.keysOrdered.retainAll(set);
+		return Collections.<Object>unmodifiableSet(this.keysOrdered);
+	}
+
+	public Enumeration<Object> keys() {
+		return Collections.<Object>enumeration(this.keySet());
+	}
+}
diff --git a/sources/main/java/net/optifine/util/ResUtils.java b/sources/main/java/net/optifine/util/ResUtils.java
new file mode 100644
index 00000000..fbcb4c99
--- /dev/null
+++ b/sources/main/java/net/optifine/util/ResUtils.java
@@ -0,0 +1,54 @@
+package net.optifine.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.minecraft.client.resources.IResourcePack;
+
+public class ResUtils {
+
+	public static List<String> collectPropertyFiles(IResourcePack rp, String prefix) {
+		List<String> ret = new ArrayList<>();
+		for (String str : rp.getEaglerFileIndex().getPropertiesFiles()) {
+			if (str.startsWith(prefix)) {
+				ret.add(str);
+			}
+		}
+		return ret;
+	}
+
+	public static List<String> collectPropertyFiles(IResourcePack rp, String... prefixes) {
+		List<String> ret = new ArrayList<>();
+		for (String str : rp.getEaglerFileIndex().getPropertiesFiles()) {
+			for (int i = 0; i < prefixes.length; ++i) {
+				if (str.startsWith(prefixes[i])) {
+					ret.add(str);
+				}
+			}
+		}
+		return ret;
+	}
+
+	public static List<String> collectPotionFiles(IResourcePack rp, String prefix) {
+		List<String> ret = new ArrayList<>();
+		for (String str : rp.getEaglerFileIndex().getCITPotionsFiles()) {
+			if (str.startsWith(prefix)) {
+				ret.add(str);
+			}
+		}
+		return ret;
+	}
+
+	public static List<String> collectPotionFiles(IResourcePack rp, String... prefixes) {
+		List<String> ret = new ArrayList<>();
+		for (String str : rp.getEaglerFileIndex().getCITPotionsFiles()) {
+			for (int i = 0; i < prefixes.length; ++i) {
+				if (str.startsWith(prefixes[i])) {
+					ret.add(str);
+				}
+			}
+		}
+		return ret;
+	}
+
+}
diff --git a/sources/main/java/net/optifine/util/SmoothFloat.java b/sources/main/java/net/optifine/util/SmoothFloat.java
new file mode 100644
index 00000000..fdfd0b3f
--- /dev/null
+++ b/sources/main/java/net/optifine/util/SmoothFloat.java
@@ -0,0 +1,77 @@
+package net.optifine.util;
+
+public class SmoothFloat {
+	private float valueLast;
+	private float timeFadeUpSec;
+	private float timeFadeDownSec;
+	private long timeLastMs;
+
+	public SmoothFloat(float valueLast, float timeFadeSec) {
+		this(valueLast, timeFadeSec, timeFadeSec);
+	}
+
+	public SmoothFloat(float valueLast, float timeFadeUpSec, float timeFadeDownSec) {
+		this.valueLast = valueLast;
+		this.timeFadeUpSec = timeFadeUpSec;
+		this.timeFadeDownSec = timeFadeDownSec;
+		this.timeLastMs = System.currentTimeMillis();
+	}
+
+	public float getValueLast() {
+		return this.valueLast;
+	}
+
+	public float getTimeFadeUpSec() {
+		return this.timeFadeUpSec;
+	}
+
+	public float getTimeFadeDownSec() {
+		return this.timeFadeDownSec;
+	}
+
+	public long getTimeLastMs() {
+		return this.timeLastMs;
+	}
+
+	public float getSmoothValue(float value, float timeFadeUpSec, float timeFadeDownSec) {
+		this.timeFadeUpSec = timeFadeUpSec;
+		this.timeFadeDownSec = timeFadeDownSec;
+		return this.getSmoothValue(value);
+	}
+
+	public float getSmoothValue(float value) {
+		long i = System.currentTimeMillis();
+		float f = this.valueLast;
+		long j = this.timeLastMs;
+		float f1 = (float) (i - j) / 1000.0F;
+		float f2 = value >= f ? this.timeFadeUpSec : this.timeFadeDownSec;
+		float f3 = getSmoothValue(f, value, f1, f2);
+		this.valueLast = f3;
+		this.timeLastMs = i;
+		return f3;
+	}
+
+	public static float getSmoothValue(float valPrev, float value, float timeDeltaSec, float timeFadeSec) {
+		if (timeDeltaSec <= 0.0F) {
+			return valPrev;
+		} else {
+			float f = value - valPrev;
+			float f1;
+
+			if (timeFadeSec > 0.0F && timeDeltaSec < timeFadeSec && Math.abs(f) > 1.0E-6F) {
+				float f2 = timeFadeSec / timeDeltaSec;
+				float f3 = 4.61F;
+				float f4 = 0.13F;
+				float f5 = 10.0F;
+				float f6 = f3 - 1.0F / (f4 + f2 / f5);
+				float f7 = timeDeltaSec / timeFadeSec * f6;
+				f7 = NumUtils.limit(f7, 0.0F, 1.0F);
+				f1 = valPrev + f * f7;
+			} else {
+				f1 = value;
+			}
+
+			return f1;
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/util/StrUtils.java b/sources/main/java/net/optifine/util/StrUtils.java
new file mode 100644
index 00000000..c1e49aef
--- /dev/null
+++ b/sources/main/java/net/optifine/util/StrUtils.java
@@ -0,0 +1,603 @@
+package net.optifine.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+public class StrUtils {
+	public static boolean equalsMask(String str, String mask, char wildChar, char wildCharSingle) {
+		if (mask != null && str != null) {
+			if (mask.indexOf(wildChar) < 0) {
+				return mask.indexOf(wildCharSingle) < 0 ? mask.equals(str)
+						: equalsMaskSingle(str, mask, wildCharSingle);
+			} else {
+				List list = new ArrayList();
+				String s = "" + wildChar;
+
+				if (mask.startsWith(s)) {
+					list.add("");
+				}
+
+				StringTokenizer stringtokenizer = new StringTokenizer(mask, s);
+
+				while (stringtokenizer.hasMoreElements()) {
+					list.add(stringtokenizer.nextToken());
+				}
+
+				if (mask.endsWith(s)) {
+					list.add("");
+				}
+
+				String s1 = (String) list.get(0);
+
+				if (!startsWithMaskSingle(str, s1, wildCharSingle)) {
+					return false;
+				} else {
+					String s2 = (String) list.get(list.size() - 1);
+
+					if (!endsWithMaskSingle(str, s2, wildCharSingle)) {
+						return false;
+					} else {
+						int i = 0;
+
+						for (int j = 0; j < ((List) list).size(); ++j) {
+							String s3 = (String) list.get(j);
+
+							if (s3.length() > 0) {
+								int k = indexOfMaskSingle(str, s3, i, wildCharSingle);
+
+								if (k < 0) {
+									return false;
+								}
+
+								i = k + s3.length();
+							}
+						}
+
+						return true;
+					}
+				}
+			}
+		} else {
+			return mask == str;
+		}
+	}
+
+	private static boolean equalsMaskSingle(String str, String mask, char wildCharSingle) {
+		if (str != null && mask != null) {
+			if (str.length() != mask.length()) {
+				return false;
+			} else {
+				for (int i = 0; i < mask.length(); ++i) {
+					char c0 = mask.charAt(i);
+
+					if (c0 != wildCharSingle && str.charAt(i) != c0) {
+						return false;
+					}
+				}
+
+				return true;
+			}
+		} else {
+			return str == mask;
+		}
+	}
+
+	private static int indexOfMaskSingle(String str, String mask, int startPos, char wildCharSingle) {
+		if (str != null && mask != null) {
+			if (startPos >= 0 && startPos <= str.length()) {
+				if (str.length() < startPos + mask.length()) {
+					return -1;
+				} else {
+					for (int i = startPos; i + mask.length() <= str.length(); ++i) {
+						String s = str.substring(i, i + mask.length());
+
+						if (equalsMaskSingle(s, mask, wildCharSingle)) {
+							return i;
+						}
+					}
+
+					return -1;
+				}
+			} else {
+				return -1;
+			}
+		} else {
+			return -1;
+		}
+	}
+
+	private static boolean endsWithMaskSingle(String str, String mask, char wildCharSingle) {
+		if (str != null && mask != null) {
+			if (str.length() < mask.length()) {
+				return false;
+			} else {
+				String s = str.substring(str.length() - mask.length(), str.length());
+				return equalsMaskSingle(s, mask, wildCharSingle);
+			}
+		} else {
+			return str == mask;
+		}
+	}
+
+	private static boolean startsWithMaskSingle(String str, String mask, char wildCharSingle) {
+		if (str != null && mask != null) {
+			if (str.length() < mask.length()) {
+				return false;
+			} else {
+				String s = str.substring(0, mask.length());
+				return equalsMaskSingle(s, mask, wildCharSingle);
+			}
+		} else {
+			return str == mask;
+		}
+	}
+
+	public static boolean equalsMask(String str, String[] masks, char wildChar) {
+		for (int i = 0; i < masks.length; ++i) {
+			String s = masks[i];
+
+			if (equalsMask(str, s, wildChar)) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	public static boolean equalsMask(String str, String mask, char wildChar) {
+		if (mask != null && str != null) {
+			if (mask.indexOf(wildChar) < 0) {
+				return mask.equals(str);
+			} else {
+				List list = new ArrayList();
+				String s = "" + wildChar;
+
+				if (mask.startsWith(s)) {
+					list.add("");
+				}
+
+				StringTokenizer stringtokenizer = new StringTokenizer(mask, s);
+
+				while (stringtokenizer.hasMoreElements()) {
+					list.add(stringtokenizer.nextToken());
+				}
+
+				if (mask.endsWith(s)) {
+					list.add("");
+				}
+
+				String s1 = (String) list.get(0);
+
+				if (!str.startsWith(s1)) {
+					return false;
+				} else {
+					String s2 = (String) list.get(list.size() - 1);
+
+					if (!str.endsWith(s2)) {
+						return false;
+					} else {
+						int i = 0;
+
+						for (int j = 0; j < ((List) list).size(); ++j) {
+							String s3 = (String) list.get(j);
+
+							if (s3.length() > 0) {
+								int k = str.indexOf(s3, i);
+
+								if (k < 0) {
+									return false;
+								}
+
+								i = k + s3.length();
+							}
+						}
+
+						return true;
+					}
+				}
+			}
+		} else {
+			return mask == str;
+		}
+	}
+
+	public static String[] split(String str, String separators) {
+		if (str != null && str.length() > 0) {
+			if (separators == null) {
+				return new String[] { str };
+			} else {
+				List list = new ArrayList();
+				int i = 0;
+
+				for (int j = 0; j < str.length(); ++j) {
+					char c0 = str.charAt(j);
+
+					if (equals(c0, separators)) {
+						list.add(str.substring(i, j));
+						i = j + 1;
+					}
+				}
+
+				list.add(str.substring(i, str.length()));
+				return (String[]) ((String[]) list.toArray(new String[list.size()]));
+			}
+		} else {
+			return new String[0];
+		}
+	}
+
+	private static boolean equals(char ch, String matches) {
+		for (int i = 0; i < matches.length(); ++i) {
+			if (matches.charAt(i) == ch) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	public static boolean equalsTrim(String a, String b) {
+		if (a != null) {
+			a = a.trim();
+		}
+
+		if (b != null) {
+			b = b.trim();
+		}
+
+		return equals(a, b);
+	}
+
+	public static boolean isEmpty(String string) {
+		return string == null ? true : string.trim().length() <= 0;
+	}
+
+	public static String stringInc(String str) {
+		int i = parseInt(str, -1);
+
+		if (i == -1) {
+			return "";
+		} else {
+			++i;
+			String s = "" + i;
+			return s.length() > str.length() ? "" : fillLeft("" + i, str.length(), '0');
+		}
+	}
+
+	public static int parseInt(String s, int defVal) {
+		if (s == null) {
+			return defVal;
+		} else {
+			try {
+				return Integer.parseInt(s);
+			} catch (NumberFormatException var3) {
+				return defVal;
+			}
+		}
+	}
+
+	public static boolean isFilled(String string) {
+		return !isEmpty(string);
+	}
+
+	public static String addIfNotContains(String target, String source) {
+		for (int i = 0; i < source.length(); ++i) {
+			if (target.indexOf(source.charAt(i)) < 0) {
+				target = target + source.charAt(i);
+			}
+		}
+
+		return target;
+	}
+
+	public static String fillLeft(String s, int len, char fillChar) {
+		if (s == null) {
+			s = "";
+		}
+
+		if (s.length() >= len) {
+			return s;
+		} else {
+			StringBuffer stringbuffer = new StringBuffer();
+			int i = len - s.length();
+
+			while (stringbuffer.length() < i) {
+				stringbuffer.append(fillChar);
+			}
+
+			return stringbuffer.toString() + s;
+		}
+	}
+
+	public static String fillRight(String s, int len, char fillChar) {
+		if (s == null) {
+			s = "";
+		}
+
+		if (s.length() >= len) {
+			return s;
+		} else {
+			StringBuffer stringbuffer = new StringBuffer(s);
+
+			while (stringbuffer.length() < len) {
+				stringbuffer.append(fillChar);
+			}
+
+			return stringbuffer.toString();
+		}
+	}
+
+	public static boolean equals(Object a, Object b) {
+		return a == b ? true : (a != null && a.equals(b) ? true : b != null && b.equals(a));
+	}
+
+	public static boolean startsWith(String str, String[] prefixes) {
+		if (str == null) {
+			return false;
+		} else if (prefixes == null) {
+			return false;
+		} else {
+			for (int i = 0; i < prefixes.length; ++i) {
+				String s = prefixes[i];
+
+				if (str.startsWith(s)) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static boolean endsWith(String str, String[] suffixes) {
+		if (str == null) {
+			return false;
+		} else if (suffixes == null) {
+			return false;
+		} else {
+			for (int i = 0; i < suffixes.length; ++i) {
+				String s = suffixes[i];
+
+				if (str.endsWith(s)) {
+					return true;
+				}
+			}
+
+			return false;
+		}
+	}
+
+	public static String removePrefix(String str, String prefix) {
+		if (str != null && prefix != null) {
+			if (str.startsWith(prefix)) {
+				str = str.substring(prefix.length());
+			}
+
+			return str;
+		} else {
+			return str;
+		}
+	}
+
+	public static String removeSuffix(String str, String suffix) {
+		if (str != null && suffix != null) {
+			if (str.endsWith(suffix)) {
+				str = str.substring(0, str.length() - suffix.length());
+			}
+
+			return str;
+		} else {
+			return str;
+		}
+	}
+
+	public static String replaceSuffix(String str, String suffix, String suffixNew) {
+		if (str != null && suffix != null) {
+			if (!str.endsWith(suffix)) {
+				return str;
+			} else {
+				if (suffixNew == null) {
+					suffixNew = "";
+				}
+
+				str = str.substring(0, str.length() - suffix.length());
+				return str + suffixNew;
+			}
+		} else {
+			return str;
+		}
+	}
+
+	public static String replacePrefix(String str, String prefix, String prefixNew) {
+		if (str != null && prefix != null) {
+			if (!str.startsWith(prefix)) {
+				return str;
+			} else {
+				if (prefixNew == null) {
+					prefixNew = "";
+				}
+
+				str = str.substring(prefix.length());
+				return prefixNew + str;
+			}
+		} else {
+			return str;
+		}
+	}
+
+	public static int findPrefix(String[] strs, String prefix) {
+		if (strs != null && prefix != null) {
+			for (int i = 0; i < strs.length; ++i) {
+				String s = strs[i];
+
+				if (s.startsWith(prefix)) {
+					return i;
+				}
+			}
+
+			return -1;
+		} else {
+			return -1;
+		}
+	}
+
+	public static int findSuffix(String[] strs, String suffix) {
+		if (strs != null && suffix != null) {
+			for (int i = 0; i < strs.length; ++i) {
+				String s = strs[i];
+
+				if (s.endsWith(suffix)) {
+					return i;
+				}
+			}
+
+			return -1;
+		} else {
+			return -1;
+		}
+	}
+
+	public static String[] remove(String[] strs, int start, int end) {
+		if (strs == null) {
+			return strs;
+		} else if (end > 0 && start < strs.length) {
+			if (start >= end) {
+				return strs;
+			} else {
+				List<String> list = new ArrayList(strs.length);
+
+				for (int i = 0; i < strs.length; ++i) {
+					String s = strs[i];
+
+					if (i < start || i >= end) {
+						list.add(s);
+					}
+				}
+
+				String[] astring = (String[]) list.toArray(new String[list.size()]);
+				return astring;
+			}
+		} else {
+			return strs;
+		}
+	}
+
+	public static String removeSuffix(String str, String[] suffixes) {
+		if (str != null && suffixes != null) {
+			int i = str.length();
+
+			for (int j = 0; j < suffixes.length; ++j) {
+				String s = suffixes[j];
+				str = removeSuffix(str, s);
+
+				if (str.length() != i) {
+					break;
+				}
+			}
+
+			return str;
+		} else {
+			return str;
+		}
+	}
+
+	public static String removePrefix(String str, String[] prefixes) {
+		if (str != null && prefixes != null) {
+			int i = str.length();
+
+			for (int j = 0; j < prefixes.length; ++j) {
+				String s = prefixes[j];
+				str = removePrefix(str, s);
+
+				if (str.length() != i) {
+					break;
+				}
+			}
+
+			return str;
+		} else {
+			return str;
+		}
+	}
+
+	public static String removePrefixSuffix(String str, String[] prefixes, String[] suffixes) {
+		str = removePrefix(str, prefixes);
+		str = removeSuffix(str, suffixes);
+		return str;
+	}
+
+	public static String removePrefixSuffix(String str, String prefix, String suffix) {
+		return removePrefixSuffix(str, new String[] { prefix }, new String[] { suffix });
+	}
+
+	public static String getSegment(String str, String start, String end) {
+		if (str != null && start != null && end != null) {
+			int i = str.indexOf(start);
+
+			if (i < 0) {
+				return null;
+			} else {
+				int j = str.indexOf(end, i);
+				return j < 0 ? null : str.substring(i, j + end.length());
+			}
+		} else {
+			return null;
+		}
+	}
+
+	public static String addSuffixCheck(String str, String suffix) {
+		return str != null && suffix != null ? (str.endsWith(suffix) ? str : str + suffix) : str;
+	}
+
+	public static String addPrefixCheck(String str, String prefix) {
+		return str != null && prefix != null ? (str.endsWith(prefix) ? str : prefix + str) : str;
+	}
+
+	public static String trim(String str, String chars) {
+		if (str != null && chars != null) {
+			str = trimLeading(str, chars);
+			str = trimTrailing(str, chars);
+			return str;
+		} else {
+			return str;
+		}
+	}
+
+	public static String trimLeading(String str, String chars) {
+		if (str != null && chars != null) {
+			int i = str.length();
+
+			for (int j = 0; j < i; ++j) {
+				char c0 = str.charAt(j);
+
+				if (chars.indexOf(c0) < 0) {
+					return str.substring(j);
+				}
+			}
+
+			return "";
+		} else {
+			return str;
+		}
+	}
+
+	public static String trimTrailing(String str, String chars) {
+		if (str != null && chars != null) {
+			int i = str.length();
+			int j;
+
+			for (j = i; j > 0; --j) {
+				char c0 = str.charAt(j - 1);
+
+				if (chars.indexOf(c0) < 0) {
+					break;
+				}
+			}
+
+			return j == i ? str : str.substring(0, j);
+		} else {
+			return str;
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/util/TextureUtils.java b/sources/main/java/net/optifine/util/TextureUtils.java
new file mode 100644
index 00000000..e54e5659
--- /dev/null
+++ b/sources/main/java/net/optifine/util/TextureUtils.java
@@ -0,0 +1,96 @@
+package net.optifine.util;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.IReloadableResourceManager;
+import net.minecraft.client.resources.IResourceManager;
+import net.minecraft.client.resources.IResourceManagerReloadListener;
+import net.optifine.BetterGrass;
+import net.optifine.BetterSnow;
+import net.optifine.Config;
+import net.optifine.CustomItems;
+import net.optifine.CustomSky;
+import net.optifine.SmartLeaves;
+
+public class TextureUtils {
+
+	public static String fixResourcePath(String path, String basePath) {
+		String s = "assets/minecraft/";
+
+		if (path.startsWith(s)) {
+			path = path.substring(s.length());
+			return path;
+		} else if (path.startsWith("./")) {
+			path = path.substring(2);
+
+			if (!basePath.endsWith("/")) {
+				basePath = basePath + "/";
+			}
+
+			path = basePath + path;
+			return path;
+		} else {
+			if (path.startsWith("/~")) {
+				path = path.substring(1);
+			}
+
+			String s1 = "mcpatcher/";
+
+			if (path.startsWith("~/")) {
+				path = path.substring(2);
+				path = s1 + path;
+				return path;
+			} else if (path.startsWith("/")) {
+				path = s1 + path.substring(1);
+				return path;
+			} else {
+				return path;
+			}
+		}
+	}
+
+	public static String getBasePath(String path) {
+		int i = path.lastIndexOf(47);
+		return i < 0 ? "" : path.substring(0, i);
+	}
+
+	public static void registerResourceListener() {
+		IResourceManager iresourcemanager = Minecraft.getMinecraft().getResourceManager();
+		if (iresourcemanager instanceof IReloadableResourceManager) {
+			IReloadableResourceManager ireloadableresourcemanager = (IReloadableResourceManager) iresourcemanager;
+			IResourceManagerReloadListener iresourcemanagerreloadlistener = new IResourceManagerReloadListener() {
+				public void onResourceManagerReload(IResourceManager var1) {
+					TextureUtils.resourcesReloaded(var1);
+				}
+			};
+			ireloadableresourcemanager.registerReloadListener(iresourcemanagerreloadlistener);
+		}
+	}
+
+	public static void resourcesReloaded(IResourceManager rm) {
+		if (Minecraft.getMinecraft().getTextureMapBlocks() != null) {
+			Config.dbg("*** Reloading custom textures ***");
+			CustomSky.reset();
+			// TextureAnimations.reset();
+			// update();
+			// NaturalTextures.update();
+			BetterGrass.update();
+			BetterSnow.update();
+			// TextureAnimations.update();
+			// CustomColors.update();
+			CustomSky.update();
+			// RandomEntities.update();
+			CustomItems.updateModels();
+			// CustomEntityModels.update();
+			// Shaders.resourcesReloaded();
+			// Lang.resourcesReloaded();
+			// Config.updateTexturePackClouds();
+			SmartLeaves.updateLeavesModels();
+			// CustomPanorama.update();
+			// CustomGuis.update();
+			// LayerMooshroomMushroom.update();
+			// CustomLoadingScreens.update();
+			// CustomBlockLayers.update();
+			Minecraft.getMinecraft().getTextureManager().tick();
+		}
+	}
+}
diff --git a/sources/main/java/net/optifine/util/TileEntityUtils.java b/sources/main/java/net/optifine/util/TileEntityUtils.java
new file mode 100644
index 00000000..c21ffccc
--- /dev/null
+++ b/sources/main/java/net/optifine/util/TileEntityUtils.java
@@ -0,0 +1,22 @@
+package net.optifine.util;
+
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.BlockPos;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.IWorldNameable;
+
+public class TileEntityUtils {
+	public static String getTileEntityName(IBlockAccess blockAccess, BlockPos blockPos) {
+		TileEntity tileentity = blockAccess.getTileEntity(blockPos);
+		return getTileEntityName(tileentity);
+	}
+
+	public static String getTileEntityName(TileEntity te) {
+		if (!(te instanceof IWorldNameable)) {
+			return null;
+		} else {
+			IWorldNameable iworldnameable = (IWorldNameable) te;
+			return !iworldnameable.hasCustomName() ? null : iworldnameable.getName();
+		}
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/StringEscapeUtils.java b/sources/main/java/org/apache/commons/lang3/StringEscapeUtils.java
new file mode 100644
index 00000000..45f850a1
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/StringEscapeUtils.java
@@ -0,0 +1,849 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.apache.commons.lang3.text.translate.AggregateTranslator;
+import org.apache.commons.lang3.text.translate.CharSequenceTranslator;
+import org.apache.commons.lang3.text.translate.EntityArrays;
+import org.apache.commons.lang3.text.translate.JavaUnicodeEscaper;
+import org.apache.commons.lang3.text.translate.LookupTranslator;
+import org.apache.commons.lang3.text.translate.NumericEntityEscaper;
+import org.apache.commons.lang3.text.translate.NumericEntityUnescaper;
+import org.apache.commons.lang3.text.translate.OctalUnescaper;
+import org.apache.commons.lang3.text.translate.UnicodeUnescaper;
+import org.apache.commons.lang3.text.translate.UnicodeUnpairedSurrogateRemover;
+
+/**
+ * <p>
+ * Escapes and unescapes {@code String}s for Java, Java Script, HTML and XML.
+ * </p>
+ *
+ * <p>
+ * #ThreadSafe#
+ * </p>
+ * 
+ * @since 2.0
+ * @version $Id: StringEscapeUtils.java 1583482 2014-03-31 22:54:57Z niallp $
+ */
+public class StringEscapeUtils {
+
+	/* ESCAPE TRANSLATORS */
+
+	/**
+	 * Translator object for escaping Java.
+	 * 
+	 * While {@link #escapeJava(String)} is the expected method of use, this object
+	 * allows the Java escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator ESCAPE_JAVA = new LookupTranslator(
+			new String[][] { { "\"", "\\\"" }, { "\\", "\\\\" }, })
+			.with(new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()))
+			.with(JavaUnicodeEscaper.outsideOf(32, 0x7f));
+
+	/**
+	 * Translator object for escaping EcmaScript/JavaScript.
+	 * 
+	 * While {@link #escapeEcmaScript(String)} is the expected method of use, this
+	 * object allows the EcmaScript escaping functionality to be used as the
+	 * foundation for a custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator ESCAPE_ECMASCRIPT = new AggregateTranslator(
+			new LookupTranslator(new String[][] { { "'", "\\'" }, { "\"", "\\\"" }, { "\\", "\\\\" }, { "/", "\\/" } }),
+			new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()), JavaUnicodeEscaper.outsideOf(32, 0x7f));
+
+	/**
+	 * Translator object for escaping Json.
+	 *
+	 * While {@link #escapeJson(String)} is the expected method of use, this object
+	 * allows the Json escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.2
+	 */
+	public static final CharSequenceTranslator ESCAPE_JSON = new AggregateTranslator(
+			new LookupTranslator(new String[][] { { "\"", "\\\"" }, { "\\", "\\\\" }, { "/", "\\/" } }),
+			new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_ESCAPE()), JavaUnicodeEscaper.outsideOf(32, 0x7f));
+
+	/**
+	 * Translator object for escaping XML.
+	 * 
+	 * While {@link #escapeXml(String)} is the expected method of use, this object
+	 * allows the XML escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.0
+	 * @deprecated use {@link #ESCAPE_XML10} or {@link #ESCAPE_XML11} instead.
+	 */
+	@Deprecated
+	public static final CharSequenceTranslator ESCAPE_XML = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.APOS_ESCAPE()));
+
+	/**
+	 * Translator object for escaping XML 1.0.
+	 * 
+	 * While {@link #escapeXml10(String)} is the expected method of use, this object
+	 * allows the XML escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.3
+	 */
+	public static final CharSequenceTranslator ESCAPE_XML10 = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.APOS_ESCAPE()),
+			new LookupTranslator(new String[][] { { "\u0000", "" }, { "\u0001", "" }, { "\u0002", "" },
+					{ "\u0003", "" }, { "\u0004", "" }, { "\u0005", "" }, { "\u0006", "" }, { "\u0007", "" },
+					{ "\u0008", "" }, { "\u000b", "" }, { "\u000c", "" }, { "\u000e", "" }, { "\u000f", "" },
+					{ "\u0010", "" }, { "\u0011", "" }, { "\u0012", "" }, { "\u0013", "" }, { "\u0014", "" },
+					{ "\u0015", "" }, { "\u0016", "" }, { "\u0017", "" }, { "\u0018", "" }, { "\u0019", "" },
+					{ "\u001a", "" }, { "\u001b", "" }, { "\u001c", "" }, { "\u001d", "" }, { "\u001e", "" },
+					{ "\u001f", "" }, { "\ufffe", "" }, { "\uffff", "" } }),
+			NumericEntityEscaper.between(0x7f, 0x84), NumericEntityEscaper.between(0x86, 0x9f),
+			new UnicodeUnpairedSurrogateRemover());
+
+	/**
+	 * Translator object for escaping XML 1.1.
+	 * 
+	 * While {@link #escapeXml11(String)} is the expected method of use, this object
+	 * allows the XML escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.3
+	 */
+	public static final CharSequenceTranslator ESCAPE_XML11 = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.APOS_ESCAPE()),
+			new LookupTranslator(new String[][] { { "\u0000", "" }, { "\u000b", "&#11;" }, { "\u000c", "&#12;" },
+					{ "\ufffe", "" }, { "\uffff", "" } }),
+			NumericEntityEscaper.between(0x1, 0x8), NumericEntityEscaper.between(0xe, 0x1f),
+			NumericEntityEscaper.between(0x7f, 0x84), NumericEntityEscaper.between(0x86, 0x9f),
+			new UnicodeUnpairedSurrogateRemover());
+
+	/**
+	 * Translator object for escaping HTML version 3.0.
+	 * 
+	 * While {@link #escapeHtml3(String)} is the expected method of use, this object
+	 * allows the HTML escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator ESCAPE_HTML3 = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE()));
+
+	/**
+	 * Translator object for escaping HTML version 4.0.
+	 * 
+	 * While {@link #escapeHtml4(String)} is the expected method of use, this object
+	 * allows the HTML escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator ESCAPE_HTML4 = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_ESCAPE()), new LookupTranslator(EntityArrays.ISO8859_1_ESCAPE()),
+			new LookupTranslator(EntityArrays.HTML40_EXTENDED_ESCAPE()));
+
+	/**
+	 * Translator object for escaping individual Comma Separated Values.
+	 * 
+	 * While {@link #escapeCsv(String)} is the expected method of use, this object
+	 * allows the CSV escaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator ESCAPE_CSV = new CsvEscaper();
+
+	// TODO: Create a parent class - 'SinglePassTranslator' ?
+	// It would handle the index checking + length returning,
+	// and could also have an optimization check method.
+	static class CsvEscaper extends CharSequenceTranslator {
+
+		private static final char CSV_DELIMITER = ',';
+		private static final char CSV_QUOTE = '"';
+		private static final String CSV_QUOTE_STR = String.valueOf(CSV_QUOTE);
+		private static final char[] CSV_SEARCH_CHARS = new char[] { CSV_DELIMITER, CSV_QUOTE, CharUtils.CR,
+				CharUtils.LF };
+
+		@Override
+		public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+
+			if (index != 0) {
+				throw new IllegalStateException("CsvEscaper should never reach the [1] index");
+			}
+
+			if (StringUtils.containsNone(input.toString(), CSV_SEARCH_CHARS)) {
+				out.write(input.toString());
+			} else {
+				out.write(CSV_QUOTE);
+				out.write(StringUtils.replace(input.toString(), CSV_QUOTE_STR, CSV_QUOTE_STR + CSV_QUOTE_STR));
+				out.write(CSV_QUOTE);
+			}
+			return Character.codePointCount(input, 0, input.length());
+		}
+	}
+
+	/* UNESCAPE TRANSLATORS */
+
+	/**
+	 * Translator object for unescaping escaped Java.
+	 * 
+	 * While {@link #unescapeJava(String)} is the expected method of use, this
+	 * object allows the Java unescaping functionality to be used as the foundation
+	 * for a custom translator.
+	 *
+	 * @since 3.0
+	 */
+	// TODO: throw "illegal character: \92" as an Exception if a \ on the end of the
+	// Java (as per the compiler)?
+	public static final CharSequenceTranslator UNESCAPE_JAVA = new AggregateTranslator(new OctalUnescaper(), // .between('\1',
+																												// '\377'),
+			new UnicodeUnescaper(), new LookupTranslator(EntityArrays.JAVA_CTRL_CHARS_UNESCAPE()),
+			new LookupTranslator(new String[][] { { "\\\\", "\\" }, { "\\\"", "\"" }, { "\\'", "'" }, { "\\", "" } }));
+
+	/**
+	 * Translator object for unescaping escaped EcmaScript.
+	 * 
+	 * While {@link #unescapeEcmaScript(String)} is the expected method of use, this
+	 * object allows the EcmaScript unescaping functionality to be used as the
+	 * foundation for a custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator UNESCAPE_ECMASCRIPT = UNESCAPE_JAVA;
+
+	/**
+	 * Translator object for unescaping escaped Json.
+	 *
+	 * While {@link #unescapeJson(String)} is the expected method of use, this
+	 * object allows the Json unescaping functionality to be used as the foundation
+	 * for a custom translator.
+	 *
+	 * @since 3.2
+	 */
+	public static final CharSequenceTranslator UNESCAPE_JSON = UNESCAPE_JAVA;
+
+	/**
+	 * Translator object for unescaping escaped HTML 3.0.
+	 * 
+	 * While {@link #unescapeHtml3(String)} is the expected method of use, this
+	 * object allows the HTML unescaping functionality to be used as the foundation
+	 * for a custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator UNESCAPE_HTML3 = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_UNESCAPE()),
+			new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE()), new NumericEntityUnescaper());
+
+	/**
+	 * Translator object for unescaping escaped HTML 4.0.
+	 * 
+	 * While {@link #unescapeHtml4(String)} is the expected method of use, this
+	 * object allows the HTML unescaping functionality to be used as the foundation
+	 * for a custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator UNESCAPE_HTML4 = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_UNESCAPE()),
+			new LookupTranslator(EntityArrays.ISO8859_1_UNESCAPE()),
+			new LookupTranslator(EntityArrays.HTML40_EXTENDED_UNESCAPE()), new NumericEntityUnescaper());
+
+	/**
+	 * Translator object for unescaping escaped XML.
+	 * 
+	 * While {@link #unescapeXml(String)} is the expected method of use, this object
+	 * allows the XML unescaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator UNESCAPE_XML = new AggregateTranslator(
+			new LookupTranslator(EntityArrays.BASIC_UNESCAPE()), new LookupTranslator(EntityArrays.APOS_UNESCAPE()),
+			new NumericEntityUnescaper());
+
+	/**
+	 * Translator object for unescaping escaped Comma Separated Value entries.
+	 * 
+	 * While {@link #unescapeCsv(String)} is the expected method of use, this object
+	 * allows the CSV unescaping functionality to be used as the foundation for a
+	 * custom translator.
+	 *
+	 * @since 3.0
+	 */
+	public static final CharSequenceTranslator UNESCAPE_CSV = new CsvUnescaper();
+
+	static class CsvUnescaper extends CharSequenceTranslator {
+
+		private static final char CSV_DELIMITER = ',';
+		private static final char CSV_QUOTE = '"';
+		private static final String CSV_QUOTE_STR = String.valueOf(CSV_QUOTE);
+		private static final char[] CSV_SEARCH_CHARS = new char[] { CSV_DELIMITER, CSV_QUOTE, CharUtils.CR,
+				CharUtils.LF };
+
+		@Override
+		public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+
+			if (index != 0) {
+				throw new IllegalStateException("CsvUnescaper should never reach the [1] index");
+			}
+
+			if (input.charAt(0) != CSV_QUOTE || input.charAt(input.length() - 1) != CSV_QUOTE) {
+				out.write(input.toString());
+				return Character.codePointCount(input, 0, input.length());
+			}
+
+			// strip quotes
+			final String quoteless = input.subSequence(1, input.length() - 1).toString();
+
+			if (StringUtils.containsAny(quoteless, CSV_SEARCH_CHARS)) {
+				// deal with escaped quotes; ie) ""
+				out.write(StringUtils.replace(quoteless, CSV_QUOTE_STR + CSV_QUOTE_STR, CSV_QUOTE_STR));
+			} else {
+				out.write(input.toString());
+			}
+			return Character.codePointCount(input, 0, input.length());
+		}
+	}
+
+	/* Helper functions */
+
+	/**
+	 * <p>
+	 * {@code StringEscapeUtils} instances should NOT be constructed in standard
+	 * programming.
+	 * </p>
+	 *
+	 * <p>
+	 * Instead, the class should be used as:
+	 * </p>
+	 * 
+	 * <pre>
+	 * StringEscapeUtils.escapeJava("foo");
+	 * </pre>
+	 *
+	 * <p>
+	 * This constructor is public to permit tools that require a JavaBean instance
+	 * to operate.
+	 * </p>
+	 */
+	public StringEscapeUtils() {
+		super();
+	}
+
+	// Java and JavaScript
+	// --------------------------------------------------------------------------
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using Java String rules.
+	 * </p>
+	 *
+	 * <p>
+	 * Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.)
+	 * </p>
+	 *
+	 * <p>
+	 * So a tab becomes the characters {@code '\\'} and {@code 't'}.
+	 * </p>
+	 *
+	 * <p>
+	 * The only difference between Java strings and JavaScript strings is that in
+	 * JavaScript, a single quote and forward-slash (/) are escaped.
+	 * </p>
+	 *
+	 * <p>
+	 * Example:
+	 * </p>
+	 * 
+	 * <pre>
+	 * input string: He didn't say, "Stop!"
+	 * output string: He didn't say, \"Stop!\"
+	 * </pre>
+	 *
+	 * @param input String to escape values in, may be null
+	 * @return String with escaped values, {@code null} if null string input
+	 */
+	public static final String escapeJava(final String input) {
+		return ESCAPE_JAVA.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using EcmaScript String rules.
+	 * </p>
+	 * <p>
+	 * Escapes any values it finds into their EcmaScript String form. Deals
+	 * correctly with quotes and control-chars (tab, backslash, cr, ff, etc.)
+	 * </p>
+	 *
+	 * <p>
+	 * So a tab becomes the characters {@code '\\'} and {@code 't'}.
+	 * </p>
+	 *
+	 * <p>
+	 * The only difference between Java strings and EcmaScript strings is that in
+	 * EcmaScript, a single quote and forward-slash (/) are escaped.
+	 * </p>
+	 *
+	 * <p>
+	 * Note that EcmaScript is best known by the JavaScript and ActionScript
+	 * dialects.
+	 * </p>
+	 *
+	 * <p>
+	 * Example:
+	 * </p>
+	 * 
+	 * <pre>
+	 * input string: He didn't say, "Stop!"
+	 * output string: He didn\'t say, \"Stop!\"
+	 * </pre>
+	 *
+	 * @param input String to escape values in, may be null
+	 * @return String with escaped values, {@code null} if null string input
+	 *
+	 * @since 3.0
+	 */
+	public static final String escapeEcmaScript(final String input) {
+		return ESCAPE_ECMASCRIPT.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using Json String rules.
+	 * </p>
+	 * <p>
+	 * Escapes any values it finds into their Json String form. Deals correctly with
+	 * quotes and control-chars (tab, backslash, cr, ff, etc.)
+	 * </p>
+	 *
+	 * <p>
+	 * So a tab becomes the characters {@code '\\'} and {@code 't'}.
+	 * </p>
+	 *
+	 * <p>
+	 * The only difference between Java strings and Json strings is that in Json,
+	 * forward-slash (/) is escaped.
+	 * </p>
+	 *
+	 * <p>
+	 * See http://www.ietf.org/rfc/rfc4627.txt for further details.
+	 * </p>
+	 *
+	 * <p>
+	 * Example:
+	 * </p>
+	 * 
+	 * <pre>
+	 * input string: He didn't say, "Stop!"
+	 * output string: He didn't say, \"Stop!\"
+	 * </pre>
+	 *
+	 * @param input String to escape values in, may be null
+	 * @return String with escaped values, {@code null} if null string input
+	 *
+	 * @since 3.2
+	 */
+	public static final String escapeJson(final String input) {
+		return ESCAPE_JSON.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Unescapes any Java literals found in the {@code String}. For example, it will
+	 * turn a sequence of {@code '\'} and {@code 'n'} into a newline character,
+	 * unless the {@code '\'} is preceded by another {@code '\'}.
+	 * </p>
+	 * 
+	 * @param input the {@code String} to unescape, may be null
+	 * @return a new unescaped {@code String}, {@code null} if null string input
+	 */
+	public static final String unescapeJava(final String input) {
+		return UNESCAPE_JAVA.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Unescapes any EcmaScript literals found in the {@code String}.
+	 * </p>
+	 *
+	 * <p>
+	 * For example, it will turn a sequence of {@code '\'} and {@code 'n'} into a
+	 * newline character, unless the {@code '\'} is preceded by another {@code '\'}.
+	 * </p>
+	 *
+	 * @see #unescapeJava(String)
+	 * @param input the {@code String} to unescape, may be null
+	 * @return A new unescaped {@code String}, {@code null} if null string input
+	 *
+	 * @since 3.0
+	 */
+	public static final String unescapeEcmaScript(final String input) {
+		return UNESCAPE_ECMASCRIPT.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Unescapes any Json literals found in the {@code String}.
+	 * </p>
+	 *
+	 * <p>
+	 * For example, it will turn a sequence of {@code '\'} and {@code 'n'} into a
+	 * newline character, unless the {@code '\'} is preceded by another {@code '\'}.
+	 * </p>
+	 *
+	 * @see #unescapeJava(String)
+	 * @param input the {@code String} to unescape, may be null
+	 * @return A new unescaped {@code String}, {@code null} if null string input
+	 *
+	 * @since 3.2
+	 */
+	public static final String unescapeJson(final String input) {
+		return UNESCAPE_JSON.translate(input);
+	}
+
+	// HTML and XML
+	// --------------------------------------------------------------------------
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using HTML entities.
+	 * </p>
+	 *
+	 * <p>
+	 * For example:
+	 * </p>
+	 * <p>
+	 * <code>"bread" &amp; "butter"</code>
+	 * </p>
+	 * becomes:
+	 * <p>
+	 * <code>&amp;quot;bread&amp;quot; &amp;amp; &amp;quot;butter&amp;quot;</code>.
+	 * </p>
+	 *
+	 * <p>
+	 * Supports all known HTML 4.0 entities, including funky accents. Note that the
+	 * commonly used apostrophe escape character (&amp;apos;) is not a legal entity
+	 * and so is not supported).
+	 * </p>
+	 *
+	 * @param input the {@code String} to escape, may be null
+	 * @return a new escaped {@code String}, {@code null} if null string input
+	 * 
+	 * @see <a href=
+	 *      "http://hotwired.lycos.com/webmonkey/reference/special_characters/">ISO
+	 *      Entities</a>
+	 * @see <a href="http://www.w3.org/TR/REC-html32#latin1">HTML 3.2 Character
+	 *      Entities for ISO Latin-1</a>
+	 * @see <a href="http://www.w3.org/TR/REC-html40/sgml/entities.html">HTML 4.0
+	 *      Character entity references</a>
+	 * @see <a href="http://www.w3.org/TR/html401/charset.html#h-5.3">HTML 4.01
+	 *      Character References</a>
+	 * @see <a href="http://www.w3.org/TR/html401/charset.html#code-position">HTML
+	 *      4.01 Code positions</a>
+	 * 
+	 * @since 3.0
+	 */
+	public static final String escapeHtml4(final String input) {
+		return ESCAPE_HTML4.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using HTML entities.
+	 * </p>
+	 * <p>
+	 * Supports only the HTML 3.0 entities.
+	 * </p>
+	 *
+	 * @param input the {@code String} to escape, may be null
+	 * @return a new escaped {@code String}, {@code null} if null string input
+	 * 
+	 * @since 3.0
+	 */
+	public static final String escapeHtml3(final String input) {
+		return ESCAPE_HTML3.translate(input);
+	}
+
+	// -----------------------------------------------------------------------
+	/**
+	 * <p>
+	 * Unescapes a string containing entity escapes to a string containing the
+	 * actual Unicode characters corresponding to the escapes. Supports HTML 4.0
+	 * entities.
+	 * </p>
+	 *
+	 * <p>
+	 * For example, the string "&amp;lt;Fran&amp;ccedil;ais&amp;gt;" will become
+	 * "&lt;Fran&ccedil;ais&gt;"
+	 * </p>
+	 *
+	 * <p>
+	 * If an entity is unrecognized, it is left alone, and inserted verbatim into
+	 * the result string. e.g. "&amp;gt;&amp;zzzz;x" will become "&gt;&amp;zzzz;x".
+	 * </p>
+	 *
+	 * @param input the {@code String} to unescape, may be null
+	 * @return a new unescaped {@code String}, {@code null} if null string input
+	 * 
+	 * @since 3.0
+	 */
+	public static final String unescapeHtml4(final String input) {
+		return UNESCAPE_HTML4.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Unescapes a string containing entity escapes to a string containing the
+	 * actual Unicode characters corresponding to the escapes. Supports only HTML
+	 * 3.0 entities.
+	 * </p>
+	 *
+	 * @param input the {@code String} to unescape, may be null
+	 * @return a new unescaped {@code String}, {@code null} if null string input
+	 * 
+	 * @since 3.0
+	 */
+	public static final String unescapeHtml3(final String input) {
+		return UNESCAPE_HTML3.translate(input);
+	}
+
+	// -----------------------------------------------------------------------
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using XML entities.
+	 * </p>
+	 *
+	 * <p>
+	 * For example: <tt>"bread" &amp; "butter"</tt> =&gt;
+	 * <tt>&amp;quot;bread&amp;quot; &amp;amp; &amp;quot;butter&amp;quot;</tt>.
+	 * </p>
+	 *
+	 * <p>
+	 * Supports only the five basic XML entities (gt, lt, quot, amp, apos). Does not
+	 * support DTDs or external entities.
+	 * </p>
+	 *
+	 * <p>
+	 * Note that Unicode characters greater than 0x7f are as of 3.0, no longer
+	 * escaped. If you still wish this functionality, you can achieve it via the
+	 * following:
+	 * {@code StringEscapeUtils.ESCAPE_XML.with( NumericEntityEscaper.between(0x7f, Integer.MAX_VALUE) );}
+	 * </p>
+	 *
+	 * @param input the {@code String} to escape, may be null
+	 * @return a new escaped {@code String}, {@code null} if null string input
+	 * @see #unescapeXml(java.lang.String)
+	 * @deprecated use {@link #escapeXml10(java.lang.String)} or
+	 *             {@link #escapeXml11(java.lang.String)} instead.
+	 */
+	@Deprecated
+	public static final String escapeXml(final String input) {
+		return ESCAPE_XML.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using XML entities.
+	 * </p>
+	 *
+	 * <p>
+	 * For example: <tt>"bread" &amp; "butter"</tt> =&gt;
+	 * <tt>&amp;quot;bread&amp;quot; &amp;amp; &amp;quot;butter&amp;quot;</tt>.
+	 * </p>
+	 *
+	 * <p>
+	 * Note that XML 1.0 is a text-only format: it cannot represent control
+	 * characters or unpaired Unicode surrogate codepoints, even after escaping.
+	 * {@code escapeXml10} will remove characters that do not fit in the following
+	 * ranges:
+	 * </p>
+	 * 
+	 * <p>
+	 * {@code #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]}
+	 * </p>
+	 * 
+	 * <p>
+	 * Though not strictly necessary, {@code escapeXml10} will escape characters in
+	 * the following ranges:
+	 * </p>
+	 * 
+	 * <p>
+	 * {@code [#x7F-#x84] | [#x86-#x9F]}
+	 * </p>
+	 * 
+	 * <p>
+	 * The returned string can be inserted into a valid XML 1.0 or XML 1.1 document.
+	 * If you want to allow more non-text characters in an XML 1.1 document, use
+	 * {@link #escapeXml11(String)}.
+	 * </p>
+	 *
+	 * @param input the {@code String} to escape, may be null
+	 * @return a new escaped {@code String}, {@code null} if null string input
+	 * @see #unescapeXml(java.lang.String)
+	 * @since 3.3
+	 */
+	public static String escapeXml10(final String input) {
+		return ESCAPE_XML10.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Escapes the characters in a {@code String} using XML entities.
+	 * </p>
+	 *
+	 * <p>
+	 * For example: <tt>"bread" &amp; "butter"</tt> =&gt;
+	 * <tt>&amp;quot;bread&amp;quot; &amp;amp; &amp;quot;butter&amp;quot;</tt>.
+	 * </p>
+	 *
+	 * <p>
+	 * XML 1.1 can represent certain control characters, but it cannot represent the
+	 * null byte or unpaired Unicode surrogate codepoints, even after escaping.
+	 * {@code escapeXml11} will remove characters that do not fit in the following
+	 * ranges:
+	 * </p>
+	 * 
+	 * <p>
+	 * {@code [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]}
+	 * </p>
+	 * 
+	 * <p>
+	 * {@code escapeXml11} will escape characters in the following ranges:
+	 * </p>
+	 * 
+	 * <p>
+	 * {@code [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]}
+	 * </p>
+	 * 
+	 * <p>
+	 * The returned string can be inserted into a valid XML 1.1 document. Do not use
+	 * it for XML 1.0 documents.
+	 * </p>
+	 *
+	 * @param input the {@code String} to escape, may be null
+	 * @return a new escaped {@code String}, {@code null} if null string input
+	 * @see #unescapeXml(java.lang.String)
+	 * @since 3.3
+	 */
+	public static String escapeXml11(final String input) {
+		return ESCAPE_XML11.translate(input);
+	}
+
+	// -----------------------------------------------------------------------
+	/**
+	 * <p>
+	 * Unescapes a string containing XML entity escapes to a string containing the
+	 * actual Unicode characters corresponding to the escapes.
+	 * </p>
+	 *
+	 * <p>
+	 * Supports only the five basic XML entities (gt, lt, quot, amp, apos). Does not
+	 * support DTDs or external entities.
+	 * </p>
+	 *
+	 * <p>
+	 * Note that numerical \\u Unicode codes are unescaped to their respective
+	 * Unicode characters. This may change in future releases.
+	 * </p>
+	 *
+	 * @param input the {@code String} to unescape, may be null
+	 * @return a new unescaped {@code String}, {@code null} if null string input
+	 * @see #escapeXml(String)
+	 * @see #escapeXml10(String)
+	 * @see #escapeXml11(String)
+	 */
+	public static final String unescapeXml(final String input) {
+		return UNESCAPE_XML.translate(input);
+	}
+
+	// -----------------------------------------------------------------------
+
+	/**
+	 * <p>
+	 * Returns a {@code String} value for a CSV column enclosed in double quotes, if
+	 * required.
+	 * </p>
+	 *
+	 * <p>
+	 * If the value contains a comma, newline or double quote, then the String value
+	 * is returned enclosed in double quotes.
+	 * </p>
+	 *
+	 * <p>
+	 * Any double quote characters in the value are escaped with another double
+	 * quote.
+	 * </p>
+	 *
+	 * <p>
+	 * If the value does not contain a comma, newline or double quote, then the
+	 * String value is returned unchanged.
+	 * </p>
+	 *
+	 * see
+	 * <a href="http://en.wikipedia.org/wiki/Comma-separated_values">Wikipedia</a>
+	 * and <a href="http://tools.ietf.org/html/rfc4180">RFC 4180</a>.
+	 *
+	 * @param input the input CSV column String, may be null
+	 * @return the input String, enclosed in double quotes if the value contains a
+	 *         comma, newline or double quote, {@code null} if null string input
+	 * @since 2.4
+	 */
+	public static final String escapeCsv(final String input) {
+		return ESCAPE_CSV.translate(input);
+	}
+
+	/**
+	 * <p>
+	 * Returns a {@code String} value for an unescaped CSV column.
+	 * </p>
+	 *
+	 * <p>
+	 * If the value is enclosed in double quotes, and contains a comma, newline or
+	 * double quote, then quotes are removed.
+	 * </p>
+	 *
+	 * <p>
+	 * Any double quote escaped characters (a pair of double quotes) are unescaped
+	 * to just one double quote.
+	 * </p>
+	 *
+	 * <p>
+	 * If the value is not enclosed in double quotes, or is and does not contain a
+	 * comma, newline or double quote, then the String value is returned unchanged.
+	 * </p>
+	 *
+	 * see
+	 * <a href="http://en.wikipedia.org/wiki/Comma-separated_values">Wikipedia</a>
+	 * and <a href="http://tools.ietf.org/html/rfc4180">RFC 4180</a>.
+	 *
+	 * @param input the input CSV column String, may be null
+	 * @return the input String, with enclosing double quotes removed and embedded
+	 *         double quotes unescaped, {@code null} if null string input
+	 * @since 2.4
+	 */
+	public static final String unescapeCsv(final String input) {
+		return UNESCAPE_CSV.translate(input);
+	}
+
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/AggregateTranslator.java b/sources/main/java/org/apache/commons/lang3/text/translate/AggregateTranslator.java
new file mode 100644
index 00000000..829a01f2
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/AggregateTranslator.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Executes a sequence of translators one after the other. Execution ends
+ * whenever the first translator consumes codepoints from the input.
+ * 
+ * @since 3.0
+ * @version $Id: AggregateTranslator.java 1436770 2013-01-22 07:09:45Z ggregory
+ *          $
+ */
+public class AggregateTranslator extends CharSequenceTranslator {
+
+	private final CharSequenceTranslator[] translators;
+
+	/**
+	 * Specify the translators to be used at creation time.
+	 *
+	 * @param translators CharSequenceTranslator array to aggregate
+	 */
+	public AggregateTranslator(final CharSequenceTranslator... translators) {
+		this.translators = new CharSequenceTranslator[translators.length];
+		System.arraycopy(translators, 0, this.translators, 0, translators.length);
+	}
+
+	/**
+	 * The first translator to consume codepoints from the input is the 'winner'.
+	 * Execution stops with the number of consumed codepoints being returned.
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+		for (final CharSequenceTranslator translator : translators) {
+			final int consumed = translator.translate(input, index, out);
+			if (consumed != 0) {
+				return consumed;
+			}
+		}
+		return 0;
+	}
+
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java b/sources/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java
new file mode 100644
index 00000000..cec33dc6
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/CharSequenceTranslator.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Locale;
+
+/**
+ * An API for translating text. Its core use is to escape and unescape text.
+ * Because escaping and unescaping is completely contextual, the API does not
+ * present two separate signatures.
+ * 
+ * @since 3.0
+ * @version $Id: CharSequenceTranslator.java 1568612 2014-02-15 10:35:35Z
+ *          britter $
+ */
+public abstract class CharSequenceTranslator {
+
+	/**
+	 * Translate a set of codepoints, represented by an int index into a
+	 * CharSequence, into another set of codepoints. The number of codepoints
+	 * consumed must be returned, and the only IOExceptions thrown must be from
+	 * interacting with the Writer so that the top level API may reliably ignore
+	 * StringWriter IOExceptions.
+	 *
+	 * @param input CharSequence that is being translated
+	 * @param index int representing the current point of translation
+	 * @param out   Writer to translate the text to
+	 * @return int count of codepoints consumed
+	 * @throws IOException if and only if the Writer produces an IOException
+	 */
+	public abstract int translate(CharSequence input, int index, Writer out) throws IOException;
+
+	/**
+	 * Helper for non-Writer usage.
+	 * 
+	 * @param input CharSequence to be translated
+	 * @return String output of translation
+	 */
+	public final String translate(final CharSequence input) {
+		if (input == null) {
+			return null;
+		}
+		try {
+			final StringWriter writer = new StringWriter(input.length() * 2);
+			translate(input, writer);
+			return writer.toString();
+		} catch (final IOException ioe) {
+			// this should never ever happen while writing to a StringWriter
+			throw new RuntimeException(ioe);
+		}
+	}
+
+	/**
+	 * Translate an input onto a Writer. This is intentionally final as its
+	 * algorithm is tightly coupled with the abstract method of this class.
+	 *
+	 * @param input CharSequence that is being translated
+	 * @param out   Writer to translate the text to
+	 * @throws IOException if and only if the Writer produces an IOException
+	 */
+	public final void translate(final CharSequence input, final Writer out) throws IOException {
+		if (out == null) {
+			throw new IllegalArgumentException("The Writer must not be null");
+		}
+		if (input == null) {
+			return;
+		}
+		int pos = 0;
+		final int len = input.length();
+		while (pos < len) {
+			final int consumed = translate(input, pos, out);
+			if (consumed == 0) {
+				final char[] c = Character.toChars(Character.codePointAt(input, pos));
+				out.write(c);
+				pos += c.length;
+				continue;
+			}
+			// contract with translators is that they have to understand codepoints
+			// and they just took care of a surrogate pair
+			for (int pt = 0; pt < consumed; pt++) {
+				pos += Character.charCount(Character.codePointAt(input, pos));
+			}
+		}
+	}
+
+	/**
+	 * Helper method to create a merger of this translator with another set of
+	 * translators. Useful in customizing the standard functionality.
+	 *
+	 * @param translators CharSequenceTranslator array of translators to merge with
+	 *                    this one
+	 * @return CharSequenceTranslator merging this translator with the others
+	 */
+	public final CharSequenceTranslator with(final CharSequenceTranslator... translators) {
+		final CharSequenceTranslator[] newArray = new CharSequenceTranslator[translators.length + 1];
+		newArray[0] = this;
+		System.arraycopy(translators, 0, newArray, 1, translators.length);
+		return new AggregateTranslator(newArray);
+	}
+
+	/**
+	 * <p>
+	 * Returns an upper case hexadecimal <code>String</code> for the given
+	 * character.
+	 * </p>
+	 *
+	 * @param codepoint The codepoint to convert.
+	 * @return An upper case hexadecimal <code>String</code>
+	 */
+	public static String hex(final int codepoint) {
+		return Integer.toHexString(codepoint).toUpperCase(Locale.ENGLISH);
+	}
+
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/CodePointTranslator.java b/sources/main/java/org/apache/commons/lang3/text/translate/CodePointTranslator.java
new file mode 100644
index 00000000..a9567293
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/CodePointTranslator.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Helper subclass to CharSequenceTranslator to allow for translations that will
+ * replace up to one character at a time.
+ * 
+ * @since 3.0
+ * @version $Id: CodePointTranslator.java 1553931 2013-12-28 21:24:44Z ggregory
+ *          $
+ */
+public abstract class CodePointTranslator extends CharSequenceTranslator {
+
+	/**
+	 * Implementation of translate that maps onto the abstract translate(int,
+	 * Writer) method. {@inheritDoc}
+	 */
+	@Override
+	public final int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+		final int codepoint = Character.codePointAt(input, index);
+		final boolean consumed = translate(codepoint, out);
+		return consumed ? 1 : 0;
+	}
+
+	/**
+	 * Translate the specified codepoint into another.
+	 * 
+	 * @param codepoint int character input to translate
+	 * @param out       Writer to optionally push the translated output to
+	 * @return boolean as to whether translation occurred or not
+	 * @throws IOException if and only if the Writer produces an IOException
+	 */
+	public abstract boolean translate(int codepoint, Writer out) throws IOException;
+
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/EntityArrays.java b/sources/main/java/org/apache/commons/lang3/text/translate/EntityArrays.java
new file mode 100644
index 00000000..20626cea
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/EntityArrays.java
@@ -0,0 +1,461 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+/**
+ * Class holding various entity data for HTML and XML - generally for use with
+ * the LookupTranslator. All arrays are of length [*][2].
+ *
+ * @since 3.0
+ * @version $Id: EntityArrays.java 1436770 2013-01-22 07:09:45Z ggregory $
+ */
+public class EntityArrays {
+
+	/**
+	 * Mapping to escape <a href=
+	 * "https://secure.wikimedia.org/wikipedia/en/wiki/ISO/IEC_8859-1">ISO-8859-1</a>
+	 * characters to their named HTML 3.x equivalents.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] ISO8859_1_ESCAPE() {
+		return ISO8859_1_ESCAPE.clone();
+	}
+
+	private static final String[][] ISO8859_1_ESCAPE = { { "\u00A0", "&nbsp;" }, // non-breaking space
+			{ "\u00A1", "&iexcl;" }, // inverted exclamation mark
+			{ "\u00A2", "&cent;" }, // cent sign
+			{ "\u00A3", "&pound;" }, // pound sign
+			{ "\u00A4", "&curren;" }, // currency sign
+			{ "\u00A5", "&yen;" }, // yen sign = yuan sign
+			{ "\u00A6", "&brvbar;" }, // broken bar = broken vertical bar
+			{ "\u00A7", "&sect;" }, // section sign
+			{ "\u00A8", "&uml;" }, // diaeresis = spacing diaeresis
+			{ "\u00A9", "&copy;" }, // � - copyright sign
+			{ "\u00AA", "&ordf;" }, // feminine ordinal indicator
+			{ "\u00AB", "&laquo;" }, // left-pointing double angle quotation mark = left pointing guillemet
+			{ "\u00AC", "&not;" }, // not sign
+			{ "\u00AD", "&shy;" }, // soft hyphen = discretionary hyphen
+			{ "\u00AE", "&reg;" }, // � - registered trademark sign
+			{ "\u00AF", "&macr;" }, // macron = spacing macron = overline = APL overbar
+			{ "\u00B0", "&deg;" }, // degree sign
+			{ "\u00B1", "&plusmn;" }, // plus-minus sign = plus-or-minus sign
+			{ "\u00B2", "&sup2;" }, // superscript two = superscript digit two = squared
+			{ "\u00B3", "&sup3;" }, // superscript three = superscript digit three = cubed
+			{ "\u00B4", "&acute;" }, // acute accent = spacing acute
+			{ "\u00B5", "&micro;" }, // micro sign
+			{ "\u00B6", "&para;" }, // pilcrow sign = paragraph sign
+			{ "\u00B7", "&middot;" }, // middle dot = Georgian comma = Greek middle dot
+			{ "\u00B8", "&cedil;" }, // cedilla = spacing cedilla
+			{ "\u00B9", "&sup1;" }, // superscript one = superscript digit one
+			{ "\u00BA", "&ordm;" }, // masculine ordinal indicator
+			{ "\u00BB", "&raquo;" }, // right-pointing double angle quotation mark = right pointing guillemet
+			{ "\u00BC", "&frac14;" }, // vulgar fraction one quarter = fraction one quarter
+			{ "\u00BD", "&frac12;" }, // vulgar fraction one half = fraction one half
+			{ "\u00BE", "&frac34;" }, // vulgar fraction three quarters = fraction three quarters
+			{ "\u00BF", "&iquest;" }, // inverted question mark = turned question mark
+			{ "\u00C0", "&Agrave;" }, // � - uppercase A, grave accent
+			{ "\u00C1", "&Aacute;" }, // � - uppercase A, acute accent
+			{ "\u00C2", "&Acirc;" }, // � - uppercase A, circumflex accent
+			{ "\u00C3", "&Atilde;" }, // � - uppercase A, tilde
+			{ "\u00C4", "&Auml;" }, // � - uppercase A, umlaut
+			{ "\u00C5", "&Aring;" }, // � - uppercase A, ring
+			{ "\u00C6", "&AElig;" }, // � - uppercase AE
+			{ "\u00C7", "&Ccedil;" }, // � - uppercase C, cedilla
+			{ "\u00C8", "&Egrave;" }, // � - uppercase E, grave accent
+			{ "\u00C9", "&Eacute;" }, // � - uppercase E, acute accent
+			{ "\u00CA", "&Ecirc;" }, // � - uppercase E, circumflex accent
+			{ "\u00CB", "&Euml;" }, // � - uppercase E, umlaut
+			{ "\u00CC", "&Igrave;" }, // � - uppercase I, grave accent
+			{ "\u00CD", "&Iacute;" }, // � - uppercase I, acute accent
+			{ "\u00CE", "&Icirc;" }, // � - uppercase I, circumflex accent
+			{ "\u00CF", "&Iuml;" }, // � - uppercase I, umlaut
+			{ "\u00D0", "&ETH;" }, // � - uppercase Eth, Icelandic
+			{ "\u00D1", "&Ntilde;" }, // � - uppercase N, tilde
+			{ "\u00D2", "&Ograve;" }, // � - uppercase O, grave accent
+			{ "\u00D3", "&Oacute;" }, // � - uppercase O, acute accent
+			{ "\u00D4", "&Ocirc;" }, // � - uppercase O, circumflex accent
+			{ "\u00D5", "&Otilde;" }, // � - uppercase O, tilde
+			{ "\u00D6", "&Ouml;" }, // � - uppercase O, umlaut
+			{ "\u00D7", "&times;" }, // multiplication sign
+			{ "\u00D8", "&Oslash;" }, // � - uppercase O, slash
+			{ "\u00D9", "&Ugrave;" }, // � - uppercase U, grave accent
+			{ "\u00DA", "&Uacute;" }, // � - uppercase U, acute accent
+			{ "\u00DB", "&Ucirc;" }, // � - uppercase U, circumflex accent
+			{ "\u00DC", "&Uuml;" }, // � - uppercase U, umlaut
+			{ "\u00DD", "&Yacute;" }, // � - uppercase Y, acute accent
+			{ "\u00DE", "&THORN;" }, // � - uppercase THORN, Icelandic
+			{ "\u00DF", "&szlig;" }, // � - lowercase sharps, German
+			{ "\u00E0", "&agrave;" }, // � - lowercase a, grave accent
+			{ "\u00E1", "&aacute;" }, // � - lowercase a, acute accent
+			{ "\u00E2", "&acirc;" }, // � - lowercase a, circumflex accent
+			{ "\u00E3", "&atilde;" }, // � - lowercase a, tilde
+			{ "\u00E4", "&auml;" }, // � - lowercase a, umlaut
+			{ "\u00E5", "&aring;" }, // � - lowercase a, ring
+			{ "\u00E6", "&aelig;" }, // � - lowercase ae
+			{ "\u00E7", "&ccedil;" }, // � - lowercase c, cedilla
+			{ "\u00E8", "&egrave;" }, // � - lowercase e, grave accent
+			{ "\u00E9", "&eacute;" }, // � - lowercase e, acute accent
+			{ "\u00EA", "&ecirc;" }, // � - lowercase e, circumflex accent
+			{ "\u00EB", "&euml;" }, // � - lowercase e, umlaut
+			{ "\u00EC", "&igrave;" }, // � - lowercase i, grave accent
+			{ "\u00ED", "&iacute;" }, // � - lowercase i, acute accent
+			{ "\u00EE", "&icirc;" }, // � - lowercase i, circumflex accent
+			{ "\u00EF", "&iuml;" }, // � - lowercase i, umlaut
+			{ "\u00F0", "&eth;" }, // � - lowercase eth, Icelandic
+			{ "\u00F1", "&ntilde;" }, // � - lowercase n, tilde
+			{ "\u00F2", "&ograve;" }, // � - lowercase o, grave accent
+			{ "\u00F3", "&oacute;" }, // � - lowercase o, acute accent
+			{ "\u00F4", "&ocirc;" }, // � - lowercase o, circumflex accent
+			{ "\u00F5", "&otilde;" }, // � - lowercase o, tilde
+			{ "\u00F6", "&ouml;" }, // � - lowercase o, umlaut
+			{ "\u00F7", "&divide;" }, // division sign
+			{ "\u00F8", "&oslash;" }, // � - lowercase o, slash
+			{ "\u00F9", "&ugrave;" }, // � - lowercase u, grave accent
+			{ "\u00FA", "&uacute;" }, // � - lowercase u, acute accent
+			{ "\u00FB", "&ucirc;" }, // � - lowercase u, circumflex accent
+			{ "\u00FC", "&uuml;" }, // � - lowercase u, umlaut
+			{ "\u00FD", "&yacute;" }, // � - lowercase y, acute accent
+			{ "\u00FE", "&thorn;" }, // � - lowercase thorn, Icelandic
+			{ "\u00FF", "&yuml;" }, // � - lowercase y, umlaut
+	};
+
+	/**
+	 * Reverse of {@link #ISO8859_1_ESCAPE()} for unescaping purposes.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] ISO8859_1_UNESCAPE() {
+		return ISO8859_1_UNESCAPE.clone();
+	}
+
+	private static final String[][] ISO8859_1_UNESCAPE = invert(ISO8859_1_ESCAPE);
+
+	/**
+	 * Mapping to escape additional
+	 * <a href="http://www.w3.org/TR/REC-html40/sgml/entities.html">character entity
+	 * references</a>. Note that this must be used with {@link #ISO8859_1_ESCAPE()}
+	 * to get the full list of HTML 4.0 character entities.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] HTML40_EXTENDED_ESCAPE() {
+		return HTML40_EXTENDED_ESCAPE.clone();
+	}
+
+	private static final String[][] HTML40_EXTENDED_ESCAPE = {
+			// <!-- Latin Extended-B -->
+			{ "\u0192", "&fnof;" }, // latin small f with hook = function= florin, U+0192 ISOtech -->
+			// <!-- Greek -->
+			{ "\u0391", "&Alpha;" }, // greek capital letter alpha, U+0391 -->
+			{ "\u0392", "&Beta;" }, // greek capital letter beta, U+0392 -->
+			{ "\u0393", "&Gamma;" }, // greek capital letter gamma,U+0393 ISOgrk3 -->
+			{ "\u0394", "&Delta;" }, // greek capital letter delta,U+0394 ISOgrk3 -->
+			{ "\u0395", "&Epsilon;" }, // greek capital letter epsilon, U+0395 -->
+			{ "\u0396", "&Zeta;" }, // greek capital letter zeta, U+0396 -->
+			{ "\u0397", "&Eta;" }, // greek capital letter eta, U+0397 -->
+			{ "\u0398", "&Theta;" }, // greek capital letter theta,U+0398 ISOgrk3 -->
+			{ "\u0399", "&Iota;" }, // greek capital letter iota, U+0399 -->
+			{ "\u039A", "&Kappa;" }, // greek capital letter kappa, U+039A -->
+			{ "\u039B", "&Lambda;" }, // greek capital letter lambda,U+039B ISOgrk3 -->
+			{ "\u039C", "&Mu;" }, // greek capital letter mu, U+039C -->
+			{ "\u039D", "&Nu;" }, // greek capital letter nu, U+039D -->
+			{ "\u039E", "&Xi;" }, // greek capital letter xi, U+039E ISOgrk3 -->
+			{ "\u039F", "&Omicron;" }, // greek capital letter omicron, U+039F -->
+			{ "\u03A0", "&Pi;" }, // greek capital letter pi, U+03A0 ISOgrk3 -->
+			{ "\u03A1", "&Rho;" }, // greek capital letter rho, U+03A1 -->
+			// <!-- there is no Sigmaf, and no U+03A2 character either -->
+			{ "\u03A3", "&Sigma;" }, // greek capital letter sigma,U+03A3 ISOgrk3 -->
+			{ "\u03A4", "&Tau;" }, // greek capital letter tau, U+03A4 -->
+			{ "\u03A5", "&Upsilon;" }, // greek capital letter upsilon,U+03A5 ISOgrk3 -->
+			{ "\u03A6", "&Phi;" }, // greek capital letter phi,U+03A6 ISOgrk3 -->
+			{ "\u03A7", "&Chi;" }, // greek capital letter chi, U+03A7 -->
+			{ "\u03A8", "&Psi;" }, // greek capital letter psi,U+03A8 ISOgrk3 -->
+			{ "\u03A9", "&Omega;" }, // greek capital letter omega,U+03A9 ISOgrk3 -->
+			{ "\u03B1", "&alpha;" }, // greek small letter alpha,U+03B1 ISOgrk3 -->
+			{ "\u03B2", "&beta;" }, // greek small letter beta, U+03B2 ISOgrk3 -->
+			{ "\u03B3", "&gamma;" }, // greek small letter gamma,U+03B3 ISOgrk3 -->
+			{ "\u03B4", "&delta;" }, // greek small letter delta,U+03B4 ISOgrk3 -->
+			{ "\u03B5", "&epsilon;" }, // greek small letter epsilon,U+03B5 ISOgrk3 -->
+			{ "\u03B6", "&zeta;" }, // greek small letter zeta, U+03B6 ISOgrk3 -->
+			{ "\u03B7", "&eta;" }, // greek small letter eta, U+03B7 ISOgrk3 -->
+			{ "\u03B8", "&theta;" }, // greek small letter theta,U+03B8 ISOgrk3 -->
+			{ "\u03B9", "&iota;" }, // greek small letter iota, U+03B9 ISOgrk3 -->
+			{ "\u03BA", "&kappa;" }, // greek small letter kappa,U+03BA ISOgrk3 -->
+			{ "\u03BB", "&lambda;" }, // greek small letter lambda,U+03BB ISOgrk3 -->
+			{ "\u03BC", "&mu;" }, // greek small letter mu, U+03BC ISOgrk3 -->
+			{ "\u03BD", "&nu;" }, // greek small letter nu, U+03BD ISOgrk3 -->
+			{ "\u03BE", "&xi;" }, // greek small letter xi, U+03BE ISOgrk3 -->
+			{ "\u03BF", "&omicron;" }, // greek small letter omicron, U+03BF NEW -->
+			{ "\u03C0", "&pi;" }, // greek small letter pi, U+03C0 ISOgrk3 -->
+			{ "\u03C1", "&rho;" }, // greek small letter rho, U+03C1 ISOgrk3 -->
+			{ "\u03C2", "&sigmaf;" }, // greek small letter final sigma,U+03C2 ISOgrk3 -->
+			{ "\u03C3", "&sigma;" }, // greek small letter sigma,U+03C3 ISOgrk3 -->
+			{ "\u03C4", "&tau;" }, // greek small letter tau, U+03C4 ISOgrk3 -->
+			{ "\u03C5", "&upsilon;" }, // greek small letter upsilon,U+03C5 ISOgrk3 -->
+			{ "\u03C6", "&phi;" }, // greek small letter phi, U+03C6 ISOgrk3 -->
+			{ "\u03C7", "&chi;" }, // greek small letter chi, U+03C7 ISOgrk3 -->
+			{ "\u03C8", "&psi;" }, // greek small letter psi, U+03C8 ISOgrk3 -->
+			{ "\u03C9", "&omega;" }, // greek small letter omega,U+03C9 ISOgrk3 -->
+			{ "\u03D1", "&thetasym;" }, // greek small letter theta symbol,U+03D1 NEW -->
+			{ "\u03D2", "&upsih;" }, // greek upsilon with hook symbol,U+03D2 NEW -->
+			{ "\u03D6", "&piv;" }, // greek pi symbol, U+03D6 ISOgrk3 -->
+			// <!-- General Punctuation -->
+			{ "\u2022", "&bull;" }, // bullet = black small circle,U+2022 ISOpub -->
+			// <!-- bullet is NOT the same as bullet operator, U+2219 -->
+			{ "\u2026", "&hellip;" }, // horizontal ellipsis = three dot leader,U+2026 ISOpub -->
+			{ "\u2032", "&prime;" }, // prime = minutes = feet, U+2032 ISOtech -->
+			{ "\u2033", "&Prime;" }, // double prime = seconds = inches,U+2033 ISOtech -->
+			{ "\u203E", "&oline;" }, // overline = spacing overscore,U+203E NEW -->
+			{ "\u2044", "&frasl;" }, // fraction slash, U+2044 NEW -->
+			// <!-- Letterlike Symbols -->
+			{ "\u2118", "&weierp;" }, // script capital P = power set= Weierstrass p, U+2118 ISOamso -->
+			{ "\u2111", "&image;" }, // blackletter capital I = imaginary part,U+2111 ISOamso -->
+			{ "\u211C", "&real;" }, // blackletter capital R = real part symbol,U+211C ISOamso -->
+			{ "\u2122", "&trade;" }, // trade mark sign, U+2122 ISOnum -->
+			{ "\u2135", "&alefsym;" }, // alef symbol = first transfinite cardinal,U+2135 NEW -->
+			// <!-- alef symbol is NOT the same as hebrew letter alef,U+05D0 although the
+			// same glyph could be used to depict both characters -->
+			// <!-- Arrows -->
+			{ "\u2190", "&larr;" }, // leftwards arrow, U+2190 ISOnum -->
+			{ "\u2191", "&uarr;" }, // upwards arrow, U+2191 ISOnum-->
+			{ "\u2192", "&rarr;" }, // rightwards arrow, U+2192 ISOnum -->
+			{ "\u2193", "&darr;" }, // downwards arrow, U+2193 ISOnum -->
+			{ "\u2194", "&harr;" }, // left right arrow, U+2194 ISOamsa -->
+			{ "\u21B5", "&crarr;" }, // downwards arrow with corner leftwards= carriage return, U+21B5 NEW -->
+			{ "\u21D0", "&lArr;" }, // leftwards double arrow, U+21D0 ISOtech -->
+			// <!-- ISO 10646 does not say that lArr is the same as the 'is implied by'
+			// arrow but also does not have any other character for that function.
+			// So ? lArr canbe used for 'is implied by' as ISOtech suggests -->
+			{ "\u21D1", "&uArr;" }, // upwards double arrow, U+21D1 ISOamsa -->
+			{ "\u21D2", "&rArr;" }, // rightwards double arrow,U+21D2 ISOtech -->
+			// <!-- ISO 10646 does not say this is the 'implies' character but does not
+			// have another character with this function so ?rArr can be used for
+			// 'implies' as ISOtech suggests -->
+			{ "\u21D3", "&dArr;" }, // downwards double arrow, U+21D3 ISOamsa -->
+			{ "\u21D4", "&hArr;" }, // left right double arrow,U+21D4 ISOamsa -->
+			// <!-- Mathematical Operators -->
+			{ "\u2200", "&forall;" }, // for all, U+2200 ISOtech -->
+			{ "\u2202", "&part;" }, // partial differential, U+2202 ISOtech -->
+			{ "\u2203", "&exist;" }, // there exists, U+2203 ISOtech -->
+			{ "\u2205", "&empty;" }, // empty set = null set = diameter,U+2205 ISOamso -->
+			{ "\u2207", "&nabla;" }, // nabla = backward difference,U+2207 ISOtech -->
+			{ "\u2208", "&isin;" }, // element of, U+2208 ISOtech -->
+			{ "\u2209", "&notin;" }, // not an element of, U+2209 ISOtech -->
+			{ "\u220B", "&ni;" }, // contains as member, U+220B ISOtech -->
+			// <!-- should there be a more memorable name than 'ni'? -->
+			{ "\u220F", "&prod;" }, // n-ary product = product sign,U+220F ISOamsb -->
+			// <!-- prod is NOT the same character as U+03A0 'greek capital letter pi'
+			// though the same glyph might be used for both -->
+			{ "\u2211", "&sum;" }, // n-ary summation, U+2211 ISOamsb -->
+			// <!-- sum is NOT the same character as U+03A3 'greek capital letter sigma'
+			// though the same glyph might be used for both -->
+			{ "\u2212", "&minus;" }, // minus sign, U+2212 ISOtech -->
+			{ "\u2217", "&lowast;" }, // asterisk operator, U+2217 ISOtech -->
+			{ "\u221A", "&radic;" }, // square root = radical sign,U+221A ISOtech -->
+			{ "\u221D", "&prop;" }, // proportional to, U+221D ISOtech -->
+			{ "\u221E", "&infin;" }, // infinity, U+221E ISOtech -->
+			{ "\u2220", "&ang;" }, // angle, U+2220 ISOamso -->
+			{ "\u2227", "&and;" }, // logical and = wedge, U+2227 ISOtech -->
+			{ "\u2228", "&or;" }, // logical or = vee, U+2228 ISOtech -->
+			{ "\u2229", "&cap;" }, // intersection = cap, U+2229 ISOtech -->
+			{ "\u222A", "&cup;" }, // union = cup, U+222A ISOtech -->
+			{ "\u222B", "&int;" }, // integral, U+222B ISOtech -->
+			{ "\u2234", "&there4;" }, // therefore, U+2234 ISOtech -->
+			{ "\u223C", "&sim;" }, // tilde operator = varies with = similar to,U+223C ISOtech -->
+			// <!-- tilde operator is NOT the same character as the tilde, U+007E,although
+			// the same glyph might be used to represent both -->
+			{ "\u2245", "&cong;" }, // approximately equal to, U+2245 ISOtech -->
+			{ "\u2248", "&asymp;" }, // almost equal to = asymptotic to,U+2248 ISOamsr -->
+			{ "\u2260", "&ne;" }, // not equal to, U+2260 ISOtech -->
+			{ "\u2261", "&equiv;" }, // identical to, U+2261 ISOtech -->
+			{ "\u2264", "&le;" }, // less-than or equal to, U+2264 ISOtech -->
+			{ "\u2265", "&ge;" }, // greater-than or equal to,U+2265 ISOtech -->
+			{ "\u2282", "&sub;" }, // subset of, U+2282 ISOtech -->
+			{ "\u2283", "&sup;" }, // superset of, U+2283 ISOtech -->
+			// <!-- note that nsup, 'not a superset of, U+2283' is not covered by the
+			// Symbol font encoding and is not included. Should it be, for symmetry?
+			// It is in ISOamsn --> <!ENTITY nsub", "8836"},
+			// not a subset of, U+2284 ISOamsn -->
+			{ "\u2286", "&sube;" }, // subset of or equal to, U+2286 ISOtech -->
+			{ "\u2287", "&supe;" }, // superset of or equal to,U+2287 ISOtech -->
+			{ "\u2295", "&oplus;" }, // circled plus = direct sum,U+2295 ISOamsb -->
+			{ "\u2297", "&otimes;" }, // circled times = vector product,U+2297 ISOamsb -->
+			{ "\u22A5", "&perp;" }, // up tack = orthogonal to = perpendicular,U+22A5 ISOtech -->
+			{ "\u22C5", "&sdot;" }, // dot operator, U+22C5 ISOamsb -->
+			// <!-- dot operator is NOT the same character as U+00B7 middle dot -->
+			// <!-- Miscellaneous Technical -->
+			{ "\u2308", "&lceil;" }, // left ceiling = apl upstile,U+2308 ISOamsc -->
+			{ "\u2309", "&rceil;" }, // right ceiling, U+2309 ISOamsc -->
+			{ "\u230A", "&lfloor;" }, // left floor = apl downstile,U+230A ISOamsc -->
+			{ "\u230B", "&rfloor;" }, // right floor, U+230B ISOamsc -->
+			{ "\u2329", "&lang;" }, // left-pointing angle bracket = bra,U+2329 ISOtech -->
+			// <!-- lang is NOT the same character as U+003C 'less than' or U+2039 'single
+			// left-pointing angle quotation
+			// mark' -->
+			{ "\u232A", "&rang;" }, // right-pointing angle bracket = ket,U+232A ISOtech -->
+			// <!-- rang is NOT the same character as U+003E 'greater than' or U+203A
+			// 'single right-pointing angle quotation mark' -->
+			// <!-- Geometric Shapes -->
+			{ "\u25CA", "&loz;" }, // lozenge, U+25CA ISOpub -->
+			// <!-- Miscellaneous Symbols -->
+			{ "\u2660", "&spades;" }, // black spade suit, U+2660 ISOpub -->
+			// <!-- black here seems to mean filled as opposed to hollow -->
+			{ "\u2663", "&clubs;" }, // black club suit = shamrock,U+2663 ISOpub -->
+			{ "\u2665", "&hearts;" }, // black heart suit = valentine,U+2665 ISOpub -->
+			{ "\u2666", "&diams;" }, // black diamond suit, U+2666 ISOpub -->
+
+			// <!-- Latin Extended-A -->
+			{ "\u0152", "&OElig;" }, // -- latin capital ligature OE,U+0152 ISOlat2 -->
+			{ "\u0153", "&oelig;" }, // -- latin small ligature oe, U+0153 ISOlat2 -->
+			// <!-- ligature is a misnomer, this is a separate character in some languages
+			// -->
+			{ "\u0160", "&Scaron;" }, // -- latin capital letter S with caron,U+0160 ISOlat2 -->
+			{ "\u0161", "&scaron;" }, // -- latin small letter s with caron,U+0161 ISOlat2 -->
+			{ "\u0178", "&Yuml;" }, // -- latin capital letter Y with diaeresis,U+0178 ISOlat2 -->
+			// <!-- Spacing Modifier Letters -->
+			{ "\u02C6", "&circ;" }, // -- modifier letter circumflex accent,U+02C6 ISOpub -->
+			{ "\u02DC", "&tilde;" }, // small tilde, U+02DC ISOdia -->
+			// <!-- General Punctuation -->
+			{ "\u2002", "&ensp;" }, // en space, U+2002 ISOpub -->
+			{ "\u2003", "&emsp;" }, // em space, U+2003 ISOpub -->
+			{ "\u2009", "&thinsp;" }, // thin space, U+2009 ISOpub -->
+			{ "\u200C", "&zwnj;" }, // zero width non-joiner,U+200C NEW RFC 2070 -->
+			{ "\u200D", "&zwj;" }, // zero width joiner, U+200D NEW RFC 2070 -->
+			{ "\u200E", "&lrm;" }, // left-to-right mark, U+200E NEW RFC 2070 -->
+			{ "\u200F", "&rlm;" }, // right-to-left mark, U+200F NEW RFC 2070 -->
+			{ "\u2013", "&ndash;" }, // en dash, U+2013 ISOpub -->
+			{ "\u2014", "&mdash;" }, // em dash, U+2014 ISOpub -->
+			{ "\u2018", "&lsquo;" }, // left single quotation mark,U+2018 ISOnum -->
+			{ "\u2019", "&rsquo;" }, // right single quotation mark,U+2019 ISOnum -->
+			{ "\u201A", "&sbquo;" }, // single low-9 quotation mark, U+201A NEW -->
+			{ "\u201C", "&ldquo;" }, // left double quotation mark,U+201C ISOnum -->
+			{ "\u201D", "&rdquo;" }, // right double quotation mark,U+201D ISOnum -->
+			{ "\u201E", "&bdquo;" }, // double low-9 quotation mark, U+201E NEW -->
+			{ "\u2020", "&dagger;" }, // dagger, U+2020 ISOpub -->
+			{ "\u2021", "&Dagger;" }, // double dagger, U+2021 ISOpub -->
+			{ "\u2030", "&permil;" }, // per mille sign, U+2030 ISOtech -->
+			{ "\u2039", "&lsaquo;" }, // single left-pointing angle quotation mark,U+2039 ISO proposed -->
+			// <!-- lsaquo is proposed but not yet ISO standardized -->
+			{ "\u203A", "&rsaquo;" }, // single right-pointing angle quotation mark,U+203A ISO proposed -->
+			// <!-- rsaquo is proposed but not yet ISO standardized -->
+			{ "\u20AC", "&euro;" }, // -- euro sign, U+20AC NEW -->
+	};
+
+	/**
+	 * Reverse of {@link #HTML40_EXTENDED_ESCAPE()} for unescaping purposes.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] HTML40_EXTENDED_UNESCAPE() {
+		return HTML40_EXTENDED_UNESCAPE.clone();
+	}
+
+	private static final String[][] HTML40_EXTENDED_UNESCAPE = invert(HTML40_EXTENDED_ESCAPE);
+
+	/**
+	 * Mapping to escape the basic XML and HTML character entities.
+	 *
+	 * Namely: {@code " & < >}
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] BASIC_ESCAPE() {
+		return BASIC_ESCAPE.clone();
+	}
+
+	private static final String[][] BASIC_ESCAPE = { { "\"", "&quot;" }, // " - double-quote
+			{ "&", "&amp;" }, // & - ampersand
+			{ "<", "&lt;" }, // < - less-than
+			{ ">", "&gt;" }, // > - greater-than
+	};
+
+	/**
+	 * Reverse of {@link #BASIC_ESCAPE()} for unescaping purposes.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] BASIC_UNESCAPE() {
+		return BASIC_UNESCAPE.clone();
+	}
+
+	private static final String[][] BASIC_UNESCAPE = invert(BASIC_ESCAPE);
+
+	/**
+	 * Mapping to escape the apostrophe character to its XML character entity.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] APOS_ESCAPE() {
+		return APOS_ESCAPE.clone();
+	}
+
+	private static final String[][] APOS_ESCAPE = { { "'", "&apos;" }, // XML apostrophe
+	};
+
+	/**
+	 * Reverse of {@link #APOS_ESCAPE()} for unescaping purposes.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] APOS_UNESCAPE() {
+		return APOS_UNESCAPE.clone();
+	}
+
+	private static final String[][] APOS_UNESCAPE = invert(APOS_ESCAPE);
+
+	/**
+	 * Mapping to escape the Java control characters.
+	 *
+	 * Namely: {@code \b \n \t \f \r}
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] JAVA_CTRL_CHARS_ESCAPE() {
+		return JAVA_CTRL_CHARS_ESCAPE.clone();
+	}
+
+	private static final String[][] JAVA_CTRL_CHARS_ESCAPE = { { "\b", "\\b" }, { "\n", "\\n" }, { "\t", "\\t" },
+			{ "\f", "\\f" }, { "\r", "\\r" } };
+
+	/**
+	 * Reverse of {@link #JAVA_CTRL_CHARS_ESCAPE()} for unescaping purposes.
+	 * 
+	 * @return the mapping table
+	 */
+	public static String[][] JAVA_CTRL_CHARS_UNESCAPE() {
+		return JAVA_CTRL_CHARS_UNESCAPE.clone();
+	}
+
+	private static final String[][] JAVA_CTRL_CHARS_UNESCAPE = invert(JAVA_CTRL_CHARS_ESCAPE);
+
+	/**
+	 * Used to invert an escape array into an unescape array
+	 * 
+	 * @param array String[][] to be inverted
+	 * @return String[][] inverted array
+	 */
+	public static String[][] invert(final String[][] array) {
+		final String[][] newarray = new String[array.length][2];
+		for (int i = 0; i < array.length; i++) {
+			newarray[i][0] = array[i][1];
+			newarray[i][1] = array[i][0];
+		}
+		return newarray;
+	}
+
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/JavaUnicodeEscaper.java b/sources/main/java/org/apache/commons/lang3/text/translate/JavaUnicodeEscaper.java
new file mode 100644
index 00000000..8944c016
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/JavaUnicodeEscaper.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+/**
+ * Translates codepoints to their Unicode escaped value suitable for Java
+ * source.
+ * 
+ * @since 3.2
+ * @version $Id: JavaUnicodeEscaper.java 1451550 2013-03-01 10:06:13Z olamy $
+ */
+public class JavaUnicodeEscaper extends UnicodeEscaper {
+
+	/**
+	 * <p>
+	 * Constructs a <code>JavaUnicodeEscaper</code> above the specified value
+	 * (exclusive).
+	 * </p>
+	 * 
+	 * @param codepoint above which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static JavaUnicodeEscaper above(final int codepoint) {
+		return outsideOf(0, codepoint);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>JavaUnicodeEscaper</code> below the specified value
+	 * (exclusive).
+	 * </p>
+	 * 
+	 * @param codepoint below which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static JavaUnicodeEscaper below(final int codepoint) {
+		return outsideOf(codepoint, Integer.MAX_VALUE);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>JavaUnicodeEscaper</code> between the specified values
+	 * (inclusive).
+	 * </p>
+	 * 
+	 * @param codepointLow  above which to escape
+	 * @param codepointHigh below which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static JavaUnicodeEscaper between(final int codepointLow, final int codepointHigh) {
+		return new JavaUnicodeEscaper(codepointLow, codepointHigh, true);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>JavaUnicodeEscaper</code> outside of the specified values
+	 * (exclusive).
+	 * </p>
+	 * 
+	 * @param codepointLow  below which to escape
+	 * @param codepointHigh above which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static JavaUnicodeEscaper outsideOf(final int codepointLow, final int codepointHigh) {
+		return new JavaUnicodeEscaper(codepointLow, codepointHigh, false);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>JavaUnicodeEscaper</code> for the specified range. This is
+	 * the underlying method for the other constructors/builders. The
+	 * <code>below</code> and <code>above</code> boundaries are inclusive when
+	 * <code>between</code> is <code>true</code> and exclusive when it is
+	 * <code>false</code>.
+	 * </p>
+	 * 
+	 * @param below   int value representing the lowest codepoint boundary
+	 * @param above   int value representing the highest codepoint boundary
+	 * @param between whether to escape between the boundaries or outside them
+	 */
+	public JavaUnicodeEscaper(final int below, final int above, final boolean between) {
+		super(below, above, between);
+	}
+
+	/**
+	 * Converts the given codepoint to a hex string of the form
+	 * {@code "\\uXXXX\\uXXXX"}
+	 * 
+	 * @param codepoint a Unicode code point
+	 * @return the hex string for the given codepoint
+	 */
+	@Override
+	protected String toUtf16Escape(final int codepoint) {
+		final char[] surrogatePair = Character.toChars(codepoint);
+		return "\\u" + hex(surrogatePair[0]) + "\\u" + hex(surrogatePair[1]);
+	}
+
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java b/sources/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
new file mode 100644
index 00000000..e3c93345
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/LookupTranslator.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashMap;
+
+/**
+ * Translates a value using a lookup table.
+ *
+ * @since 3.0
+ * @version $Id: LookupTranslator.java 1470822 2013-04-23 06:00:41Z bayard $
+ */
+public class LookupTranslator extends CharSequenceTranslator {
+
+	private final HashMap<String, CharSequence> lookupMap;
+	private final int shortest;
+	private final int longest;
+
+	/**
+	 * Define the lookup table to be used in translation
+	 *
+	 * Note that, as of Lang 3.1, the key to the lookup table is converted to a
+	 * java.lang.String, while the value remains as a java.lang.CharSequence. This
+	 * is because we need the key to support hashCode and equals(Object), allowing
+	 * it to be the key for a HashMap. See LANG-882.
+	 *
+	 * @param lookup CharSequence[][] table of size [*][2]
+	 */
+	public LookupTranslator(final CharSequence[]... lookup) {
+		lookupMap = new HashMap<String, CharSequence>();
+		int _shortest = Integer.MAX_VALUE;
+		int _longest = 0;
+		if (lookup != null) {
+			for (final CharSequence[] seq : lookup) {
+				this.lookupMap.put(seq[0].toString(), seq[1]);
+				final int sz = seq[0].length();
+				if (sz < _shortest) {
+					_shortest = sz;
+				}
+				if (sz > _longest) {
+					_longest = sz;
+				}
+			}
+		}
+		shortest = _shortest;
+		longest = _longest;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+		int max = longest;
+		if (index + longest > input.length()) {
+			max = input.length() - index;
+		}
+		// descend so as to get a greedy algorithm
+		for (int i = max; i >= shortest; i--) {
+			final CharSequence subSeq = input.subSequence(index, index + i);
+			final CharSequence result = lookupMap.get(subSeq.toString());
+			if (result != null) {
+				out.write(result.toString());
+				return i;
+			}
+		}
+		return 0;
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityEscaper.java b/sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityEscaper.java
new file mode 100644
index 00000000..b216c0c3
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityEscaper.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Translates codepoints to their XML numeric entity escaped value.
+ *
+ * @since 3.0
+ * @version $Id: NumericEntityEscaper.java 1436768 2013-01-22 07:07:42Z ggregory
+ *          $
+ */
+public class NumericEntityEscaper extends CodePointTranslator {
+
+	private final int below;
+	private final int above;
+	private final boolean between;
+
+	/**
+	 * <p>
+	 * Constructs a <code>NumericEntityEscaper</code> for the specified range. This
+	 * is the underlying method for the other constructors/builders. The
+	 * <code>below</code> and <code>above</code> boundaries are inclusive when
+	 * <code>between</code> is <code>true</code> and exclusive when it is
+	 * <code>false</code>.
+	 * </p>
+	 *
+	 * @param below   int value representing the lowest codepoint boundary
+	 * @param above   int value representing the highest codepoint boundary
+	 * @param between whether to escape between the boundaries or outside them
+	 */
+	private NumericEntityEscaper(final int below, final int above, final boolean between) {
+		this.below = below;
+		this.above = above;
+		this.between = between;
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>NumericEntityEscaper</code> for all characters.
+	 * </p>
+	 */
+	public NumericEntityEscaper() {
+		this(0, Integer.MAX_VALUE, true);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>NumericEntityEscaper</code> below the specified value
+	 * (exclusive).
+	 * </p>
+	 *
+	 * @param codepoint below which to escape
+	 * @return the newly created {@code NumericEntityEscaper} instance
+	 */
+	public static NumericEntityEscaper below(final int codepoint) {
+		return outsideOf(codepoint, Integer.MAX_VALUE);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>NumericEntityEscaper</code> above the specified value
+	 * (exclusive).
+	 * </p>
+	 *
+	 * @param codepoint above which to escape
+	 * @return the newly created {@code NumericEntityEscaper} instance
+	 */
+	public static NumericEntityEscaper above(final int codepoint) {
+		return outsideOf(0, codepoint);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>NumericEntityEscaper</code> between the specified values
+	 * (inclusive).
+	 * </p>
+	 *
+	 * @param codepointLow  above which to escape
+	 * @param codepointHigh below which to escape
+	 * @return the newly created {@code NumericEntityEscaper} instance
+	 */
+	public static NumericEntityEscaper between(final int codepointLow, final int codepointHigh) {
+		return new NumericEntityEscaper(codepointLow, codepointHigh, true);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>NumericEntityEscaper</code> outside of the specified
+	 * values (exclusive).
+	 * </p>
+	 *
+	 * @param codepointLow  below which to escape
+	 * @param codepointHigh above which to escape
+	 * @return the newly created {@code NumericEntityEscaper} instance
+	 */
+	public static NumericEntityEscaper outsideOf(final int codepointLow, final int codepointHigh) {
+		return new NumericEntityEscaper(codepointLow, codepointHigh, false);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean translate(final int codepoint, final Writer out) throws IOException {
+		if (between) {
+			if (codepoint < below || codepoint > above) {
+				return false;
+			}
+		} else {
+			if (codepoint >= below && codepoint <= above) {
+				return false;
+			}
+		}
+
+		out.write("&#");
+		out.write(Integer.toString(codepoint, 10));
+		out.write(';');
+		return true;
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaper.java b/sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaper.java
new file mode 100644
index 00000000..a6fe2945
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/NumericEntityUnescaper.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Arrays;
+import java.util.EnumSet;
+
+/**
+ * Translate XML numeric entities of the form &amp;#[xX]?\d+;? to the specific
+ * codepoint.
+ *
+ * Note that the semi-colon is optional.
+ * 
+ * @since 3.0
+ * @version $Id: NumericEntityUnescaper.java 1583482 2014-03-31 22:54:57Z niallp
+ *          $
+ */
+public class NumericEntityUnescaper extends CharSequenceTranslator {
+
+	public static enum OPTION {
+		semiColonRequired, semiColonOptional, errorIfNoSemiColon
+	}
+
+	// TODO?: Create an OptionsSet class to hide some of the conditional logic below
+	private final EnumSet<OPTION> options;
+
+	/**
+	 * Create a UnicodeUnescaper.
+	 *
+	 * The constructor takes a list of options, only one type of which is currently
+	 * available (whether to allow, error or ignore the semi-colon on the end of a
+	 * numeric entity to being missing).
+	 *
+	 * For example, to support numeric entities without a ';': new
+	 * NumericEntityUnescaper(NumericEntityUnescaper.OPTION.semiColonOptional) and
+	 * to throw an IllegalArgumentException when they're missing: new
+	 * NumericEntityUnescaper(NumericEntityUnescaper.OPTION.errorIfNoSemiColon)
+	 *
+	 * Note that the default behaviour is to ignore them.
+	 *
+	 * @param options to apply to this unescaper
+	 */
+	public NumericEntityUnescaper(final OPTION... options) {
+		if (options.length > 0) {
+			this.options = EnumSet.copyOf(Arrays.asList(options));
+		} else {
+			this.options = EnumSet.copyOf(Arrays.asList(new OPTION[] { OPTION.semiColonRequired }));
+		}
+	}
+
+	/**
+	 * Whether the passed in option is currently set.
+	 *
+	 * @param option to check state of
+	 * @return whether the option is set
+	 */
+	public boolean isSet(final OPTION option) {
+		return options == null ? false : options.contains(option);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+		final int seqEnd = input.length();
+		// Uses -2 to ensure there is something after the &#
+		if (input.charAt(index) == '&' && index < seqEnd - 2 && input.charAt(index + 1) == '#') {
+			int start = index + 2;
+			boolean isHex = false;
+
+			final char firstChar = input.charAt(start);
+			if (firstChar == 'x' || firstChar == 'X') {
+				start++;
+				isHex = true;
+
+				// Check there's more than just an x after the &#
+				if (start == seqEnd) {
+					return 0;
+				}
+			}
+
+			int end = start;
+			// Note that this supports character codes without a ; on the end
+			while (end < seqEnd && (input.charAt(end) >= '0' && input.charAt(end) <= '9'
+					|| input.charAt(end) >= 'a' && input.charAt(end) <= 'f'
+					|| input.charAt(end) >= 'A' && input.charAt(end) <= 'F')) {
+				end++;
+			}
+
+			final boolean semiNext = end != seqEnd && input.charAt(end) == ';';
+
+			if (!semiNext) {
+				if (isSet(OPTION.semiColonRequired)) {
+					return 0;
+				} else if (isSet(OPTION.errorIfNoSemiColon)) {
+					throw new IllegalArgumentException("Semi-colon required at end of numeric entity");
+				}
+			}
+
+			int entityValue;
+			try {
+				if (isHex) {
+					entityValue = Integer.parseInt(input.subSequence(start, end).toString(), 16);
+				} else {
+					entityValue = Integer.parseInt(input.subSequence(start, end).toString(), 10);
+				}
+			} catch (final NumberFormatException nfe) {
+				return 0;
+			}
+
+			if (entityValue > 0xFFFF) {
+				final char[] chrs = Character.toChars(entityValue);
+				out.write(chrs[0]);
+				out.write(chrs[1]);
+			} else {
+				out.write(entityValue);
+			}
+
+			return 2 + end - start + (isHex ? 1 : 0) + (semiNext ? 1 : 0);
+		}
+		return 0;
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java b/sources/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java
new file mode 100644
index 00000000..7b041947
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/OctalUnescaper.java
@@ -0,0 +1,86 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Translate escaped octal Strings back to their octal values.
+ *
+ * For example, "\45" should go back to being the specific value (a %).
+ *
+ * Note that this currently only supports the viable range of octal for Java;
+ * namely 1 to 377. This is because parsing Java is the main use case.
+ * 
+ * @since 3.0
+ * @version $Id: OctalUnescaper.java 967237 2010-07-23 20:08:57Z mbenson $
+ */
+public class OctalUnescaper extends CharSequenceTranslator {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+		int remaining = input.length() - index - 1; // how many characters left, ignoring the first \
+		StringBuilder builder = new StringBuilder();
+		if (input.charAt(index) == '\\' && remaining > 0 && isOctalDigit(input.charAt(index + 1))) {
+			int next = index + 1;
+			int next2 = index + 2;
+			int next3 = index + 3;
+
+			// we know this is good as we checked it in the if block above
+			builder.append(input.charAt(next));
+
+			if (remaining > 1 && isOctalDigit(input.charAt(next2))) {
+				builder.append(input.charAt(next2));
+				if (remaining > 2 && isZeroToThree(input.charAt(next)) && isOctalDigit(input.charAt(next3))) {
+					builder.append(input.charAt(next3));
+				}
+			}
+
+			out.write(Integer.parseInt(builder.toString(), 8));
+			return 1 + builder.length();
+		}
+		return 0;
+	}
+
+	/**
+	 * Checks if the given char is an octal digit. Octal digits are the character
+	 * representations of the digits 0 to 7.
+	 * 
+	 * @param ch the char to check
+	 * @return true if the given char is the character representation of one of the
+	 *         digits from 0 to 7
+	 */
+	private boolean isOctalDigit(char ch) {
+		return ch >= '0' && ch <= '7';
+	}
+
+	/**
+	 * Checks if the given char is the character representation of one of the digit
+	 * from 0 to 3.
+	 * 
+	 * @param ch the char to check
+	 * @return true if the given char is the character representation of one of the
+	 *         digits from 0 to 3
+	 */
+	private boolean isZeroToThree(char ch) {
+		return ch >= '0' && ch <= '3';
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java b/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
new file mode 100644
index 00000000..1aaf54b6
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeEscaper.java
@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Translates codepoints to their Unicode escaped value.
+ *
+ * @since 3.0
+ * @version $Id: UnicodeEscaper.java 1552652 2013-12-20 13:23:16Z britter $
+ */
+public class UnicodeEscaper extends CodePointTranslator {
+
+	private final int below;
+	private final int above;
+	private final boolean between;
+
+	/**
+	 * <p>
+	 * Constructs a <code>UnicodeEscaper</code> for all characters.
+	 * </p>
+	 */
+	public UnicodeEscaper() {
+		this(0, Integer.MAX_VALUE, true);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>UnicodeEscaper</code> for the specified range. This is the
+	 * underlying method for the other constructors/builders. The <code>below</code>
+	 * and <code>above</code> boundaries are inclusive when <code>between</code> is
+	 * <code>true</code> and exclusive when it is <code>false</code>.
+	 * </p>
+	 *
+	 * @param below   int value representing the lowest codepoint boundary
+	 * @param above   int value representing the highest codepoint boundary
+	 * @param between whether to escape between the boundaries or outside them
+	 */
+	protected UnicodeEscaper(final int below, final int above, final boolean between) {
+		this.below = below;
+		this.above = above;
+		this.between = between;
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>UnicodeEscaper</code> below the specified value
+	 * (exclusive).
+	 * </p>
+	 *
+	 * @param codepoint below which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static UnicodeEscaper below(final int codepoint) {
+		return outsideOf(codepoint, Integer.MAX_VALUE);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>UnicodeEscaper</code> above the specified value
+	 * (exclusive).
+	 * </p>
+	 *
+	 * @param codepoint above which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static UnicodeEscaper above(final int codepoint) {
+		return outsideOf(0, codepoint);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>UnicodeEscaper</code> outside of the specified values
+	 * (exclusive).
+	 * </p>
+	 *
+	 * @param codepointLow  below which to escape
+	 * @param codepointHigh above which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static UnicodeEscaper outsideOf(final int codepointLow, final int codepointHigh) {
+		return new UnicodeEscaper(codepointLow, codepointHigh, false);
+	}
+
+	/**
+	 * <p>
+	 * Constructs a <code>UnicodeEscaper</code> between the specified values
+	 * (inclusive).
+	 * </p>
+	 *
+	 * @param codepointLow  above which to escape
+	 * @param codepointHigh below which to escape
+	 * @return the newly created {@code UnicodeEscaper} instance
+	 */
+	public static UnicodeEscaper between(final int codepointLow, final int codepointHigh) {
+		return new UnicodeEscaper(codepointLow, codepointHigh, true);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean translate(final int codepoint, final Writer out) throws IOException {
+		if (between) {
+			if (codepoint < below || codepoint > above) {
+				return false;
+			}
+		} else {
+			if (codepoint >= below && codepoint <= above) {
+				return false;
+			}
+		}
+
+		// TODO: Handle potential + sign per various Unicode escape implementations
+		if (codepoint > 0xffff) {
+			out.write(toUtf16Escape(codepoint));
+		} else if (codepoint > 0xfff) {
+			out.write("\\u" + hex(codepoint));
+		} else if (codepoint > 0xff) {
+			out.write("\\u0" + hex(codepoint));
+		} else if (codepoint > 0xf) {
+			out.write("\\u00" + hex(codepoint));
+		} else {
+			out.write("\\u000" + hex(codepoint));
+		}
+		return true;
+	}
+
+	/**
+	 * Converts the given codepoint to a hex string of the form {@code "\\uXXXX"}
+	 * 
+	 * @param codepoint a Unicode code point
+	 * @return the hex string for the given codepoint
+	 *
+	 * @since 3.2
+	 */
+	protected String toUtf16Escape(final int codepoint) {
+		return "\\u" + hex(codepoint);
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnescaper.java b/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnescaper.java
new file mode 100644
index 00000000..5881d12c
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnescaper.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Translates escaped Unicode values of the form \\u+\d\d\d\d back to Unicode.
+ * It supports multiple 'u' characters and will work with or without the +.
+ * 
+ * @since 3.0
+ * @version $Id: UnicodeUnescaper.java 1436770 2013-01-22 07:09:45Z ggregory $
+ */
+public class UnicodeUnescaper extends CharSequenceTranslator {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int translate(final CharSequence input, final int index, final Writer out) throws IOException {
+		if (input.charAt(index) == '\\' && index + 1 < input.length() && input.charAt(index + 1) == 'u') {
+			// consume optional additional 'u' chars
+			int i = 2;
+			while (index + i < input.length() && input.charAt(index + i) == 'u') {
+				i++;
+			}
+
+			if (index + i < input.length() && input.charAt(index + i) == '+') {
+				i++;
+			}
+
+			if (index + i + 4 <= input.length()) {
+				// Get 4 hex digits
+				final CharSequence unicode = input.subSequence(index + i, index + i + 4);
+
+				try {
+					final int value = Integer.parseInt(unicode.toString(), 16);
+					out.write((char) value);
+				} catch (final NumberFormatException nfe) {
+					throw new IllegalArgumentException("Unable to parse unicode value: " + unicode, nfe);
+				}
+				return i + 4;
+			} else {
+				throw new IllegalArgumentException("Less than 4 hex digits in unicode value: '"
+						+ input.subSequence(index, input.length()) + "' due to end of CharSequence");
+			}
+		}
+		return 0;
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemover.java b/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemover.java
new file mode 100644
index 00000000..1ccf6fe8
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/UnicodeUnpairedSurrogateRemover.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.text.translate;
+
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Helper subclass to CharSequenceTranslator to remove unpaired surrogates.
+ * 
+ * @version $Id: UnicodeUnpairedSurrogateRemover.java 1568639 2014-02-15
+ *          16:13:27Z britter $
+ */
+public class UnicodeUnpairedSurrogateRemover extends CodePointTranslator {
+	/**
+	 * Implementation of translate that throws out unpaired surrogates.
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean translate(int codepoint, Writer out) throws IOException {
+		if (codepoint >= Character.MIN_SURROGATE && codepoint <= Character.MAX_SURROGATE) {
+			// It's a surrogate. Write nothing and say we've translated.
+			return true;
+		} else {
+			// It's not a surrogate. Don't translate it.
+			return false;
+		}
+	}
+}
diff --git a/sources/main/java/org/apache/commons/lang3/text/translate/package-info.java b/sources/main/java/org/apache/commons/lang3/text/translate/package-info.java
new file mode 100644
index 00000000..58568d0b
--- /dev/null
+++ b/sources/main/java/org/apache/commons/lang3/text/translate/package-info.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * <p>
+ * An API for creating text translation routines from a set of smaller building
+ * blocks. Initially created to make it possible for the user to customize the
+ * rules in the StringEscapeUtils class.
+ * </p>
+ * <p>
+ * These classes are immutable, and therefore thread-safe.
+ * </p>
+ *
+ * @since 3.0
+ * @version $Id: package-info.java 1558546 2014-01-15 19:38:15Z britter $
+ */
+package org.apache.commons.lang3.text.translate;
diff --git a/sources/resources/EPKVersionIdentifier.txt b/sources/resources/EPKVersionIdentifier.txt
index 503c4b5b..ddc35e29 100644
--- a/sources/resources/EPKVersionIdentifier.txt
+++ b/sources/resources/EPKVersionIdentifier.txt
@@ -1 +1 @@
-u47
\ No newline at end of file
+u48
\ No newline at end of file
diff --git a/sources/resources/assets/eagler/CREDITS.txt b/sources/resources/assets/eagler/CREDITS.txt
index 6e709230..ac539ce5 100644
--- a/sources/resources/assets/eagler/CREDITS.txt
+++ b/sources/resources/assets/eagler/CREDITS.txt
@@ -239,6 +239,58 @@
  
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
+ Project Name: Alfheim
+ Project Author: Red Studio
+ Project URL: https://github.com/Red-Studio-Ragnarok/Alfheim
+ 
+ Used For: Optimized lighting engine
+ 
+ * MIT License
+ *
+ * Copyright (c) 2023 Red Studio
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ 
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 
+ Project Name: OptiFine (1.8.9_HD_U_M6)
+ Project Author: sp614x
+ Project URL: https://optifine.net/
+ 
+ Used For: A few, limited portions we "borrowed" without the author's permission
+ 
+ Note: Eaglercraft is not OptiFine, we only use the code for connected textures
+       and maintaining compatibility with certain resource pack features
+ 
+ * The mod OptiFine is Copyright © 2011-2021 by sp614x and the intellectual
+ * property of the author.
+ * It may be not be reproduced under any circumstances except for personal,
+ * private use as long as it remains in its unaltered, unedited form.
+ * It may not be placed on any web site or otherwise distributed publicly
+ * without advance written permission.
+ * Use of this mod on any other website or as a part of any public display
+ * is strictly prohibited and a violation of copyright.
+ 
+ (sorry sp614x)
+ 
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ 
  Project Name: Google Guava
  Project Author: Google
  Project URL: https://github.com/google/guava
diff --git a/sources/resources/assets/eagler/glsl/deferred/deferred_combine.fsh b/sources/resources/assets/eagler/glsl/deferred/deferred_combine.fsh
index a55bea58..d9931aea 100644
--- a/sources/resources/assets/eagler/glsl/deferred/deferred_combine.fsh
+++ b/sources/resources/assets/eagler/glsl/deferred/deferred_combine.fsh
@@ -141,8 +141,9 @@ void main() {
 			reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
 			envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
 		}
-		if(envMapSample4f.a > 0.0) {
-			specular = eaglercraftIBL_Specular(diffuseColor3f.rgb, envMapSample4f.rgb, viewDir3f, normalVector3f, materialData4f.rgb);
+		envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
+		if(envMapSample4f.a == 1.0) {
+			specular = eaglercraftIBL_Specular(diffuseColor3f.rgb, envMapSample4f.rgb * envMapSample4f.a, viewDir3f, normalVector3f, materialData4f.rgb);
 			specular *= 1.0 - sqrt(posDst) * 0.2;
 		}
 		break;
diff --git a/sources/resources/assets/eagler/glsl/deferred/forward_core.fsh b/sources/resources/assets/eagler/glsl/deferred/forward_core.fsh
index 65dbf97a..36e0acc0 100644
--- a/sources/resources/assets/eagler/glsl/deferred/forward_core.fsh
+++ b/sources/resources/assets/eagler/glsl/deferred/forward_core.fsh
@@ -21,7 +21,7 @@ precision highp sampler2DShadow;
 in vec4 v_position4f;
 
 #ifdef COMPILE_FOG_LIGHT_SHAFTS
-in vec2 v_positionClip2f;
+in vec3 v_positionClip3f;
 #endif
 
 #ifdef COMPILE_TEXTURE_ATTRIB
@@ -351,7 +351,7 @@ void main() {
 	f += materialData3f.r < 0.5 ? 1.0 : 0.0;
 	while(f == 0.0) {
 		float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
-		if(dst2 > 16.0) {
+		if(dst2 > 25.0) {
 			break;
 		}
 		vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
@@ -369,8 +369,9 @@ void main() {
 			reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
 			envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
 		}
-		if(envMapSample4f.a > 0.0) {
-			lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * (1.0 - sqrt(dst2) * 0.25);
+		envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
+		if(envMapSample4f.a == 1.0) {
+			lightColor3f += eaglercraftIBL_Specular(diffuseColor4f.rgb, envMapSample4f.rgb * envMapSample4f.a, worldDirection4f.xyz, normalVector3f, materialData3f, metalN, metalK) * (1.0 - sqrt(dst2) * 0.2);
 		}
 		break;
 	}
@@ -453,7 +454,7 @@ void main() {
 		fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb;
 
 #ifdef COMPILE_FOG_LIGHT_SHAFTS
-		fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, v_positionClip2f * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
+		fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
 		fogBlend4f.a = fogBlend4f.a * 0.85 + 0.2;
 #endif
 		break;
diff --git a/sources/resources/assets/eagler/glsl/deferred/forward_core.vsh b/sources/resources/assets/eagler/glsl/deferred/forward_core.vsh
index 5859caf4..9052b9ce 100644
--- a/sources/resources/assets/eagler/glsl/deferred/forward_core.vsh
+++ b/sources/resources/assets/eagler/glsl/deferred/forward_core.vsh
@@ -21,7 +21,7 @@ in vec3 a_position3f;
 out vec4 v_position4f;
 
 #ifdef COMPILE_FOG_LIGHT_SHAFTS
-out vec2 v_positionClip2f;
+out vec3 v_positionClip3f;
 #endif
 
 #ifdef COMPILE_TEXTURE_ATTRIB
@@ -98,6 +98,6 @@ void main() {
 #endif
 
 #ifdef COMPILE_FOG_LIGHT_SHAFTS
-	v_positionClip2f = gl_Position.xy / gl_Position.w;
+	v_positionClip3f = gl_Position.xyw;
 #endif
 }
diff --git a/sources/resources/assets/eagler/glsl/deferred/forward_glass_highlights.fsh b/sources/resources/assets/eagler/glsl/deferred/forward_glass_highlights.fsh
index 51e12b37..76749b73 100644
--- a/sources/resources/assets/eagler/glsl/deferred/forward_glass_highlights.fsh
+++ b/sources/resources/assets/eagler/glsl/deferred/forward_glass_highlights.fsh
@@ -238,7 +238,7 @@ void main() {
 
 	for(;;) {
 		float dst2 = dot(worldPosition4f.xyz, worldPosition4f.xyz);
-		if(dst2 > 16.0) {
+		if(dst2 > 25.0) {
 			break;
 		}
 		vec3 reflectDir = reflect(worldDirection4f.xyz, normalVector3f);
@@ -256,8 +256,9 @@ void main() {
 			reflectDir.xz += vec2(0.5, reflectDir.y > 0.0 ? 0.25 : 0.75);
 			envMapSample4f = textureLod(u_environmentMap, reflectDir.xz, 0.0);
 		}
-		if(envMapSample4f.a > 0.0) {
-			lightColor3f += eaglercraftIBL_Specular_Glass(envMapSample4f.rgb, worldDirection4f.xyz, normalVector3f) * (1.0 - sqrt(dst2) * 0.25);
+		envMapSample4f.a += min(lightmapCoords2f.g * 2.0, 1.0) * (1.0 - envMapSample4f.a);
+		if(envMapSample4f.a == 1.0) {
+			lightColor3f += eaglercraftIBL_Specular_Glass(envMapSample4f.rgb * envMapSample4f.a, worldDirection4f.xyz, normalVector3f) * (1.0 - sqrt(dst2) * 0.2);
 		}
 		break;
 	}
diff --git a/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.fsh b/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.fsh
index 41f05ad7..ce15ec35 100644
--- a/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.fsh
+++ b/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.fsh
@@ -19,7 +19,7 @@
 precision highp sampler2DShadow;
 
 in vec4 v_position4f;
-in vec2 v_positionClip2f;
+in vec3 v_positionClip3f;
 
 #ifdef COMPILE_TEXTURE_ATTRIB
 in vec2 v_texture2f;
@@ -434,7 +434,7 @@ void main() {
 		fogBlend4f.rgb *= textureLod(u_irradianceMap, atmosSamplePos.xz, 0.0).rgb + u_fogColorAddSun4f.rgb;
 
 #ifdef COMPILE_FOG_LIGHT_SHAFTS
-		fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, v_positionClip2f * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
+		fogBlend4f.rgb *= pow(textureLod(u_lightShaftsTexture, (v_positionClip3f.xy / v_positionClip3f.z) * 0.5 + 0.5, 0.0).r * 0.9 + 0.1, 2.25);
 		fogBlend4f.a = fogBlend4f.a * 0.85 + 0.2;
 #endif
 		break;
diff --git a/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.vsh b/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.vsh
index b4e04e1f..dfe5e4dd 100644
--- a/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.vsh
+++ b/sources/resources/assets/eagler/glsl/deferred/realistic_water_render.vsh
@@ -21,7 +21,7 @@ in vec3 a_position3f;
 out vec4 v_position4f;
 
 #ifdef COMPILE_FOG_LIGHT_SHAFTS
-out vec2 v_positionClip2f;
+out vec3 v_positionClip3f;
 #endif
 
 #ifdef COMPILE_TEXTURE_ATTRIB
@@ -77,6 +77,6 @@ void main() {
 	gl_Position = u_projectionMat4f * v_position4f;
 
 #ifdef COMPILE_FOG_LIGHT_SHAFTS
-	v_positionClip2f = gl_Position.xy / gl_Position.w;
+	v_positionClip3f = gl_Position.xyw;
 #endif
 }
diff --git a/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json b/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json
index 03ad299d..a160fbd8 100644
--- a/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json
+++ b/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json
@@ -1,7 +1,7 @@
 {
 	"name": "§eHigh Performance PBR",
 	"desc": "Pack made from scratch specifically for this client, designed to give what I call the best balance between quality and performance possible in a browser but obviously that's just my opinion",
-	"vers": "1.3.0",
+	"vers": "1.3.1",
 	"author": "lax1dude",
 	"api_vers": 1,
 	"features": [
diff --git a/sources/resources/assets/eagler/glsl/texture_mix.fsh b/sources/resources/assets/eagler/glsl/texture_mix.fsh
index 26cb13fb..7ba24c18 100644
--- a/sources/resources/assets/eagler/glsl/texture_mix.fsh
+++ b/sources/resources/assets/eagler/glsl/texture_mix.fsh
@@ -1,7 +1,7 @@
 #line 2
 
 /*
- * Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
+ * Copyright (c) 2022-2025 lax1dude. All Rights Reserved.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
@@ -16,7 +16,7 @@
  * 
  */
 
-EAGLER_IN(vec2, v_position2f)
+EAGLER_IN(vec2, v_texCoords2f)
 
 EAGLER_FRAG_OUT()
 
@@ -24,10 +24,8 @@ uniform sampler2D u_inputTexture;
 uniform float u_textureLod1f;
 uniform vec4 u_blendFactor4f;
 uniform vec4 u_blendBias4f;
-uniform mat3 u_matrixTransform;
 
 void main() {
-	vec3 coords = u_matrixTransform * vec3(v_position2f, 1.0);
-	vec4 color4f = EAGLER_TEXTURE_2D_LOD(u_inputTexture, coords.xy, u_textureLod1f);
+	vec4 color4f = EAGLER_TEXTURE_2D_LOD(u_inputTexture, v_texCoords2f, u_textureLod1f);
 	EAGLER_FRAG_COLOR = color4f * u_blendFactor4f + u_blendBias4f;
 }
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..acadb01a504ec2d894c5145873b302ae1aa3b99d
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-f#PP)k3V8G#WvtCxb
zfUADa;rrLToSZivaCA!gDkl??wYJn#YT^0FdFK;Y?yzz<S*)wpT`=ExhK`8k$2-34
zk~#akci-m_mDt9qf3a(#-)4uCVI{pM_`Dt-JYDVoq<8688>gpPImUVohpc6{9NDts
i&t<bxam(nl$M-2M;@rS18aNy16b4UMKbLh*2~7ZsutpOA

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..482314ca0ef2d5c8941965615b79eacfc8c0d6ad
GIT binary patch
literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn>}foqU#;K~SJIbT{jn
zM5%&lFA}2y8jr2X2|F}Ho=;zJ&v}WsjI~$S8FliAE|dCquz0}@)|_<_3<+r>-&Qod
znIn_VV423}e|d(5f_3eK*W3!0X)D=PVjZ<)MOScmv{_a*<k+Zkh3YZv$+%Y$CH0>{
z@9c_Nl^q883<a|)r?yr|Y~T-Qoso6%-lIQEYoAplycAsW80a_#Pgg&ebxsLQ0BX@m
A@c;k-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2a575c397711d72081998c7ae3b9d025d3acc5d
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;6dM$H7
z0^@m=cL%uq9wc2e$xRM$;IlV8_Fv_|{;K!6EBun2Ls!JUSCrM@Z``w;LE+4f>g9}G
zpNr=)zL}vqCxvy*jLE?_nG}w%`PMMCZ+9B6L)%On2Sc~c-CF4kY_q=if4j}hF)J`y
vrDKLF!<@9XO%wQ;zcJiWTNbrty2btKS0$5w$KMwPI*Y;6)z4*}Q$iB}^S(<Z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa7bea62bea6799b78eb062c514109c9b16d4d80
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-flPTtLVAb`Vlt{HR0
zj)tudd?L>*;d1=*iA(yU+}EyzwCj#{HfTIEzwlg}!OGCJRMKJgxfn(htv{_H!Woa7
z!?Zn=<0=mb7qU%o(vfxO4h}L=^*P3K;C`m!3lqWMZA^Jb<QjTsu8x23a`M5K*7kW1
WG8}*8cq|3l&*16m=d#Wzp$PzO_&?47

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..74f57a33e80434fc8e9f49215d108cf5cc2af1fa
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr-fl25;m&V8HSCmfV2@
z%x66AOgZkcd{r06ky8(NrIS;-I-aw!@Vw@BW2sQ&eso~=*(lBmvmec&e0xqFTrIpt
z(OL2ZXQg@q>rE?0{W#5;-c}oDa@4P1nsS*lvP|8;DUNjqr|_#LrCb^DQaNGOzZs4k
TJUJOa%Naaf{an^LB{Ts5YIixd

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8bf7d14a0c75a4b20e925c48056438b00ed73e9
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PCm$cK!L;6I+y*y
z0j7DrcN#_KG#p)%nYBp7k<Z@nRQ;py_1C1zuX?7e;QIKL_Z{<6J%Qq@ObrH$gEq5@
zq(3)dK4IuxG4GfP<I$6j>+~Dm%-G7~Vcm4iDsO?7g7mXDj9rCOSCs5zFc7%6BTDK$
yLsQxvTNREO^$Z1vc>cDQ{5TlLATO5vh~3~?NrIo&OLd^j7(8A5T-G@yGywpmk4h8(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f82cfcbfc15f9d198c40614a8f6954150d926b2
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-f#PCm$cK!L+`?lne>
z4Grl+<q53n1%}zPwi$*v@Yx%-{a2CqN$#<`Dz<T<+Lg=2C)l-u72fMIa2UUPW#Uj8
zr>ET@ySZiZn+DP1GOOQ=Ck$6hZkV(q`x-;ajFZeE$y0W`E@Dkk*pt8Iy_~~^o?A+e
rM|2n;v`GHqe)^&LZbMzvp3AKN@(aw5F|yeM-NfMO>gTe~DWM4f?>0xI

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..19290f49d43c8e168f8901f8b87e13fa5b9983e5
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-f#PTt9Tz<|SbrWtd<
z1_o0h>l9Z12S;VXC$<{6e~gLvb6z!Jt*QCr2fPw(oWCo(KCr#5Pib)TiMw;wVe%On
z$ra)i3W2P%&Nwa>QxV*rc0lywSqG+#DQr?}ChgH$7_=<;&w8;rKB9(qqYm`lkV-H*
jb4|D4>j|stFFr9|%E{r&&E|avbPI#0tDnm{r-UW|CUiw=

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed7f6239f4dad94d754e6cb4b32675b8575ec588
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-f#PCm`cpvd8}vW)wI
z1M@u3HwVR595@!Ezx!jeLc8HH3x6YyE!VQ9^JulD1h($8neG+4V@@aQfulaB<|->#
z>#K85nA*L#;)b}vnYdKx2HDNi92u1h&)2YQNKE6O&>J=>=qbwrhl=>@dIq+$CBN7u
q4DuOD4)L6I+9hMq>9cs*FD91D1?HEQ9^V3V5`(9!pUXO@geCywX+^F8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb205fede5e63d8fca11f6b540c839dace09ca7d
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#25;m&V8HSCmfV2}
z>@z0*Sg8M`$!1#GDlIP_$vKLLjy3ocpWArBeh1^O!wbH~xSnA8U9WPW@6MuKa~o9W
zvT{a*{Ag5SpZ4b91&&!0`pXnVKlwQ@MjA6RFVC6iz3K)}%l*qi7gjpu?H2se@`lwS
o@>!tR5-B6DM?H)Fc7JA0y<BjtC2HpdpmP{JUHx3vIVCg!04<wK;s5{u

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ddd184920fe4c3dc1d04a66140314ef6f4dc133
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-ggPTnhcK!Kxm?lne@
zh=y6#<q53n1%}BJpV%lVY0hi?WM^3y^nNez)A?DMGG7g5v^m^=&#>Ukj;_rNM}N*t
zYp_V;O`qE+@$5~?H^vRgX4wjEM`Jg$KIolk>u__6P<Z4y1|E_3xo?fx1xyy3dI%V1
rGgutudCN36FJ;&Dol-)ofA8t_Bo-Vy{LL=|=q3hFS3j3^P6<r_AcRR3

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0333211267e5c267a644799c567ade0dd76706e
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-ggPCm(dK!Jy4r5Wpw
zhinzmi`b(UFi9!5Pw9}5FO<_({J?ju>9WLP`CE0XmOB*MvE;0eWJpL8$qI2O%sVHx
zfTMMDM%49`8GFx(F<7Q)HqYugV!N43;joX~0tx?4r|J3(Y=?Hw|HkNWq34!;LqjEF
sgK%1g*r(%+yBVHan7dBxoc~>Rg<HWfXNfc|praT(UHx3vIVCg!0Co*T7XSbN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..551d86348a81c2a1c5c817ad4c262f5f0f1b3aba
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-ggPTt9Tz<|SbrWtcU
z1!I;<*$J+h2f8iw7HK%m(X31UEI++r>$N*pby-fzGqwfncV`HBmUy(1!P6+1ML_$5
za-Y_O6h5J?2Re6}GOwCp%fOy?jzMTmQADWIQXl3&>%@9|L_dFsI?xx%Y#^ETT5LsC
k%7;0hpS}pW^#3zknODwF4X1nVK*un6y85}Sb4q9e0LynoDgXcg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..b51bed479c7bd6b043c7f9fa3df1babd4dda1fd6
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhfBgUdUs1tNSy(<v
z!LiU-Kzw0m?!j~i!CB9Ybg~Mh3>q8Gp8dfyqrp|t=$&hle%gV>Gbfxj;CZ3CKr&iF
zC+&dnqZX6LCJV&-pT#+``5X|Qni>()ndBhJ*~s1<wS&=BB}?z{RK6~c3q6Srf{h1M
lH1$n{XC6Gj7BFQlqqbSjvE3^J`hd=1@O1TaS?83{1OQ$4L2>{9

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..52ee20656afa72bdb58ed3cc50207fdd9c4b347c
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-flPTtFTz=5N6t{HR0
zj)tude74W<oF%|lzw?k=&HP_32Af|ii1Bp&<h=7)lEK`tvQ*Ha``jGHE82frQ-m`f
zHm7NOD9TkHkS%1H;G!eyFgbXVxoXL=k^}cM55Bx27`%na?}#-6x3T;F19#P{8DBq{
ao8NLKW9|x9K|P=o7(8A5T-G@yGywoH20(!T

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc5fd49c7e608a59462bb7ce1fd6ec3624287eac
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|SLrWtcU
z1!I;<+NY!&UV^S1pFO*>b>7YF=L;##i<LKB80Zt7abKB1>hp(Jehi*<%QzI`9(v1^
zDx8#4k!ln!&SnoWoX;RL!;;yf;MBuX&Z%ayABv+2>Q>D-p2_lNhAzY8)NPv_u1+}E
duW`RH?y-Hw+*1O1dx6ei@O1TaS?83{1OS@UKNA1|

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..443b5b9f56c1d619d986d4bb20b6c95c225f9ee4
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|SbrWtcU
z1!I;<+NY!&UV^S1#VSYh1^yRu23*})T6?9%%_w(auRDXuvxiUTGE53t#-R}R$XljV
z;iR03RHJZlHhYNSd<K~rmdqXnryiDaPBoMLP#jgD6?*2e2~*h_v4)dI(fb{)syEB8
cugPY7^f<%OC~@<1peq<WUHx3vIVCg!0FrP%NB{r;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7e1e8b7bebaaa31ba0e23fc8d35cab9654ba3e7
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-fl25;m&V8HSCmfV2@
z%x66AOgWyhY*iP>k+%<crIS;-It&YISs4#o9qeGxPjQr~*c_?Nc%ChO!>LAd%Zkz_
z(-aM6TgCS*YZRi@9~{+IE%sD56Mp!7>y#WT#nbOt+)k`!Fi&)f4Or5<|5Xk1EQSon
U5R+q*fwnVvy85}Sb4q9e0IEtncmMzZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab11024741af0e24ea4a8845b4d9c6b8cf1d0c1c
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm<dK!K;#IG6o|
zB6kJfj%IC(#_mYXEfHt?Eo}rp*0vpC-}~JxL|xRmG_ZMNOuLu!jya*+4c#+athE%Z
z_0_p2w03W<xFv3ICN5RFL3Z<%W+u1ewwt*U4xf=zkY22^@RWQ5)7fhG-;4$sYH#He
v4(wsPkeQ~z{n8+Te*vfA)kS-c{$!hezGU*<$yMKh?qcwC^>bP0l+XkKt6WG5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a89dbb9f6e20828155dffa6b9a484bf63ee6123
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-flPCm<fK!L+;?l$Iv
z1jh3!?+$SJJxID{Vi?$^^p-Js%KOegEm7H-Wwl#`ZcXB!n`|tQUdhg&=yo)n)8p9b
zLY57R(+Z@%=`fx=(Y$9qLrTY1nGN4qbxUF#LK$+8q%dAuHf4p2CF6yOd*Y(r)iU@Q
tu9M=Fc_hxzld>yKQI78h^AFQ==8nDvlP|vK6$iSC!PC{xWt~$(6958pMq~g0

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..f426e7224c385a53eb1640e8c0f4c3ad18a33bed
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhfBgUdUs1tNS=^YR
zQ`bc+kL{6C5RZn_<rudvZZ&}oJ0)*69Az<CEPb#0UDHtuljVX1l5LE8Sxg@DG#|Ba
znzJA+hV9Fvi+8+FG;mfd+Qc(kdm^ufvf_saf!yBgt}0o2ho?^H^0?TO=OEa4Kt)sE
gWb!0w%~R(XHi+l&8D(`<0A0f1>FVdQ&MBb@0P1o-SpWb4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d51784a3cf36aa79d80d96d90517a57079fa4b2
GIT binary patch
literal 168
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar-f_PTt6Sz=4B#rWtd<
z1_o0h>CY<{y*SDoHsz3PIuA!z$Lnqmjcd_85+B&OCmoo5E=sZ@?8l@~&OJAq!<8eL
zovkl$));MI+IH?hcd*yANot0|kDqUuQZnm6kyN8#h53WDnHTh5$lsrl#mK)ky|Xb|
RHwtJqgQu&X%Q~loCIG4tJZS&`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..201decc94be8e5274789eae488ea0ef24e72dd59
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-flPCm$cK!L+`<~HVn
z1jh3!Zys>@T{xPdpSwnBN`->qv;XQpIaa*d7^tpt<f)#_yIJf94*ImEaZY&f^bz9`
zfp16e?rci#vzpByGh;1}mPM!gGt~xJV|Ru^H&3_e@(ikns@;Aw8DuWIYJZ@mk|{wT
jEld2=dDiR=yU&R)xRb;8DkWwL&@Bv}u6{1-oD!M<Ie|sO

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..97341db402fe622bc39bc7e8784b54571dcb92eb
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-flPCm$cK!L+`?lne>
z4Grl+<pr&N50b8VOE*87{;h%iaJA5c3sI|WA01z@Q2u&i(JRMab?OSNpS8{lrF<xo
zVr4xLrMIgo>40E}87IquH2$uOg&fgLHxD$iR2qB5g<5jmxVWc$%XxbR^)uJpmH5}N
mvdnsUtF>g;#D~wVj!W}>&B;36_;(r5ISihzelF{r5}E)Xph(~V

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c091e3f91033db6eb61501731b570fdfed3e3e3
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-f#PTt9Tz<|SbrWtd<
z1_o0h>l9Z12S;VXC$<{6e~gLvb6z!Jt*QCr2fPw(oWCo(KCr#5Pib)TiMw;wVe%On
z$ra)i3W2P%&Nwa>QxV*rc0lywSqG+#DQr?}ChgH$7_=<;&w8;rKB9(qqYm`lkV-H*
jb4|D4>j|stFAVK3oyf^5SYiGS=oSV~S3j3^P6<r_E%QbR

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..19589ae1016b4f929b62347548c338f22be68fc2
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhfBgUdUs1tNS=^YR
zQ`bc+kL{6C5RZn_<rudvZZ&}oJ0)*69Az<CEPb#0UDHtuljVX1l5LE8Sxg@DG#|Ba
znzJA+hV9Fvi+8+FG;mfd+Qc(kdm^ufvf_saf!yBgt}0o2ho?^H^0?TO=OEa4Kt)sE
hWb!0w&6DTa88#H>Wa(52^8lT~;OXk;vd$@?2>>yYKfV9}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f24f73b9206b1a57890122ef7575f146d96aaf0
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-ggPTtGQpvciW^BSW@
zOv9`e*_eZzF=saKh~aTOpl!!}xcU$4jN(4m`x$((h6%Q+oVo%3tJzi@x!Pqd=`mrZ
z4f94O^Bb!jnk+l6GqFEfEg9feW0c^2W@4ko>NR0gCum+a_!q|QwybBzyr=`x8_f<R
l%n0A^a8tSY`<&D9axWrsvI^8+J^{Lh!PC{xWt~$(697-7MS=hT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..89313f30e5c72e2067a46735466059c58985adb0
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L+`?lne>
z4Grl+<q53n35MCTwi$*v@Y@@<{a2Cq*;_7|HTgzh@T4y?pW03dyr|}9IMuV-iaVfr
z`e~jA2i81XVx4e!PV>1s2Cg${Y&j}&vve6O)4CY0N~*5gHHWc6;GX%da{dPwdafxQ
s?2Keq;Q0JPf67_@GUk-+6^c6<{+%wEEcPWp59lZcPgg&ebxsLQ0D1yPga7~l

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..684b05b320e53bae589750045653bcb83fd0ca16
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr-f_PTt7d5WwLw^BSW@
zM8m9>nK3+TdwxD-7EdmeeQ%)<;35<6;;`{v(vb%7hzTtBO0Jzcu=&vRHC_+S%I%Rl
zC?#>L(eJ_BM$rwWY;kjfHcc_<oGD?yeCd+QEYt3C^c+~tXnwk-&hh_`V?NJW1q9Qd
UdIhZh2DF^P)78&qol`;+06oJ&zyJUM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..68935ecf518512297f2bdb73d1fcfa9873ee2b30
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr-fl25;m&V8HSCmfV2@
z%x66ATsfYxd{q}mLh6UMUPB|-Bc)7CZC_cHnf6RzEqrh`Z7qw9^q+%T?Dw8LxXO8L
z!a|-Br+b_cj@$eWbccIAo1|tY{P6wODLJzyq?R)&KM8G^ZLm;J<I=I;OV07DE=+%_
TA$Z3TXg7nWtDnm{r-UW|fL1}8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..02146e6b74fc1b9569919ad1b2a012fe902cdb10
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-f_PTt6Sz<`5grWtd<
z1_o0h<4VKhp(2qIKRh(|J)XzTa@O+rrLUnZBCmy%+4dZ4Qu(lGa~hkR=)ROlCjD;@
zZgPYjxWKoCc|MO$<65H+Po@YhUE+7<zz<7Z*11+2=C~!W+~eI5q4tIQ*Ku<<Df5<s
W49AQd#x+3e89ZJ6T-G@yGywoQ_B^lv

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb033a0920ac7503ac72545907354fc1a5c7df4c
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-flPTtFTz=5N6t{HR0
zj)tude74W<oF%|lzw?k=&HP_32Af|ii1Bp&<h=7)lEK`tvQ*Ha``jGHE82frQ-m`f
zHm7NOD9TkHkS%1H;G!eyFgbXVxoXL=k^}cM55Bx27`%na?}#-6x3T;F19#P{8DBqH
Zn%`28;mGXEn+kLSgQu&X%Q~loCIB6QKW6{{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9f9e150eeb52895f1ddf2cf6c55c1826f51d230
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-ggPCm$cK!L+`?l$Iv
z1jh3!?+$SJ9Z0%nVj9@B$hIcA<-g070I!LwUN2X<qL{CCTq_{El9eIVO*x&*<J`H8
z>>HA=6})=3hVkUf=01LgqBCLqH>{dMt^5|KHHf8sV#q9<nh|2j@L@sa+pL{?nJr8n
yzfnBc_>-Ao`AqkE#k{%=><aovgtTAoxU(;|WOC$^MMglEF?hQAxvX<aXaWENR!ltr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8d43f32105b637eeabfa8e4cd6d037f6baf26cc
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTtLXK!L|)<}}8b
z3dSt&HxERO7`p|#RGj#pJrZ$e{%-Mea@G4>jsKxi$3K27lw8Eo&@)q+Q|rghGYqV0
z+~TtxWQ*BO#xXFaZD)HGA~VajA?HjJL+NF&xTSL#Wi;+xzE#bqk&%`^K_h7!1JhBS
kw@#fo$-5P_S5DlUudX|(AS=O69ON7ZPgg&ebxsLQ08KAJr~m)}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc8a5a238b491892631f0e4c88c70f655f503170
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L+`?l$Iv
z1jh3!?;ddZ9Z0%nl9?>%$ai1jas8zJCHJiPw|ZU;5PoDb?R7vU$C1d*3<_sf+_}lr
z^|@#pgX>O<?q#*UZ8ulvFiuFmX0+m@#~tH*#*`T+nMD>)T@mt=IYD91_O0>^O=)-j
tGIPujXRt_YOH-8RyTSb6fQ#2hUa9>BlMj?;?gcuE!PC{xWt~$(69CR<N(KM`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..34dfd51cfad8c1bb93740b50f47447ddc088062c
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-fl25;m&V8HSCmfV2}
z>@z0*P}Kj@WHT*om6nS_7`uN$a?b+G=U>@bOinW?Grc*%TbOV(<s^$v)*lCB_OK@j
zH@TuFEaZ98vPbwr%bKYTs>^dGdRuLj<k-J_X~HGWoo~YuTHdhk;1K@B>bS2^=Z<s<
cd%QgVV%{9bp!4&W0Ug2M>FVdQ&MBb@0G^pZ&;S4c

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..adce7309388971a64a44fdfe7c27ed45f474d274
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-flPQJ}~z<|Sb?l$Hh
z51D?7ZE_BK!4j!c>)@SL8}h5rQRsbVMvLLGPtLMJCsW0{HeY34U@&=7GE>%vqK^!r
zo^y@{-#K9DK6NjH%#5vaCIwb<GkqDX)A|^$N~&sx+A&PYxMzAxy1~;p@;`&{GjWFI
qv}I)rYhpGCU+6y&AUx@NEwl0Sf~>5~i&=qAV(@hJb6Mw<&;$TkBSrlH

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2642eebd04cee1426a6f56c854369eb6449310d
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-gg25;m&V8HSCmfV2}
z>@z0*Sg8M{$!6Lz?@&diLU#Xz<emkFZu2evH8rHoOmJzC-Kog8W`@qp2G?HsjAsYB
zWOSk(xs9eYzL^ltG;6|Ep$$)_=oWcen=wE9zD306mg4rSTs;%^GKeQS?N>NqZuh=M
fx4`O0)qY0t>YTYs>*ikqx`V;f)z4*}Q$iB}jnG3B

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..b986b35910a0ba7bc398e04394fb0e7331fae351
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhfBgSnFU9&pfSI#v
zcH<5X-yCi`=B^7S(-Q-mFE?<q<m4SoKft2HHL*}%sM?TO?rcj;TcU$L<JlXB5)7H=
z38*iTT+X<+!sNS<Q3BJv6*`9>d5JKe^5C$ExN?YBLn*LWa$QM)OH&#Ta~B7TnrG$0
knJ0MI%pM4+-jrn6b|NS1a?b=NplcXBUHx3vIVCg!02E|BmjD0&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..51d3ace5f0af45afd468c8c20f29b1aa808db531
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-flPTt9Tz<|SbrWtcU
z1!I;<*$J+h2f8i&gk3v=HS3Z;%TI6EdhMgLu++gVt-oxU78vnspJVozG*hV|qEWsu
zq*0}K!U|TuGixOSj=o{EFeql5kTCV|Dj}^@sR!j-6H->qXur->c1Eh<q(Ss{hpWof
j48^aDO0-`7uViL?oio?;$cc+Uw=j6R`njxgN@xNAru0ME

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..44c38f8b0e8e56b0ad36fdf8b4d701ff5df490f7
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-flPCm$cK!L+`<~HVn
z1jh3!?;ddZJxID{vT|crz%AxZ!$0aje=NKf6(uXbx?!>9mP0S~vKi(aQTdX?c(KAV
zqd~)@@91I6Mx||P(F{2qs{BG4ebJ9}8$=DG8&<5D)S@ZRP&A`_{Wj(cn#=CmJG56Y
oE=XLa&HXU-fYG0hPomF-MZI#ePT%R@3Um;Ir>mdKI;Vst0IXa{hyVZp

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..8323d9362e61d006bb87f1b827f78aeda4f552d4
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-flPTtLXz<|SL<~8Pk
z4GgA2#+8PXw7PWm6*)HVV3%P!lM{QS&CzgwW4ayl14Xs<dQ2G?XBszDweFvg!=zht
zA%|7-h%)~U<vxZ<9ZQ)qio8B8YdJTA?}xRn#ayeTuCN20KUfkHpS=*@@jIp9=egI6
Yc`fNrZ?>Cp16{!2>FVdQ&MBb@0Nn~divR!s

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a8a1050b319b97252023edc249be84d30036233
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-f_PTt6Sz<`5grWtd<
z1_o0h<4VIvT3tFk|2#DJJ)XzT;(BDpu6<n%Npq8qG>At`V7XUv?bLzIho-ObdT>^5
zkJLdaiCc~H4p=j5C%op_W3e<v^QB5!(w{lgCi$svc;lA9634qEQtb=(ujA&+b}_by
Wq(9wOf4&fCJ%gvKpUXO@geCwzAwequ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..8581ae840683b6834c4f27b89c41b49fae26b77e
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-flPTt9Tz=4Bh<uz7;
z3k-%rrm@LClulcHyme5mL)MNlZQHhW{ZR%U&vb1bOET~qS5^u-bf22Tc*VQMa}(c|
z8_j9T9*J^q8?2vkD0D_@HK;9DS?~Q~%gcuOmz#oDCNIlinKQ$mLF}~5U#9Z;JpcB6
a=KZOi@pFZA;#8m$7(8A5T-G@yGywpczCexu

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..80d0dbaa6d92e75accef1d6c43a965cb403b1692
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-flPCm$cK!L+`?lne>
z4Grl+<pr&N50b8VOE*87{;h%iaJA5c3sI|WA01z@Q2u&i(JRMab?OSNpS8{lrF<xo
zVr4xLrMIgo>40E}87IquH2$uOg&fgLHxD$iR2qB5g<5jmxVWc$%XxbR^)uJpmH5}N
lvdnsUtF>g;#E0*#?(+xc921FF`V4dpgQu&X%Q~loCIG_iM>YTe

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..128f2ce06f7dba0e4976e33638dd049b5611c80c
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTtGQpvciW^BSW@
zOv9`e*_eZzF=saKh~aTOpl!!}xcU$4jN(4m`x$((h6%Q+oVo%3tJzi@x!Pqd=`mrZ
z4f94O^Bb!jnk+l6GqFEfEg9feW0c^2W@4ko>NR0gCum+a_!q|QwybBzyr=`x8_f<R
m%n0A^a8tSY`<&DM$CzJi$vMU;{vizL90pHUKbLh*2~7Z+O-0xM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..05db2b112512f7eb0f2b1485a584ad72c0b7c395
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-fl25;m&V8HSCmfV2@
z%x66AOgVnZCsb7Mz}pAB(#a{aiu+n$Yja3kV|8PxQ09Jgp!@7B&I*$sO{si)P8{4U
zyhg!UGNZjlXhTcR)CTqSQ%<Os=CB<)pRIZ0isI>)EN&-uGl(ZT#Re?tt$$^cH!CJ%
U?zi9?bD-@Ep00i_>zopr0Fc)}(EtDd

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f12d4f94873f7b4ddf1dad425ee0c4eccea0efb
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTt9Tz<|Sb<~8Pk
z3dSszv`<M#LPZqMJQUgQ_~*E)L+JHuJFYaj8RahQb!RYn_VVdmhDjmII27U@xyzI)
zoRm|MY7{QcW)Cr(&mc3ylG&r+)XP%Nsb;bts-p_DLeG3QVJbT#)^O4&dcVU}_2&8S
bZRCEO&zLKE?EX!l8yGxY{an^LB{Ts5IWa*?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_pane_white.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_pane_white.properties
new file mode 100644
index 00000000..bd738f4c
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_pane_white.properties
@@ -0,0 +1,7 @@
+# Stained glass white
+matchBlocks=160
+metadata=0
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_white.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_white.properties
new file mode 100644
index 00000000..d762a6d2
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/0_glass_white/glass_white.properties
@@ -0,0 +1,6 @@
+# Stained glass white
+matchBlocks=95
+metadata=0
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..291d775ba975b67095173b1598943cd37ca9f6f9
GIT binary patch
literal 167
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr-fhe|&#`zg{AZfhomK
zvF3qx0Kbp28AF%@hk|s&88t8CO=>lI2VYyI{1<-g#dAGy$;^y&p=9P=Nt2i+s-z2k
zQeOEfMY2z+&s$J0KQYulM<QT}<Z`PnCeE}^&$7208u-Y~>|e*WM4Vxb`}30eZ_+(L
Pn;AS^{an^LB{Ts5bT2o<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..602786bdfd879900166030be3c0010cb938deb63
GIT binary patch
literal 126
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr-fh6BaPY{P^|WK9%dj
z!Tt3dyds%uH-EO6EIvK?iB*?L@RAv2W)rzQdSw@x2&Zc3<tJYC$&m<nB0G!C#C07L
Z!|Jf;^6VFx(m(?lJYD@<);T3K0RS8UD9Qi;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcae3d262a722f6dcace9c6b6e56df17c72c3459
GIT binary patch
literal 206
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn>}foxGd(fC7)p=E!X)
z8T9TfTi}+&o-bg?IGNSek?AqNh`Qnfxnl*#Yweb5l`A>VTq*PaK~%sBCbQ|f3<kzr
z)gcZ=etfnKGRE!4^L%6`%(46Ml~F);^A+Yv>lCK;afPtB9G0<lFq$XSs>RNbXR_W_
zcWXVv?6fO(LOC<k87$7;Ipq|=bAw&O$!BYZe_<V?tn6#2J8PbW0UgNT>FVdQ&MBb@
E0E9q9cmMzZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6388c76923fa7a571ca6ddde557f5f1c9e42009
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$aK!L~g?wZ>c
z4t#OdA7l#Ja{}fZIH|Q%SI9SsPu}Iv`3X<jKktYNmv!mV3g&*Vn5R+Bxc@rCfisz3
z{g^}^Keu5zVNh)GiOa*leeovFhPKEzjGVIOXN4F<jiVYC^%$*PCBt~~;-2~~_vIQc
y&spNi)IXE?K*lm{?n>hX{sp>8TCUYypLt&kJuj^@__PG*GzL#sKbLh*2~7aD?Mf~H

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..025cc5d389388a406533d6fb4b8406637e3c387f
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtMi5WwMj^GvQx
zL({dUSuK(GIQ*7PHEhX`b9COpzJp~)UuoVE-sYq_=3G1G1%i{q#TmD}I3ww>_fWit
zS)-U;#<nJrM-$oa2)Z+P9tmPJu~e-Lc1rhQ|1(!?j-RZdtM&tz9L9(lmcLlv*-5_H
b_nG+~$8BYs1LstLj$rU~^>bP0l+XkK;nO|;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..63222ea740307f1b6393438214dfebe699c5b19b
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HQsbKPZT
zi3n>0<w9@&6RB@QLIoMu@Z8&A=(g<jj`Okt25a;s1Rr$jbTI3iWve~7_<(<!<p(A9
z^L`tecv2V0e)2jXv?-Kn-ku<(=~p&Na@4P1nh@Nsvszd}@jO#Z3ume0M6<qLtA6&W
Xs<)N3S$-%29l+q}>gTe~DWM4fx*|K2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..71a93f54e586e66c8ba69899f68536e4c4bbdc4e
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foqUk<fC7)}-8HvM
z8f1#z9^CwZ@8$vvN43>cxMsN}^U1q>p8s+6L#w=XT5~fNDjj(!Jx97LRN>hvE`~!r
zUS~xn^v+G@S2(QmaHaHQmK0_7opub960aF4yyb{`ZPB=@VT*w}_XP3qPOs_A46+Zm
zu3q|$??C3Uo6bz_KiL_SeXhrM%$9${`XOzjS{=juf6txn+=v7@m%-E3&t;ucLK6Vk
Ct4`Yh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..453b86820e617591c636f5b25dbd9e87e3079b04
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c?wZ>r
z416)wAABD1<y^36oP5<JH+e;aOkEPse^0v^eQ$GOO9iA?IqBNA*E;UxezKR9A@Nw`
zTsDn!rz=@DBu^`tB)cK$-rRF_3`J+M*w(1Ln`O!%nf8g{sD$ddT{4Uk9Pg#y?q(M-
vS-j0dz|fn)BC+kCQ{0~f^95_g&X+LeE_*E5nDO!t&|M6ku6{1-oD!M<2jNMF

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..c88f7b76a37b34fb1d119dcc986cacca4b541518
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PTt9Tz<|T`rq1mY
z2CnUzD<<Ahly;eSVDizasfuR;ZN$a?7jssu%lG+p?DYjv=4Zv~3proapJ$l5BeGDP
znbT-;x<c3kwrWui1NM(m4;*4<F{U0-XD&M;BiXU}R9YzKOe5aMTcZq&Qjfg7!W4Go
m7DIF5w7kYm?qNIKCd)f6zV~5Ac4HvWISihzelF{r5}E)w^F`wT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..41de66320dac3849cc4370c992470d87c53c0f76
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L;c=9=3j
z416)wAABD1<y|mnoP5<=dNoJUk7E-5C)cp7d%Vu~(n^U*j-t1U^0Z7J7O06aup4WZ
zPiuIyXO50TnBKQXdGQAfs;Bxgl%0uUW9>O&`&sBf+e}*rvnWrmsrC%4hpMB0Ga6(p
tyJ~-+p^|BVa9W1grDqMEDN?3a*^7TamfV-w$Om*4gQu&X%Q~loCIH-ZNc;c*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f58b21e9ba7396eadea2e995e3cb43bed99ff73
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-f#25;m&V8HQsbKPZT
ziA`lEdXDh_U2uwZ=bD+TI)t3r(mOU7DqJqLsa@c^gK?JQ@{e;ouP|==@6o`!v!Ya+
zk=H6*WkK9S7Dqml8_kOZRTT2yE=W6}&B&P2$s#gmQ-z*p@@2t)e%^k|d3LUGdmy_>
q^g+VR=*Sf}CrlJh7kL{$C;rOs$1A*e&&U8>#Ng@b=d#Wzp$P!2iAYWW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..52c0adafa90be303a378fbd30ef35032e6030b57
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhS8Tsu!qIX0#F2K1
zh9hE1qUOwng1ap2n7b~ROiv7MKi$B|l9T6VmSD(u_C?$GMY|IW`Oapt#Iz+k=rf+R
zIGkYEC!oGUaysMQ3X|_bMhQ&wR_Gjl=9R*H%7eqE;>w{*j)I-DP8X;yQ3^6yEFIvY
vVBmR*`|Oct9&8z9_nMgX-44I_)Xwm`^YIEpi;1m3cQJUn`njxgN@xNA4-!Y)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..623d894a911e6ec6811e9b5ea781fbe3dc0dea5f
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhS8Tsu!qIX0#F2Ih
zkAOQoM_e<KqCZFmv@F}n(=9cJ%|{`j*w~I)Eg`U@r+VUzZpjZBYEO)Kn5#H5j)}1W
zxh)ooXDxVN99_I~`UFPd4=$;aV&RJ<0^FP)99$%p=OEZQ>vX}=W+fq$WQhP51q07h
t+-F_V3^p(>c(aF<J+7zi;!}P`2Jza*E9T$XEDm%RgQu&X%Q~loCIBQYMkfFO

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..2b1cbaab3318a6a1bc360d500f96e1c0a77560c7
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtMi;K0##^GvQx
z!=otfETOUj=Ep4NGsTWc9J>4{|J@J!IL2*HXKcSVf7S(#Wzj3{D>G<)-tfq#L1m^U
zQ-|meL3dFPBlgay2S@JAVhlYa*T8I?&cGRFxkhVY&@#rlaBjC{U6mEO3CGtk&fwWx
n${k{BRB`TS$rkOG|0@}v7Tv#{RP$8@=pF`7S3j3^P6<r_BlkzI

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cffa1b6b2d6aa6decb08f6d7a1133c3e8de5815
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhS8Tsu!qIX0#F2Ih
zkAOQoM_e<KqCZFmv@F}n(=9cJ%|{`j*w~I)Eg`U@r+VUzZpjZBYEO)Kn5#H5j)}1W
zxh)ooXDxVN99_I~`UFPd4=$;aV&RJ<0^FP)99$%p=OEZQ>vX}=W+fq$WQhP51q07h
j+-F_V3^p)|q^2{>io3spKeR0#=o|)5S3j3^P6<r_im5=@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc6aa7171051170d5ddc0fce11f02b28c9f388c3
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhS8TsO#f{PKh(pt(
zGzC2;@#E<Zg0r3(<-978G-zx%d-ey<j0Rstp?620H*vBYN@TLr{~~n3CrH9Xc(LSk
z#=R9L--V14nC7j}IsD9vEon~Y(S(XCMhP1`CC;Yq*c0H=l~%&s#lfQHS-EiL4Ieh6
e2Lh@$B^f?{xm_<+e1Qk(4hBzGKbLh*2~7Y-xIvo$

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..eaef4e79ad21a319a1d492d818da8dbadc95fd08
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhS8Tsu!qIX0#F2Ih
zkAOQoM_gY#`oW{&bUCKYS5}W%O<==L$@z@J8#G-G?fnsB(CA>{bKrSv9MddMuI98P
zlgCC2#QUGcIkEX15T2TPBj%(-kMTwcp8hB{9W%kjJ9(yycX?dw$#W2FJfNbfZz4SV
hq=d$aQxD$oFa(v|t~aXs^9kq_22WQ%mvv4FO#m$5LgWAd

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4633b238534c7b61e6f04d3afa34e56395cea61
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-flPTtMi5WwMj^GvQx
z!=tTYS5(eC;>b6O*XdEL*}8-Gp<Eqf-`hFfzukQ^R4xm>s$g+Ql?$84K4FQGE5k;i
z_(v<4J-;bj<d`!f+Im6PP3D4xXFLiAHQTSMhTJkaa6a?kiV#Eoe3myeOc^GpZmVlt
g<<Djx_wyQSkkoBu1?T-hcQ7z`y85}Sb4q9e0L6wvH2?qr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..85f4fea22dafce8ffb03e10a4fe11247aece01ec
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhS8Tsu!qIX0#8Dm<
zjXbtTN<lmtPM2fcy13N@Htdv~&nUb>)8)|KA29}v4i-KKp0~y^&GO`GPD?U*Y_veU
z|5=<9o6iB^si`+&PCE1$Z<OHak7Cm?6I{HLXS#To$HksJ2f@YzDw_HxlP5`Qo;t_C
YX?|N-@z{)1pbHp0UHx3vIVCg!0KUyT6aWAK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a12c184b440341a9fe4ac9b8b67e188af9dd091
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm<dK!K-qbL94y
z43<xBH9v2#-r-otq`q1tYR$9dmNtSPYuk>nA1~Xs&T56ks>xDcQva{K(t0^^D}%*M
z&mD`IHhnJI#1Of|qN}}@@$j3_Z45UIy=^rTO70l1W-vSRhH;ajm(Z#|3>p{qq;Jt@
zXimHIkCE*RH^bbtwoMc2*xs<2C@zcIGTkDco$Yz)qUB#2fKFrZboFyt=akR{0MRK=
AApigX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..6161cf290f20f85af83a7ef7a046ec229236a1b5
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhS8Tsu!qIX0#F2K1
zh9hE1qUOwng0pUj)v$>y%+x!)h;2EeFvpEMJvj%Gm}Xt%eeas2?`EFB)L7s!-Q94(
z^oF#Y#0?U&#Wz^)<!N6S!TaLq;+@kcFbaQgNtF}}UnCLW=Jep;qB27rS&@k=cJhQf
wX(>4xw=uf1Fil>v=YmfP8?&@SU>O_3hSJBSjQ`s>fDU8uboFyt=akR{0Pw;?$N&HU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..e17b7b38b14fd229f714ec873a7c0708d28dc266
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhS8Tsu!qIX0#8DoH
zB<_h_vm1AGh%k3uFquB_Q4=RiPM(`tf+6GC7j54c?M^V{JDbT8)0XI<&v@42aDri<
zfcgr_>5O|TOuh>lB{0ofp>z0|R|@kf4-T7(D~B#Q3U<yqU7)%|Dad58bbyP3f#)gi
hvrC@1b!{?ckoUXy;m2W@%|Mqhc)I$ztaD0e0s!thLoWaT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..99d1a53b3012350600ddf37e11390d856036f373
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fhS8TsO#f>vf!LiU-
zKzw47gW#-ZMnN$KjSXkd{@|I>;HxO~?&$L-PL@N7Om_NTgf935Ntg&PmYmMGx5DJR
zkWm8DycIf!pLww*&FMUvP;td5VPmJn+0-3-0$jS%N|?JiSkyc#7tR#hDX7iHP<QuM
V_VyKT_5iJC@O1TaS?83{1OQ8lJh%V=

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..3543bc41c857ff0b5d05278576fca3d1919fdd06
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhS8TsO#f{PKh(pt(
zGzC2;;oD8;8<b4Wrbb+OV3NSZID7U-Ndv}ir<6P0N8-*jxEm`@Pn5Xe?O?pkAmU7e
z`Vr2|W0?;6a%cCp@XTmX*E+pnhtSamBOxY!v8@HnT^?6r+O%awCN7XX+@QqN=ou83
jp=Q*ao4CNlnwddB_}+*5Yesv3j$!b0^>bP0l+XkKG_pXz

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..35986d9014b421019005a55d1a503de21ef34b45
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhS8Tsu!qIX0#F2K1
zh9hE1qUOwng1ap2n7b~ROiv7MKi$B|l9T6VmSD(u_C?$GMY|IW`Oapt#Iz+k=rf+R
zIGkYEC!oGUaysMQ3X|_bMhQ&wR_Gjl=9R*H%7eqE;>w{*j)I-DP8X;yQ3^6yEFIvY
nVBmR*`|Oct9&B8ji=`OqWbgYZ>`a~mbP$85tDnm{r-UW|;pIY9

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..f328c50223e50a2ee573b1fd4819c0543c5da080
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PTt9Tz<|T`rq1mY
z2CnUzD<<Ahly;eSVDizasfuR;ZN$a?7jssu%lG+p?DYjv=4Zv~3proapJ$l5BeGDP
znbT-;x<c3kwrWui1NM(m4;*4<F{U0-XD&M;BiXU}R9YzKOe5aMTcZq&Qjfg7!W4Go
o7DIF5w7kYm?qNIKx<4{I{=e_DNA%h{pnDiRUHx3vIVCg!0Ez%c$^ZZW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..219ab34a0cad61f7717192bfc8b47c4afc57f3e3
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhS8Tsu!qIX0#8DoH
zB<_h_vm1AGh%k3uFquB_Q4=RiPM(`tf+6GC7j54c?M^V{JDbT8)0XI<&v@42aDri<
zfcgr_>5O|TOuh>lB{0ofp>z0|R|@kf4-T7(D~B#Q3U<yqU7)%|Dad58bbyP3f#)gi
hvrC@1d2RZv$RNM!zRz@XNsv<*JYD@<);T3K0RSI8LLdMD

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b7580a052cfc5d85846b6027d22731a5c677128
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhS8Tsu!qKr^;o;GW
z4`L=Y9gH4J1UqLp?%;@(na}8&G3)e(m4{OgurQgKKQ>NaGHdnNAwHj5O@O1F^T(bG
z-VVl|i5Gl&(qh=YJi2(t`$Pk0#iC6-v$Z8V3f07#9|oRoII5OpGX3EvCqd0w7kM?5
p1ZJo_ZB0uumSi@uUOus#F}(l2&xef3^MEd5@O1TaS?83{1OOD)MeqOs

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e202ca7659cf8f6761621ab11773b684e882ade
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c?wZ>r
z416)wAABD1<y^2}oP5<JH+e;aTwM~+e^0v^eQ&2MyVWThs_J<@aehD^Q|)_3hna;T
z>5N_<irz8G%rKo(!k#nZ`-08#4NRM7GD>&0r*S*<%~WzIbn9HKSIwZ;^1b)lUFHar
v#alf#Bwb_RI27}XyYf@>U51&uavpklOpi<TmN6Ow-NoSP>gTe~DWM4f8|+B0

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..811321be5f326b5791a488f7c0d9e71ca07bc268
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhS8TsO#f>vf!LiU-
zKzw47gW#-ZMnN$KjSXkd{@|I>;HxO~?&$L-PL@N7Om_NTgf935Ntg&PmYmMGx5DJR
zkWm8DycIf!pLww*&FMUvP;td5VPmJn+0-3-0$jS%N|?JiSkyc#7tR#hDJX5n!ccE{
V>v+0H_G+O044$rjF6*2UngDByJ6r$&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f0e33f9736ea3e7db2e89fd5c8bc3882184c02a
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQsbKPZT
zi3n>0<w9@27pZSULIoMu@Z8&A=(g;&#B)9liEH9L93Nc7jx>tTHWmJm@qzucOvS|J
zboB_wHlquCm8uDxH?<i3<1{CFzq-NGvj2L}hLz6Ku5$KFNN3bL)Us=VhxGfoR`yd)
W-Z~z2a9%mkeg;ohKbLh*2~7a4I6mM2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f6854a0b489f54ab5acba5a0ceb678f814e39d8
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhS8Tsu!qIX0#8Dm<
zjXbtTN<lmtPM2fcy13N@Htdv~&nUb>)8)|KA29}v4i-KKp0~y^&GO`GPD?U*Y_veU
z|5=<9o6iB^si`+&PCE1$Z<OHak7Cm?6I{HLXS#To$HksJ2f@YzDw_HxmzB(u4!1LW
Xo^f0GeN}iE&;<;hu6{1-oD!M<*&IA*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0a1fcc43e7cd9e10925f43d71747488c2fc5cef
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhS8TsO#f{PKh(pt(
zGzC2;@#E<Zg0r3(<-978G-zx%d-ey<j0Rstp?620H*vBYN@TLr{~~n3CrH9Xc(LSk
z#=R9L--V14nC7j}IsD9vEon~Y(S(XCMhP1`CC;Yq*c0H=l~%&s#lfQHS-EiL4Ieh6
e2Lh^*QVgGG+*US!n0^}Q4hBzGKbLh*2~7Yxl|e-S

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..9561168072dc6ff4b5ec13ceacd857d204979678
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>~~oqUk@fC7i>?#S&g
z8Dw^Rdoc5e?2QG5Olqq$vlfZCR{uE0@xOD$?Va(HO8-pBsq~n9Qjz;gloX@G%!?;p
zGA-I%yn^w~4AVKQEVCU-el2*++aR;~D)Y9!gsFY9D>xT4&a`omiBXjbHDid$h}#*Z
z_ntxQ?2T%V4GI4k4rD&N6wfhP{te>^?u|#htn|!vr#vs!lV2(bbRC1ItDnm{r-UW|
D{<Kf^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..a32e9aef4f77572687e4111e05bfb52e35deaf3b
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhS8Tsu!qIX0#8DoH
zB<_h_vm1AGh%k3uFquB_Q4=RiPM(`tf+6GC7j54c?M^V{JDbT8)0XI<&v@42aDri<
zfcgr_>5O|TOuh>lB{0ofp>z0|R|@kf4-T7(D~B#Q3U<yqU7)%|Dad58bbyP3f#)gi
pvrC>Fa}IFc@bGAcMC?BShB><)`>fpYIUMLB22WQ%mvv4FO#nd^N1^}#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..35ae12166d3a06ed6bd47d5f4abc5d7da4a4c30c
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L;c?wZ>r
z416)wAABD1<z28~oP5<JGg)w<%s#_o|5fBYkCzpNONa29D*Dyltk)`Uw8$1?Xpx+1
z?d?z)cTQ}9hPeC14eL)DR8RF~C^{3xW-8fP{Y<ri$GEZ~X^YTQEqex@mhW4>u{vDn
vSzXV-_?d-4{mccOC-a%hm@Nz@2GuZjK7U-=XXZH#=r9IPS3j3^P6<r_<cdXw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..532325cfd9f055da335148b5e84f0d3e2fcdbc5f
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhS8TsO#f>vf!LiU-
zKzw47gW#-ZMnN$KjSXkd{@|I>;HxO~?&$L-PL@N7Om_NTgf935Ntg&PmYmMGx5DJR
zkWm8DycIf!pLww*&FMUvP;td5VPmJn+0-3-0$jS%N|?JiSkyc#7tWk=r-Gwn`-21B
f7Y%m(QDhKuxv#u=%lTfQI~Y7&{an^LB{Ts5&+bB2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..f900cfa7c860a403eb9034d99f0ddc1dd93234f1
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhS8TsO#f{PKh(pt(
zGzC2;;oD8;8<b4Wrbb+OV3NSZID7U-Ndv}ir<6P0N8-*jxEm`@Pn5Xe?O?pkAmU7e
z`Vr2|W0?;6a%cCp@XTmX*E+pnhtSamBOxY!v8@HnT^?6r+O%awCN7XX+@QqN=ou83
qp=Q+F$ZNrp^x#1EMT1>`6d4xtKlW)ql(iD*CI(MeKbLh*2~7YwfJGkw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..b0de565cca7961bb68bbed65a31a0bb557b894d2
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhS8Tsu!qIX0#8Dm<
zjXbtTN<lmtPM2fcy13N@Htdv~&nUb>)8)|KA29}v4i-KKp0~y^&GO`GPD?U*Y_veU
z|5=<9o6iB^si`+&PCE1$Z<OHak7Cm?6I{HLXS#To$HksJ2f@YzDw_HxlP5_#-mK*2
h+atld__RC|L)+r}^;18ED*~Ou;OXk;vd$@?2>|!}KHLBR

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..3764a5580fd58c35edcbc1315f6c0fe90ef01a32
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhS8TsO#f{PKh(pt(
zGzC2;;oD8;8<b4Wrbb+OV3NSZID7U-Ndv}ir<6P0N8-*jxEm`@Pn5Xe?O?pkAmU7e
z`Vr2|W0?;6a%cCp@XTmX*E+pnhtSamBOxY!v8@HnT^?6r+O%awCN7XX+@QqN=ou83
kp=Q+F$ZO%^S;oeo`v1O<6QjxzplcXBUHx3vIVCg!0Amk7_5c6?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ab97a6d06c634cb62fed9fe1a8465dcaca46dec
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhS8TsO#f{PKh(pt(
zGzC2;@#E<Zg0r3(<-978G-zx%d-ey<j0Rstp?620H*vBYN@TLr{~~n3CrH9Xc(LSk
z#=R9L--V14nC7j}IsD9vEon~Y(S(XCMhP1`CC;Yq*c0H=l~%&s#lfQHS-EiL4Ieh6
m2Lb~52OGr~CzkwlW+)WCUw_f`)oq}27(8A5T-G@yGywoF!$leZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba3bc7ca7ae6a907d0dbd66c0c7fd1d442cd086d
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhS8Tsu!qIX0#F2Ih
zkAOQoM_e<KqCZFmv@F}n(=9cJ%|{`j*w~I)Eg`U@r+VUzZpjZBYEO)Kn5#H5j)}1W
zxh)ooXDxVN99_I~`UFPd4=$;aV&RJ<0^FP)99$%p=OEZQ>vX}=W+fq$WQhP51q07h
m+-F_VHt6z*q@)&<u`#q1-S<&jtSk(45re0zpUXO@geCw-_CX{7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..550073916768ec6fa26fa2b1b5d7cb4acfd48577
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTtMi5WwMj^GxnN
z29YgdS5(eC;_zEG)vzT$&e3@X`wkY1{_NZ%yv<2<%(-^V3j`;Ji!*L{aYoW%@1b}P
zvqmwyjBQOKk0!F;5p-wpJQBocVyRjg?3C`q{%5Y(96wn@SM3KbIgAlAEPt`Svy;r(
c_qmGU?wVW24Rv&v0A0c0>FVdQ&MBb@0J*n4iU0rr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff822911421b7247ceca20b4f4cdaed995d07e91
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhS8Tsu!qIX0#8Dm<
zjXbtTN<lmtPM2fcy13N@Htdv~&nUb>)8)|KA29}v4i-KKp0~y^&GO`GPD?U*Y_veU
z|5=<9o6iB^si`+&PCE1$Z<OHak7Cm?6I{HLXS#To$HksJ2f@YzDw_HxmzB(ujxv0<
XxpjQ)omr|t2QYZL`njxgN@xNApPf8g

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8389d70859e0b4345edb111599fc893d22d27a0
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|T`rq1mY
z2CnUzD<;l3s$8*YN0-u(nIiig{~T9+VD;>lm3@|@^2}`k$CVkhK5zJB)1Wd{lc{6s
z4<UD1k4@~IZV!&!xy2ZIMy`R`IGush&vK34!b{5->-@OgmUdNEC?_0W!#G1{^H=VW
dTB9Go&zWZ=-M$^|;|+2jgQu&X%Q~loCIF)-Ln#0N

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..b81516bec6233e40b6c1c9c2df8c489e6bbc6d18
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhS8Tsu!qIX0#F2K1
zh9hE1qUOwng1ap2n7b~ROiv7MKi$B|l9T6VmSD(u_C?$GMY|IW`Oapt#Iz+k=rf+R
zIGkYEC!oGUaysMQ3X|_bMhQ&wR_Gjl=9R*H%7eqE;>w{*j)I-DP8X;yQ3^6yEFIvY
mVBmR*`|Oct9&BEljT!1H@2|*_?l=N;4}+(xpUXO@geCy6VnXZy

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..0efca446515266a9cc68957c4c33b4d107418121
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-ggPTtLXz<|T$rq1mO
z2CnUzD<<Ahly;eSVDeE{kw^|^zmG8ycRmUi$d$`)={&tq)2e5=%0k9h_2(I;?uaVX
zX67`SoURb|fTdd0!+`x`)B}e-rp%{0!r9(*SQ-hWPrbTI$S76n*!`@7C#DEq59QvW
qe2q<lr}(v)Ms>=EdBs0H>lwmd-(O)h+jB3_NerH@elF{r5}E+qzeZ>P

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa3ab6b728eaab2131da3239ac38673869ac451d
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-fhS8Tsu!qIX0#8Dm<
zjXbtTN<lmtPM2fcy13N@Htdv~&nUb>)8)|KA29}v4i-KKp0~y^&GO`GPD?U*Y_veU
z|5=<9o6iB^si`+&PCE1$Z<OHak7Cm?6I{HLXS#To$HksJ2f@YzDw_HxlP5`Qo;=si
Zz&ZJLy=?KyLqI1mc)I$ztaD0e0sswUJZb;{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2d30509ddbe00ef40cf10ab9cf5fc2c8ce7f605
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTt9Tz<|T`rq1mO
z2CnUzD<;lRRj$~yqf6<?Op*PLe~zm@uvxd&)Go_WdFHl&<H`(LpSOInX;7J}$<#6R
zhmgCh$0qhpw+Bb=++qwpBiF!eoX)`MXSr5y;iYAab$;A#OS>woloO7xVVt3}`73uw
ft<jI4=N_|Vu-&dN`Pgw2=ne)?S3j3^P6<r_mZn4o

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_pane_purple.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_pane_purple.properties
new file mode 100644
index 00000000..59d80f53
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_pane_purple.properties
@@ -0,0 +1,7 @@
+# Stained glass purple
+matchBlocks=160
+metadata=10
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_purple.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_purple.properties
new file mode 100644
index 00000000..27d4480b
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/10_glass_purple/glass_purple.properties
@@ -0,0 +1,6 @@
+# Stained glass purple
+matchBlocks=95
+metadata=10
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..a17988197445f544e80316ec1a49ec9ded4b829f
GIT binary patch
literal 126
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr-fh6BejieE535ev-+b
z-|ZJ1CZ<h_b@wpdW#hSSv4^p1S7y5K%7!a96upcC+a7%q3p;zHjnVbq!dQpkBqI-f
ZhSJ#R^18}ZF+c+uJYD@<);T3K0RXihE9U?J

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..38885de79ea11da277fe7f04b546db9f7f752a76
GIT binary patch
literal 206
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn>}foqUk<fC7)}?%?Y$
zWMmcEbsj_(wC4oOIdD>IY16SIGY+!{{x^2}Ul`}V^3>dng=a$g>I?EULKtVC)@Cp;
z=Bf^HF!JNGZQwC(Kc43!Goi=s!&gQD-pyB-C#_SM+Q${ba-`KVs$olom&hs^h8G!e
z)lpgh8Rn#2u@ka5Bh1i~wri7s8S^*BE`ea(TfuYUH}S1;dR%yQ2hf2Gp00i_>zopr
E0I3&D761SM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..78b8685edb39ad1b6e33028b182d911ec1d9cc0f
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqUk<fC7)}-IduT
zeC#I_xhwc~IGbtsJxG~)Nvu=t;$e2d|HdjmA6l%x6=Jn<p;E}<>JDx%UxoL&3>?Pi
z?qxQ-`7@`A!8(moJ(5xT*^3Y}h7*RXZ4;J0UKhzcAyJKgLT})sHK*hnq|g3#|NWLR
zXI5ae$_+zr28*+IPB}&K++bcYc}CVnxkok34MHnQ(~UXofNo>(boFyt=akR{0Nxx*
AnE(I)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..f111abb0985133fcb54aa921a2e600472f277ee9
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-fh4Zhu+;>Kuq#G&a?
znu4B_`0;cH!CB9Ya$Xfk8Z<VXJ^O=aMuV@S(7U70n>bkxB{JFRe-XOi6C`0GyjXHN
z<K7CB??OfiO!HRg9De4-mNcjHXhOvmqlAr}5@%C)><Mt`N-JUR;$TtptXw$rhR-pF
c%rZ8HVvae=)=7V=fv#ZiboFyt=akR{0FR_UssI20

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..16827410e4353cbfa7547144f6d89f1d1fb0ce22
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fh4Zhu+;>MY#;8<uZ
zAU-k4L2%YHqo5dr#)h+JfAGv`@KqFgcl3D^C(EHkCOiEvLKl33Bus=COHOCpTVe8D
z$S8qn-U^+=&%D@@=5!uSsJLR3u(4C(Z0e3Z0WMu>CCptMENY&W3ujKbQ_<1%riOz-
XOLdO2Y`488&;<;hu6{1-oD!M<<Mlj5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..b69e09ea8578d5e88e020bfb57f7e4304c4dfd43
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foqUk<fC7)}-IduT
zeS8y~#Xjila5mHMn{ZNVY16WcGY+#~{FDAC%i`SZ)n4jRD>w>&uw8FU67ATziK)S0
zagZ@<O7im?%qI-ID_$K_VZ3?5aUFj{%8ac%9@b6Qto#;eDd?U#$@JuC=%Pzc864az
z-e#@b%Um$4@Y{p~iT@Z6a9sW>{^%KdHRGPhHJ$P%|5i9TI4?T{bRC1ItDnm{r-UW|
DWH3?Q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..696d771cf927ad7748d940638017ea77f6871bd8
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L+`ckuNW
zGJFRbS#2ioV3s!Vdyr!4ds{+Fp?$u@;rdDZdA|#{t+VRj4PCg+wtdTjJFK7XF*O)G
zUgO6s^8Bd{(+xv!i<5j2hU&{V%Qwhup2eu$xjT*5p>3v(gP~jJW<7TXwnM+&e!pX6
wIlDqv$mNU>gWrsW`zMIo-{8$yebhLXY1tA<&-b$y0o}#m>FVdQ&MBb@0CI{)#{d8T

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..39676be5cc87f8ce826b935cf2fbdd579811a958
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PTt9Tz<|T`re=0Z
zACJRB))f<PC`!A`J23g^)KtYYfi~h||BE?yyvz6bb?o&8QRZi#RTgr-sz1*#bw^~O
zIy0xy<aC9w2W-`%9tP|mqaHZK%wkMEqRw1)L`Je>^Qp8@&Y4EMkGDn{7^NP0dxa_N
o$SsEE#A$hro7}^8x=oh9Hf8>Ym@3E9K=&|sy85}Sb4q9e0OJ2gcmMzZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..dfa2b62481818ea0b890254fff1f8dbc01e5d2e8
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;c=F04n
zKE4ButTvN(G)tTKJV^O^>6liN%s#_o|5fB0AMeSYT%y&M641IWX115F#hgyo0|$Lh
z%~e&f)>r4AFtvN{j@#k}XW~+Y8)P?6b7WL5Jimu!Lt+~Lgx;`8K~MP|8b92-R>#0I
vEAuPALBc$S7cG*rTDMpx2+ef!{mRJkdx@lX^lnC=vlu*G{an^LB{Ts5Q0z&t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..85232a517dadc8178bb3ada62dee55ba4ac70e17
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-f#25;m&V8HQs`M!(R
zRSeE@Cwh+X|6Op3b?2Iyt2%_7+0r{U7%E&Yw5wg<yMu9-<MNL&o>v&R{r70#-C0qp
z&B$vNuCgHRA&VoQ$&Kbkf+`C6Zx^JU&}L*z>0}X^v#CN)Gx@UMKR<83<vcsrxIK{F
rB>Es>W_09=n-eAqr;EIepA(<?d&!D}&wJZ|PGazM^>bP0l+XkKun<V(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ffc019f465cd7cff15095105e572a223560f150
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fh4Zhth;pn)0;z+wh
z!x1qhQFG=(!Ce-1%v~2urY8ospKjn}$;opwOE6?S`=agpqTLCGd}lLRV%icN^cl}u
z98NIo6Hs3vIh}EDg~@jzqXedTD|8M&^Gabp<-uW7aplk@N5Rfnrwde<C<U1;mJV=H
vFz`IZefG#R54Mc5dri#xZiiodYG;_xxn#vuE_oH8yBIuO{an^LB{Ts5)Wk+r

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..58eb303e8756e090707d4c2316563854f48686df
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fh4Zhth;pn)0;z+xM
zN5CDPBd!@q(H|rOT9)nP>6V(q=A)2MY;4D@mJry{Q$6uUx8#QmwI@bA%vGEj$Hdrx
z+!hPPvlhHBjxOFgeFCHK2bWYyvG7F_0d7tY4lWYQa}eyDb-G|_vyzZWvP6K3f`R8L
s?z1jw1{)X`yxGIb9@o=$@hLwe!<xJ$E0}N11UZkv)78&qol`;+0QfdVW&i*H

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f88c043627af9c9a0736c5250e08a564648c6f1
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fh4Zhth;pn)0;z+xM
zN5CDPBd#wV{ov7Xx*XHyE33z>Ca__r<a|cq4Vo^8_Wp=5XmqgfIq<wSj%k)BS94mD
z$z!7h;{DI!oY;I02v1GD5p&X^$9SUzPk$7fj+x-%ojlXUyF4!T<T(g79#GNLHxZtF
nQewf)N^ZVA61<B~%QG=l6)m`(&bi|(&_N8Iu6{1-oD!M<em_Gr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..c52be72633cfe30de038e454f59481b747bf2861
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fh4Zhth;pn)0;z+xM
zN5CDPBd!@q(H|rOT9)nP>6V(q=A)2MY;4D@mJry{Q$6uUx8#QmwI@bA%vGEj$Hdrx
z+!hPPvlhHBjxOFgeFCHK2bWYyvG7F_0d7tY4lWYQa}eyDb-G|_vyzZWvP6K3f`R8L
j?z1jw1{)YfQqvjq;})!#lfPv#&^ZjAu6{1-oD!M<YKlP!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..c60f717e55bcc67a990f8542be25d0bd636091a0
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fh4Zhu+;>Kuq#G&a?
znu4B_`0;cH!CB9Ya$Xfk8Z<VXJ^O=aMuV@S(7U70n>bkxB{JFRe-XOi6C`0GyjXHN
z<K7CB??OfiO!HRg9De4-mNcjHXhOvmqlAr}5@%C)><Mt`N-JUR;$TtptXw$rh7X(3
e0|C{Wk_;VR=F}%#x!?hG2ZN`ppUXO@geCwbA3>D>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f2b02c30be2054f5d466e098e23730705352107
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fh4Zhth;pn)0;z+xM
zN5CDPBd#wV{ov7Xx*XHyE33z>Ca__r<a|cq4Vo^8_Wp=5XmqgfIq<wSj%k)BS94mD
z$z!7h;{DI!oY;I02v1GD5p&X^$9SUzPk$7fj+x-%ojlXUyF4!T<T(g79#GNLHxZtF
hQbOazsRwU(7@nuksc)R_SOs(ngQu&X%Q~loCIAMbLL~qI

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..e67b91513fdef6e1a3d39aede6773cd4915b2109
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fh4Zhth;pn)0;z+xM
zN5CDPBd#wV{ov7Xx*XHyE33z>Ca__r<a|cq4Vo^8_Wp=5XmqgfIq<wSj%k)BS94mD
z$z!7h;{DI!oY;I02v1GD5p&X^$9SUzPk$7fj+x-%ojlXUyF4!T<T(g79#GNLHxZtF
gQbOazsRSN|=iGCYts-SF0bRo2>FVdQ&MBb@0GP}_uK)l5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..e496c97fef372d8205a0e4de27718be4991527a0
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fh4Zhth;pn)0;wX=b
zMjqQEr63*+r^_*JUEFE{8+J<0XB6I`>2hfAj~IhS2MeDA&s*b|W_fZorzM#@Hd-Lw
z|18dl&F6sd)YKa>Cmni>H%jpIN3rRc2`=8rGhMvP<6=*qgJ9zU6-|AU$&;itPn~0!
Xr!hxa--4GD=mG{$S3j3^P6<r_kiI#!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..274c3d46111c5d0abca4701a1c62aef2e5a8f0e4
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqU$_fC5kJ=HTlu
zWMmcEbsktg;L8h`bKs;_tJvzFnSA~(HS-le9^5v6?P@-)wpUBoYAx%uN*|Vl=`#4G
z3B6m<@Mg~(9S1SJzDJ4i2MnsG>N1p_3F7CHko|r}tAW?Jx*?}$Qj3;71DDBr$+z4G
z7R=mI-@y2p$zl1-g*r>-Gwx>e?N}-HR`s0t?C&c|^`@#X0=kXC)78&qol`;+0FCWS
A$^ZZW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..28aef713cc1b1ed6fa27d84c733b53a282baa54a
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fh4Zhth;pn)0;z+wh
z!x1qhQFG=(!C5!NYS=^;X6hYY#I~GKnB&Hso}2?oOtUWXzIRR1cQa35YAkS=?rykX
zdP7=H;s%M?;u|dY^0Y6E;C*p)@y_WJ7==H$q)Li~FOmpwb9!)aQJJBRtjNR_J9)yL
ww3Hl;+ZbJ0m?kgTbHOKtjak|uu#AntwRB0TsqN8iK!-7Sy85}Sb4q9e0Ky4FJ^%m!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..aa469a291812e691f81646905f9a7f36de39a7ed
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fh4Zhth;pn)0;wX<p
z68FTe*^N6oM3}oSm`tDesELy$C(q3+!I1Ini?;8Jb|)C}oy}y4X-jm_XFO|hIKi+_
zKz)VebjH0ECf|jO5}4+#&^i3fD~0)#2Zv3?l|z>t1v_V*E>K;f6lAhkI>1H2!1EOM
h*(Fchx;7azY_XsJLHG3OEkKtrc)I$ztaD0e0sze-Li_*#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9e05b295f8d2fff4da223c11e539db532af3c35
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fh4Zhu+;>MY#;8<uZ
zAU-k4L2%YHqo5dr#)h+JfAGv`@KqFgcl3D^C(EHkCOiEvLKl33Bus=COHOCpTVe8D
z$S8qn-U^+=&%D@@=5!uSsJLR3u(4C(Z0e3Z0WMu>CCptMENY&W3ulV$6x3#85WYJ*
UyGZG@1kid0Pgg&ebxsLQ00_Z4KL7v#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e816754eba86bde01d960168e16c358e682e4d1
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fh4Zhu+;>Kuq#G&a?
znu4B_@a?Aa4N4|wQzNcCFiBuyoIU%aqyb~MQ_7w0BXMUM+>I5dCrVuKb}-&%5OJnK
z{Rn5~u}lYjxwCs)cxE)HYn|S(L+EIOkq{HV*wzB(E{`iQZQ8OT6BkGxZct)s^bCs2
jP%~=IO<Z7N&CIZrW&Vdx`%Armj$!b0^>bP0l+XkK8(l#4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..95efd6af7f897a7c3370a601b34a4a3e479b9b6c
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fh4Zhth;pn)0;z+wh
z!x1qhQFG=(!Ce-1%v~2urY8ospKjn}$;opwOE6?S`=agpqTLCGd}lLRV%icN^cl}u
z98NIo6Hs3vIh}EDg~@jzqXedTD|8M&^Gabp<-uW7aplk@N5Rfnrwde<C<U1;mJV=H
nFz`IZefG#R4>qpN#ZnByvI~4Xu9w#U9mL@2>gTe~DWM4fw6sB`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..8052ce7e882aca29dddf0920dceca0c561ebe766
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-f#PTt9Tz<|T`re=0Z
zACJRB))f<PC`!A`J23g^)KtYYfi~h||BE?yyvz6bb?o&8QRZi#RTgr-sz1*#bw^~O
zIy0xy<aC9w2W-`%9tP|mqaHZK%wkMEqRw1)L`Je>^Qp8@&Y4EMkGDn{7^NP0dxa_N
p$SsEE#A$hro7}^8x^;hKzV=~(Pr%Vxhky=Z@O1TaS?83{1OPbpNR9vi

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..b02263914bc2f938621fee05836efac01e669422
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fh4Zhth;pn)0;wX<p
z68FTe*^N6oM3}oSm`tDesELy$C(q3+!I1Ini?;8Jb|)C}oy}y4X-jm_XFO|hIKi+_
zKz)VebjH0ECf|jO5}4+#&^i3fD~0)#2Zv3?l|z>t1v_V*E>K;f6lAhkI>1H2!1EOM
i*(Fchyf%GSWY{u$fzR%9b#XwaFnGH9xvX<aXaWEeCqqR5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a6bf545945cea51c4c7dc6d898b76bb1c670b17
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fh4Zhth;po_|@bGBG
z2QibH4n~h9f}OJ)cW}hY%x84Xn00!?%EPG#SeVSr9~&nynYDWC5TDPjCcx3o`D4!o
zZwF(~#0x$>X)$bH9$mcSeWHQ0V$mj^+1ipFg=%8W4+Bp(992s)nf~yTlc46Ti@X|2
p0y9*ewx%T+OEQ~SFQ3@W_@-fj4|{LMAE1jEJYD@<);T3K0RZfWMP~p2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0a62e1785ce7b6438e7710b44d04b11ef2cb644
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L+`ckuNW
zGJFRbS#2ioV3s!Vdyr!4ds{+Fp?$u@;rdDZdA|#{t+VRj4PCg+wtdTjJFK7XF*O)G
zUgO6s^8Bd{(+xv!i<5j2hU&{V%Qwhup2eu$xjT*5p>3v(gP~jJW<7TXwnM+&e!pX6
xIlDqv$mNU>gWrsW`zMIo-{8$yeN=cWH#5_cQkLAgML>r!c)I$ztaD0e0sy6tM$iBN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad63f29b9fa524749d1ef79d123c6e5d48664954
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fh4Zhu+;>MY#;8<uZ
zAU-k4L2%YHqo5dr#)h+JfAGv`@KqFgcl3D^C(EHkCOiEvLKl33Bus=COHOCpTVe8D
z$S8qn-U^+=&%D@@=5!uSsJLR3u(4C(Z0e3Z0WMu>CCptMENY&W3ulV$6qL4OVGyyL
VeSC4}9Rr~K44$rjF6*2UngB*kI_3ZX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..efb34d82c7ad2b0ca3b32bb2e701a4d154a9ffca
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fh4Zhu+;>MY#;8<uZ
zAU-k4L2%YHqo5dr#)h+JfAGv`@KqFgcl3D^C(EHkCOiEvLKl33Bus=COHOCpTVe8D
z$S8qn-U^+=&%D@@=5!uSsJLR3u(4C(Z0e3Z0WMu>CCptMENY&W3ujKbQ_(T$4G)9n
X$=SzS&YrgfI)K5`)z4*}Q$iB}%~w8Z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6a19d5ff41ef6428c6702919b56426d16d81501
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fh4Zhth;pn)0;wX=b
zMjqQEr63*+r^_*JUEFE{8+J<0XB6I`>2hfAj~IhS2MeDA&s*b|W_fZorzM#@Hd-Lw
z|18dl&F6sd)YKa>Cmni>H%jpIN3rRc2`=8rGhMvP<6=*qgJ9zU6-|AU%Sz@+huaxC
XX3SB}3cv9k=mG{$S3j3^P6<r_u)sU{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6cf4c958e94fbec9b43cf2efbb0ac40b50dbab1
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fh4Zhu+;>Kuq#G&a?
znu4B_`0;cH!CB9Ya$Xfk8Z<VXJ^O=aMuV@S(7U70n>bkxB{JFRe-XOi6C`0GyjXHN
z<K7CB??OfiO!HRg9De4-mNcjHXhOvmqlAr}5@%C)><Mt`N-JUR;$TtptXw$rh7X(3
e0|C`YDTa<2bCiAE())q#VDNPHb6Mw<&;$ShAU~S`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..3fcc4b5e7b4603aac56c56c2cc66ece5a80efb32
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln>~~oqUk@fC7i>?%?Y$
zWMmtdxhvEP+08QM95|UZYnF!VM7e#2hw7DHZIchzv#Qt1Pxa_Nxsc;X)GS7a8G$Dy
znHFs<&S1=$p*m-lrMH90FNMdl4LqB#F<<LjFtv|)1=oVknK}-0VpO$4%NR;b*2n2y
zFK6&G?voR;I3v#>akk`d>xLf(<s9l1XGM4%`^<Z&bw%m4x_n!p^B6o`{an^LB{Ts5
D?)FLS

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f7ee1dd17f170d1575060496435cf89231ad19f
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fh4Zhth;pn)0;wX<p
z68FTe*^N6oM3}oSm`tDesELy$C(q3+!I1Ini?;8Jb|)C}oy}y4X-jm_XFO|hIKi+_
zKz)VebjH0ECf|jO5}4+#&^i3fD~0)#2Zv3?l|z>t1v_V*E>K;f6lAhkI>1H2!1EOM
p*(FboIR`jzcz85JBKDsEgW;|vKIU(JZveW8!PC{xWt~$(695p*M%(}Z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..38820075b387925533178af9b636dd292d5dfc1c
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L;c?#k?v
zKE4ButTvN(G)tTK9Y`_ty%pi2(VpM)(f*|SrET-?TxAP&_U#Cc@0))rR^i+%R)$2k
zr{{zM=1kwrs&VRQpvjwTqcd@-!VNN;r#bq%J(^d^sc_gwZh^#Fm!+rp8JHj1uB~Mh
xFnRn+-r;}^;{i@%6YihS8}2gj`79BMmwUdXG<Y(@JD|fDJYD@<);T3K0RVDFNjCrh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..6383a5eecb382c464a47200af8eda3998e995afa
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fh4Zhu+;>MY#;8<uZ
zAU-k4L2%YHqo5dr#)h+JfAGv`@KqFgcl3D^C(EHkCOiEvLKl33Bus=COHOCpTVe8D
z$S8qn-U^+=&%D@@=5!uSsJLR3u(4C(Z0e3Z0WMu>CCptMENY&W3ujKbQ^C=({lS6m
eiw3*?C^9TJU7#$h`yv784hBzGKbLh*2~7Z@=|L?3

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bbff6ed0010e1aff9f4566074114c3575cd0431
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fh4Zhu+;>Kuq#G&a?
znu4B_@a?Aa4N4|wQzNcCFiBuyoIU%aqyb~MQ_7w0BXMUM+>I5dCrVuKb}-&%5OJnK
z{Rn5~u}lYjxwCs)cxE)HYn|S(L+EIOkq{HV*wzB(E{`iQZQ8OT6BkGxZct)s^bCs2
qP%~<7<h5W)dT^loqQR~|iVPO~OMKqR9We*GiNVv=&t;ucLK6T3&O_k<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc9ba7ec3dc6fa3171167f3b49e67df2d178a1a5
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fh4Zhth;pn)0;wX=b
zMjqQEr63*+r^_*JUEFE{8+J<0XB6I`>2hfAj~IhS2MeDA&s*b|W_fZorzM#@Hd-Lw
z|18dl&F6sd)YKa>Cmni>H%jpIN3rRc2`=8rGhMvP<6=*qgJ9zU6-|AU$&;iVZ&q^i
h?UCSJd|IA~L3;6mde27^M}SUY@O1TaS?83{1OUgdJ^KIv

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..775259942881ff64fd8ed02ca87baa4c8342863f
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fh4Zhu+;>Kuq#G&a?
znu4B_@a?Aa4N4|wQzNcCFiBuyoIU%aqyb~MQ_7w0BXMUM+>I5dCrVuKb}-&%5OJnK
z{Rn5~u}lYjxwCs)cxE)HYn|S(L+EIOkq{HV*wzB(E{`iQZQ8OT6BkGxZct)s^bCs2
kP%~<7<h5||EMsHX^<jaJiS@CUK-VyMy85}Sb4q9e08<A*@c;k-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe348011c04badb6cdf9754cb1168be55aab0f40
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fh4Zhu+;>Kuq#G&a?
znu4B_`0;cH!CB9Ya$Xfk8Z<VXJ^O=aMuV@S(7U70n>bkxB{JFRe-XOi6C`0GyjXHN
z<K7CB??OfiO!HRg9De4-mNcjHXhOvmqlAr}5@%C)><Mt`N-JUR;$TtptXw$rh7X(3
l0|9~jgN@>g6H9(NGq4FSsGsNkZxzrv44$rjF6*2UngIL!L-zmx

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb2fce7a11852651b021e32b9f415a879c42c058
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fh4Zhth;pn)0;z+xM
zN5CDPBd!@q(H|rOT9)nP>6V(q=A)2MY;4D@mJry{Q$6uUx8#QmwI@bA%vGEj$Hdrx
z+!hPPvlhHBjxOFgeFCHK2bWYyvG7F_0d7tY4lWYQa}eyDb-G|_vyzZWvP6K3f`R8L
m?z1jw8+3U@Qc?@b*cc>>7Wl+F=dT00h{4m<&t;ucLK6TW!$A80

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e6c682ee3918f6467d51bab6b37dba989acbf4d
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-fh4Zhu+;>Kuq#G&a?
znu4B_`0;cH!CB9Ya$Xfk8Z<VXJ^O=aMuV@S(7U70n>bkxB{JFRe-XOi6C`0GyjXHN
z<K7CB??OfiO!HRg9De4-mNcjHXhOvmqlAr}5@%C)><Mt`N-JUR;$TtptXw$rhR-pF
d#4<l-hN3mIkH0wBv=itI22WQ%mvv4FO#t&%LIeN+

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d261ad260d54ca4a417d8ea057382087df52ea6
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fh4Zhth;pn)0;wX=b
zMjqQEr63*+r^_*JUEFE{8+J<0XB6I`>2hfAj~IhS2MeDA&s*b|W_fZorzM#@Hd-Lw
z|18dl&F6sd)YKa>Cmni>H%jpIN3rRc2`=8rGhMvP<6=*qgJ9zU6-|AU%Sz@+M;SV7
WW*=uzeyIa=0E4HipUXO@geCxCs5)W*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..17de9bcf7123edf3c8eebb1c1e526169848d3e0f
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fh4Zhth;pn)0;z+xM
zN5CDPBd#wV{ov7Xx*XHyE33z>Ca__r<a|cq4Vo^8_Wp=5XmqgfIq<wSj%k)BS94mD
z$z!7h;{DI!oY;I02v1GD5p&X^$9SUzPk$7fj+x-%ojlXUyF4!T<T(g79#GNLHxZtF
eQbObGIflQ%b8a)N>*oQwgTd3)&t;ucLK6TjVn8PV

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..66f6fc8aafa56630b12daaa580de0cfc9add14aa
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fh4Zhth;pn)0;z+wh
z!x1qhQFG=(!Ce-1%v~2urY8ospKjn}$;opwOE6?S`=agpqTLCGd}lLRV%icN^cl}u
z98NIo6Hs3vIh}EDg~@jzqXedTD|8M&^Gabp<-uW7aplk@N5Rfnrwde<C<U1;mJV=H
mFz`IZefG#R4>qsO#tg!h3s%@YdZ!O`4}+(xpUXO@geCxnf<kQo

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..70eaea59e9dc52460c746a1f4b3bcbe977a95280
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-ggPCm<fK!Kz6=F036
zKK2I>nC5uiSSW4c_aNo#1(P;~1pfK#hpYdvTAbU>f9uH83nH?|f+t;I__{y6!7FC%
zj;W0-Gfx@|Xcsi?<x-i^T%lW_aBmi4>Je?`vLiB*9h*;Og>ud`;(eUIH6i6x$Lm$B
rcLcMUdD?cCa!;`}syM&%&l3ALcNVNTV>zK5=p+VDS3j3^P6<r_w7W}}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c13eea1ecc0b9396616c6533a36f85599ee02d8
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-fh4Zhth;pn)0;wX=b
zMjqQEr63*+r^_*JUEFE{8+J<0XB6I`>2hfAj~IhS2MeDA&s*b|W_fZorzM#@Hd-Lw
z|18dl&F6sd)YKa>Cmni>H%jpIN3rRc2`=8rGhMvP<6=*qgJ9zU6-|AU$&;itPo8UM
ZnAb9={-D{5CZH1-JYD@<);T3K0RZ`)JlFsL

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..16a4c834a06ef77c30e602f8bdf49ec3a5483d4c
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-fh4Zhth;pn)0;z+xM
zN5CDPBd#wV{ov7Xx*XHyE33z>Ca__r<a|cq4Vo^8_Wp=5XmqgfIq<wSj%k)BS94mD
z$z!7h;{DI!oY;I02v1GD5p&X^$9SUzPk$7fj+x-%ojlXUyF4!T<T(g79#GNLHxZtF
fQbOa*xlD#X-{;gX^NcqEI)uT~)z4*}Q$iB}dEh}1

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_blue.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_blue.properties
new file mode 100644
index 00000000..b9441ea5
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_blue.properties
@@ -0,0 +1,6 @@
+# Stained glass blue
+matchBlocks=95
+metadata=11
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_pane_blue.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_pane_blue.properties
new file mode 100644
index 00000000..61c68c24
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/11_glass_blue/glass_pane_blue.properties
@@ -0,0 +1,7 @@
+# Stained glass blue
+matchBlocks=160
+metadata=11
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12.png
new file mode 100644
index 0000000000000000000000000000000000000000..93a100382b0574083a3f73e3ab0c84083194ee01
GIT binary patch
literal 372
zcmV-)0gL{LP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003yNkl<Zc-n=M
zF-rqM5QVo9gJ^LCgIHKtsDvN}Az-10<$;QYl|qW7l5~m)B36Q2b7&`6*!ly!F8^)h
zjlN}e-CT-+y?J}z&deJ(eIE(q`}I=n_viDekK5rvpiy@?^fueFy^#fRS7kE1Sy3&e
zGp~SYrz3CKZ?b<?N%!o*0|wnyAI#;uYjWIQm#>c{an~37QrESVWhq%T`3E4}0&s76
za<2ac6<9z~6q4t;*YGL<d{6-xL=ym|QjaUp7G_mo`)vfk9t36)2ep*Wyo>$Tmi~4E
zk=g~D(;37b$6nh#V2i;XK%m!l>Ime}Yx&d)_JsF!1}}q_-0v;QcxNH-9S&IAkS73x
z#9gf*1;9l><^nLNSpcpwTZjRuu(1LFxbrChX5_5bkE0{+GtcoZoE&ZiyYK_m!1qJ`
S6tR5(0000<MNUMnLSTY`W22P-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..259b61c60ed3767a1de9d2984d26237d08002801
GIT binary patch
literal 205
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q#@T9Ln>}foqUk@fC7i>?%?Y$
zWcUs=vf51E!K`i3IQgoHX&}qR!~Q+L=6C$lwkcnEYHr0sosf0)0%jts9nL%zWoVI{
zYOAJTseWAUKwspcmC~D8RF?A>)iO*-zE*YMmgtsC7aLYFM9nzKyyR%`qM)Y?2b!O4
zUH<eN|APxX*W8<!KeI3_pXnaiF`Mx>gKOtX(YKoC^sjOxIN4_Fe+Igb!PC{xWt~$(
F696qiP*DH?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..2268ce6615083d48fab3ea1125837ecdc5490867
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$cK!L+`ckuNW
zGJFRbS#2ioVAi&1oP5<JH#xw8&))FZf0YCFmrA#-v+CdtU0AlKeapf-te@^NH5fd8
zHJ44}-1$nD4aw6ACW&rH^7Bg-Zjjl0i#g2d-7HfE$+S-lM<rC(t&(As$hc>JE1zE>
z!!38BLeeybf?1NMobK`5V9w~Ck#%w2qZ;PLJTax0rrl@+I*q~8)z4*}Q$iB}2sTSl

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ac2776f5622cb762cfdd4874b0d674bf6f1fa3e
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5Onu4Z;h
zpY(x4tZP`)cb%N1#qx2wcFvLSEB#wa<6kS7@pS#<-SU&C!ObTwmgT}C<8+3vT=j}K
zS)zU{xXBgN;VxI;F2krI=*@cJ$&@F)oO2CjKa@umSd|_TS=%7Iku@Rl*$eR<zf%f+
ao#UUz6rlXxtau904Gf;HelF{r5}E*r89^fe

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dcaeaced7d7b0736242f47c939a9709a11ba978
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`M!(R
zMGVaR2FiuOdfCfYb#Wx5erW48H0u2=rLK?=5pSS$fICuvJuc^(&w<4U<#mc5xbn@L
zo4_i0%E9`{+y>Q@)hsrZOI`F<CL0U<i}OCXj4!fG-M}f1bq9y=t0tw~IqaqL_<iLA
Vlnd+L{RZ04;OXk;vd$@?2>{vxIjsNy

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1d37415b8c2a8f92df4d92dfe7114ab4270621d
GIT binary patch
literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn>}foqUk@fC7i>-IduT
zeC!VnFwOJ4(<nNp;bhjVSsJbv5Bv9gn*Zafz<cjiUg~ixG(3N>6*{lvx)Kw~=rHr*
zikVECHW$BQd^5vz&Mw1jhq9szubCTUHcw@YcHa<nobw9Hg+o4a3i|7WdiB^D<XWz;
zn|9l}!P)qnoRG|ndWM2SHov$tKR54XxT&*Eg+Kg9j8l01tH(gcF?hQAxvX<aXaWGj
CCr)Dk

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..b94809b74fed0340214f6eb57ca99bf2c7e93053
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;c?#k>E
zKK2I(nC5xjX%wAv;AGaUZH6HZeD;QI|5fCDe%kyBn0=&eR)GI`#rzdKjeE8;D4f}`
z>N3OC%AIEz%FYP+ZDI~PbMxgJc7@|>(hhh%S{KPYAyJJ#pf~W*s?(AUjUV=1+*i%u
vXq?r}BDk5QK{)M&{*<%)Wz4_wK6;6(E{Kpkdo5%d&{+(gu6{1-oD!M<6--SU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..5459fac831d57f3603323a128066bc917e122115
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PCm)Ypvd9+GV|69
zE1iaB-U79S?9m&Tw59!pohLl~U?cG_o%_PQ^xS6$3ubh&{?7EwX#REI*g^GO*qyTu
zO=q4+c8FFSh+`Ex<G4r6LSTBDgXG7v4YG#rY>(D#iVk&J=5zQ*yspGdqepewjM_=L
l4F?Upw>#WaULCXeB>T_4;17HWZ6NnCc)I$ztaD0e0sv(TMw$Qs

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..afb4bc8232c410d2e66f3a10a904d8412bb5cef5
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L;c=F036
zKK2I(nC5xjIVd{gz{yujdqY_)Ym$5Zd)hI*+!r;SXH{EDQ1iYe&QJB`oIAqwAVuxz
zIkA8_(>JqfoH`n4^F~`DZT%+J1AURF7c@=Wk$#WqhQVfb4L5Dim7mxbI8@|k+cU78
u-SV4V!a$#)<PgtUCp#H~PM^igzA<QjjgWjcqoN7uDh5wiKbLh*2~7apY)g3n

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..c07848c35b82c2e294557f8209dc399cf181f1c8
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-f#25;m&V8HQs`M!(R
zMGVezCwh+X*D8uX*_5_Q$%{vFj^d$X4L(oz9dn8Qz);fc_*v6)3+J}~9u2%Zt4ggI
zd9BP<7Q{Vda^y3)(Y#1dMM3`Ug47e%jEpIrEFyC@Rq1IaUl#o5=k2$gXXiV&2f~{~
pA0*6lkIc9^VWM!l$lLfi@jYK7R-}uhT>!d>!PC{xWt~$(69CliMiBr2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f381e275f08616079e93488f2631e25fb3e88fa
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhJw6-Su^h=vdF0IF
zki<Q)Yj)!fj#!!bjIJ58PH$LwIQ0MvlbN})^oAJ?X(flNFUD?=Xn$tHq<7e0!Ssf-
zIf)x2+&hG?^qg*pvzb-RDQUpyA2KbmSalO)stSvoO;+N|1syJDQ+Egj32M%|$g80w
uFhk{OYg$sV3bToI{=r7^#fc?9of$SaN375(Jg*FN7lWs(pUXO@geCx%+C+^2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..abaa5cdd0183477ec9a2e9b293165819bae26956
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-fhJw6-Su^h=vdF0Ha
zqLIh;NXcZQ?hhUfr^_*IuDpKCY62T}O3r5#-k{-fY_G?gqdXNR!bOs8jC)y3lDV6K
zT&Fn`(&n&zd35oP_lXA1ibb1vy0rs&G?W!TBm{DsFX(VNo4VtYqaf!jLmmw!ff*`K
sTho+`C2lYTl-+A$)^|Jn;!``r`HYAa9vgm720Dwu)78&qol`;+07(QxzyJUM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..666c8e9a7f796122b2492b23ed8c1c56baa91325
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTt9Tz<|T`re<~u
zAHTyx))f<PC~BuL`A-uG6j3}UvVY^xe(wV}wwGrAxzgljaM$Ut9Am)D<)Y6SRZjW{
zI;=U+Z?Vc@lBLHLCiQ36cvd8RW009)$?UP=RAwmWR3qLGyQ2(@LeE^zX0%S@J&-bE
oZS;ay6Au=jTfW%Y^Z$D8xj7-XHGh?B0Numj>FVdQ&MBb@0FD?(fB*mh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..2447f1281dfcf4e70d29d7bb33e61049131a3692
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhJw6-Su^h=vdF0Ha
zqLIh;NXcZQ?hhUfr^_*IuDpKCY62T}O3r5#-k{-fY_G?gqdXNR!bOs8jC)y3lDV6K
zT&Fn`(&n&zd35oP_lXA1ibb1vy0rs&G?W!TBm{DsFX(VNo4VtYqaf!jLmmw!ff*`K
jTho+`C2lZuZ8ByEiU?WZ`X#Lx=o|)5S3j3^P6<r_3OGJs

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..b017b2ead2caee1bf39cc12bb8a18f982d4ecc6f
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|T$re<~u
zAHTyx))f<HoSbZ#xrpQARBovwwhsgh-et=iX>v2PZM2eS4Cq`Q`kYbarH`P)nnUpg
zCXFg~9$T2yA5CKq5v*q5J2Hn+#p3CfWi6*>u>G*sm6)sb=;hi5*^O)oNolXeSNuxR
ePnf&sGu!HS0reeeA-q6mFnGH9xvX<aXaWE}06<0n

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..acaaf58d850279c330258d0173ad861a92d345e5
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-flPTtLXz<|T$re<~u
zAHTyx))f<HoSb~rOVG6=KPV=-@O({)!MWtz-u|cy8q0LAyccAcS{YR;=P+r$CR0b~
z4<UD1k4@~IZV!&!xy2ZIMy`R`IGush&vLEa!b{5->-@Nn`HO!3;&z}flGz|KO`AJ}
gSMpECC)wxRTm=F3$2&Lq16{)4>FVdQ&MBb@0Au|?;{X5v

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..70ec77274e1e9aad0598e9fc372b6ec991de7cae
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTt9Tz<|T`re<~u
zAHTyx))f<HoSb~rOVG8$ShKGAN5A(0i~g;qc3F<fGq(jCS7y-qyycTkgUVD*rjDsU
zgxqC4HnDfQJvegb7GvlcxdvwAbOug8%e8t7FD+xN^W%0~+ErPloN#;%;|!h6U%5kS
fjedMQwOx-(BtZG?1iKkPcQAOm`njxgN@xNA^>jfb

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..c5e69d1ccd1b99cb2761293f25a2a85b7d6f74d3
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HQs`M!(R
zMGVaR2FiuO`q|4?b#Xi>`_R^FXw>_8huX1l0fRNdJscmL#EvwI&o&kQknw@_v`ods
z=5+N4$2Ox2e3j}6oHw-?{o^zzdcV5C(=z{h(1w-H)9!NiObBPxJJhmkfroVc)t_t!
Xl>(HHI9Fx?9l+q}>gTe~DWM4fB<MbA

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7f2e56ac5aa0559fe83fe0f5b3ce772d75dc040
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm<dK!K-qbMW;S
zGJF%9#XiUsu!k2gsjn7^TJvnVrH$an+O{L?FKvDW%nsq*>MDC|Qk@q6!=h_C40>ro
z?^ZNC+A~MjK~V49qs;h&2Gvt@8OqKC@oP!Qem|qtz-wIHkkm7&Ma!On%jCV}TkZo3
zW^So(VEoMHuzco1ohS1dcQeLztQ32zdro}c$Cy%uQ<+sjr!jcC`njxgN@xNAmR(A!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..e175b98988c7578a0f0309b8a6ca3a6ed7dd7c5b
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhJw6-Su^h=vdF0IF
zki<Q)Yj)!f4&NMZJLawnCesrGn=dzTvgG8snI#x9o_*2wU1_8EVrhd$2a5%#7fW35
zb}-&%5Ycm%`^KEOw!;By*uFfvc*pxh182peO+4M&fjk<@iXRdJcS}s;>+-k~)26K`
vI&p#I;RYq9M$e$Q3^k+XM&1P)*31kU`4Oc@eebXX9me44>gTe~DWM4f1MEc?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..799c6a10adcbd13e1ce9e44c402bcc2a6b870536
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhJw6-Su^h>KlEkL4
zvDM?~S%(;xE=JdkS*JY;53(?snJY_gn9-0{a=7|p>;{SUXC_Q~hYc1?Z%CVyxIx0b
zL-<P1>4rF)S=F4928{k8(-MnSH!-HFu*lhDCB9tH;c_;0hft89=B$gn8cG5)RGzk`
f1r;f~-jrmxZW;U`V27zc&?O9>u6{1-oD!M<(o;U3

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff9667fc75d30d7d7621d99c7e0a32f1c82e13ab
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-f_PTt6Sz<`70re<~u
zAHTyvrYjyjb3(#W5+9^4{n1w~Ct&g}drn6~Qti<WM*R&6oO@oZnc3*xDjzxRK(}p$
zS(B*27Us7HteL$NR`b|cE_KmdDQs*oZ~4*%!R*uSa`YTn%_x4lrOxsHk7EJ+X4n0*
UuhmV91lrEv>FVdQ&MBb@0ERU_2mk;8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..f890940769d0765cfbbb750881dc2eca2093d100
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-fhJw6-yEoP8UQgAFZ
z77$<9nR_tZL2%YHBb}@QDTBs_vuA(s%xG{`G<xTnq@Q+R@yrRQ4R~ItE|83t&`CQW
z{HVp`vB?7Q{%3JcY(58sr=~{4bS61SayGJeN9|yARmsvjJe9A@<3dlOgJ9zU6-|8;
i;h6`w83fFl%Xs`>@CU`oeF{LgFnGH9xvX<aXaWHKb3e@h

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..26d3a7adb71c82d8c2036e68b86205fd571421af
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhJw6-Su^h=vdF0IF
zki<Q)Yj)!fj#!!bjIJ58PH$LwIQ0MvlbN})^oAJ?X(flNFUD?=Xn$tHq<7e0!Ssf-
zIf)x2+&hG?^qg*pvzb-RDQUpyA2KbmSalO)stSvoO;+N|1syJDQ+Egj32M%|$g80w
nFhk{OYg$sV3UljCOI`*u@erT21&JC!2QhfM`njxgN@xNAlc+!q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e2cd71c536ebab758f6fe4ce92ac1e4e5bfc266
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PCm)Ypvd9+GV|69
zE1iaB-U79S?9m&Tw59!pohLl~U?cG_o%_PQ^xS6$3ubh&{?7EwX#REI*g^GO*qyTu
zO=q4+c8FFSh+`Ex<G4r6LSTBDgXG7v4YG#rY>(D#iVk&J=5zQ*yspGdqepewjM_=L
n4F?Upw>#WaULCXe=r4w!uR?sjwjWslbPt24tDnm{r-UW|&DTiX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee987d8fd83d80123b31839b459e95a02bc4a520
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhJw6-Su^h>KlEkL4
zvDM?~S%(;xE=JdkS*JY;53(?snJY_gn9-0{a=7|p>;{SUXC_Q~hYc1?Z%CVyxIx0b
zL-<P1>4rF)S=F4928{k8(-MnSH!-HFu*lhDCB9tH;c_;0hft89=B$gn8cG5)RGzk`
g1r;f)-ux-RaD8fsk86=?InXH#p00i_>zopr02PBi?*IS*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..940b86cc7b4ae86451c2b5f80c151a025ac95f91
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhJw6-Su^fq>@FB^j
zf?LY&2!qO{jw5FsVp{b2&NnEToK3xP<)Kjm6XWdJA0-VKXFI9f=|0aY%+Yd~r6%r$
z>Vla|3^LT*jP;nSK4!dAO*z0~6ByZcb}G*i3*qjAA6BFuND?-jb-JK(VTZ`s7i=Pe
p96pmiIT>%9*~2(%?&T9l8TdOxd`!NZ-T}IZ!PC{xWt~$(69DeSM!En1

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..167feabc6129e5d912f79883cf4055cd139984a1
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c?#k>E
zKK2I(nC5xjX%wB)a58JwHp37HetW~V|0?o6KW&z*=1p?<^}JMkf?F$g!FyW<4dZjK
zbR2l&^pqQzH@8iG*T7rMXZ4#=!(g`LhKUs!+ZdkA&}0fppJMU4h~<G>#r=%?whg|<
tQQa)oX}k>zXV&fy5VOC*JK^f1&L>Q&e<Dg%+JJh1z|+;wWt~$(697TrN6r8M

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..4610850942e9b3825fb856c9da11dddfba6c0449
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhJw6-yEoL#EuwaK|
zN4JOJ0uJ9|Nlm>O4hNp4)v);-SSG;v{Za8j7N&;=jPu2-I5X5Vd1iH9>^a>KXEUps
zQ__IZKV({Bu`09Sxg$viHd&GzZn*S3Gm44RP;xci#pueyG<nIM3qIX<I(X%o7|f0R
VkDvKBu@GoKgQu&X%Q~loCIG$;IfeiL

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..e87f9cb102ebabc5a8325bd1e9300492d6c4cf52
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`M!(R
zMGVaR2FiuOdfCfYb#Wx5erW48H0u2=rLK?=5pSS$fICuvJuc^(&w<4U<#mc5xbn@L
zo4_i0%E9`{+y>Q@)hsrZOI`F<CL0U<i}OCXj4!fG-M}f1bq9y=t0tw~IqIc#3_geb
Vk9+Yo8vyNR@O1TaS?83{1OV2^ITru`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..a00731983974894da2dae3c9f587712cf4034dbe
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhJw6-Su^h>KlEfw?
zV$NJBsL3X>FjG(YD625XjXOQ(8#r%>C_Rj;(VO9*Afxu+vy(pKS(R2tW5Zd6k{7z&
zi}e+m)gE-7GRj$(qHt_x1W%j0F0<I|j*BsEr@391WVo3x=x|7wG(~(?=0xd@51koS
XPYO^z+@7TbbOD2>tDnm{r-UW|h$}gU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..62a6c950e87642c1cf6e6d55754fbe3f21190bf2
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|T$re<~u
zAHTyx))f<HoSbZ#xrpQARBovwwhsgh-et=iX>v2PZM2eS4Cq`Q`kYbarH`P)nnUpg
zCXFg~9$T2yA5CKq5v*q5J2Hn+#p3CfWi6*>u>G*sm6)sb=;hi5*^O)oNolXeSNuxR
ePnf&s3)|{R0m`dFU&H~O!QkoY=d#Wzp$Py!d_aW&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..3003b3617cd1ef83157128b6b959fc1ca14a607d
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>~~oqUk@fC7i>?%?Y$
zWcUs=vf51E!K`h;IQgoHX<*kP+nVH-|1MXQW0s4w&Y!fHr_#_;tTF1eF@uJ&l%=yn
zQCXjEgY4$EVB>UN4?p>mJ<Jo5w^bduCb;HOA%iKSiQ!~+kIAcD7N6p4kUqOQ{Pb7Z
z1Ir}c`8mzb$TL`+z4ME^@ME(rL#5)h2+!kB*`C(NlxBav&k1xLgQu&X%Q~loCIADo
BNKF6$

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c87b12bf779d562be1ee5fd09d98ba440377551
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhJw6-Su^h>KlEkL4
zvDM?~S%(;xE=JdkS*JY;53(?snJY_gn9-0{a=7|p>;{SUXC_Q~hYc1?Z%CVyxIx0b
zL-<P1>4rF)S=F4928{k8(-MnSH!-HFu*lhDCB9tH;c_;0hft89=B$gn8cG5)RGzk`
o1r<G3T%ma5Ly}34UOfjx$d(A7KT`UlKo>E1y85}Sb4q9e0Qc}g-v9sr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..363d09b836b5a9f4c54e2b0e4ae4370a846000b5
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c?#k>E
zKK2I(nC5xjIVd`(;bhjVEgL%m`0h(QuAkJuq(;u>in^(DY{%t@PySOC1=8;_H5e=|
zO6Oj2?(|Wnkf)DyW_{C@Ok2N+)uAu)^a54o!t;ArCnT!z2lR$53VO=k(D-5AwS5d6
wvkJfSD<s4*JZO=e)%vOUKpq3TT2Pn1<HLy3D=f=@1Kq{o>FVdQ&MBb@03?M>W&i*H

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..bff4e7a70a12ed2f2b9625af214a5fcc9c2282a3
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhJw6-yEoL#EuwaK|
zN4JOJ0uJ9|Nlm>O4hNp4)v);-SSG;v{Za8j7N&;=jPu2-I5X5Vd1iH9>^a>KXEUps
zQ__IZKV({Bu`09Sxg$viHd&GzZn*S3Gm44RP;xci#pueyG<nIM3qD?XHY`V?3mzQJ
dkcj;!z;H@GL|MGHWggHS44$rjF6*2UngFO3JYoO<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..85f2aba6fea3085857ef076e234cc6ecfa51fda7
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhJw6-yEoP8UQgAFZ
z77$<9nR_tZL2%YHBb}@QDTBs_vuA(s%xG{`G<xTnq@Q+R@yrRQ4R~ItE|83t&`CQW
z{HVp`vB?7Q{%3JcY(58sr=~{4bS61SayGJeN9|yARmsvjJe9A@<3dlOgJ9zU6-|8;
p;h6^yu*onP7CbnbArbpefFYVQ!e@z*IS<fH44$rjF6*2UngHCHKr;XU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..1422a56e31dfcc9c494c9b8b95f49dd4478270fa
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhJw6-Su^h>KlEfw?
zV$NJBsL3X>FjG(YD625XjXOQ(8#r%>C_Rj;(VO9*Afxu+vy(pKS(R2tW5Zd6k{7z&
zi}e+m)gE-7GRj$(qHt_x1W%j0F0<I|j*BsEr@391WVo3x=x|7wG(~)t=gHm$Z}zaV
g$Mv*be9F(rU^h3UzT4uc0njN7p00i_>zopr0LZpIt^fc4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a084131a309243eef79df90b50fdd5d4acfe4bd
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhJw6-yEoP8UQgAFZ
z77$<9nR_tZL2%YHBb}@QDTBs_vuA(s%xG{`G<xTnq@Q+R@yrRQ4R~ItE|83t&`CQW
z{HVp`vB?7Q{%3JcY(58sr=~{4bS61SayGJeN9|yARmsvjJe9A@<3dlOgJ9zU6-|8;
k;h6^yu*ob^v1Vqt`zple;PE_OplcXBUHx3vIVCg!0AiazM*si-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..43bcdb8e770648177baaa5f2d2ad45d85dd2b36e
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhJw6-yEoP8UQgAFZ
z77$<9{n&T`hi|c@S?La*84d@YrPZ+c99Sm6`TbGxK^CTm28{E?t2i^%G<jxqUhFyD
z5N9*1np4t%(LZEbVzDZ-;khG81~yre8*aGtJTr=k(@=6X-o@z3!Zdlwo(n!XYRr-a
l939&q9O%Aiu<MT^gC=iCy`}pEKcI6MJYD@<);T3K0RaEEK0W{d

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..21487fe0242a182d6a68de07f4bcb9ab2b7831f3
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhJw6-Su^h=vdF0Ha
zqLIh;NXcZQ?hhUfr^_*IuDpKCY62T}O3r5#-k{-fY_G?gqdXNR!bOs8jC)y3lDV6K
zT&Fn`(&n&zd35oP_lXA1ibb1vy0rs&G?W!TBm{DsFX(VNo4VtYqaf!jLmmw!ff*`K
mTho+`Z-}vRZ8Ea3W@fO-3GvyTeBlVtMGT&<elF{r5}E+C0Y07p

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..aaece81111ad65cf61355557ee7ce3712d689c84
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtFTz=5Onu4Z-$
zANz&^#_WSL^ENHvdiY_wcFvLSEB#sa=-YI#HYZg!f2(0z;Cm)6mSw}D%_$6@x#}0*
zWC{C`aFZ*l!(Gn9U53#_Fq?J5lPPa}Ip-S6ekhMBuqr(wv(`cQBj18UXD;e{d_Vc%
d!`zRIQ<wQ4pYmYN5}+d(JYD@<);T3K0RSOuMGF7`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4ba78debf53d24008865315da06605aa4daa439
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhJw6-Su^h>KlEfw?
zV$NJBsL3X>FjG(YD625XjXOQ(8#r%>C_Rj;(VO9*Afxu+vy(pKS(R2tW5Zd6k{7z&
zi}e+m)gE-7GRj$(qHt_x1W%j0F0<I|j*BsEr@391WVo3x=x|7wG(~(?=0xd@Nerva
W{EwS0-Ombi0E4HipUXO@geCw)M>x{}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..746ae6a3febc79ae621a35749679c6a5cd24a57b
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|T`re<~u
zAHTyvrYjz2o}7H7)unT8#}D2|_Iiwu_dUDxV<l&AO57n^ImQCx$y1**nyfq{=&<%k
zzsf6z$+j6LO)Af>@$E?Z#vn99l{urpYtyb4ui0!rY;`53YNdU0JJ46jp0Mf6HT{CG
dCm(#7E3Xg}a64{UXA#g944$rjF6*2UngHtHMa}>K

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac145b849f281238dc5c0a163365bb47f80949f3
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhJw6-Su^h=vdF0IF
zki<Q)Yj)!fj#!!bjIJ58PH$LwIQ0MvlbN})^oAJ?X(flNFUD?=Xn$tHq<7e0!Ssf-
zIf)x2+&hG?^qg*pvzb-RDQUpyA2KbmSalO)stSvoO;+N|1syJDQ+Egj32M%|$g80w
mFhk{OYg$sV3iHyNk_=|WAuBGme=h^Nhr!d;&t;ucLK6UVc|q3z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9ad6b65eecb6d396b3fbeb6df35a1a77d9b81da
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-ggPCm<fK!Kz6=F036
zKK2I>nC5uiSg38$IQgn`GLPc{IXnKg??1Q$-mT`pb?EU05!qwGlP)lP-Jjmz6|;87
z+(wp}CyfQP3mW%wsmy4u&@E7~o5h%V#G1M6h>T>%=2KaroHLDhAMcDZFiJgAdYx%r
q$5uwR!#2BEPsvHvJddfn6wm)OWW}+`j8A|rV(@hJb6Mw<&;$VGh)8$<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9febbcf87faa19248662cf4a8511fe09776b856
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fl25;m&V8HQs`M!(R
zMGVez32u*;#a#0V6%{;i_5rVSa!S^BQ?*<10tPz5JscmL-gPj0n|Z4w+<U+-Ww}9x
zz1#0X3s0(o=qEo1=1pl#VtY1K>#a<>ELa!seQp`o&i8%^Eqk~Mgw(FEI^L=Xdj65&
YU|m3c-13M2fG%M0boFyt=akR{02Wm~ssI20

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a0028637ee32ce48b1ee2a691623d3235d6ff46
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|T`re<~u
zAHTyvrYjz2o}7H7)g|z(qx-(XzsEub@3QrJ=g+#}@l18gM~;SLK5_T>7I>!iF}zZ(
zQwe0B^~Q0rpo-!4vIC-@`4k!>jT+dNtE~54vE^mM{mV_kE0dPp<+x!O&7gKV=Py(E
ed>+30l{N|t0rfGHon8W+!QkoY=d#Wzp$PyaJw#Xl

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_brown.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_brown.properties
new file mode 100644
index 00000000..0b33e3cb
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_brown.properties
@@ -0,0 +1,6 @@
+# Stained glass brown
+matchBlocks=95
+metadata=12
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_pane_brown.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_pane_brown.properties
new file mode 100644
index 00000000..8da13ce6
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/12_glass_brown/glass_pane_brown.properties
@@ -0,0 +1,7 @@
+# Stained glass brown
+matchBlocks=160
+metadata=12
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7f8277faf1e51ea66d1d4d7deab33e1140a02bf
GIT binary patch
literal 370
zcmV-&0ge8NP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003wNkl<Zc-n=M
zF-rqM5QVo9gJ^MxAy`;gs00ZHAz)z+%Y#HLQbkA+tB_6!LI_p?x#rMLNMV~Fkn8f_
zCcZn~GPl_?#mgo0Cg1Js8?*iy3bp#`i~jvP?^?YL?g}1#b9olX_4%>jsWnLg8N424
zp3i69#2*z|SF7?J<i+N5BK60q1+?lXR;-1Mnmja5Ww|)`1H`eUX)1UI$#@GuxCWr_
zaQu}0F9Wbi1EMIBFbu7Sw-Ue?<^VN<4}hc6cTbRyPy*2N{tG}n(5QF2C3-%eb>rp@
zaVH?(F6f%^W$b3HdpM%q1H=P^S?gPeP{XXaE4?S|H)#HBRpk9<UtX^E3b`Wz9UJNd
z;3Cmm3P2+uI|2A818|i&f(yV2cLKQcJ^=2>=&WbMw#}K}-CgM1Ulev>15OX`mTdO&
QZU6uP07*qoM6N<$f_7%13jhEB

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c1f4e60bf759f022913ad3e2368097213f6a996
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln>}foqUk@fC7i>-Idm*
z416)wA95b?t$D!W7k2rIi=ZQ)z2U2RrC*2t#%x{5qvYDUvaP;AUc-!Wwzd?*49Qm8
zXa_UDKIH};<M!o=J~9(}?LK_voWQgB3iG6O3RC-}S8#ZASw=Rju~Fp;^<yY8S#PiV
zwVuJx_??}Q#Tjmfp0r(?1o)Z1F|HE09J^(@#r~cJlbte+Gp7Na$KdJe=d#Wzp$PzR
C4@Ua{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..2040368e5be6e2ffa6af6897ebdeb442c0191150
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PCm$cK!L;c?n-M*
z2KIHf6>5d-VFgU;*_XHUIx<@RIU@0YGK2lo&o8#$QZT#HQdPxY>HJjeL^U_Vp`O*{
zQVXo?rwbnFi#+5RcA(4Bda5r&(U~m%h?hIEuQ8;|ILRE6JY~nKB9?>&mH#vL+cqqa
x-0IrY5y^BQGfjg#)i{BFfqv2|*Xpj%tWit)ON;KYZv?uG!PC{xWt~$(698tYN@D;3

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c9fdef026af758429b3e0ee302347719d88aa5b
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-flPTtFTz=5OnuBP=}
z2C;3LYgp5Fot&h_@^QL$&XMmc{aZ@oUn`jLbp7Pr@{^~*%_lCF<-#K4bcU~7^@=xH
zqJAv6$raS$E?3|#!>A(Y&3fU<lqbHNa}8xblt&d<l^zjU+aSD=H6iiY3-KMlQwn~a
Z<M*A_tXzEIoIB7744$rjF6*2Ung9~RK;8fV

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bfcc6d9b23d4cb552868d7c098ec4fe337a228f
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fl25;m&V8HQs`M)X5
z5)sx0%7wvt*~?dTaU`UEXzMjJ>isRHu8<HBZ=iI5J5qo>F6WxhfyD>qb&4Oj^39u@
zz$$sl!TQPE2Gx|+EH;%(UG!Ea8w>o4^FFwYFS1PCz$uP(2Z!*hCZ*gt?4|SgS++MT
UH|_Zo2(+HT)78&qol`;+0Lhs-(*OVf

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..edc28eb8f2305139cd66b7955c710e469fed116b
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqUk@fC7i>-Idms
z4D9P{E7S_v!wQ(xS7&A|5^?3TH#}AUDBO9^`dcAvAKhG6wB-x%PnqR#W~wYhi{#W<
zstVH9%LNa#MIOqO*vyim%)Zl(@q|IP<c2bqwWTo*p$xfaQW!ry(+Yf9#I!(pPu<o#
z_ZcnD?x^y3VDO(Iq2=W-?w22$_cl~TtXXNtKcU~Lea@s9pxYQcUHx3vIVCg!0A#~S
AnE(I)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b29a9e78391b67f7045921611d8608381495430
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L;c?n-M*
z2KIHf6>5d-VFgU;t21vM3t+VTb423b<QjvgpI<oV3Q1=<+1j@6S!l%a=^j&q!Q)ka
z%puR88ZqB6^tL$37h#ybe6xIm%;s5)+MT=8cpchi+BlfHb*|P+XJ9+@+wJ!|MwYWH
tbcI~b2r>B0ShzpH%>D-Ni`_@HWAAEqOZFb08w_+6gQu&X%Q~loCIEy}M!5h0

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9513cb9d3a529882b86826a1e5c1dee8399a89b
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-f#PTtMSpvcj7^JQ5P
z1J`Zs6`nT^iq1K3^4zN=j!znP+=u^v=DKh%J@?tcf*D<`zcW2Ent$Clc2Ip6cIT`^
z)0rod9ikNn;#h^wIPMX%5SX6kAo=lZgRG%D+oLs`qC=gQ`5gWcuPZUr=uurZqjpkm
m!$AY@?G87USH~<q$-Yso?SnegaW|lA7(8A5T-G@yGywqMnn`E?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..83d1cd4a9d0ceb236c767877fa11f9b5f900d177
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L;c=1OZz
z2KIHf6>5d-;R#IYtEZcV2|oGIYxqz7C&!ZCS+Pbdq$YXt{+h%$b$5Z4Fn7b`nNzHz
z9SY;li7n6&cmKFyeZq{rr^Fbn({!7;+#b!V<W4wzMs9(`T9u`z<QteC?p^zrLBizn
tJNbkIdl)Wo8k=zcEI6QI)H~}I^W(a1NlAfQQb0#Bc)I$ztaD0e0suKUMpys<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..62f1d66d12b45b09ad4c65d4a65faf76f8ae61a2
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-f#25;m&V8HQs`M)X5
z5}V3S^c>-@RTO`+DQ%UK7mwr|#Y4v$e4g$*<`Vybp`_XIv!>@3&Taoa8hCeBm0C0M
zTA8aXh<nK7$Y*k+d6A%sg8bVBsVA%%8B;o0MCNR&($h@7EcnmQ+iy9~&UbDPgg1#k
oNSNs!nQ?Q%MB#LixAAl0U3$A$d^vd84(K2TPgg&ebxsLQ0O_no-~a#s

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..f5d223a91b7714bb9619719cd4ecd5a945162337
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-ggPTnhcK!Kz6uBNpm
z18Xi<_PaZcqH_+MOq%$_MoB?)Uh5}2%eo-De!D64tCkmTIs3qf<<mW;27||1e#{}y
zpBpjXF!Z)K$rE9iuD+SSL1uFlbC}k<S*8q<X`dLbW~i>)G>1__<KFFC>3j+qZn+Z_
ulBO{fbV=T7-L!k+%ed#uI$EDp?`O!C?p~2FXC5oiSqz@8elF{r5}E*O5=kup

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..001eba06bff5cf62a74ede23281c2ab9ca1656e4
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-fhJyx6Bu^h=vdF0Ha
zqLIh;NXcZQ?hhUfr^_*IuDpKCY62T}O3r5#-k{-fY_G?gqdXNR!bOs8jC)y3lDV6K
zT&Fn`(&n&zd35oP_lXA1ibb1vy0rs&G?W!TBm{DsFX(VNo4VtYqaf!jLmmw!ff*`K
sTho+`C2lYTl-+A$)^|Jn;!`_AJ45%1Yl~ic0iDI*>FVdQ&MBb@02{|cC;$Ke

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1e827465e68ff01b34a66654f1cee713c2ea54d
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTt9Tz<|T`rlxf&
z1J`!V6%%hLYNs&yi-`w{D4rA9zwu|k_kp^c;>`amIeQbLoc_u&2Fz?1ea@(I(nru?
z&4GT4RSuIZJ+3gRKfA`WBIz50%nVCrj}501Lpi4!@qXAHWndI~=5RKnbsF!1lo@NI
m7rdHyu=w2c#lfEc&r650wBMHITJaF*90pHUKbLh*2~7Z62}Fwk

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4d6cc31a449f183755e5f49f78fe54c54e815f3
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhJyx6Bu^h=vdF0Ha
zqLIh;NXcZQ?hhUfr^_*IuDpKCY62T}O3r5#-k{-fY_G?gqdXNR!bOs8jC)y3lDV6K
zT&Fn`(&n&zd35oP_lXA1ibb1vy0rs&G?W!TBm{DsFX(VNo4VtYqaf!jLmmw!ff*`K
kTho+`C2lZuZ8B!y{LsGQ^0(D7K<6-cy85}Sb4q9e0Qv|&UH||9

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..d47085735295dff569a9fda18f7b1d3a7b0b838a
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTtLXz<|T$rlxfz
z1J`!V6%%KioNSr7h~wi_ZmA=-4+IR}Wy>6Cax=7Tw325G=v*H9oKfYakD$YvL-7SB
zjVg8?TbR@zO=AxctY+XlGKW#c;^~%UEvII%{jk=Rn5*^Z<=O_>jcf@?X|Kgs{7TVJ
dn7ijQTXI`-edHngM?hCFc)I$ztaD0e0s#5iKtTWi

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c52d05cc19a636d8d7d953c98b7eb2fb727dd5c
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-flPTtLXz<|T$rlxfz
z1J`!V6%%KioP5+v(6u8!C?>h^d`*eLx#Zm5{-_HY%XF{27i5@P8C5FhFloLfQ%C3z
zA$M7iP3)a+502cq#Ta@<u7TM&oq^NOa;@INOUoGR{J4+#i+=v%cAzhk*&s4an>&P8
f@=wPn+2`B`e>T@MS(Hft9m3%0>gTe~DWM4fAre4X

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1a22b64dddbf09de2fe1147acd272f59bcfc2ed
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|T`rlxfz
z1J`!V6%%KioP5+v(6z%@v#$9^zxM%){;j5VS&qsxw*?$mX3+Y)<&#Z=%2Z9Jj;TL{
z++{sBv3I&XICAF}W9S*V24>@Q22MZAwR#ILEn}?n<91uxRavE+aC{Bp44utixkGA=
eetbN&UGL!BX5~iC|LQ<zFnGH9xvX<aXaWGhz(Ici

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..92eddbc324b52bc0e2e265e79e4b392d7c1f750b
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`M)X5
z5)sx0%7wxD*~?aSaXcvd(AH~c)cbjd+Oco}gEhiE93Py-jx>tTHWmJm@qzWUOvS|J
zboB_wHlquCmFfwcH?<i3<1{CFzq-NGGXHwehLz6K?sE1_2xrtg)Us=VhjjhbpKKMo
Wnw4kj^KS&&&*16m=d#Wzp$PyHjy`$-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..9efad318a9b71dc9fe4ca3fe09700af556458a6e
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PTtLXK!L|)Z*bWu
z2E9AW7Hm7hx8?wgkC=$2AY*+&A&26-#G5j6u3y~sYC+NpzpM+>i-T8kFW;QSSYR}{
zz@0Va`O_4}O$CJ_{J)vnZm!N@+>ku2D&WA29qD0=IWulDrzB5N3Hiw!u%PmNhCKt@
y*(HCOd1i<+Se@lbRm^33!)T(oENaVii~D7r{iUDQoC^TDjKR~@&t;ucLK6VeW=kjl

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d4ab467b8ad654cea3223ec8e14e4d90f621676
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhJyx6Bu^h=vdF0IF
zki<Q)Yj)!f4&NMZJLawnCesrGn=dzTvgG8snI#x9o_*2wU1_8EVrhd$2a5%#7fW35
zb}-&%5Ycm%`^KEOw!;By*uFfvc*pxh182peO+4M&fjk<@iXRdJcS}s;>+-k~)26K`
vI&p#I;RYq9M$e$Q3^k+XM&1P)*31kF?A@g<H$Qm;9me44>gTe~DWM4f*Kb6<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d28289679c6849c8a8dc83bb384c5871bf83fff
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhJyx6Bu^h>KlEkL4
zvDM?~S%(;xE=JdkS*JY;53(?snJY_gn9-0{a=7|p>;{SUXC_Q~hYc1?Z%CVyxIx0b
zL-<P1>4rF)S=F4928{k8(-MnSH!-HFu*lhDCB9tH;c_;0hft89=B$gn8cG5)RGzk`
f1r;f~-jrnMyV&+Y*pJ~K&?O9>u6{1-oD!M<v)Vqf

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2aa6f9f3eb97ce8291a6a3c900138d6b8415049
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr-f_PTt6Sz<`70rlxfz
z1J^B)D;_;_Lc&rKAEYk*(N`@eVDc_|PDevh?a>ZK{S6A7dtR)W+34OXA35znw{3-4
zlc>QK=C=o|nY|NM^VnD}b<tcYY-})Z`O*c!?9=XY^c+~tD1N%7&hh_`V*&i{5}LC4
TyW)QVEobm_^>bP0l+XkKTx31x

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..120a9bd7ff9ab01f2349f157d19758dd4d10da67
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-fhJyx6hEoP8UQgAFZ
z77$<9nR_tZL2%YHBb}@QDTBs_vuA(s%xG{`G<xTnq@Q+R@yrRQ4R~ItE|83t&`CQW
z{HVp`vB?7Q{%3JcY(58sr=~{4bS61SayGJeN9|yARmsvjJe9A@<3dlOgJ9zU6-|8;
i;h6`w83fFl%UD0H?ZYXV<Ay-DFnGH9xvX<aXaWG(B|nM)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..19ca5f5a164d280c8324f1bb0aada4c81c67141d
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhJyx6Bu^h=vdF0IF
zki<Q)Yj)!fj#!!bjIJ58PH$LwIQ0MvlbN})^oAJ?X(flNFUD?=Xn$tHq<7e0!Ssf-
zIf)x2+&hG?^qg*pvzb-RDQUpyA2KbmSalO)stSvoO;+N|1syJDQ+Egj32M%|$g80w
nFhk{OYg$sV3UljCOJ0Vz3)+1yi*xq_9mL@2>gTe~DWM4fhy6hu

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a8c17ee7999d72abb4990a4b7e9229d128c0272
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PTtMSpvcj7^JQ5P
z1J`Zs6`nT^iq1K3^4zN=j!znP+=u^v=DKh%J@?tcf*D<`zcW2Ent$Clc2Ip6cIT`^
z)0rod9ikNn;#h^wIPMX%5SX6kAo=lZgRG%D+oLs`qC=gQ`5gWcuPZUr=uurZqjpkm
n!$AY@?G87USH~<q`io&>Q@f9u^zF?+=P-D>`njxgN@xNAJ;X}7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e6f98ab6a8b69329ec281ac05c91814fe0dbe7f
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhJyx6Bu^h>KlEkL4
zvDM?~S%(;xE=JdkS*JY;53(?snJY_gn9-0{a=7|p>;{SUXC_Q~hYc1?Z%CVyxIx0b
zL-<P1>4rF)S=F4928{k8(-MnSH!-HFu*lhDCB9tH;c_;0hft89=B$gn8cG5)RGzk`
g1r;f)-ux-R(68I>V{KD=9q1GWPgg&ebxsLQ0PVa!r~m)}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb61692365f107ac29231d59f153c3dc7e206717
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtGQpvcjB^JQ5P
z1J`Zs6`nU9h7~ZWTX%OGvM{dyp~Lh3qxgb5;qqHrk1y1;>RGO`knvUhd4{Pwq6)2<
zIgKW#D}+5@suuMyVE-8Pz@f&3`BX<a+nWwcBZ2g(S62xcrAi$u-kOkds^j%KRvW==
oW}ddn67DIsMnBH&{PUFcxKO)KO~dIppo17ZUHx3vIVCg!06=O*6aWAK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3003ac3ea8d1c439cb959c156ffc5a1a8cd050d
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;c?n-M*
z2KIHf6>5d-;RQ@;t21vM3t+VTb423b<QjvgpC2r=TPgX<Y0f<7djXP6mHCVgGYUhO
zGp_nvG?VeHp|{0JzFA4<{L<|iEYnPzm#Ms)Wy&C#_KD%DgzCCoa~LH!-b=sT%`RZF
vc$<fSp*Mp?V%tBbn|~6_8_K)IA93Gp?JiyWeCBVUvlu*G{an^LB{Ts56i!H*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccb2dc670e14a3873a3ad54e5cad7154a7eaf07f
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhJyx6hEoL#EuwaK|
zN4JOJ0uJ9|Nlm>O4hNp4)v);-SSG;v{Za8j7N&;=jPu2-I5X5Vd1iH9>^a>KXEUps
zQ__IZKV({Bu`09Sxg$viHd&GzZn*S3Gm44RP;xci#pueyG<nIM3qIX<I(X%o7~bt^
VI{w}EP!-UA22WQ%mvv4FO#ri*I$Hn$

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..6373bf13b7fcf00b8745543a44bfb80b8793b614
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fl25;m&V8HQs`M)X5
z5)sx0%7wvt*~?dTaU`UEXzMjJ>isRHu8<HBZ=iI5J5qo>F6WxhfyD>qb&4Oj^39u@
zz$$sl!TQPE2Gx|+EH;%(UG!Ea8w>o4^FFwYFS1PCz$uP(2Z!*hCZ*gt>ZNrIEYVHJ
UKSt?n09w!B>FVdQ&MBb@0LMW&rvLx|

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccebff180342ec79b13b279719bed0ac826e09fd
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhJyx6Bu^h>KlEfw?
zV$NJBsL3X>FjG(YD625XjXOQ(8#r%>C_Rj;(VO9*Afxu+vy(pKS(R2tW5Zd6k{7z&
zi}e+m)gE-7GRj$(qHt_x1W%j0F0<I|j*BsEr@391WVo3x=x|7wG(~(?=0xd@51kp3
XwVIWi1hm_LE@1F<^>bP0l+XkKQ+PNu

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae5e9481666522db6b53a1a8a2e5b33e1929481b
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTtLXz<|T$rlxfz
z1J`!V6%%KioNSr7h~wi_ZmA=-4+IR}Wy>6Cax=7Tw325G=v*H9oKfYakD$YvL-7SB
zjVg8?TbR@zO=AxctY+XlGKW#c;^~%UEvII%{jk=Rn5*^Z<=O_>jcf@?X|Kgs{7TVJ
dn7ii-Te4QO^0$g@jX+m0c)I$ztaD0e0s!<6Kl1<p

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..a818c9fec7909a57e33cfc885838f01199e2dfd4
GIT binary patch
literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn>~~oqUk@fC7i>?%?tw
z2ELf;4?d6h);wVG3A=p7MYHSMhhD*d!h!t-bAv?cy!wou9DNeOlBIi|VZoV<Cp?TN
zZ(43+C_5wNcXp1cf@ST6k9-b&H(xPEyKnG1&Ul68!Vw=i1>bc-y;{}`c_!=Qbg!2)
z%ubWBRk>kM&+x#c__h9#qx|0(p0q|Jsme~5o-5v8+W4~TI?!<pp00i_>zopr0OUSQ
AT>t<8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..7705c143d61b35c3406128895e2933f093ef3e82
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtLXK!L~Qrlz%F
z1NU~#6}lUn!%wjIh;^wr@g3VK;?Dft;^*W~`?jw86TVXZ`0?XQy9F2|jg>jGJ`_tb
zO3l!X$zduzW9jjY$s?gGdx76k=gsUBS|gPlVz*36*K}uKK3W}BeV(x~?HgOCz-HEf
o0G|wTu1&pfo6an8`?hZ`k59LcR_Jyfpo17ZUHx3vIVCg!0Qx9HO#lD@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6375173bae12dab667d84c71077807554f44b94
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c=1S{Q
z2EMrJ4?d6h);(bH3A?<c*OkSxCb{RorybMt(t>d55MEQowtaJEpNiEuH;dIF(eKn;
z)dd#%>D&QRx)*2M2sbzrmnz&Kvw4~$t8(G_JuDLv)%XK?!qk?Yl2>3oR2}`B(ICTb
ub$tWlXBG$bGZ%E8oMo(LkeT73xsUN@R(GkBPMH?aT@0SCelF{r5}E+_6h&+R

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c3c4b8c77acdd10045d02dbcd7b82ff1b00fc8c
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-fl25;m&V8HQs`M)X5
z5}V2r+#a>>yTDx(X&fr5B(S<!eS@J}fOY>jb{3P<EXqu8PRJG}98EdNqLcN<!I(Yl
zNy1I8s0j;sQrh<jU1(V|wLx|Hn~C1HHcE2rU%oWq65r1CVF@j7Sa)y;|6+CASLkzx
eJBDwcom}JbcI7)pb$fx%VDNPHb6Mw<&;$Va^Fl=c

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..ec24732f37e9a660b2086bec06e763599009cede
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhJyx6hEoP8UQgAFZ
z77$<9nR_tZL2%YHBb}@QDTBs_vuA(s%xG{`G<xTnq@Q+R@yrRQ4R~ItE|83t&`CQW
z{HVp`vB?7Q{%3JcY(58sr=~{4bS61SayGJeN9|yARmsvjJe9A@<3dlOgJ9zU6-|8;
q;h6^yu*onP7CbnbArbpefI(<sx6k>%-#LM9V(@hJb6Mw<&;$V3gF+?%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd1ae3b8219f3b9bb88a9eaa5632ffdaa30c761b
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-gg25;m&V8HQs`M)d7
z5}V2r+#a>>yTDx(d3ot7fyN!p>KhE*F4X1JCj94Snw8oh$XNEI&0<5+rW7VI)4ByS
znYD{H<gn_V2w>afG><dG>6+JpNx|DrsII-i({lfEkU?haoiuF&r*BL#Eu4Rw6z>1n
h^V#&^%LlLjvVBu)uV1S>-yi4_22WQ%mvv4FO#t(iNIC!j

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..50f722c5122bde3ef9d8cabc1147f7230038c41d
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhJyx6hEoP8UQgAFZ
z77$<9nR_tZL2%YHBb}@QDTBs_vuA(s%xG{`G<xTnq@Q+R@yrRQ4R~ItE|83t&`CQW
z{HVp`vB?7Q{%3JcY(58sr=~{4bS61SayGJeN9|yARmsvjJe9A@<3dlOgJ9zU6-|8;
j;h6^yu*ob^v1VqN+SKloXm^|+=o$u3S3j3^P6<r_D=0ns

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..8cc645ab4202a302a1d524e8ab49eb46434a161e
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-flPTt9Tz<|T`rlxf&
z1J`!V6%%hLYNs&yi!JX|I<it^|HhyF-UsS(e)Icguv`{;^_`>Pl+79oeg)68E`}u5
zx+8(Clg>CU60<Pep5`FBnf<|mGm;KXp?s^oR!qrkxPP^2;>sksIPM#U*$irjbM7*Q
m_P=2~v-I@El}r9V=Y24(y?)Bm09l}G7(8A5T-G@yGywpz>qe*m

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a8aa9bc93f5eacba5eccbb66958ee5582499d76
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhJyx6Bu^h=vdF0Ha
zqLIh;NXcZQ?hhUfr^_*IuDpKCY62T}O3r5#-k{-fY_G?gqdXNR!bOs8jC)y3lDV6K
zT&Fn`(&n&zd35oP_lXA1ibb1vy0rs&G?W!TBm{DsFX(VNo4VtYqaf!jLmmw!ff*`K
mTho+`Z-}vRZ8Ea3W@h;OwcV#g@}>yTMGT&<elF{r5}E*+EIyY2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..8298ffd9ef7ee0d3124a6bab4445ec0d2fefa807
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5OnuBP=}
z2C;3LYgp5Fot&h_@^QL$&XMmc{aZ@oUn`jLbp7Pr@{^~*%_lCF<-#K4bcU~7^@=xH
zqJAv6$raS$E?3|#!>A(Y&3fU<lqbHNa}8xblt&d<l^zjU+aSD=H6iiY3-KMlQwn~Z
ad(G%;*K~Z1vKc4P4Gf;HelF{r5}E)~89=uH

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..f81edbcaeeb47ade91f1fb0e6f2932e6f275beac
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhJyx6Bu^h>KlEfw?
zV$NJBsL3X>FjG(YD625XjXOQ(8#r%>C_Rj;(VO9*Afxu+vy(pKS(R2tW5Zd6k{7z&
zi}e+m)gE-7GRj$(qHt_x1W%j0F0<I|j*BsEr@391WVo3x=x|7wG(~(?=0xd@NeoHn
WnvNe=GRy}$fWgz%&t;ucLK6ThDmeWB

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3ff7e6fc594ce83e1d698d7d1a0e3c6355cbc07
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTt9Tz<|T`rlxfz
z1J^B)D;{T_oP4C!rE_k_58g-idW?_vJ-hT{C1-C++#y>z#scHXQ=c=MtUM#=u=Ys5
z$}5M-wizZ(D$lO*?MV8@AT&djIitX9)2<e;*=#>-btR^1rG0Wc&{xTxu<6V-{erJ2
dAAFfBfBk9m?X@o-<^mnT;OXk;vd$@?2>|7nN8$hg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..89bf88990dd163902853f48741f49d4413292d0a
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhJyx6Bu^h=vdF0IF
zki<Q)Yj)!fj#!!bjIJ58PH$LwIQ0MvlbN})^oAJ?X(flNFUD?=Xn$tHq<7e0!Ssf-
zIf)x2+&hG?^qg*pvzb-RDQUpyA2KbmSalO)stSvoO;+N|1syJDQ+Egj32M%|$g80w
mFhk{OYg$sV3iHyNk_>PEw6AEes&E3jhr!d;&t;ucLK6U3CqcFV

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d264a9c409b975e39e281d1912a8905cd9a363a
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtGQpvcjB^JQ5P
z1J`Zs6`nU9h7~ZWTX%OGvM{dyp~Lh3qxgb5;qqHrk1y1;>RGO`knvUhd4{Pwq6)2<
zIgKW#D}+5@suuMyVE-8Pz@f&3`BX<a+nWwcBZ2g(S62xcrAi$u-kOkds^j%KRvW==
oW}ddn67DIsMnBH&{Ig{L@x1mG67^flfevEuboFyt=akR{08q$9;{X5v

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a9725fe39756b26cccc8ddcc055c9cf182e2e6a
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HQs`M)X5
z5}V2r+#W59x#klpDtO@R177Lml&tTjYPaGA40MEhI6gSN>tOaa^Hxc?_kdl>a)Szc
zx8H>po>T?VPks)}o6?xX_H3%wTbXoOurA*F+%m46@BI>5_HY#lsa;`pyj2nO{3Ao9
XSaba>pNLqX0~kDA{an^LB{Ts51mry%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..9645de2f3adb68f938b39f6c21e559295f03a1ca
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|T`rlxfz
z1J^B)D;{T_oP4C!rE_k_58g-idW?_vJ-hT{C1-C++#y>z#scHXQ=c=MtUM#=u=Ys5
z$}5M-wizZ(D$lO*?MV8@AT&djIitX9)2<e;*=#>-btR^1rG0Wc&{xTxu<6V-{erJ2
eAAFd5ocVfZb3N1Kn595hFnGH9xvX<aXaWEdUPgof

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_green.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_green.properties
new file mode 100644
index 00000000..0e2e5b34
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_green.properties
@@ -0,0 +1,6 @@
+# Stained glass green
+matchBlocks=95
+metadata=13
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_pane_green.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_pane_green.properties
new file mode 100644
index 00000000..4082f196
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/13_glass_green/glass_pane_green.properties
@@ -0,0 +1,7 @@
+# Stained glass green
+matchBlocks=160
+metadata=13
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea6408b855e1e13523bdbef7f1d949a5dc3b8eaf
GIT binary patch
literal 374
zcmV-+0g3*JP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003!Nkl<Zc-n=M
zF-rqM5QVP^hM>hE31VSk5hX}S5CRtQusqOUkt#xpSV_8sAc$BAa?KGt!NS%b;C1<L
zBX9LBvwM45Jnn90?%SPt6K&pRLVc|#qQ5_$udJ5SGbhJ<baW8Q$>FZxskO>unJ#ur
zE|f>i0J5jLY+5aOjemmun_N1h2MZW<npTV@-95SJ@Bad_Op2lqJmY*`0uZhNsN0@j
zo3;#qMH-N%sU%5ab2ya%9*8+OErbBLD)asgN;3$xfRn2L<_72kx*MOC#9S!Pc;x#H
zaVMbAF6dYk@>qNA?*Uu1djNZopx1ip5MrP24Z*DRo*-@jD1I5#<-WHix5qWdcQ~MJ
zL!1B%(#)U=fI>k20vH$YLluCl%ocnAhWsx8ZBzlAJ%Ao(=hkPw`@3*CY&*N~4dBc5
U6D4Br6951J07*qoM6N<$g1CL2SpWb4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..db4c5eb7ab1034d15096958c6c93e823a8716c5a
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln>}foqUk@fC7i>?#b4r
z4178dW**5tzvcmpU)bd<E`pBy_J*(Om42;PZwZ=ey>X#V$h!K1e2uWi8K=b<S|q31
zdOH;P_1QMaZf*%SPvi9PlYjDyLE-qCuMJzZGnPJPTE%q2U^2VMvEW5PPZ<t0Kij(e
z={Nod7kXCrv#>woWbiZY-y~qp{Ee|o=yK?m<re#2C|5Z>WahXFbRL7JtDnm{r-UW|
D6+lf-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e8c76926d1fcd7ab24478e9eb48af50a672c153
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PCm$cK!L;c?#a0_
z4b0pXW*=`EYg;r<zG{-29N@rbZ+Ps#$^riHp4t_@O0K;t+rLlXo6_EJKbs*T?atoG
z3|D_xo@X#RBNJD_sxo78;7ultw#YY(oU-O;g%)T$OJZDQ<aH<1lKH~LJ@s4e%Qal?
yxun#1{0w7)$>pi7H4+=xFPIxnU9|VePquC9Wu=#EIir9sWAJqKb6Mw<&;$UizDw-@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..247b81560b41efd55ba86f0cb21414a2a1df5d1d
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5On?#r@M
z3}Si-x;O4w&D2@xBv8NekXz0CUoJPYW7!K2FPL%PVfJ~3j3ZC3x-#fm6|)7b{~$ie
zcR?%vthEZQ6;Bw;j|e&lZ46=X_4B+p<$~m8#`@)~%Y)s0E^=82Ml*<|_0=`*_GerE
b{tv@S*(_zI@27QuZeZ|q^>bP0l+XkK@7qA?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4497bf54c3d1fc5029f0727d044c51c8e81f85b
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`JXGy
z5)}=Som<~O*;KY_RR=>DTmB6R<;%9mN|~72zOpJa?U}$@_~2;TSr!|qKL?H2<DNXY
z$r(0bA<q`)dz=wY+q@1;4)=O8$;yoR;rp#3Ij<(9mNO|o32o>$Sg5CQ=~!jJ^Pda}
XR$0n+X3jl8`x!i4{an^LB{Ts56l_4>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d567beea54a743e50c5627d504f73ec2a39ea66
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqUk@fC7i>-IH^z
z7}&)=<UHD%9#+7lwmLIwk%%jwz2T|)N8yKMmCdg@ZV429^nrIB^HMc|;!<{oM7O1B
zoEpc@WwK02oc6({$CIgRVsp%VhMNZ2k`u~U)|SRNggV@tv6)q4_G*`<r#Tz?KK!~G
zRL}mv<nb%T#>0P@8w8iV)?ad%{~Obf4H3fj*}`Q`7w3lZ0^P>o>FVdQ&MBb@0EjP3
A0RR91

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..b593cb892d24fd341660a1274f36317c8ffc9340
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;c?#a1U
z4D4bbd>(C04=Z3&U!8gDSOBBtpCc0gCf69uwfw%&tdrMt;k<c=H!d_{`E-w|!Qk;K
zKjx6<PmP#w7<yZr<clzr_e-~DuuL;$4ihRrE7ibbT-lJ-BNQHcj)AA;d+)cq%p9`<
uqg6U)s4~nkaIRmNQ@26-LV0)iE(VL;MUsbhIMf53#o+1c=d#Wzp$PzIXh!h>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..42924abcd2fcbd6eb45e617c1b9269b7088015cf
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-f#PTtMSpvcj7^W@w-
z1}^ahY74jS6P<J5<hfT#9G^7oxDWsT%w-T2J-hOQmCw<pzc!v3&A;v&JE*=3yK~l|
z>C6+!4$+DOajZgT9QTM>2ux3Nko<VILDtZn?a`V|(V<Sud=CGJ*Oi!Q^r$YIQ9CKO
l;h=%{c88nFt78_QWartD`@vvCkRQ-B44$rjF6*2Ung9>oN3{R|

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..db7d4e9c4ea84cc32d3a7d8c393fd361fdf9a7da
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L;c=E=EM
z4D4bbd>(C04^LoHUp?I{Oz_EvUc-OtKRNDbZq<_v;XS#8t#&8h)ZGPE!rTp$XHKz>
zb|{QHC$>OC-2LN*^$9cfo)TlQPSb7Xa(gtdk~`t>8My@#YgLw>l5b#oxOeSe1__hP
t@8lB>>|waTX>7v%v*3V=QSYo<%=Q9BlG;x=Q-F?Q@O1TaS?83{1OUm-Mw<Wt

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..72f461b0de765d70aa9e914dcdc0f1e179396718
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-f#25;m&V8HQs`JXGy
z5}z1~Rj!?@RTO`+DQ%UK7mwr|#Y4v$e9ASG7wK0p>^ivMXN>0wmfQ6z2ijux?wZ@c
zHkXxiMfi>ditJKv94~U{D#*WeFnTiAf%%CTr-nu9*O;JV%as4joi@i$vgmH_0reE^
p0|$-zH!0klFi|*N<Zb+%_yqz*D>Or6WPuK1@O1TaS?83{1OQpXM=SsU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..619b2e7dfa18453db20a2925786ffe952d300278
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-ggPTnhcK!Kz6?#a0_
z4Na_Tc5e1P%jNeVWn+hBe}_j``ocZ_ee(;B-q>}?f9r+*Dv3F}9qzqnP&l)r>oUX9
zAC~7C%+3h;88L^QIeFp@v%=vu*BYjF%}(QWkT#BN*p#WdZqppb7aI3&-!f!>V6xcE
u<AI?!gT&F2w@!9<PkdNY9D2m*)84zs<`u1oO!Ni0iow&>&t;ucLK6U7y;1rA

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..363c81efd46560f299dd41cbb0fb9edd51fa804a
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-ggPCm$cK!L;c=E=EM
z4D4bbd>(C04=-R+U!8mD*eZvY57pg%`hOC=;k?54wtr}W$Z<89Z(VE$4*GOU2~Oyl
zy_n6T`%v7SwZ<B0t2c8VXsev+$fjC&T8AmZa5JmNso+bCPK!6lJiP1wo8dyH+DrKb
vhiw=ya9lR!{`j~dwxM`V_X3*?oAvCEnu}J%dG7uSbQXiBtDnm{r-UW|%_L1W

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..e60f6273e1164ef896b0e46aa7d1c10f4bba420d
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTt9Tz<|T`=1J>R
z1}=SvUYFTc+9^!_(?kMA6wit5-}tlN`+(iCU0eTNX>v2T>-1NSF<|C$(dUdRCw&AR
z)*R@!SmiLu(&Gw~`m<|1E0Vr3$jq>0_SkSLGn8|x5$}iHQ3gh#XD(+mTBq?INSU!V
ndcmuS2aC@wU+nDpe?9kx_PpD^8)Q^~&SCI$^>bP0l+XkK48ulZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..f439b47ccb34604967d6bfe26b564f6ab1518375
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhXJqEoaCBTgaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
j_gR-TgAI%#sp$-<#d$0GqCYeNox|Yi>gTe~DWM4fAPYc{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..b62e65b6e78e53d0a7ba6ebf257dd7fbaf577955
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTtLXz<|T$=1J>R
z1}=SvUYFOUHj$Imx&-2PE^xfV%*UAB^IE~or0XT;m7g39UN&p3_!T_UyBLy0|1~Y<
zRQc$*NYp}byUl{G8_Wd?&v+CLYA!cb4LN3V;C|-87a@ZF`K)g`Oc{iYqxU;pRj+3J
c{bX+be$K4={qN0;fv#ZiboFyt=akR{0GydVfB*mh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae1c143a74a6923ff6b42b6159191cf683a09e15
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-flPTtLXz<|T$=1J>R
z1}=SvUYFUWHj!&Y0$YBl9W@pEe#V{sxkUEsA1hdUlWsZvm17K;xjghaqsq^jN(~XM
z`h`~-RjMasu=t%>D;se14WorYG24U(Q!c*}(#n;3@O(?cpAbX;e3myeOc^GpZrkK=
hb;7}Zjr)cB7-YM%>NOrI%>cTD!PC{xWt~$(697AcMOXj;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc952b3332429afd501723f61d7ebed240532922
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTt9Tz<|T`=1J>R
z1}=SvUYFUWHj!&Y0$VI5KQiz5zk_8?@|v}e7mJxp%H%G!VOn71uYI1`BWR{lLqw;3
z;gv>}>IoSverMLo1{{6EXkk#yHsQgP%ddpAa-|+T-;xlrYQ}PNrm{0q4JVDF_d8rw
fZ<b$Q^O{LkKTG*o@Kko7I~Y7&{an^LB{Ts5)&D@=

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..32ad0f25c0db3243d8fb08f9d1aa020c64e3336e
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`JXGy
z5)}=Som=03*_5_wRR=>Jd;Sdx<;#}GObcsR84p_>>|oGOag?dp7-`Jd&lbPoOryAE
zMOl+*iU#xB3FS=FCae|u@MNmc&Lw?k9ez~mvd*?jxjFX$N2TZkC7%`CU0Xhe&&|JL
Wo29JKAN3DtKZB>MpUXO@geCxnxj+E`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..69b8bb31de44b8643c4920ef1163a3413426d286
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PTtLXK!L|)udsD0
zgLquSEuq}3ummPG?ye~v4fchF9E$G}Z_3Qk{JPL=rBqh8RnOBOD{Wd%M{Z`=F~f7m
zVy3RoMcWu$cUW{UuVp>_CUhI)4MT6+6$vGGj8`+5oq5C9W#}ce>JNj)g+1w8^ckAd
xF8yO<J0s07H?3{cgnG6&Y$b}zqPA?eh`+>BRyvO%WDC$`44$rjF6*2UngAq<N+JLN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f31642b5eb5cba73abdb5fde8d621542529f887
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhXJqEoaCBTgaim?M
z;fR=$s5x_?;H(>BHEbdaGxZKHVq4BA%yHvRPtJiPrdbzx-@7L1yO}32H5NEbcQ;%x
zy&)|paf8Hc@eP)HdD<67@V+>@c<1y9jKUvWQYFR07fA%TIXyVIsLW7DR%GIeojl=A
vT1t+_ZH%rgOp}-Fx!{w+#w_g+SjNUs-BncT5c}H-=r9IPS3j3^P6<r_anC}s

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bae303eb5471085718d31a3c8fff394fda0cecd
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhXJqEoaCBTgag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
g?2;#LU7L&<UWMd-Xt}s#AJ8QXp00i_>zopr0EzHI%K!iX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..074a5276a9714f6b4ebd783a0ba65aedad49f8f4
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-f_PTt6Sz<`70=1J>R
z1}?D$Zi~)tD-?AVV~d;E{eH)DM#t|G*X0ER)&%!Rd|=|9bfEj(EXj(H9}`nK_uObs
zSB_wGw!Xl($9MzFwo?Zt2YXGKWM#<w`1=--l2->dNjC~sm_A6Fc|re0XFktY2G38K
V*=;9_-ve!D@O1TaS?83{1OU^KKw$s?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..336f054c0392e79df21c32f53b8506c74265d16f
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhXJqEgabvVQ;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
js2MfqCN40sW@fl8nfsw?TFEV-V;DSL{an^LB{Ts5&#ypo

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..6aea7776fa0b199603b343c651d6eb47f505ac20
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhXJqEoaCBTgaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
n7<iuIK6~Vu2OHPsVkrhsqdcE7#a+cf2QhfM`njxgN@xNAWc@(q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..382bf6464c610b2a0c4a5469d37a0dec224d65d2
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PTtMSpvcj7^W@w-
z1}^ahY74jS6P<J5<hfT#9G^7oxDWsT%w-T2J-hOQmCw<pzc!v3&A;v&JE*=3yK~l|
z>C6+!4$+DOajZgT9QTM>2ux3Nko<VILDtZn?a`V|(V<Sud=CGJ*Oi!Q^r$YIQ9CKO
m;h=%{c88nFt78@){l&m5lIO#z_j3`@ISihzelF{r5}E)~i$}2l

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..88faee4e27e89bbd08f70fbd09b46636809bbdd4
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhXJqEoaCBTgag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
h?2;#LUYkBEGQ8T5=X1uDArt5n22WQ%mvv4FO#r>-LFoVh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..c452b15d44c9708a89f71afb05c72d60545f6714
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtGQpvcjB^W<Ea
zhC{3?JTuns6P<J5<he&hhAfQhf9UYM|0w=IE7j-Mp|=-AnV$tuzQFQze|m%0oi#h=
zHnPk-X)K^!(72aNWkz#_Zh?Z`EXLF$*34x`WF$K_pGphmoN2`SIDczG%Bhaq>sW0B
pvzd9?DoePh*cw%w-}&z;qtcQ*pT#GZ^aCBl;OXk;vd$@?2>>X)NmT#<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..de22d1e9b93b7f54e5fa82bf356eddf4a3e1cbbb
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;c?#a1U
z4D4bbd>(C04=Z3&Tb+69Sb(7ApCc0gCf69uwe${`KEiFP>UsX*jewU-wfmVGj2^E!
z#}xAXsS(o+!)%L}d^Zf_{nG6jEYpmc&4kL&iZzI(ePSpz^qNy@$z&jK&-_+7ze0vv
u_C$rGYYYX4c>cC-`gt&~;f<KTinyhCQE3I|tzw|F7(8A5T-G@yGywn{T1Eo^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..da6f87682b701b8181eb305ca83f37350594e92f
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhXJqEgapO!=a4a+y
z5TBUjAUNxpQBaIQW5e0AKX_&|_$ms$JNmqdljTq%lb!w-p$k4i5+=fnC8sm)tuXm6
zWR$=(Z-vg`XI^Ycb2^VER9rDi*w`s?Hg(6I0GF<`66P)r7B$bxg)_x=3QF6tFnIZ8
V9zXbBU^>u#22WQ%mvv4FO#lZnI-~#q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..a25b3affff49f9e34a8d2c6cce8cc68de0da643b
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fl25;m&V8HQs`JXGy
z5)}=Sou==<Y${u|s)HenE&qmu@@1LFR*Z~?e>Dj*#+_)g_>i<YjY*F8U&2gg{h|+V
zShP<Bu-#I8&!VFkt@_}kwrY{5?Ci!5-=nz9N>6OEZWR2ab-;B-fVfEJ<JzF-?D6+9
Vk3ZLCY6n`+;OXk;vd$@?2>>>@KGgsK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..c437e2cc0989ae1457969cf71ba6cc9059fe744d
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhXJqEoaCBTgag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BFWhL{Z!|e?F
X)@CXHy%SsubOD2>tDnm{r-UW|aW^}m

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbff65db028bd3b281f0969294d5a36b717daa9a
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTtLXz<|T$=1J>R
z1}=SvUYFOUHj$Imx&-2PE^xfV%*UAB^IE~or0XT;m7g39UN&p3_!T_UyBLy0|1~Y<
zRQc$*NYp}byUl{G8_Wd?&v+CLYA!cb4LN3V;C|-87a@ZF`K)g`Oc{iYqxU;pRj+3J
c{bXtWzO`A(!PjiQ0$su2>FVdQ&MBb@0Hr)X5&!@I

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2aa088eaf62e3644ba8329b04bcf76eae5d10a5
GIT binary patch
literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn>~~oqUk@fC7i>?#b4r
z4178dZXU@#zvcmpPuS%vE}C6mKJ*Iy6AtXxW?5%d-_>t5<?NFP)}*y-7!=N|c;dr&
z^M>U&2BR}V^LAN!I+*=Zc+9LInYNaFiL9fxta^ax1hHo+jGrE91+FY&Sg^SAZPv=Y
z%muRwzfCxh_>bX0#<JJ?N6zwpWBAdUp`<AJT>8hXvQizTrYk_lF?hQAxvX<aXaWFu
CT2CJU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..64f2e3c67a1de630196e8bb65634f709b79f069d
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhXJqEoaCBTgag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
p?2;$PoCBOUJUp5q5&KVoA^m)j&)o^pKY%V`@O1TaS?83{1OUYKMqK~^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..64c2d6424f5fb377fedceb45d9c03971d723ab7e
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c=E=EM
z4D4bbavp6>4=-R+Tb+67n39uaO>)nFPdlb`FPkgsrp~b)i8{yqpDK!^-(^~0Fu5q5
zd&RlaH<?17K3Ze+R$3x${U+7`na$H2nUxFA?_m`=9Ao2P8s+IVRi1(MP<7OACWDM+
vckK@}R5C6QPRkJcbe?fHqs$Bs&3z0Ze~L=|A2w|Ux{JZn)z4*}Q$iB}JibRE

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..3903aab5f60f5d1ea6fc0a2f05f17babf58a9b5a
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-fl25;m&V8HQs`JXGy
z5}z21g|eUTyTDx(X&fr5B(S<!eS@Lfg`2lNva^_+W>IE(b3(Q-;b_W97M-j=4#w<Z
zPZDl&MNL@9lhVFN=t9eysST>j-%RwrwNa8||MH~?m-u$B4@+oy!@7e*_!q0=zCxcn
e+%bIn?Bwox<texR<kbK=gTd3)&t;ucLK6T-HbQ9t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..5491189ae0e7ba9c7ebd39c2d73cb494e617d2ae
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhXJqEgabvVQ;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
qs2Mdk@>;MYJvh*P(O}mfMTR_;BA=)0Hbwy5#Ng@b=d#Wzp$P!Lf<y%X

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..61a217de058e0ea294cb6dbc175c595e9f3faaff
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-gg25;m&V8HQs`JXGy
z5}z21g|eUTyTDx(d3)(9fyN!p>KhE*F5J7dW8+^|#<NAuf{bNP`YbjiZAxJhGp$=N
zlUciHLk_F%i2$}uPV+c3oUVBtm=yf&gzDNGJT3Px2N`6x-bvRsaQem+)57_;N#XvF
iJ)bQPK78={F;n1<y!s?r{sN#&7(8A5T-G@yGywoWjYwAj

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..de9db5e52d28ffa5b592edfe134a067feea040ad
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhXJqEgabvVQ;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
js2Mdk@>;lfma#E>WX<!j;hSd(bPa>2tDnm{r-UW|=|w(-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c3f5bb05ea054bf39436e984fc58bb1ce4f8825
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-flPTt9Tz<|T`=1J>R
z1}=SvUYFTc+9^!_)0T899a$-|f8)=7?*n$nzBzMC9W3GgTFv5+IxlPv`vetZSB8yD
z_K#LDc|KDJ<eoDl+IT_NP3D4xXFLiAwU&pfhMY1v@ILF{i4a5o^{j7Zm@-UG+?Ln4
m%KaO|wY8ToE?n~eI;)LFUVQ?`f@+{^7(8A5T-G@yGywpRO+|PB

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..b221b3d87a8e327757d370f992947ee082d778a4
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhXJqEoaCBTgaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
m_gR;;4Z1ucDX9fzYz+SGc|O+!ee8iQV(@hJb6Mw<&;$U{{Xjhc

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4799e59c5b417d548e69ee89ec18bda7d533177
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5On?#r@W
zj5;v~qBfkhnyItWNuYk`A-9_Ozg%`)yTx93c)^VO4ztfQWE^>N)s;cls+cWc{Ri<$
zz6)CUXRTFet$4y%enikgXk!S2ub=0=DHkL!GuAI>T^{W2bCJtJFq%Out*@?ew?A9^
b`#th24rU(Lt9<DSbOVE@tDnm{r-UW|jLSnM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0b5370237499b86fd832fcbe9df6a0a3df70d1e
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhXJqEoaCBTgag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BFWhL{ZqYV23
WGmqQsoxK|900vK2KbLh*2~7Yl8#?#^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..fec4f8feb6a9c2fbf37fcbd60068c56c29c7252c
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|T`=1J>R
z1}?D$Zi~KJ&C^-8=)@zRuKNoA9t#;9kBGkRuA8CqS!~`%j)wM`Yi#%zc&7F-WU1~`
z31px3#&NNrisAOM1EQPRCmhg`bZ8EqbX7IvmdSzhnFm*d7)~~4Dm$ajFgbNwUE^wh
dw)*=&*^JAxZdZJ|X$y1(gQu&X%Q~loCIChoLsS3&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d59656f6cb0430657599d0b22996f130ce06d37
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhXJqEoaCBTgaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
m7<iuIK6~Vu2b<SsV+PN@ycI7#nyCZb!{F)a=d#Wzp$Pyy^Fj3h

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..c83cac503559113a7c3dd61f4dd431bd6d802ca8
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtGQpvcjB^W<Ea
zhC{3?JTuns6P<J5<he&hhAfQhf9UYM|0w=IE7j-Mp|=-AnV$tuzQFQze|m%0oi#h=
zHnPk-X)K^!(72aNWkz#_Zh?Z`EXLF$*34x`WF$K_pGphmoN2`SIDczG%Bhaq>sW0B
pvzd9?DoePh*cw%w-}x`aMwuaR#XI}ewLk|kc)I$ztaD0e0st7JNPhqT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..59e1bc3499290b493a4f89ac7fd25b207aa466ed
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HQs`JXGy
z5)}=Sou==fY)V_Ts>9(9-@OfnZp-f7nz3VFQ$yn11eXT!O$vN_ZmgNv;NGks@$5ji
zjE(g{E~6=p^CpxtO`EV*=);q#LOYiT&u;wiIf~0{?u68GCgmrg4c!I{^)xOWvoDo1
ZzcMqce(JjdHJ}3+JYD@<);T3K0RVE<MF9W+

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..eecb4a77b611c05d7e6ece49482062e5331c5bf5
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|T`=1J>H
z1}=SvUYFUWHjy!|f{%Q<?koIzEL70DvHzKSZidQb!B-V54ykcr^VlaWF>+<tC=~x_
z1+(Wjg^L_>W<*;r=(@>VknoI0;h^U9tEwTlOb(pSJh&pnP(PpL%?wk9$*J4w8dv$V
c+260cXDppn@4xa`7tj?9p00i_>zopr0J23v=Kufz

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_pane_red.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_pane_red.properties
new file mode 100644
index 00000000..b488d99f
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_pane_red.properties
@@ -0,0 +1,7 @@
+# Stained glass red
+matchBlocks=160
+metadata=14
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_red.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_red.properties
new file mode 100644
index 00000000..cf43547f
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/14_glass_red/glass_red.properties
@@ -0,0 +1,6 @@
+# Stained glass red
+matchBlocks=95
+metadata=14
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c87f0fb5dc5286b5f7a29ca8c78b96d43948345
GIT binary patch
literal 375
zcmV--0f_#IP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003#Nkl<Zc-mvw
zGb8Cg3~!kb^&go(zr`1hi{mU&<Y4j)Acl^T@PBnVK@?otC-^_Eh!-q}O&%l$H(-yL
z*#C)w5JAJ}zW-W&Rd55$v_#<;CT6cE@!!!<3SvNJi1GieTetr2?Ckt6*q4oA0L*Y?
z13>C{vID^0LU94I0iK?o|LyJV;c_5bVFth~1nFe}IRl>oAg99Q(OrNM2H3m+vKf~F
zU>AV=0m7iLK*umSZ1OO12K4v_dkLB*Kp0zEKo$ds0eT!G$2EF7fO!!m9e^ZYag7}6
zAPf>)F`MguXB`JhIsu7;4FEZ--HhXZxdHqCWDQo7cn8G*a<qZOVFrK#5*`NF3;-zv
z8G_FMa4diV3YP(}qzv-{x&a`)cwGQ80OSo^2B4$^5UxqGgU2(Bjh+^KY}HWG0sv@>
V{J?4i(Zv7&002ovPDHLkV1lJ|l$ihk

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..06f3427977aa403b6255f073fd10947c477fd1b3
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foqU#;K~SJ|>%xP&
z34E6uHoNd&ZsH2rwkeV`xz1vb%LlvU3dLhLcD+(D3Yi)8gZ+GCkobn3S&R)c18*#5
z>MAap#rR}~rHy~`qlQOc8rSPLyqU37ZbAv`%94-;N($1?-Y|B3oT3r3li|an%Ey_R
zf0%ceEdDm}!J$2j2Qr_9id{-PVCNv5w92)*`!jdZ#$(2>7RJ2*x{krq)z4*}Q$iB}
DS~gQi

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e63ee7674b78dbbb90a161d00745faf7ed8591a
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L+`cN@1A
z1H0G<pGSOa9<ca@UEb2`$Y}ZJh{XTN4FA0}zb-WE<TYJbx3|4!ff386drS=mkKfH@
zTXF7uD%*zSX$6x+Hzb|&OXY5m*?fyR%<A1NQwGVjPYhQjRNt+d!zht)&;C|Eze0vv
x?nH&8X$%FkBu_b6^4ws4F?&YV#kfZ`%nn-*rQJQ4=>T*XgQu&X%Q~loCIEx<OC$gQ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..9142b6f2cd965602ae90c69ffa6a8e9f3cfaf699
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-flPTtLVAb`U)_Ask)
zLo0U#_qi!2Cuy;KJguE`r22|BlTsXe;o(IQ_Y~%@XLxc%=4vWKwv{*Qh7}*gqkI#3
z`NP&O=&g9#=yOEUfqP>agSOwvi&G3FjT!2fw=THsa^@!27Qt!;)3kMUj?4VnmcReQ
ZV7z*p$kM%<?|?2~@O1TaS?83{1OSlVKg9q5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..f031f1c9ba6b5a306f2d8bf97bb921b8cc22c432
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-fl25;m&V8HRX*X9PZ
zL`8#S=j@_LtI$vv2JL3^oSuo9Js<BhG$hs@>|n@Gag?dp7-`Jd&sM+TOryAEMOl+*
ziU#xB3I0seCae|u@MNmc&Lw?k9ez~nvd*?jv7CE=qf-2VlFth6t}TUeS1R>h?c63}
T?p4qXw4K4z)z4*}Q$iB}J`X(^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..273dc8c39d2f31beac60a95462ca436cbe156465
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$cK!L+`cN=#Z
z1E0==nMY(J4sy;}vutH&5R2uXBO3oZ<M#%6tzGSx<Q%#p_WlFAfOkxW;kpbQ##*M)
z4uxgsj2mP(w_G+!<J9ouE2?FjkbKQ3;Vnnh>m7}&7>v$5VeBfLx}sz!gMq-k9Z_=c
z8Jg1W*s5^MsAniR#Phec=EuP}2Wy>cSLD7<I%NFw+WkhL(-=Hm{an^LB{Ts5g$hgs

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..0c3679929b24a9245cc6b50a2028b414381de735
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L+G_Ask#
z12cDpS|NK_0h9Xb%v;9-7%l%Ck@z>c#^C9k<00`!+IC&=IKNP4g<s>I?F<TMcC5b4
zaJF*iI)<_{LVlZ=!_FLi`G#HL_?ol>UXRvAGEYcU<G;`o_-Nf}(T2tk`!4RQW^gpl
t>Sht#%+es7_Co*4Vg54aW0@cQ#1C8T<GMYaDHG@@22WQ%mvv4FO#tr9OQZk*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..6275d954502658cfa3a8000192799cffb446772f
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-f#PTt9Tz<|Rw@-TNA
z1DC!-?-9PpgTfV?c68|+iL?<H`(Ml{k^JWHt_tR9Nrx-vDU~?<m6u!~<gb0sc!G+t
zD_at4TtP^qO7VmhtbRw<N(Q*Tkt|SncE+J8)Ni%diYb{A|5vjr2fNzr72BYEjco?c
j=2Gqu+fC<8XVpwM-}#Vx;_0tIw=j6R`njxgN@xNA1`R<S

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ba895b65f69eeb70aaf60a21584d52e3aa2d275
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-f#PCm`cpvd8pd6;cG
z1E0x*nMdSu8oAcw?0s{Lze(np#ABP23KN2|VvSZvO>*V^^(jWH{9%!r7=yU6W_e%3
zqdjwU9Rl_G9wo*fG^n1M%TRVEicPfVi0x;=18p;H9Soy9y`~B`Fg>hY`<GF|<nl}T
rgadmRFK`;0aQ`eipkmZJ>lXLP{(W42dcQsc-NfMO>gTe~DWM4f>?KBj

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..32c68724177dbc07d61c295afa9c7cad5c76110b
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#25;m&V8HRX*X9PZ
z#3u%0A^R__F%wSDTDeNYFr}c4Lz>xW>$PWxemr24;G2A{SX7bw&HsrE)<ylV%9y5=
zh^Zt5K4kBbiP*&MteoLwcdIevgf$~;%2^hkIh)+|Rwfw>)cJcmF6Y|$-tB?#Ch-R;
nGu<O6WS!9HFz))Me~w>k-oBaB?6V#L-NWGN>gTe~DWM4f>x@J{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc2543eea4f07d65e8760d2be893a7121e88ddf8
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-ggPTnhcK!Kw*wwYD7
zp^0_P&SLhk0w(ot*GZo{I+j$3o%;RchbO~@_D}v_P5R0tV%h@kzh_u+W=q#*hO0k!
zo?$3FBX!P-+3?KGlW&+4j^|u+=;_*>#(hBAxVm9irs~>Fa~MT5?%lqX&S#LJmOa5B
u=^8^xm*lP1qFobT#ywB-nDV81KSQ9-zM1>hh;aj5#o+1c=d#Wzp$Pyh9!`S*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f7fe8efee15c7b5b3084cd776cdff05d62aa0f3
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-ggPCm(dK!JzlE*tMM
z2Kze<`6^WlShW^xk_l2usyR}*rsaTj1b5q%OBP%HUTJVBv}?&(AI*@GCX^N8P?~p6
zYyns6=2Khp5@zf@C+1LiCWwu<=ZNiQE{(RG6%AQ7s+_U=7(_VU*WF@oa5T>R&%peQ
twZU)3!pIZy>~EOnJia4ps#a%LmMge#rs{h(eW0rtJYD@<);T3K0RT%1MH>JB

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d5f9f2bdd22d73ec3a564499445cd18ba63009f
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-ggPTt9Tz<|Rw@-TNA
z1DC!-?-9O8Md6A~J31C|6fXPGd$vA?>6k?J>mMswdlPOs{gq=3n7Lf^Iit!+A3=vT
z2l_2mIZU$jxWc6V>>AICq;Cu|Gc1`sHk`@~<(z87`(byKfl=t0%h`<9X}kwgW~_}~
m@M_}0;&am%2YdcsFKsQl>r8yllPI8T7(8A5T-G@yGywp?*hVn`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..3aa27e5ed61137c42a0c95872706fe8ad021a43b
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhCrp`Q!*V1u<&iUw
zibfvWBPElKx<7a{oG!<-x$^oks|jq_DLJ1}c!P$^vArH|j`CEP2p37VG45qCN#<?_
za-HT(NSnj<<<Z4E-X|J3D;90y>DCV9(NI?WkPygizM#Y9Z0e3nj)I)C40$w^1ZJo_
kZB0`$mbk&twaJ*_{ij_sEg${=1#}LBr>mdKI;Vst0A9gCIsgCw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0ded67f676fb772abb9dfb7e8dd2867ec7fd8c0
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtFTz=5MR_Ask)
zLo0U#_qmeEs+mp}f1Ywlf2@5a%qY0NIl@3=ntI0hbcS0;-duHM(6;hsGg$vYe3oxQ
zEB~~$3tB6lG?p9@bP(Pc#^CLD^4^pSl9w6lm$NPpc0Y5G%S7-!gVq_DzfC3c->|Nk
cT)vOdbNaS|qI;K503E^L>FVdQ&MBb@07YFwCIA2c

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbb6121f5f9e8030ca96639c15586c2a973fd4ab
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTtLXz<|RgvYFMG
zp;df=Tauc8nzpM*WX<G9Qr*?h7BjodiN5acn<4U9Z0>u(2ENZ5UfDFL*%z|}tp1?d
zX>}omU#eH3bLUp(bu(-mSkg{1NX;pVh;>@(%lv1KSkHW|XAgTFWIuB*NSV1-r@%Dj
egYv2JIpQn0wiQhEiFgfk2ZN`ppUXO@geCw>BS5zR

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..69bfbc03d73176060b13c61fa1d06dadaaed1e5d
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|RwvYFMG
zp;df=Tauc8nzpM*<Q&hB(nsoJm;?&*V&zR2PCOG`a!i>)_F3Z7N(Nu8VwM2ykE)$k
z7gG48dKEf%Ze?CK!?uAX?IeTLoT7+Wr=`Bkf98nwc!_@g;I^ReCriMlGuQMBzMgz=
cT>F01@^#xpD%Tns0$su2>FVdQ&MBb@01p2@BLDyZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..07f46ac826bad788aae642f083833016738da486
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fl25;m&V8HR1SMCiX
zPi2E-=j@_L<IqqShV9MfIXx3QXFfmlRg{J2b&~?qritv24s@TL#aUtUqbZed&xwPZ
zh1V!JOJ=m!2yJM|ncASfUS^{As~bEm^REYOSm`XcT$n}iJyTE%XQ|^vvwy2T^TwUt
VCgKwKX${bN22WQ%mvv4FO#tESKOF!7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..011ca1e2fa0a58120b85680f3dc0e6a73978abb8
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm<dK!K-qa~pSA
zgUqIe=MC07nuIMPmtIIRwSV@(<;ZtQA^9a!eg(`9;oa&gd#p%Si~nKKH5~@MG@*AZ
z8XoPLqw653ckWSU{6T~2sksbgXM*^(BxJvz(Q4o|u5L)`nbe|H&%kB!UiK~ffdw<S
x)Hg7GW^-6RbD_?Y!wt3#dPhRKzllAUj+u2Rt>L)b4WPpqJYD@<);T3K0RXkbOZWf)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..5512cbb4ca78f7e3cf29c5dda0d3fe959eb9c5ca
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-flPCm<fK!L+8_Ask8
z1H0G<pGSOa9<ca@T|VNX*|mkeCvczoC*h=?tvA13%*yb#Eb%+*FlVYPLyLsyd{qT$
z{pErO+9D2R-q_5NqRjuPj%kA8wW0&J#J5~1WDI58A~>1##O$C&LQh#7+&@)i?)=VZ
uadbzPN<l|FgTbVivsz0m68Ilnx46$Hu`kWMmSYRhSqz@8elF{r5}E)h&`0?I

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..239fd78a3d9b9430b877096dc4acf085ec48476e
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhCrp`Q!*V3^NfMjF
z##WD`XB}c(x)@zEW}WsZJjlXiX09x~VMaq*$>HjYu^S}XpP4Y}9X41ny&-K*;sy!#
z4&f_3ryJsIW>s@a8Zi2YOiL_Q-Ncxx!XjsrmH2W&hs)X29YR5ZnzJtQYA6ZJP<h&#
g7F49{dQ+02<k8NDCaVjxfi7Y2boFyt=akR{00&$@v;Y7A

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..defc0689ed19992ac7f0ebfc41249bffbaca6c60
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr-f_PTt6Sz=4A~vYFMG
zft5Qz+3?fyu0`Vf5rJIga|{(aX0F#)T5uzeGf6>ujYm_4RdlLA<U{W`)s8g&z}^SE
zJZ}%EeK>i5`-XM1hTqCauUSWYdgfmax|GTEI+Mlm!Ci-0sZRS7>T8l$v0f?M8YA|v
RelpN*22WQ%mvv4FO#r!YI|Tp$

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..73dd6df9d3aec745e48063c0f47e01633a98d3b2
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-fhCrp{*vzS3XNx`wu
zSU`MXXYRpt2f<m-jC8UJqzoDx&Yu0jGo!&((deCPl78BO#WN?IHsE=ox<E2oLMQEj
z@S_%!$0iHJ`=7-*vH2Vjo|+mF)0yNT$=S%>9kqkeRV7RB@KnAoj|)AC4uXvbR5bNX
igl8VyW)LuIE@SHQoe%Z$O|*b+VeoYIb6Mw<&;$S(JwHwW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..8185b75ed870e5321f46a9068e936d1fc41dc013
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-flPCm$cK!L+G_Ask#
z12cDpS|NM*3l_gH{al`|_*=|!JnuanoO(8X^^jlOS{KuPawq%C-*X#8&aAfa4mfbS
zQY3^Sd*=(TRgCHZH&p}}X4|fCJFb|+nZnF1H07*DW$06l1ozMPF53NXm}3wv-)XZ!
nOdw-fw)m%)Zf)~l&&j*IahL7Q%87G<?qTqB^>bP0l+XkKQ2j+Q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..f55e9601fdc77a88d998b7e6649df1deb92b3a0b
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-f#PTt9Tz<|Rw@-TNA
z1DC!-?-9PpgTfV?c68|+iL?<H`(Ml{k^JWHt_tR9Nrx-vDU~?<m6u!~<gb0sc!G+t
zD_at4TtP^qO7VmhtbRw<N(Q*Tkt|SncE+J8)Ni%diYb{A|5vjr2fNzr72BYEjco?c
j=2Gqu+fC<8qu%gOpS;U9%(cG|=oki1S3j3^P6<r_H)lXq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a1257426441c2a80069c9b1b36a9ebe9d131e1a
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhCrp`Q!*V3^NfMjF
z##WD`XB}c(x)@zEW}WsZJjlXiX09x~VMaq*$>HjYu^S}XpP4Y}9X41ny&-K*;sy!#
z4&f_3ryJsIW>s@a8Zi2YOiL_Q-Ncxx!XjsrmH2W&hs)X29YR5ZnzJtQYA6ZJP<h&#
h7F49Hdh@3ML#f>^+qt)!=K`I=;OXk;vd$@?2>?iAKpX%7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7dadbbfe835310b9f61869bd117d1196b251f3b
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtGQpvci0d6-qU
z;SlQz&l?9t=NveB?op8;3*-79Iy~<`iZ7UAB%Zw3n&)WC*DESp9R9wSTp(nw{Vqkp
zG3^u25w1H4>zO#8Da3KhbgWNvko<VELDtZn?a`V|k)ck@d=CGJ)|HrP^r$S0G5^Rd
nhUUb$yG*J5Jok#%)mJjCRo-QL<4Bwk&^-*Eu6{1-oD!M<-84qX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..21e9e9ef23be1de21d564c653441814f115cbb83
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L+G_Ask#
z12cDpSs{B^0h8M5%v;9-7%l%Ck@z>c#^C9k$}AlvXXlQ~#Tx9Zf)(EDGH@8bdu8HK
z9=A@rL1uG{`AtU6XOBw0F`FD;ljh*{Xk8?;$>BRT4(4v1yY<2u*be=6`~8lQ<?ISw
tA(t~k41O~f?hoL%zrp+9@}u4#OoylKOFLn+q!8#T22WQ%mvv4FO#nq(NDTl0

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0f9b0ae1bbe14872e8466d6540f8c635f2e3b63
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-f_PTt7d5WwLQ*~}{2
z(8RjJbH>S&Ta2Ey^T+fYE#33D!Qo6zjUeOEGH(Iq$OKm*m&-S`non@Wf6{U^sqV;P
z$xp~&H)||si#u>n(xuSrY|tf@w4^_CrcLq_jwn~=U|P?1Nk{k>>+i?X#&gB5oZY%(
T{TDSWpzREvu6{1-oD!M<QD{8?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..a191e236053518fc560ae2990fd2e1519bc9aece
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr-fl25;m&V8HR1SMCiX
zkIjLeBffjr%w46W)G+m+wArx}N6uX5<dE1V-o$ajDeQ=&$?Ua49XTJ^*UPv}b`DXm
zaBef&z*(vOfc2(zqek4ynclN*__XZ59<(Xb>Dpb+rU~JUnTJ|-C3r}`pKN9SDt7CR
U{ud8d04-<mboFyt=akR{0JJVZS^xk5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..d12d6b81e99604e566965d0df4fe605eb13d39f3
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-f_PTt6Sz<`4#vYFMG
zp;df=Tauc;Sa@Jc;sfQSKl-ZW1dg03e)&s_sjJjefcfTwMwJhXHm9-4iSA2@WYYik
z;3h}dfeU<FnCJ88G_E!J@MMazm*?CWjUS7nxU5Pa6iPV?RG3dlnt4J0h5UVq%zK{J
W+eGw?ZC3*AXYh3Ob6Mw<&;$UDCOt0z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d55d970a1bd10d3337f4f185fea35f0066406c9
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtFTz=5MR_Ask)
zLo0U#_qmeEs+mp}f1Ywlf2@5a%qY0NIl@3=ntI0hbcS0;-duHM(6;hsGg$vYe3oxQ
zEB~~$3tB6lG?p9@bP(Pc#^CLD^4^pSl9w6lm$NPpc0Y5G%S7-!gVq_DzfC3c->|Nk
cJbfRdr}Z|G*N01H0Ug2M>FVdQ&MBb@06D-xUjP6A

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf8fe4ac9984eddeb15c63e031e1ef657b9f033c
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>~~oqUk@fC7hW>|s`G
z26nLzIgj|(JYew&yL`n(v+K);UcrCDfzCY>XRn+8=t5i7j5)I$)?AfkXpx*cM|FXO
z^>RUnw#Y-D4b(X`+~iYgm{Ja}`P#5WIb-Q#rd3Rzj?K|^xEZ6W73#-OVzNG7_iH(W
zpYb|5A&WEe3=(Hc{<fC<I4H-kU%*#I<#7#jv&Nw`cY#Hlfo@~)boFyt=akR{04=ad
A<NyEw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..833a3e2245115f30455e2dd30d28653b7b2cb439
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtLXK!L|4vYA!#
zK&$wIZAbXx6om~UH70Rb&gc%7;l1<tiT^3f?+ZVLXUZHue!R3piNPqXPbK5Qb1P<%
z8M-k!Or>X7RjL_TX55up5nPz@jbW1^H`5kh?aHY|Yy}G{{IlO%E?6*guj8VQn@k)c
n##^{eH}(E)TC>FM+rIgq{Px*qJ27tux`)Bj)z4*}Q$iB}rhr7E

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b09c2591bd35c52bb2b06e4964f1dd855196966
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L+G@-VA4
z1H0IVoJV}?9<ca?U0%}b%3@iQ-1Fblj!9Eh?$zX33-yi|OnV(r$#FDtJA=lVC3kKz
zt@>QFjUjZW#cH45Y;8AJ=P-&KUz2*_fX5x<e8!^&;`{-<VUvQM@;fwsxOc6NfoE3c
ucYcF}IEEK3lCxTCEE4z|n1wZun%}S9m$rD~o&un&7(8A5T-G@yGywoM<4EWL

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..5814d063410b1472865b4438d807e1bac7c540d4
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-fl25;m&V8HRX*X9PZ
z#3u%0A^Rt-aT89@TDeM~F+$d+vDdIED*L*;zy%%d9*zyl<wqJtC#wo?Sn-khtW3nj
z=2Yzr$2Ox0!k_#cgg1pTO`EgHUGL?QG=)F&rZsu0KiL=ED7Z=dfs)S)ah9LQb{6Ct
d$kf!@rQg^k!f|}o5uhs=JYD@<);T3K0RU$SK}7%n

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2decd509270a4ffdd203d6a66b3386298db0767
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhCrp{*vzS3XNx`wu
zSU`MXXYRpt2f<m-jC8UJqzoDx&Yu0jGo!&((deCPl78BO#WN?IHsE=ox<E2oLMQEj
z@S_%!$0iHJ`=7-*vH2Vjo|+mF)0yNT$=S%>9kqkeRV7RB@KnAoj|)AC4uXvbR5bNX
qgl8T+z$U|FSn%LzhD7W?0frxo_u2kj%CiFKCI(MeKbLh*2~7Yt*F!`A

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..b87f6e4b0404931417c896cb3d03381c8741d27a
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-gg25;m&V8HRX*X9PZ
z#3u%0A^R__aT89@(hF_nI3jD)*lXAnm7V<P2RGBK)Fwg3vL}5O8<IAqFo~JgEttuy
zU9=&GRrf>y+a~8Y&J3q(UI!)xe><W2_6ASO{mVfHneBJNwGEuUF~ziS{%umY|6|YR
gtp{E{c>S2|j`^;FMGM?IfDU2sboFyt=akR{0EW~?EC2ui

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..99fd221bff26ca777114d94bab309429396fba96
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhCrp{*vzS3XNx`wu
zSU`MXXYRpt2f<m-jC8UJqzoDx&Yu0jGo!&((deCPl78BO#WN?IHsE=ox<E2oLMQEj
z@S_%!$0iHJ`=7-*vH2Vjo|+mF)0yNT$=S%>9kqkeRV7RB@KnAoj|)AC4uXvbR5bNX
kgl8T+z$UXu#hRI+dh#w?#!WiOK-VyMy85}Sb4q9e0Cy)oZU6uP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b5e6306ec1dfb8144c66c8f521c1c07c7658ee0
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-flPTt9Tz<|Rw@-TNA
z1DC!-?-9O8Md6A~7QP~ieoKG!o~@5zIwo<PUpIs0ve>Kd91W*z)>`l@c&2qRB(c^V
z31ppg#&MCDh2i!z2hq*!4-TA>bZ83oTkW-CN@m0Tt4$MECe4fEzG0ZnpmsRtE>md#
k8^$$jPhVWQ<o|WvW6O6H==`4H1au68r>mdKI;Vst0B%!6hyVZp

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..10be40b5a27085caf77728dca3329d14279c87cb
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhCrp`Q!*V1u<&iUw
zibfvWBPElKx<7a{oG!<-x$^oks|jq_DLJ1}c!P$^vArH|j`CEP2p37VG45qCN#<?_
za-HT(NSnj<<<Z4E-X|J3D;90y>DCV9(NI?WkPygizM#Y9Z0e3nj)I)C40$w^1ZJo_
nZB0`$z9GiOwaLiBnwjAi+b-KOUB|yb7cqFc`njxgN@xNA+^RmN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..96c8041e31313cdd9d2efd90c29f50ec58f61c28
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-flPTtLXz<|RgvYFME
zft5Qz*>JMD_bQD|KTfgoK9Vcoa5z#bD9v{C6WiRMJPz$M_U__Ha7{nS@J#fd(`L>!
z9}aF3-6GI$GojCdDMRTRSHelno3n+ilC2)R-}0d3RflC%quL{3ht`>k<0rhEeDJCD
adUj*~tvhDUke>i_0)wZkpUXO@geCwaQb1(@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d2638a4bf1d173d07a08b2ff87879da97b8b4f6
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-f_PTt6Sz<`4#vYFMG
zp;df=Tauc;Sa@Jc;sfQSKl-ZW1dg03e)&s_sjJjefcfTwMwJhXHm9-4iSA2@WYYik
z;3h}dfeU<FnCJ88G_E!J@MMazm*?CWjUS7nxU5Pa6iPV?RG3dlnt4J0h5UVqS8N{l
Wx9)h`aV8FEKZB>MpUXO@geCy8Tt9XI

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..9360f4a481fbe1248eb9c286f9731ece59a536e2
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTt9Tz=4A$vzaZH
zfst20Iq-7mvu>T&N3z*xE0q0UQFwG~mtEFDg~)9$deRxJ&b)c*%Al>~&1RtgQT43V
zh9v%Jy$f0^w=ln)q1>RBww7VqoJo827G7S)T<6E_x3q8OV!@0gJH`;5;xF8nYK?yU
bK4-r7+qN^ZcM>>(ZeZ|q^>bP0l+XkK$pk?Y

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..143555f0600a46145a87f55c374b20d3a00f160b
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhCrp`Q!*V1u<&iUw
zLlXDIuGx({IAUeyGrDHXI=x}#;nV{xOlIcF(i>(pq?H`5z8JefqWzf(lip#21=AbS
z<|J;AaPJVl(sQ~Y&Sq9Mr=$U+f5^1NV%1HIsVXdTHd%=;7j(FsP2C|BB&a#-BCm#$
lzzmhAt!YWcD$Gl7N-|vG-8D0cl^x_P22WQ%mvv4FO#p`nKvn<%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..443fa690fd54fb0d12553117cd261c2ab83d4e1b
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtGQpvci0d6-qU
z;SlQz&l?9t=NveB?op8;3*-79Iy~<`iZ7UAB%Zw3n&)WC*DESp9R9wSTp(nw{Vqkp
zG3^u25w1H4>zO#8Da3KhbgWNvko<VELDtZn?a`V|k)ck@d=CGJ)|HrP^r$S0G5^Rd
ohUUb$yG*J5Jok#%+0W!(Tfb}Oo@3&&K=&|sy85}Sb4q9e0OM*$82|tP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..6888680c611151124f9e9209bcb292e67c3fd867
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HR1SMCiX
zPi2E-=j@_L<IqqShV9MfIXx3QXFfmlRg{J2b&~?qritv24s@TL#aUtUqbZed&xwPZ
zh1V!JOJ=m!2yJM|ncASfUS^{As~bEm^REYOSm`XcT$n}iJyTE%XQ|^vvwtf;?_rEr
X-&XKy_t9@a`x!i4{an^LB{Ts5HFiL=

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..41b217d177d5497ff1c93d32e7a897b75a203830
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|Rw@-TN5
z1DDtWw<I-xvGBkagZAJ*Y#-&PHy9qfHEVj*1&?RCTRw6$9P^30$GN~WwU6PIYMn|T
z`>Z#Piv?8-x0f9d{miM*7-`hNwp?Ys_lhkq8}46j3SODC>@vp<!)OMz(>Z^c!sqkU
d?fYEAuy@wBf*TJ%ssUZW;OXk;vd$@?2>^<{LsI|%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_black.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_black.properties
new file mode 100644
index 00000000..4566909d
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_black.properties
@@ -0,0 +1,6 @@
+# Stained glass black
+matchBlocks=95
+metadata=15
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_pane_black.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_pane_black.properties
new file mode 100644
index 00000000..97e092d6
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/15_glass_black/glass_pane_black.properties
@@ -0,0 +1,7 @@
+# Stained glass black
+matchBlocks=160
+metadata=15
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..316522f46cb455618b3ff5427f3a099b1a39eea0
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-fhe|&#`zg{AZfhomK
zvF3qx0Kbp28ADhDd(OTx>8lJWW{PKdUd;NilV$qr2YL!iBxB{CS@GykSTr*uT}Za$
zMOWuW&O8RsbBDxxkF+p)GE7esDU9hVsN{~cy}`Z2g?CqK0&~aJ9$(qOMvn^tMT-T}
a7#LD7JxN#=+42DB2nJ7AKbLh*2~7Z|Sv~>)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3c316538adafb8e16ce4559fe87b832babceba6
GIT binary patch
literal 157
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DV{ElAr-fhe|&#`zg{AZfhomK
zvF3qx0Kbp28AF%@hk|s&88t8CO=>lI2VYyI{1<-g#dAGy$;^y&p=9P=Nt2i+s-z2k
zQeOEfMY2z+&s$J0KQYulM<QT}<Z`Pnrp_l*T3Hzwp3U9YsI>Z*KhQn~Pgg&ebxsLQ
E086kl=Kufz

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..70de401e03fd4df91fa5401a6b4beb420af0f13a
GIT binary patch
literal 135
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ex5FlAr-fhe|&#`zg{AZfhomK
zvF3rc3%{R30HamI&ZeZZM;Ju7IWpa*tDh_t$z0}P_%=sLbb^$%OQzbXfS7xSR?WO&
iu;7HX32#Oh1H(bf{^Ufd%V&WmGkCiCxvX<aXaWE?LMy2N

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8704a1a5d3bd51070ac75f12d7ccfc95f6277b8
GIT binary patch
literal 165
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fhe|&#`zg{AZfhomK
zvF3rc3%{R($H8aW+XJ5_u2XO`W^=ga!^05CP|m1$_QfZI>xmVOB4=H!C%<rT3HRyo
zEnxQGD~!45(R)MD%Q&#@(I>G@X_F2!+)Z0_h+%%Whf%|v5~nGQ3=Vl)o%Gi5#Q^PP
N@O1TaS?83{1OV!(IZXfn

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a29e31b7c2fe068dc333000f8f2149836cf6986
GIT binary patch
literal 206
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn>}foqUk@fC7i>?%?uQ
z3^F^uJ-B&9HsT=XoJEhXn3x8-OgQY{^J{*`zsEbz2Tiq}xadqsUwuKYMhN5V(^3pG
zBwKC09gO_=Y#Vrt+mGk@$V}+5`|y=ffOqp1=1J=mruK2K;OOYGjA~e7qskS^$53Lj
z-d1;OJ%gX|Iy)hYGr|l#X}dNFm@$82>=L*fx@Eb={;L+OftS<2uLU}g!PC{xWt~$(
F698l&Onv|W

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac20892dca57ec60a8dd11ab5aad7d08b2e47417
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqUk@fC7i>-Idms
z4D9P{E7S_v!wQ&|zpya%y)7X!@vwi-M|;i>hfC$Qt}J=f+7-b2UNKL@v~f>7qr;5C
zZ+^@vkDp&*zG2{Pagr;-(0%bHMu)b@w~X4d=4YiE#L_k~R2q8C3BAdD;o_e9E%)Ub
zF8AD0YCNvPm|${wYU>us4eSBxhF2Ha9{I_(*oLv?z_D~gpxYQcUHx3vIVCg!0Diqn
AbpQYW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..510790399c0bd0396e6d933b0e742ffe400a0364
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtMi5WwMj^W<Ea
zhNf#xvsz}}6X{z#)vzT$&e3@X`wo^J>mT3gU~NvSW6rf>ULZI*T%2*si!+iAdk@8X
zm^F&oWo&B_c{Gvzj-We(=aC>r6HC>~V5f8+_CIsQ=J?4Px@tdg$zhC`Vfl;oot@;H
beV>`98GTjmKHi=NbOeK^tDnm{r-UW|fto+N

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..76a4ecb12a0d7f742ec55a8cf913ef153abc0acc
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HQs`M)d7
z5)sx0%7ww}URb^j2^C~q!*g$gq1&?GR_9~|4A$sN2tMf4>0s73%T{}E@d5ud%MVKI
z=lwP`@uV)0{p58(Xj3TDygflm)30ol<fvc2G$FWMXSJ||;(4Z+7S2+~iDrGhR{iY0
X{$G_ZWGy`jbO3{=tDnm{r-UW|1OYu!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..34b4e01d354d809698ff38a3cbbc83e4335df74f
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foqUk@fC7i>-Idm*
z416)wAABD1t$D!Wcd;;Q)+`Oz3y1xCKF$AewIJSo<*B(h0>rc)O3&f$3RQTviIpMI
zZD|^p$GLMG**7FlD|mHGhw<b|$94P+MQ5Ve*2p?$%c=*6I<(ESaWGmZG*yqCA+P27
zx@otq8+?t=$qD7msAniRbmtd$;m78^4Vxm?th9;HU<~Z}tY;5&9fPN<pUXO@geCxf
CC`|_d

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5ba7a0e05fab765bb4ee7167ede0d84a1e9497c
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhcLe6waCB@}czCqp
zgP2K82jeLZWhQgxLcv`YcFbKDOr|FWx1Vm{WXZ{MGfOaJJo}>U`=Z?mhJ0r;Sz_7}
z9rPK`S{zO=>=RI5Avv9KZ-vQsA)^GQc`I}dKl4gqKIOq-Q*q_cB}c)|S*HtBmna39
vES3&%Q84g4#eLQ#&0qs#dq-#wFEfMcg};&?_9gcN9me44>gTe~DWM4fjjTk_

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..31ea8b5999733b2db824e5e089a7c8e5a4496bd1
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PTt9Tz<|T`rlxf&
z1J`!V6%%hLYF9A%Pb_?NYLmb-jd|SN|97&~oHtdgeO&sYi}CZ$$ro6@?oV&<y0d1-
z<VKd6CyfQP3!3+Gsmy4u&@E8VJKJFNXfmU9QXkKe$kffNT6|`<eT>qTm}&H=EQ?V)
oDYxOEf%kTYo64(W7N6w*x$nmZy>)MsfbL=NboFyt=akR{0C0dxDgXcg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..3fa6a203878d831f9e30654093f60677ea2c53bc
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;c=1S{Q
z2ELf;4?d6h)*WE+yIA;YX>TZtWleI=e@{E6@1<ANUWV|TT)>rUX+CvUfrT)4L-Wij
z*4_?faeiV7+TzuP+w~J>>^-H%V4bGh%;ffHUL|M3;WKgy(rZ<go|121dboG(Uj_-2
u%dg}U4%jeW;50Vj&MZElV$?h96|;`&UrCRvPT@djF?hQAxvX<aXaWG+8%1&e

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..da2c361a3ddfca875d7b5941bb291ddd08dcda3e
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-f#25;m&V8HQs`M)d7
z5}V3S^c>-@RTO{HHSe-ds7t3}v$4w!i3u-v_Ss!fyTfpH!R3l`Dz6xB*Q*?8i`lbl
zY6II`ZJ~hm1x*U<Qg0kDatKY>UKU{dWNHJ$CKo0yzet<uQ#QWjs9&zSJh&|;O!))f
rO|F6sXV&Um$vJVN)41!K{yF_#)xRtL)a||tbP|K7tDnm{r-UW|?g>oi

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..2eb2915b98b062144953bf97034891ab39c57c45
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhcLe6waCBTgaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
v7<iuIK6~Vu2U|wjy(VUTx5F<!wKHtq{CCCM)iaj^-NoSP>gTe~DWM4fvYbeA

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..09652b326e553763d180670fa48c50fd546be746
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhcLe6waCBTgaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
t_gR-TgAI%e-t1vzkLzi>_>`ZK;rxuhD=Kbj%mKQK!PC{xWt~$(69B@DMkfFO

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..92e199c126a34ffda1ce660d1355ea397bcd691b
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhcLe6waCBTgaim?s
zBj66t5!V-we(-2GU5;t<mDOWb6WFj*az3N*22Gbkdw;|jG&)%L9C+Ru$27~6t2r&n
z<gw8L@&0FVPHa90gr}z7h&k!dW4uv<r$35K$4qeXPM+!FT^<*E@*D&k52$GBn+VT7
oDY4*YB{$z53Esu0<(U}f&iQ$}eaS8bpo17ZUHx3vIVCg!07bS#YXATM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..9068d194b12d1e7700818f3ad17d21bbeb85455c
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhcLe6waCBTgaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
j_gR-TgAI%#sp$+s9Y0sZen_+cI)}m2)z4*}Q$iB}Dm_56

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..f07d979027d6f8350a34b76d1cfdaf6a27574c37
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhcLe6oabvVQ;?VRc
zO+n8|{CK*9;H+mxIj;&N4H_HHp8dfyqrq2E=-tuhO`I%;5}EAuzX)CM36d}oUMxAC
zac_mmcOjz$rg<xL4nOl^OPbSpG@;^(QNqSfiL<FY_5`?erIj#uaj>X)RxX@*!-vi2
efq?2wNrp9YU+Xoev7QCGgTd3)&t;ucLK6VcKR^Ni

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..520102cfaf2d7bb1817ed82fa451d2e013d8c6a5
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhcLe6waCBTgaim?s
zBj66t5!V-we(-2GU5;t<mDOWb6WFj*az3N*22Gbkdw;|jG&)%L9C+Ru$27~6t2r&n
z<gw8L@&0FVPHa90gr}z7h&k!dW4uv<r$35K$4qeXPM+!FT^<*E@*D&k52$GBn+VT7
hDWP%V)PpxX3|tGo*2@_dr~{qC;OXk;vd$@?2>`9@KyCm4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..be490ad2bc68864caa16d1c6e7e87ca393eb98ad
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-flPTtMi5WwMj^W<Ea
zhDTe)uBe>(vaCQRUZ+Q~X6p{#hjMj{=aOf8|91DyP`NDhs)EHKRW58E`-CM%t_&N6
z;vcPG_WY)Bkz>w`XzK-CH<=3(p7AIg)NH@18gk3z!1>IBD?$wU^I6`^FlCsWx~;Bp
gl|P$(+|O&QTrOXgznh)50Xl@i)78&qol`;+02WX~zyJUM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eac57fcd8192a62c409cf5d87b037439308647a
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhcLe6waCBTgag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BF<Vn(+r_M1P
X4Em~Ewkuu?=mG{$S3j3^P6<r_ZgD#V

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..0cb6300b9126877a3430f1fee88c9fffa09df372
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foxGd(fC7)p-r%xR
z40?B#E!cL1Z_NP~pNWM{N~%f^{9|OCI;tbg*q?9Qy3T5a#Hz_sUsC_CywZ9(aw~(y
zOwS#QnKpec+QbmK!=kIbmhteL&}|Gi483hN5=!nEuVyei^M-Mgp_kCAKMWcd_M~so
zXJ}5l^pBD43^&8vw6;wX>e$|}nJ6xc+A`fDe!n7P%i4*4{6M!cc)I$ztaD0e0ssW7
BOlJT9

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..38fe9f48c0595b2702b84a1c965248b0af1f56d6
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhcLe6waCBTgaim?M
z;fR=$s5x_?;H(>BHEbdaGxZKHVq4BA%yHvRPtJiPrdbzx-@7L1yO}32H5NEbcQ;%x
zy&)|paf8Hc@eP)HdD<67@V+>@c<1y9jKUvWQYFR07fA%TIXyVIsLW7DR%GIeojl=A
wT1t+_ZH%rgOp}-Fx!{w+#w_g+SjNVXG5>GrGAk_}pu-qEUHx3vIVCg!0C?v@jsO4v

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad6398d5f924c26313dd6510d94ba95711462972
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhcLe6waCBTgag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
g?2;#LU7L&<u4n%E;P+nsH_#;vp00i_>zopr0F((s0{{R3

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..53d76db3f734c3bd2f4968992385700fddf5315a
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fhcLe6oapO!=a4a+y
z5TBUjAUNxpQBaIQW5e0AKX_&|_$ms$JNmqdljTq%lb!w-p$k4i5+=fnC8sm)tuXm6
zWR$=(Z-vg`XI^Ycb2^VER9rDi*w`s?Hg(6I0GF<`66P)r7B$bxg)_x=3Tm@4n6rP$
Uo@u{xA<%jTPgg&ebxsLQ0L|YzA^-pY

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7adaab116b2745ce412000daefaa165c81d6a11
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhcLe6oabvVQ;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
js2MfqCN40sW@b2{_v6Fa`7x0|$1r%h`njxgN@xNA-Ht%b

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..de55e7baaad96603685a3061a5d9bacabe84eb4b
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhcLe6waCBTgaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
n7<iuIK6~Vu2OHPsVkrhQ_n$u7GFdMG9mL@2>gTe~DWM4fcsW6?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..1202c0d5d26c7780fd8ba09a98ccdc28005e6648
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-f#PTt9Tz<|T`rlxf&
z1J`!V6%%hLYF9A%Pb_?NYLmb-jd|SN|97&~oHtdgeO&sYi}CZ$$ro6@?oV&<y0d1-
z<VKd6CyfQP3!3+Gsmy4u&@E8VJKJFNXfmU9QXkKe$kffNT6|`<eT>qTm}&H=EQ?V)
pDYxOEf%kTYo64(W79ah=_)F@i&$Z|jZlHr0JYD@<);T3K0RX8NNk9Mq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..8977b0fc72d809d077e02d827e54b90a654e2512
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhcLe6waCBTgag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
h?2;#LUYkBEGF(6U(}yL?x*g~g22WQ%mvv4FO#sM1LN@>a

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..c091f83a3be4e05ce62bd9b2267ac25f7c707c7d
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhcLe6waCB@}czCqp
zgP2K82cyRl!Oq!@J2+xx<}<ox%sRbc<>Ax=EKFwRkBt+U%vwEmh|lL%6X0m){ITbP
zw}Y`~;su|cv>3K8k1pQvKGDEgv1k*|Y;DPoLN&4Ghk>UXj;bY@On>;vNl<gvMP3ah
pff*`KTho$^C7DgEmrv|w<lp(zXVSB+B0v{0c)I$ztaD0e0sy3mMCJeh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..595ce6513a605630de49edb2cbfb9861fbde3bc5
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L;c?n>)Y
z2ELf;4?d6h);wVGxmcJrYnx$+1HZjt+kX{#pXVDrgWn$MTQzCP^9}wQ=8gNlGb}h`
zv1&7eYK7%@2EH>=e!G~>&QxEx$?wp3^GrkU5$DaU3del}7g#Jl5;)zKLHy8fx8Ls=
xb!J_RQi(9kW?)Iw``c>s^I%@X88LnpaW$R4rIoS$n}H5v@O1TaS?83{1ON~ROTz#F

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..f51e58949e08b79607a47ecb2657787b68b4af6b
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhcLe6oapO!=a4a+y
z5TBUjAUNxpQBaIQW5e0AKX_&|_$ms$JNmqdljTq%lb!w-p$k4i5+=fnC8sm)tuXm6
zWR$=(Z-vg`XI^Ycb2^VER9rDi*w`s?Hg(6I0GF<`66P)r7B$bxg)_x=3QF6tFqkKQ
VIWA}FH34WpgQu&X%Q~loCIAC-IsyOy

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..663b197dd7bccc89f8e2573cf92c99ab125dc1cc
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`M)d7
z5)sx0%7ww}URb^j2^C~q!*g$gq1&?GR_9~|4A$sN2tMf4>0s73%T{}E@d5ud%MVKI
z=lwP`@uV)0{p58(Xj3TDygflm)30ol<fvc2G$FWMXSJ||;(4Z+7S2+~iDrFst?Ye1
We>raV`NMml{S2P2elF{r5}E+xlRmcq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6a65d12be6609b30147c7db8180cb90f7b78d8d
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhcLe6waCBTgag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BFWhL{Z!|e>K
X4}DeED!i-%bOD2>tDnm{r-UW|a4|b7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b6a0d5db13fb938376b1f2f6457b6dcd84344f8
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhcLe6oabvVQ;?VRc
zO+n8|{CK*9;H+mxIj;&N4H_HHp8dfyqrq2E=-tuhO`I%;5}EAuzX)CM36d}oUMxAC
zac_mmcOjz$rg<xL4nOl^OPbSpG@;^(QNqSfiL<FY_5`?erIj#uaj>X)RxX@*!-vi2
efq-hH6vOI6UzKBeOBMs&!QkoY=d#Wzp$P!dYCt&v

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e6c92a4f248bc775c658a09ae3e771a8ee69b73
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln>~~oqUk@fC7i>?%?uQ
z3^F^uJ(zh!HsT=XoJEhXn3x83DcRN}xBPdx^498mOv#^+d#5IdO?DRS*lNPuV6b?S
zF^fy`^9xKj47@E&i>EbYd~rNx%^;b!mVJ$^qqZ!2fT)A8ab$zVPOp$vZx~)=#O;k*
z_nu)+nvAVV!3=u_gIO<saVLIkwr%+1WU_HW&vWUg>ls_(6dv0GoyXwm>gTe~DWM4f
D*t$)U

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a5751d5472f588ede5f202cb9cc4a5fe5e1ba3a
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhcLe6waCBTgag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
p?2;$PoCBOUJUp5q5&KVoA>_$lA9Y<JDWHoOJYD@<);T3K0RXhXM700_

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9353d4bd92818efbf8bf58f60c9b394d66b0626
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PCm$cK!L;c=1S{Q
z2EMrJ4?d6h);(bHxmcJrYs<!t0KWSYkLxG(AE?Z^bCoUB*|%e%{%`-MdLrp(nHCtR
zKRqWDFlYK^R*h3f15Ms&OQfye#Ocr%d3r(9#2x8zOeYK`vun6%PY!y@K7r|>?b=#K
y36tel?GH3mGA$5J%Mkl?o^dy$%nT3BeGE>5e@jdK*R2P-jKR~@&t;ucLK6T*>q^i7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..b73c34f316a2e02f008fc473c28bdf7182471e60
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhcLe6oapO!=a4a+y
z5TBUjAUNxpQBaIQW5e0AKX_&|_$ms$JNmqdljTq%lb!w-p$k4i5+=fnC8sm)tuXm6
zWR$=(Z-vg`XI^Ycb2^VER9rDi*w`s?Hg(6I0GF<`66P)r7B$bxg)^tzso?0?{@_6O
eMT1>`6d6v%|5WZ_U{?gXgTd3)&t;ucLK6UBJ3w{-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab60c8ea0204552b3f984853b4794c7f7729f124
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhcLe6oabvVQ;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
qs2Mdk@>;MYJvh*P(O}mfMTTh0zdjkpK_7r_V(@hJb6Mw<&;$U(RYTqY

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..282c59d7562c02dde4d43d62cdce5143feb607de
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhcLe6waCBTgag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BF<Vn(wH!HdM
h_DJw9J}uA0V0ZRseNNE+9H3JeJYD@<);T3K0RWC8J_G;&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..3df68a28aba14c13ed4335609e9bc90f7859487d
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhcLe6oabvVQ;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
js2Mdk@>;lfma#G1lltkS;U204bPa>2tDnm{r-UW|_Cr45

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..36a6ae1e9c5312c1db6d7d7cc77d4459ea107a42
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhcLe6oabvVQ;?VRc
zO+n8|{CK*9;H+mxIj;&N4H_HHp8dfyqrq2E=-tuhO`I%;5}EAuzX)CM36d}oUMxAC
zac_mmcOjz$rg<xL4nOl^OPbSpG@;^(QNqSfiL<FY_5`?erIj#uaj>X)RxX@*!-vi2
lfq+2%!A9}Li6uXs88mHw*0-{sD*!r&!PC{xWt~$(69BgBLstL*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..73ff42d7dbf55c20cf4345f146957f12edd9a0fe
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhcLe6waCBTgaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
m_gR;;4Z1ucDX9fzYz#JYe)<TWP|yUrh{4m<&t;ucLK6Vp96*Ht

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bc7b529ff4023d46fbbfd4213b75a7012a4abe9
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTtMi5WwMj^W@xn
z3?f^^uBe=OBGR{bs$olhoTKv&_8lxc&L`&{VQo&TW6rf>ULZI*T%2*si!+iAdk@8X
zm^F&oWo&B_c{Gvzj-We(=aC>r6HC>~V5f8+_CIsQ=J?4Px@tdg$zhC`Vfl;oot<RP
dzRy(*Q?GqF{`bn`D?nE;c)I$ztaD0e0svYQK?nc<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..3df9c2a6c9fa42ce00b0c8686be1e4673958d1d2
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhcLe6waCBTgag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BFWhL{ZqYSIl
Wz8r76Ez=Bi0E4HipUXO@geCwx1Updx

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..067054d346e224071f013576cad7ab2f40b11a1e
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|T`rlxf&
z1J`!V6%%Ki3{IJ|qf6<?OOgGKe~zm@*w?qSBrnTJdFHf$<H`(LpErE6X;7J}$<#6R
zhoHNx$0qhpw+Bb=++qwpBiF!eoX)`MXSqgi;iYAab^hFLOS>v7loO7xVVt3}`73uw
et<jI)=lB(RzTTEHZPo!ggTd3)&t;ucLK6U&a6=3L

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..f310397f433384bb7389bbb777b1f68158fa8120
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhcLe6waCBTgaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
m7<iuIK6~Vu2b<SsV+OOuKUcV<K0OL_4}+(xpUXO@geCw?JwmDg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d06d7b85b1ae4f7d9a3fa4471f1b02b3d1f5ea0
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-ggPTtLXz<|T$rlxfz
z1J`!V6%%hLYF9A%Pb_?-)TPtHxV%D7=iLv^9p@MG-#YU2f{5&~;7J!4zV1(N@QPWx
zV`?MI%#+3f+67H}xm0E}SLhZf+?&OidPJMK?1+qH$L3R6p`0^~cpv9)O-MP_@p={O
r9l>m7p0=H(+*53gD$eixv&3FN^yiAS4L1XTPGazM^>bP0l+XkKo&rd#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac561ba7061a81def2876d1b4cd012c3d0eefbed
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-fhcLe6waCBTgag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BF<Vn(+C(pGr
Y99;Lcez|tD3(yG+p00i_>zopr0J^R`Hvj+t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..42034d27a9f074ad08d17443813d2b30827db257
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTt9Tz<|T`rlxfz
z1J`!V6%%Ki3{IJ|qf6<?Op*PLe~zm@u<GAxYM14xJab#Xab*Ur&s#p(G^k9~Wa^mu
zL&#m$V-tI)+k+!_ZZU?Qk!xT!PG{isvs|mU@X|8IIzMi=rCpU($_dBUFwW4~{FOVT
f*67F2bC1~+48GRaSNxm@bO(c{tDnm{r-UW|gVaN@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_orange.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_orange.properties
new file mode 100644
index 00000000..41553be1
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_orange.properties
@@ -0,0 +1,6 @@
+# Stained glass orange
+matchBlocks=95
+metadata=1
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_pane_orange.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_pane_orange.properties
new file mode 100644
index 00000000..84b6f02b
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/1_glass_orange/glass_pane_orange.properties
@@ -0,0 +1,7 @@
+# Stained glass orange
+matchBlocks=160
+metadata=1
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc088c6eacef5257a075aef7ae99020577df14fb
GIT binary patch
literal 148
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(Vi}jAr-fhe|&#`zg{AZfhomK
zvF3rc3%{R30HamI&ZeZZM;Ju7IWpa*tDh_t$z0}P_%=sLbb^$%OQzbXfS7xSR?WO&
wu;7IC7VeA*Cugs}d+dNgWs2P{sR?lmxh;D*gja?51Fd23boFyt=akR{0RBKS%K!iX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b54006ccccf4a75a0a563a723910b9e52976935
GIT binary patch
literal 162
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`nVv3=Ar-fhe|&#`zn;zLVB>m+
zy+3#uv=vw;@H(UkFO`fGUK!UI&2Y)X!+4iX*K3VSK3j}CH!{W=dNz7Y+RX8DVo2pC
z9(TdxOF5=*->^#Ej7Q^APq3_OBa3n6=dHITB-HxPxQ8=e;$~POwfVf6Aj3nTr3{{~
KelF{r5}E)#M>m-O

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..193abdc94adb4faff2abcbd3cb982ccb94405086
GIT binary patch
literal 167
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr-fhe|&#`zn;zLVB>n0
zFG4{Ze%{IrsZ6;pU?M9!;g#qF)&g;XOFer0#j<VU9v6M42DlY6?n+9^X_9s*>UiAc
zmUV<La8{?0$n@<KOef2*y)Y9NW&081GKtZGw{>Y|Nly-UPyaf$CE^VC7q6P2sT~ir
Pn1R95)z4*}Q$iB}uhBVT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..13940d42788fa32217e510a293eb7409ec7b01d9
GIT binary patch
literal 141
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`A)YRdAr-fhe|&#`zn;zLVB>n0
zFG3*=d=p}wC#FrB>+fN_%f@rvVh>~2uFQ1dl?{_x+JcP(+a7%q3p;zHjnVbq!dQo9
opL;cL&Dh#bDu2Fswc!gBLuPnK@&^t_H=y|pp00i_>zopr0H{GTp#T5?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..a64d95f828f72ede6ed906933b36efa0892d496b
GIT binary patch
literal 160
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`>7Fi*Ar-fhe|&#`zn;zLVB>n0
zFG4{Ze%{IrsZ6;pU?M9!;g#qF)&g;XOFer0#j<VU9v6M42DlY6?n+9^X_9s*>UiAc
zmUV<La8{?0$n@<KOef2*y)Y9NW&081GKtZGSJj*=5on*%qgMYlEap>yRx)_H`njxg
HN@xNA-6b@5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..0291a2ebf3c447b4e33f4e889df6164e58680bd4
GIT binary patch
literal 128
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?w&4=Ar-fh6BaPY{P^|WK9%dj
z!Tt3dyds%uH-EO6EIvK?iB*?L@RAv2W)rzQdSw@x2&Zc3<tJYC$&m<nB72L~L{+W%
b3lqb{@9~<_K8tSyjb!k2^>bP0l+XkKeXc4c

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea459b60716977f0a3c0efbaaf1044ac0a07412b
GIT binary patch
literal 128
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?w&4=Ar-fhe|&#`zn;zLVB>n0
zFG3*=d=p}wC#FrB>+fN_%f@rvVh>~2uFQ1dl?{_x+JcP(+a7%q3p;zHjnVbq!c2$Y
bCt3_gpT!s45e~cwG?Ky7)z4*}Q$iB}{B<pt

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..683cfe1b6af8e72e919a83f0c16ea1096c8c8617
GIT binary patch
literal 127
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Zk{fVAr-fhe|&#`zn;zLVB>n0
zFG3*=d=p}wC#FrB>+fN_%f@rvVh>~2uFQ1dl?{_x+JcP(+a7%q3p;zHjnVbq!c2!?
a7KXh%(fbxK7oP!|$l&Sf=d#Wzp$P!5@hiOm

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..45a0af6a4e94c5868e5bf24f623a387231814bd2
GIT binary patch
literal 125
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr-fhe|&#`zn(3skvZPe
zMCPWcNT%A&(iW4&rzbzL>M{vlGNa6FBA13&#tswVR1LlS#H&6z5&=(SZ?T#zRbyso
X7mnU%U#n6FG>^g4)z4*}Q$iB}(w`?;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..5cd99450dc0b841c519a48e8d8d0fee6a190ba45
GIT binary patch
literal 206
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn>}foqU$_fC5jeb;9!(
z43;U3=bNlknjf+FT`bgE+H~yCi-(OX-W$8!FP!hc^3>cD0cl#t?RSWYtZF!$%FS@5
z=a8J}ggKL)`4x_zdALzpm|bN#e@!ie%W<8r4NJ5=mM&%zWxQzM&Of1Nxy!;+j1AIf
zv;Do_${$!JxwW4~`WYvKpYirh0%FYH7`p_5b#DdFiJxf~7|1O2T@vU(22WQ%mvv4F
FO#qngOjiH^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..73799d2a260cab726e44cac4918838514deee250
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqUk<fC7)J?1o|s
z2foMy#Rp_JITkW4e_=88l31tO#l!4^|BY3CKD1ePE5vH!LZy(y)g9bkz6$Sk890p3
z-OFrv^Jh*KgLN9GdL*Ovvlk&|3?~d%+a@f1ye^V?LZTY~gx<hMYfi~ENT2=f{`)Os
z&aA*_l^cfM3>IhaoN|idxxu_*@{FvDa*t}5)17=<zI&f81-gyF)78&qol`;+05KO#
Ah5!Hn

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..f307b826790a466538668448d1bcc417e0bbaea5
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-fhZ#*eh?q#a!Xk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f~h
cm)`I&L|Hf*&78Vc4d@C6Pgg&ebxsLQ0Q6WvRsaA1

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..612745db3f7e16f0ed429b4083c5ae59f144ef48
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhZ#*eh?iD)Y(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nuA=SKn7n?D5@
Y1VbH-I*VcyfG%M0boFyt=akR{0ALn9Hvj+t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..5eaccfcd31a60d287a301a1f671fdffb04559204
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foqUk<fC7)J?1ti!
z2ANF_&l{{$njf*uT=Y1^i`94W#l!3u|D^xP+R+!?Rir#mL)-HQ+w-O*!4*4gm>Y~1
z2O6`eq(8sGbi**)!Zi6>!;>cqu3Ix$rfD;8>r2?$$Gn1bLFY^xhgmVIQn6(WcR1F^
z>0U2qn4KnLt8&BOKf{BTonOTtJz}qB+!T@HDJP@n8|cFR+X(1722WQ%mvv4FO#nnI
BOKkuE

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..1e206b4c9dbe1e80ca56032c63d5409db3778dad
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L+mc0+Lq
z1E0==nMY)AEGT4J{=&l4_qK$VLi>D)!}XK+mnB<Ahsz#mTNU7aJ~2Mv9aCjKqr;5C
zu;q+hpNr%e-^@^*lfu4cM)~s1@(nVZXEADb?oQ)%Xq#!{VCdGlS<jt;?a*(x-|rY%
w&aTiEaycW!;5TF8{t4ptH+VBvA2p7BdE8S&EA{a#pt~46UHx3vIVCg!00Z7fLI3~&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..30e55defffe9c0075ae7dbb19a9b1ada239d179e
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PTt9Tz<|S5(x5nn
zflJ?^_Xyujg-<N=lpY_MnyPpv&_-PBe=%pp`h1^X#~xo0WqwwyzL4`({dtC|J0c6!
znK_Lnrz?a#V5=7OFkt@}^}r!!7GvrWb>^}oGLjvePo;%&&NSkEyfw<eDD}wOD@<WW
nZZR|`PRncD<Q}%uZL<8{BQF1g^{%o5-NWGN>gTe~DWM4fpbkVZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..7fa751ca14988fe227e4a8b47d34a10f68ee0137
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L+mazk+m
z1E0==nMY*rEJ$Qp{=(wxrDIx6GW!gV{a2B1e7z%ka*0-3N<izjIkUZdE#`Ex9ysW8
zYObn+wZ1y{gsI(ocia{?I1`sD+#tJonj@of;rTr*8xqs_C-jC*3VO=#(D>orwK@i#
vS(#t?4HD)tyl9b})w;zpL1?C%?^nhTGM*agF9RHa&SLO%^>bP0l+XkKLOx0D

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd377961d171278beeba00a4159f7e1047a8ce87
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-f#25;m&V8HSCz`cvi
z5}z1~Rq9@_hw7aWwOu}QRfmu>TYAR^Lxsz=Hnj_UcQDLyT>f#6=Lv?}^(qJ2V)pEs
z+Q2rKm2*Y7#X==^sW*-nIZPGu-#QpQnd-p$M2b_xBK2cT(6MF8f96h`<0n}Z*?Yh`
rMf<=(qwSj%ZcdmeoG$V<eolO#w&(VL9OBhLCoy=s`njxgN@xNAY`I4t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..145d9a676b68cbcf96e6eb1f293ad2ba6b1df017
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhZ#*e}EFiFaVkf^L
zL#M8bRvz0UrINxLHj#yydWV<sO=lG5xN)Z^=RgwEtc$$wUCR$9$;`UUv4iJuLmbnr
z!ZsjR(J#PQkGbk&#yi!N11vUyk!@$Eo?x3YQJ~_(iq@sgN<ya7A9{JXF3E5+U(n%@
vFlmbTtj@C&c`m%!!^$4l({}MGKO;l=PS5R~2FEu69me44>gTe~DWM4fcK1mP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..a389d8265bddb8faddcb2ff46ce7140eaf95c4ae
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
vNmImUb)HE`V0O4!$<4P%f_L$0c_xO*^E|f~c5K`RbQgoCtDnm{r-UW|m}N&L

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1379a81c4cf503ce0b78752759553e715e67aa1
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%{U{mGvTP^MY^xYHABBWsV>@QGgy4>r>W@1Um>LUaG@R$&%VIKFgzfB+
zjAN+|`f_LYw(!hoP}e%WVdtbqiS#5x3AwF25jje3#gcmZA`=%$-fd7~YV-_>%TP0$
nZ0NB0vzSbUp_JQndlrVoMXs+@<ii&O9mL@2>gTe~DWM4fAYwqW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9ba5b91c87ad9c2fa8484442bc4efc47ea612e9
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
mNmImUb)HE`VAeQwjzO%?b-N13l2)K|7(8A5T-G@yGywn<(nBQx

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..c80687a7c7f14e03e89864f8c865dad860f212e5
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhZ#*eh?q#a!Xk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f`R
e2Nb<F88Z~9IQA+3TGbA82ZN`ppUXO@geCxKWkIX}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..39f403c57055dfedbdaffee63d597dbc4f80be74
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%{U{mGvTP^MY^xYHABBWsV>@QGgy4>r>W@1Um>LUaG@R$&%VIKFgzfB+
zjAN+|`f_LYw(!hoP}e%WVdtbqiS#5x3AwF25jje3#gcmZA`=%$-fd7~YV-_>%TP0$
hY#1<M>cN|m4Ckgh_D$KDS^{(mgQu&X%Q~loCIG@6K*Rt5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..638b3da0260e6d4bf1dda78a36e054ebd1943955
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%{U{mGvTP^MY^xYHABBWsV>@QGgy4>r>W@1Um>LUaG@R$&%VIKFgzfB+
zjAN+|`f_LYw(!hoP}e%WVdtbqiS#5x3AwF25jje3#gcmZA`=%$-fd7~YV-_>%TP0$
gY#1<M>Ol#HbJmVVam|-50bRo2>FVdQ&MBb@0Bo^8kN^Mx

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..e88b2e61b84d6070e40c32c1934a099380455061
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhZ#*e}EFiFaVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D&rHC6MVDRUWH
XBOHw^`2F?*UBKY!>gTe~DWM4f#nL&V

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..12f1aa95bd8e4b8285c3756c75acec8f5bf1c97f
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqU$_fC5jeal-Q#
z43;U3=NZcjnjf+FT`bgU6<hr?lh5C!X1?ObgB$0rUCpP}_G$@R?ag|v(uXBsx(t44
zLhn{IyxB8H$3aZ5?@?m>0fXwPx(sD!g7~>4WWS%$YTz}lZpi7G)S_k2z-97Y@-6p)
z1v9tQH!yx?a#%idq0W-|jJp|qJ64LlRXr!(tnS;gi}BwIpxYQcUHx3vIVCg!05Awj
A`Tzg`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4621f381dfd9b818291b9721c5a25242d422fb6
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhZ#*e}EFiFaVkf^L
zL#M8bRvz0UC6kT1KX^2pF2}UF^7=8W32fLYd9&dti^*c?d)-Ikdh!miFg<M0>rZmf
zXFPl3P=cYEenN4TB%kv}sSDli#rlfOY7aV38R@KZF<j8oa-iAuZBm4lhEia$<hqs+
vm!>ox<}MBvHP6b0Gf(ianKdkW!^5Dn)UzdMmi1Mj!x%hW{an^LB{Ts5KOjRO

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..a64a170312ae56322be4139fbc23e818ed8bbc75
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhZ#*e}EFiFaVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
f^JK3`YC6O0e3$>0o(3C%E@AL=^>bP0l+XkK(riFa

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..e642e141e95318d83ba21dacc9b09cd9b13fc184
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fhZ#*eh?iD)Y(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nu^NI8s$;nzQh
Vs@tD;8v(6n@O1TaS?83{1OT&aJ*xl!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ee2dba206362db11682fd93781c876b6b680221
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhZ#*eh?q#a!Xk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
j@JV62eaIoRjE$kk#O42^r3=>s9mC-1>gTe~DWM4fx>7(0

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7e553e8177a74daabc358de73fe903111c51a04
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhZ#*e}EFiFaVkf^L
zL#M8bRvz0UrINxLHj#yydWV<sO=lG5xN)Z^=RgwEtc$$wUCR$9$;`UUv4iJuLmbnr
z!ZsjR(J#PQkGbk&#yi!N11vUyk!@$Eo?x3YQJ~_(iq@sgN<ya7A9{JXF3E5+U(n%@
mFlmbTtj@C&c|_8ln=t&cbB*p3;NSr|h{4m<&t;ucLK6V`p+g4%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d91ebf08a8033599a130841c269bad5a6df90e5
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-f#PTt9Tz<|S5(x5nn
zflJ?^_Xyujg-<N=lpY_MnyPpv&_-PBe=%pp`h1^X#~xo0WqwwyzL4`({dtC|J0c6!
znK_Lnrz?a#V5=7OFkt@}^}r!!7GvrWb>^}oGLjvePo;%&&NSkEyfw<eDD}wOD@<WW
oZZR|`PRncD<Q}%ut@|VMJ_XlkqoU>WfevEuboFyt=akR{0N;*8MF0Q*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a167e8783323fd270055907664815b9c30042a9
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhZ#*e}EFiFaVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
g^JMRol;_S2vroH5Ck1SB0Xl`j)78&qol`;+04nrBkN^Mx

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..19fe7f1cf09107b8ed22128481818ea632f51f47
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-fhZ#*e}EFh5Yc&Pj1
z1Ko@t0?ZRUl!eTh3k7#s*fDoqFqxhh+<v-&lO-qbSo#5$9IlB4`gY<z3Icq>A1W74
zZ%CVTXu(X0vpaZR99_I~`UFPd4=$;aX5mHxk9~C54lka@*zJ2HL+|j@R;3`5#nJ&T
p3I?91xX&I*Gh)jq^HUaQX1Kh;H9BZbN-EGv44$rjF6*2UngDH|LaqP+

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1ff09ce642aabcd88636a418490ce57b4f579f2
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L+mc0+Lq
z1E0==nMY)AEGT4J_QJx{_qK%Ag7*0mhwCTtFH5#wy0R?EJ=F73@eTDUvmNeNGX$i`
zT#alH+B2t`fjx~^{Vt>QGusz$*cTkgNju>7XyHw!3CYVi0_FrhT5(#gf%{?Y;@a;F
xVrMgSh1Se4WoR;({?BRNp9FJ<v~KoE+^>{9TYBuS@c|vi;OXk;vd$@?2>?q3N=E<y

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..999f9c7821ff45edb140849c0afffb073413062b
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhZ#*eh?iD)Y(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nu^NZG80gW-3S
W!?h(k9lL?{GkCiCxvX<aXaWG>7d;gK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..27a39e1c0deb081089a3b118bcc57f2b2a60564a
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhZ#*eh?iD)Y(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nuA=SKn6o01Fy
XKOL_1|IAnqbO3{=tDnm{r-UW|JtaQW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..495859f3a7606369b2e6dba71f32bb77d0d84505
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-fhZ#*e}EFiFaVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D)BWv+Qg+V~k6
Y@=rJ#-A>&q4|D>9r>mdKI;Vst03q)?YybcN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..0de323b553be3027c49db09163672983829da1df
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhZ#*eh?q#a!Xk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f`R
e2Nb<FnK0y^a5M^8#XS}14hBzGKbLh*2~7ZH+d)JC

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0cda90925f1a9072d3321eedbd7e62b50d4c245
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln>~~oqUk@fC7iBb;9!(
z3^EZ1j61D2I6h|axmcJrYnF!VMY(;3hw7DHmA#vuB5SW2Eq5uU=mgW&X>JSwX(mOx
z8eY7S$zrfh<6WM0PD)^|-HQrlh2uG28`dgEEKO$5V#-KR;}>8L?{u5W%OE~0eBHFu
z)(x)4-{gdJX4o?n%-Z=y{LmBjYKBivIvXeTo#tJ+)wiYgtsTg{44$rjF6*2UngB(B
BN%jB$

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..0acb361ca82ec46bb4253dd3c87b9effd80c7607
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhZ#*e}EFiFaVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
n^JH)Pg0_Ui-4_jZ{ZV9)c;y*=DAo5d&_xWMu6{1-oD!M<G+;&d

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f09b94c1e573817780ffee67a5fe4808d2fb464
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L+mazk+m
z1E1c5nMY*rEGT4J_QJx{_f~|9MtgqGNBfiR4{rFq%W7V=Q0>Tt>3^3OiFa*IV+@!v
zxhS1e<J{?+Od?MoX-It&<=Gs5lSSe9n$&=U9(RoO8B=DQWENRG)pO-1W{<`X^RDe<
x;F)##m3+bh8^#Nq#wOf9pEulP;PY7`63-^?*}^n+p)Sy244$rjF6*2UngCe!OK<=H

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e138e524bdd8bbf27ba13958560ae937daad8df
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhZ#*eh?iD)Y(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nuA=SKm7{DY0+
eixW$JIy3a8x*E+c)5rw6gTd3)&t;ucLK6W0AV8h~

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b0d1ba9627101420ad66b8103530353fbdaff48
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhZ#*eh?q#a!Xk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
q@JV4~mM-8pa-dOsabn3&X9jtD&**tdn)*ODF?hQAxvX<aXaWFK_CNCg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bc00be7e07d48346070b7ef1d75feab5368cda3
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhZ#*e}EFiFaVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D&rHC6MbO`pYN
gDh#FErrWbHFkN=-Tim->9Ox7VPgg&ebxsLQ0Q!qPZ2$lO

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..f81704ec185be6c460b87e3f44a6c9eb3b52d7ef
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhZ#*eh?q#a!Xk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
j@JV4~mM-X+^oECFk%DV<X08?|&@~L6u6{1-oD!M<#lt;#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..5520a916b31917408543e8f6edf77942d91c0c03
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhZ#*eh?q#a!Xk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f`R
l2NV_VH8JbE9e(kto#CyCYo8mdnjFwM44$rjF6*2UngCq;L~;NC

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..d83d0da386a20a0c5a4f1a6a7811e5a47f5c6664
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
pNmImUb)HFxme4qH>cJZx28Knh(VNR#4**@n;OXk;vd$@?2>=B#MaBRC

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b2f2d6ec566fa47ba3acdb629e85a468d69c9cf
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-fhZ#*eh?q#a!Xk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f~h
ehu+L#V~D)taP4uA#&)1H7(8A5T-G@yGywotQ$uh7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..492142e700d0572ac6425bb69ecebb6d57ee11b1
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhZ#*e}EFiFaVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D)BWv+Qgx)}3w
W9Ii<umMsQ4fWgz%&t;ucLK6V7Mmr<`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..30fc4c9faaed4dd31184750b9915eb4167c9a868
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%{U{mGvTP^MY^xYHABBWsV>@QGgy4>r>W@1Um>LUaG@R$&%VIKFgzfB+
zjAN+|`f_LYw(!hoP}e%WVdtbqiS#5x3AwF25jje3#gcmZA`=%$-fd7~YV-_>%TP0$
eY#1<WF5{DC$5&6~N_BwlVDNPHb6Mw<&;$VTg+BcN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..bce21a58a7f9fdf69cd4df045279d3608899e920
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhZ#*e}EFiFaVkf^L
zL#M8bRvz0UrINxLHj#yydWV<sO=lG5xN)Z^=RgwEtc$$wUCR$9$;`UUv4iJuLmbnr
z!ZsjR(J#PQkGbk&#yi!N11vUyk!@$Eo?x3YQJ~_(iq@sgN<ya7A9{JXF3E5+U(n%@
lFlmbTtj@C&d8VYLGyIz6y1nf(ix<#644$rjF6*2UngG-UM1KGP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..659eb3af824bbad0a501fe9e8bd94b855a416aea
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-ggPCm<fK!KxGazn8N
z1H1SGpF@0i7Zfrre_`?Uf=Qb~0{?vW!_|LScl7P%zjfs01rga}!ILg9eBGbk;1#oW
z$J9oanJ0|}v<sT{a;eN{uFx$|xHpS2^@uie*%2AZj?JgCLOEv|@jlMqnvim;<Mk@m
rJA&EFJZ(Emxu@6~Rh-}XXNmn49@p&`COxbNI*Gy4)z4*}Q$iB}9KuQ~

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..0763cb66ec9f0f56dd9926b3a298a8974712ea37
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-fhZ#*e}EFiFaVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D&rHC6MVNptxb
Z8CthE_FZu4Xau@}!PC{xWt~$(697r*J2U_Q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..6628eb8807d46ef0b66eae0a513b208aaae5b1e5
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-fhZ#*e}EFiFaVkf`h
zgatb!JGw6%{U{mGvTP^MY^xYHABBWsV>@QGgy4>r>W@1Um>LUaG@R$&%VIKFgzfB+
zjAN+|`f_LYw(!hoP}e%WVdtbqiS#5x3AwF25jje3#gcmZA`=%$-fd7~YV-_>%TP0$
fY#1<O?q!B2>W+QA555)v9m3%0>gTe~DWM4fKsi7}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_magenta.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_magenta.properties
new file mode 100644
index 00000000..ddf78f79
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_magenta.properties
@@ -0,0 +1,6 @@
+# Stained glass magenta
+matchBlocks=95
+metadata=2
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_pane_magenta.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_pane_magenta.properties
new file mode 100644
index 00000000..3647ad59
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/2_glass_magenta/glass_pane_magenta.properties
@@ -0,0 +1,7 @@
+# Stained glass magenta
+matchBlocks=160
+metadata=2
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..6611ddcdf4cfd581cb976143d9c3b34918c586ee
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhe|&#`zg{AZfhomK
zvF3rc3%{R($H8aW+XJ5_u2XO`W^=ga!^05CP|m1$_QfZI>xmVOB4=H!C%<rT3HRyo
zEnxQGD~!45(R)MD%Q&#@(I>G@X_F2!+)Z0_h+%%WhY`c_g&RzI`zGc#e!O_K;R_SP
Y;|upp3s3Al4s-#7r>mdKI;Vst0LZdJT>t<8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f2391c25c5f071d742583fc50fa37087e27d798
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fhe|&#`zn;zLVB>m+
zy+3#uv=1<w#qaLTVlbLLA&srXcS#j%3gaEt7L&!N5684WWDPPAmOpibO=(wBQcjb!
z!=%k0T$K$I9fS@nm2{Pvt`u|6DUAOclV)IZp5zUNB-7+z_YegklPPyJS|k}55|?h+
UZEDLF4z!-Z)78&qol`;+0Cnm)KmY&$

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..9572123730cc7f667d8c42af0e8ea54f0e5645bf
GIT binary patch
literal 149
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr-fhe|&#`zn;yD!H$`)
zM)goZ3iE`UE}3rETvmlY5Nj|Iy40iB|H!J#MEI>wQjSBoPmsc-Cptlw7%ewCPe~Ig
wjOi+<<X&Bsbhtt3ti{#9IntV4P6`YRN3XSOo#EI&3uq66r>mdKI;Vst0BaC3_y7O^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..a620f4489b21db062374cb667b12c141df3350cb
GIT binary patch
literal 123
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`PM$7~Ar-fh6BejieE535ev-+b
z-|ZJ1CZ<h_b@wpdW#hSSv4^p1S7y5K%7!a96upcC+a7%q3p;zHjnVbq!c2!?7KYYG
WA;M~N{a*l0WAJqKb6Mw<&;$T7x+@R>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..af69add956f4dd2820dafacb7f4358b3cabd5568
GIT binary patch
literal 155
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`NuDl_Ar-fh6BaPY{P^|W-j&NN
zes{0d|M&7v%#N2YGHyysn#*6#sCf3pCxh#W6^$ZiLpW1K#209*9aG!EsM2n+E@O$?
z8-b-WHJl48xg(8FCN|_52PQV0cU6&e2+LDB#=xMsv3AL_)1UqTZDa6s^>bP0l+XkK
DsH8Qu

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c7effda6030bc394bc732c93cbf27f7f2175c2a
GIT binary patch
literal 151
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ah@)YAr-fhe|&#`zn;zLVB>m+
zy+3#uv=vw;@H(UkFO`fGUK!UI&2Y)X!+4iX*K3VSK3j}CH!{W=dNz7Y+RX8DVo2pC
z9(TdxOF5=*->^#Ej7Q^APq3_Oqf61LLre^h3cBtbP@T0MXcL2{tDnm{r-UW|@+36!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..663c27de198e64cbf0f22f828a782473d749c3ed
GIT binary patch
literal 136
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{+=$5Ar-fhe|&#`zg{AZfhomK
zvF3rc3%{R30HamI&ZeZZM;Ju7IWpa*tDh_t$z0}P_%=sLbb^$%OQzbXfS7xSR?WO&
ju;7HX32#PM3@gJa;mM+Y2T~6Mjb`w4^>bP0l+XkKU<fO}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..21b4b1b55f6532c4d0b5ec39180c92c4b1af4fce
GIT binary patch
literal 149
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr-fhe|&#`zn;yD!H$`)
zM)goZ3iE`UE}3rETvmlY5Nj|Iy40iB|H!J#MEI>wQjSBoPmsc-Cptlw7%ewCPe~Ig
wjOi+<<X&Bsbhtt3ti{#9IntV)P7~r7&TZ(rGc$fqKhPcqPgg&ebxsLQ0Ejg-a{vGU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ded4a68381ccf9b7470163bd610fa06415a9233
GIT binary patch
literal 136
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{+=$5Ar-fhe|&#`zg{AZfhomK
zvF3rc3%{R30HamI&ZeZZM;Ju7IWpa*tDh_t$z0}P_%=sLbb^$%OQzbXfS7xSR?WO&
ju;7IC7VZo$Up9v2w<e3mO=EZoG@8NF)z4*}Q$iB}Z44|r

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..b62703d4d0914ce4188ab9599fb09ecc97c3dd62
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln>}foqUk@fC7i>+-r;$
z8yeDu*V}Gx61H$Xo_YC-i=ZQ)z2U2RrC-i_-hErer{p?yWox|v|CBh!*{h`(W=OW$
zMmre#`6)N>7`H!9^pOeZvHS3qa{}+?E6kJDDNOB?Ucqsq%QCuQk&P->s2@X#$$ER;
zuk{Rm#_#NeEY5H<^rY?DG=Y!#8{;g2%duOgTiA!*2@14b*f$mEJO)o!KbLh*2~7Z&
C<VU&y

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..b54d3e07c95bb7e85055e118fc9b4d99abb6fb15
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PCm$cK!L+`?lne>
z4Grm&;;PeF)eE}%f-i6Bb!4>sb423*WCr`EpR;011*BIw>F#acv+xq@r+Z8d29ICO
zWwV$w|1?L!ah-=M+6hPJ%sr*XV41d+eND+7(`*K#Gfx=#lBeugRm768pz?ple%pox
yl3QJyIwF}4WTt6wry3{lFVIa|<yzhKnOFINUrW}>Kqa8d7(8A5T-G@yGywoO4og!2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..61a2de60c0c8ee5858ac908f4bdb2bd9ccd30f70
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5N6?l-m#
z1&rATzg;^iBB{R8NuYk`A-9_Ozg!}I$FUb4TrlIl!|d}68AqO6b!E`CDrO5<|3Q3`
z?}AqTS!)$qE1ocx9}#pA+8Dy%>*slI$_2^GjP=V|mj}E1T;#G4jAjr^>#J+r?a#LS
b{T~LgYfeUzY$3KlH!yg*`njxgN@xNA0+m1s

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d65d441a9aa8d5b5dda43574b42e5fb64ea5869
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HSCmdt?z
z%x65-)T)PnnNzlERR=>DTmB6R<;y$X6*4ikePvZ<+B1Q*@WIivvn)1Je-0Y4$31y)
zlQV3>LY^(o_c$Y*ws{?x9PagGl9d_r!}nW7a$ZeHEoV}G657yhuuxCq(y_{b=RX<F
XK5;UtGLf(X+RxzW>gTe~DWM4f8aP3h

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e2154f754cfd5bc5ca3295475a0e56f0b5bef36
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foqUk@fC7i>+-r;$
z8yeDu*4u7w5;kx>zA`gwk%%k5z2T|)N8!$U@>Xiitys87<)QQu-lbXr#i^_escwtY
zxK5lqw~~EB^0k6j$JQ|3Jn6WepP}eX7+a3)!7N$z0AUAi<I09TJG@MG$uLw1#O;pC
zd(Xgk)}q>@AmJb50nX1a^p~9F|HhQE`Nkxh8+-i%jpwk+0^P>o>FVdQ&MBb@0HjVy
A-~a#s

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bfc9b924224d6d12ebe4941fd1859195c5378bb
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L+`?lne>
z4Grl+>uonT30t@xUzvI9SOBBtpCc0gCf67|ef-8bS4cX`$=0@g&q5=XPxqJ_3?8rY
zV-9)#)QI_pp|{0Jz6itg<(uUjWH!%Y)b8A!#_P~F)5gKnt#h?rIs@CG-)_I(F|wRp
up)2HaMu@?0#=`vpX7)FDU+g}r9lI>mOJmk+fuBHEF?hQAxvX<aXaWFsok*kr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..0eaf5fc8f17129545b70567a28a25279051beb23
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-f#PTtMSpvciS^BSW@
zOv9{}Yrnz@n3nG-JohSz<CBIR_u>Daxh@>rZT9&=;fyZU-<h5n&A;v&JE*=3yK~l|
z>C6+!4$+DOajZgT9QTM>2ux3Nko<VILDtZn?a`V|(V<Sud=CGJ*Oi!Q^r$YIQ9CKO
l;h=%{c88nFt78_QWUoqc{r@}3CmiS+22WQ%mvv4FO#r-cNwWX|

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..899033b4c49f3c35b23a4a0828a6927e74e8e83c
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L+`<~2r(
z4Grl+>uq;430t@xUpd_@Oz_EvUc-OtKRK4X&Wkl#AvMX9_tzx8sk;lTgt;3g&zxc%
z?NAtZPHcgOxckQq>l0?|Jtf9qou=E&<@RV^C3nK%Gja<g)~YN$CEvjGaPQi`3=$@n
t-^nK&*u!vv)7XUjXTbp#quyD!nAhy`(s(WT!4K#t22WQ%mvv4FO#lH%NVNa}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ff1e34c5da08e8898361d4ebd91821c1ea44b7c
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-f#25;m&V8HSCmdpf2
zegox=W$(CmDujQTleS99i$`*f;-O;=K2NKTxx^PRmoz(m*7W?~vh}~m0;!_UugaLD
zO43vo#64tk<TJU^yhu<*LH=!n@sqg?44Yh-xcqL~OrNsxB}e^o)#br$cgmEn2yYTy
panPuL(}9~4CJLvEyp5j|&wJ8q`~UCE)j$U^c)I$ztaD0e0ss)8NOAxG

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..1053015afb3efb56f3e319b984b2ad5d90fad597
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-ggPTnhcK!Kxm?leY?
zhy$~%Z(mvSfW>cOVba7WHcCpG^IAXIS=I^3q`z*OpS4oH)YzhY;l6mrfSH+M>5N^U
zi{%&}%`lx)%9b?a;K?`43CDA;IrMbxPUAknZCu^3DMR(_CK*N%jeECmrSlnNsAW$u
vNV>*Q(j|GTb<ggJFXNtPc})3Iy_>-#+-ti8OVLK4vlu*G{an^LB{Ts5`aViX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ca7ba649974830b4065ca8be0ff0bb1c651c17f
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-ggPTtLXK!L|)<}}8b
z3dSt&Eh{4%IcF$6ZgKH)IWXVis3%7a|LX&adDXAG?5{R0wkSQgCES$3CoLt*#lbAk
zPfEeKb#X?-^aV54o)cq`Ow(%?nsP*UGl#-aA29`O|4yIj`V3ZwcF+ID*l@Y$l08Fv
uC1Zo&vTU(S#~F7sJhupUOubZdk1xQ+Yx~7t-7-LDF?hQAxvX<aXaWF)Z$=gX

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..972314f7f2fe85fc6acc1761acb8223c271288f8
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTt9Tz<|Sb<~8Pk
z3dSszTUR0#g)6#xCW{1$D4rA9zwu|k_kkPdO0)l5X>v2T>-1NSF<|C$(dUdRCw&AR
z)*R@!SmiLu(&Gw~`m<|1E0Vr3$jq>0_SkSLGn8|x5$}iHQ3gh#XD(+mTBq?INSU!V
mdcmuS2aC_OFOK#6zn)vp!R=LuDR(r`ISihzelF{r5}E*@3PyYY

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..471b0a17ff58f155c83852d60348d2fad83aac84
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhJ!V%v77$oIv6J6$
z!h#)=9o-j>Y<pn5fWx;~Qq0tXcZS1(XK6KTJ_i;FNPbt^C~o}VqR)v`3AQgn7kYGg
z#Ec(s7COx;l)BLEUaYUktoESul#$Ll7sCZTEeD!ib?-DN37JlR=*8};l5xynL5D-a
mq$%RFI?p5|Fl(GT$8cHJZTrt1=Zb*NVeoYIb6Mw<&;$UzxI{Yu

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..60fc60dab5a315eec2a158d6deef7b6b4d1529c7
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|SL<~8Pk
z4GgA2Yp;J4kyQ5-cIEgykz4AB?E?XWXQq5fj*Dl^cbMJJka6V6)wc|@N}h2nh<m87
zGRr|&-XzLVsPHuNx{h)N&Lfi;O)OL^gPl@+*#FEGo8u>H_%`f7-wh@M!_8m0V`?{v
eZ}7YKlTGK4Qy=HOD<wc@FnGH9xvX<aXaWH5S3dXv

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..c7a6d9b685e84553629b30cc6b6b00d03163582e
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-flPTtLXz<|SL<~8Pk
z4GgA2xz|35NUDc*X*kXB4~j`HJYQ2{&{wS2+du1q#xvC|?*$opXYSc0>o9q~CDV%V
zACp{UGd8jJx=lE8=N4o58S4g?w37@{b0+Q4TX<<1bDbaeIe$^(w{8deZZa7}rfGA>
f@Jjya_$2$ByW7;M?^>n>$UzLAu6{1-oD!M<e-=TU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..881c6591efd68cc42fef4abbd4a859ef9a118414
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTt9Tz<|Sb<~8Pk
z4GgA2xz|35NUDc*X*kVL)~sv((eHi0;@nOXyDTT=nbR*EQ)ZAduB^0fP@8JWv|{>?
zNiMP(o7j8ZCLFnQi!uC+bpuP<Nd~DollJH>ytItD&X3z~Y1hm$<%Huoj5BmLf8~y;
fHTv=K)ONkDn@&ati#Bxw-NE4L>gTe~DWM4f!*@b?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7dfaa3be4c81e84c703ac39b1bfe9576579ddf0
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HSCmdt?z
z%x65-)GiPIGAC`-st$%c_WT<X%9kzH6(`lOG9I=%*ukKm;wV$GG18c^pDljFnMQHT
zin1or6b<IL6Uv#UO;{`R;mK5?olE-8I{c{AWu0x6a&zthj!Mx7N<J&NyS97`pPTRa
X&B^E(&+2JF`x!i4{an^LB{Ts5d+k5|

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..abd672d43293278597133a345821555d7953bc8f
GIT binary patch
literal 199
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`eV#6kAr-f#PTtLXK!L}_R+o9l
z2c|32GJ-cV2^+W`<LsK!(O_R#$f5Wy@utj@$8Vf-gG{f8l}dR3T4~dAI&w3^jv1ai
z7Bh8yF51T6y2GM-c`fVVH=)}YZy0*pu1F}kW4xNd?93a+E<-P&Reu;XF6>F)qR-Hr
xcIh7@+ZkzwxoK^iCe*XNVJlHw7PV!&MZEn{zm|Xd*+4F1@O1TaS?83{1OTFMOI`o~

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..63a1c25ac9932e88986f0f810d7897acf3d18e72
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhJ!V%v77$oIv6J7B
zp;OmIE067wlF3HhA3PdPmt)#odHtBx1UBrHyxDM+#bmMcz3wA%J$VOMm>xFh^(Q&#
zGoHP1D8bN7KcTovlFxag)P-*MVtqwswFjN2jC9ty7%u2(IneC-HYvhNLn*LWa$QS^
vOH&#Ta~B7TnrG$0nJ0MI%o-NG;bC}b;?+_;>-Yqq!x%hW{an^LB{Ts5&5A<`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0c743f9739ea000e1c31956c547d7f040dc7d64
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhJ!V%v77$oIv0Jj?
zh?tV7Idh?)CY#8@Og-hJtil{O?)2mwNMf3Gk@vl8`N1TaS(iC>@EmT4W13ai2IMOG
z1sLlwSAEQQr<!tr#U?Pa?d;SOY*Qu*RD4*`y0lqI$aMNcFAvux8E)naIvf%vO%b2v
fd9qg|HJu@X*Y!Wozo(~wE@AL=^>bP0l+XkKW}ZMU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..98555c33737c5ff29f9afae6a316fe8ea813bdf7
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-f_PTt6Sz<`5g<~8Pk
z4GgA2xn`#={6t;F*y6&v-tTzM==gZo@lFnnYwkS~ADFl&9q2wcOR^&5$HY|5JvW-u
zl_MCPtuOHHG2Xzk?bLzE!Cq4)Ss5}v{=P+|<kf*q(v5-@rVo;4UeJFbe_tYtY5N?<
Vs`BUiHvnyC@O1TaS?83{1OR-|KWzX2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2c50a220882a7599b9cfff62e53a87350519061
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhJ!V%b_cGOVG_o8$
z>k!kTwvBZ@qie>j(;HSC%sjxtWM=-@IDtv5^~4VG&b>1j`_r8C4jU|(-jJ4)xM2pP
ze~0j;p34n!HnXZZB@Gz;L#8Dbs&+A^s<6oEWIbdPnYdynPq>walB01Oqbm#3<RyD9
j_@uDiKID*D#>U`r$@Ty3o!3_b9mC-1>gTe~DWM4fPklen

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..21d6813305c8cf54017b7064c595d6354ddc0c16
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhJ!V%v77$oIv6J7B
zp;OmIE067wQb}PAo5;dUy~E4+rZWn2+_=+|b0CRn)<xd;uH^@lWM*CF*uitSA&zNQ
zVH=RE=oetD$6WO><DF{C0T!FU$hNanPq0myC{XcXMeEXLB_Y%454}8Gmt?q^FX(Vc
mm^4LvR_ED?JR)h&O&GS_af^Oy`dks{AO=rYKbLh*2~7Z=Vnhc3

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..cb543130fe90785f82346bb27909cd3afb635df6
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PTtMSpvciS^BSW@
zOv9{}Yrnz@n3nG-JohSz<CBIR_u>Daxh@>rZT9&=;fyZU-<h5n&A;v&JE*=3yK~l|
z>C6+!4$+DOajZgT9QTM>2ux3Nko<VILDtZn?a`V|(V<Sud=CGJ*Oi!Q^r$YIQ9CKO
n;h=%{c88nFt78@){l!qV&n;Sh*ZOv#a~M2b{an^LB{Ts54}(f;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..a148c54d524557fbe7adce01e2df36129b97b6cc
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhJ!V%v77$oIv0Jj?
zh?tV7Idh?)CY#8@Og-hJtil{O?)2mwNMf3Gk@vl8`N1TaS(iC>@EmT4W13ai2IMOG
z1sLlwSAEQQr<!tr#U?Pa?d;SOY*Qu*RD4*`y0lqI$aMNcFAvux8E)naIvf%vO%b2v
gd9rs(%5!Iih)lO=zQZ540G-0%>FVdQ&MBb@0JZHv=Kufz

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..6328228ce32170c2573943cd37d022f39a5818cc
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtGQpvciW^BSW@
zOv9{}Z?B>ca?W{l%(A=NkcDym4;`NOAH^5M_{(o;y}eM=s%N>%LdIA1=NYE%h$^&Z
z<}{j|t`PQssan*-fc<0C1BV(D=2IQzY;QU&jRexCUR@<*lqz+scxyt+sgBp{SZxHe
onR(hOOSq@l8vQu8^UqV(34U(T7k;?x06K`l)78&qol`;+0MErnm;e9(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..a996a89ab5712fe0adeca0f4853ae6044367a3a7
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L+`?lne>
z4GrnS>uonT2^+W`UzvI9SOBBtpCc0gCf67|ef(shT_;beqThMN{1rTnd$uzuoY}GJ
zGQ-)*oo5(|&IrY&vM-sj`SMNv0NKs67&SY0r||~x7Jp?pE1|k>*BnL(j`z}Uce4wa
vEZ*iJVCc<Yk=XXn>E@pV^M>+n@kiXt4tlk`nfqN7=qv_LS3j3^P6<r_cr!~l

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..520b483823df68faa08b4efbb5ed574dc1d2d1f7
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhJ!V%b_X?eHXnK^U
zpr>@SLCNH7>XID^OpLQ<f0Q&}ob9A?r~5psFh|Q_mYTR1staZ=G00GJGuC6S`k3)f
zHRS+{O<-i(*{M87EQGrcepr!uAW7J8*6D)Eg&iViU$BV?a`;U8<YcT{q-<8h!La>@
W<29dkwn;$y89ZJ6T-G@yGywp0{5&H7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b686715c01604816903d070e0af430bd01c36b9
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fl25;m&V8HSCmdt?z
z%x65-R4xzyGN)|Sst$%Qw)`6s%9m$+w_s#E{HsZjG44c@#fPNLX-smw{}N_0>lb}^
z!=im6fbEvzdlntVXw?TNwN;BeWoI{j_#VY&R(fKSb)(=Xtplzz0>ni!AD0F_XFuEF
Vcr7m=yAEhQgQu&X%Q~loCIF0&Kdt}(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..84aaf0d3e3536a9a58c8553c0ebb958666377108
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-f_PTt6Sz<`5g<~8Pk
z4GgA2Yp;J4kyKx|=)|E1{Zk%UzpHczczu0FR=lgjMnA)(1Kc_uO!`*YX%7M)dQVgR
zki<W)H-VMst%LuAxs9qDLfPic30gFzM9A2n&d=L%xo||8vH{b2wiq4ZU#x#0ODp$E
Y>!dju>71Qe4Ris6r>mdKI;Vst0JWn%O8@`>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..585fe05d52a20b1acd9e4dd7f6d9bde840d5c3a6
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|SL<~8Pk
z4GgA2Yp;J4kyQ5-cIEgykz4AB?E?XWXQq5fj*Dl^cbMJJka6V6)wc|@N}h2nh<m87
zGRr|&-XzLVsPHuNx{h)N&Lfi;O)OL^gPl@+*#FEGo8u>H_%`f7-wh@M!_8m0V`?{v
dZ}5xz#io<yWF-B|%^2tm22WQ%mvv4FO#sfYJs<!8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..4734b0ad6d64acb008865b7476bd58fcd4d7ba0b
GIT binary patch
literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn>~~oqUk@fC7iB^;+hF
z1jh3!an)(8>Iq$a!I!VNXm)-3&@1>)IIzDUE=Z)#tIz1k(I*isS-R&L7M#g=!ozs-
zrsXz<vNKYCXXltISk_+n$mh^^^A%&X`v$M$j8|AL9PyD;@Lea=t7XlQXR<y{_j)<Q
z>@*o$l^X{23=d3-U+W(^%KwewNoz!ss_b;>v|zuMCCAd20UgKS>FVdQ&MBb@0RFd1
ANB{r;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b47e77eeb131282b9112a0d9730392b6d7db6ed
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtLXK!L|)<}}8b
z3dSt&Ei3mrsU>vv2zRMC@g3VK;?Dft;^*W~Wn0$$312Dy`}pyt-2x1f#>$*oABrUz
zrDo{H<S><<vGn-H<dIO8y}<9N^Jex5t&vI&v0EmkYq~QqAFYn6KF`>g_KmGmU^8n#
ofKP@v*QVaLO=p(4ecLzpYNc1S$i9$|KnF2+y85}Sb4q9e061?&F8}}l

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..40927d64197baac4c8fb44e0a75eca41c5b365e3
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L+`<~2r(
z4GrnS>uq;82^+W`UzvI7n39uaO>)nFPdlcU7L_afv)XnE9FDl;|5Q;V{Vvl2gULnd
z+$+wVzR48w^wAolx6%@6>o>6m$ZVeG$gEs=eh;h2;TRhS(<o1`sqzf0hpMA~GZ|zo
wyK8@-p^|Zda9W1gr}K=v8D(a8XzpV;w9KnTx&7vUpt~46UHx3vIVCg!0O1@+#Q*>R

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..a806848bfc04c78cdfd317fd1a9b1684905e3823
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-fl25;m&V8HSCmdt?(
z>@y}tSbuMgo1k6gXB;Z3B(S<!eS@J}fc3j?>?|gyS(KUHoRBR{IGS>jMJMZzgE4#9
zlZ2aGQ4<#Oq_po5y3n#_YJ=+XHxs>YZItBLzkF%JCBB{O!xCEFu<qax{>AFJuh1uk
edk)_|J2`J=HzR@9FG7LNVDNPHb6Mw<&;$U#tw5dt

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..b521d2fa1fe6f96105c4f659d790cd357274aeba
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhJ!V%b_cGOVG_o8$
z>k!kTwvBZ@qie>j(;HSC%sjxtWM=-@IDtv5^~4VG&b>1j`_r8C4jU|(-jJ4)xM2pP
ze~0j;p34n!HnXZZB@Gz;L#8Dbs&+A^s<6oEWIbdPnYdynPq>walB01Oqbm#3<RyD9
q_@uBgOBZk)InXG+II-lXGsEq3UeQOdY3~BMiNVv=&t;ucLK6T7>Os^1

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb9e2f62fe30c2fdab2b52ffe61d153818c08cd2
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-gg25;m&V8HSCmdt?(
z>@y}tSbuMgo1k6gcYEn7fyN!p>KhE*0&brxT>O`n@oZ7EAY<8+K8p=Wn^Ks>OzRfR
zWY#X)ki)8bB7kj^(>%@$r)ypZCIx>xp}O`4Ps{zwK?a$vcha>DoW3!|v~d1yQn>$P
h&u7Df?;gB<%(Oqrt*@v1Pb1JJ44$rjF6*2UngH)eNb~>z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..dba86fd1f74988c00eb51473dfea9f4433ca0d90
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhJ!V%b_cGOVG_o8$
z>k!kTwvBZ@qie>j(;HSC%sjxtWM=-@IDtv5^~4VG&b>1j`_r8C4jU|(-jJ4)xM2pP
ze~0j;p34n!HnXZZB@Gz;L#8Dbs&+A^s<6oEWIbdPnYdynPq>walB01Oqbm#3<RyD9
k_@uBgOBZxZdc(sIx6dtlLe}yQplcXBUHx3vIVCg!0A?#bAOHXW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..58e9d7438dcd462db3a6ef2d5556782d0ebc38fb
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-flPTt9Tz<|Sb<~8Pk
z3dSszTUR0#g)6#xCNJq!I<it^|HhyF-Un`+`{>Lqb+Cl{Yc-2Q>b$Ty>=RUsT^Tkq
z**{vr<oQe?kbBOIXyXN4H<=3(p7AIg)LI^@8gk0y!27I&CqfMU*R#HvVahN$aa&&F
mD)(;;*VZ1sxNgb+>#Qp;x%Jggb2tWc4TGnvpUXO@geCxv?MU_j

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..49f8af313f3703e583dcef61309218cd197036ef
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhJ!V%v77$oIv6J6$
z!h#)=9o-j>Y<pn5fWx;~Qq0tXcZS1(XK6KTJ_i;FNPbt^C~o}VqR)v`3AQgn7kYGg
z#Ec(s7COx;l)BLEUaYUktoESul#$Ll7sCZTEeD!ib?-DN37JlR=*8};l5xynL5D-a
pq$%RFI?p6TOK6-p_23N;!(KzTXuTPGuL51f;OXk;vd$@?2>_63MJWIP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..4729ae0350a28f720699567c4db849da7bd02cb7
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5N6?lnf8
zm;+H8_LdsC9`jr!z*oQXkXz0CUoHnqA3MevXiPKDIG@gN>&Tm{t_<2%-fRZzKZwur
zO=#txwst{l#goR8BZ3aX8^aj9{Z8JSazXMkWBqd0<-zV}E^?U&zGu)nBlEYZWIhky
beMxz-D#vSbKRz}C-N4}K>gTe~DWM4f=S4yv

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..de1a51f7a0595c2c4983aeda2bb548ef217b1e5e
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhJ!V%v77$oIv0Kt3
z;116b*Ci4GEz5THh=}_rBorIlF{>p6ceGT0+?l}CSTLjEJojD}lgT1%XOCnYOLfqf
zJG-}qXGVj%*69s9CpAi>CmBk}ZRLr`QF1Gm)YBK4xJdGDgA!AtXHZ<mGS|E#U5q+h
Wj@KNHKAaA80E4HipUXO@geCw-hdP)5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7f7c6e5b59f0cac7ed1037486f370ae623f78d6
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|Sb<~8Pk
z4GgA2Yp;J4kyKx|=)@zRuKNoA9t#;f+q&(TyKaWcXR&!7IU3q$uCd`?;F;RTkfpj$
zC6ImA8^^_hDu&z34v21MpKw4&(xEwc(pA-vTP6q2XC7P;VmR5HsqBn8!{pR$b&ae2
e+3N5AWLv1{^vZSRndv}RFnGH9xvX<aXaWFa*F%W_

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..3005d8c9c5969cfb3ac63851f8a636c200f6abc7
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhJ!V%v77$oIv6J7B
zp;OmIE067wQb}PAo5;dUy~E4+rZWn2+_=+|b0CRn)<xd;uH^@lWM*CF*uitSA&zNQ
zVH=RE=oetD$6WO><DF{C0T!FU$hNanPq0myC{XcXMeEXLB_Y%454}8Gmt?q^FX(Vc
km^4LvR_ED?JX6xr8Ma%vZQp1o2XZKbr>mdKI;Vst07!2_cmMzZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..70c377b34595b74f43a96a091d3f606439ff3b47
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-ggPTtGQpvciW^BSW@
zOv9{}Z?B>ca?W{l%(A=NkcDym4;`NOAH^5M_{(o;y}eM=s%N>%LdIA1=NYE%h$^&Z
z<}{j|t`PQssan*-fc<0C1BV(D=2IQzY;QU&jRexCUR@<*lqz+scxyt+sgBp{SZxHe
onR(hOOSq@l8vQu8^Usp~6IQux_q-GR8t5PfPgg&ebxsLQ0N^G^Z~y=R

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..4eeb2f211e577f40898f82fa36c153e7618955a9
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HSCmdt?z
z%x65-RH}!6nUl6^RfoeJzIz)C-IiTjZ+LNEQ$yn11eXT!O$vN_ZmgNv;NGks@$5ji
zjE(g{E~6=p^CpxtO`EV*=);q#LOYiT&u;wiIf~0{?u68GCgmrg4c!I{^)xOWvoDo1
YcM5Xq>k9uq73cs4Pgg&ebxsLQ03z>0yZ`_I

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6bb6abc8cfd0ed3bf8303fc94827a72f74178b2
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|Sb<~8Pk
z4GgA2Yp;J4kyKx|=)@zRuKNoA9t#;f+q&(TyKaWcXR&!7IU3q$uCd`?;F;RTkfpj$
zC6ImA8^^_hDu&z34v21MpKw4&(xEwc(pA-vTP6q2XC7P;VmR5HsqBn8!{pR$b&ae2
e+3fFE-dS+esqd}laVDTE7(8A5T-G@yGywo;YD1I&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_light_blue.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_light_blue.properties
new file mode 100644
index 00000000..7f84e327
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_light_blue.properties
@@ -0,0 +1,6 @@
+# Stained glass light_blue
+matchBlocks=95
+metadata=3
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_pane_light_blue.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_pane_light_blue.properties
new file mode 100644
index 00000000..326c9508
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/3_glass_light_blue/glass_pane_light_blue.properties
@@ -0,0 +1,7 @@
+# Stained glass light_blue
+matchBlocks=160
+metadata=3
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba09a5e3cb1b1364f326f9d345e5ae0dc793c10f
GIT binary patch
literal 157
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DV{ElAr-fhe|&#`zg{AZfhomK
zvF3qx0Kbp28AF%@hk|s&88t8CO=>lI2VYyI{1<-g#dAGy$;^y&p=9P=Nt2i+s-z2k
zQeOEfMY2z+&s$J0KQYulM<QT}<Z`Pnrp_l*T3z)S-j^RTet+m#G0;8+Pgg&ebxsLQ
E09%_h!vFvP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fb540bb9439b4faf3172285d6cb8312b4563aa2
GIT binary patch
literal 124
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr-fh6BejieE535ev-+b
z-|ZJ1CZ<h_b@wpdW#hSSv4^p1S7y5K%7!a96upcC+a7%q3p;zHjnVbq!c2$YCt3`B
Xd%}-$)?L~FG>*a3)z4*}Q$iB}dA}^e

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ae5be781db73fe35a65d9c12034228c6fb5e116
GIT binary patch
literal 124
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr-fh6BejieE535ev-+b
z-|ZJ1CZ<h_b@wpdW#hSSv4^p1S7y5K%7!a96upcC+a7%q3p;zHjnVbq!dQpkEF*@T
X=J2CD-KVw!jbre1^>bP0l+XkKXd)~2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd95188eea50db7b2f991f140d2129fe100117a5
GIT binary patch
literal 125
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr-fhe|&#`zn(3skvZPe
zMCPWcNT%A&(iW4&rzbzL>M{vlGNa6FBA13&#tswVR1LlS#H&6z5&=(SXR(>Mu47_Y
X=@Y&0T2-nu&^!iDS3j3^P6<r_-_R&F

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..00e20971d941726068a04a1fb52ea9260174a075
GIT binary patch
literal 126
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`uAVNAAr-fh6BaPY{P^|WK9%dj
z!Tt3dyds%uH-EO6EIvK?iB*?L@RAv2W)rzQdSw@x2&Zc3<tJYC$&m<nB72L~WT_f6
ZL#J$X`DL*=MnD4@JYD@<);T3K0RR@sC}#iw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..bdbb21c01faad7429ebacd1b0e48197d77a429fb
GIT binary patch
literal 277
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b
z3=G`DAk4@xYmNj^kiEpy*OmPNJ0rJ&s)sZ?6HsW8r;B5V#p$J!ck>=L;Bi^$yz9(F
zwcv_IpVzD{JP(f*Je1^7l%1)RsKC7>#WLs1L+c4P9!JhNsVl3AZE1+AixywBr@7|7
zP&P}N7{mUp%m3!aazyP^)2r?3Ox;oUb6V%L9jBj0)y+w34AXcRJ9}yayS(81PYbkd
zKEAuxY{Og(lwoX0I5>^{TJ^!e?a4)QxA*V=_^GBgO>=VpZ`~Jjs<!PgZ+JAz#bhZ*
Q7SOc}p00i_>zopr0Q;6@S^xk5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..72b55b581790c8c086a0f17b39159f640e377972
GIT binary patch
literal 159
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`X`U{QAr-fhe|&#`zn;yD!H$`)
zM)goZ3iE`UE}3rETvmlY5Nj|Iy40iB|H!J#MEI>wQjSBoPmsc-Cptlw7%ewCPe~Ig
zjOi+<<X&Bsbhtt3ti{#9Ins`5`TNSGnGZji`13`ULlt9p!v@*Q*QV40ZDjCt^>bP0
Hl+XkK&Nw-2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e48e12070a31590641f2f22c1cd2c38f0703a83
GIT binary patch
literal 205
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q#@T9Ln>}foqUk@fC7i>?%?uQ
z3^EZ1Hg{TYXcFGhU46yGG>~QDVgH_A^E>{nzP8)sspFQwG_C9Q6?`JI8qPkIWtbt^
zYOAFnsopN=&^Gh%V*@ol4>$QAzgRljB406jhEMQvXVqeQbWBFq;g*dmSEwIDiOG6<
z-LLfwe#TkyoHEZ?8QhFxBRSd`e>1pttQ32zdQSgfUPa)pS8N<W_c3_7`njxgN@xNA
Dw8%%Q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ee50cf6bf9c6f4eef1ab947bb47db34f2ce4d0a
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$cK!L;c?n-M*
z26nLzIgj|(JYaeENY2#vwuH!p!~Q)V?KwX<zYmvQHQ6IDHS3}65$2_e557w=%#bX9
zui{`>=V#o&W89t|$H@6CBV-%HrbMx72dCq{n^{hDSw=T3>JcgrJ;zXD@?QS!cJ>D*
yi??_@Ff3+}I9rmcD9iSSaf`3d(hU8=eT@A@B`ty%KDPs%#^CAd=d#Wzp$Pz1#7P+d

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5e926633b842e55991d78d8c7b3237ac8a8ecd3
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5OnuBLS=
z1Go4Fu{kfxcG^zTV)-~-JLkyvmHsVz*Z)=!<LUazyX7ZOgPTuWEX##O#_0@Sx#|^f
zvPAt@aFZ*j!(FbxU4~Ib(3|zblPOPpIp-S6ekhMBuqr(wvbI5ZBWpt9vlrq!ey0@t
aI>+CXkzsV*jX@sh1_n=8KbLh*2~7Ym?LZR%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..11561fe9f44a403812b0b1d45238a83c281200e8
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`M)d7
z5)}=SowGlA|I1jus*58b^+Q{)q0!mOyXp!F5%C5}2e=~z*yD1p`5ah$P+q6_fh*s<
zxe2V2ryQ)G%xzFjS<PZoxzt5(WwNorzc}xM%lIP8)D4{CSa)y;ziLv-m0>TH<F{<h
VFk;O%@CDk>;OXk;vd$@?2>==3I)eZJ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1e7e8ac7a1d7b32cbb88d8ead1bb90636a0c3fe
GIT binary patch
literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn>}foqUk@fC7i>-Idm*
z4178dZXS`1ILLY9sBPA)SsJbr5Bv9gn*ZZ!!0V&FsRFqnEfzJ+za2Jm9*Mch=rAL2
zWhB$4jm0vIDKk`Uc#|hJ<UCQhuI^xTCW>u|tYfyUc!1~xvu7!cpPp$2zAR!|puDGU
z>y`VA7H4-<c|0)q&ydja@)!5V56ycS>~yXj;dhBE3FMd5OaeNN!PC{xWt~$(697)Y
BO-TR%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c6b658e857c09df0d27b3bf25881696b0d4a5a2
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L;c?n>)Y
z20on!Gmpqd9OS%n)HZ9@Hp37HK6}Hq|0?o6d*yRi_$4`qu2}lKAWwt8anE)Jg)=)=
zU1m61X?dQZ?2M4#Cg!j+%P-&Lcj${e+c5P=>}EEF!#;8gBo-eDoo>v){IGU$?RSQz
vv@2qqN@<)7>Sr#*pO`KGhHcB;M^p8L*a|d~c1fNEI*Y;6)z4*}Q$iB}o|8!R

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..f05379188efb15919f8ca935a7605f745bcfd3f5
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PCm)Ypvd9+GP7zH
zlf?~&bfKyZtlAsIe@plaJ5PA}!A9a=I`@Wa#^#R~So0ih`Mbw6qxsi;V+Yl|usdfR
zn$A3t>=3Ou5XUNX#&M6Bg~0SQ2g#3T8)OaL*&eOg6dCHY%;)frcwLE^Mvuy}8MTvg
m8x9(HZ+Ez<ygFv_N%p5-vj4Alxta}h4uhwwpUXO@geCw(K1XN(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d2c4d6750be2284877bf6b6fe62c3c09039ef1e
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L;c=1S{Q
z20on!Gmpr|G;-cKYWr$wZzzjpO>)nFPdlcyv0J^_M4gRRI>o<pUaB|e+!3Y+DQZv8
ziA|V0eKPBbQ%3`B-f&B#t>46YpfB?Df`*AZ((f_dFxbp~!cE(A<tO$94i)*?_6%%i
uxBO<8FwkcxImC0;$x6nc(`WIrUknn_1sWdf{6m1QV(@hJb6Mw<&;$Ue%1AB%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7899b56b74fc5fe0f1a42e791f5355d54d3c15a
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-f#25;m&V8HQs`M)d7
z5}z1~Rq9@F?^M|Tq(5zyk{6HU9K}P&8hnytY8UBNFwAmX{_~FK36|USDhJwP_UxM5
zz&4kab4B=$1xoBvZyYajm@3G>bufA|*Maqk6sLwo>c^O%W6PBP%$+vJPqOG{?*a7`
q?E?pm`Zp=uoG?*1UF2>2ocPM<g6$VSu2%uNh{4m<&t;ucLK6Vn;7P9l

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..97ab9ab2e6e6bd35b617e7f6e87356bdb8ba276b
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-ggPTnhcK!Kz6uBNpm
z11on#@pHa44_MwklH1r}+27&OmA-I~f8YEIw?cP6^1phazer-vE{A*X85GX!=(@~s
z^M~bG2D39len!k;XD*(2!>n+4&9#Q9U9;189i)vT8}?+XuG=(+@rA~{+qVqaADApQ
w^LSwB%^-2K<gJs{-4h?y6bBx0`n31n{FepWZOaS(0-eR+>FVdQ&MBb@0KxxJumAu6

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..31a4fea4be9bc6ba392e16fa5cdc141c9615d9fa
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhD}G)1At11PVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
vNmImUb)HE`V0O4!$<4P%f_L$0c_xP4=L)uGN?E-Fx{JZn)z4*}Q$iB}uxv*g

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e4844f48156caf5c1532507e325fe8e5376bdb6
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTt9Tz<|T`rlxf&
z1DC!-?-9O8Md1qZ_Y*||MHJ78?BDpa-}^w+?LAxnUukhOxa;&+jxk_nyXbR9m6JY#
z4r>ndTdZ=JWa)8*N&VS1o)t;o7-VKxGJ9+|l^Du7)rj}Q?kEGJ&@+d#8LiWJ52Vak
o8@=Gw#Dm4>mM?bp{C}Ri^HR<$mMQ+`K=&|sy85}Sb4q9e06qdn(*OVf

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3ba7508cdcbbab8726353d285b1753bb687a255
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhD}G)1At11PVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
mNmImUb)HE`VAeQwj=^qU&i42N$0q}w!{F)a=d#Wzp$Py-0Yvlw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b54d6a03140fbfe7b4208fa69d0363e7e7e3fcf
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|T$rlxf&
z1DC!-?-8GSN2@I|7jb-?$}M%o_JP2LYo+o>THFk68?EFS13KG7pEIhw^bvGeb11&R
zq*2ArV+)h|qiO6Rg4GOsN9Hi9SUlaZtmV`Uwjb8I5_7d4JzU!$yOAv+DeblRieD-E
d3G?=RW}6X`(O0vGbtcdm44$rjF6*2UngAyvKn(x@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..acd47fd017320d28d307e238fce30057bbfce184
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-flPTtLXz<|T$rlxf&
z1DC!-?-8GSN2`x`3A%RV2gM{8p06p{aLsW0x&B!fG?wXJc`wK?wKAeq&SBDgO{R{}
zA42Z39-G)Z-5wmdbBi(bj9de=aXJI1pXD08g_o8w*7<QC^B4X6!R<g_B(p(enl^U`
gujHSOPqNRsza7u$yR9O14(JjFPgg&ebxsLQ0JOY9kpKVy

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..d975f8993da7038d9e88c6c79c65322d1f82f12c
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTt9Tz<|T`rlxf&
z1DC!-?-8GSN2`x`3A%O|Yt}XY==VMlb^MN%eU_8*%xwY3l^L`?Z}?=>pfXjHsblI7
zA$M7iP3)a+502cq#Ta@<u7TM&oq^NOa*f`?OUoGR{J7ngc2!m=CmdhHI74UiSMHEn
eqaPnnZP)vjonaKTqWB8X9SokXelF{r5}E)Fi9(S8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..b544aba602f748a8bbab01ab9c4e4b5a8d68d2f9
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HQs`M)d7
z5)}=SowI*=|I1jms*B@6*@w1XL!;ip7~$vP0tRb@dpJHgi5+PapKU7qA>#w<X_<<N
z&FSh9j%`L4_$t*CIB#k(`p0Qb^nP`Nr)B>2pbaaXr`_f3nGnvXcc^980uSl>t3TP+
Xc4QdMU2-%D=l}*!S3j3^P6<r_C7(fF

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6cd55e4444b1083d75151c4cee1008038323bae
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm<dK!K-qb8z`9
z2Fn!2^Ni&Mtm*~g-&cr4t$DWG(nj!OZQBv{z4Ey${IuF$En-Wytk>dwSQMtqpqD1}
zZbieJJ#%y%#PrTR%8Wl?P(3x5q3lc$KbM5;_cK}zyvEfHIX#nFwCowUOx{br<vy@r
y=9c;f#?NdH%V#dsSu&q-H=}RIO0l=P=fqcsm$W>O*}WX-GzL#sKbLh*2~7YClu3R7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..050095441e3327b86fafa67199d3c22b636c3abc
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhD}G)1At11PVkf^L
zL#M8bRvz0UC6kT1KX^2pF2}UF^7=8W32fLYd9&dti^*c?d)-Ikdh!miFg<M0>rZmf
zXFPl3P=cYEenN4TB%kv}sSDli#rlfOY7aV38R@KZF<j8oa-iAuZBm4lhEia$<hqs+
vm!>ox<}MBvHP6b0Gf(ianKdkW!^04AwV>tFsTGw#hcS4%`njxgN@xNAZV5z;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..92ec338688d8071209985fd82c3bd2fc07ce1ae8
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhD}G)1At11PVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
f^JK3`YC6N=`Pu(Jscl;ZbP0o}tDnm{r-UW|0{%h^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..499f06134f66aa418f5201af049e4ecc0cac1338
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-f_PTt6Sz<`70rlxf&
z1DDtWw<OQ^6GOsM5+9^4{n1w~Ctz}{bbd!eQti<WM*R&6oO@oZnc3*xDjzxRK(}p$
zS(B*27Us7HteL$NR`b|cE_KmdDQs*oZ~4*%!R*uSa`YTn%_x4lrOxsHk7EJ+%C_lM
UUb}jK18ryUboFyt=akR{07pDMP5=M^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..e0a0567de6b24089bfcd9611c621058af207c99b
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhD}G(E=w+(uXk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
j@JV62eaIoRjE!MSO7?#@x#?0s$1r%h`njxgN@xNA!Am~z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3f7fce464cf1ba8eaed35b25b0894e35da83049
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhD}G)1At11PVkf^L
zL#M8bRvz0UrINxLHj#yydWV<sO=lG5xN)Z^=RgwEtc$$wUCR$9$;`UUv4iJuLmbnr
z!ZsjR(J#PQkGbk&#yi!N11vUyk!@$Eo?x3YQJ~_(iq@sgN<ya7A9{JXF3E5+U(n%@
mFlmbTtj@C&c|_8ln=mNV=0vls6`2Ec5QC?ypUXO@geCwH$3t)c

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..faf281b88e6ebe78d1ff9764492eb87d7ad2cb1a
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PCm)Ypvd9+GP7zH
zlf?~&bfKyZtlAsIe@plaJ5PA}!A9a=I`@Wa#^#R~So0ih`Mbw6qxsi;V+Yl|usdfR
zn$A3t>=3Ou5XUNX#&M6Bg~0SQ2g#3T8)OaL*&eOg6dCHY%;)frcwLE^Mvuy}8MTvg
n8x9(HZ+Ez<ygFv_(LW5&0&=2NzRP$5-NWGN>gTe~DWM4fc9ce8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..77aa4373fb6725e5637a3a2a68318e61559b7149
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhD}G)1At11PVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
g^JMRol;_S2hkxfp8=aWu40H;Er>mdKI;Vst08P$9W&i*H

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee7d8fee45805259f21b363d18ebe7db436cb65d
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-ggPCm<fK!Kz6=1OZz
z26piWK8N^X4|3i)YWr$oCXeF*IXnKg??1Q=j$KvHeOQ*!#rIj$Go$I(ePajJbzyhT
zIW(PlBH1Cj<3Jp%&>6=)Vip4OXB&(j&1JMs>f<>QnYwjVi_grqkK3aRj8c!3UT2!u
qv6YeSu+1*kQ*x4fp2z(A#PIt;PPESSbyt8cV(@hJb6Mw<&;$VN6iT@O

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..e19d2eba45aa04d68e5b373d44cf1a3c46d31d7d
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c?n>)Y
z20on!Gmpqd9OS%l)HZ9@Hp37XK6}Hq|0?o6Yh^EmvVU|6^}JMUVLoNI!~OLP3(i=q
z-pp{c(z2hS?2MG(E@rbc%P-&Lcj&u$rlI#p>}J*ltut*LB720=WBV9*TE6#wyUWZm
v>td8j#|%@3IR?)4iurXLq!o4_6+X!-lvL1?du3J{&|M6ku6{1-oD!M<`4dTa

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb1f1aebf59efbe0601a39664a381e0b828b33ef
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhD}G(E=oLES(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nu^NZG80gF$&_
W`n6i~H>-j6GkCiCxvX<aXaWH4lsyLk

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..7974f3ce717abf333296f4f492b088060296fc61
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HQs`M)d7
z5)}=SowGlA|I1jus*58b^+Q{)q0!mOyXp!F5%C5}2e=~z*yD1p`5ah$P+q6_fh*s<
zxe2V2ryQ)G%xzFjS<PZoxzt5(WwNorzc}xM%lIP8)D4{CSa)y;ziLv-l~FIPW3bdr
Vzt*M_Vg<CH!PC{xWt~$(696pBJB9!N

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d999ba1b784e8cd9b29a0753992d18b0145e06d
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-fhD}G)1At11PVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D)BWv+Qg+V~k6
YrvJz=68`!88PEv~p00i_>zopr07>~g+yDRo

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..c85d599fbab34b9f93cc8ebef78e6e2cc35c1744
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|T$rlxf&
z1DC!-?-8GSN2@I|7jb-?$}M%o_JP2LYo+o>THFk68?EFS13KG7pEIhw^bvGeb11&R
zq*2ArV+)h|qiO6Rg4GOsN9Hi9SUlaZtmV`Uwjb8I5_7d4JzU!$yOAv+DeblRieD-E
d3G?=RVVnLV!$`ZZ?h4Qu44$rjF6*2UngA~1K!*ST

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf1e5f52a3b9cb0ff7fc07db809a1cc15e171be5
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>~~oqUk@fC7i>?%?uQ
z3^EZ1Hg{TYXcFGgU46yGG_Xs_wkEmdzsr@yQzoxoH~-OMzDi@ukj9A9+6)}VT9&~M
zMrC}q4LqA$j_3IaP3W;Z@q?kGE%G&Eruzl2<D4O^M_MhT8n*243Rxw?@FF8_cU0DU
zhB;|-Y*h+o*fSW+dijex@pH2+L!II*507I%*)BdUX*sv<P(ILg44$rjF6*2UngG4k
BO(OsR

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..63ffd3187d1bbec1753e9e52fc2d0a8a627d3468
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhD}G)1At11PVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
n^JH)Pg0_Ui-4_jZ{ZV9alq!g}kWIb|bP<E6tDnm{r-UW|HyuRb

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc4916a152a4842b4634a66491901ebbe1ac3cec
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;c=1S{Q
z20on!H;>519OS%l)HZ9@mW>?&eD@_D*H7wqc+bwi)$?kAaFWF7pTU_NM<X{gXq;Jc
z=O$Cv=b}vvt~)KX{eN?{-CUi+m~wngYQRB{JI48pHx1JH1A4+H1wCbVX#6nm+CB!J
vS()GY4HDuQUbINgYW-4tAdi7vEvQRh&%L0<lu73t&|M6ku6{1-oD!M<)s0G0

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd296c35942f77561be323a979b08926d25cc149
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhD}G(E=oLES(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nuA=SKm7{DY0+
eixW$JIx}pWnqySAd~-F>9SokXelF{r5}E)gr9t`t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..5989037fc64750370fce2fe4e2d4c3e12a2f6199
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhD}G(E=w+(uXk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
q@JV4~mM-8pa-dOsabn3&X9oBDg6KxI|F3~=V(@hJb6Mw<&;$UAl|mN)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..849b498492053c2789c5b2b298ab2c116000fffb
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhD}G)1At11PVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D&rHC6MbO`pYN
gDh#FErrWbHXfx;Zb(Zvb0-eI(>FVdQ&MBb@00j0t=>Px#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..149ed0c674b0cb98247af15ebdae159465f61bf9
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhD}G(E=w+(uXk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
k@JV4~mM-X+^oEDwR6tI2=ql!5plcXBUHx3vIVCg!0P3MWZvX%Q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff41948ece82c254e1514283c118cb10e99b66eb
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhD}G(E=w+(uXk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f`R
l2NV_VH8JbE9e(ktok6rXr_W2h$pz>f22WQ%mvv4FO#pObMAQHP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..25ef075da04a00f8ecb790c44a17d91697abc4f9
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhD}G)1At11PVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
pNmImUb)HFxme4qH>cJZx28~NO(T3Hj*MKf!@O1TaS?83{1OOgJMd<(l

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac21fe8610e2158843b585c0750a220beae4cb6d
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtFTz=5OnuBP=}
z1~I(^U5ntdowk#-SUyhI&N=dZrGLxb^`!#lJY7F|xBTR3aPx_aWx24(IGy1uSH0p*
zmZ%>KZgK^6xXTr|%P^`4db3`5GUbUc=UhYC59Lt>R;5Qo);0)lWKBqX_CkEe@05Zc
b=Uy{5@uXi1b>?mcI)cH|)z4*}Q$iB}4qreL

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..82e59f99e20ca0b83e08770743c8d146255aaf8f
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhD}G)1At11PVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D)BWv+Qgx)`U=
XNxyb-@p5mV0~kDA{an^LB{Ts5-5ETa

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..e9ec17d85f9c29af9b709e1f7c533b247a866c03
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|T`rlxf&
z1DDtWw<NXqk8B@lb?Kbj@q_n~y&hw6T=L6*D;axJ;ttu$F%}q4p8A~8WaSw_hqXug
zRbDwvw#_hUQh9cbZ%5KM2B8_M%ozn<n|8H$&1U;yt1B^8EA5lpfxb%igiU9z=@)!G
d`QXc3d7eWVuPzmrbOK$$;OXk;vd$@?2>{{AL<9f;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..9038f0c82713515a88800fe9c289f3d6629f67e8
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhD}G)1At11PVkf^L
zL#M8bRvz0UrINxLHj#yydWV<sO=lG5xN)Z^=RgwEtc$$wUCR$9$;`UUv4iJuLmbnr
z!ZsjR(J#PQkGbk&#yi!N11vUyk!@$Eo?x3YQJ~_(iq@sgN<ya7A9{JXF3E5+U(n%@
lFlmbTtj@C&d8VYLGbr86**=kBX*tk644$rjF6*2UngHR>L_Yuk

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..55bbba6ea799c080ab45c98ebbad8a80c2743b0d
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-ggPCm<fK!Kz6=1OZz
z26piWK8N^X4|3i)YWr$oCXeF*IXnKg??1Q=j$KvHeOQ*!#rIj$Go$I(ePajJbzyhT
zIW(PlBH1Cj<3Jp%&>6=)Vip4OXB&(j&1JMs>f<>QnYwjVi_grqkK3aRj8c!3UT2!u
qv6YeSu+1*kQ*x4fp2yT(lK*3qv;AYL^k1Nh7(8A5T-G@yGywqJ&`KHr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c658260fcd440aa78f53d4f46d9e140956875bc
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fl25;m&V8HQs`M)d7
z5}z21h0LE$|8vnNR8;W5*$2GR$thBgUkQJY7ckHf?&0|0l-I%RZRV|#aPI-Tl;s8$
z_HMrmEj+0TqM!U6m^Y;{iS5}`skbuevS3}j_qk<UJKy>xwCv$35K_Cs>UgUn==nc}
YwNEno&Oh9A8R!BAPgg&ebxsLQ0B3nW{{R30

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..f18633ecfe410708ead1dab4435c7a5b2523b371
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|T`rlxfz
z1DC!-?-8GSN2`y7iYT62@`Lx0y&hwA{OgRGD@|@jvJ3m%8A6_AKCNW%)Cy)1(Eg~}
zXEh;(U#Ry$=gzInt7h0Tu&1445SmjI73;Lrm-){eu^unc&tKdQ^hGioM5etKU-2vD
d!{@ojd3n+@`gRnDe*rp!!PC{xWt~$(699C8K|}xm

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_pane_yellow.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_pane_yellow.properties
new file mode 100644
index 00000000..6b3655e2
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_pane_yellow.properties
@@ -0,0 +1,7 @@
+# Stained glass yellow
+matchBlocks=160
+metadata=4
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_yellow.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_yellow.properties
new file mode 100644
index 00000000..064de857
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/4_glass_yellow/glass_yellow.properties
@@ -0,0 +1,6 @@
+# Stained glass yellow
+matchBlocks=95
+metadata=4
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f475db92d7e1580b16851ba73db268923daed31
GIT binary patch
literal 167
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`d7dtgAr-fhe|&#`zg{AZfhomK
zvF3rc3%{R($H8aW+XJ5_u2XO`W^=ga!^05CP|m1$_QfZI>xmVOB4=H!C%<rT3HRyo
zEnxQGD~!45(R)MD%Q&#@(I>G@X_F2!+)Z0_h+%%WhY`c_g-_fR&oD5k^Y8ewJ$#ZP
P&}IftS3j3^P6<r_a}+xP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..9de42fedf8482e5bea1291d8c3a278a7cb53d4d9
GIT binary patch
literal 137
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`0iG_7Ar-fh6BejieE535ev-+b
z-|ZJ1CZ<h_b@wpdW#hSSv4^p1S7y5K%7!a96upcC+a7%q3p;zHjnVbq!dQo9pL;cL
l&Dh#bDu2Fswc!gBgOP5-j`Wb&oj|i0JYD@<);T3K0RSP7GcEuC

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eb78ec82bb280cc2b683cbc47bf8a03f5fbbdb9
GIT binary patch
literal 164
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`*`6+rAr-fh6BaPY{P^|W-j&NN
zes{0d|M&7v%#N2YGHyysn#*6#sCf3pCxh#W6^$ZiLpW1K#209*9aG!EsM2n+E@O$?
z8-b-WHJl48xg(8FCN|_52PQV0cU6&WxEv5M%kB7yZ3lk5$a1J+JSx0w`fY`9MWD3|
Mp00i_>zopr0PhSs>i_@%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6deb568d8c1f04a0c9565ffd3d8c0acd1746ef2
GIT binary patch
literal 137
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`0iG_7Ar-fhe|&#`zn(3skvZPe
zMCPWcNT%A&(iW4&rzbzL>M{vlGNa6FBA13&#tswVR1LlS#H&6z5&=(SZ?T%3cyji7
kUUI?=8zcExUJrc+pS>*`dA(VKfo3y!y85}Sb4q9e02di7`v3p{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccb3ad474802b529b34c9c265f270eafbaa8d741
GIT binary patch
literal 157
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`DV{ElAr-fh6BaPY{P^|W-j&NN
zes{0d|M&7v%#N2YGHyysn#*6#sCf3pCxh#W6^$ZiLpW1K#209*9aG!EsM2n+E@O$?
z8-b-WHJl48xg(8FCN|_52PQV0cU6&WxExTlSRjpofg`9fZ2g8)hk^Dnc)I$ztaD0e
F0ss+nHNpS@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..db2b9cc632595389cc66a376b8f750fdffaa96b1
GIT binary patch
literal 138
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`fu1goAr-fh6BaPY{P^|WK9%dj
z!Tt3dyds%uH-EO6EIvK?iB*?L@RAv2W)rzQdSw@x2&Zc3<tJYC$&m<nB72L~<iwM+
l*YlDSX4n|X$MSmUGx!~E$(q|V*&S#&gQu&X%Q~loCIEBxF8Kfe

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..c4ba83b3bbb0584318be52f57dbaf2a62cb0e4bd
GIT binary patch
literal 158
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`sh%#5Ar-fhe|&#`zn;zLVB>n0
zFG4{Ze%{IrsZ6;pU?M9!;g#qF)&g;XOFer0#j<VU9v6M42DlY6?n+9^X_9s*>UiAc
zmUV<La8{?0$n@<KOef2*y)Y9NW&081GKn$esap~c1A~oY<J_5QB_%)$89ZJ6T-G@y
GGywpXc{NY~

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..896a612e0d9060f6b87c20f0885475ab54f0aab0
GIT binary patch
literal 125
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr-fh6BaPY{P^|WK9%dj
z!Tt3dyds%uH-EO6EIvK?iB*?L@RAv2W)rzQdSw@x2&Zc3<tJYC$&m<nB0G!C#Fc?z
YQBC;KEj<U10nKCZboFyt=akR{0R8+aZ~y=R

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..40c7712d8d6defac0e05165df2549a5e96bf701f
GIT binary patch
literal 124
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&YmugAr-fhe|&#`zn(3skvZPe
zMCPWcNT%A&(iW4&rzbzL>M{vlGNa6FBA13&#tswVR1LlS#H&6z5&=(SXR(>MGB7MC
Vir{&hqX9CT!PC{xWt~$(69Av%CWZh2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..66cf887be57714c649f26fbdc580c09d93936bac
GIT binary patch
literal 130
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`o}Mm_Ar-fhe|&#`zn;zLVB>n0
zFG3*=d=p}wC#FrB>+fN_%f@rvVh>~2uFQ1dl?{_x+JcP(+a7%q3p;zHjnVbq!dQpk
dBqI-fhBfWUN)=|(4}pd<c)I$ztaD0e0st}oELi{m

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1d3c46a0b25c7244192f737e59d9fab9dc9b673
GIT binary patch
literal 206
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn>}foxG9vfC3N8W;d}j
z40?B#EpSU>Uw?q*ilmkXmyksA<43A2e-e4>@0^cZRiqv?W#*}m{OfpIwGxUWnHh{1
zZ%F6#ICgR&`-H@2A8zz^GEch5zR!+fQR1{JhfAVME)_D0G6ovDb5EGE+-2b@#)iIU
zTbD2W#(yC5*j0C?_DZIPi$39Ehtdw%IS3~0>iQ<~T-<N#eW$~h_&xv~$l&Sf=d#Wz
Gp$Pyo&Q5v&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..28ff5aa6bb7bd280d15df96df32aca420ef27f1b
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$cK!L+Gb}_dV
z1N%DL3bjJ^umYy@va6P5N;fMN{pd9Or_NYsv3{}HRKGm|f~y|d9^qZ8HsQNA1Bdas
zdzlS6f96y%NT+eCM>1+Z%Lp-JIAO5bHeu=GWs%Gm4*7^F=(}}p)~aT(n)SW^+im88
yS%J|iA7-dB^rY?DG{KDd8^bG=Wl>w&E$++gyj?0X&wnY<X$+pOelF{r5}E)p)kr%4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..52548e912eb0202e5ce7173372f6addc4ee3182c
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPF~G>Ab`U)axr%q
z1Isoh-$OqB<txHWc^}SJH)yGD@NRf*cdj?WK;xPDg=fYLQiheKf)3s1<}hB-{?nQw
zobj+ZP1{3JuJV9vA<G089Z`qL!IR8YOOBNsxSx6O<rTr;Elhq##2Q*>E{=cjZt}r*
a*7p4C&nsUH3w{iA1B0ilpUXO@geCxqoj{fV

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..3fc29f5a493ab27c9a2192bef7c2073fd51d5591
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HRX*X{<h
zM1-}0a$)c@xvPGmqJjrbJ>Zp2PTBSD@f}9S!@rsY8Rwm7viOj+IgLq<_g}(HX8ocM
zZ&<WX1hCywT+gDT7_Iu?q_%32r|j&;58tD>%t}vevT79kq;tS^Mu50T=HnYHK36at
X+k0O5s~L|p&;bmdu6{1-oD!M<Pnthl

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..bef180c6d4be9122b619a9ca565896b94b58d483
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foxG9vfC3Loq%wCJ
zgLqzWKy(uO`U5OiB(*fSge;D=JyK=)ci2W?-EWQ1ox;+moK$O?iyb#|9f{e-pm1iz
z6(7cvH!Z(0l${asyE{Ww!P4@?S4M}v$kPp5l{3~pW?98_!eBDH$Fa~wm!2{l=>2f(
zYEd=&hRkC(ott<+^E3F(h^|-EtJ@$RAl7X<mHpzh+fG*3YBYhaWAJqKb6Mw<&;$T0
CgGwF%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..365032be17499f96c1cd737aa6ef72614a796481
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L+Gb}@Gu
z17A$_2cJiLYaX!7vkvjSY}Uqg;-UJn5A&ZizqHtXEtGxZLai&8if@Qd+3j#Inn56K
z&ehC@M|<YDGgzl_s^4VPes=fe8+L``YtjyQJz5vZJRwnyKcFY@(VEkO4UHf6UEEjA
w;AouH%_6v&r9n9Dh5nPH{AJ9yvOfBV&$qiSxwc>J7SLS`p00i_>zopr0B*8P>;M1&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..99006ad2720a5f4d06d977afac32c2aaea0eda81
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PTt9Tz<|RwQkgrA
zfor?wiitNAwJVseOKPpt;ZE#(v~$Cc`Q8UU$0lDgk858iVKCpC(>LIMHQS0KXS=K=
zJtoYwVcy7Oeq*&mlV!(sCiX{{cr=vlBsVBOJK-=V)NHlai7A;9>#sIV)Ktz}F1A7G
n8k+>q<`V8Hwwq3w&iYeqed)uF*;6`!&SCI$^>bP0l+XkKv9LvN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..3daa95300c4cd18a9ec3e80ab7e91c4be835fec6
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-f#PCm$cK!L+Gaxr%q
z17A$_2cJiL>khEYvkuw2Wn-5@dw$PH`;+bucJ<#<ncJl(8M09K`LZBkzVsx<0)xp#
z>6|Cdoj%Ew@-#{R-8WXA&EYp$5{|D)4LIO&$5@{+XU0wDl*Ln*g#2U<P}sA5t2{$<
uTGU@=o*C*4R*7wCin)9<T$Tj}*D@@fd|gs^o^&$MSqz@8elF{r5}E+ibVu_5

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..2a5941b17b34aea12e4eb1983585bea8daf2a950
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-f#25;m&V8HRX*X{<h
z#HO+nJxBO!6~$BD1)dFYog!gm;oQ>8ICI_e7tFbbcrWl+^*;Am#JAzEJ5$byqpPDi
zGcN2@V*JXb&QY}Bpqxmr0%K)1yQy;=Cx?Q!%7O<|juv}L&hGnA9#v$OdLq@7>HUPY
q4D6@xoN_wb)-%UqamN2gf0)=7U0-1+&o%?-BnD4cKbLh*2~7YYRYvvz

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..da36e3767da49915f357d889956a6dcf0ce7c84a
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhSJ*38a&%liaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
v7<iuIK6~Vu2U|wjy(VUTx5F<!wKM1%Twihc%!idgcQJUn`njxgN@xNAT@*(m

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..158596dda663bd8c0987907f2fef86c8529fffa6
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhSJ*38a&%liaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
t_gR-TgAI%e-t1vzkLzi>_>`ZK!Bh15ij#f9FM#f1@O1TaS?83{1ORL+M8g08

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..68383dde3105c9d30f37c6b8a4862331311f481f
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtMi;K0!qd6-qU
z;ZYQKmQYy%tNM;x3%3{?6PPDfUwr)kN3IQXPw(0K?@EiC!Cj}na*P2p+eM!<s+{x@
zbXaqs-(r=+BukGgOzO|B@vKPt#vn7plG$U!sl-susYbjXc1IZ)g`PQ_&1jv*dmv@T
o+UNzZCLSz4*S<K`^Z$8nammZKTXHUk0o}vk>FVdQ&MBb@095cvJOBUy

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d60be09f338759c255045e1fda0da6438a02aae
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhSJ*38a&%liaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
j_gR-TgAI%#sp$--zg=E&NOn#f&^ZjAu6{1-oD!M<`CdTw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a41ebedd1e898f633fa30c2b5f3d2628fcef69f
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|RgQkgrA
zfor?wiitB$mbQ6aauIu^EpF0LeL(TSuKr?WHIuHFyjOm5G<eypvEo<oOz&by64g6+
zk!8{kg^OHsI-=zQT;DKS2o$qTcrfMgEFrCAsR#eJB$TY`Xy49Mc0{V7bLQIk1+OO8
eHthU-j$d{5`Fh*Nhax~{FnGH9xvX<aXaWFsZ$fnd

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..4512b6115059c76b457e7e4c435d837798ff573a
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-flPTtMiV8G+DmyO$~
zp?izSI^D`;S9n}q8Yeu}7rE}TPrSaQV9xEBTlQH_i)Ty=*ze8|@+|RcC4*<(G7g2X
zhu$)!3Mb`Mq#A{bv)Mxos~Pyt%wbfqc)DR%i`Q(nAC|fj_MvAEOEX%h@g7K-xmG8@
gH06Wxsq#7cEqv$eyNgO=fi7Y2boFyt=akR{0N4sYa{vGU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a34f7a3794f116fed5e71e59b46ba0727e7219f
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPPXK0aNuy=*(Uyl
zLF95&z~q8uD{ZF;b0>4G7Td4*=eXDdi|sqN)L&_FGtyny=gtuFEb(b2gQr$7i-7h=
z)jq2UDf~jc2Re6dWnMMImVrI(9D~rDqKH_hrM}F6=7{xpiGKdzcAzhk*&s6QwfKr(
fDIXqB&5v!~bY3|vXxeh1I~Y7&{an^LB{Ts5s<1)K

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..d50f751345f65fe38f69867753934ecafc149cfd
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl1{?A<IB-0cuDif)
zu))e;@&~na`KP|eVk{O|l`LL5WlCSRHT$>q3JDSH5`qspbvl^!&9c=VTztSi&GLg1
z`+2_&O+2X!WIuTw5ZV;VG;dFk()24EB{}TZFHHz;*I6wrp?IDtriHWAaiZD3RiAmS
W&YxF4`Q#DE0Sun5elF{r5}E+g+CE7D

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..4ad6261f1fb819ed88318f30a79794a94492afc0
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>}foxGd(fC7)pUN^Bb
z40?B#E!cL1Z_NRgE0S6oK}t;jjvQ5N+0mX_Trem4^{VEsg;pya<G;=KinW*<%H1$|
zW{b6!g0;Rn_k`B&#T7Ti4bH@+ayQ6szS7L(cHDL|SHj^lathLmRTiG&Z(urG?e?3=
zAVck~e8Pb}3>PxfG`L@;AINhMPFm$!-T9f-V&3gimZ|r2fNo>(boFyt=akR{04b<S
A!2kdN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a477d20f473988b0f80175887fed0e3df734e2a
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhSJ*38a&%liaim?M
z;fR=$s5x_?;H(>BHEbdaGxZKHVq4BA%yHvRPtJiPrdbzx-@7L1yO}32H5NEbcQ;%x
zy&)|paf8Hc@eP)HdD<67@V+>@c<1y9jKUvWQYFR07fA%TIXyVIsLW7DR%GIeojl=A
wT1t+_ZH%rgOp}-Fx!{w+#w_g+SjNWii1&Kww=GvCfevHvboFyt=akR{07uV5VE_OC

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3d3c4cf3bdabb89c58f7cf7560f81c0d770f519
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhSJ*38a&%liag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
g?2;#LU7L&<0-jy^kePd}1LzV4Pgg&ebxsLQ08y<%KL7v#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..cdbf635a4b6d4574f7414508a7bb7e3c63b6de49
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fhSJ*4hbmL4@a4a+y
z5TBUjAUNxpQBaIQW5e0AKX_&|_$ms$JNmqdljTq%lb!w-p$k4i5+=fnC8sm)tuXm6
zWR$=(Z-vg`XI^Ycb2^VER9rDi*w`s?Hg(6I0GF<`66P)r7B$bxg)_x=3Tm@4Y$!dK
U-O~`J1+<>Q)78&qol`;+0Gy6F%m4rY

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d048016871c05333dbcee9d139826f92cbd360d
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhSJ*4hbYrwT;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
js2MfqCN40sW@d0)ed)tym$gwq$1r%h`njxgN@xNAnJ7RB

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..96fe6bddbae937909e02da2ecc3bcfc87fa5d75c
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhSJ*38a&%liaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
n7<iuIK6~Vu2OHPsVkw68TQB>(S?XN{bP$85tDnm{r-UW|O~yiC

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c6557a5bc08a95a6d1b1d484148494b64c47ddd
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PTt9Tz<|RwQkgrA
zfor?wiitNAwJVseOKPpt;ZE#(v~$Cc`Q8UU$0lDgk858iVKCpC(>LIMHQS0KXS=K=
zJtoYwVcy7Oeq*&mlV!(sCiX{{cr=vlBsVBOJK-=V)NHlai7A;9>#sIV)Ktz}F1A7G
n8k+>q<`V8Hwwq3wM)k-SPrvMABFMA@=pF`7S3j3^P6<r_$s|K3

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..d0f480b3af9d7d304c06f7dc5447629c6a908cc2
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhSJ*38a&%liag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
h?2;#LUYkBEG6XtZ_ThEeaU19q22WQ%mvv4FO#pqmK}!Gt

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..6a84d7cc03c0db8b3f6a49bcc7d24a85c20e53ac
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhSJ*38a&&B0czCqp
zgP2K82cyRl!Oq!@J2+xx<}<ox%sRbc<>Ax=EKFwRkBt+U%vwEmh|lL%6X0m){ITbP
zw}Y`~;su|cv>3K8k1pQvKGDEgv1k*|Y;DPoLN&4Ghk>UXj;bY@On>;vNl<gvMP3ah
pff*`KTho$^C7DgEmrv|w>{P$(V|e2BBcO{IJYD@<);T3K0RUweM63V+

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..045109c3f7a64af9a83ad12a64ae7b49298e205d
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L+Gb}@Gu
z17A$_2cJiLYaX!7u@3RQY}Us0;-UJn5A&ZizqByVTs8MbVCbYTGT%6#s$KXl$1p|G
zy;N)gi~e)D1C5b~J<AWYRq|W?X4Ej4ExBQ0MaDLUCo?peMAD~NyxPS6z^USX#(moc
xSL3K|7VR|N28A<A_fJr_zrj1<=A*_ZO!H@5FFh^gwHN3x22WQ%mvv4FO#lF-OuzsD

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..11542e15c21d28d229fcee2c5798468f31802314
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhSJ*4hbmL4@a4a+y
z5TBUjAUNxpQBaIQW5e0AKX_&|_$ms$JNmqdljTq%lb!w-p$k4i5+=fnC8sm)tuXm6
zWR$=(Z-vg`XI^Ycb2^VER9rDi*w`s?Hg(6I0GF<`66P)r7B$bxg)_x=3QF6tFl@MZ
W?zqhEjg3J289ZJ6T-G@yGywqSu{$mR

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..99fd34770d95e2a447f233081721c9a5c0da5953
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HRX*X{<h
zM1-}0a$)c@xvPGmqJjrbJ>Zp2PTBSD@f}9S!@rsY8Rwm7viOj+IgLq<_g}(HX8ocM
zZ&<WX1hCywT+gDT7_Iu?q_%32r|j&;58tD>%t}vevT79kq;tS^Mu50T=HnYHKQkXo
WJa>FH|30Ag3=E#GelF{r5}E)JUq3?t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..a4dc944d480cd78bf73d2978ca10783970ac9eac
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhSJ*38a&%liag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BFWhL{Z!|e>J
X_UDxiE;zCRUBKY!>gTe~DWM4f94<LF

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..5d1eef1c456a231a49a7278fc0bbd842c4c2ff07
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|RgQkgrA
zfor?wiitB$mbQ6aauIu^EpF0LeL(TSuKr?WHIuHFyjOm5G<eypvEo<oOz&by64g6+
zk!8{kg^OHsI-=zQT;DKS2o$qTcrfMgEFrCAsR#eJB$TY`Xy49Mc0{V7bLQIk1+OO8
eHthU-iC@+Jyz*De)6;>@VDNPHb6Mw<&;$T>l0u#U

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf228f547ddf7f20ab3b3016c771c6e2060c0efb
GIT binary patch
literal 204
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Ln>~~oqUk@fC7i>Za48a
z3^F^uJ(zh!HsT<sP5Fvh%hbFAm$c{ie3;*{Ywq=V-F@><MN3{vD$-!uI4zAqAT6Y*
zts&!$OcaB38t3w~b3y{Wb|)&>6%McY+OSnQW9egtRZJO4YTN?q;hkPnWf^48t`0x_
zRkq=B&*F9#zR&CoZpN|oiaK>0*eAqysEJMbSi>BzbGtNL;DZa$c?_PeelF{r5}E*5
C!b;Bo

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..4256865651bfa27902beb0af0109ed2f99c111a6
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhSJ*38a&%liag@g)
ziF;z#?8Y4(BFtSEOr}qK)Wpe>ljmlZV90p(Mcem9yAurg&StX2v?V&|GoH0LoM6}|
zpuR$KI^*67lkY-C2~6`==p26LmBM_=gTtoc%Are+f}OKY7pN{#3Nl$N9pIv1;CYJs
p?2;$PoCBOUJUp5q5&KVo;at#lpB0muCj(u?;OXk;vd$@?2>^=ZMb-cS

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba16e32a58c3ec506e42507d36a7a72ad9345de7
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L+Gaxr%q
z17BSA2cJiL>mIPou@3Q_Y$hgn>Y;S<AOBB+7Uz0*-&&Bhg46Iz>i?B@S|6>6WDt3_
z<W3}0*XN>b46ZvZy4q@455EaDV?1G)Eg51U^!<!CgJjw#hNBs&L96~S1S#xUzEz*0
w`Pr6V>=Fk43?+wn&N}_GOfYX?7S=o}zPtW<DQli$571!@p00i_>zopr0LL0iSpWb4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b23cb597520f04124975cf77c3b4e21e0e0d104
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhSJ*4hbmL4@a4a+y
z5TBUjAUNxpQBaIQW5e0AKX_&|_$ms$JNmqdljTq%lb!w-p$k4i5+=fnC8sm)tuXm6
zWR$=(Z-vg`XI^Ycb2^VER9rDi*w`s?Hg(6I0GF<`66P)r7B$bxg)^tzso?0?{@_6O
eMT1>`6d9cFTvjeI+WQ#j4hBzGKbLh*2~7Ysz(HpK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..c29337add432ca4b958f7e908ec4156eee03e450
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhSJ*4hbYrwT;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
qs2Mdk@>;MYJvh*P(O}mfMTRTOulpPcR(%b06N9I#pUXO@geCx%9z=Km

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f33f4d8c6d6310609b4626f2c10f71c31b3d377
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhSJ*38a&%liag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BF<Vn(wH!HdM
g_DJw9J}uA0u*3Rty@9`7IM68!p00i_>zopr06_#ifB*mh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..b4887a3251f46b742a9d1c0c5645dfd983084961
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhSJ*4hbYrwT;?VRc
zO+n8|_;%Cz1|^fTsS#Hmm?SVU&Yt~I(txqsDdkT0k+?Gr?#7DK6D2NqI~Z>>h&a=r
zeuOjgSf+!%+}XV?JTn^9wN7u?A#}9CNQjAFY-<5?m&cWuHf>pvi3=nTHz+YRdIrU1
js2Mdk@>;lfma#E}PrvN*#mDqN&@~L6u6{1-oD!M<%4$E(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..797aaa1d65d195fc9ace12d34ebb05d12d8f3ade
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhSJ*4hbYrwT;?VRc
zO+n8|{CK*9;H+mxIj;&N4H_HHp8dfyqrq2E=-tuhO`I%;5}EAuzX)CM36d}oUMxAC
zac_mmcOjz$rg<xL4nOl^OPbSpG@;^(QNqSfiL<FY_5`?erIj#uaj>X)RxX@*!-vi2
lfq+2%!A9}Li6uXs85XU+T<^}UD+P28gQu&X%Q~loCIEIYLUsTE

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..9817194c5449fdd120b41022f47363f9b60ba6b9
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhSJ*38a&%liaim?s
zBj66t5!Z~Q=ns+sEz5TDbW6=)^HE4BHnw9{O9<@fsh)VFTk=DO+7lxl<|@vNV`6MT
zZi|KDSqt75M;Gs$K7mpAgG;KUSok7|05_)x2N#LuIS6*nI$f}|SxLwwSt7ti!NBtr
m_gR;;4Z1ucDX9fzYz*7DF8h2_UT`1iA_h-aKbLh*2~7a4)j>=E

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e3eba1f0f10363fd356f98807dc77bd8adb7956
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPF~G>Ab`U)axwQl
zMu8h#CY;8h<txHWc^}SJH)yGD@NW2Qcg-!vK;xPDg=fYLQiheKf)3s1<}hB-{?nQw
zobj+ZP1{3JuJV9vA<G089Z`qL!IR8YOOBNsxSx6O<rTr;Elhq##2Q*>E{=cjZt}rr
b*6Z2%gU=oJEj@Mx=m-W+S3j3^P6<r_kSsv6

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..b7454e1b100918c542dd05b49282e2f98add6132
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhSJ*38a&%liag;|z
zBaiKoQV@@Z)8!bqE^ak}4Lc?0GYW6ebUC#5M~p$EgN4t5=dE!}vpl()(~?Xc8!Zs;
ze-`J&=5s)JYU+)clMX$`8zp%9qu6xJ1Q+k*nJ(Vtaj_@QL9p?Fil)BFWhL{ZqYNsK
W&mCuTov8qH0E4HipUXO@geCy*S~;`;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..f5786455727c8c845b2040e6b79742eb07998618
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|RwQkgrA
zfor?wiitB$mbP`R)^M8R_fh&teGJpO-!r_QFH<v_l*w6Y!?eJNU;8|>N6<{AhKNr2
z!Yhp`)e|yU{LZYE4LJIS(ZZmZZNh^ohhGV4<w`yHz9k`K)r@v?rm{0q4JVDF_d8rw
eZ{Gj@55vq~=WkE4Sn~ns3<ghEKbLh*2~7aAkVEqT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..d2e9aded4e4193050568bf0f65dd2fe689a427c7
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhSJ*38a&%liaim?M
z;fR=$s5x_?;4TY0=B^7S(-VW+Pd9L~<m9=TB^WZEebM%P(e4C8zO$JuF>Q$s`iy5S
z4ksA)38=4-oX)tn!sNS<Q3BJv6*`BXd8II)^5C$kxN_){qhRN((*>$al!8naO9!|p
m7<iuIK6~Vu2b<SsV}=camsdP)nIr>r4}+(xpUXO@geCw7mqEP%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f26f1b693f599d7b79df579c62422ddbc88ce27
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-ggPTtLXz<|RgQklDo
zfor?wiitNAwJVseOKRyYI^iTy(DnS#qrUkKpY47v@QvZ~y_jgD%E=q>znX2uk*i(N
zk{%Og+AwcqQopg<p~<r2IurY&wUPmDdyEp?&rEEzSiL4}>IBWp2LHmi-In$2SQm9b
rcB9#Wgc;G>9d0T&f1h*O{}*#-^W_!neqWS<PGazM^>bP0l+XkKG6YEe

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e44ca17703055ea72e708cfd0eae59787905b15
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fl25;m&V8HRX*X{<h
z#HO+Yw@1s)*shwnN=vEX@<C~{V<$@Py31RXJ094;W1w_Ec&8$t&P|<(4VBIE8BY#O
zlF_kp6gHaD7;-|Jk@v(b&WI1Ep6y)H<?H^VR@ZX2){|{kje?(a4tUN85NFAJJm2a&
ZyS4WD`g<a86@V^a@O1TaS?83{1ON~FK(zn>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a61657b3fb8e869f2c73cd345d1368925d0c035
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|RwQklDo
zfor?wiitB$mbP`R)^M8R`BC~veGJpN*AdZ=7mJxp%H%G!VOn71uYI1`BWR{lLqw;3
z;gv>}>IoSverMLo1{{6EXkk#yHsQgP%ddpAa-|+T-;xlrYQ}PNrm{0q4JVDF_d8rw
eZ=V0&CU54v^YweDPTm1@27{-opUXO@geCy94MR!*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_lime.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_lime.properties
new file mode 100644
index 00000000..968e822b
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_lime.properties
@@ -0,0 +1,6 @@
+# Stained glass lime
+matchBlocks=95
+metadata=5
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_pane_lime.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_pane_lime.properties
new file mode 100644
index 00000000..108acbca
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/5_glass_lime/glass_pane_lime.properties
@@ -0,0 +1,7 @@
+# Stained glass lime
+matchBlocks=160
+metadata=5
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffd366db31e03cce9dd1b29358a197b00bbd1ef6
GIT binary patch
literal 152
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`@t!V@Ar-fhe|&#`zn;zLVB>m+
zy+3#uv=vw;@H(UkFO`fGUK!UI&2Y)X!+4iX*K3VSK3j}CH!{W=dNz7Y+RX8DVo2pC
z9(TdxOF5=*->^#Ej7Q^APq3_Oqf61LLyN>2UVHWReLeBx9?&WVPgg&ebxsLQ06hyf
Apa1{>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/66.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/66.png
new file mode 100644
index 0000000000000000000000000000000000000000..13d68d0d474b238e65609e7d2a43fbd64772daf0
GIT binary patch
literal 668
zcmV;N0%QG&P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007GNkl<Zc-qxd
z>rNVB5ZxE97PYZWY;4+UH8o9|^hb**P^1#?ak+@x=>kF#xd`k9+~s}|)7Cz~>FiK_
zhyFO5Z+CXi%$zx&(7zEe(1WO6+K`Gap;mB0F1n$Xw$ZG6kPI!NUfM<N%F6%5&*sp*
zIfX9oLn*l+TxLEZomfRzJ3=nC4z1$Czz}gGpCB4ogjpb)T&9FQv{esM@iz#GPoUSo
zBI=)k&^JQ3?F4X{S*MQ<WD;)~iSy?~dJIE$Q8#v~Y(YNt4nwMb*Y!gRTkx|Vgpf^s
z!2KkNUeiYbA9B(%evc*GkIorGD$s5C5%JCPyLley-p9C*lU_kCyC9crH0Kv4&}9b^
zdZ@Y^^3^7FV?kRvqWC5n*A8@>B5AdSX4L_qUfkhC6WX<%2@K_sf^LjR3%$MrDY8HW
zha~RSRNQMf5gi~-V+v~d8wwX2j9hAs34V~6y6i=}AtDyAFhM%LiWUjoB=u`WJDRnB
z1j+L`{2C>2+xBCqpYr^ZUKCkrgA`xIq~m4$8HacS`OGI|zrW_>yM7FU`A{lubkrkg
zB`3A!L^`&_NyAnMYMJ(3wxO-<p_qHm!i`%#^32OAL6v4VXupOsg}E{*JdcqsqEYos
z+a^O*3){5HSrYdIy1GXOdqG~=hai_evjZPcEm)CHuW(fpJu;F~wnD2p$xth#!7<X&
z1x7sZ)YM>}3~|P2sRy`7tRU>0K`Qc$VJ4e)HZkr5IkBzo;;t8A2&2|1-vu){pI#?d
zicIz(o|!o5ODwQj@sPM{=+n7J1~Zfsvhsg_nf?M^Z$yx&cZ*K|0000<MNUMnLSTXt
C5-z&{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..42d8739db1afa8031e9f5a820aeecac8f9300231
GIT binary patch
literal 206
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q$1ZALn>}foqUk<fC7)}+-=NH
zCS>!^V}2*Ft5Mh@NIgSS)Wj{BPu}J4d5OOd?bd(NGJn*%DS-3;gBt-gtVw$785GW}
zcr%k}QejaJW6liKIkODC9gKb{T(@SBOk2yoCe~3~Ry{z}f!jE;VM~Qq$f`FCFEZk4
zqt^Xrn3FcAR;6GDJA=g8l2pY!wl~Zos>?QK@E6uG7{8tvI8j<=9?*ddp00i_>zopr
E0BtHrO8@`>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..7744913f9177a05e31719649a87cd8f0caa7dc14
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$aK!L|~?ls1u
z6I<EOGnRAQJ-{imQaHpbT4k0Czr4$z^An!5zqZH@etD#=D}eXCqMn9n<DTsd3TG^;
zmoskqT>Ogh%?#B!DXeQ|EDpZOpm2Q6w}z>GyVH0b+Gg4~n7MUs)~aU6GkGunc02oq
zOt;*L3CDF9AD9$tb7vYR@GtO7TIE{Z@tK$LeQ(PLyJR<@(-=Hm{an^LB{Ts55m-wT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..a87f362ca10588280d6ae9103c337a741656fcd7
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtMi5WwL&^BSW@
zhVBZ_h)24QJp2|+HEhX`b9COpzJq1Q`O=&ttj$Sv%(-^V3j`;Ji!*L{aYoW%@1b}P
zvqmwyjBQOKk0!F;5p-wpJQBocVyRjg?3C`q{%5Y(96wn@SM3KbIgAlAEPt`Svy*(Y
b?=$n4YmG+2Nx^nNM=*H0`njxgN@xNATiQIU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f572a8ec423abefce2022a2c55b947bef205b49
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HSCmfV2@
zw;Clo)qi>Ty<&YE5-P~JhUeY}L$_tW_w>mM7_8Bk5PZ<7)4{B7maX>S;sgF^mLHVZ
z&--m?;z?Z~`^oEo(56tPd3%DCreE18$x*+4X+m(j&T3%^#q&%tEu5u}6V3X1t@_zl
Xe{M8VpT714&;bmdu6{1-oD!M<pAJ6B

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cc8ef9fd75a2488cf1c34aebbe55df6334aba64
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foqUk<fC7)}+-=NH
zCS>!^V}2*Ft5Mh@NPWc=u32u$eDW@z=YL%N&~AOuRO^pUkt<sA3vx8V8fTo=X5cW^
zG7WYxD(kat;N9F3Y@WvH;l@`~%P=AFno+`Aj;PlbjjI@<W}IYNax`?&rKb!I?iFvd
zcJ5^^m{s^~!hytpj0ZR_e-(f9jJ=vMb#p{;CBwEey@7^q(I<hfWAJqKb6Mw<&;$S>
CX-n<^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..947f4ac0c4625ae6e72b8b1ccebb1f8e515b3de8
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L+`?lne>
zg0}~aJFO?=Jz(j(!g<RiH+e;aOkEPse^0v^eYx+a-%>EU(o$8$SLygv=tMO)!=awd
zR=fdor=R9XIIi<h#X8~WoVn-f7>dqhv8_>gH_MbkGVK$?RSDH|yJQ$8INnRY-OVmw
vvUr<^fT1^oMPl1Or^r7E<_p$~oiAZ(De2U>wLV!1=q?6NS3j3^P6<r_JoiZq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..fea9bca954c559ab678919ff2f6c41af967671c9
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PTt9Tz<|SbrWtd<
z4qwOKBYc5oA6Voxg^x^4RXh`DBQEy8nDfWGa-Uzv9$ye;epalykn>gjd4{PwA`8`-
zIgKW#D}+5@s}}VzVE-8Pz#(Q9W9kug=CUI)k{z2*rG;|NG~#`{HOjy!^~l>ROkqcE
mF*GMm%WK@^9=6kMvV25g%m3OP98EyyFnGH9xvX<aXaWFuJwxyS

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd0ee45221ca59b924e5e2a0f8152ffee7ea13dc
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L+`<~HVn
z2e+Ejg~|=?HgL+U6u#muy_%!w$1#cjlWSPseO~2zX{E#@N6}kFIa;O<3)I9I*o`&I
zr!~CUGe^fEOz+#Hy!ZnK)l+>L%FaZwvGyFX{Va5#ZKkb*S(K;ORC@;2L)Fp084WU)
tU9~^ZP|37FI4wi$(z6E76e-iI>|G~2H6qIOOMtFo@O1TaS?83{1ORB3N09&k

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..50ef16b03ec46eec64010a02853d0e019be78120
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-f#25;m&V8HSCmfQrz
zZ1yyjx)r}1^-g&1T`+T1hmbQ{ddCJsh0DeFY8UwKV3_5&{G*KL2ZxRSJr+n5eSH<i
zBvq28vLNmuizA=OjpjvyDhl~;8;qY!ZD82s!o=klX*+$&#+MxR%T<>Lx5b1jPm$du
qs&UY0`=$doCrlJh7kL{$C;s)x&h5sx)cyfo#Ng@b=d#Wzp$Pz#NJ%CD

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..378e5efe56660f9dfa75176dc318b98b89b1e679
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-ggPTnhcK!Kxm?lne@
zjNpjk=X^0{1x)UzST-71_IG%6r7zs$-#5QNHa)k?KGfOzR9Zn6Q{{f927|{se#|M4
zpPMk<Fz~iG$rEAduDqGQfoF3RbC_1%EK>&EGbxOp7EQG{UBt3raYcUid`pJql3N{_
u`XiYRXe`SXzx2+nZQnUpLGF{^tC)q-I=AyI5-b6_i^0>?&t;ucLK6Ti%|tT*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..557d38d1ea9f32ef939ea3e32409824dc1c5c34a
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhe}wG+A|SAQVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
vNmImUb)HE`V0O4!$<4P%f_L$0c_s!u@6PQu|F5(G-NoSP>gTe~DWM4fhGj<2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..a9f4eb0c6f10b4165dfebf4498a81032518dbbc2
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtMi;K0!~^BSYZ
zx~&V;64@WK`4uQzHi{jSICS|@{<|Ocag66m=Wm}jf7S(#Wzj3{D>G<)-tfq#L1m^U
zQ-|meL3dFPBlgay2S@JAVhlYa*T8I?&cGRFxkhVY&@#rlaBjC{U6mEO3CGtk&fwWx
n${k{BRB`TS!4}Pz|0@~)IJCZETOy_obPt24tDnm{r-UW|o54js

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b74afcb39ad07a8c92a2f4715ddf4cc5e6fd876
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhe}wG+A|SAQVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
mNmImUb)HE`VAeQwj$xxt>-HV{o+tvH!{F)a=d#Wzp$PyblSHuq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6bb6434c396c4d6c6e397ddff390813fbb8ba2d
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhe}wEe>1C?vXk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f`R
e2Nb<F88dKQZ0t*zZr25L2ZN`ppUXO@geCxBph1xU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..be3c1a27f5ebf73febf9b40e012d6f7c2884983f
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhe}wG+A|SAQVkf`h
zgatb!JGw6%{U{mGvTP^MY^xYHABBWsV>@QGgy4>r>W@1Um>LUaG@R$&%VIKFgzfB+
zjAN+|`f_LYw(!hoP}e%WVdtbqiS#5x3AwF25jje3#gcmZA`=%$-fd7~YV-_>%TP0$
gY#1<M>cN|m44E#CeW#|Ff!xL5>FVdQ&MBb@0H=UIw*UYD

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f87f517f10efb5faae81d48872fa33019bbcb39
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-flPTtMi5WwL&^BSW@
zhVBZ_h(oUTJp3MXw;Hw_ckjL}@b01bgFF3(TWha0xEc8`>~&`_N&ECEjKNo{m?c2}
zqiUzsg%p0NUWLw`Tbb9*2xs6tGl|i}LbWp1X{j&!pE+W4yhM%Hx*h1d$z%|j_F8<$
fuapmur{>3Iyl6Cfu(xO`&>;+-u6{1-oD!M<+#y6;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..ac497a7b2f0cca903a6395a65d1c60f1ed5fc403
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhe}wG+A|SAQVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D&rHC6MVDRUVW
XSR0KT^=Fs?UBKY!>gTe~DWM4fvGO?s

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..078a36af60af28d8a6a493ffbb4e01cd2a6d3293
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm<dK!K;#IG6o|
z;&nM2_B)Qd8ig%_)K`c^t$DWG(nj!OZQBv{=XG1wS*?&*HCgIQ>hG0TS}#X#Ww4m(
zxnnWYrq4y27$SFAbhXzq9)1(Ljp2r&x2;A($sOa>3}$EEFm5vR5?b|#LF2-n^ey@f
z&1skZF|wWEW|*7SwrN5g+Z#3$#br@jrd!0zUg>RFvgV{2&}j^wu6{1-oD!M<fyPYq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..2bb9b0d0bd1629c09efdeee34a00b7569ed53d7a
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhe}wG+A|SAQVkf^L
zL#M8bRvz0UC6kT1KX^2pF2}UF^7=8W32fLYd9&dti^*c?d)-Ikdh!miFg<M0>rZmf
zXFPl3P=cYEenN4TB%kv}sSDli#rlfOY7aV38R@KZF<j8oa-iAuZBm4lhEia$<hqs+
vm!>ox<}MBvHP6b0Gf(ianKdkW!^3dgxwEBu`XzIq!x%hW{an^LB{Ts5KWsy#

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..88a776dcf52ab4862c1e8fa7adcad262ba69377a
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhe}wG+A|SAQVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
f^JK3`YC40NOv``Pm#z1KE@AL=^>bP0l+XkK%Wpul

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..35c3098fb284890b79bb3c7d561bae1741cb7b51
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fhe}wEe=@mNT(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nu^NI8s$Ve0CJ
VDp3X3l|btmJYD@<);T3K0RV>nJBR=P

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ad4c4e68ebd21b55141d039c34a9c7a4792cea0
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhe}wEe>1C?vXk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
j@JV62eaIoRjEzC<VaxyXmQGGU$1r%h`njxgN@xNArma6Q

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..1360eea1d3495d35039202a7ab7cf7f6604f0277
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhe}wG+A|SAQVkf^L
zL#M8bRvz0UrINxLHj#yydWV<sO=lG5xN)Z^=RgwEtc$$wUCR$9$;`UUv4iJuLmbnr
z!ZsjR(J#PQkGbk&#yi!N11vUyk!@$Eo?x3YQJ~_(iq@sgN<ya7A9{JXF3E5+U(n%@
mFlmbTtj@C&c|_8ln=njy-5Px{l>Z3OK@6U*elF{r5}E)C^F+b`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ba09fc366e3d88291e202dd44b5c31a4a343174
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PTt9Tz<|SbrWtd<
z4qwOKBYc5oA6Voxg^x^4RXh`DBQEy8nDfWGa-Uzv9$ye;epalykn>gjd4{PwA`8`-
zIgKW#D}+5@s}}VzVE-8Pz#(Q9W9kug=CUI)k{z2*rG;|NG~#`{HOjy!^~l>ROkqcE
nF*GMm%WK@^9=6l1`y+G2+1BXX+%=zp?qTqB^>bP0l+XkK%&tW-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..734a7cfa5db57dc3c2f9627b54ce07b5914be471
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhe}wG+A|SAQVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
g^JMRol;_S2W)-c`(&DF5fKFlXboFyt=akR{01@#(y#N3J

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd3329f0789465bce14958c798316c45c9fa04a4
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-ggPTtLXz<|SL<~8Pk
z9lnmeNB9EGKCsAX3LkM5iR57R`xp~(=c90ee7O9U&dUomt$LQLEM$CDf1Y9Lj;KOy
zW=^BY=?Y;FSgJ)m4A?(LJ#g4#%6zILob64ArIA4T)T^t6j8dhJ-OoCBVv6APQ0^Vd
p*VrU@ieHOqRHuBHSN!udb6#v~^Z`|~^*|Rfc)I$ztaD0e0sz0NL!JNt

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..02d6d03051636650ea74b58c4bef59d8178bb8e1
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L+`?lne>
zg0}~aJFO?=Jz(j%!g<RiH+e;aTwM~+e^0v^eYw-U*9u!_c}<$<JTG7;%ddOP4MvYw
zoMXE3;OQl13xjNnmwY!2o-f!e-@vqaCZlv`dm6Vx-%KTkQn${<desbiE#G^;-DQq2
wS-jO_L((+{jzclOxKlqh-({GoE9c?Ya-p+j-rgBAfbL@OboFyt=akR{0JmpMTmS$7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c41cc1b8370865fdc05f2ac5537e71f3e36e5d8
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhe}wEe=@mNT(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nu^NZG80gJBwb
W!?nww?`{Ly&*16m=d#Wzp$P!rx;@YU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..113d0c27516dc65e4ee362f81a505f97d45affa1
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HSCmfV2@
zw;Clo)jxUozhZqG5-P~JhUeY}L$_tWWsdW4NL&-|;rQSpcBD~!wyE%kj1TOmWhy2%
zr>jRewi#XEt5i+kys5?LAE!Cd`_&Demi^a*Hmr1>c9pYdLOP?~p_W|>JfzppwX$D5
Xz2VvtopV2d_A_|8`njxgN@xNAYn(t$

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..c1ab11031615cd77eae96cfd7dfa40d0b255b72a
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-fhe}wG+A|SAQVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D)BWv+Qg+V~k6
YxJnz1cK=mw0Xl)f)78&qol`;+01{|BEC2ui

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..600cfe2d9daf79d468e70acfc7a4ae89843b0fac
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhe}wEe>1C?vXk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f`R
e2Nb<FnJ{pbHX0?GuxJ9^!QkoY=d#Wzp$Py*@IT!E

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..80182e50ec1702ef9fc7862f71a28ef7a6a00dd1
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>~~oqUk@fC7iBbuRmZ
z16$e8tG#pB)hKKbq`o3EYmta+)sJHw|2tRQE}avz<-bUN>WS`?3ptKN&0}<!5qMIP
zY0}2x491ihsy1fDlNwUKI3BZhFgX*&?_u2(X2rKaOTq8VMW!VuLl*_5vOBnceswjd
zmi>Xr;}?pJhyO4(T=cmf&(SUahVcXUMHeTdbLK8dy)A-2-K&AFWAJqKb6Mw<&;$T;
C;7$Sn

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..f655fb95c64e4c2061095234af4478245dc54e06
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhe}wG+A|SAQVz*?&
z5iuoEbLK)pO*WB*nR?1cS%o=n-08_Vki<0WBJX?G@`Fh-vo3S&;5pn7$26<34aimW
z3ozDWuKJkqPBrBKi%no;+u5ln*rrSrsQ9p=b!oGbkm>Y?ULLMXGTh7;bT}kTnj${S
n^JH)Pg0_Ui-4_jZ{ZVAt+|e2RI+1B9&_xWMu6{1-oD!M<Ev7~J

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..b94667c7326188af602b56bcb15b248e5253749d
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L+`<~HVn
z2e+Ejg~|=?9^jN&DSX8wGg)w<%s#_o|5fB0i|wPrWkYyE7qZpftkWu8Xt7$1p>^gI
zYj20LI6pB3ZE^RH8}t)q>^-H%V4bGh%;ffHUL|M3;WKgy(rZ<gp5kv{dT6`0mQljw
w@+<j-12&8oIE_uXUp{ZR+aNZ>V`UlRf~}n`=D+H_fDU8uboFyt=akR{0J?!i?f?J)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..23141561fec38433755a337579db2c5b39801e0d
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhe}wEe=@mNT(DW!x
zK~L#ugObVF)FnF-m>6fz{wQg{INM3(PWO3MVUCu=EH!a2R2R%#VvwQcW~|3t^)cg}
zYRUl?o50Anvr~DFSO|9?{IDYRK$5WGtkVUR3p+&4zF-p(<nWpF$;nuA=SKm7{DY0+
eixW$JIx}brwHm#fB6JSu4hBzGKbLh*2~7a@3_#NW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..bfda4f2856202c48fe1159e554702471f6ed37a1
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhe}wEe>1C?vXk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
q@JV4~mM-8pa-dOsabn3&XNH}3JEIL}aeV{2iNVv=&t;ucLK6UPk3tIo

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e167679757116db19e41500d3d3ca4612dc4a04
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhe}wG+A|SAQVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D&rHC6MbO`pYN
gDh#FErrWbH%q?u~o6BPp1#}97r>mdKI;Vst0PU<j4gdfE

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..37c84eca9a1c17d56c6555f7d84fb48f9931fd14
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhe}wEe>1C?vXk<Bh
z)*+@vZ5!)+M%Rp4r#GxPn0bJO$;|w*aRQTA>xmuWoqK06_NO`N9X41ny&)|pal;Ho
z{|@0xJ(nBeY-Uw+N*XZwhfGT>RPAC+Rbi3S$$H2pGI7ODo^UG-B}d~nMpqW5$xHTJ
k@JV4~mM-X+^oEDQ=4@-Ul~~bDplcXBUHx3vIVCg!0LsBWegFUf

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..c971dfcb655b4e235eb4330b076e536b534cd055
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhe}wEe>1C?vXk<Bh
z)*+@vukU<=lF8ZB8&@70B``70p8ZkMfN{2y%AM}>til{EhgoXkUZ^gZxx^qt&COVk
zx$0xaJJpl}EH;6WZD*(Q9I+7YKKNlp>VYI-!&#>bDi?N$oPEJ2BFN!0>64T3#+f`R
m2NV_VH8JbE9e(ktouU0<YahRs-WH&97(8A5T-G@yGywo&I7M;*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0f4df804a4aa6f581f8fdbc63677e18557b4aa0
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhe}wG+A|SAQVkf`h
zgatb!JGw6%+4jJA0f%p~q?oA%?+k|n&(dnxd=4xUko>N+QQY{!MV}L?5^P_DF7)W~
zh#5cNEOeSxD0QLRy;xt7S?xjRDI=YAE`|$wS`IY3>fUKk5;C3s(2LzwCF7XEf)0m-
pNmImUb)HFxme4qH>cJZxhS?6S(cQV4%YiOp@O1TaS?83{1OWN*MTGzW

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..16374c398e70b9a0c46bb791b8977c72caf8df33
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTtMi5WwL&^Bb>&
zW45F3AtAj-9)1g^8n)!eIXdrP-@&q@zc}{@YjaW^bFLlp0>R1Q;*48foRM_cdnn$+
ztWnG^V_TERqlxTy1l<`tj|4HASgKYAJEi-u|CuW`$4}PKRr`TU4r9a&%U`VT>?Cvc
beXe5oQq^$Hj9Vle=n4i;S3j3^P6<r_L`FN}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..68155bad914a191cf42a5110a82ea6520c1f465a
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhe}wG+A|SAQVz;D6
zz#X0=u1h2WT9)nX5fS%MNGLY8V^&KD?r5q0xHEyNv0z5SdG5U|CX+?j&K}7)mg=A{
zcXn?J&x{6jt<xKJPHL1$PcoE{+sYG>qvTdBsi!Y8agpTR1|_CO&!D)BWv+Qgx)`}6
W8?IS>jr9RKfWgz%&t;ucLK6U@+dAI>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..016889e352f3714da3259d6db053e84496eb6569
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|SbrWtd<
z4qwOKBSLXUlvA5_bSWK~DYD=3&vDfUR?lx)*=0E@&)gPpT$w@Z^M+404JuPLnL4Ka
z5OSCG*u>uH_Tb2!Ta2M+<QkZb(-}DZEZ68QytIt5&X3z|X;)>1a>DU7j5BmLf8`FT
eHTv=UoO!)L<16XC2G&4lFnGH9xvX<aXaWEjtU>Sq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b0cb15ec6fa7229184d829a0396636cd6da147a
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhe}wG+A|SAQVkf^L
zL#M8bRvz0UrINxLHj#yydWV<sO=lG5xN)Z^=RgwEtc$$wUCR$9$;`UUv4iJuLmbnr
z!ZsjR(J#PQkGbk&#yi!N11vUyk!@$Eo?x3YQJ~_(iq@sgN<ya7A9{JXF3E5+U(n%@
mFlmbTtj@C&d8VYLGfZ`F-G1(Z`)Qzi7(8A5T-G@yGywq414R7*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..4e3885e3ad45b3566dff665381701ba804be0cbd
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-ggPTtLXz<|SL<~8Pk
z9lnmeNB9EGKCsAX3LkM5iR57R`xp~(=c90ee7O9U&dUomt$LQLEM$CDf1Y9Lj;KOy
zW=^BY=?Y;FSgJ)m4A?(LJ#g4#%6zILob64ArIA4T)T^t6j8dhJ-OoCBVv6APQ0^Vd
q*VrU@ieHOqRHuBHSNzkno*{2%>-La|d|f~%F?hQAxvX<aXaWEP`9uT&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2c6f48a72d62d237582a979d56414b303d86eca
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-fl25;m&V8HSCmfV2@
zw;Clo)jxUoy<$BZ5-QlZLv~MMa*xmTo4*cx6lLLg&7jO=Gm*9M!O^s{EH+X#2aVX{
zo;<k888%@dPf7b8p$#oLQybLRPdTCb_6ASO{Ods*GTU`l3ri@TXNqazEOne{_HSkJ
aeny4F#y+>2-a9}iFnGH9xvX<aXaWHF)<VYs

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..0051d1d8ca2d89dd74d45202c5e9843ec940e927
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTt9Tz<|Sb<~8Pk
z3(FR`C3WgNnrP%0<0^Pa#`B}}k@^^>b&uzGKVGb6GO3a?*M@0<;pFMtnKOcBDmPSh
z>U&;kRI9#_!Qy#lt!%;3J<J{n(|8sf)I9lGNGsRs!SgK-LRQVlG-oP1Bi3-zD0=^a
ftLn}3-`nKXU1{tSR8G|bx`V;f)z4*}Q$iB}okm0i

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pane_pink.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pane_pink.properties
new file mode 100644
index 00000000..28dff1a9
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pane_pink.properties
@@ -0,0 +1,7 @@
+# Stained glass pink
+matchBlocks=160
+metadata=6
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pink.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pink.properties
new file mode 100644
index 00000000..1bbca386
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/6_glass_pink/glass_pink.properties
@@ -0,0 +1,6 @@
+# Stained glass pink
+matchBlocks=95
+metadata=6
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d0ffb2350c02f7fec45dd4fa7a80fd85a8de9cf
GIT binary patch
literal 138
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`fu1goAr-fhe|&#`zg{AZfhomK
zvF3rc3%{R30HamI&ZeZZM;Ju7IWpa*tDh_t$z0}P_%=sLbb^$%OQzbXfS7xSR?WO&
lu;7IC7VZo$AGVjQ3>&sgJ3e7zW*pFP22WQ%mvv4FO#s;rEzAG_

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f07a5d89458b637168365d6b58391bce5ffb357
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foqU#;K~SJobVZ+T
z0^j9^%`W_xo47)@ZHnYfuCv(V^1&{-Lh;y*U9VJ(LS{z&U_aj&B)(y17GuNAz#EI1
zx{8ZtF+Q1LY2%;#sNvC<#`XFQZ)Pl&n^3~KvLs}Il7jTJH;i2$r)Y%iWcaYC@^NP7
zALbn<i@!~LaA*(Xfy`&2VwVyR*f|I%t#YmI{>(iyE8gkb+?GC|>li#;{an^LB{Ts5
D*7Q->

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..64fffa3eaf5b4106707e2be4b15508fcbaa346f8
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm$cK!L;6dO@)T
z1H0G<pGSOa9<ca@UEb2`$Y}ZJh{XTN4FA0}zb-WE<TYJbx3|4!ff386drS=mkKfH@
zTXF7uD%*zSX$6x+Hzb|&OXY5m*?fyR%<A1NQwGVjPYhQjRNt+d!zht)&;C|Eze0vv
x?nH&8X$%FkBu_b6^4ws4F?&YV#kfZ`%;|a2rQdJ7+Y59UgQu&X%Q~loCIE{tOWyzh

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..b0c0d27aab47ef0e1196beda6cb3517dac179585
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-flPTtLVAb`VF_JXBR
zLo0U#_qi!2Cuy;KJguE`r22|BlTsXe;o(IQ_Y~%@XLxc%=4vWKwv{*Qh7}*gqkI#3
z`NP&O=&g9#=yOEUfqP>agSOwvi&G3FjT!2fw=THsa^@!27Qt!;)3kMUj?4VnmcReQ
Y5S8MueEoX2CC~*7p00i_>zopr0EosvMgRZ+

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..112c6ce93636504a6ea7d1b7ed54c1b0d72f70eb
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-fl25;m&V8HSCz@3ZC
z5)}=SowJJ~twKXx7_^(sb9yFb_I$k4(2!Vru!A8##ZjhWW27--KU@8VGmYYw6=hAL
zDH_agC-^f>o3K{s!;`5(JD2pGb@)-O%R1XC#d7Wej!N+dN<J&NyS5a@U8&R)Z1h*Y
Tueb6r&~^q-S3j3^P6<r_ko-M?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a5d27fdd747a07afc7f57be38ca213f7d8d7700
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$cK!L;6dO>js
z1E0==nMY(J4sy;}vutH&5R2uXBO3oZ<M#%6tzGSx<Q%#p_WlFAfOkxW;kpbQ##*M)
z4uxgsj2mP(w_G+!<J9ouE2?FjkbKQ3;Vnnh>m7}&7>v$5VeBfLx}sz!gMq-k9Z_=c
y8Jg1W*s5^MsAniR#Phec=EuP}2Wy>cSL9@(qMa6f<DCg~8iS{+pUXO@geCx5_erY&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..9479f0e45bd96a6d2a03e9f231c8408d08e4f9ce
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L+m_JXBM
z12cDpS|NK_0h9Xb%v;9-7%l%Ck@z>c#^C9k<00`!+IC&=IKNP4g<s>I?F<TMcC5b4
zaJF*iI)<_{LVlZ=!_FLi`G#HL_?ol>UXRvAGEYcU<G;`o_-Nf}(T2tk`!4RQW^gpl
t>Sht#%+es7_Co*4Vg54aW0@cQ#9w|6mz>AEp#kV922WQ%mvv4FO#t@+OdkLM

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5f2a667ea29ccf5048b37d4957d2a43214c4f21
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-f#PTt9Tz<|S5@<MS6
z1DC!-?-9PpgTfV?c68|+iL?<H`(Ml{k^JWHt_tR9Nrx-vDU~?<m6u!~<gb0sc!G+t
zD_at4TtP^qO7VmhtbRw<N(Q*Tkt|SncE+J8)Ni%diYb{A|5vjr2fNzr72BYEjco?c
j=2Gqu+fC<8XVvWe5cFaFx}&^6w=j6R`njxgN@xNADl<W<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c6b9e171168b1b8a94518abbcc0ec9a8423dbbb
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-f#PCm`cpvd8(dBJKM
z1E0x*nMdSu8oAcw?0s{Lze(np#ABP23KN2|VvSZvO>*V^^(jWH{9%!r7=yU6W_e%3
zqdjwU9Rl_G9wo*fG^n1M%TRVEicPfVi0x;=18p;H9Soy9y`~B`Fg>hY`<GF|<nl}T
rgadmRFK`;0aQ`eipkmZJ>lXJ1k8sI{rfatX-NfMO>gTe~DWM4f<#<LG

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..131366fa645a8baeec031310dc1539b6b6ea7568
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#25;m&V8HSCz@3ZC
z5}z21h3vny#!NUpYvn2p!<2$H4rykit=FC%`tg8Gf^YJ*Vo^ozH~%LxSQqubDr1^f
zBBqiM_>jFzCSnu2vvP)$-L1xu6V{BZDQ8)D=4^7;TbX1mQ0MRMxSVU}d$$L|o5UZa
n%yf^Okaa?%!?^34{yF}@@bDEAm%I@Kx`)Bj)z4*}Q$iB}Qlmtq

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..e4ffc2f1ce68f5be57359a470daebc8d9ee28be4
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-ggPTnhcK!KxGc7ml$
zLlf(ooyF{71x)JQu9H4@bS$Y5JN5g?4^M^*?VtR=n)H=P#Iyz6f6uVu%$Bar3|D{d
zJi}0UM(Uguv*DSWC*Lq99M8Gt(9^X$jr)MKadpG4Ox3lU<}iwA+`D}%ozEacEqj7N
u(lv&XF3DT1MY|@xjC-EuG3873euna=;VYg_`sfUF6@#a%pUXO@geCw)+)ye2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..14cc29c4bbcfb6e31c7e3c567f759e5dbd5715ea
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-ggPCm(dK!JxPR-tqW
zgZ&+be3hyNtXc~;$pk4S)f}l@({jK%g1c?XC5tV8uQWIm+O_1Yk7h_o6Uqv4D9t-3
zwt%a3^QkR)2{ZPd6LTm$6U4^bbHsKtmqy#piiRv3RnFLb3?dxw>u#|(I2vdEXJCHD
t+Tb^1VdM#U_BTv(9^Vl)Rjacrn|vyK#qT^Z2cWAMJYD@<);T3K0RUVmMi>A9

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..3b41dac02e94235dac57b0db8884bb01a54696e9
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-ggPTt9Tz<|S5@<MS6
z1DC!-?-9O8Md6A~J31C|6fXPGd$vA?>6k?J>mMswdlPOs{gq=3n7Lf^Iit!+A3=vT
z2l_2mIZU$jxWc6V>>AICq;Cu|Gc1`sHk`@~<(z87`(byKfl=t0%h`<9X}kwgW~_}~
m@M_}0;&am%2YdcsFP(TU`1YDpkKKW;VeoYIb6Mw<&;$VO`bS~_

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..58a5125b376f15b2059b0d8727d848ff68a4d016
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhKYaXX$#Nt!<&iUw
zibfvWBPElKx<7a{oG!<-x$^oks|jq_DLJ1}c!P$^vArH|j`CEP2p37VG45qCN#<?_
za-HT(NSnj<<<Z4E-X|J3D;90y>DCV9(NI?WkPygizM#Y9Z0e3nj)I)C40$w^1ZJo_
kZB0`$mbk&twaJ)4Y*+A#Gj9zS0iDC(>FVdQ&MBb@0NG(cU;qFB

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1a40304f597791b6137630fb642d1a416b14d7c
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtFTz=5Mx_JXBR
zLo0U#_qmeEs+mp}f1Ywlf2@5a%qY0NIl@3=ntI0hbcS0;-duHM(6;hsGg$vYe3oxQ
zEB~~$3tB6lG?p9@bP(Pc#^CLD^4^pSl9w6lm$NPpc0Y5G%S7-!gVq_DzfC3c->|Nk
bT)vO7Ai%#qkfrey&=Cxtu6{1-oD!M<DLX)8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..736d80c3c675e5d36c53ee48adc7d4396c3f23a1
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTtLXz<|R=a)PB1
zL#y}#w<I<HG;LRr$ePKIq`Ir0EoOF^6Mfy?H$&vJ*xdJm4Sb(Bys~LfvoB@|Sp7k@
z)9OMBzf`Y6=gzIn>t@(Cu%w-2keX8z5$m+nm-){ev7Y%_&mQ(V$bRNrkTP?vPJwC4
e2jx@cbHvXb_OEYzpk@Jd2ZN`ppUXO@geCw`zChUk

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2b0aa838c87daf418da8e755a36e837f2af59b3
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|S5a)PB1
zL#y}#w<I<HG;LRr$T^-LrH|CdFbNdq#mbv5oOmX><d`yp?6btDl?=XG#Vi5ZA5}Z8
zE~M~F^(u7k+{(OehHV2&+DQhfIYkk%PD_26|I88V@e=*~!EHg`PnLj9XRhfNd_DQ#
cxc2?1bLsxd9;OyrKvyt$y85}Sb4q9e0Q>bm0ssI2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..87549c4e80909cadaf6934dd280e66ebdccb9439
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fl25;m&V8HR%;oS>H
zp2`Nv&e=tg#-X7u4BMN{b9yFr&U}98t0)W4>m~)JO%vH49q2wgi?hPyM^h@_o)ZT*
z3$Iadmdt3c5!%p_Gqpi|z05@KS2uWC=3fumu+mv>xiE|3d#0ck&QiyTX8%@w=51~9
VS9ZR&ycTFZgQu&X%Q~loCIC{rKe7M-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..f37a2c8cec8bcbb91cedda4575d4bbd1195263a5
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PCm<dK!K;#ctLSV
zgUqIe=MC07nuIMPmtIIRwSV@(<;ZtQA^9a!eg(`9;oa&gd#p%Si~nKKH5~@MG@*AZ
z8XoPLqw653ckWSU{6T~2sksbgXM*^(BxJvz(Q4o|u5L)`nbe|H&%kB!UiK~ffdw<S
w)Hg7GW^-6RbD_?Y!wt3#dPhRKzllAUZVrwv{kHBxG0<TQp00i_>zopr0JiH)DgXcg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..09c3d65b530a7314be617aa9dfae85b22c47a128
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-flPCm<fK!L+e_JXAq
z1H0G<pGSOa9<ca@T|VNX*|mkeCvczoC*h=?tvA13%*yb#Eb%+*FlVYPLyLsyd{qT$
z{pErO+9D2R-q_5NqRjuPj%kA8wW0&J#J5~1WDI58A~>1##O$C&LQh#7+&@)i?)=VZ
uadbzPN<l|FgTbVivsz0m68Ilnx45r!F}&2EqInh2Sqz@8elF{r5}E)xPe|ne

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa44bdb8eaf0568094e70bb074dec16b56f686ed
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhKYaXX$#Nv~NfMjF
z##WD`XB}c(x)@zEW}WsZJjlXiX09x~VMaq*$>HjYu^S}XpP4Y}9X41ny&-K*;sy!#
z4&f_3ryJsIW>s@a8Zi2YOiL_Q-Ncxx!XjsrmH2W&hs)X29YR5ZnzJtQYA6ZJP<h&#
g7F49{dQ*~N_Uxb!*Z4ebfi7Y2boFyt=akR{0Fk;t0ssI2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..542b9f92efd5a5f4e4faef1365009f881e2017d4
GIT binary patch
literal 169
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`1)eUBAr-f_PTt6Sz=4BVa)PB1
z11oocvf-!YU5mu|BLca~=NKw<%v`UpwBSY_XOe>S8jq$7tLRjL$cNr>svT+kfxQoS
zdEOpS`*89A_YLc24ZoF<UbBw)^vu5;bSabRbta4BgS!s1Ql0iE)Yl}hV*Rb<m(BO5
R&j4sQgQu&X%Q~loCIG9mIxheK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b157bd48b79d3458d6f63d9b5fb63142fe47902
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-fhKYaY?xtKvdNx`wu
zSU`MXXYRpt2f<m-jC8UJqzoDx&Yu0jGo!&((deCPl78BO#WN?IHsE=ox<E2oLMQEj
z@S_%!$0iHJ`=7-*vH2Vjo|+mF)0yNT$=S%>9kqkeRV7RB@KnAoj|)AC4uXvbR5bNX
igl8VyW)LuIE@MwZ&<EaZlW#z`FnGH9xvX<aXaWGSazK;-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d485e9ffe62b4263edbefa2302a448d7a0f013e
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-flPCm$cK!L+m_JXBM
z12cDpS|NM*3l_gH{al`|_*=|!JnuanoO(8X^^jlOS{KuPawq%C-*X#8&aAfa4mfbS
zQY3^Sd*=(TRgCHZH&p}}X4|fCJFb|+nZnF1H07*DW$06l1ozMPF53NXm}3wv-)XZ!
mOdw-fw)m%)Zf)~l&&m6h73_1yP}>aX9tKZWKbLh*2~7YvJVTcN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b5d8ec4217101955085fc177d21a322182f5123
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-f#PTt9Tz<|S5@<MS6
z1DC!-?-9PpgTfV?c68|+iL?<H`(Ml{k^JWHt_tR9Nrx-vDU~?<m6u!~<gb0sc!G+t
zD_at4TtP^qO7VmhtbRw<N(Q*Tkt|SncE+J8)Ni%diYb{A|5vjr2fNzr72BYEjco?c
j=2Gqu+fC<8qu%iE^9lB82wt-W=oki1S3j3^P6<r_Q3ODs

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0fe8a15f1f5c124a0294ccd4a898e2bcde8f74d
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhKYaXX$#Nv~NfMjF
z##WD`XB}c(x)@zEW}WsZJjlXiX09x~VMaq*$>HjYu^S}XpP4Y}9X41ny&-K*;sy!#
z4&f_3ryJsIW>s@a8Zi2YOiL_Q-Ncxx!XjsrmH2W&hs)X29YR5ZnzJtQYA6ZJP<h&#
h7F49Hdh@3M!|d<DKA}C2p8=i1;OXk;vd$@?2>|LbLCgRE

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..92091b882bb464317bf8f4528ecef7b42a12e159
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtGQpvciGdBIYq
z;SlQz&l?9t=NveB?op8;3*-79Iy~<`iZ7UAB%Zw3n&)WC*DESp9R9wSTp(nw{Vqkp
zG3^u25w1H4>zO#8Da3KhbgWNvko<VELDtZn?a`V|k)ck@d=CGJ)|HrP^r$S0G5^Rd
nhUUb$yG*J5Jok#%)mJiHz7y=TM96j?&^-*Eu6{1-oD!M<-quFc

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d822a4f6480c3a9b602bfc43a390f38eb48b23f
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L+m_JXBM
z12cDpSs{B^0h8M5%v;9-7%l%Ck@z>c#^C9k$}AlvXXlQ~#Tx9Zf)(EDGH@8bdu8HK
z9=A@rL1uG{`AtU6XOBw0F`FD;ljh*{Xk8?;$>BRT4(4v1yY<2u*be=6`~8lQ<?ISw
tA(t~k41O~f?hoL%zrp+9@}u4#Ot1XIOPSO+{sy{=!PC{xWt~$(696`jM^OL(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..5172ef318eefb7fe198418e79d9f4e9bc1083847
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-f_PTt7d5WwLgIl)q<
zp^0^c=Zuplw-`NZ=a1<*TDs?PgTtAc8bQXRW!?hJkqNFsE|+g=HJ{*$|D@$;Qr(fo
zlAn;lZq``N7I)yDq)VaK*`P}*X-R+POq=8<98s>!!L*+3l8*2%*58k%jpvI0Zu2`n
Tt7u~b&~^q-S3j3^P6<r_O1M12

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..a281ced0ec08b89302c4a1c5d4de25b373d19cba
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr-fl25;m&V8HR%;oS>H
z9-9L_M|}6LnY&6$sbT6tX|rP|j-0v9$sw^#youw4Q`iwlli6#9I&wa+ua|L|>>Q$A
z;oN4lfwNNm0qafcMvb_YGrecs@M+n9J!n&=)3v*tO%uWyGY_@wO7M_=KiSG&P}T4F
U(IxqDK+73CUHx3vIVCg!00ap?CIA2c

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..62a50e3aabe119118fb6ae05acd19add1fcb63cb
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-f_PTt6Sz<`5Aa)PB1
zL#y}#w<I-xvGBl@#0SbtfAm$$2^=|7{PLF;Q&*{{0Q1cUjVd1&ZBAp86Wx~*$)x}7
z!A*{^0~h$VFwf`FX<Tdc;mH(bFVDF%8b20Caaol<D3o#(s4$<9H1mS~3;FvJnfLO)
W_$$BW`1THHKZB>MpUXO@geCy45<f-&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fc8b0589cda96791ccfef272b2cac4841f87245
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTtFTz=5Mx_JXBR
zLo0U#_qmeEs+mp}f1Ywlf2@5a%qY0NIl@3=ntI0hbcS0;-duHM(6;hsGg$vYe3oxQ
zEB~~$3tB6lG?p9@bP(Pc#^CLD^4^pSl9w6lm$NPpc0Y5G%S7-!gVq_DzfC3c->|Nk
cJbfQy{uh7cXGI<5Ku0imy85}Sb4q9e06qjkfdBvi

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..a40bbcd31de0445db35fac0306a30957225b99dc
GIT binary patch
literal 201
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FglULn>~~oqUk@fC7iB>;+3J
z26nLzIgj|(JYew&yL`n(v+K);UcrCDfzCY>XRn+8=t5i7j5)I$)?AfkXpx*cM|FXO
z^>RUnw#Y-D4b(X`+~iYgm{Ja}`P#5WIb-Q#rd3Rzj?K|^xEZ6W73#-OVzNG7_iH(W
zpYb|5A&WEe3=(Hc{<fC<I4H-kU%*#I<#7%3%7@XV|0nJ41G<gD)78&qol`;+07^|u
AnE(I)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b337fbd3cb41f84bca07beca3e236b0c4ae240c
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtLXK!L|aa)PDA
zfmZPa+m7(XDGD1zYE0s=oY5UD!+YoP6aQ0|-xq!g&y+cS{CH`H5`$4%pGwAq=T^)j
zGjwBem`cyEs#G(w%(yGHBDgT)8^b0;Zl*21+Lcp_*a{X@_-DVjT(Dr~UdKfpH<>s@
njJI%`ZtDHpv}TFhw|(;^#ln3YZLK_j?qTqB^>bP0l+XkKg(pJN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..82fcfc38718d083240ba2f6a50eb3950322646a4
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PCm$cK!L+m@`9xm
z1H0IVoJV}?9<ca?U0%}b%3@iQ-1Fblj!9Eh?$zX33-yi|OnV(r$#FDtJA=lVC3kKz
zt@>QFjUjZW#cH45Y;8AJ=P-&KUz2*_fX5x<e8!^&;`{-<VUvQM@;fwsxOc6NfoE3c
tcYcF}IEEK3lCxTCEE4z|n1wZunzK2Fm%5)}Jq2_XgQu&X%Q~loCIAy#M*#o;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..278e7eb9a15d76b41005c14583c0fcd77db968c6
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-fl25;m&V8HSCz@3ZC
z5}z21h3ucS#!WaqYvn3|#t2!P#$LmwsO;<V0vB|+dpI^Immg^qovbRnVZ}%0voaAA
zn^Uzj9NUa02!HZ(5Z)BVG;Pi%cfFTK(iHy8o7Uv1{$yWtqu?g-2TDFK#94kG+gXrr
cAX8Io*Eca(xy&hHBhVELp00i_>zopr0KV}-H2?qr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..b6f30cc4af9619a2585f38e1282f9c770c211dff
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhKYaY?xtKvdNx`wu
zSU`MXXYRpt2f<m-jC8UJqzoDx&Yu0jGo!&((deCPl78BO#WN?IHsE=ox<E2oLMQEj
z@S_%!$0iHJ`=7-*vH2Vjo|+mF)0yNT$=S%>9kqkeRV7RB@KnAoj|)AC4uXvbR5bNX
qgl8T+z$U|FSn%LzhD7W?0S5W(aGwWJ`Gr6?F?hQAxvX<aXaWGadqTPZ

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0ca09d765dbdb6b9df7c14cd6050255622c50bc
GIT binary patch
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`wVp1HAr-gg25;m&V8HSCz@3ZC
z5}z21h3vny#!WaqOE0vQ<A|(HW3ORTRCe;CAKXl{Qkw)B%bxUEY)IOa!X#!|w_ql-
zcF~3$R^1Z;Y@3|pI5V8Cc^#M({OyG5+Z#MB_b&$-WVYW4*EVqa#uU@S`L{{o{*OJM
gw;p);;PqoRrvJh9#udV;K!-4Ry85}Sb4q9e0N7qdp#T5?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..7396d2c3a8ecb2b5842facb78bb8ef44107aa84a
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhKYaY?xtKvdNx`wu
zSU`MXXYRpt2f<m-jC8UJqzoDx&Yu0jGo!&((deCPl78BO#WN?IHsE=ox<E2oLMQEj
z@S_%!$0iHJ`=7-*vH2Vjo|+mF)0yNT$=S%>9kqkeRV7RB@KnAoj|)AC4uXvbR5bNX
kgl8T+z$UXu#hRI6kx#IX{+r5KK-VyMy85}Sb4q9e02a_c`2YX_

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..7958f254d49c2502c4f38e980a48906993c9fae9
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-flPTt9Tz<|S5@<MS6
z1DC!-?-9O8Md6A~7QP~ieoKG!o~@5zIwo<PUpIs0ve>Kd91W*z)>`l@c&2qRB(c^V
z31ppg#&MCDh2i!z2hq*!4-TA>bZ83oTkW-CN@m0Tt4$MECe4fEzG0ZnpmsRtE>md#
k8^$$jPhVWQ<o|Wvw+X@ZUvut02Reqq)78&qol`;+0FXaLX8-^I

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..8dcc4de82984dae3212f0b5bca42370ba7bad849
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhKYaXX$#Nt!<&iUw
zibfvWBPElKx<7a{oG!<-x$^oks|jq_DLJ1}c!P$^vArH|j`CEP2p37VG45qCN#<?_
za-HT(NSnj<<<Z4E-X|J3D;90y>DCV9(NI?WkPygizM#Y9Z0e3nj)I)C40$w^1ZJo_
nZB0`$z9GiOwaLiBnwf#&T(Hjt!DcI<ix@mz{an^LB{Ts5aUwqu

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5f7d160f7f0117bb0ebce31085896a9af4a884e
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-flPTtLXz<|R=a)PA|
z11oocvf*TP?^PO`ew<?EeI!@F;c%o>P@3)NC$_mic^ukj?A^tY;F^At;hE?^r_G#e
zJ{;U6x<#PhW<s9@Q-;ztu7s1CH)ji3C0jjszvV&6s}9SkMzu%64y`j6$4_`S`QTIQ
a_3Tj`e#b?<+(Lm)VDNPHb6Mw<&;$StxjzR0

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..82acb63ac20a144bfa5c3504dcd3dcedbd114a81
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-f_PTt6Sz<`5Aa)PB1
zL#y}#w<I-xvGBl@#0SbtfAm$$2^=|7{PLF;Q&*{{0Q1cUjVd1&ZBAp86Wx~*$)x}7
z!A*{^0~h$VFwf`FX<Tdc;mH(bFVDF%8b20Caaol<D3o#(s4$<9H1mS~3;FvJuh{Zu
W_#HQuXiNdx&*16m=d#Wzp$Pz!mOYUG

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6bfce6c67929f60663244e773ee29d22d88b696
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTt9Tz=4BBbAnY2
z10%11a^U6AXWcrlk7TpYRw(<yqVVX}F1xIQ3X$7h^rSOboq6-rl|fs}o6SJ~qv~0!
z4N3gddKa`-Zee~oL%BgMZ7svJIg|G4Exf#pxz3N<Z)xAm#ex}0c8no9#b3BD)f)Zy
bea`&JdjH$ce42g(-N4}K>gTe~DWM4f(qKX8

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccb1f6ac002fae881d241501a2622f0efdd8b8ed
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhKYaXX$#Nt!<&iUw
zLlXDIuGx({IAUeyGrDHXI=x}#;nV{xOlIcF(i>(pq?H`5z8JefqWzf(lip#21=AbS
z<|J;AaPJVl(sQ~Y&Sq9Mr=$U+f5^1NV%1HIsVXdTHd%=;7j(FsP2C|BB&a#-BCm#$
nzzmhAt!YWcD$Gl7N;3R97QDj!{<Jutdl)=j{an^LB{Ts5Mq@*w

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf67595fdb4b857d66757822c75740a1b4932482
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtGQpvciGdBIYq
z;SlQz&l?9t=NveB?op8;3*-79Iy~<`iZ7UAB%Zw3n&)WC*DESp9R9wSTp(nw{Vqkp
zG3^u25w1H4>zO#8Da3KhbgWNvko<VELDtZn?a`V|k)ck@d=CGJ)|HrP^r$S0G5^Rd
nhUUb$yG*J5Jok#%+0W#^ViCOJLD(XY;}|?${an^LB{Ts5-62NP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..01acf189681b87978da0741de4961d911baf7e68
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HR%;oS>H
zp2`Nv&e=tg#-X7u4BMN{b9yFr&U}98t0)W4>m~)JO%vH49q2wgi?hPyM^h@_o)ZT*
z3$Iadmdt3c5!%p_Gqpi|z05@KS2uWC=3fumu+mv>xiE|3d#0ck&QiyTX8%@x-ox1X
Xz`wrb!JRKa`x!i4{an^LB{Ts5wVOf>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..d237ab94b254b69bbdda66b3129d5aa04f61235c
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|S5@<MS1
z1DDtWw<I-xvGBkagZAJ*Y#-&PHy9qfHEVj*1&?RCTRw6$9P^30$GN~WwU6PIYMn|T
z`>Z#Piv?8-x0f9d{miM*7-`hNwp?Ys_lhkq8}46j3SODC>@vp<!)OMz(>Z^c!sqkU
c?fYEA@Fdv3{-mL0D9{xQp00i_>zopr0EhuW#sB~S

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_gray.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_gray.properties
new file mode 100644
index 00000000..5284f514
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_gray.properties
@@ -0,0 +1,6 @@
+# Stained glass gray
+matchBlocks=95
+metadata=7
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_pane_gray.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_pane_gray.properties
new file mode 100644
index 00000000..1743e877
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/7_glass_gray/glass_pane_gray.properties
@@ -0,0 +1,7 @@
+# Stained glass gray
+matchBlocks=160
+metadata=7
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9bf0fb11fd40178a2b2c562e0b300e34cfdc1c7
GIT binary patch
literal 127
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Zk{fVAr-fhe|&#`zn(3skvZPe
zMCPWcNT%A&(iW4&rzbzL>M{vlGNa6FBA13&#tswVR1LlS#H&6z5&=(SZ?T%Fsx^OM
ZV(5PxU!b+`Wi!x322WQ%mvv4FO#noeDc=A9

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..846166468dcabf95cf883c0cd466de9c53b3f149
GIT binary patch
literal 202
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6FprVLn>}fo$SlUAjs1?w~X(C
ztA2v+#;xx}=Nvfcrl!2`*WpL1P2X33a?)H{det*!h0)dz{PUQP>LnCkWnwU1yuqC{
z<@pl}<`ag+6|;^VVZ8a0IX<4@q@lO1!b`58mn$4x9gNPLWKMak8MvZ|@qz2-W0x=e
zU@ypYd#ik~wUW8v@|o2-M-DgCHmDs5>Ha46Ts)z~EpTc}<9VRt7(8A5T-G@yGywpX
C8c?(V

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..12a88d0da1296b5fa2c0d0210b68bbfab342fc12
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PCm$cK!L;6dM$H7
z0^@m=INQxl!WNOfm(AE%pL`Hb{^QT|XZ5vP?YC6SuC)C6DtD>zlfa2;ZiYiWyUV2(
zSlB<8JkS?;$TRFfm!;)YU527FS^N<%cVu5<NSSexStNPNj@3nM2@5L!XY99aSRlF8
vwW%YL=|E<h2KP^c1pWp2Nvm9|J3sU4RXDX|B<%eHbQgoCtDnm{r-UW|indF&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2c2673e23d5ec7e8210947cc60651df1f906bf1
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-flPTtLVAb`Vlt{HR0
zj)tuXudQb4taK9CzvqzK9{0UUGj5g&nCo=?<o)uKtHIAFFqZAYGUITDUaoq@t1P#E
zEV#;bsUuwOgUcMoB?8{;7amO!@#UOs$o!!^io?qH$dt7W(i_<mlApa2ulSWx@ar7E
XVxF0iDXX+U&;bmdu6{1-oD!M<w`o4D

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..076bdbedf1e17c5b2f0dd387679d3b36c203ce04
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-fl25;m&V8HSCmfV2@
z%x65-?3sM}(#lmzOdE|V4j+@4sq|<kBje#;O@fSZCz>oiq-_pkn#cPuVJdTe(T7(o
z*(U<ns+{g|MmTQsJJ22O^=y(~j@qI7*_t;?oTlC7?3obGn0KgU*8&ge<F0d$v)rgL
VGny*)SqEr4gQu&X%Q~loCIA^&LH7Uv

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1ce496d5df99f7f20e1e0105ae3e2d9f9c3bd4a
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PCm$cK!L;6I+y*y
z0j7DLd#ch{)eAPwTBhbD_~e7|;y>zjU$vHQS!dPB8@jNpw)wZiO70^uTNxD2thkcH
zc=M*^S%$JRLVlNLs47@np7_e@&=+~SVXJb++Q)3Gm`)f>W<PN(bkU`!Oa~k)9%ohV
zVdj`s_<e#x!av3XoW@_oFFj<hW_-ILBDk92ai~+^n|8L%K&LTyy85}Sb4q9e0QNyn
AumAu6

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab39de70bc32a007d2b438ba2676d6adc310fe3a
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-f#PCm$cK!L+`?lne>
z4Grl+>*qxt<eal+S*Elz>yr<{$v^x*9lR1H9b79Y{mMz%w!LP75$mUWObrH)*ZDDr
zJb${0>4u@V#Yw&h!}R5w<r`!+&tlZ>+?~ej&^FV?!PKpDw_Z2{+o9iXzuz&koL!+S
s<Z?!c!EeUG{Q-RTH+UtMAGMC%@Yhbm|7*ZYpqm&xUHx3vIVCg!0J(ZcEdT%j

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..23231db62e8d2a41114958e9dc711ea07369caf7
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-f#PTt9Tz<|SbrWtcU
z1!I;<)T=cQIBg<hT*VH_94$`#Xg{4HG<J672R5I>O@D1%Gn&8I8#yS;#oamUFzJkl
zWQTagfk4(tXB-!aSqN@Va}fP_wt?9&olR&>QAMcJQlH~L;&m-%YCS5<X0%SqZa8TW
iz1`ue^6Qwzr`cP6S^j7Hb?rFNEexKnelF{r5}E*|8$-AN

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..5034a66117b2e13da3938b24eed14344b9ee13eb
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-f#PTtGQpvciW^BdcO
z1jcNk=<M(WCUxuCyMHt*95p`n!|tT>f+?4Fr39F&bW44Cx-;a}p{G7N40>rn?_?Nn
zR$4|jtcj61dU#(`;y10^3~y#^<<XMptbV54z-wIHkh5jd6fJcI)<eIeelr_nEW2!f
qprMj^fpA)e*rlfpo+(nMTgA5r*=d{#6ub#^5`(9!pUXO@geCyVQb+^<

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc9e60e1f2d1a714eaebfb8ad6f442c0272bc995
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#25;m&V8HSCmfV2}
z>@y}t7=Le#nQ(g6%2gVMDFtmD(#%F*?>#^C;{lrl-{fn>qKe#a{!e7EF6w?&#x$)&
zOeG=kA$ylh#3puU<qRjgTa6(ntQlET&a&{#+2pFXGRat=&fnW{IoHm&ZV!Yvi9bl0
m=^i;D>x4#!ao0EfbNmvCcH8p;uWkc6hr!d;&t;ucLK6U8R7A@F

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..c885d28af1cfa45b1ae7d111a043efcb56a04487
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-ggPTnhcK!Kxm?lne@
zhy$~%qqD*anAE#nCw=bdSW+Q&>i3f$o@ef~fAaro(pM%C)8=shJ;Q=CJGwSAT>ZK8
z3`5}=DL*S_!!tKezF}54o^#Eir)zf_w}Z5CWy7va)peWZFiL3LyL~I2Pa(rCdxApJ
tHHLyN$y=>OyC%Mjd!FVo<xBN`2D|rm+dFx076To{;OXk;vd$@?2>@A{PY?hA

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..7db45f01e8bd697f9c20423f4939d9c332b6793c
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-ggPTtLXK!L|)rWx~&
z4@_64Wvq;B<eZ@+uPJEw?}(<K(}U^=cE7FH3NwDMoXB+ar@)52d5jG+16Kqx9^Gjf
z-Jm3LZc*mlNr~UAq8XmdSjrP+B=r4^Rs)Z5WkZsUDp%}21__S$b+_0V9F4R7GcY}4
sW$>G^F!F>v`x~Y?kMD?@s@2(*MP0GmzQU|959lZcPgg&ebxsLQ0KB_K4gdfE

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..fefa27ceea320e34bef84e8f8ebdb1d3593b3f1a
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-ggPTt9Tz<|SbrWtcU
z1!I;<)b&V3;fhT=Iu>yhF8k4YwmydG*_`axKUT8#CfsuRE5{fxvt9H#qsmDiL5DR5
z`Yl#DOtSR2!leG}8qbQPZwxXsESWtvoJtJkoNC1TVRw{)QRtb&*^Jg{ya!Tdtc_mq
lYU07-bJG_Gd;VW9t#QNZRfTr-FQ8)>JYD@<);T3K0RZJvM$P~L

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..875306d98fb7b25f6a8a6150d85436929b3ccede
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhXIK_LQ&jL%7M4#^
za4a+y5MS7tdobNWaMm*;ovZ>WgT{ulXMga_XmC|Ddgq#?pLSsJ%n7FrcwVS3kc^hl
zNjo6?sKw;5$pZ2IXK_w!J_m%SrbfhcCOJrQHnMj|?O=3O$<jMKm9NX=LQkTDVB-N5
lO??yLnFkNB1x%UCcz3JS_BuiD0HAXiJYD@<);T3K0RUi+KYsuK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba8e1ce2807643829937f8a547a0d84e08a4b6ce
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5N6t{HR0
zj)tuXudU1@C#kg@j$gMy@cwc;!832HI#`>N>X^RQupRLAiHl{qu*f)_;VW0Y;!T#Q
z9}8}B1$DT~6}ZbVst9_sUU)L)i7)3|L)j1IQ3Y0|M?}^(2!G@|aOliM{etf&;|^F=
aK9@F+GV7aFwlfmw1_n=8KbLh*2~7Y{zd=s`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..c244eee2d6ab9c0985fc43b49150f4d881015084
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPTtLXz<|SLrWtd<
z1_o21wbwtUYzuM`JXAC3kyLl}v&GGZ$L{R1%W_&gWBY}D?hGbrpI-Sf_|`q+SP=Kn
zTc~uwNjVcKN1@_u_87zY3_>$hnKKH!KJ9Apn$7paQrE&h^h}8qqjehhfs~nRbqY*V
eJ}93mpCdl?tXW@TlYbJ>9SokXelF{r5}E*6Y(W+P

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..5789108c0d135597451e2a9347c467864187ff63
GIT binary patch
literal 179
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar-flPTt9Tz<|SbrWtd<
z1_o21wbwtUYzuM`JS5}!QTj-I4AU`*;@7`caQ3F$bCT|7$T;)l>0E|cA<sA##69vB
zDqV0=&P2*ls5qNF#&AA^&<s`Pi~_GuyIQ<v^Zl^YwV0}vX4TsuyO}j%)0u1f1z%4-
dIIev^YHFdGk#73MLZB-cJYD@<);T3K0RVy;K@9)^

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..13cd6f99bfcfb38c9aab15019582e21045b83969
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-fl25;m&V8HSCmfV2@
z%x65-?3sLe*2+~%Ooi4JhmT3jR7&!RiFZ7(!OuYH0C%JS`@NiNUI#WG6kk*Hz?Uy>
zZUV35DF^=(){NRGu5ng;^g0=Hsq?JMk4jzD*?uQBSvLxP(mLQfBS2gv^YMDC`#ybU
VMtelJZw1=U;OXk;vd$@?2>^X8K!yMS

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f22722345cf05f7eb341774427ce05660880600
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PTtLXK!L}_HkYm7
zA?pg=i$R;2gbgACmbkF|Ie1jDWk-8zae&uL=iDIED`KS*r%P9uw49FI%&=pI=Z?ip
zn?4t9Vu;*f(Y?Hu_3)d}ZHzYzy=_+{l-x01&0u!s4dW(5FQHX`7&R{JDc>T`(42PZ
wA0yitX@<FJZJQ?WF@Iy&B@nE8D|$}8SFBUZxB9PsKzA{Cy85}Sb4q9e0Q9;_IsgCw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9f64d6ce63720c5146835467bab55d94cdbf0e8
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-flPCm<fK!L+;?l$Iv
z1jh3!akiVAge@X{g@u=DT#_?z`#JA~{|U?MY1iFXFVuZ{!P1PmFszJ0ASt9~T0_bn
z8FvQhB+liD=Y=Np*qr#y>ChH&nlU^6g41!<5Y`KBK4J>FUY%Z3gc)Q{zFzwD9{U54
u$EzkDP^@D-;IS-Q?9syp+lKhZHO!yS*tKXn3#tK~#o+1c=d#Wzp$PzqRz|V_

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab006a367b611505583169fd4e39fd29994134c6
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhXIK_LQ&jL%7B^<-
z)OFFyV|%0&#G~PKImWGvTTNiYPRW}MM_Ei3OW*5$*L2jvWVv90WE<mN7L&(3%||Vq
z<}65yVf*sv;vMf34V)E=Hu22Xp2(}AtoY$UAh$QWt4fyM;i(h4JTCU+IS4i$P|?&k
gnLJ5a^VB(pq@|Ys>--zEfG%P1boFyt=akR{00QVfWdHyG

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..08dd059f06af32147e488b3376064dc0e892043a
GIT binary patch
literal 168
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar-f_PTt6Sz=4B#rWtd<
z1_o0h-P?7mG^#!}h%PNSF3H@a^yrroQ`c89Wwt#Bn^Zn5+Z@I=Pjp{OC{zBo2Uj_+
z9k{?(!Ze>}O~YE_509oyTDrvZ%#k0Kx~g;4Hq3ELV7bS;BU0@P_pjsT%c2gMm{y&N
S=KBh?n!(f6&t;ucLK6Tb9X}!f

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..78ccad09742a48f6cabbf1b48b9cd7746c751573
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhXIK`eNwNMAVCL+a
z-ME9pH;3Dfx$A<-^u)mC%MF|?IeEv@53uNPO)S(Gsy1YnJKGY|mgu0*c=pDj1ViR|
z0_sa7mox6IF!?TIl)yA^h0fteULwq=JUDD3t{mdkPzo%TTvrm{(v-%-+{MA7=2^LL
i<_Vr{t&Nx7@Gt~tS^n23pQ#3P41=eupUXO@geCy+lsp^&

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..4606e7a569af51049c6b536684e49353b8eff26e
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-flPTnYZK!L+`?lne@
zhy$~%qqD<Lu=t71eqtlCUxign?)}NemLRX!g7$9Qe|PXr4(7k~-I`HzMtJ2kh34s(
zHC8ZOE4nBe!rZrDlcxfMS#>~fpYsi&6KrBCCuRqJT6HS$K;N^yi);TeS|)C@6RJ$m
mRk+}DU2n<dULO1FmiG>pSVcF@atH-Fhr!d;&t;ucLK6VKOGPdK

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..a6f7531a468251cdd65f07a383aef384ea3408c4
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-f#PTt9Tz<|SbrWtcU
z1!I;<)T=cQIBg<hT*VH_94$`#Xg{4HG<J672R5I>O@D1%Gn&8I8#yS;#oamUFzJkl
zWQTagfk4(tXB-!aSqN@Va}fP_wt?9&olR&>QAMcJQlH~L;&m-%YCS5<X0%SqZa8TW
jz1`ue^6Qwz$A2-jhFL`)*ImpBbPR*1tDnm{r-UW|(p^Gj

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..bce4bcbb675c73c629f0b8f43057403686630c83
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhXIK_LQ&jL%7B^<-
z)OFFyV|%0&#G~PKImWGvTTNiYPRW}MM_Ei3OW*5$*L2jvWVv90WE<mN7L&(3%||Vq
z<}65yVf*sv;vMf34V)E=Hu22Xp2(}AtoY$UAh$QWt4fyM;i(h4JTCU+IS4i$P|?&k
hnLJ5a^W?d9hGa&o=#bO{AAn9_@O1TaS?83{1OPk<K9~Ri

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f3b0ec30e066e8cc453246fc9d2c32e6fac532c
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTtGQpvciW^BSW@
zOv9{}Yqvz_95{LIQIR1F<N6;uJnuh>FW71(p1jza=V;5<DJokW{=S!7AQZ0sE=9pH
z?Gw)tt~&|qnK+**#Bs}XtWR^0{CKiK*3g~p(V9(Bp-#(u4*!VOm6&Pts49yw|Hv(d
m=ES(WOsV}m_louED;Z`zvx@$5FmEZ)ISihzelF{r5}E+;@<)yU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..b93f9cd8724ba5d75bfe2803c8a4204efa71e277
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L+`?lne>
z4Grl+>*qxt<eaf)S*Elz>z5D0$v^x*9lR1Xd7)jWY^kc}dByw{JdOLlGb}i>W7TE`
z(~6yE82HXe`R!shJ7f9c4f}!vIcW#n9xc4dG$DBzN5I^`N2^XtHn2aeU0nN}f$waF
uuF#wrrVLF6{r{Y9{z))*DC-uV#Jw@nu4Uye$vmK=7(8A5T-G@yGywo`B1`=M

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..662e20066b5d69fdafd533cc5379bded4f459d34
GIT binary patch
literal 171
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`MV>B>Ar-f_PTt6QAb`VVt{HR0
zj)tuXudQb4taSSE<ErwK9p}pDb%_Wb7Z(gzvt7dQ0jrowqxsyeMjzIEP+culv6+3n
z+Xl9_vIW8w=?Sbka~s8%Ptj5JO;S5{K2!6hNn@%xlk$hG180pE#$T}CXLz}i@z4a*
VYg6k4`+&AHc)I$ztaD0e0su7jKUn|(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..8fe077a5ec02325c59ee405ec385b3bcdf522137
GIT binary patch
literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`g`O^sAr-fl25;m&V8HSCmfV2@
z%x65-?74jU*2+~%Oc9cM5|ev;1PkXjG$hs@>|oGOag?dp9I4HCo~?evsYY|liqa<2
z6b<IN6Uv#wCae|y@M!9!ol82;y8NitRh_Mta&zthj!Mx7YCbEtyS99^Tlty!hJxue
TzBX+Qpydpnu6{1-oD!M<CG0<1

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..007d225c7ae148182ab665b950ef98589487dc18
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-f_PTt6Sz<`5grWtcU
z1!I;<)U}T(g`%!vY<59i?{_?BbbMzwecgJc1rgIE3?J~yc`#{Pd8Z`=KJ=cYx*>^w
zTJHi@p0^HGA5J<5M`$y9`&llUa-~yJ!hZSE1;Olc%LOGG%bE42asF-k^Raj0GhVZQ
WW=0oRIRyjlXYh3Ob6Mw<&;$U<$2#Ev

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..9521d9d396e4fe7b8a3a0d467718e4a2a881fab9
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTtFTz=5N6t{HR0
zj)tuXudU1@C#kg@j$gMy@cwc;!832HI#`>N>X^RQupRLAiHl{qu*f)_;VW0Y;!T#Q
z9}8}B1$DT~6}ZbVst9_sUU)L)i7)3|L)j1IQ3Y0|M?}^(2!G@|aOliM{etf&;|^F=
azLYlmXJ*8bwly5+1_n=8KbLh*2~7Y@ML_HT

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a492b8037efac90b7ef386a005de69601ddc2a8
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-ggPCm$cK!L+`?l$Iv
z1jh3!akiVAgbgBngN2uB+&XOT_QT(W*D`(Ot~xI#*;8pnYnZl%g)s!AnG`K+c=AT3
zn!!4acX{49sR?uJUi@HCIG*#hVXbn+(#I@WOc{x4{1e2&JKd%-Gw{#4zHZuW>jr1z
yb8<p5Gwc}(W>tO>fAoyKn&Fd^&c;c7r+EurJGI2Eo4Nq#GzL#sKbLh*2~7Zq%t&1T

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..f81553a9962418fb52fa85e89c6f30295b166caa
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTtLXK!L|)<}}8b
z3dSt&Emz_cg$*J#CUICwJP(rLz4Q2qf7aTs3;%>?${as_JhelBLDE>6GwVa~Oh&00
zx-mISrDrTXzA<?ulw~jQJL<fdeL`=flEd9ClfpIA8JLe&M^&F^Y)t#c)+w-=H6Xwz
lL!4_<@8701OWeNgoBu%2F8Xmae=yKF44$rjF6*2UngBOrLg@ei

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..b99c20e3de7266352a03bc99094312b0ce6b9566
GIT binary patch
literal 194
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ot`d^Ar-f#PCm$cK!L+`?l$Iv
z1jh3!akjgggbgBnC!2{0KKamV_)q<($EvNL0_I=gDOL1K-pMz$-C<5CH^ZTxQ*(6}
zSm>v72TbYSoN;S=%8b3I#275obepI39I^c@=Fm3N#=$VE(`%|d1KXkM=--SA8OQG0
sH#Af-HVCI>h<$q4V9UVgvqa?nSv$KHuObf@praT(UHx3vIVCg!0H)tY8vp<R

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..3749f750ad3203b601b91323a383c01b9032bb6c
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-fl25;m&V8HSCmfV2}
z>@y}t7(Z`~n{ay8%2fi55wbRoy@pLy@2|@XT+rd};n<*Texy-!va0Zg6(5<;%0x_T
zPSwtEY%`i5{K?NjcvBeDv^kqx^<ExHQ}{D)T9c>xlWozBf}6x2DEYh)XZd+-XF<M!
cOiis_=xi&aQ&YCZ0Ug2M>FVdQ&MBb@0N##51^@s6

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..a40c84f5a035e1b3c2cbedf451bbd958b0cf7b35
GIT binary patch
literal 192
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?Vc`<Ar-flPTt9Tz<|SbrWtd<
zhK6jF?d$eBseMSXT;js_ki+YvYRc#Nf)W{Pb?r?QCdQO4w1~E4;4;><R9nENFU}t@
z^+=@6QCXSdkel2G8Y5pjvM+x;@g~cL<YycKa|0&@J!N+2d=|TSFXIf8$zS;m66+WZ
pGSafdPaS8qW_--SQ>s{LZ}u$BE?Sq5^C-|s44$rjF6*2UngFECK(+t?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..99d2700fb4238a70c2149d62c67a960079071608
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-gg25;m&V8HSCmfV2}
z>@y}t7=Le#n{axTUT7=F5m}qYUc;uU_sNfba5K$HZ4zWGd(vjHA!$<zlbC7Uf|<<P
zMH_Nhbx#DaZE}v|%y7EqbzoBPwiBvvZ}7C-zZ_(c*?uQX+ra4?Q%noz-zJ6oKlXgy
fdf?@Q*N@pw{<7*z?d?7cbO(c{tDnm{r-UW|7~DtL

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c5770db16e066a3d039e5d7a5e9463d47458a0d
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhXIK`eNwNMAVCL+a
z-ME9pH;3Dfx$A<-^u)mC%MF|?IeEv@53uNPO)S(Gsy1YnJKGY|mgu0*c=pDj1ViR|
z0_sa7mox6IF!?TIl)yA^h0fteULwq=JUDD3t{mdkPzo%TTvrm{(v-%-+{MA7=2^LL
j<_R7)vj+mIHzgS|!>po@9b>Zvx`x5i)z4*}Q$iB}0VO)B

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..7f80e647aaafcf0e771d8f56028494be863f1167
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`4W2HJAr-flPTt9Tz<|SbrWtcU
z1!I;<)b&V3;fhTbz9Nc#OMmp9t&d@PHs?6MZU)O`u~*+Y8cx})vEWzmOzUDuVy!z8
z$U5na<03H&!|iDfqMO+t95^HC&=ktI+H1v>%!d0{n<lPIl8fWMVVKRJb~xuQQ)vGi
j#x-kCUtGE5|8?FiSyp{}WgGSZ-NNAM>gTe~DWM4fYqdkg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..c003c7f9247017a07c26cba52b6c06bd85b159b9
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhXIK_LQ&jL%7M4#^
za4a+y5MS7tdobNWaMm*;ovZ>WgT{ulXMga_XmC|Ddgq#?pLSsJ%n7FrcwVS3kc^hl
zNjo6?sKw;5$pZ2IXK_w!J_m%SrbfhcCOJrQHnMj|?O=3O$<jMKm9NX=LQkTDVB-N5
oO??yLnFqHS1WcHE@TMfg@sn23^BArE16{=6>FVdQ&MBb@06C{Ym;e9(

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..c28a131544ab2ff0043038e281d9367b427dcdc1
GIT binary patch
literal 176
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`<(@8%Ar-flPTtLXz<|SL<~8Pk
z4GgA2y00rXE$LF~ULSKo;T>Z;gK@O@#>9X#`448EXQ=2nxw@Mns^l5Zg1CqJDzhE9
z<xQd;xjvp?e%GPgppvwbVb+{Udo&jsFJu1a$L+VgZ^k0g0wp`fh#8i@Sl`)6#_aoC
a#h@r;dTqkYRTF?tVDNPHb6Mw<&;$Ux@ILhb

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..84540bc93ab31937526fc16fd344f2839fcf9bb2
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-f_PTt6Sz<`5grWtd<
z1_o0h-PaYHc62FmH`@nwz2EVi(NWNF*}C;g3nG?F7(QSXQ)x7xyVdB!nh&b0g(^0)
zuXo$P)>gJa{lmEfTsN$k_5Cy>y{tNCO4u)7y5usa&Tc`8#&G7mX`FwX{(bCSnP;}h
V^qMUDu128s44$rjF6*2UngB`uJo*3t

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..5544bc918a727ba835d80cccf2bd417190b8bf45
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPTt9Tz=4Bh<uz7;
z3k-%rnr~xL_np|}x2J3aXHvU=!_2j7UoRHpnN-PrzJl$*VV}4-mJ5rF(iy%A#ZOwp
ztov=jO^%=$?$!_bESWr#rg1Gesd@6XkX5eLgXdcwguI%eDaEM%Ot|5wk^BAwch#Hs
czpr6lz0>TK<hs9)fo@>%boFyt=akR{0Jp?MK>z>%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..1447715e7565fcacd9a59ba7de80cd32d4fb8b6b
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-flPTnYZK!L+`?lne@
zhy$~%qqD<Lu=t71eqtlCUxign?)}NemLRX!g7$9Qe|PXr4(7k~-I`HzMtJ2kh34s(
zHC8ZOE4nBe!rZrDlcxfMS#>~fpYsi&6KrBCCuRqJT6HS$K;N^yi);TeS|)C@6RJ$m
mRk+}DU2n<dUY`2vKiLjmu-aa-{Bt$XISihzelF{r5}E+po<`;X

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e5a7a70f4ec8e63a1b5ccf1581bd6285bf33b78
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-ggPTtGQpvciW^BSW@
zOv9{}Yqvz_95{LIQIR1F<N6;uJnuh>FW71(p1jza=V;5<DJokW{=S!7AQZ0sE=9pH
z?Gw)tt~&|qnK+**#Bs}XtWR^0{CKiK*3g~p(V9(Bp-#(u4*!VOm6&Pts49yw|Hv(d
n=ES(WOsV}m_louGXY$W>vfBQ7{c2XAa~M2b{an^LB{Ts5;>kw1

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe3a46f310218887ae264d1931844dcc9db9bb11
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fl25;m&V8HSCmfV2}
z>@y}tRH{!m4Gwi>DX^|Md`x2Iom#z^c*g@9bPSXZNLMQGt+}Byv%$4lKjYbfE*Twb
zM{c7jjU^}48GTPgaYlSPCAf1*-&uzrmAb66t)3KGH41*xJK#DaK%6D>@qDZE(mt=u
V`pSc13xU=%c)I$ztaD0e0sxeIJuLtL

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..267f2aec4bab569cda32c21d408745e8a72416cc
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPTt9Tz<|Sb<~8Pk
z4GgA2Yp;JyDHL_(D7HA7FYv#Rb4KyHwS_BLdsFT?N%u2koO$weF2k&lXB-RS9=QvZ
zE;uP?BIPJloXs9%IG;gihAMMLf!C*9Enc(ve%R_-Ow~%W>TQtS%$l(2%r*UjuO}Zo
cx9(?O9c$LN)nxJ>pd%POUHx3vIVCg!04-xcp#T5?

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_pane_silver.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_pane_silver.properties
new file mode 100644
index 00000000..aa47028c
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_pane_silver.properties
@@ -0,0 +1,7 @@
+# Stained glass silver
+matchBlocks=160
+metadata=8
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_silver.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_silver.properties
new file mode 100644
index 00000000..d2696f7a
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/8_glass_silver/glass_silver.properties
@@ -0,0 +1,6 @@
+# Stained glass silver
+matchBlocks=95
+metadata=8
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4f7c4ece4f6fb8ee6e739760b14aad79e0e7a3d
GIT binary patch
literal 128
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`?w&4=Ar-fhe|&#`zn;zLVB>n0
zFG3*=d=p}wC#FrB>+fN_%f@rvVh>~2uFQ1dl?{_x+JcP(+a7%q3p;zHjnVbq!dQpk
bEF*@+YvT)EsIIU98p+`4>gTe~DWM4f=&LN2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/0.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/0.png
new file mode 100644
index 0000000000000000000000000000000000000000..d30caa44cb50a36c3489a7dcd87662ee0ec573ad
GIT binary patch
literal 205
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q#@T9Ln>}foxGd(fC7(;al*3`
z40?B#EpS`p`&M*D!^x&a3XLDxyCw@1@F(whyk~yURO^Wg&xG{V7wBq)FwQ<L#xO&&
z)mBTvQoUWyp>O8lWOFq>4?p=IzZg3DB406jhEMQvXVqd_l-MVyAnD)fG?kgbeAe}O
z({9-}_!?))bDEtIW|)(fm#V14_J&zRaaq)s<re#AFT3xQ-D7wG=spHdS3j3^P6<r_
DODRY7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/1.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/1.png
new file mode 100644
index 0000000000000000000000000000000000000000..941354da8bd09f5aaed8f7dbe2f1359b7e329219
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PB!E_pupj3n{fUi
zqeO(Y#pE4j-?-)-n0(bFH#xweZN9|gdZ7pHkM~4{%Z7-AE)%=wd?(-)Q{8&ThM9$5
z{g_f7KR03ON_<xENL1vYOz$Z*2FbLI?5;0%WKLsPGUFsuO6rsytBP0_EUx^YvEP<q
zx#Ut;rv91C2Qrpvb7vYS@GsC!(sHft`plcT>UOEorrohXr!jcC`njxgN@xNA>@Z62

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/10.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/10.png
new file mode 100644
index 0000000000000000000000000000000000000000..e6e23b0b31ebb43f1426f6b45c6c44619a34c679
GIT binary patch
literal 177
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr-flPF~G>Ab`VFazk+m
z1Isoh-=^BvC7Z%bc^}SJH)yGD@NRe<_1x`_fyOiQ3(t%hqzo%d1s%H2&0)Nv{iiiW
zIOAb+nzo0cT;&1TLY4_GI-(AfgD07*mK-ZNa6j|l%PWGxTbTTgh&8m%Tpa)4-Q<Js
atnFhKoL4^3d3_tu4Gf;HelF{r5}E)PtwMeP

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/11.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/11.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0eddb7389b6ed1fdb3f3d164093b8e04f77b245
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl25;m&V8HSCz`cvi
z5)sx0${WAUjk)F*Dk^y3)B|4W<P@uQzwa<I9{$xN$T;srlf{Rm&1p<>y#EqrGV2$8
zc*CN7B7p6d;(8Vx#c0(BC$&|JJY{D$e)t~6WmbA(lU1YOC!GVXGXlg#G9TYq@wtLQ
Yc<*`TovDwqfDT~rboFyt=akR{0MT1Oy#N3J

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/16.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/16.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa7272e62fa8a5b8855a386f9d3df81922a37dac
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>}foxG9vfC3MTq(N~C
zgLqzWfbzv<-?)4Zq&NmnIACa|7w7cA{tWZO9q(?1uuWWaDCDrYg}KP=hO?r)3}<?r
z&I(QFo%@(W;qaM<nG(Y6Da!2o>=-8{PBT(?$r1E=M?+V`k{Od(Pn-%}bm1wBgL}o_
ztd;wj3uYC5op2!WAL9Xz%U{JGJ!7wCEZrOtRLdYY?Y2|(EyLSD*D-jy`njxgN@xNA
DRkKaU

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/17.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/17.png
new file mode 100644
index 0000000000000000000000000000000000000000..beebe55c96532dfc1389456270cf9466a8cb8379
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PB!E_pupj3n{fUj
zv%!Y40=2@oXGCop)mLZUIu^hvS(n7~-_vf!w#PZKr2^8coOEs5YaMrTKiSL5ka#R|
zE}O==)0He6lBX3+lHHJWZ|=D|hN3fBY-?2B%`#<>O#8%eR6_OKE*VA%j`z}Uce4wa
vEZ*iJVCc<Yk=XXnDeg~#`GU1#=Svvh=wFvy;r9L$&|M6ku6{1-oD!M<CN@X%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/18.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/18.png
new file mode 100644
index 0000000000000000000000000000000000000000..59dd8a8a38986bf897d909f925cdd3d7715bcb3a
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-f#PTt9Tz<|S5(x5nn
zfor?wiisJ)>8$<_PCh!dN#L2rJnruQJ6U4RTdUPRE`HI)_<85#3oKvvr#E=rS+iqu
zBg@Q_#sb;}&3n02W;9pm7AWYQZ7_N?nbA6_kLO5a>gH7~J~P`sM(Ik-G<sB)#i*T>
m+i=jpd%MF;<<&8ZPx2qox%8pIIKdF;90pHUKbLh*2~7Y4yhq~z

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/19.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/19.png
new file mode 100644
index 0000000000000000000000000000000000000000..4961e39a2656effdf0ff70b5aa89a76ae51a40a2
GIT binary patch
literal 195
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`U7jwEAr-f#PB!E_pupj3nQ;Ch
zv%!Y40=2@oZ$vE`)mM8<ujVkSN$&aYX~%TD^t#&15T26@xN<Gcr_L&{5aw=Zo;k(Z
z+o3GZPfS5uyt;6^e!`5sr_>m%({!7e+#b!V<V-kxMovL`t;*6<@(oN6_pbfRAYpR(
sm3+bh8^#Nq#wOgE#RpW3dS|_2{?u|^lBt4=73eAkPgg&ebxsLQ0GD7w@c;k-

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/2.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/2.png
new file mode 100644
index 0000000000000000000000000000000000000000..771ff3b58a8523019b63c8adcb899db28557a1e8
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-f#25;m&V8HSCz`cvi
z5}V3S^c=ahQ~ya*%r&1-mrliIW0xBe6JG9kXLmu(hT-gj%N6HTUNPLRS2@rYvuD@T
z2DZ7{LILXwniSZj-Z)<55Sp;PEWr55)CPu4E=*j0kv7w(Y<$U4zg%^Ba9d26@&~?~
qTm>7>tkt=abK*p&ao0EfbNa!PudgtkSY!=!5re0zpUXO@geCw3s7t>9

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/20.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/20.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8c3134399475430d4b622daf443eb49b283b952
GIT binary patch
literal 196
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`-JULvAr-ggPTnhcK!KxG)}Yve
zfi;&a`&~}(<|bi_NFASZ%1V<SMQXgC{8(M)dFbp%{#P&bZIYZb%i-R728A;g-Ip0|
z{;=$2FgqjUXT%(K=HiJr%nFCsTx*!xH9L*hf!jE;VNZtYxlJ;RFEsAmzLm~*Ak!^(
w!hz&z3<g~<Z?$gOJ#pds;=m(LpZ4CXQoO$6@R1%>ptBe}UHx3vIVCg!03(1-Q2+n{

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/21.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/21.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd9b84ae68f15558e4a79d5e93faf96c8d272431
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-fhKdhWz$<cB7#F2Ih
zkAOQoM_e<KqCZFmv@F}n(=9cJ%|{`j*w~I)Eg`U@r+VUzZpjZBYEO)Kn5#H5j)}1W
zxh)ooXDxVN99_I~`UFPd4=$;aV&RJ<0^FP)99$%p=OEZQ>vX}=W+fq$WQhP51q07h
t+-F_V3^p(>c(aF<J+7zi;!}P`hG}fqS8V1p`VDj!gQu&X%Q~loCIB7=MauvH

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/22.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/22.png
new file mode 100644
index 0000000000000000000000000000000000000000..98f227d08ebcfc6bfb686bfdc76a78d447ac3a5d
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-ggPTtMi;K0!)dBIYq
z;ZYQKmQYl7ctO)_AMRwHhnXME%m2u)XE?p>eDrI7-wc+^x>w!{GEA+ED3o)UbVh{n
z2-lyE#at>gn_YAZlJd?rXr=KVXq;)>z_MB<Y-)h!WrqE$S(Ss2+UybAkbI57r|sr0
n)>U$nHqUFUtfqYVzlR}(>+)?!Zk-!I_b_<6`njxgN@xNA{hCCC

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/23.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/23.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc7929ed33a7124b252f66bbee3393348ecb42e3
GIT binary patch
literal 188
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`&7LlfAr-fhKdhWz$<cB7#F2Ih
zkAOQoM_e<KqCZFmv@F}n(=9cJ%|{`j*w~I)Eg`U@r+VUzZpjZBYEO)Kn5#H5j)}1W
zxh)ooXDxVN99_I~`UFPd4=$;aV&RJ<0^FP)99$%p=OEZQ>vX}=W+fq$WQhP51q07h
k+-F_V3^p)|q^2`Se7n5j3-_hxK<6-cy85}Sb4q9e0H5kYPyhe`

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/24.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/24.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6c02d95b2ee7599ebe38b4df32db4ab1f839123
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|R=(x5nn
zfor?wiisJU`_#QJxrjZ|7B}grKA`wu$Gc)>HIuHFyjOm5G<eypvEo<oOz&by64g6+
zk!8{kg^OHsI-=zQT;DKS2o$qTcrfMgEFrCAsR#eJB$TY`Xy49Mc0{V7bLQIk1+OO8
eHthU-j=!kqeEpY%`8hymFnGH9xvX<aXaWF(o<n2+

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/25.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/25.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c5e5ba031c5c504c4b9066c8d6d66efc0a0d36b
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-flPTtMiV8G*It59sv
z(7i=uo$k)mxjt?#jT4^gi(GfvCthE&LH2pfE&D8|#WSV_?007fd6sy!lEJfX8HYmH
zLvNW<g_CkBQjNmJ+3X>P)eL-R<}j*QJl(LX#cMX(4@+GM`_MCor5UZ$cn_q^T&ojc
gn({&URQVkJ3;)m8zb?1-1G<F4)78&qol`;+0O1Beq5uE@

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/26.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/26.png
new file mode 100644
index 0000000000000000000000000000000000000000..b45b3865f9a9d476b61c89e019a15114604cfd57
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-flPPXK0aNuyYT=4t@
zgUIEmfXNrC=334a=1%5VEw*3r&vCH?>vKD|)L&_FGtyny=gtuFEb(b2gQr$7i-7h=
z)jq2UDf~jc2Re6dWnMMImVrI(9D~rDqKH_hrM}F6=7{xpiGKdzcAzhk*&s6QwfKr(
fDIXqB&5ymX_`LG|)~7px?qKkA^>bP0l+XkK*-=9v

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/27.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/27.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba47110fcd03e12534b71c9a0ab8e81192ad1c00
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fl1{?A<IB+~}+;^DW
zV1t#x<PE=M<DdB+i?LW>RkC>LlquUD?_vA4ULhfZT|)3dr%ng6zFD@~gNqNir&)eb
zVn6S<p@}DTf$S%*145fZnda>YQks5cqa=s@`lSiM?K-Q4B^1vy#k6piI!-kEx9T%*
X`+@Vy-!I$*xs1Wn)z4*}Q$iB}$D=@n

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/3.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/3.png
new file mode 100644
index 0000000000000000000000000000000000000000..81db31fa6bda0747efadd8ecbeed5661edc342eb
GIT binary patch
literal 200
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`{hlt4Ar-f#PTtLXK!L}_HsRR`
z2E9AW7Ho5wJxg>(!^tKkRiy|1F)~ga)e&aww+pwevsxjsYO>Uq)c-55v|f(f%3v|m
zbH`$)O`nT4F+}dL=xVQJJp3kf8^aAlZ(EIok~_w$8O+YSVccZsCA8`fgT{qD>09&}
zn$s@*V`MwS%`i8uZPSE0wl{1hip!$5Ot*+{?Y~{>%P;&9=rjgTS3j3^P6<r_#05;b

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/32.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/32.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cc6fda84822db160e5bcdf3ae9658c0e040d111
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-fhKdhWz$<cB7#F2K1
zh9hE1qUOwng0pUj)v$>y%+x!)h;2EeFvpEMJvj%Gm}Xt%eeas2?`EFB)L7s!-Q94(
z^oF#Y#0?U&#Wz^)<!N6S!TaLq;+@kcFbaQgNtF}}UnCLW=Jep;qB27rS&@k=cJhQf
wX(>4xw=uf1Fil>v=YmfP8?&@SU>O^OKJWF?{c%P|fDU8uboFyt=akR{0Oe>yR{#J2

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/33.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/33.png
new file mode 100644
index 0000000000000000000000000000000000000000..97c6860406b40d9de829802a21f8b2737affd2fa
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-fhKdhWz$<cB7#8DoH
zB<_h_vm1AGh%k3uFquB_Q4=RiPM(`tf+6GC7j54c?M^V{JDbT8)0XI<&v@42aDri<
zfcgr_>5O|TOuh>lB{0ofp>z0|R|@kf4-T7(D~B#Q3U<yqU7)%|Dad58bbyP3f#)gi
hvrC@1b!{?cn0x)whuiOYZUbGy;OXk;vd$@?2><~kL?{3N

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/34.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/34.png
new file mode 100644
index 0000000000000000000000000000000000000000..8790bd3cd2ecab277856d1c4384e4d40592b9989
GIT binary patch
literal 172
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fhKdhWT(~UDt!LiU-
zKzw47gW#-ZMnN$KjSXkd{@|I>;HxO~?&$L-PL@N7Om_NTgf935Ntg&PmYmMGx5DJR
zkWm8DycIf!pLww*&FMUvP;td5VPmJn+0-3-0$jS%N|?JiSkyc#7tR#hDX7iH@Hg#T
V_W3u7`+?Roc)I$ztaD0e0su+TJcj@P

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/35.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/35.png
new file mode 100644
index 0000000000000000000000000000000000000000..36aafffd86d6b2424c41ef1e1f84a84863f1b4b6
GIT binary patch
literal 186
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jh-%!Ar-fhKdhWT(~Z&Yh(pt(
zGzC2;;oD8;8<b4Wrbb+OV3NSZID7U-Ndv}ir<6P0N8-*jxEm`@Pn5Xe?O?pkAmU7e
z`Vr2|W0?;6a%cCp@XTmX*E+pnhtSamBOxY!v8@HnT^?6r+O%awCN7XX+@QqN=ou83
jp=Q*ao4CNlnwg<*&ZQ40EU(T3I)=g1)z4*}Q$iB}N{>P7

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/36.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/36.png
new file mode 100644
index 0000000000000000000000000000000000000000..533ce5966042f49d69c3ee3eb4598f5b48bde3ef
GIT binary patch
literal 190
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar-fhKdhWz$<cB7#F2K1
zh9hE1qUOwng1ap2n7b~ROiv7MKi$B|l9T6VmSD(u_C?$GMY|IW`Oapt#Iz+k=rf+R
zIGkYEC!oGUaysMQ3X|_bMhQ&wR_Gjl=9R*H%7eqE;>w{*j)I-DP8X;yQ3^6yEFIvY
oVBmR*`|Oct9&B8ji=`O;EW7L@z2*8lpo17ZUHx3vIVCg!0RH4e3IG5A

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/37.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/37.png
new file mode 100644
index 0000000000000000000000000000000000000000..21ea0a167af3def3bce6072535090766ef6de921
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-f#PTt9Tz<|S5(x5nn
zfor?wiisJ)>8$<_PCh!dN#L2rJnruQJ6U4RTdUPRE`HI)_<85#3oKvvr#E=rS+iqu
zBg@Q_#sb;}&3n02W;9pm7AWYQZ7_N?nbA6_kLO5a>gH7~J~P`sM(Ik-G<sB)#i*T>
n+i=jpd%MF;<<&8ZkN#jh&~e#kNqk`_&^-*Eu6{1-oD!M<T&qb4

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/38.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/38.png
new file mode 100644
index 0000000000000000000000000000000000000000..c804c82b8297c790c9ebd192c603a96ba9866b13
GIT binary patch
literal 184
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`^`0({Ar-fhKdhWz$<cB7#8DoH
zB<_h_vm1AGh%k3uFquB_Q4=RiPM(`tf+6GC7j54c?M^V{JDbT8)0XI<&v@42aDri<
zfcgr_>5O|TOuh>lB{0ofp>z0|R|@kf4-T7(D~B#Q3U<yqU7)%|Dad58bbyP3f#)gi
ivrC@1d2RZv$S}|Nvd`VwrPqK?VeoYIb6Mw<&;$T9q(hbf

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/39.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/39.png
new file mode 100644
index 0000000000000000000000000000000000000000..497a1ffe11cb774a86bdde440240af791ff78e9d
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhKdhWz$<eW0;o;GW
z4`L=Y9gH4J1UqLp?%;@(na}8&G3)e(m4{OgurQgKKQ>NaGHdnNAwHj5O@O1F^T(bG
z-VVl|i5Gl&(qh=YJi2(t`$Pk0#iC6-v$Z8V3f07#9|oRoII5OpGX3EvCqd0w7kM?5
o1ZJo_ZB0uumSi@uUOus#@tVYCA9v|okn<QkUHx3vIVCg!0Q{9iK>z>%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/4.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/4.png
new file mode 100644
index 0000000000000000000000000000000000000000..b1a0f02595232ea965bee360074c6fa532803759
GIT binary patch
literal 197
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`J)SO(Ar-f#PB!E_pupj3n{fUj
zv%!Y40=2@oXGCon)mLZUIu^hvTbIQ1-_vf!w#QSJ-RhJLRrNfdI6okdsrEgi!_2~v
zbVjcaMei78W|+<?Vb7WIeZgk=2Byt38Kpbh)3_b_W-2)px^*trt7gz^`QH2OE^~y*
v;;kMVlCCju9E$nHUHPf`F2hV+IS;)z-PcQ_q$cqJ-NoSP>gTe~DWM4fPIyQr

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/40.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/40.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab09ebded8c2b71cddfe60c6cc0d293a592ee4c3
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fhKdhWT(~UDt!LiU-
zKzw47gW#-ZMnN$KjSXkd{@|I>;HxO~?&$L-PL@N7Om_NTgf935Ntg&PmYmMGx5DJR
zkWm8DycIf!pLww*&FMUvP;td5VPmJn+0-3-0$jS%N|?JiSkyc#7tR#hDJX5n!tnRd
Wx#OHZ&bC1N89ZJ6T-G@yGywo{N;_r%

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/41.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/41.png
new file mode 100644
index 0000000000000000000000000000000000000000..d65c5de87a323d971cf63654552e2dde164a90cf
GIT binary patch
literal 173
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`C7v#hAr-fl25;m&V8HSCz`cvi
z5)sx0${U}}jl1R-Dk^y3)B|4W<P@uQh3^^~5^E23F!-l9%2aHOG-m8)tKV>@QQWek
ztVuLQgZb@*aHeS!)(U-iGF52jlD@MJKdN<EXIrI2&ON|UDfU3gX9aiHmXG&Ver6U<
WJa=5XB0vvlKZB>MpUXO@geCxF=s&yw

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/42.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/42.png
new file mode 100644
index 0000000000000000000000000000000000000000..92184c1886ea88449d03f1a5ae8e2bb8412ce395
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fhKdhWz$<cB7#8Dm<
zjXbtTN<lmtPM2fcy13N@Htdv~&nUb>)8)|KA29}v4i-KKp0~y^&GO`GPD?U*Y_veU
z|5=<9o6iB^si`+&PCE1$Z<OHak7Cm?6I{HLXS#To$HksJ2f@YzDw_HxmzB(u4!1KD
X8Jt&sB)n(?&;<;hu6{1-oD!M<$VWS)

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/43.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/43.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb3587a878d26c863a29ca6ff7396d4cae654464
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTtLXz<|R=(x5nn
zfor?wiisJU`_#QJxrjZ|7B}grKA`wu$Gc)>HIuHFyjOm5G<eypvEo<oOz&by64g6+
zk!8{kg^OHsI-=zQT;DKS2o$qTcrfMgEFrCAsR#eJB$TY`Xy49Mc0{V7bLQIk1+OO8
eHthU-iNDC;yt3X~cXgmM7(8A5T-G@yGywo=m_gbA

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/48.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/48.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6d84b817333604a9a3e19795ed42833df7b11a5
GIT binary patch
literal 203
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRRA<Ln>~~oovW=K!L-x`oO%!
z><I~PANV}FHB-BS$uI2k6&KB}vLDAd{&%jpT^Bd0^v{%>N{`7W6}hiONijOiym;az
z)1uAAD;VF*FrBl?GTWi#*Mi5q4KkarGH>fknA#`1f^$LROdAK87*(lIGlrOqxSdgY
z?-|6--l+E2knoS;K<2Yc@f?%o-!Puw-gv~zO3!?a?CsLo#>HEJu4C|Y^>bP0l+XkK
DtW;1*

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/49.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/49.png
new file mode 100644
index 0000000000000000000000000000000000000000..9016a5fda6a28c9f3ddf71f5eedbe96c651c194e
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhKdhWz$<cB7#8DoH
zB<_h_vm1AGh%k3uFquB_Q4=RiPM(`tf+6GC7j54c?M^V{JDbT8)0XI<&v@42aDri<
zfcgr_>5O|TOuh>lB{0ofp>z0|R|@kf4-T7(D~B#Q3U<yqU7)%|Dad58bbyP3f#)gi
pvrC>Fa}IFc@bGAcMC?BS2I-*dKE;y`P6oP&!PC{xWt~$(696d_Mp^&>

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/5.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/5.png
new file mode 100644
index 0000000000000000000000000000000000000000..446927724408cf4f9a2624187e3fc84b0424c1b2
GIT binary patch
literal 198
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`y`C<PAr-f#PB!E_pupj3n{fUj
zv%!Y40=2@oZ$xbv)mLX;I;P|#xzF&}e-(Mp+l58p(jmO2ihi{>>$S=oEwaTJS|q1h
zdpi`yofBK2A?|*0!}^m3)l+>Liq1r_nM!t6KT~bsF|KS#+9EVn%btO!<@=UztPU4?
vR@XByer91%KXXCn$$aKAW($LfK{bpV_18-!ceUFB9me44>gTe~DWM4fH_t<c

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/50.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/50.png
new file mode 100644
index 0000000000000000000000000000000000000000..bba832bf435f656c2fecaab26c3775d876080352
GIT binary patch
literal 181
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr-fhKdhWT(~UDt!LiU-
zKzw47gW#-ZMnN$KjSXkd{@|I>;HxO~?&$L-PL@N7Om_NTgf935Ntg&PmYmMGx5DJR
zkWm8DycIf!pLww*&FMUvP;td5VPmJn+0-3-0$jS%N|?JiSkyc#7tWk=r-Gwn`-21B
f7Y%m(QDm5K_Oi0rf%QH>cQAOm`njxgN@xNA)aF87

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/51.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/51.png
new file mode 100644
index 0000000000000000000000000000000000000000..706c0bce103f6d189b4ef8adcf8a712c432e64d9
GIT binary patch
literal 193
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`9iA?ZAr-fhKdhWT(~Z&Yh(pt(
zGzC2;;oD8;8<b4Wrbb+OV3NSZID7U-Ndv}ir<6P0N8-*jxEm`@Pn5Xe?O?pkAmU7e
z`Vr2|W0?;6a%cCp@XTmX*E+pnhtSamBOxY!v8@HnT^?6r+O%awCN7XX+@QqN=ou83
qp=Q+F$ZNrp^x#1EMT1>`6d4qkU-wymYHJ+OO$?r{elF{r5}E)!^+i|!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/52.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/52.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dc036205eb73068491953a9285920786e55e099
GIT binary patch
literal 183
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`b)GJcAr-gg1{?A<IB+~}+;^DW
z;LfW9K8Iet5wAJ8*C)0|Q6@&#%F$c1aa!(s^K1JR7DVP5C>`j#BfuW!GtK9~qGS9f
z#R;x_)7CCvl|1E;c0!ra_e2zDMA0d+ol7KVH-4y&;!-<1;dTbA+ljb_Zi9vK0#Bsp
hm)o&h$kgnOXSKduZ}#!a6rf8OJYD@<);T3K0RRSTLm>bF

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/53.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/53.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fcc91abfbdd17b9fbeae9aee9452e324cf82293
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-fhKdhWT(~Z&Yh(pt(
zGzC2;;oD8;8<b4Wrbb+OV3NSZID7U-Ndv}ir<6P0N8-*jxEm`@Pn5Xe?O?pkAmU7e
z`Vr2|W0?;6a%cCp@XTmX*E+pnhtSamBOxY!v8@HnT^?6r+O%awCN7XX+@QqN=ou83
kp=Q+F$ZO%^S;oe&q~o&BTfH?FK-VyMy85}Sb4q9e0C43%#Q*>R

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/54.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/54.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1cfbd9b9b034c11c677de239d8782b9b67bb832
GIT binary patch
literal 187
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`O`a}}Ar-flPTtMi;K0!)dBIYq
z;ZYQKmQYl7ctO)_pWGfro8*t?<$vVYGo0SG-ri)PpwISz{q77Q&k~PTGI$yVvj}K^
zQ0~*3kisXl^+4xNQ|47OY#G?o&M^qBDT)YnTI$36XPsD&kLc$QQ3v`WnGGb<UW=`$
kO5snqXC*7^^{YPa{hZ77fn_{@fv#cjboFyt=akR{0J;Z3)Bpeg

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/55.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/55.png
new file mode 100644
index 0000000000000000000000000000000000000000..aec8126cb685fb34f1fc05145bb89db195dd0ddc
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-fhKdhWz$<cB7#F2Ih
zkAOQoM_e<KqCZFmv@F}n(=9cJ%|{`j*w~I)Eg`U@r+VUzZpjZBYEO)Kn5#H5j)}1W
zxh)ooXDxVN99_I~`UFPd4=$;aV&RJ<0^FP)99$%p=OEZQ>vX}=W+fq$WQhP51q07h
m+-F_VHt6z*q@)&<u`w`nUG@=U6}<y=5re0zpUXO@geCwqZ9qE!

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/56.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/56.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ddd6691e531b0aeb2343729eea36e7aad070933
GIT binary patch
literal 178
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar-flPF~G>Ab`VFazpVR
zMu8h#CY;+|muw0%<$X9?-Jqqq!Mow{o@;J*3^bmZUwCHBAZ1utD(KLCZVuxW?LVz4
z!Wj>n)3iMl<th)z7P3rm(Ghi+96ZTfwd7dIf%};UUtSRm-ooT}M6988=HmDV?<OC7
cX1$(0#^u~`<9g>yKu0imy85}Sb4q9e0E47Lod5s;

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/57.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/57.png
new file mode 100644
index 0000000000000000000000000000000000000000..7c7bc7451b8c1e70c6678cb655e8db2d129b6296
GIT binary patch
literal 174
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`rJgR1Ar-fhKdhWz$<cB7#8Dm<
zjXbtTN<lmtPM2fcy13N@Htdv~&nUb>)8)|KA29}v4i-KKp0~y^&GO`GPD?U*Y_veU
z|5=<9o6iB^si`+&PCE1$Z<OHak7Cm?6I{HLXS#To$HksJ2f@YzDw_HxmzB(ujxrQp
XId}Z`{-2dV2QYZL`njxgN@xNAtc5*D

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/58.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/58.png
new file mode 100644
index 0000000000000000000000000000000000000000..6495fef747d8d1a68dffd35deb8178244ea14311
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|S5(x5nn
zfor?wiisI}`_#KvYdFpE{3v~-K8C3;d)?a4i^WVPWpbC=FfB0R*FMke5j0b&A)-^i
z@Jgdf^@I!-zcXuP1CG97v@j@UoA6-D;a5Uhxl#|FZ%GJQHKW~}sqBnY!%3s){SH^v
eoA<x3VSe`d{Ov$Xfg+$Y7(8A5T-G@yGywo#M?uN}

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/6.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/6.png
new file mode 100644
index 0000000000000000000000000000000000000000..663a5d12eef39996325367de404cf63b8e937692
GIT binary patch
literal 189
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EuJopAr-fhKdhWz$<cB7#F2K1
zh9hE1qUOwng1ap2n7b~ROiv7MKi$B|l9T6VmSD(u_C?$GMY|IW`Oapt#Iz+k=rf+R
zIGkYEC!oGUaysMQ3X|_bMhQ&wR_Gjl=9R*H%7eqE;>w{*j)I-DP8X;yQ3^6yEFIvY
mVBmR*`|Oct9&BEljT!zjU0(6RMcfML9tKZWKbLh*2~7a4hC-15

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/7.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/7.png
new file mode 100644
index 0000000000000000000000000000000000000000..9a120cbdff305c8bb3c78317a1452877ca76bdd9
GIT binary patch
literal 191
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ZJsWUAr-ggPTtLXz<|R=(xAA4
zfor?wiisJ)>8$<_PCioV(rIB_UZJP+?gyvExz+r)j=a4fB6}=&(glXE`_mh|V%F}M
z+Q>5Vq_Kc@LDOC?l^M+yx&;dNW-+E7(Pl0?A|u(c`BYXY=S(Bs$N5_mQciWeUd4Jx
pFq@gDZD%R>6kDT;^E>}6vA<Swd4)`3D9}L+44$rjF6*2UngA%aM|l7M

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/8.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/8.png
new file mode 100644
index 0000000000000000000000000000000000000000..39755b87e20061e5dd5d4a747ee302739586c876
GIT binary patch
literal 175
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr-fl25;m&V8HSCz`cvi
z5}V2r+>*{(?_4u;m6lS&?Ss;0$4->Q)cVYccRaAc$3W=-_fADVotrun8!DUiGoBon
zB%@>HC~P#PG310bBkze>oDm;RJ=?jY%h&x!rLN^{ttZ>88wEdU9q^nHAkLEcc)nG?
Zbcf9O`Warj8-Xrh@O1TaS?83{1ORDqK}i4r

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/9.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/9.png
new file mode 100644
index 0000000000000000000000000000000000000000..74bddb4484fdb70b44a495695ae881743aee54dc
GIT binary patch
literal 180
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`)t)YnAr-flPTt9Tz<|S5(xAA4
zfor?wiisJU`_#KvYdFpE{3v~-K8C69b5!)>#bPFtGPz4_m=+lMYoBNK2%4$X5Yee$
zc%@OLdO`+^-<h?t0Y~33S{M|wO?WWn@+%>&T&V}ow<LtDnz7uRsqBnY!%3s){SH^v
eo9Dl`$$Qp+zFzYB%IQF7FnGH9xvX<aXaWFqk3x+A

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_cyan.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_cyan.properties
new file mode 100644
index 00000000..807c2d40
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_cyan.properties
@@ -0,0 +1,6 @@
+# Stained glass cyan
+matchBlocks=95
+metadata=9
+connect=block
+method=ctm
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_pane_cyan.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_pane_cyan.properties
new file mode 100644
index 00000000..99df8931
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/9_glass_cyan/glass_pane_cyan.properties
@@ -0,0 +1,7 @@
+# Stained glass cyan
+matchBlocks=160
+metadata=9
+connect=block
+method=ctm
+faces=sides
+tiles=0-11 16-27 32-43 48-58
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/bookshelf.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/bookshelf.properties
new file mode 100644
index 00000000..fd7167c1
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/bookshelf.properties
@@ -0,0 +1,7 @@
+# Converted from /ctm.png
+# Individual tiles are in /ctm/default
+matchBlocks=47
+method=horizontal
+tiles=12-15
+connect=block
+faces=sides
\ No newline at end of file
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/empty.png b/sources/resources/assets/minecraft/mcpatcher/ctm/default/empty.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbaa21ce6e6c485a87ef6edc8a898736f4bb50fd
GIT binary patch
literal 133
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b
z3=G`DAk4@xYmNj^kiEpy*OmPqH#3)s3b*y`4?rOyPZ!4!i_^&o60D08M0%Jw7#LUt
W7#LgaR}}$e89ZJ6T-G@yGywop*d5OR

literal 0
HcmV?d00001

diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/glass.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/glass.properties
new file mode 100644
index 00000000..8064c63b
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/glass.properties
@@ -0,0 +1,6 @@
+# Converted from /ctm.png
+# Individual tiles are in /ctm/default
+matchBlocks=20
+method=ctm
+tiles=0-11 16-27 32-43 48-58
+connect=block
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/glasspane.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/glasspane.properties
new file mode 100644
index 00000000..64b0657d
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/glasspane.properties
@@ -0,0 +1,7 @@
+# Converted from /ctm.png
+# Individual tiles are in /ctm/default
+matchBlocks=102
+method=ctm
+tiles=0-11 16-27 32-43 48-58
+connect=block
+faces=sides
\ No newline at end of file
diff --git a/sources/resources/assets/minecraft/mcpatcher/ctm/default/sandstone.properties b/sources/resources/assets/minecraft/mcpatcher/ctm/default/sandstone.properties
new file mode 100644
index 00000000..9176eb9c
--- /dev/null
+++ b/sources/resources/assets/minecraft/mcpatcher/ctm/default/sandstone.properties
@@ -0,0 +1,7 @@
+# Converted from /ctm.png
+# Individual tiles are in /ctm/default
+matchTiles=sandstone_normal
+metadata=0
+method=top
+tiles=66
+connect=tile
diff --git a/sources/resources/assets/minecraft/optifine/_property_files_index.json b/sources/resources/assets/minecraft/optifine/_property_files_index.json
new file mode 100644
index 00000000..7ff976ba
--- /dev/null
+++ b/sources/resources/assets/minecraft/optifine/_property_files_index.json
@@ -0,0 +1,41 @@
+{
+	"propertyFiles": [
+		"optifine/bettergrass.properties",
+		"mcpatcher/ctm/default/bookshelf.properties",
+		"mcpatcher/ctm/default/glass.properties",
+		"mcpatcher/ctm/default/glasspane.properties",
+		"mcpatcher/ctm/default/sandstone.properties",
+		"mcpatcher/ctm/default/0_glass_white/glass_pane_white.properties",
+		"mcpatcher/ctm/default/0_glass_white/glass_white.properties",
+		"mcpatcher/ctm/default/1_glass_orange/glass_pane_orange.properties",
+		"mcpatcher/ctm/default/1_glass_orange/glass_orange.properties",
+		"mcpatcher/ctm/default/2_glass_magenta/glass_pane_magenta.properties",
+		"mcpatcher/ctm/default/2_glass_magenta/glass_magenta.properties",
+		"mcpatcher/ctm/default/3_glass_light_blue/glass_pane_light_blue.properties",
+		"mcpatcher/ctm/default/3_glass_light_blue/glass_light_blue.properties",
+		"mcpatcher/ctm/default/4_glass_yellow/glass_pane_yellow.properties",
+		"mcpatcher/ctm/default/4_glass_yellow/glass_yellow.properties",
+		"mcpatcher/ctm/default/5_glass_lime/glass_pane_lime.properties",
+		"mcpatcher/ctm/default/5_glass_lime/glass_lime.properties",
+		"mcpatcher/ctm/default/6_glass_pink/glass_pane_pink.properties",
+		"mcpatcher/ctm/default/6_glass_pink/glass_pink.properties",
+		"mcpatcher/ctm/default/7_glass_gray/glass_pane_gray.properties",
+		"mcpatcher/ctm/default/7_glass_gray/glass_gray.properties",
+		"mcpatcher/ctm/default/8_glass_silver/glass_pane_silver.properties",
+		"mcpatcher/ctm/default/8_glass_silver/glass_silver.properties",
+		"mcpatcher/ctm/default/9_glass_cyan/glass_pane_cyan.properties",
+		"mcpatcher/ctm/default/9_glass_cyan/glass_cyan.properties",
+		"mcpatcher/ctm/default/10_glass_purple/glass_pane_purple.properties",
+		"mcpatcher/ctm/default/10_glass_purple/glass_purple.properties",
+		"mcpatcher/ctm/default/11_glass_blue/glass_pane_blue.properties",
+		"mcpatcher/ctm/default/11_glass_blue/glass_blue.properties",
+		"mcpatcher/ctm/default/12_glass_brown/glass_pane_brown.properties",
+		"mcpatcher/ctm/default/12_glass_brown/glass_brown.properties",
+		"mcpatcher/ctm/default/13_glass_green/glass_pane_green.properties",
+		"mcpatcher/ctm/default/13_glass_green/glass_green.properties",
+		"mcpatcher/ctm/default/14_glass_red/glass_pane_red.properties",
+		"mcpatcher/ctm/default/14_glass_red/glass_red.properties",
+		"mcpatcher/ctm/default/15_glass_black/glass_pane_black.properties",
+		"mcpatcher/ctm/default/15_glass_black/glass_black.properties"
+	]
+}
\ No newline at end of file
diff --git a/sources/resources/assets/minecraft/optifine/bettergrass.properties b/sources/resources/assets/minecraft/optifine/bettergrass.properties
new file mode 100644
index 00000000..6964b282
--- /dev/null
+++ b/sources/resources/assets/minecraft/optifine/bettergrass.properties
@@ -0,0 +1,33 @@
+# Configuration for OptiFine's Better Grass feature
+# Location: /assets/minecraft/optifine/bettergrass.properties
+
+# Blocks
+# Enable Better Grass for specific blocks
+grass=true
+mycelium=true
+podzol=true
+
+# Snowy blocks
+# Enable Better Grass for specific blocks which have snow on top
+grass.snow=true
+mycelium.snow=true
+podzol.snow=true
+
+# Multilayer grass sides
+# - layer 1 = grass_side
+# - layer 2 = grass (colored by biome)
+# Allows transparent grass texture to be used as overlay for the grass side
+grass.multilayer=false
+
+# Textures
+# Configure which textures to be used 
+# The "texture.grass" is colored by biome
+texture.grass=blocks/grass_top
+texture.grass_side=blocks/grass_side
+texture.mycelium=blocks/mycelium_top
+texture.podzol=blocks/dirt_podzol_top
+texture.snow=blocks/snow
+
+
+
+
diff --git a/sources/setup/workspace_template/wasm_gc_teavm/javascript/epw_meta.txt b/sources/setup/workspace_template/wasm_gc_teavm/javascript/epw_meta.txt
index c42fc19e..cca1d334 100644
--- a/sources/setup/workspace_template/wasm_gc_teavm/javascript/epw_meta.txt
+++ b/sources/setup/workspace_template/wasm_gc_teavm/javascript/epw_meta.txt
@@ -1,8 +1,8 @@
-client-version-integer=47
+client-version-integer=48
 client-package-name=net.lax1dude.eaglercraft.v1_8.client
 client-origin-name=EaglercraftX
-client-origin-version=u47
+client-origin-version=u48
 client-origin-vendor=lax1dude
 client-fork-name=EaglercraftX
-client-fork-version=u47
+client-fork-version=u48
 client-fork-vendor=lax1dude
diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
index ea3bb55a..e94e021b 100644
--- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
+++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
@@ -77,6 +77,8 @@ class OpenGLObjects {
 		private static int hashGen = 0;
 		final WebGLTexture ptr;
 		final int hash;
+		int width;
+		int height;
 
 		TextureGL(WebGLTexture ptr) {
 			this.ptr = ptr;
@@ -92,6 +94,22 @@ class OpenGLObjects {
 			PlatformOpenGL._wglDeleteTextures(this);
 		}
 
+		@Override
+		public void setCacheSize(int w, int h) {
+			width = w;
+			height = h;
+		}
+
+		@Override
+		public int getWidth() {
+			return width;
+		}
+
+		@Override
+		public int getHeight() {
+			return height;
+		}
+
 	}
 
 	static class ProgramGL implements IProgramGL {
diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java
index 4251b580..2345ea63 100644
--- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java
+++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java
@@ -318,6 +318,7 @@ public class PlatformInput {
 		parent.addEventListener("contextmenu", contextmenu = new EventListener<MouseEvent>() {
 			@Override
 			public void handleEvent(MouseEvent evt) {
+				if(evt.getTarget() == ClientMain.integratedServerCrashPanel) return;
 				evt.preventDefault();
 				evt.stopPropagation();
 			}
@@ -471,8 +472,10 @@ public class PlatformInput {
 		win.addEventListener("keydown", keydown = new EventListener<KeyboardEvent>() {
 			@Override
 			public void handleEvent(KeyboardEvent evt) {
-				evt.preventDefault();
-				evt.stopPropagation();
+				if(!ClientMain.integratedServerCrashPanelShowing) {
+					evt.preventDefault();
+					evt.stopPropagation();
+				}
 				if(!enableRepeatEvents && evt.isRepeat()) return;
 				LegacyKeycodeTranslator.LegacyKeycode keyCode = null;
 				if(keyCodeTranslatorMap != null && hasCodeVar(evt)) {
@@ -528,8 +531,10 @@ public class PlatformInput {
 		win.addEventListener("keyup", keyup = new EventListener<KeyboardEvent>() {
 			@Override
 			public void handleEvent(KeyboardEvent evt) {
-				evt.preventDefault();
-				evt.stopPropagation();
+				if(!ClientMain.integratedServerCrashPanelShowing) {
+					evt.preventDefault();
+					evt.stopPropagation();
+				}
 				LegacyKeycodeTranslator.LegacyKeycode keyCode = null;
 				if(keyCodeTranslatorMap != null && hasCodeVar(evt)) {
 					keyCode = keyCodeTranslatorMap.get(evt.getCode());
diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java
index 8d859ae6..217d4eee 100644
--- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java
+++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java
@@ -618,7 +618,8 @@ public class ClientMain {
 		}
 	}
 
-	private static HTMLElement integratedServerCrashPanel = null;
+	public static HTMLElement integratedServerCrashPanel = null;
+	public static boolean integratedServerCrashPanelShowing = false;
 
 	public static void showIntegratedServerCrashReportOverlay(String report, int x, int y, int w, int h) {
 		if(integratedServerCrashPanel == null) {
@@ -655,12 +656,14 @@ public class ClientMain {
 		style.setProperty("width", "" + ((w / s) - 20) + "px");
 		style.setProperty("height", "" + ((h / s) - 20) + "px");
 		style.setProperty("display", "block");
+		integratedServerCrashPanelShowing = true;
 	}
 
 	public static void hideIntegratedServerCrashReportOverlay() {
 		if(integratedServerCrashPanel != null) {
 			integratedServerCrashPanel.getStyle().setProperty("display", "none");
 		}
+		integratedServerCrashPanelShowing = false;
 	}
 
 	@JSBody(params = { "el", "str" }, script = "el.innerText = str;")
diff --git a/sources/wasm-gc-teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java b/sources/wasm-gc-teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
index 5d221ca3..1722c7c9 100644
--- a/sources/wasm-gc-teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
+++ b/sources/wasm-gc-teavm/java/net/lax1dude/eaglercraft/v1_8/internal/OpenGLObjects.java
@@ -77,6 +77,8 @@ class OpenGLObjects {
 		private static int hashGen = 0;
 		final WebGLTexture ptr;
 		final int hash;
+		int width;
+		int height;
 
 		TextureGL(WebGLTexture ptr) {
 			this.ptr = ptr;
@@ -92,6 +94,22 @@ class OpenGLObjects {
 			PlatformOpenGL._wglDeleteTextures(this);
 		}
 
+		@Override
+		public void setCacheSize(int w, int h) {
+			width = w;
+			height = h;
+		}
+
+		@Override
+		public int getWidth() {
+			return width;
+		}
+
+		@Override
+		public int getHeight() {
+			return height;
+		}
+
 	}
 
 	static class ProgramGL implements IProgramGL {
diff --git a/sources/wasm-gc-teavm/js/clientPlatformSingleplayer.js b/sources/wasm-gc-teavm/js/clientPlatformSingleplayer.js
index 9bca8aea..c0142cc0 100644
--- a/sources/wasm-gc-teavm/js/clientPlatformSingleplayer.js
+++ b/sources/wasm-gc-teavm/js/clientPlatformSingleplayer.js
@@ -16,6 +16,11 @@
 
 const clientPlatfSPName = "clientPlatformSingleplayer";
 
+/** @type {HTMLElement} */
+var integratedServerCrashPanel = null;
+
+var integratedServerCrashPanelShowing = false;
+
 function initializeClientPlatfSP(spImports) {
 
 	/** @type {Worker|null} */
@@ -163,9 +168,6 @@ function initializeClientPlatfSP(spImports) {
 		}
 	};
 
-	/** @type {HTMLElement} */
-	var integratedServerCrashPanel = null;
-
 	/**
 	 * @param {string} report
 	 * @param {number} x
@@ -188,12 +190,14 @@ function initializeClientPlatfSP(spImports) {
 		integratedServerCrashPanel.style.width = "" + ((w / s) - 20) + "px";
 		integratedServerCrashPanel.style.height = "" + ((h / s) - 20) + "px";
 		integratedServerCrashPanel.style.display = "block";
+		integratedServerCrashPanelShowing = true;
 	};
 
 	spImports["hideCrashReportOverlay"] = function() {
 		if(integratedServerCrashPanel) {
 			integratedServerCrashPanel.style.display = "none";
 		}
+		integratedServerCrashPanelShowing = false;
 	};
 
 	window.__curEaglerX188UnloadListenerCB = function() {
diff --git a/sources/wasm-gc-teavm/js/platformInput.js b/sources/wasm-gc-teavm/js/platformInput.js
index 83bb1b4c..18ae54ee 100644
--- a/sources/wasm-gc-teavm/js/platformInput.js
+++ b/sources/wasm-gc-teavm/js/platformInput.js
@@ -222,6 +222,7 @@ async function initPlatformInput(inputImports) {
 	reportWindowSize();
 
 	parentElement.addEventListener("contextmenu", currentEventListeners.contextmenu = function(/** Event */ evt) {
+		if(evt.target === integratedServerCrashPanel) return;
 		evt.preventDefault();
 		evt.stopPropagation();
 	});
@@ -369,8 +370,10 @@ async function initPlatformInput(inputImports) {
 	}
 
 	window.addEventListener("keydown", /** @type {function(Event)} */ (currentEventListeners.keydown = function(/** KeyboardEvent */ evt) {
-		evt.preventDefault();
-		evt.stopPropagation();
+		if(integratedServerCrashPanelShowing) {
+			evt.preventDefault();
+			evt.stopPropagation();
+		}
 		if(evt.key === "F11" && !evt.repeat) {
 			toggleFullscreenImpl();
 			return;
@@ -380,8 +383,10 @@ async function initPlatformInput(inputImports) {
 	}));
 
 	window.addEventListener("keyup", /** @type {function(Event)} */ (currentEventListeners.keyup = function(/** KeyboardEvent */ evt) {
-		evt.preventDefault();
-		evt.stopPropagation();
+		if(integratedServerCrashPanelShowing) {
+			evt.preventDefault();
+			evt.stopPropagation();
+		}
 		pushEvent(EVENT_TYPE_INPUT, EVENT_INPUT_KEYBOARD, createKeyEvent(EVENT_KEY_UP, evt));
 	}));