diff --git a/.factorypath b/.factorypath
deleted file mode 100644
index d0b65a4..0000000
--- a/.factorypath
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml
deleted file mode 100644
index 1968d26..0000000
--- a/.github/workflows/gradle.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-name: Automate Gradlew Build
-
-on:
- workflow_dispatch:
-
-permissions:
- contents: read
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Set up JDK 21
- uses: actions/setup-java@v4
- with:
- distribution: "temurin"
- java-version: "21"
- check-latest: true
-
- - name: Set up Gradle
- uses: gradle/actions/setup-gradle@v3
- with:
- gradle-home-cache-cleanup: false
-
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
-
- - name: Build (release)
- run: ./gradlew clean build -x test --no-daemon --stacktrace
-
- - name: Remove sources JARs
- run: |
- rm -f build/libs/*sources*.jar
- echo "Removed sources JARs from build/libs"
-
- - name: Upload build artifact
- uses: actions/upload-artifact@v4
- with:
- name: saturnclient-latest
- path: build/libs/saturnclient-*.jar
- if-no-files-found: error
diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml
deleted file mode 100644
index 5016b03..0000000
--- a/.github/workflows/push.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-name: Push Builds
-
-on:
- push:
- branches: [ "master" ]
-
-permissions:
- contents: read
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout repository
- uses: actions/checkout@v4
-
- - name: Set up JDK 21
- uses: actions/setup-java@v4
- with:
- distribution: "temurin"
- java-version: "21"
-
- - name: Set up Gradle
- uses: gradle/actions/setup-gradle@v3
- with:
- gradle-home-cache-cleanup: false
-
- - name: Grant execute permission for gradlew
- run: chmod +x gradlew
-
- - name: Build
- run: ./gradlew clean build -x test --no-daemon --stacktrace
-
- - name: Remove sources JARs
- run: |
- rm -f build/libs/*sources*.jar
- echo "Removed sources JARs from build/libs"
-
- - name: Create timestamped JAR
- run: |
- TIMESTAMP=$(date -u +"%Y%m%d-%H%M%S")
- MAIN_JAR=$(ls build/libs/saturnclient-*.jar | head -1)
- cp "$MAIN_JAR" "saturnclient-${TIMESTAMP}.jar"
- echo "Created: saturnclient-${TIMESTAMP}.jar"
-
- - name: Upload timestamped artifact
- uses: actions/upload-artifact@v4
- with:
- name: saturnclient-${{ github.run_number }}
- path: saturnclient-*.jar
- if-no-files-found: error
diff --git a/NOTICES.md b/NOTICES.md
index a2b3383..1f2594c 100644
--- a/NOTICES.md
+++ b/NOTICES.md
@@ -1,6 +1,6 @@
# Licenses
-This project is under [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0), but a lot of code taken from other open source projects that are under other licenses that need to be mentioned due to legal reasons.
+This project is under [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0), but a lot of code taken from other open source projects that are under other licenses that need to be mentioned due to legal or ethical reasons.
| File | License |
| --------------------------------------------------------------------------------------- | ----------------------------------------------------------- |
diff --git a/VERSION_GUIDE.md b/VERSION_GUIDE.md
new file mode 100644
index 0000000..34b948e
--- /dev/null
+++ b/VERSION_GUIDE.md
@@ -0,0 +1,3 @@
+# Version guide
+
+This guide will help you to add or edit minecraft versions.
diff --git a/build.gradle b/build.gradle
index dac203e..60e8e87 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,190 +1,22 @@
-/*
- * ================================================================
- * Saturn Client - Fabric Mod Build Configuration
- * ================================================================
- *
- * This build file configures:
- * - Fabric Loom (Minecraft mod development)
- * - Dependency management
- * - Resource processing
- * - Java toolchain (Java 21)
- * - Publishing setup
- *
- * All version values are defined in gradle.properties.
- * ================================================================
- */
-
plugins {
- // Fabric mod development plugin
- id 'fabric-loom' version '1.9-SNAPSHOT'
-
- // Maven publishing support
- id 'maven-publish'
+ id "fabric-loom" version "1.6-SNAPSHOT" apply false
}
-/*
- * ================================================================
- * Project Metadata
- * ================================================================
- */
+subprojects {
+ repositories {
+ mavenCentral()
+ maven { url "https://maven.fabricmc.net/" }
+ }
-version = project.mod_version
-group = project.maven_group
-
-/*
- * ================================================================
- * Repositories
- * ================================================================
- * All dependency sources.
- */
-repositories {
- // Fabric
- maven { url 'https://maven.fabricmc.net/' }
-
- // JitPack (GitHub releases)
- maven { url 'https://jitpack.io' }
-
- // Parchment mappings (if needed later)
- maven { url 'https://maven.parchmentmc.org' }
-
- // Player Animation Library
- maven { name = "KoSmX Maven"; url = 'https://maven.kosmx.dev/' }
-
- // Central repository
- mavenCentral()
-}
-
-/*
- * ================================================================
- * Dependencies
- * ================================================================
- */
-dependencies {
-
- // ─────────────────────────────────────────────
- // Minecraft Core
- // ─────────────────────────────────────────────
- minecraft "com.mojang:minecraft:${project.minecraft_version}"
-
- // Yarn mappings (named mappings for dev environment)
- mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"
-
- // Fabric Loader
- modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
-
- // Fabric API
- modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
-
-
- // ─────────────────────────────────────────────
- // Rendering / Model Libraries
- // ─────────────────────────────────────────────
-
- // OBJ Reading Library
+ dependencies {
+ // OBJ Library
implementation "de.javagl:obj:0.4.0"
include "de.javagl:obj:0.4.0"
- // SVG Rendering Library
+ // SVG Library
include implementation("com.formdev:svgSalamander:1.1.4")
-
- // ─────────────────────────────────────────────
- // Animation
- // ─────────────────────────────────────────────
-
- // Player Animation Library
- include modImplementation(
- "dev.kosmx.player-anim:player-animation-lib-fabric:${project.player_anim}"
- )
-
- // Optional: BendyLib
- // include modRuntimeOnly(
- // "io.github.kosmx.bendy-lib:bendy-lib-fabric:${project.bendylib_version}"
- // )
-
-
- // ─────────────────────────────────────────────
- // External Libraries
- // ─────────────────────────────────────────────
-
- // Session Java (Saturn auth/session handling)
+ // Session (Saturn auth/session handling)
include implementation("com.github.selimaj-dev:session-java:0.1.6")
-}
-
-
-/*
- * ================================================================
- * Resource Processing
- * ================================================================
- * Injects version values into fabric.mod.json.
- */
-processResources {
- inputs.property "version", project.version
- inputs.property "minecraft_version", project.minecraft_version
- inputs.property "loader_version", project.loader_version
- filteringCharset "UTF-8"
-
- filesMatching("fabric.mod.json") {
- expand(
- "version": project.version,
- "minecraft_version": project.minecraft_version,
- "loader_version": project.loader_version
- )
}
}
-
-
-/*
- * ================================================================
- * Java Configuration
- * ================================================================
- * Targeting Java 21.
- */
-def targetJavaVersion = 21
-
-tasks.withType(JavaCompile).configureEach {
- options.encoding = "UTF-8"
- options.release.set(targetJavaVersion)
-}
-
-java {
- toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion)
-
- archivesBaseName = project.archives_base_name
- withSourcesJar()
-}
-
-
-/*
- * ================================================================
- * Jar Packaging
- * ================================================================
- * Includes LICENSE and NOTICE inside the final jar.
- */
-jar {
- from("LICENSE") {
- rename { "${it}_${project.archivesBaseName}" }
- }
- from("NOTICE") {
- rename { "${it}_${project.archivesBaseName}" }
- }
-}
-
-
-/*
- * ================================================================
- * Publishing
- * ================================================================
- * Configured but no remote repository defined yet.
- */
-publishing {
- publications {
- mavenJava(MavenPublication) {
- from components.java
- }
- }
-
- repositories {
- // Add publishing repository here when needed
- }
-}
\ No newline at end of file
diff --git a/dev-resources/cape_creation_tool_v1.3.bbmodel b/dev-resources/cape_creation_tool_v1.3.bbmodel
deleted file mode 100644
index 6918472..0000000
--- a/dev-resources/cape_creation_tool_v1.3.bbmodel
+++ /dev/null
@@ -1 +0,0 @@
-{"meta":{"format_version":"4.10","model_format":"free","box_uv":false},"name":"cape_creation_tool_v1.3","model_identifier":"cape_creation_tool","visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":32},"elements":[{"name":"Cape","box_uv":false,"rescale":false,"locked":false,"light_emission":0,"render_order":"default","allow_mirror_modeling":true,"from":[-3,8,6.5],"to":[7,24,7.5],"autouv":0,"color":1,"rotation":[-8,0,0],"origin":[2,0,5],"faces":{"north":{"uv":[8,8,88,136],"texture":0},"east":{"uv":[0,8,8,136],"texture":0},"south":{"uv":[96,8,176,136],"texture":0},"west":{"uv":[88,8,96,136],"texture":0},"up":{"uv":[8,0,88,8],"texture":0},"down":{"uv":[88,0,168,8],"texture":0}},"type":"cube","uuid":"af762848-2927-8398-4982-bae7b24f659f"}],"outliner":[{"name":"Cape","origin":[0,24,2],"rotation":[15,-180,0],"color":0,"uuid":"91d65ecf-f78b-6339-d66f-548e29eb89d3","export":true,"mirror_uv":false,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"selected":false,"children":["af762848-2927-8398-4982-bae7b24f659f"]}],"textures":[{"path":"/Users/klestiselimaj/Developer/saturnclient/saturnclient/src/main/resources/assets/saturnclient/textures/cloaks/amg.png","name":"amg.png","folder":"Lurker Cape","namespace":"","id":"1","group":"","width":924,"height":714,"uv_width":176,"uv_height":138,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","render_mode":"normal","render_sides":"auto","pbr_channel":"color","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"2b83f02b-3d64-344b-bcf1-d698baf94d11","relative_path":"../src/main/resources/assets/saturnclient/textures/cloaks/amg.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5wAAALKCAYAAABeEl6PAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Qu8ffWc//GvKJdckss0xqWLoRmhcRuM0VwUijLuImVCUZQZQozCVK4jpjCGXDLulIbcu5AkRqlch2oShkgZmS7o/3gu/0+zWvY5e59z9vn99u73Xo/Hfuxz9l7ru77f13et/fi+1/vz/Xyv1Vq7smULgRAIgRAIgRAIgRAIgRAIgRAIgSkTuFYE55SJprgQCIEQCIEQCIEQCIEQCIEQCIGOQARnLoQQCIEQCIEQCIEQCIEQCIEQCIFVIRDBuSpY56PQjTbaqG299dbd63a3u13z/5VXXtnOO++89rOf/ax99atfbaeffnq76KKL5qNBqWUIhEAIhEAIhEAIhEAIhMBMEYjgnKnuWP3KEJW77bZb22mnndo222zzW4F5/g/aGd/4Zrv44p93E3pvd+s/aL93i5u1O2yxeVtvvfXaCSec0N72tre1t7/97atfwZwhBEIgBEIgBEIgBEIgBELgGkMggvMa05XjG7LPPvu0Aw44oLVrrdf+7QNHt4986rh29rnntvWv1dp1rrNee+Bf/1U7+ZRT2/9c8ov2v5de0X71m9budtet2hMf/fB2r7tt3S7931+2Aw88MMJzPOrsEQIhEAIhEAIhEAIhEAIhkDmc68Y1sOmmm7ajjjqq3W7TzdrhRxzZ3nzku9vNbnS9dv31rmw//dEP24U/u7Bd8otL2mGvf0N7y9uPbKd98eR2wxvesN30pjdtG9/y99qVG2zYrr/hDdvjHrFTe8h2D2infvnL7am7/2370Y9+tG4ATCtDIARCIARCIARCIARCIASWRSAO57Kwzc9Bu+66azv00EPbV7/+rfbM5x/Q1r/y8nbFzy9s3/j619sVV1xxtYZ86rgT26GHv6F99IPvudrnG264Ydt8i83b+je+WdvkD27b9t93r7bZ7W7TnrDLbu34z3xyfmCkpiEQAiEQAiEQAiEQAiEQAmuUQATnGsW9Zk8mfNbr4EMPb//6tiPbLa5/7fbV077crrj86kJTra59nes0gvONb3lre9/b3zyyohvecMN2+zts2a51w43bXk/erT1s+we1XXbdrX38o/++ZhuWs4VACIRACIRACIRACIRACMwFgQjOueimpVeSs/nWt761HfSaw9v7P/ShdtlPf9C+9c1vLVjQDW54o3bql77cXvKyV7aPfvC97ZJf/M+C+95xyzu2m99mi7bbE57QHrbDA9t2D3pQO+3LX1p6JXNECIRACIRACIRACIRACITANZpABOc1sHvN2TzttNPaYUcc2Y7+8DHtwvO/2845+5xFW7rRzW/Zvv2Nr7e9n/289vnjP92+f965i+6/+eabt022+KO25+67tTtusVnbYYcd2k9+nDmd18DLKU0KgRAIgRAIgRAIgRAIgWUTiOBcNrrZPfCcc85p5/7gv9tT9tmvXfsXP17U2axW3Plu92yf+cTHOsF5+pdOad/++lljG8jpvNltbt8Of/XL2xe/eErb8ylPHntMdgiBEAiBEAiBEAiBEAiBEFh3CERwXsP62hqb//SaQ9t2j3xCu+RH/9W+cdaZE7Vwux12bO955zvanvs+u337G2e10089ZaLjttzqzu3Od79PO+yV/9h2+ptHtFM+/7mJjpvGTre97W3bYYcd1u53v/utqLi99967vetd7+rKeO5zn9v23HPPdpOb3GTBMt/4xje2/fffv/v+cY97XDv44INH7n/xxRe3zTbb7Kpy1PfII49sd77zna9Wdr88X1S7vNf27ne/u7385S+/Wlna3t9nRRCWcLB2YXbmmb+9trA65phjFmRw7LHHXq3uSzjVknfVH16juAzrrfATTzxx0b5ecgWmeAC+u+yyyxRLTFEhEAIhEAIhEAIhsOYJRHCueearekbu5r8d9ZH2oQ9+sJ156ud/JxPtQid/yMMf0/7tbW9u+7/4oPbV0/6jnXTcpyaq5wYbbNDu94AHtd122aVteIPrtZ0f86h22aWXTnTsSnc6/fTTVyy4zjvvvLb11lt3VSFUDj/88EWrZf9tttmmES9EjTostBGlxGRto+rbL6/2IyR33nnnq46zz4477ti810bgrVRor4T/Xnvt1Yhg2zgO9hnVhpWcf3jspA8fllrvadZxOWVtvPHGyzksx4RACIRACIRACITAzBCI4JyZrlh5RcrdfMAjdm4XnfvNdvbZZ09c6J77PKe9/KUv6gTnueee+ztLoyxW0F3uetd2x63v1Q575UFt2wdt3874ypcnPu9yd+REeq1kIxqJR2KIYJnE7SJOS/gtJniJMeKmtoXq2y/PvtxVjml/6zuwPp9G21fCzbHLFW5c2r5Tu9J6OH77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a7+58sr2r0e8vR36ypf9zrzOzbfYvN3jfn/dnv93z2wPecgOU1kWZTi/cTlo+g7bJG7pMPRWHRZaGmToWo6aazlqTubQMR21z2qEZy6H30LHrFRwKnepYbZVl5rbSKSP2taW4Kw2LYXzDjvs0A466KAFD4ngXArN7BsCIRACIRACITCLBCI4Z7FXllGnjTbaqFsK5UGP2a2d983T2zfO+OpVpWy6+Rbt5a/6p3b/+967fe4LX2wf++Sn2yW//GW74vLL27e/cVb79te/1q64/LKrnXXDG96obXSzm7cb3myTtsF1r9eubK09/f+H2X7quBPaIS99STv3nO9edcw9/vQ+7a8euH2705Z3aE/9213bZZdeuoxW/N8h03DAlDbpPMw684477tiFqNoWS9YzdC0Xqm+/PGWOckyHGWan1fYVdcCYg6chOOsUO++8c9tvv/3GJhUaFT47a4JzOcwvvPDCCM7lgMsxIRACIRACIRACc0EggnMuummySh5//PHtrO/8V3vTm9/cvnXaqe3yyy9vf7Xdg9o/v/a17dzzvtc+cPQxndAsN/PH//3DiQre8MYbtZve8vfbRrfYpAuzJTw3u91t25Ofukf70sm/zYhrSZR99n56e+/73t+O+JfXT1TuQjuNmt+4nAL7DuQkbml/DuVSlkAxL5EjOdyGczJHZbqdZJ/ltH21j5mm4FRXLjIxzoUeZiMmNI899tgufJYbPG6blsM5TOA07rzL+X5c9uM4nMuhmmNCIARCIARCIARmiUAE5yz1xgrrsu+++7YXHXBg+5O/3L7dYoNftYf9zSPa9ts/uB1z7CfaV884c0E3c9LTcjqJz1veerN2u802bfs+7cntU5/4RPvIMUe3u/3ZX7Tdd9m5PXPvZ7Rvfv3MSYv8nf2mNXex70BO4hgK09xmm21+K57HJOvpu5YL1bdfXjVy6JgOE+pMktCI+FL2mthWI2nQmqj3tAQn1tNOxjRsvz5fKGTbvhGca+KKyTlCIARCIARCIARWk0AE52rSXcNlC6s955xz2mFHHNm2vtMftf847fR24okndHMzJ3UzJ61yuZ677rpru82t/6Bd8LOL2gU/+H573ateNmkRI/dbLCPspAX350RO4pYO520OE/r0zzt0JEfVd9SczGFCGUKGwO07duPavppLoIxiu5grPG2Hc9K+nWS/aQnOSc61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VDkEQiAEQiAEQiAEQiAEQiAE5oFABOc89FLqGAIhEAIhEAIhEAIhEAIhEAJzSCCCcw47LVUOgRAIgRAIgRAIgRAIgRAIgXkgEME5D72UOoZACIRACIRACIRACIRACITAHBKI4JzDTkuVf0vgtre9bTvssMPa/e53vxUh2Xvvvdu73vWuroznPve5bc8992w3uclNFizzjW98Y9t///277x/3uMe1gw8+eOT+F198cdtss82uKkd9jzzyyHbnO9/5amX3y+u3y/61vfvd724vf/nLr1aWtvf3WRGEJRysXZideeaZ3VFYHXPMMQsyOPbYY69W9yWcasm76g+vUVyG9Vb4iSeeuGhfL7kCUzwA31122WWKJaaoEAiBEAiBEAiBEFjzBCI41zzznHFKBE4//fQVC67zzjuvbb311leJx8MPP3zR2tl/m222acQLUaMOC21EKTFZ26j69sur/QjJnXfe+arj7LPjjjs277UReCsV2ivphr322qsRwbZxHOwzqg0rOf/w2EkfPiy13tOs43LK2njjjZdzWI4JgRAIgRAIgRAIgZkhEME5M12RiiyFACfSayUb0Ug8EkMEyyRuF3Fawm8xwUuMETe1LVTffnn25a5yTPtb34H1+TTavhJujl2ucOPS9p3aldbD8dtvv33zoGAxV7rOs9x6T6OeyykjgnM51HJMCIRACIRACITALBGI4Jyl3khdJiLA2ePwrXTrO5CTuKV9sUQUEoejtqGbJ8RzlHM6FF+jnMJJ9lkph+UcvxLhNi23k8DkBu+www4TN2El9Z74JFPcMYJzijBTVAiEQAiEQAiEwFohEMG5VrDnpMslQJQRmyudu9h3ICdxDE866aQurNW2kICsNnFNa37jQvXtl1fHDUVvP9zXPtNq+3LZ94+bhnBbidu5FFdz2vWeBr9Jyhj2/yTHZJ8QCIEQCIEQCIEQmDUCEZyz1iOpz6IEhvMbl4Or77BN4pb29x8n+oYiatRcy1EO39Ax7Yf7VhvHtV25r3jFK64213M5fOoYCY4WClOdhuB0nqW6nctxNZcrODngZ5111koQruhYDy1cB9lCIARCIARCIARCYJ4JRHDOc++tY3UfNb9xOQjKgRwnHqvs/hzKxZL1EAjKrm0h53Q4J3OUYzpMODSu7UsVbpNwW6yt0xKcVY9J3E4PB1aamXcp9U446yRXSfYJ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NvsltQqBEAiBEAiBEAiBEAiBEAiBuScQwTn3XZgGhMDaIXCta12rXXnlla3/riY+G7cNj6n969j63uej/l7o+3HnzfchEAIhEAIhEAIhEAJrlkAE55rlnbOFwDWCAME3FIlLbVhfNC732GnUY6nnzv4hEAIhEAIhEAIhEAKTE4jgnJxV9gyBaxyB5Yi+9dZbr93gBjdoN73pTdttbnObtummm7bb3va27fd///fbrW9967bJJpt0393oRjfq9ttggw3ata997eY4m3fnLbFYrqb3ev36179uv/rVr9rll1/efvnLX7Zf/OIX7Sc/+Un77//+7+71wx/+sH3/+99v5557bvf+s5/9rNvniiuuWLSPltPea1ynp0EhEAIhEAIhEAIhsAYJRHCuQdg5VQjMGgECjAD8zW9+c7VQ2Otd73pts802a3e6053afe9733aPe9yj+/+Wt7xlJyAvu+yy9r//+7+d8PvBD37Qzj///O7v733ve93rpz/9afv5z3/evYhA+zoHIUlU9s9XdSgxSpw6R70IV69b3OIWnbD9gz/4g64et7rVrbrX7/3e73XfX/e61+3K/p//+Z/2ox/9qJ1zzjntC1/4QvvKV77SvvOd73TCVH36W4le7+qULQRCIARCIARCIARCYLoEIjinyzOlhcBMExi6iip785vfvN3vfvdrj3rUo9qf//mfd8KO2OMkfvvb326nnHJKO/XUU9s3v/nNdt5553Vik/u42tsoN3Ixh5JwXn/99Tt3lTC9wx3u0InlrbfeunNiCVNilhP6n//5n+2zn/1s++IXv9g+9rGPdZ/1BWec0NXu3ZQfAiEQAiEQAiGwrhCI4FxXejrtXOcIVAirhleoqs/+8A//sO2yyy5t55137lxLIaunn356O+aYY9onPvGJdvbZZ/+OE6iMYZKgPtDrXOc6zYtQvf71r9+J1hvf+Mad61gvrql9KrxWefYXNkvAErLq961vfatzRX1OBF566aXdcZdccklXV5+PCp0dJaaHnU6QCv3dcsst24Mf/OAuHPiv/uqvOof04osvbl//+tfbhz70oY6Dv0uEVtuLafFc5y6qNDgEQiAEQiAEQiAElkgggnOJwLJ7CMwDgb74IqYe/vCHt/3226/98R//cbvgggva0Ucf3Y444ohOaBJ0JShLnA7buOGGG3YiklN45zvfud3whjfsnFGfE19EYIXKEobOUXMqfeccwmoJS68SbD4nOglBQpWgfP3rX9/N/XQc0frjH/+4vfnNb+5cS4KvQmeJUBvxWXM4hcx+97vf7UJqfWbe59CNHbqXZ5xxRrvLXe7SzT+9+93v3gnxP/3TP223u93t2kUXXdSF5b71rW9tn/70p7sy++J7Hq6F1DEEQiAEQiAEQiAE1iaBCM61ST/nDoEpEejPRaz5iE972tPai1/84rbRRhu1E044ob385S/v3kuAEW/9JUz8zX00R/Kud71rJ8LMlSTwzIskvoTUciCJQKKSYDQvc9Q2aumT4bInwyyzNZ9UeTvssEM79thj28Ybb9zNCV3oHASrfYTSaithShgTwz4jZrmnBCwBqv6SDf3Xf/1X52oSlA984AO7Ng4FN9HJCd111127eazq9973vrf927/9W/vc5z53lRPcb0e/npMsETOlSyDFhEAIhEAIhEAIhMBMEojgnMluSaVCYGkEyu0jJs1d/NrXvtY+/vGPt2c/+9mdwLKNWi+TGNtqq63aX//1X3fhtTZiUjjpl770pe5vruOa3Ii6v/iLv2gvfelL25/92Z9N5dTKvMlNbtK5shIhcTOJSU6t9hGV2267bZdYaBg223dE8eIKH3nkkV1YMjfX/NZPfepT7fjjj79KgJaYj+CcSvelkBAIgRAIgRAIgTkmEME5x52XqodALTHCZSQ0hX0Si7Kycu2IycoMWyGvwlW5hw94wAM6gATpZz7zmfaNb3yjcwFtJbr62Vv74sl8TGLNEiheN7vZzTqXkcNI2AmPdZ5yLAlioa/cUucoEUcgE23CbzmMXgSccF/7PeQhD+kc2Zq7uZQeX8g9HZUQiLB9xzve0dXrda97XedgcnBLqFdZ5nS+5z3vaU996lM7cfmc5zynS7TEKeUIl5usrBNPPPFq4bxZM3QpvZd9QyAEQiAEQiAErikEIjivKT2ZdqwzBGoNS2KOGBP2etxxx3XOnRBSoa+2f/qnf2p77LFHlxCHUCIwZaIVNvuRj3ykE5kE3qhw0BKXyiNaOY6WIJFwxzHmY5onaQkUYarO6XPitsJs/V2JgZyfO6jOhKf3CsUlXglUobEEqTmir3jFK7osufvuu28X3ku82se+9jOXUpitpVi++tWvdkuzcGOJ1/7WDzVeKNFP8VRHovnpT396e/SjH92F5J588sntne98Zycea64rzkcddVTbf//9u8+F2xKo6qJd9773vduee+7ZzQN1DNYEtLmlfTGfZVjWmVs2DQ2BEAiBEAiBdZpABOc63f1p/DwS4BYSmoSksNl73ete7TGPeUwnOl/96le33XffvRNoXEHCyHzG//iP/+hCQQkjzhxhVIK1n2BIkp6//Mu/bDvuuGPnXMpY+/nPf747ngAk9iwvYp4kQcbNdC51IgaJKILW/8olEglLn9V7ZbT1mX187kWIErDEmky6xNoTn/jEbp5pZbDlJKq/eipHG2SaVSfimCi2OcY6nNpsORfzNUswlms5DHdVF3WqOa7Kt1yMJEJcTO0z35N7ifs222zTZbh1zic/+cndubifEjIRl8rBcO+9927PeMYzujZahuXQQw/txH6dJ0uwzONdmDqHQAiEQAiEQAhMSiCCc1JS2S8E1hKBCm8tMeT9LW95SyfG9tlnny4EVCgnMSas9mEPe1jnEBIyEgfJTLvXXnt14myYtMf/5jU+6UlP6sQTwffhD3+4S4hDXN7tbnfrnFMCUNgs4cdFlHSHw3jhhRd2bmeV2w/F9RlRRYTWe7ma/XqU8CTwlG8uJHGorAc96EGduCWuiUzCkqPr+GoPMcldVBdzMJ2PKMWEGFTv29/+9p176VzqToQK3XWsc9aGWbmvQyHIoZU46HGPe1wnQPFR1/e///2d2JRsiaPMRfadUGVhykQooYkz95aYN2eWI2wuqIcAHNoSwv06ZA7oWrrpctoQCIEQCIEQCIGpEYjgnBrKFBQCq0OAECOivCQBeuUrX9kJTq4a1417xokT4mpuIQHjO+LHXE3JcAigctSU4ziC9bGPfWw788wzu2VHuJnCQXfaaae29dZbd47mKaec0v7zP/+zE3S2Cp0t4TlqPcxaZ7PW3HRcOZ5FqOaTeidCa71NIbRCgc3fJPDUu0SqcFuOab04mo5XT24rUUyMEqbEn/YSj4Tx+eef37WT+DT31OeENAdSmHCtRcrNPeuss64SoX3ROUwE5H/hvgQ+jtrwgQ98oJ100kkdL0Kf2ywc2WcYW99TCLKNeCZeiX3i2Hf//M//3NWzxKf3iM7Vua9SagiEQAiEQAiEwJohEMG5ZjjnLCGwJAI1r5B4I+o4fcJjrRlpLqYkO4QKt4wraSNq/uiP/qgTL+YPEp6HHXbYVaKNcJOZlaAj3l71qld1Lh+B+chHPrITYcJBlcMtdI5aM9N3hBqRRPARbkJp1ZPA497VXEzvXo4hGMv1VEeirEJX+2KzHFCJeuzziEc8onMprX9pvqa6V1Ih4pCrWnNVzbfESaIkdR+uu0kUbr755m277bbreBDgODiXdhLa3GEuqs+JbcLVZzL1ClWu+Zfa0M9i2xeEPseS+CcyKwES95MrLAGSuhKcHhi87W1vu8rZJMjVTxIiLrXQ3de85jVdOHOJz6HjGiG6pFsqO4dACIRACIRACKwlAhGcawl8ThsCixGoOY+WKvnyl7/cOX7mahKXnLzKKkssCSMVsinTKuHosyc84QmdYKw1KM3LPPjgg9tXvvKV9vznP7/d8Y537JxR4vENb3hD++xnP3tVNlv1IkjNjayQ1C222KKbC+pzjiER6CX0lTAk3CobbiUOUmd/E4AlAvuhtyU8iVKCS12VT3A53wc/+MGurYQucSsktuaM+v/b3/52JxKJQQy0ifA1v5IDS5BiQVgLbSWuuZf9dUOJ5S233LILHRa66/z25YhyTpX3J3/yJ52Qx4rb++///u/dnNZ+0p/Kxus4fVbO793vfvfOSb7nPe/ZcVNn+xDABCiX1oMB4pJgro3TvN9++7X73Oc+3THWULUmaQnemvuauygEQiAEQiAEQiAEZp1ABOes91Dqt04QqMQ9/WVEPvnJT3bO3XOf+9xOBBF29ithJoyU20nIWBOSqHz84x/fLY1iH6LHZ8SMuYISCsmoSoy+733v64ROf41N5ZljSGTKTCss1dxCy6xwA71KbCp7XJbVviPXT0xUHVrfD78TZuqcss/2t2q7euL02te+th1++OGdw+ozwpQA9TI30z4y12oPUUlo27bffvtuyRjlE46SC2FbG1FL6BJ9xCOnU3k13xMjIpQLar1TwlhZlkXxTpgSvNW+EtnErP7QB1xogp1Q11ccUYL3Qx/6UBcyzRWtTWiuUGoutwcOHhwcc8wxXahtOeF9tzPO5zrxk5FGhkAIhEAIhMDcEIjgnJuuSkWvyQQqcQ4n8IADDmgHHnhgtzzHpz71qXaLW9yiC7EsAUMMSvBDhBJa5gZy3Z7ylKd0IoSDx0HzGVFJoAjVJGpe8pKXdG5obcQOd4976Z1zKIzUfFDOITeOuFyTmVSf97zndfV27oXEExFGRN///ve/2lIo2nPf+963/d3f/V172cte1s2vJF45iQQq9/QFL3hB5zqWcOReck+JzvPOO6/jw1WskF2s8OEwC88lKLmR+ODCjfUyj/PWt75157Q63qZfCfO+s1tCncB8+MMf3rVBmSX+iWPlcJ21ocJqlafsZz7zmV3oLgf2pS996VXik8CuxFIRndfkX4u0LQRCIARCIATmi0AE53z1V2p7DSLQXyOSCJH5lKtJbHIlDznkkPb3f//3XYvNLeSOSXBjnqIssu9+97s7h5NgIT6JDS/zMM0f5BRakkNGVC6pzKwlHM3F5OAJm5XBVdgu94yzxnUr58y5xzmZ0+4SGXaJwpo/Oqp8S6cIdxUuW8udVJ2F6BLNXEzOr9Bea2lyaP/xH/+xE3JEneO0VZgsccu9xZlgJeo5p461FifBX5lk1cdDAOGy5msSd76X3Rf/f/3Xf+3muOJpDqp5t7X157OWKKyMux4IEK2cZQK0zqNOnFgPC2TFrY0LK+xWYijn8qBCOLFtlKM87X5KeSEQAiEQAiEQAiEwCYEIzkkoZZ8QmCIBoqOWviCquIqywXK4iEcix/eEBydOSCcBye0kesz9E1Ip+Y9QywrDlUSIKCGEuHecwv33378TX7UPISU7q30kr+H+mddoqZBZESnE9rOe9axFiRNaQlwtSTJKEAsb1k5CEFOcbO9617u6dTVrI1qJeKKbSJTsSKgrEWr+J+7CZ625aR+i9IQTTuhcR9/Vph4SOHFYJSbiLktsJMzWgwR9Soh6WGCra6DczyF7TqZ6OrcQYd8L4fWgQJ9xNl0PJVoJaA8nHvrQh3YPH/ritM7lvH23dYqXdIoKgRAIgRAIgRAIgQUJRHDm4giBNUygkuUQm4QBocBVM/+v5l6WW9cXU+YoEhkcL+6k8E9igjDlfHHvzAHkcL7pTW/q1n+s5EOS1ggdlYGVYCGmOHfmGtY+sxCGSfBJkGN90cXCeDmgkgDhMdwwsV6mJWI4trW2KPdQezmRxXWYQVdZ3EUhtHiZ/2nDy3xNYbdCa4lILqclTCTzIdj1p+RH5oh6MCAjrfZwj4XYEoWSOknmRJRWaPNQbPbnZeoTgvgxj3lMJ3rN/SRAzQf1OWHsGrKkSrWJSH3hC1/YXVPO7e+aDzsrDxXW8C2X04VACIRACIRACKxFAhGcaxF+Tr1uESBuKmss4UfwCQl90Yte1Ik+4qJeyPjMZk4mwUFA2pe7VWLMuo1cNGKE4CRCrL9ZWWEtj2K+I/HEyfzWt77VCZ1hsplZEJvaSkwJU/3Yxz626MUhAZCMu4RWf8PYS/tf/OIXdwLwH/7hHzoxZl6opErD9TQdP0rc9j/jfpr/iaON2MeS6OSgCmv1vezBEjJVaKt9hb5yXNVBaCwBTBBzRK3X+S//8i/ttNNOu5rr2a9jJQfyLqHR3/zN33THqpP2+czfMvUKqyWAqz9lLjaH1zVgjVB/O3857HV9rVt3YlobAiEQAiEQAiGwJglEcK5J2jnXOkugnDQiUlileYaElTDacjX7oq9cR8lsCAguJvHIOSMWCAihnTKXKsOajkQNx8vG5SJEiSDuHKHD7avEMrVsx6x1SIX+YrLYHM6+4BzOhcUOWy4wJ5ADaK6qZDuSCS1nGzqDkhBJsoSvMFuZgc09NVdUQqf3vve9nSPaTxqkPhxTotWDAf1KaJpnap6tMN3Xve51XbKivnDu17ceTBCv3FMuKgHK+XRNeXHAZd41F5jwrevqUY96VPewQqIp4dhc1koI5Ryz8tBhOf2TY0IgBEIgBEIgBGaXQATn7PZNajbnBMpF9M6l3G233bqMspLDlOg04C+RVcljNJug+Nu//dtu3h+HjjNVjpvPCAwC4h3veEcXIiubqU0o6LbbbtuJjkoCJKyyhEoJi7UpLogicxptfde3utv32ir8tfbpO78+GwpOgnz33XfvMrdyDDnHkgM94hGP6NYb3XfffTsRKLtsfx3OpV5ifXHbr5OswM5L5HEbOZicR/1maRb7CnMW5lv9KDTXXFV14r7ahL8So9xqYdL14KHq2T9/ldMXn7LeSnbE+SRILevCjRWCLPxY24Vmm9PKCfcAw9+VjKic1Sp7bV4nS+2b7B8CIRACIRACITCbBCI4Z7NfUqs5J2DAzqUjrAgQc+gIIIlghktlaKr9iQQC1HIZMtBaGkOobCX0UZ6QTS6mJUGIKKG2sq1yrcwPlFiGUDO3sAQL0bCmM80u1H3ayLnkBFpKRJIbyYsIMWGpBA/RhIP1LbXnwQ9+cNcmYqnaIRkSIS2rr83x5nSaq8oplNEXR0uXCM+1JAoRJwzXHE3MpiGmSgBK5kO4eXGfJW3SJ9oiodDb3/729oY3vKE97WlP6+pbgo4wdoyMwlgQxeaYmseqP4VeSz5UIdILce3P+ZWEqpxPf+MmVFmdZCrGgfPp2hTuSxRzyoXcErxCc/WTbdx55/w2TfVDIARCIARCIATWAIEIzjUAOadYdwgMwzsPP/zwTmQKb+U4VvhsEenvT2wRTsIdX/nKV3bOpo1wkrmVi0aoccy4gNaYFDpKqElIw/WUuVUG2xJms5iVlNNHOHPciEbtIgoJS2KQwCI27Wee5Ec/+tEu42w5wZgQRjL7HnfccV1bucbmUhKmEvsIMybY/c/9FPbK7cObc9wva5Krsz+fc/i347mJ+Fu/1KZOxLKlWLbbbrsuw63waCGtfcF56KGHdg8OysnUn0SohD9YeHCAzyRbhW33nU91cmAWe4UAACAASURBVP0Rs64ZAlI9iGIhv0J4ZdSVCVk9zQl2jZor7FqzjZrzOkl9sk8IhEAIhEAIhEAIdOMeU3eCIgRCYDoESlAa0FuOROIac/sWmpNY+xOkr371qztxadkTLqZ5ghw8y288/elP79yp2kowEVkS5xApziMDKsExK47mKKrcXvUmcvx917vetXM5OXucTWtsEpo+50QSXdy5vkjkcJqTWmGi2oud8FGOHZeOS8w5FHose681N81n1TdCm5eyYUoUluNXArGS73ARuYL+r7mn/e84q+rcXyeTAOQ2Puc5z7nauqfaoc4eOrzxjW/shLfjl7P1xTEX1jI7XHPhvvjbzA0Wiuxclo2xLAwRLNzXsjLq52GJ9nGFVxKSvJw25JgQCIEQCIEQCIH5JhDBOd/9l9rPCIF+SCPHiOMoHJLTViG0fRFYrpGQx6c85SnNupLmY1o70+Z/cw85XTXYN9Dvh4GWABM+KRkOJ4ugsi3VwVtTGHHiRkpYYy6qUE4v7iaXU6iw0E6suJgEmjUpLWnSF0++I8oJTkKy+HMDH/CAB3RuJpbcXgl0iFPuI9FEcB5yyCFLanLNOxWaa96jkNdyFIXOmisqcZN6WDLFnElJighnYauWSuF2EnTlaptrSYQ+97nP7erC0ZT1VtIhLre+NrdTOf22L6ni/3/n4fIv5vhat/U+97lPtw6stTs5wxIQ+d98VO2RzMi1RZC6JiWfmuXrazlsckwIhEAIhEAIhMDqEojgXF2+Kf0aTqBcLc6cLKSSAckWW2tgDp1GjqbPuGCEiTU4iSPHcPJsRBRnSVij8odCs4+UkCBuCTJZU7lTluUgemdxKyEs1FNosHBXPIgcrqRENsJThRATX4SOJDdCY/ssiTRCkhg3d7MS+GDG5eSYEn2cYW4q55erKbEQ17SS9BQj/eLBAGFJ+Ak7lbyHq2zpEuUfddRRnUiWAdi+wmN9TkRqB+dQ1lrsXQvEvzKcz0MByYE4lfpUmzi4xKWyhLNW2LB9zPf8yEc+0mWs7SdZWmmflthVTj28kDXX3NKtttqqc9PxJKrNP/XAwwMAfaUN2AgTJ7ht2qJflBvnc6W9k+NDIARCIARC4JpJIILzmtmvadUaIEA8lfMkQQ/HSuZRA28iYrj0SIXV3vzmN+/WgzSX0BxE4YsVWstV+tznPtfe8pa3/E6G0lFNqiyvQiVlRiXYiCliy3zOaSTGWQ2UwjctCcJJ03Z1FRK81157dY6gjdAh3M3nHLbD+pLcTKGh3NJKRnTQQQd180Il3Hnyk5/chaYKGSWKuHiOIeD877x9Me8hgP8vueSSLtzUOc0fJRRt3FLzas3HVCbHj1urz31m/i23kzjmIHIpd9ppp25pFtlriTkPBXxH5Hk4IMMwYWpOq/BiIlo9yrEdZueddl+UAC2+Qpf32WefTgxzM7WfePe/ObEEMLfW/69//eu7kODKJtyv20od2Wm3M+WFQAiEQAiEQAisPQIRnGuPfc48pwT6GWU5VMSC0EPisS9iahDfn8tHgHCzZFMlNE8++eTO3RN6a9kUAkkSoHI2S0gpy999B47Y8r8Bv3Baokf5HFNii+icxdBaPAgvggYvbSOyCBlrU9ZnHDehsMXC5WLfEjMcQCKP+JQJ1jux6l2Yss0cTkKJOJLR10MAoomQmlTM1ZIynFICmfspXLo/T7Tmi1Z2V6HAnFFrbAoJln2Wgy3REffwjDPOaB48EL7m+tr6IrPauiZvkf4an87LyRXyq6+EO0swJCy4svByRQlUIp0TbB8czjrrrKsetgzbNOzDNdm+nCsEQiAEQiAEQmDtEIjgXDvcc9Y5JdCfq0m0CI20BEcJoWEIbSWX4aztuOOOnSNmrhx3s4QTB8wgnevnO+GU/U2opkE/Uap8osnLQN+LgOK4qQfRRoCaC0nszGKG0Wp33wUrTpWltr9PsRi6nNhzEc19xUX4p/mcHE5zJ4W5WnqFuOcuWl6mnGcshfUS+144OTcRz6W0lA3xKmxWiLONgBQiK+SXOyvElOj10MC8UY6nhw7CT2Xa1Y+SFTle6LSkUCUstcXDAe08+uijZ+5uGDqfd7/73bvkQcLAXasSGn3605/u6o2j61PWZNcf5q7JE044ob31rW/t3l3XtQ3LnrnGp0IhEAIhEAIhEAJTJRDBOVWcKWxtEhgVxtcf3A6Fzriwv6HoqSylMsoSNcJfX/ayl3XCpuYNCsfsb4QM55LLRpTYn4tH1NjXAN7yE8Iszb0U9knEGMAL0fUykHecY4jTEr3eOYOW/DDQv81tbtMJWpsQTnMLrUM5am5dv+3jOKypPhVOS6QRksSfl/ZbQ1K7vdd3hKF6E47bbrtt565xhzlswlV9t+mmm3buofmxBM+tbnWrzl3EybxKxxLn9bcwWkJJCKlwV06rcF7JiWyy6JqfSXxx+swXLaFKaBL9+tjSIh4o2N+14eGAhwmy79YDAOUJqzYH9cQTT1xTiJd1nv5DFgVwbCW0Iphde0KaXbt9UYm9ByzY44UB8U2kur6J8uE2nF86K9flsqDloBAIgRAIgRAIgasIRHDmYrhGEFgsdG9UAzlMFW46KuxUeQQm0cMdq8EvN4pINGeSYCSCDKZ9z2UjjGxEHtEo7FJoIsEp7PXyyy/vhAyRQ5j4XwIWyXEk/yFoCKhKLOQc/fMv1Fm77rprdx5hutpDFBBgldhmocF9n8NynCdt8dJuzh9RjIl3YlH4qe8qHNjn9hMK7HzefWYJGOGZ5nL6nuvoOPzLySUQ8fJOGHIR/Y0Pseg75ZlzqSzLiXB6hRdbasT8SK4k8VeOqr5zXC13MoqvfdWfON177727vjK/tLIP+875uJ54+ttDBqJfHbXngAMO6BzC/qYs7h/HcF62oQh0XQutFbrsmhXaLDmTBx39TTiyhyYEvzVBXaOSIwlRFilQ65f2xe0shoPPSz+lniEQAiEQAiEwSwQiOGepN1KXFREwQCUCKtso8dF/GfgTMASO0EjOlUQtw6QnBr3KIiRki+VAEg7CCDlX3Bzz75TBybG+YYkP+xFKsqIaREsyI7Op5DeVrKYS2BCJkq+YJ2fepc+FX3LphCUauBNJtVk+hBvmHP2NY2ceqZBPTme5rNxCYmC4FSNCsZzECiX1vxDJCi8lHnHw6otKgpAQtJ99yoUsMV3LcGgTQYdHvThh/ibytMWLw6t8CZNs2mAf3znei7D0ObGu3BLl9ne8rKqy2+oTgts8S31F+GHN+eS4mds6FE7j3DTtKQFUIl3765ojXHFVTiUiKvGkbs9//vO7+ab9zRqt+oiAncetkmaVg859tjwMp9q9QUh74MHldb/0Q8VdY0LA7WvOrb43X5eQ5wx/+9vf/p2kW8Wo5jXPI7PUOQRCIARCIATWRQIRnOtir0+pzf0QOEWWy1d/T5IhtcQMMWYQyuny8reXpTG4ZPV+y1vesgurLKfMQLWEUCWXMQCuuY7+rvmOBI4X0WKuH3fG3Er7CImVMZTgkcxGKCYXk4AiDIgdQqbcTG3su4NDpNzFZz/72V2IpWNLrCiDs2MQ/olPfKITtLUOozJ8Zn1EoYqEUc3bxJbYlXQGK+dWN22RZIhTZkkW32kbIVhLjhBCzo8Zdl7cR2WUw0iM4+A8wkmJcCKPk+hvwk87vAg+L/uW42if4mxfx5U4LNFY+4xyE63/+LWvfa0TGkvZKrsvTq4T7bJuJOHu/Hhx31wbRDVO+nnShEHDugyFKaH9kpe8pD3rWc/qdh2GbeNOCEu0Yz9bXQvWAvXqh6Iupe1re99RYdn9z4TSWpZGYi2h4gSoOZ3+Hm6uSXNwRQG4Z1y79dDG3FvXHWHqIQ4HedxyQWubTc4fAiEQAiEQAiHwfwQiOHM1TERgnANUhRAuJWi4HASdwSMXkGgU2uh/+xg02t+rvzB9OVoESokdAsZgU4iq+XNEVYVSEhYlcIimvhNGiCy2jqV6EynqaW4m14UzJuOrNjs/oWLwy10U8ipkk5sojJM4K6eNiNEWDs3nP//5bskI7hbxZx9C2gCccFRfjhfxyXnjGFqH8SEPeUiXXKbW8dS2cs4INcw++clPdvPhMK31I9VdPc0JdB71ImTUVfv8TfgRisrULuXio20+V34xr5DVCjf13TAhUv/CGeUYDh9CjLrQ6jjC6+CDD+7qMsmDCmWV00VUygLLiVYGYSd0FkcPI7SJO+26sfRKhdNOdOGP2UkYtAzF1qZcSJy+/e1vby984Qu7a8z1gCNXk/vswcRiXKdRx7VRxjDjrWvSXGTXPg4iC/QPZ75EuPc+C2Ke04+d+8qDBKG5IgbcU67N5T44WBtMcs4QCIEQCIEQWFcJRHCugz2/nOQc5SIaMHsZCMriSSwROptsskmX2bPCNcvtJG6IH0JCMhYO1vnnn39VyCSBRLwRRCXcCMZy2HRPCZD+4HJSUbJQ9046X5EQ1s5KgEJgOJabxxU99NBD22Mf+9hu8EvQyYhKEHJnOTWEXC1pYpBMaHA5hR5aM9JG9Gk/kSe7KnFnkC3c1sC86lpMJV3hupawxFYZzmXuoMytNnVUDuG7kq3v2vXLGdUHQ66TPqggPmRynXTeHmcWc0LTAwVCHk+JfLysJVkuWC0dw702/7bWQ53GNfTABz6wK0+fDMvTFqKJCPbi4JnjWJu5u313eyV9NGvH9rMj9+dlVj25n+YbP/jBD+6cT2Hlsv2WUPVwCi8PYiTZ8hti8zvk3rHWrOu/3GG/HZNea7PGKvUJgRAIgRAIgWs6gQjOa3oP99o3DPfrN52DIFyVcJRt8w53uEMnKoUCViKYSohTyVrML5TkhXNk/lUJSS6kkNBKyOJ9Wi7OQk7aOPFAdFSmU2JQ+KW2Gth69+LIcgMJaCKCgMZFRk2OKlHHkSQK/V/z9wg9A2XHcEHNQyOsMSG4DYoxIrjLZTTvktAud7HCgHGSfEbYoIG1LKm1lZgjUiRlIV76g3lttL6j5EHEmDKtnWgeKRE/i26Q+uPIgeRgTSI4K4z2s5/9bOdkCrXUf0cddVQXhmxeIBauu7ouzCXETL+b5znuepn0Z4HQ1ecVptvvK+fQLg9VXFdcUK543QuSRsn2uq5tw4cSHqy89rWv7a55CZ70YyWZ8vsj87J7Ud+5rt2DROqpp57azdV1r03TtV7X+iPtDYEQCIEQCIHVJhDBudqEV7H84RzKWgtyocG0QVytmXePe9yjW65AeJvlIgzmDNpsxJTwVQ4eV4jzZkBt4Mx5JJ4qc+hC5+rXbeioFpJx9R2iq/maBLD6SkRCJAvTrTbU3M8SjZVhVH2Juwq9NfAnJCtMl/OoXURlhetWUpiqJ6GjLRWiW4lr+vU0P40IOf7440f2/NAtLH594fjMZz6zC+0lkojWoVjHgdjyYMBGYArP5QYZiEuGJKxXmRIN4WStylnc1JH4NndPFtNxLlWJTaGYxMl2223XhVl7EegcXftgVv3nb07oYx7zmE6ke5+W+Ba+S8B6qFDJc0pEb7XVVs3cVOHVXO23vOUtV/Wl65ITzYmtbZ5F06h+G9eXxUlf6CP9ZikfDxA8tBEOjqlrveZx9gW9h2Lf/OY3m3Vq7TPP/Gbx3kydQiAEQiAEQmBaBCI4p0VyLZTTn/fYFyU+N7+PYyBkjbg0J7GWqyAaCS3ChDvAFeNWlgDjhi1lLl1/ENgfZC4mRommWg6Dy0gwmtvJqZKxlZCsDKqVIZVjVclr1JWL6lWi0WdEIzGp/vbvu1yr1UU1l/DMM8/sspFa5kEfjFr/clwdas4hV8fcPwNtItlgnBAWRkhACuHkvhIyBt2vf/3rOxaYcTWf8pSnXLVG5Kte9apuvuA4ATCubqvxvTrd+9737q5PS5gsthVnAo6QK3eQ04WJhDQVatsXcY985CO7f4nO3XffvZ199tld8qCVuJzF0pzQ5z3veV35dQ+Wuyr5lKVxONL6yEOA2vSdUGeJpfobAY2He7SEWN3n/q+1YCt0neNnc33YhGPXXGLfVZ1cV/7v/2b0Q9UdW/N73TOV4KnuIcf63v3n/uLcezkfFr6rrcJpKwR80uumBKNkXvoYVxmbsSoe/d8af3NAPWTxgEl9lnPPTVq/7BcCIRACIRACIbA8AhGcy+O21o4ahqMZSJpTKRNkiUuipAaYwgjNAzSAI8j8b8DIEapMrsPGLORIjmu0ASMRKfyt5nkaEBK/BKR6VZIbA1kDxEq8w01VP+8lILlGHMfhsiWj6jGsc/3fH/QO2Y1rzyTfl/A44ogjOgfYeosEx7gkOwuVrbxaYkX/GLwbcPvbkiey2grFxVECIw7m0CkiPomcSpgkyQpx1hcgk7RtTe0jBFZY6mLrUZYY4bhLrMQZLKfbuprEXd/ZVPcKzyX0dtppp46rMPE99tijmy86jY27KUNt37km5IRCY27dSWG1kjzpu9qEb3soUJlrfV6iscoqF3bUHOaV1L3c9OF7LXNSWY0J/FpiSJKvfqIe13g5/jUH2feV1dj9XfOXJxX2dR2rh+OPOeaYro8lZSpnu9/uuiZkIbbkiuiGuJwruTJybAiEQAiEQAisDoEIztXhuuJSK3lGhXD2B6rbbrttl92Sc8nZsRFrHDbLanAtCbkKQyPc+qGbCyV7KUFWQmcYdlghuRxIYZwSBhnAq4PBHnehQm4rzNF8REJMyKrBqEHoKBdiFt23SToRE6HJBKcss9NYI3AoXqoeHigYgBMz+sYgm0NmwN/vXwmODP45ej6XGZSQP+6446Y2l3YSNpPuQ6QfdthhnUM7FBTqX8LRUifCaAlUiYG48rX0y6gQWfcQt/Be97pXl9zJPriY9ydU2Vaiy99LmWfsOA8ChPCaN1oCV12dk0NdyZo+/elPd+LS/Vj9pA6Ws6kET5OyWtv79R/sqMuosHiRFB5ucB39LvUf9Azv8+F3VWbdR37nzH31wGqxjdPsIZdw6YjOtX2V5PwhEAIhEAIhcHUCEZwzeEXUoMygS4bUXXbZpQkLFD5pMMWlNKfSANzfBJ0sjgbstVRADYBrQDjpkhYGzOZHysZK0BKW/iZ0lCVUVXIgjpJ1E4UncnGE4Y5aX3E4oFxqmN0Mds9VVSohhDnxob8qxHGa9S5RZK6jzJ615qN5j7gL4a3+tS93m4AjzmweCAj1nZarN822KatcwmG52lIumzl9nFvuOQH35S9/uUtsNe4BhgQ0wm+rr/pJiXDqJ7TyHeeuHx46DNGtOqqb+9EamzLs2kokuS89FCpXzkMB4cLEVwlODylkNP6Xf/mXFYX2TrsvxpVX16LrreZH17I9Febbfy8XtNbbrffax/f9tXgr+VYtl+Q3zdQAWWyJSv1fURKOUx9zl00LIPA9+PIARr9mC4EQCIEQCIEQmA0CEZxrqR9KiNUAuAai5i898YlPbE960pM699DgSVZUSwMIJ+RUcS997t3Wdw2GDkR/gDwUnQZvBr6SdJhrZgBtgG2QR0jKBikM0PyzflKU4Tn75+g7HkOnbl5dzH77+kLe3+ZGclb222+/TtSUoB46ypM6n9V/NVevmBl0C401x6/m18p8euCBB14lQPuXMnGmTubccZTNB911113X0tW+8GkxszzIc57znKt2qjmAGBAQRJmQ249//OPdtSo0m0jtL73h4Lr2qo8kVbK/OazVH8r0GRFKuHu4olwCRegmsUkcOq/7wDIzC2XO5WLqn0oQZT+hu+UuVxZj95h7WHlVD4LUubnQ87D1habIBvNl9YO2VgiuCAYPpvxWmJddD6Dqvqi2V7h5JR7zu9QPH/a9fvDwRr/YzzIo3E4Pt1zTNbdUaHIliPKbZSkVzvEk2Y7ngXvqGAIhEAIhEALXBAIRnGu4F2vgVgMsT+vvd7/7dXPuZCb1Offyfe97XzfI5ooYwHnVXMa+a7hQ9fvizjmIIoNc6xByLLkCBsCyqhKyX/ziF7slTgzmhgJr0jlYaxjlGj/dKMFsACzhUd+l4ZyZ8ya0kID3tyyak4RsGih76ODBgnBR4bEEEhdb6GbN76yw5De/+c1dhtp+SKkyDLoJUlk/bRKwmPPJlZ6l/jS/l2gnnGurxDZCty0dctJJJ3WJkMyFtP4ogcrR5/b2H7BoFz6yFgu3/djHPtbNay6xX6GW3DAs8CQE3XfEn9BNgt45MbVhSOCP6jsClYPKcSWKhbMLka3lXTzEIXrNs33oQx96teuV+HfuU045ZY1fx8s5Yf1uWcJEkiYPMyReEu3gehUN4YGVsG1C3HVJjPre/eFv90U5o67fmjagv/3umBLA2SRkHVP7OMbvnyRnwtaJWd/53eLauzf8vj3sYQ/rBKf7Rgj/JPfbcljkmBAIgRAIgRAIgaURiOBcGq8l710D4hIrBsUGXhLAmIe29dZbd+szSiriKb5BFWEpVNJT/IUcy6rIUDzY3+DLwNmi9OaKET1Cbw3cDQiJjlowfSgu+w0cNT/L90PBO+7/JUP7/weMc277jtZCPMadux/Cp18MeAlETo1QVOyI8wqZ9beNmCTWiR+hfIRThWdyZiohEqeG88MpntTh5apV9lMPAThoJaYMtMtF9c6l069f+tKXrubiechgjien3IBeFljJVQi2WdqIaderbKR1bREKQrkJP8KFA3nQQQd1yX70B7FpHqfvbPrJtf7Yxz62WyLDXElumDYLN7aV40VUcoqJQpEEhClhq+9PPvnkTnzKBkyQmgtNqGM5vM/09QMe8IAudNl5ypE2d1m93M/uMWHNBJL6VvuUJcxWpmHRA8N7atQDpeHvQM1tHTV3dTX6t/ipr3VdLS/jXhDW7aGLewFLAtC79tu03++Ne0pURmW1rfcKfdWvBLz5yR6MffKTn+weFNhcD+ZwelimbPeD+hDyBK177/73v38nfPV3hdZOGlWwGrxSZgiEQAiEQAiEwP8RiOBcxavBINHAqNwoAynzvYRHcrAMfoXUEZz2qblj4xzMvnDhwHiqbw1CjopBoAGgp/8cHm5O37VcSXPH1atfdl9oL9dpWEhs9wf/9iEIShQa2EpWIiTSZxX2V3PFav8K4yvxZuBLKNZLuDIHmLtFPOobDwIq86v9DWwJvaOPPnos1knFZs3749Jx9bg2Cw2clWk/g3oiYLgRnJzzWi5CYiMJhCaty9hGTWEH4pogMSeT6MDYfSLzLAGp/4hPwt6mnT7DhOg3t1mf2yorqrKEixOs5r26FjzcKeFXLqklUrwe/ehHd+cmdqyVySGzBiRB6F71HVHbv45L8NU5i6n73XVXLq25h9w2Iah9wak+b3vb2zp3rq7nWv7H/ao8563rc6FlQer7KXTFokVU+7A1n5ajKzO2UH/1VXft8GCG+8kJJT7dJwS93yEPXka56+We4vv4xz++4yWc373W/w3QBx6g+M20j+/NbxcuLinT3nvv3fWX+eXvfOc7u0RRtlly9Fe7n1J+CIRACIRACMwigQjOKfRKf1DUd9387am7gb+lHAjBl770pd0cMYOlGgzV8cN5e6OEgUGz8DwCUwibQZyQPoNjy0osJC4NCInacYOvYVvUkQgycLfEicF4rY+prFr3r+9GGIRrn3BgblPNO60B93AQWO2sJCTlehDTBu++r6VVHGswrz72d55yKZ2XM4yBz/1PzHOaat4XBktNKFL1GwpumU4NupU/KmHSci+tmhNnoC60c7hW47BcYsZAvH+9+Jvrh9s73vGO7hAu4Wtf+9qrHnAst37TPM79YD5mOfoEoPBagkWorbBNS/q4vvAgSDwI8FCBIJc4iOh0TwgVL6EncoBDWQltlO+ecbyyZJJ9+tOf3oknAtY1SsCan+ghAyEo+c8TnvCEbpmeKrfaThwRxMp0bv3vvrCfhxWf+cxnOufZPGzXnjmq/Tmn3FohuOYguo9ck9xRItMDgrpe3XvqxYG1Rq17Qjn+5n57uceG99a0HyooDzfnJsb97jzzmc/sHGEONHe4v+krIcvaI3LDtYirUNkS0lWe4/QTfgSsviAk3fs49x/c6S8PILQfN1mwRSPoe24nzpW8i/h1v0/z3pzmtZ+yQiAEQiAEQmBdIRDBOYWersFYJa9QpAGTAbHBlSftHJp+GGtfvAydvBKFBpuy1AoPLPFgrplwNi4CQWVOEzErrM/LoI0bwgEw4BJ+KNzNwF55Bl8LLY6uHiV6DWw5TQbMPrf2I0FrUGewuVA2VgNSg2P15EgQBP4mEAyizVvjCqpXuSLKVy/140YZQFbCEPWoOVza5W/frc1BZA3mhRca6K7WMgyuHddNZaVd6FLltHLLK0txiQ88hY+aL4ijEER94gHIuAcPk9wWw6Q9Q0FeztWosM9iyPEnqO1DeApTNR+QO8mdJd4qnFNYpesGE9cgYdoXVtpIMHK8SnyWK9lPIkOsKN99ZXNNEo2EFPFZywu5Pt3HoxLQYGsJDqLrLne5Syf6hE1zT4lA7VFfghlvc2mJXiHEkghxCpXhnRAb9RBkIdGoPu4TociEORHnfMJQuXuOq3t9udEFC/V/ue3mz1oLVZu02z3JqSY8a0qAhz1Yu349eNOXWBOU6uv3wHF+s5Rb/9fvAaFd+ynT7woR6mFSRYU4zjXD+bZ/9RW3k/PvwcNK1sWd5D7IPiEQAiEQAiEQAosTiOBc4RXSF2kGPAb+BqlcGa6TOZm19Z/Ujzqtwa7wWJkuDUoNKok8osG8JaLN3+Z/VhZHLmLN4SuBufnmm3cCoxLVCBmUvMTnowbPfaFwn/vcp5srZVBnICkUbqHBcDkV2lIuzWID3HIitE1dCTZ11JZykPrH12d9wTJt52a53U+4CVm2tMVqZcTkEhGL/YQ6/fpWv5m/RrQRTUMnm6vJBSJAXEuEAhdxpSK5lgvpO399cedzDwVKoFSocP9e8LeHMYQLh574MNeRM0Yw1AMJD0i4+USLa51IJXT6XIoFV1RSm69+9asjLT0swwAAIABJREFUr1v1sq/6u669u1fcR7Zyxzzoce+6TofhrPYjJoUnS+4lcsEDIQ92iNa6Xj1sETKsjdbrJMjs45r3kMBn/Y2YUhciTUhwheaqJ4HlgYIHSRzQ4eahDred+2c/rrZjpn2/1MM1faK/nVNiKw+9CGciWL/7W3/6HfGQoKIR/AbpO9eD4/GvaQdYE5XVD5XFtqInKkKjHpbUElDcaMvT1BzRurY9lJDAyG/YmprrutzfkxwXAiEQAiEQAtdkAhGcS+zdcm1qoG1wZbB3zDHHXLUEg6ft/bX8hoM+AyKChfAyUOXoCJU1YJItVuZLg1L/cxgPOOCAzo0xQDO3iXDgFlTmRqGu5m9KhCJZkMEfAeJ4A9BK5CFJSl9o1ODbQE6yFW6AgbpBfd9BNBDkpKgrMWogTRwbHPZFoXIMAoUgcnwIHcJbnTmjw40LJbTRAFoIomQtfZFh/2GY6DScuSV2+cjd8eYyC6uc9qC+2k1s4oZNzRn0Xd+FNkdQ/7znPe/p5ily7oQllsslEQvhapkU2yGHHNI+/OEPX5Udta6BGpB71weutYUeHpTA5ma5piSk4iyaW6curiUiTJKiZzzjGd33Q6dQ/QgrGZrNv5OR2XUvRJUbX64U90tYK8EpYoDTbpkTgqYvOCvjqTI8sCn3tYSotowSvXU9jYoyGIrp/oMF96z5guZhKgN3Yr76zv0j3HTPPffsHhYRpu53Lp77Sxtl3XXPEm3uYQ+YtGOhrbK2uk84heYOewkd7m9+M4QOa68HYEQqniXgVnr9Fyv3v98584z9JmBAUNZvgwdM/YRLdQ17r1B4/ULQazdhjZtXJeCqkFj71ZqrfmPqt6YvMmtetvbpKxz89ngQmARCK+31HB8CIRACIRACyycQwblEdvWE34DIgJnLRagJ/zMQlsDEQMxAi0thH4NJ+wh9M2fL4OqCCy7oHD7zuDiJBoU2xxnIEjP11N73HBjHGFwSpcLSnEvZ3BjOiIG242WINOgjarlfwvwMjEssG5jV4LlEH1fIciz1uUEaMWHATEzUgLDmSfbDhw0gua8yjaqTAahyDPIIEBuBIHxQuCNRQDCXUFN3zqpBpMF4hetOOxxwiV296O7mDRLz3LjV2oRielhApNTcYP2Lj+ypRK+HG8RHiSmOGsfJNUPQ6AN9T7TpE0LJnDrXTImjEplCsstRXSz0WjmELBeN2+7BgiQywktdBwQyccXNM+h3Xwj1JIr7As+DGg8nzMvzgIWjZ9+ql3f3i7mNrkVzn22jBKfPiTjXlrm1NffPNaZd97rXvbpEMqO2/gODEnyuRUzLyXNciRb7uzc5aLI+a9Ob3vSmbr6t79x7+oXzJizd0iy14aZf1cm+fgNwqLnFVe/hgxUPpPzGCDvGzP1J0KmTB0/u+Ze97GXdtVD3sN8fgl9Z2JQIXyikftLruP874vp077ofKoy3ypn04dDwgc00HuAUAw/QMPO7M2l9JuWQ/UIgBEIgBEIgBCYjEME5hlPf+TC4IzSJKglFCA4LyJtHadAl5K9CS70LbeNQEYlcSeF2hGOtp1mndo6tttqqWztR0gsizf5S/CuHW+h/TpHzcDCFyBKpXgb5nA7il5NBBAjZIwSIPPUiPi0pUAk+CMByXAjN2sxHs9QDJ9Pgl5tS6xBWZtByDBxTTph3C68TsDaDWu6DQTlmBvIGwASruqgbUS3hUQ1gDVidXyiguo4SyJNd1qu/l7ob6MumOs2twq6JL6GYwl/rsxowE3TEhYcVtS5nsbKPvnB9CD0VYsppq2zIrg8Cz7XmYQjXmhNpbqHrmrh1bvsNN31qIK8/LRtCALr+iFufEXVEJdfSQwrXqfl73HHXNdFLqKmjeY7YCa/kjBGKRK77Q7uUY66vc9bDiRLV3FoPXzj/Ngy8HKP82q+EC7Ghv2re37BdjlVHPLjDNvMzy7E1Z5qwJFxKdBJastq6N4linDnMQoFlDua+ui+FCrvPPAiwRicxWnMQOZqWv5FACHP3lbpXvevewlwd3V8cRMe7JyvxmO/dU8pQHyHKIi4qmkF9OOE+075JEoj1f/fq735YqgcXRDbn1rVYIcrY1cOReh/yHvV9XwxOQ3A6p3bqAwK9EhTN8kOsaf6OpKwQCIEQCIEQmCUCEZxjeqMcj3IeLJtg8MjNMVBe6vy9vogyEDTHyEDcYJ0IEwJmrlcNKg0wuaMGTuZHcYIIUkLWQNwgvcL1uCZcEJ+Zt6m82oQmcpuID26EehhEc78MUg0gDawr8615VwaBRAihaONYEQNCKYU2Elw1CFVeJfQw+CRyObVEBydOne3PfRI+Wesb+sxcNiz7YoujY6Ao3LbPbFZuHqKHyJeoZdqb9j7/+c/vHmpwBl17XHNh1YSNsFPCrFzn4fn7vMz51R+uhVomglhULhFC4Ni4ph4GGJhLysM9q61CS11b6kKIcc25ofpSPQlOwouQ9dCBqFVPQtPDFOeyZqPr18ME3zmn4z1E4XK7bp23zuf69uCE6CZga3Ne9w7XrsSJUGECVnhuzY3Eh4iUjZYTXeGd/XDxEpBcVCG72u4+cC95oMQxlGxJf6h7uaTOp27aIBMwgW/+te9d48p1PvcpNgShPsO4oiQc53/3gAdBxca9V+GhfdFGoCoTX6HzHgq5T9wjxLTzEK3K9aBIGHMJTG32IIog58TWHNtR125dPyUe1cHvh98Ivyt+j8yL1KfqXnMwp30fTKs8v1seEHggV22aVtkpJwRCIARCIARCYDyBCM4RjPpP92swZeDMjRBGaMBbg8Z+yF3/OMX2n9T7u4SDrIqcPGKMGCDeDAgJLBshaIAkNJUANIg3+DVQJzw4p0LxOEzKJFo5SQa9jhMyWUK5nAP7+YxwNRi1KdOgkSAkbA2IDSANlokHdeM8cWYMnO0jJNCcMwNyg9tK+lEDOYNeA2D7C4/VFk4VQSEs0jw38zq138Baeyy1wvWVhEU2zxIB6mqgW87UUkPiin/foRl2d4X+Oqe61NIWtUSLAT5RwFHi1pbrhD2Bom3T3Krtli/hVNUDAsJfXxC5FerpvIs5NpXYB2vXrwcLBFgl53G8MG/9yeV0/RA1laRl2K5yDoWL2s917MFICS3zBm3CvQlEzqdz13ziyo5LLPqbGHItChHn3gtB9UBDaLbPXEfqK2ssYVXzTbmEHvoIrS3nyjFcSc5iPxkPju4bQkudlNO/T11T+tE1SUgRljbixDFcQWGxzmnuqxB1m3MQnO4J9yLH1f0qWkC9iULtJ6C1sZYrUo7r2oOll7zkJd1DHH2rn+t3wT5Y15Iuzuf3wXXoHnWsyAAC1f2m//Sve9K5XKce8OhbURXuWX3ievCyjI52+q7CbIf3lv7Vr8S2/vK9SA2/LcQmhnU9LPW+7F9XQzdzsXt1qfdZtc3vrAcO5otPyz1dal2yfwiEQAiEQAisywQiOBcQnDVY4doZTHpVBshJMnw6vj9nymDQANaxkqoIJbSWZLmaBolEmgGqwafBMUFnEC6clmAzmKxBN3FkcGveJueolpEooVtCpOpqkGuAqIxyJc3vIqINhok/mzr533cG2MQuN5JLZdBrMF2L3S820Cwhh5+XJDJvfvObuyQmRAgRywGtJRLs79wGwUIyie9KHEN0OC9m9QBg3CC3HggYkHNoDZwlNjEQ5/Q6Dx7+J2hLFBC++oKorzU8Kzy4smTiQ/gJ0xwmbJnGj8nBBx/ciT9ZUoVEC93UP8txevvHcL5wNd9SGOeowbc5wc7bn6Pbb1M/+Qo3sAQIF5HgI3IIT3OCiRpiCGcPRUqgcETNDdYu35cbyGWs61c/cz6JPc6qfqpoAu45gWyOqk1ordBV9wPBad4eF8/1ZX5khbm7hoh47mtlRvZAR709QJAASpnORdw7hwgAQtI1LJSZCMPQfarvXVsEYs1Xdo1wOIXR6jP/e4jD4XQ/u+65o+4nfNzr2kW4e/XDVkddSxUFQKSqk2vRfSobsfNx3v0muJ79r24YYETgVv/5GzP95LfEnF6suZjaxF0mbD0U0M7+NIBpiba6Nvv3cv3tO/e/B0AVaoylz/ymVci336TKhotfHYep+1g/+13h6NdDi4TVTuNXKmWEQAiEQAiEwOQEIjhHsKpBmXldBo8Gxwbplcp/XNKNCglUtNBBQpWL2V8rUyimQRMHhQCrOVgG3c4rCYj5dTJcWl6FCDFfzuDVANnAUMjcKaec0g2MfV6OVjWpBoYcispq6zMDNq4RAWYunQEYMaLd6suZFJ5oAM7ZU/ZKB5kGkgaOhLOBLJfYQNGAVqgw4YkbZ8WLIDJHzGDYYFcbiMdKrjROcGqLdnJMiXYix5qIQqLNsyMml7NVfYRACt9U9rQ27bfchjpa4qSSOyl/sRDIcecv16jECkFlcN4fePcH/3X9LnadVyZb/eC600dEkD7yqnMQPIRPLS/CTRclQAweccQRnVPZr1858c5NzBKvHr5wEethQwlODqfzE66uW+KEYy8klmD3oMS1VKLTQwQCl6tYTrUHLsSffuVwEpdEmAcKki+5v4hHwtT1KJRV1l8CukSwOc825ROByq41d2tNWkKWMywUXziya7P/8GdcHy70vfY7B87O70GRud/C7IXQur/1h98eLjAm+sO8c9zci+4pwsxvknu/Hj71r4lx99tS6j98cCLCAXti3kMB/ejdb6HfCMLR9YWpl98k31edKvuudvbrWdeo3w4P9jBa6hSIpbQr+4ZACIRACIRACIwmEME54GIQafDFKRGGxbHhblYGxlEDrxJxvjP4MbAROupzbgvXSHIhDoxBFMeA22mg53sDYoLrc5/7XBfeao4c0eGdE8edMxA0oCfOiE+DVYKQGzUqCUiJZmJWSKEBmoGwwZfwRc6IAarNYJrzaIkGg3xzPH1nn754nsZNVHPSCCsctI3ANq8QZ+fkWghV5CgJMyxnzKBZG7SnnNvFBsJ4Eg01gCYmOFO41hqRFUrLPeWA+J+g0R/CiokLQlm98NcvNg8C8K8w6JWyqf4iiomachinNdDvhxf3k7YsVO+lPmAYho8Pz1Hfuy/0J1F3xzvesRNxw03f+q6WSPF9P9RS/2BPcBJY7iEhsYQX15Cw82BDEh/hvB6suKZdC1zTqlstL6N8rrp70j1ANHLECF2uvHmcHFMPAVyzRCznmZPouhE6a66s87ov3WsEkvvK/uZnezghiVM9wJn2faUNrpkSVa5151ZPDwTUycMtIp/wFHqv3tpK/HNJ656aZlhr9W39RvrfvUfk46Uv9R9hrw89mKtkSCu5p/q/14S33zf38lKv65XUIceGQAiEQAiEQAj8lkAEZ+9KKIdQOB0HwECVEDBIMUhaSGz63mDPwJIbyT0zuDSvihtpIMWh4boYEJunRvgZ0BJenuwTUYSXc3AjCV/ixkBRmQZLRKun+Aav5nCV41oJRvqDO+WYs8TNMYBznPMb2BG6nAODTaG22qkOxKa6V7jhat8kuBF1Eq2Y3yl0WDuJOG3ifBiA+qxEJwGtPUTzYslKhC1jbHBdSWL0CXeJS0LMEvFCGj0kkFDHYFwIJeGrb4gW5zco5roIedYXNn0q3Jj7Mo0NC6LGublr40Irp3HOcWUMB+fjBuvjvnc+AlP4t3BkoaWuz1H3lXmGHvjUtdDfR39wPoX0YkVcuU/dvxxO8ytlrBU+62GD/i83t66j/r2i3h4meBjhfP7n+OsL941IAsmN9L9ynMPfrlv/u8+IN2HjtW6ka5ao8537zkMl18pqCM1hP6qD3xW/KSIhZJHl6ju/ebzmoXqoweFUHw99PMgyr3a1HMCKDLjnPe/ZhfISmR4+VIbsoes57tpc7Ptqg37jprvf/V56gJEtBEIgBEIgBEJgzROI4Bww51QIbyXuah5mzd3rFPq1rnWV22KwSYhwOiwrwVEgEoXgCeEUrkfAcUk5V9wGn8k0SrhwMyXVsT8nhYAx6HM+wpTrJ/lIhdAagBNENWgdNfepBlvKNmCuhEQEmDoYcDrOgJpoI+CEm3FhCdGFEsb0B+j9UM9yQ+r7pc6Psj9h57yEL4fJS91qKRWCwYC9xALHggOlfZU9eChaCEncCc6qE0fFAJTLTFwQrs5bc1KdvxxQgtTf5nsSEsriqhEaziVZkIF7JYNZ7q1b1xh3lRjjok2ybMW489V1UAP9fv8N+3KhsvQtIcJlJrw8kMBS/dwjxBkW5gfiatmOevjSL7M/51mouOuf6JBl1YMP/coRrBBI5yDYammcYd8SnDL2Sl5DWHGs7eNedN9YBmWvvfbqEmn1r89Rdat7us7RT6LTd/pq7rT7hdAUmuv6EwrqWlRX7fAyB9KDFHNP1aE4VdkL8S7n1fdDYVr1q2t5eN8Ny6yyXLecW3XwkETSIS6r+0MyIcLe5vfIdS6sdrEHOeOuu+H3yqpsyiIOXI+uJyKwlvTpH7NSR7/6ye+fxFPO59o1Z5XjPclDkaW2MfuHQAiEQAiEQAgsTiCCc8CHAyhMjrNoEG2OYS0XUXPaDIq4b0SmwaWBjblQNk/RJe7gbgjh4yIY4BmoOo7bwJ0RMuoYg1bCRSITYsOA0IsDQWxyHgkRYslgyqDcIH2hzT4G5IQCB885Oa/qSBDYOH/C65785Cd3A1GDv3HhszWArQXnMXIMQVtiAR9hhJwmYYe+V7bPxw2QDaTVm3g3aMdDOLGyhAkqi0gmKiqpkXmm6tVf5qK4EItCLomb2oRTellPcTiwLTFLwHCCKsS1nG3798WIObAeFCzWF5P8+JSrTvQbJDuvAfJKNwNtYaREYm01GK/r2D7qv9ggX+grJ1J/EnL6wHWkn4gTrjRhpS+wJeZHled69h330bxNc2vdKyWMZVx1v3D3iU197AHIqLJcJ+4ndegnP+JSPvjBD+6yP5sj3E9wtFKeyvJQwPlEKwipFoXgAY6X70UMqC8xbmkj97h7f5KIAWXV0jDuGSHtfht8ro8IR32gjTb3Xy2xsljbXL+OdT8R4ZUMy+d+F4QSeyhj8zBMP5r3OW6e+qQ8K9sup7mumRKaKxWXwzr4jXG+uqb9FnlApC3m0Io4ieCctOeyXwiEQAiEQAhMj0AE54ClZCDmF8n8KqzWIFDCoP/H3n1AWVeV9+M/msSOvZfYK6JYUaNBxYoSXYpYlhUUUWOLjWgQS0BjFLGjEBTRmKhBRbGhYixYMUuxYXfZuzH2kvzX5/z+39ft4dy5987cmbkz73PWmjXz3nvK3t/97PM+3+f77GcrHIQccDpVPeTEcLY5xq0DxUlGKKmZtvng0EmhRTw5iwgkQillEzFFtDjHitAggEgilca6KumCiCtC5xkctGH6rObHiXIOh8v9UuQIgeJ0cSJdz1mnakgh5RQjASuRQc9D3uCggJLUQaqtPvidSq6ei4y6H6UQGUMc/FCBPJvTuVJKISdY+ziGyDinHrnRL7hbr+peSKdzpQkij5OqBkuRpZZyzuNAp8DMMHUQBu1nwbRVtFsnHBbSAxdBDjn8SJ30wlZNX8s0NxYUcUVi0hf944RT75FRBHHsaIk1BR5pRTyRbOOs8A17ouxR5KVkqnCKVEqVHSMS0l99p3+ULjZtnmQdMZLFVvybbRrXVDBu26gvCBQbUbBJmnTmANLHbjwney7Og+GktYshrtJ0qdzaJx3U3DDfs38oAigQle1zvBtSAGdo966FJbumjsLEPE3arlRjxNU92Bj1MUXHvBu8g5BuwZhpBbBgjqyaP1J8YZ89btmB7AHZD9qk4JJxMYZD227TXmdJgYWbH33wDMEE162FzAbHsUyK2LkiTlF2M6eLcM4zE+rcQqAQKAQKgUJgsQgU4Wzw5OAhOcgl9YVyIfUMaaTmWBPUOpBDp4fCIa2WI0+ZoAYhaNJZEQBqYFIyEU5EibIj5Q0pUm1WZVprSDm0Uj5nSW9r09ak8Nl7MGlsnEaFTDjD+qeC5dOf/vQ+HZFDPymFNqmuSDYnlCIqTRDxpIxRemwl4d8INfKqgIvzOJTZD5DaIHWP8iSFkuPJQZ5EPKPIKNqEtCPiSa+lzFr/l8IzAgPuhxQNSY7+U5iMpcIxIRMIA0ykdo6R91mnlzVoSPWYujrrPZwnCEHhpqQvUn0RJKA8Ci4gg9RD+BsvWAkYIB/OawMO7MFY6hdCJPVVIAThdL45IQiC7CHvSRmnfkr31g9jKzAQpUm2AJJq3Nh5qrt6FsLmWrYj2CAogcS2yvSQcLI/JMacSrXdpCEjxewCgc9WQ36zIWRWv6iOKwUK2nHI39Zt6q8CQgI62osA6o9n6xPyp69R9RMAGiqRSUm2LpTSCyfrt5F4WJs70oQRSmuOjSGya8z0wTPgpJ/eHd43zkVKJx2Zz94/AiXuQUFFQqnOMiBgY77LDDBvxgI5AhbaCAuq/KQjyr2+wQXJXUswxTi06n+qHrfzPhkgnpXz88winPO8lercQqAQKAQKgUJgsQgU4Wzw5KRwTDh8nGvOHZLmkKZnnSNCOVxP1Q4JcuY+lCUOqb85aRSMKDEcRaoWJcFaNI49JxAJos5wWH3mObM4aVEbrCtDajmRHD1k17P0h3NOSbH+kZOPMHDgxtSopLciG9arIXUUKvfTf31ENDiv1kYhfO6nP8hD9hj1bM4f4sgZtj2M4kDIPMIQQj00ac9HbqVeIu3SkF2f6rXugzA7D14UjeHeoHGWbQ+hyFIqXyIaSCxVbpb9VCdNN4RTO+Zdszq8X9SztbRlrI2CH0gSxRlBQL6pXFGu2BiF2NjmYEcCKhS8OOxw1bb99tuvVyBVSEbgkSNpmta4UhuNPfKctF0E07UOhM/1SC+ypw1Iox/PYUfGmdpnriDGqoqO2abzzUmqK0W1JYfZZ9KYI7cyEBAx96a6u8757FM7zIvYZrvOEjbajNQ5xxykCgt2sB+qe7by0cZUPzUnUjRIv7M+N0EJ37Fr7UIokXgprMgf8gZP85e6ya49SwAHlgJep556ak/K7Zlp3CjMgkaCCNJlpaz63HvLmI0dxsjcEdwyZ51rbqSYkOuk9pu3AklD+xa80HcY6sPYEVs2R7zfvHcmFV2b9b+zjPO9733vvr3elWOHgCHMhpkPRThnRbrOKwQKgUKgECgEFo9AEc4GU046RxVZsy0DB50DSM2gMiBrF7/4xf+kuEk7JFkHyAnkjCFiHFdOqR/pflE3HvrQh/YOM4UJsVN4heM5TPWcZcg9l0OmKifHyt8cfKpICq9I9aM6cCA5+GMOqTZyXjnGnFdrSG2XQIVBAJBmDi/izYGEjQqhVC1/I3bOl8ZLgeCAc+g5qO7HuUYAEBGkxv0RyZDrtq/uT9FEWj2bAgQffeNUI0Z+4Cl1Oapu0vWSImuNLcUG0Y2SJ3iAhCjwtNp1ZJzppArPMkYbfY4AAyKoUEoO5JANSxdHktjy2BGcVDBGThJooegaZ8QO6aJww9uYew4i5d9jNiwAQ3V0GFvpw+weiRMAQfjMOWqb8U4KuPGVQuq+bNe11HJkzPyKqsUWBG0Qjn/8x3/sibGxZ1tIN3KVPVyRPuSTHbEv52V9MIWUPeuzczxPar0qpyFisgjcTxsQefaNLAowtUWkQjidpx+eg6wjefouHdg6Ze8W7xo27kB4rQ9H6pA+5NA7xVwxr/IucV9EHxE1Hq43vqodZ44P7du/KY7S+RFe7whkUz+QamQNzlLyBSSCewh0glG5f5sem2CDc6Sye48a30Uo97kHYu2d2q5Nbm1YMS92Tz1u+16Ec6PfQPW8QqAQKAQKgULgjwgU4WysgZPOiUaMpLZSRTjG1jlxOFVypM6pHhsS2RpTm/YlLZHTzGFElBA8DjFHkiPLkZeCyHFyr6zRXO36JimIlMek83GUOZIOqpE1X9a1cazH0gk5iYgi5YDDzomWTmzNqTYjKZx3axfd2z05fvCQAsyZ5+gquuT+HFLONwydi9whE4iOc5AUJPSII47onfcxApw1nZ5LkfIM5yEMnHRpvZxcCp52WyOWvrVOLjLKgZYOmTRa46IqsH+vRqU0fsjzsh6ULCpZKnNmXWb6KvjgmFaACtkzRlS2bGGBaBsPSjpixq4p2ysRC9cjblJEkSzBHUEXxMdBTaTcUa+ijJoX5qTnep6xR8KkoyP8USypkLb/kOqK4LBRgRakjh1K6UbYBHeQWocUUuREqm0OhJBNsHWkktKIxCGlgi7aQ1VE3Nma+QJjJFC/tKNNT4YxG0aGtVtKviCMeSIbQbvMDxhSOM0n89Q1zhHg8TnFFyGVfg8HhJUanCrX7q+wmMrYqmwL5CDA7jeW8u0dIwBl3GQuuI/3hgCPe+kDLOCZIEEwyhhPGmt9NrZIu3fHopR7zwueyegYe495J3gf6Ft7FOFc1jdVtasQKAQKgUJgZ0CgCGczyhxIKaMcYc4xR4xzzMHmTCJLlAoO4pgjFWczG8pTgjiwUgddr7olVUZKJ2cwjlMbiZ9HcYuKxxm1dUqcd84mFcgzqVQUI+QTceDYp51xGpEQRTY4iZRZ/UOqKWAUzwMOOKB3kBFE90Mk9YVyZD2fFEbPkgJLIUFiOOWcVuTBfTnmiCOHnbKCxLseAci+hmPrSV2j7RRKBACB4GgaC/1OBWGOpv4Nj6zt47xbixs1lVOOAFjnuBoFBuGJIrWML4qWcGpfxpx9TSMN6c+wiFLuEdLazoGViMVw70tbzlDABDSe//zn94SfXQokCG74Pmt8sxZZmxTTQoBkAyB4OQQ9EErkDOFs138iP2wXQdMOQRdrIdkPpds892zp4oJK/naYQ5RxgSfPYkeIrLnheqSN7Wkv1XdsPTSCZO4jmfqLKFMi2T3bRfZSpMx8YdeCIgIr+sDuBTbglG1NYCQY5JA9gESzeymkglzORTIRdwpqVOGhjWatNEz8jaAju0i6uemw1hsGSO4wEDY2Z2ID7oGsItn6NM87bdJcSsBoVl8LAAAgAElEQVRk+NzcO7ZJZfZu0pa2+FURzmV8S1WbCoFCoBAoBHYWBIpwNiPN+aS+IU7Ipm0DOIAi/9LQkBSqCDKWLTnGDKVVOn0/qfrpWh2xOF9S3ygwHDwkjwOcPRE5qEiiNVljSiKHlOrJSaRscqI5mooLWXNHTUEArMWSWhySHBWEmmANJccSIeW4Skvk8AYHhXo4ycgmgqooDIfb91JrpVtKg+OIjymdAgHSj51DydIX/dQuaY7uI0hAneYcDxVLTjWVyLpchMX5zpFO6Lo4xvNM+q1GOOfp23qfiyghfvaFROIQLAVsBE3YIrLXKtXGC3FEBqV9UuNUc2YrUrylz0o7ZSdSLhFSB8UPoRNEonAnJdXzzXHKPKXT3EbUFPcSYEFYKPL2i6T4Za9Kz82cdZ62uteYzSJobNSco+wrsoPUItjeLfqhzfbfRfDYtINdmhvmNEXT9dYKI8jONR8RWQRY321los8yBqicSKp1jtZaKvwDm0l7xeqbFGT3FSiSkYH4emcIIOmjrA6k0zHtfQUH89N7Q4Xk1SwPmGR7bCCBPPNZEFCwyrsNYWYzsKE2668xpUKn3UU413tW1/0LgUKgECgECoHJCBThbLCxHpFawFmSSkgl5PRlOxNKHicMeeFYreRQteplqy7N4rjNarAcMAoKBZKy40AUtY9zziGl7tjDU3/G0uv0BxHkFHP6ObdSYKk4HE3OLyJKpeEMc0SlG1ISfAcvjq62cMApuFKIkUeFkTi0SJ09TTndzvNvlVkPO+ywPu1OQRRKI8fZdWNbSFhvJ4USkc0+gSmE43n6SsFU5Gh4RHnhlFKOoi7DDkk17vM6x9uVcA7Vz6HtzqqOTgrEsBn2SrHOnqjIpyAEO0SgkEsH9Q7JYTfsWIDB9h3IIWIhOILwmYvGkg0gb5RDabCCJGxYwAjBk7JLCTTeyCNlFGmxDlKKdQ5zQGYCO7EmEomzxY5gk+AEe5KlwKYFepw3PJICyt6QQYEO9kdVZftsVV+8a7L2WqAHGWXn1sOaZ4ir948tkhzmpetkT8DK3PadOSsIlvRea0Vdb645j0I6zCCArdRaP3BEes0ztq2NDvMSSfbdSqnnmT9wpAojhc5f7RKB4JksDvehECsg5lmyJqRDey8h4NbeS/GGh6CT8fPuDkkuwjnr/yp1XiFQCBQChUAhsHgEinA2mFLaqJxIE4VBkR/ODZIlah/CgtRwjjmc06L+ix+yP95R2zjSFEWpvxxTUf3sXckR44wjcVJRh0SOM4eESkfVH0RASi0l0HXUXesfnWdNmZQ7TjGnV9osx5jqyVlNwSGkwPeukaZLMaaSUJIoKlSlqFqcRe31OZWLU44sIwPDg5LBqdxjjz36PiMbFC1pxD53UEA5lmMHZ1v/OaH6l/VgrtF+xHietZzbjXCGWMKutekENRAZmFGPovQlqDINN+chhMYgqa3sypwSZKByK3xDiQxJ8Fwp3YI8yBmSSbkz96RCO6SKUyLZPzt2f+uipbcijRTE7P2qjYIuSBmyi6ywX2QLAaVm6pc1r+aCviKL1D9qqMBK1pYK0phrAjRseKhwepZ+ep8g0q71PqE4mkPmhEAHTPQPFmwQUTIffG4Ouwbpdn9EmfKI+Gm3MZJxYT55Z8lqkHIsk0AABg5s2739ltLunLEDGVV4SxtkKAgmaT/spBAjszIgJr3rQgrNXRgbl2k2Mct7Me8r7wdEVqAJht4rnuWd4D3ke+nUns0+vbuMJcKdowjnLIjXOYVAIVAIFAKFwPogUITz/1/fxpmi1HFcpPNxNhEZDjHnkvNLWeDscs6kkUpzm6aMtWuOVrNWcNqwtyTL3pWcToSPw8iRlsLKEdO/1gnM1iOcYoVGKC3UA2uvqAc+j/IozY4DLmWWA8p5QxApmpxxRV3cj2OMMCDono98SrlFMDmFznEPmHLEs+WGwilIviI8CKS2TlI5Od2ccqQCnlLnFJZxPnULsfXdmHOMkEibpKxRbbO2UHomUjNPgZPNJJzTbI7NIC2CAUmH9NlK9ofYsGdp5EgYMh+bQeY48uaF8yiQsELMqI9RjGOrQ+w9l7LJLoydCqKUPOo2EinQgAAinNYdOvSRmmjtIwVS0MQ8FASybtI42tqGvacarOuyf6i2tuPpnKwHRfasd4xalnlBIaWOSu1F0KTgIjr6g3whmGxNqq40W/dp02zTf0QIeWOPCJI+mZvWgpqP8DAfFFIyr7xLzAdtghFyL/3WHGTfcEAgzamQW3MyZFzfBHWQMCqsMaFs+i311NpnpNfYZnug9r3i3Yaoevd5ljmmmJm569AHRH2S/cQepeUKImSrn2nvrknft+mzqm0j29ZL6z/MBMXgkzRk95G+LO1eH7MUwN9FOFc7CnVdIVAIFAKFQCGwOASKcDZrLDmXHGBrDjmf0vKkaVFLpHQl+s9p5sRJq0OwfJcof0vqWse7TbFdhCoaBZGTiQRI+UO0OKQcMWmEnDCOMme9VbCYD5VGkRQOHKdO2hyHGOHjsHE4qT3Wq0p5pL4gMdRBm8071z2tFUtKIVyoNxxu95ayaJ2e1FeONZKn7+6nbRxTxMa/qRGcYgWEEP0xNYayI1VO2hwVJlunqEiJ/FCPkEmOuGOIcxxjqb6IClyMneuRc8/O+s5pU2yzq9RSeRES6hRyhQQO+0uZolLDjRJoTNgFUuEz4ylVFYmSNorwITxs3u8oemNYGDtpl9JW3QchMhdatS8VgV1v/NlJUkSlfLJTwYisz0XGZA2wNWNlLBFVdoR0UrPch717FsI6L7lxvft4JjtiT6mAmy1AED7zAjkzf9gF24IH0iM1V4Akc77Fx2fWEgpiSHMX1JBiilQKDiFP7kcxVFU6/dF3JIrSC08qITVXW8wr8xvp0h7KprWZlFptovAitdomSIQwy8aQLmyewUpABal1r2Ewx5iZp9RSim4CVgh+gkT6mz1Uh3aWtZuCAAIcvl/NOy54up8x0h5rWI2FtGC2zI4TSEDGU5jM+8L4edfIwpC67D1UhHPam6y+LwQKgUKgECgE1h+BIpwNxsgSJ53zp9iISD+SybGW4sZR4wghXJwxyl5UzhAVygXlDyFCpjiUIYGcUPebR0lbSQWwvozDRW2kGFGKEAdOuoI40myRRo5ie8Tpp4AhalLUrI/izFlPRuHk6FGdpCVSPfVZ36UQwgPZ4QByZrOVQr5D2Dny1q7Z+gHBoQQhN+5JeUAWqS/UIim9HHGOOQKCEGrT2PovKpN2c4CRLcSJ0mQPUONDmeasjx1wR1AQHWqOQALn3r/dQ59gOcu6s81UONkaAoRw+RvRQBJbIgFf6rOUSoSUgk0Z1DfjRSm09o9tGDefIwxwMC7uabwpm4IT7AwBM5bIKJIDf+QEpsYcCaZqC1r4bLjljPPNG8+jqFmHSF1DJrTfdwhUFG7XIxDW+lIL9cP32iQg5BnaOA+5gVGCL8aejSJ2tnVJQAKhlclAcYQFouhZ7Adhk95rfowFReDkPcIeET9zCbYCQ+a/+YlUU0/ZvsAOEplK0/ojC0AQRkBEMABRlwVgPKXZ2rbFeCK2SJc0c/cx540fbI0fPAXFBHMQQRkciJjxGx7GwXvL/PKug7u5K9Xc/ZIe77qxdFlBHipr1nquJqU2KjTb9e6irKouTdHUb8sCjEOqXcNFX/QzgRTr7tk3e4JpFOhKqV1/Z6KeUAgUAoVAIVAITOQthKCC5/8hIG0M+aF+SR3luHCSOZ9S6DiNUjaRmutd73p95UvKGMeTE8vZ5KhxTDnBql2myAgHEAnjOFsvlu065nGWtbFdN2ddJSeSEuueVA5OGeeLGkJFaR3sjDMHjaJByeSMInjuwelEorWbo4rEcj452BS9pLAie9QVfaXKuA+nmaONxDmXmokYInCIt75TlaiXnGpE3efSIj2fyiiVkzNOvcm1rW2myAnn13ouTjvS4BAccBg/YzW2HUNSAo2PtktzpJxRkRycfH0dbuMxNj8QTmRk3vFb9FxD4uGfday5P6KCuCAAbMG4UNSkXCJSDuNNsZaemT6zF6Rf3xJM4dSzLUQMeaIcsX8KGruGNQLLZowpokDxZA/GJ6SQXaVIj2I7qSZKwRQYMb8QnmCawIzCNc71TLalH8iYI2paxjbzo/0u82Z4vr7qj6CKNHkppOwKJvpF3UdgkEbP9ywqsP4igKnEHBKGZCm6Ix1XIEcWBOIJFxhrO2KOQHuuzxBF8wxG2VooRF5gxvghltZlIk/aI6Di39433lnUTMQQXuaYTAfBBQqhddkKiSFxbB4x9E4aZjy4l4ABImvc2Y8lBGwLTuaFYMJYWi2sBIxkhwTreeZFUmhdw8a8T+HrubIeYOZvfXCOYAcMEGyfwc6PwIiAgGukYsOAYuwowrnoN0/drxAoBAqBQqAQmB2BUjgbrJAP6iYVUoQcAaJQxsmzLopjZdsFKXLSUP2bahAHjkNEEUDAqIacMf/meHM4s5E6MoCMzasE5Dl+Uzyk2jk4/BxFDhfyxWGjpiBl7aF9vufkO0f7tMM6TqouIoUEcmSpODkXkZAi6FyEVlogR5diCR9EgYPNMaTscKo5ga6nIlFOtYczTXmg7iAmFGUOcCrrKvjhvtrDeR86xhQdCg9CKijgGdqDBHHI4aoPnO5J2IbIIAbazCF3CAZwtLMNxkpjYyyRsnnHb/apOduZiCAlSlvawzhQHwVEHJRgiibiKQ2WbSNt1lMKorSVVltbdi18nYsYITDIjvkBZwEHZNU4Zk9JxJJabAwQoGzLQa1yHnXWtcYc6UcOKJepjhxMQ26MqblJgUWKPDNbZGhfCkKxhRzmm/tke5UEXobqdT73LHNJgAUhp9zDT7CJ+okEsT02LKWWzXpeVGV/s1fzRjBHQAbeUlz10/20CTaZAwih1HTEXDvNRSmt1l5KfzYP2bR+OMecFVCRamwem4v+hit1Uhv0I6m0bMK4IZrGXIDMXNW24VYp8LTuFCE19/RdfwWnHEi4/XOH9u55yLr7CRzNQzQzVuzHuHgfGVt9Yafaab23gJC+ZZ248wW0srbc98imH2nSSKY5LWPDO0ubinDO9j6pswqBQqAQKAQKgfVAoAhngyqVhcql+IV1QxxFZJHDjTQhmhxpCpzoP0cfwUvVSE4T59caIo4m1WFsvZOqnBw5pC2byM8zuJxcThknULs8g8OH9PlOOhoyLL0uG9nn/hxEn3GkrQVT4dL6P+1xLWdXiiGijVg4fE4l40xL46W4cOr0A1mhgnDIqTrUCM/wfOoDp5g6Yv2YVFyONYcRQaQsKRQkPZIjrx3SLSkpyCCHm2OfQz/hG4cS6ee8G6OoGdILc85Kzm/W8nmWNawhEMafc44AjW0jk7YgnAjYSufMM6bznpv0T4q0/iPxWYPoXhQr6ySp9dQgpI4Trr/GVzAh9xiSete3imEc/ZasCW4gmNIdjaugC1KElFABqdC+Ny5Jv5VCSxVERKVpa5uUX/Zo/TSVfkxBEwhgq/CW2m18kTvXIBvWEVP2kVff66d7m5fmoXMQ36zzG2KdokPGUoBEajfyIjXYfGC/2WaIAmeutVWfY2euCZljh54PM0qyNlE74YHcUy597t/uj0DBRb+kSiOn5pyAAOKHjFGejXcKKJk/3gOyHMwb17heEIJSSyE1rwRRfG/eaJdxaJXk4KH9Mg0EYQTdjDHb0i4kFhmPythimICSZ85DOI21sfROEEgQpBJEErASfFDAybuifWab4bHSnDHeCLY+OKRte6eM2de8c6/OLwQKgUKgECgECoH5ECjC2eCVKDgSJbJOVeH4IE2cuSh/Ull9Ro2T7sepTHVNDhfH8oQTTuid1KEiwLnlnHO8OX5UG9fMQ1w4TZxSTitVAmFDIDiGnFzEGZGjZkThSTcRE4QZUZPqR1XRFo4qpz6FNjhs7oG4UDykQFIZpB1KKZZuyElEKqyvokj4DtnlRCM11kkiARx958IUkeMES/dFXP1bW1yXbTdg4nP3GCq0+iHVGcnQd44/x10qIKcSYZB6ycGf5vxydp1DHebcIybGWV+lAIeQjU0phNNzhvjON/1Wd3acbkGCbPtBzULs2oItqRrKPtiGsU1BHjZL1WLfVOqV+jpsZeu0p2gP7NiPsYcLBZrtmB8K1iC/lDAZBMaUui0gg5wiFdYYCvK0R9RH9koRZbtIoAOZ8LmAD1VM8IcSyS7YnblqHpjTCJ5gCEVs0tGqutrGvmU0IOquNz+RNP2B63AdJBzYkSAIwmZs2IY+mEdRIJFAgSwZA9pETRe8Mj9kS7gv3PRDez0fUdIG/fJbIMic855CjmUPGFvzCMGmojqoo+xU27UDfn5ScXYYaBAkEICSdu1ebEMWhTR37ddHYzecV4IY3onm9SzrnzMGCfoIOpjDiKb9gNkEpdX3Y6nxK41hFGftYF8yKdhJKZyre9fUVYVAIVAIFAKFwCIQKMLZoCiizqGUWodkceo4w5wvjh3HFkHjtPtNmeAU+Z4KwYFPhcWxoikeFcfeOjROmvWQyNq8azqpQTaH92ykz32QL04jZ5VTyekdOoccR+SM06pPVA+qFHUiW47oA7WDg81Z5Qz63jWIGXLo39QQz+a4csIRPg43JxcpRBqREMoXEhmFBCn2DA4x51ofUjHVPaVrcnqposM9DmGoPZQQag+irU8cVKoZ4kyx1P9ph3YbD449hcl1nidtkWNNuXGMEVcEKGvspj1nlu9bEtcSgTy7JUQ5F8mSeimoITVTACP25TdboHJTm62vk5IZh9w17kOxg3nWALaVZWdpd9YrD9dSeg5ljQqPTFoj7Bw2Rcmm3Am85GCrAh8J0KQfbJnCmcJS1hyH5FLfpF9L880aY9+ZB2zCQeESQBAkQchXIkRR3KiU0jEdgjqCS+aD9ZYIIWIc9T/t9z2Smr16FQhCnJBENuk+lFFEMxWA2Tz8zQ/vAoQZns73fkE0qZjmtmdmD1RqpQI93lNswBwQDEImtSMpu+afdxUF2jvGs6XsIv3GvN1WRD/My3322aefx+alf1sn6Vnaqb0CHO18ME4CGkiueTm2h+6YHblOX73DEEJ9R77ZKswSDJpmj0PF0n29x9i7dwgy7B3uGaVwzjKj65xCoBAoBAqBQmDxCBThHCGcnG/KHELJiePYIjgKoUj7Qkqt4+IkUheklnK2ONPT1vSlQAYniPNnHZd0Nfedp3qt1EHFTDiVVBAR/LZgEIe3TUdNNxFBSiTFi/PtWudxqhFCP9l+In3haCKYFAzkTAVeygMnDqFAdKg4UlE5q+6BUFirR2nkPFszyBl2b33nsLs/QgBLPz7neCIL1qVRiaksQ/UX1lQ046Tt7ktVsp5NAMAaT2M1z0HJ8XxEQ7usw0PqYdSuDcw9ObNI9Ni+hrM+N4S3VSXZAKc5yk5UPvfMeGT9ojWC0pm10XgamzYV1rXZKoLaJ4AyrFgc5QsZhVnUsLRpmkq8Ul/bdZMUOHaHPFrr5ztjD1tEiCIashLly/wy/uzJXEFcKaUpcGReUsUQI2TCoXIy0gQPc8M5AglsBtGadiDDCBr137Vs3r3YsDZSImU2DImr+ytWgzBRCc0LxFEbKMjSYVPxF9FDqKjCUur1z/3YLbXTOCC95oQ0frhZD84eYaBQFHKGBJqL3lGe454Oqq/2IPlScc1fpDVVed3fu8157YH0Ww6AnMpwYGfIrCCT8bK0AB7tEbXdd1RnBNKclNXgfYigGlfKrHvoOzwFu2QwIL7ePWyCoowst/Nh0njluc5NOnnmDXIu4KTd7AZGpXBOs/z6vhAoBAqBQqAQWD8EinA22NoI3hpNjjwHJemZu+22W6+6cWytgeIIIqBIDqeKo6Y4RZzeacMV9RNZ4HQifSLyHNNZU9KcT9XjsHOuqHuUD8SOo6nwyVg6KsLBmZTmSKXjvLuGU0jJ4BRTdzlv2sbpTIVOTiXVylo66aycRAomdTdEEtHl6CHsHErkUaohx9CzHMiUe3LsFbWhZHoWAsk5hC0iTgXmvA/3gzQOrpPGjMjAk/OcypYcd8+e9YiaJnXQPSlhnFj/psKNpZtSuznNsyo6k9qi7YgDEgB3QQSHNbbWy0pDzT6vFC2YS0d2sFHYhwhIWW7Xuxm7kFT2gTwgHi2JjIIMf8/SH3aBBCAO7uf5flZDPpFH40mpRFaM6ZCwtOp+SDJlFhbIInVSe0IaXE9JR6AdyI25Kh3TnLTu0oH8JU3XXKD4rnQgMYil9iJ+AhgyABAkKp4UdWmvbG6Yjuo6gaikvSrUYw767Z2RAknwNd7mAvJl3phT5qx5wd69RwSGpEkLaPieUofASj+VTWDM2WDmXUi6+e2ZSf21FtO1Ci/5m7rKFpBn5K492IB3ijWitoLJ3rvmW/bMHXunsCF4JDDEJkN+9Uk/s10K5ZTiLDhGmdZHQQTvnmyjM83Ogr13BUXZ+8HYwkKasQCesWIX3hOU52Sv1BrOWd+KdV4hUAgUAoVAIbA4BIpwNlimsIQ0tiiXWWPJoUSQOGIqzSJpHE8kjzPMSeIEznK0hS8QIymuHFyOYvaFnOZ0ccQ5787LfpfWRFKLpHpKMRw6h5x5bVXYxxpQKl3UR84r54yCwtGkVCCNlD4OOJJNiVHoiDPrO4oOR1fqIKUCUfMMTjnywjGWAkkpQjD1kUONGFkjSZmkZCKIyJXUQuSe4yht17OQ8raCKnw5tNbJUsCQTA4vx9aYhKwhLPMcUc0QaQoSYoDoUKCQX/1qlVZ9odYZ/7UesKH2KVjECacwUbCpkhxq3wlGIL9IJ/yNCxKICCEziOgkhdznCDS1DAFr025jZyF67AcJSIXSpODGZltVVr/bvTajTGmX65AmxAPRsbYQ6XB90nmDW1JZjTs7Q0jMQfPBnEMkHS3hND/Zhn5Jh0Y0ECXEwjXWcCLtxkhAyLWZLyuNF1VekIQdmGOKIiGc5rb7SjEdIy3ImvPZEZvxbkDUzCuqqfRv/UO0vGfYFCJpHpqT5iyCT/k3p5AoAQ+k2rpV6qb0dfZA8RSccY7nWqfoWea11GNjx6a0WXDIWPhecMw8Mc+9x4aEk50IDnmGZzrfdeYp29en4Vxsx9DfbQp4iGEyGQTlPJ96TA2lpmqD4EGCI9Pee56RomPIvXcGXGGhn8ZbNgZi7r7eCeZoKZxrfUvV9YVAIVAIFAKFwOoRKMLZYMdZpXByejiJlAbOnx9OC4UIQUTAkCyOFAcsG9lz9MbSWCcND8cJwaTEcBqRNmrnLKm10gZF7h0UDNdKX6OCIMkc5uHG9Jx/7UYGqS4cXaRU+p/UV46w1Epqob5QaKi+vuPQcdypI9JZnUOB0m6OMHImvRE5kg4opY/zjHxmz0QkSlEZe0aGqGkD4qA92kxVoupQlJ1HyUWk2wPJ8B3HmUMdApC9ODmdnOZ5jqy/5RDrt5RDzrDtLJAXTm2r8nGakV42sZojbTb+1BmkDM5INrJr7JAJhEUfKZOwQQaReOPgoDBbx6cS7aQjz0IiEB1jtsgjpDQptH6bQ0lFDlkNQW2fnbbBQFo5O5Na6Xp9R6YdCA/1WVps5gcbQ2LNQTi6Bsl1TzbkuxTrcY55PFy3OGwLwolYCZ4g5+w3qermCZt3jyEx8kwqIhs0x6hs5hui6X2B7BpT7xUKpznoGdRkB0LpM/fWb4EFfUZeBQEQP3MT6fW5d4aiQw7BG0EdNmBeZYsWqb8OqdZsl7ppbNiTYJF7t4fvtF3VW4q7d4OABsIJT21372mFsjKmCDUSbA6b5+as94b3jHsggTBpt7iZZpdZv+udoK3S+gWtBBe0U8BMxofAgEBc9tgtwjkN2fq+ECgECoFCoBBYPwSKcDbYRuH0EdLEcbG9Akef48oxojhQD6MScRJF6zlCSbOdZ7jcx9pH90Y2PZcjNa1qLUUw6ZfS/iiHnGrOMgJCvRwSTg435RJR4jy3hYCokRxWRDabyuunSr2cWMQmihW1TZEQz/EdtYUjSbFAmqgryCm1Cjl0jh8OLkfZPaPmIMkcZoTZ86h7nG4YcPgRqyHh1EfEAwb6wfnnUEfhlE5HLZzniBqTbRpcb9sN7ZXySzlyxJmGl7REGI4d7uMnAQvBBT+ccDgiC63SjdQiWvCP2orMIuIcf3/rL3Vd6m0KGs1COLUv90RoBQWMcdRG+CX11t+xvRRsQQIRjaRGGt8QD58hD1GZEBMKuWucl+1lnNOub2b3CKPgSPa1tH42KcqwYDMCB1FOQzhb3PQtc7FVHod/Z4xWUtBcg/hmTXCyGeCPiFIhKbVj63ZdS4FG0Kwj1SckWPBCkIBqm70t4cOe2JfvokAaYwW8BGbYF9tyTYIySKVzzBXY+Ryu5rSsAYWjHIilwJPgjjGQBeDQD3Yg5Z0CSMEcEk6BHvZOXXU+lVTwyfyWDut30rbbcQjezqVOZ29imQZUYpgKBLFhpJBCP6mw2qR5G7KpfSoJp0Kve8qM8K6QnmsuGQefI+mOIpzzvA3r3EKgECgECoFCYLEIFOGcQDiRP4U6kEnpndIRKUuIJxWDSsHJRuwQLiqfNUXI2DxHnGUOqeI7lBDOU5yr4b3i2HG2OKwOEX5OJPLGKeRoKlIyTKlNeiOHEFmk3klbpKBYF0jRla5JddF/6gwCZM0nx5XyYY0mRZVqgewhjv7NkaeocMyRIQogcu57/UJAkUjKDdUBntrBOUeqFGPxXGQIJtbicR4pJMMtKDi1HGypuLBycII5mQ4qkL6t5oAvooAoIUPIsP5TBRHfqJxJ5aWCsoWsY0Pk2EWK73DwES0kBRbIBhIBb/10neexG7aVtXjsTh9URvV9AhJIEMIdu5mVcMJiaFMhDClUlHTZqL35HbJs3PxQulKdNmqm+7veOCMXfhtLY4Ic6T+CZCypdYhq1ohmjW7WWLonezP+wcP92ZE0Y8fYutrVjPfwmih6bMBhVf0AACAASURBVB85R+K02+cCT7IKhlt1ZH0ycgMfdsJGjafUa4EQ7wnjLoAlmOHdIjXWvQQfBDY8y3wwn6n+xl4QCXn1fkHIzRtrYRUNou6Zb2xOcIwtCoDJ0jDW3lPGwDvBmCTTwHra9GtIOBFkhbsENdwP4TReUUeTDp0gANtAxKUTmxMCBtK7BcN8hxxTe42/fjsXQUacZ0mfTfuSdq2IlPeIbBTtQjK9k7wLvO8QXBh5nwpYyZrwnCKci5gddY9CoBAoBAqBQmB1CBThnEA4OSvWV0k9QwaQLY4aVUCaKbJHQeTYcY4RjBTKmHcoXMeJF/nnjHGuKBBja8Vybyl4IXraoq2cQk471cR9xgp8UCiQVSmj1r1lrRn1BFHlLCLYFCYpghxnihwyi5giEhxvTi/SyTmOIut7TjdFAxFSvIUDrU0Igh9tpOJwGDmhSAVHnNNNNeWkIq6u5VQrbjRMU6beeDZCwKmGn3txRh2u52iu5miJVLs+kdOOWHJeOfgcWOQZkUhRnVmf166D9Az30x/9UrBKyrLAA6KrTwq5eC6srfG0ltY9kBVkzppTDvYsqdjT2miMWnUW2aXKshO//Rt5yWf+dn6u0x9zAelmMwiT8TPG/kbG2EBU1BQMCmENsUBIs56ZvbFPaZPswro9hHDRh2db00yVZ9MCMEideYQ0mv+ImPkwJEuukVZuXugrkmUeIZaCKYIH1FGqm3eLsXYNguZvqcPSqhHErAVnw1Re80rww/sGbu5jDbW13wIY7NJ5nm1eCTbJlNAG7wYkWeDEWlRts/ZZMAiRbg9jYZsdz5WtYKy0RfuMXfqM5AoWGRfz1bpP9mf+akv28zWGPnOfvMtg6j03SyXatm2xbe9i70qBKGTeoX3IrMAVsq26tfHLPGOTRTgXPVvqfoVAIVAIFAKFwOwIFOGcQDilS1LKFCcR8VfwgvNFhbMWCbGiviAbHEppcKLsqzmiNCEdnHSpvZQAys+k9VIUD5F9DmiKBrmWEqPiJSdwWNDGc9JeBELKHsUl1R05tNmjj1LDGXY+x5hjSeGVaofc2kaE4kQJ5UBzVn2mkAdnl1OcLVYQJU56Co4gK9nKQ8EXhISi4xlIJqebkyw9lwI7TC/mgBsbRMyhrQIBUpodyEHUnNWMxyzXCAhw5pPWPMs1SdttAwlsCPnXZuSe445oCRog05x2yhbiyZH3zKTCIhfIvDGH9SGHHNJfC2tOOZzdM0ED+Eah9DvKadZghmD7zSZChpEatiWwghz7t8CFzxD9pNjmmlmwmOWcVs2nmGuPtiJxiMx6HMELnoIhgkvmBbUSyWLvbHK4/RHij6QJ2MDWXHawS0EJafPWOBub4GWMEHY2JAXVvJGpwO5VbUVgnWP+UfKs+fQOck/zBOlGKo0DO0H2UrHZel1pq9JLETKE15h5L5i33lXDVHXXK7SjTdpvnNkXO0R4kWVk05pWpM66YuPvXYKoGy9zOfv3jgXMkGRrdVcKpo2Nq/O9IwRkBF3YPmwQZDhRTAW6qLJSr71/8j5wvyKc6zFb6p6FQCFQCBQChcBsCBThnEA4KXzSwThXUmWpgdQN6pw1kJw4jiIHlUOKOGSd3GzQ//GsqH+IFRIl3Q3xkx43yTGjRmoLQsr5lNJGOUI+tJvTOrYOVLs50pxPJNl+mUgEMhmF0HUcYw4n0kktsJZOmqv7SyFGfKSFcsyTcsj5U2wEZlLbkD5EippBnVKshPOaipRRxjjMHGQKD0WT04hguBfnd+jcc4KRDkqOcxEr11IGQ6I4wvM6tfOMGwz1U3GSlY4of/rMPrKmM5WN25TUVjVr255UWN+3W4ggMtRc44U8cOaNb9ZTGjufIwEISdZVwsZPCiHNsuVJyLI2tG3L5y0G86RKroRdAjFwE6xg6/og4LAeY+uexkeqJtuVti3VlcKJ9AkEsWfkcWyrHnNXcMr8FTBhH+yeTUeRRkbNN+NhvaQ5w9YFGGRRGFNBB0SSEojkSa31mWJCiJ20agEv89Jv2Q6CNI4EwZIWLhhlPai10QJF3mv65B2hHe2hj9TP7PupjQimQmmCWwpOIZPGw7z0DDZkbNhgbCEVj9t7+06WAGUSqZ11/Fq7854w360FpeobD3jAyb3NRe80xNm7EbHNUYRznrdbnVsIFAKFQCFQCCwWgSKcEwinohSqO0rTQqyQGhUrpaVJK+VYUh04177jgM7iuK80fEiJe3FYkT2OFGI4JFzuQQGlVnD0KBaUSs4YBwxRpZBQOlP4Jc/lrHOkObgUkGtd61p96qD7cBw5kNJbpav50S+OJyLDGXZIZeXEcoYpTdQFDh+VRwqte1JxONJJ8+XEJ/0PphQTBDQpjJxYiglFifoipVT6ZNLxWty0BdHKWjD/RpylDXLoOameP+sB9xT4iUJoHDjg1BvOtfb7W4DBmjqEBJHg5PpM+xM4COYt8UqqKRsxThTSpAm2TvWwzZMcc89CIKjH7m1tY+tgz9L3WZ3+3Gve82dpw6znIFtsnk0IrqzHkXFAKpFF81swx1izD+o9BVNwZLj/qgCNOWHOGFckX9DFOCF2yDKFUjpw1gObb4hlqgabl9kzUio/W7Eu0nkCO+Y4kiXgIp0euZSKi3iyTWnHlFJz23VRsZFEJFlWhMAZBdC8G1NpBW2kp3oP6Id5ncq/7ufdZx5nX81ZxwG23keCd4jrrEfUd0QVEVZwTDqxdgiwmHsUT4RYiq/gADJNDYVPEc5Zka7zCoFCoBAoBAqB9UOgCOcEwinSzzmiHhx55JF9ChdlAZlS0IXzR72gLCAQWZO0WnWnJR2IAyeVo0hVHTuk1iFjzpNSRjXgbEkz49AhgvYvHKoYnEZOL5KJUFE1pd1x2JBDRMs5HFiERn+RLSnGVE14UDulFXsm5QRB5ZhyspExf1MYOOycWynH2sIh5rQjyhRJWCHUnErOsDVvVFQOPiWGc6lNQ+WPoix9lHpDKUQ4qa6IOgWWQ57iNciiH31NhVh4RmlMmjHnOmtxkWwKoGdz9pEL7ZSi7N8cbn2GtfNSiTVrOWexAQQm1XVXM71hljRl91I8ScGXWZ69mudt9jVSWdkS4jTvljfztJ09mBPsk1qG4CKfyBn7ESiJst5ineq+bF4AxvyUgmtdJbs2VuzQ/ZFE88SYSdk3Vz3DOUiTKqxIlFRqJE1gRbqtjArzzfxi+9aUIuHmsnWXiKd5x5bZLtLofEEU12qXa7zLzNUxwilt230E1tgYG/e8oZKdtO55sPXuQFQFSeY9steooBZM4ZUgmHc1Iu29Jd3ZOfqhD6nAXArnvIjX+YVAIVAIFAKFwOIQKMI5gXAicQhStmdAMpAYzp/KrdRBCh/C0aqI0xz+qEScQkeu5SQp5oPkWqdkPSRyg1gND/ewpsyBcHHkOGSIGtLDwbQ1COdzuNee9nEiOc5UNkqJNFfXcTA50/qcqreehXxyghVQ4UirTmtNq7RWB/WJM01Z4ARaP8UJPuaYY3qH1zM57ogZcpSiKxxF66z0mYOP8LkHgq9arjZoV3tIl6OCxqE3LhxiTjJ1iZOtzxxuP4iiH6QR+c4WHxSnYbXRRUyrlVTAfNc679PsZVKbci+qmaCHMWrtcPispMLmfpNSY1fbnkVgN3aPYIUEUvkoc20QIv1ocV9tH9yDUi3AIniDGFr7iNw4BDNkPSD2Y8q7eURll2GA3LmX+1AbZQe4XqBK4CLViW0FJLDjGtkB5rDnmVvmvvRR8xEpFVQx1wVlFPSSZiuAY+7lXaLtUv7ZQ7IAUhjMu8LcMI+lpw4P7xvvPc/R7qRyS6sd2uy8arfzBZW8Y9x/OEb+nfTysfGTwu6AsXeld7P3sYCYMUI2zW04ZR/XVDJ2vyKc6zVD676FQCFQCBQChcB0BIpwTiCcFDzpWtL3EEuKWNZeZf+6bCcxbSP0PKJVMbNvp7VIHELOIEcMceIo+YyTioyNEU6kkkOLcEnL44RmqwFkjJNojdhwSxH3klYr3Y+CQoXxm0qrLYg0Ek1FcC1yqN8UA4qPZyA52oWccgQVS3ENBVQqsvtzyu016FyOtPVt1BvYaR/SztlGMKURUq5SpIb6kyqZqRobDDibVB9EGe6wkgJJDZXu6FgpRXX6lNhaZ9iXU6BCenL6Pi/hyvYs2QaFbSUd0/hnOxS/zQPft/uL5t+xSXbZbq3SrmMVVBiqZdlGhvqVCrfsOgEC1yBAlHG25X7OzXVj82NeDIKdtmuf+7Mz9svmPdOzzRepr+bD8BnwoTRKOZf+KdU9QRNET5Euqd/Is/4hisbOXJVO7nkCL5Q5WQGCOp7h3wgpZd8cMVfMGW1AKhXeQmIFocwBz0eMnS+wJACkCBAVUJBJUGhIGJE396EQKm6UvXS9j8zRtR6ex5aQXe/WlSoqJ8MCudQX6bHmuneUKrWCfrI0vPO8W4bv37G19EU41zqCdX0hUAgUAoVAIbB6BIpwTiCcIuecQ4dUPulvIujIEkcOyaFCcgaHKtwY4eGwcqA4iKLz0vNUmZTKioS5xjlJVeOoUks4gWMOtXORL4qIe1HwtAWRpXIge65XzXWseBDVT8ER/eHIUxuRUMWI/JtqZi0XIpmKmxRT51NqKE3O4xhzIJGDqAvUVQ4lVZSCqd/S6JBQqa1ScTmeiCVS717WQkqbtE5WtUntHq6TgwOnFbmKY+4zbdLuU089ddWka6UpNI3Ajn0/rwI06fnuY0yHe2FGIbdmzw/iGTyzDrUliiGR7T6KnpnKr/5Oiq+xRDhCAKMKI3ic+xQl8n2KEaWickhg1qz6PVSSh4GX9C3raJFZNo0EUbStKzTH2LtzED/Ew3Vpt8+Rrvz4Hhkxt6iRY+ugx5TmVhn2PEQ38wo+7A6RtK57WAXa98icgl+quFJIZRNY24mASmtFmqTY+pydW6ctvTX2K70dOXWeZyRlW9CLQigQpeiP4A8yiAxbK22e6a/3C7KZfXrZgPeAd5ggjuJgY9slSUNHfM1R6if70hf9sHSgPWCU91SL1zSS752FVGs7TLxj2awfz9YG2QpsNVtMWa+JJHsXDMdwOMfadg3nUxHO1TsJdWUhUAgUAoVAIbBWBIpwjhDOqGocHA4aYsbxsn2FNZV+cwSllu61115ncsZ8wLniLFMzOFPZ7J5DxzHkmA+JSlLYqBKKwLh3PhsbaOSNUsIZ9zvbjiCY2k5FlHI3llbLmbZZvMIbfhA9/UHoqJuIrH5at2r9GLVTsR+kEhF1PbUHMZAC65nUHcWKOOUICMeccsN5RqApJZxL69M4xdqH5CpygkRwsKUKcg45mCkYElLhWVQf/bUmNGtYYYx0cr7X42gryeb+KznX7T6W2a+SI41kZE1cPs+WJWwBOci1nO6sCzSWWScKZyQPiZeKaawED2BCjUt1YiQmxV1CGGMXzh0jYOuB3VruGULBXsy37McKI2nnOULKzQe4sCX2gNwgTZTEVLqVScBOzUOEzTx0ZC6GSPnM/GWHCBobgJ/7Gkv3YdetjeYaWQIIpnRYaeXSy1WaNX8EmRA62ysJnHg3ZB9JqenmiaqwKtYaS2PnOTItEFa2bp4IAu266659X9k9AifrwGfeH663PlTarWs8UwEkKuhw7NkZm0JMs4baZ9nqxTxusW7VyeE8MDZsOusozW3rTAXs2L73S8hkAhwJYGSdrDF40Yte1Kub+r9Squ2s9lWEc1ak6rxCoBAoBAqBQmDxCBThHCGcIYx+U/OkmnKOOHyUNwU7pJ0heNK7pMrFaXUehaZNW6OEZNuAROFbVTSOddQ/hM36LQSEIziJ3FAG3dv3SGy2xOC4aTcVFgnhrA8dY+3VpqwPi0OIIFJuEUGOPudcPzmRnGRptJx3TiOiidBypvVHsSLVZf07KYN3vvOde0fTtVRTuFnHZuN5KidijfhSg9zbPaXeUtmG/aaAaAfVShEj51H3UiCI4zpNZZlHeQxBRDwoS8iMNsA5+zWmIJH+ZkuK2I8+ICy+Q5bgjRzC07ilGBE1kWPdqoTTCKEx4MwnRVUb3ZcdhKC36lPss1U4hwrfNCV38a+fle84TFlv27dSEGDSGKeSMhUQGRX8cBgf6d3StBHCVDh2H98JtmT+mKMHH3xwfz1COdweBb7I1qGHHtor+c5VZMwzncsm2BUSKKgjYIAM2t8WIc1WNoI5lEvzDLmVNeBd43ok0z1dI5ikLUjmscce288JhFfmgbnkPaLird/mjHsND32Skm4/XRiYi95zyKGgBiLcHoIh5gCCK63XOm1tEETyufdWDuq296P3iGAStRQJboNg8DCfEGuBL2RTP9stgNZqe0U414pgXV8IFAKFQCFQCKwegSKcDXaqNypWk2ITHCiOHIIkRU9hHuX5rUfkkHFgOXYcpRxDp33o9A+LtSAsUuUQJ44cB5VT2CotY8M7TGXTJveg+rkPEiYFVvodB2+4ybt7cjSRaAonxxLZtFaMc4aIIlmcVwoK599aMPd1r1zruQgm51AxH2SZCqwP2dOQA+tvxFcBFZhRbBBO6o/rVOalplIuFU0ZEmTPR1o50dav+V6RIA6y67SnJRr+zjiGgAVHbaUwWq+GQBpnP/qWrR+QQ+1N2iiSK5Wao4w0+refqIvOH0tdnmQX7edjJHnYl6HdrH7Kr3xlq/Q5sx2HlqBO+nyWdqW/LalO/9otZaYFDyY9q52Ds5Bq2QfSdgWW2ASixQbZscwG/846wewDKphj7MfSU0NUETyEEiFDKrPFETJK+TQ/ETZKJHXRPEvQwntHJoF3DMIry4Ctx94ElMxbASUkmTIqldf6TuTU3EDupKPKJJAZICARdTHYCRRRPWGA7DrHPBdIkqZtniLHUnZtAySw4dykMyd1Ovu6tgGyzEHfIcdsRsAJYYZpFGRqNXKebZcWoWgObaMI5ywzs84pBAqBQqAQKATWB4EinCOEU1qaAhscIulr0tUoUhwhDhmSiHxw+jhmyOhKB+fMvVzn3pQ+PyL7SAoFAfHj8HEIOXHTFK7h81SXtD8gB1S6IOJH7bAmDEHktGbdX66NEmptFxWEw0phUKTDmjJrWDmulDQpfFRPJJGawQGXkkgVoWxqt/VWnFNtgRVn3FYlyDliSn3juKaQivVr2W6GwsI5zjYpbf/SToqulF5qIcecQ8t55Yhbs9YSTNcjzIikVF5EAuZRzRAA5BGxyF6iPjMGQ9VqLVMvTnf2+szvpM76nTWXWWeJ9LIX5+pnu4Yzn7Ep3/m389OvdoyzPrP93Y59iHiCG85r9waNHeb7VDL2ub9zbiqM+qwleEOin2c737VsP/YeAhvi6d95nuvSNt9Hpc39k5pp3IxfGyhgK+aqzymXvmuJbKuUtp8LjEgxZ9PUN9c59A/hQhDZuWBK0nJbO3EN4kZZZHfmnzmjqJZ12+aWSrQCPQIp5hfCa1z1Tzq9NZ7eGQilOSrQ4jttkXbLds0X6qy+I83IrTlq3psX3lHmld9je9OaI/qh+q15T9HVBvMKbshobMqabMsLvLeSwZAthMYyKIIHzGQHOIyp96V3qgJH+h67mRZkW8s8LMK5FvTq2kKgECgECoFCYG0IFOFs8LOpOsWNs8ihkwZHYYjjzUHmNHLAOI2IDBKmIA6Hi2NJOUMcUrnT7ZMuyTFFBhUhQXLaojhDJWbWYXWd9khv47zpA7KI2HKMpbhazyU9D8EapiLqkxRAyiL1UAEgBIbzDQMEUYotFRO5pmAgb1QUTrc1rgr+cEIpwZ7NsaUMKSoED+lxHExKJsWU02rtGqcV6ZR2q6jJWHVJOLi3CrjSCK1r47zrN0eV0sRZFxiwVsy6U6mSHHVkg3NLSULEpTCOOd2eAZeQOepL1E6kTruStuu3sU0VVu3IBvPIUz4fEuY42yEtcbLZVtaw+Z0iPG1xHn+3FVzbCq1RVqMM5nfr7LfELKRq+Lttb8hDiEb6lwqufjsnpDnnx25CKINNiERLLlsldSwF1j2ixulTnq2dSel2jmd6vnuYtwiUH2OYH+TJZ+4XwiqAJAiiMrQgCbsI/sFbcEnxLYSN7aQ9xs79zBvkL0WFhmNOPbdu0hpIZFDww/sEcfQsKiZbNW8EGLTXPpmKZ8l0MCcQRUTP85HCV7ziFT2RhIEAie2GZDDYGkQRHkEm2QXIrnkjc8CcHNsGRT/MT2RQ/5PJACM2bs76TLsFj/QXwfYuYBvsUB+lFkfZTAEo8wRe+in4JXBFsfWuTOXs1b7zZn03tucV4VwNanVNIVAIFAKFQCGwGASKcI4QzlYp48RyqlKZlaPpe4SJs4nYcbikV1qPiIAiWJOOdusJTl2UT45oHPf8DnGNY5bPOcQcuxR/4SByMjl1yC3nMcQDIdNWhBMBnaSc6ic1hkNrmxQqCTJjTz9OIodT+p/1WMgyZ1yBIKSOM6c91nxSPzm51nL54VBLd5Wuy/l2LmIs1VeaHzLgfL8R0OGRQi0wSAGVOP75LmoPBfVd73pXn+KcFEjEk1rFqRYQgHO29uDgp5BJiDtMx1Jj3Y+alK06/DsFfNrf/g6pyfYgqb6af4fERrkMaRqSQG1xbhQ0/c+YZ3zTT5+7Ps/3NxLgvPyOatgqSa2SGNUyiqjz/ATvqJLsMueEGOa7KHRZy6ztIa6tguq5QxVzmKYbUt4S+pBMz/G3/hvHXKu92hcS6jdMgpu++Mw8Vi2WHVq/nH6mQmq2fWH3iJe53tqF66mfsBVIScGu1n5jnwI+0r4RSJWUzUVrNJFDabfSYM1fwahsG0ShRFKlwyK8+mqe6CubVunadkhScwVbkE5BHgEjbaKOyngQgBkrbpSsAdkLshtgENtJH8wN60YVSpIaHDVSWqz55B4IL+IusAUD7wfXeBcJOJmTeR9G7R8GRRbzX9nKdynCuREo1zMKgUKgECgECoFxBIpwjhBOH8WBnTW1VQqcqopS5DitnC/qGvUDKaNmJrU2yktSOON8x+FLQSFOZn7ymd9RapJK6X7IGjXG91Ga9MP1nH6kmbIwpsYEAgSR2iJV77TTTtuxnpTzSN1APJE2aXb6Yu2pdGBrvRBGjqgfzq8+IascbM4v5YYjipRLw+Wwcuqtk0O6YTRMx4S9dsNW3yihSXdNGicyQ9nkhCPXlJWkrWqv9XEUUPdHxBEUP6n6GnKeNM0UdwreURD9jjrc/m6LP6VNbcpo1rq1v+N4h6zlupYkGZNWBdSnKIEhcPkde8i/EzCJKpjrojDm3yGebUpt2uD57pe+ZE60//ZZCrukfVGKc35IazufJqVfpr+eketiw60K2trJUB0dU0vbV9/we3MlczxEKOQ9ZN28aElSq9jKLBBMYctj7wr3EvCRBYCUSUOX/i191n6etghRhIzdZh0xTN3XddZQIpzsD3nzXjGXzEMBHtVwjzvuuH6OIbQIn6AKhZSyOUY24eF5gjMIq3T+EOYES1JNlnIqtdb8QoC9QxBjbZblYd4LxlmCQDVuMRjO5zbQsdH/IRfh3GjE63mFQCFQCBQChcAfESjCOYFwzmMkQyeW84mgSUeNutZWreU8ctw4nRTBtpBH66C3BGTovE1qH7VPmmqexwGkMHIOVYmktkjPG67ndL84x6rGKuRBveXAagfyZk0bJZQDmsqq7ulzBUWk1+pbKl1SWKTQSilErp1LJYGNVD7rO4fKUdsv5ygkYn2nVFqKVEtcOMHSDN0DhohkSwyQiZD99DcOdYhMm9oaDNxLP7JG0e/sJZn1iy1BdV0Iaba7iRoWApuUwzY9O23wmfNy75bspr2tI5/z8l2UUc92bRucyDOG9xn2O/do1f2MRb7z76QAhxQmINKOWxswyfPzfey7JZf5Ln2E96R1tMF9WiAoc6dte9ufjGnGZ0hKx8hS21f2oJ+USSqo35OCOc4TYBGcsU5aOjpVUsBGRoF3gDR1SqC5xWaRUms8pbMr/iNdNhkBCK6KzgI71kGad9ZRI6+eoQBPAkyTyL13gkCPNFcBpgRqnC9ghtxqm+CSeUiVXeTa5nner4s4twjnIlCsexQChUAhUAgUAqtDoAjnAghnbhHlq3Wmxxze4VANUwmjEiUFM2vW8rtdPxgHnjMoNQ+x9NM6+P5O+qL0QApJiiAN28KRV5zHfnzIqTQ9xM56M0QMgeQYc0IVKKHCcKYRKmqKc6XYUUicI2WPQ4ssuidnWzulIY9Vo017oghSUFY6klrcEptZMF/ddKmrdmYEJqms7E3lZXNljHS6Duk0N8xTxNE8lD4rWEPZtM74K1/5Sh/QMXco+ooBSZuVKWGdKQJo7iGEBx54YK8ySu2lVEqJlX5ruyHZFIIPY2Qzab4UVM+bZa60avNQFd8q9lCEc6uMVLWzECgECoFCYDsiUIRzgYRzMw2kdYajzA3bk/WAVEZOLtVxzCnlhCJyUvOk1Em5k7JHMeQQWz9GpeTUUhgVEUE4/e3gIPu3a51LzZUCSKmUHqutY9VoW+Lu2Z6VYjmbiW09uxCYFvSgeEqpt85ypbR1c0uARnq5TAB7ZyKI1ldTEymdFFMBGeojJRORVMDMHDTvBH0QR8EYc1jlW9kSUsoFfcayF7Q/ZFPwyNwcU7O360gX4dyuI1v9KgQKgUKgENgKCBTh3CaEcxZjS8EURJF6gnS2m9oP70HtlGpHqaTAUCg5u9ZlcnT9KFKikiUnW/qf9D6qC0VHFV9rWimh1pMhmtaKrZQejOhSgqQEZt/CWVSYWfpf5xQC64EAe2a35pXtS1R8Xol0agOyh2Ba02m9NGJpqxSqo++QQkWFpM3aE1eFZkQ0hcr22GOPfn45x32opSsdIZsqSwsgTaoIvR74LMM9i3AuwyhUGwqBQqAQKAR2VgSKcO5EhDMqaBRQKgeHlSM73BC+nRApboNIIqG2ObC3p/RAJFRqLNXG7zve8Y471BfqJvKIZFrzOWk9mWd5BnLrtzRdqYObWWRkZ30h3/xbnwAAIABJREFUVL/nQ6DNLAiJUxQrW6m420oBFvZuPaU0WuulKZTmFmUfMZQ1cPLJJ/fFuJBGSigl03yz1lOxsGnru33vfPvhWos9KQNivp5vrbOLcG6t8arWFgKFQCFQCGwvBIpw7kSEM11tlc5/+qd/6vcezR58s5q39NrsR5ktKlIRl7o5tsXJpHtzpCmaVB4VZznEKa4za3vqvEJgsxEQUMnek4poIXfI47RgS9tu19uOxL2yHUzmlTkhEDOtYFLul4JhfitMZI6nINZmY7XRzy/CudGI1/MKgUKgECgECoE/IlCEcycknO22GdaeIXnS+VI9dyW1c5GThyONtFJtkF5OYbbZqDTaRSJd99ooBKiJKdBFufzwhz/cb3GiMvS88yqVgFfTdtdSQt/xjnd0e++9d585kHat5n5b/ZoinFt9BKv9hUAhUAgUAlsZgSKcOyHhbA025JOj/MpXvrLfs1IKLIVypRTYtRh9HGlpfqeffnpfuVZaL9V0K2+9sBZM6trthYD5RKkXxFFx1lYl1niutGZ6EQjILlBYyFpPlXNPOeWUXin17J35KMK5M49+9b0QKAQKgUJgsxEowrmJhHNsL8LNMIhsw0LtVEjIZvD2CLRGbKVqsvO2VWpfFE3r1R70oAf1WzpwzLNec9Z0wXmfXecXAhuNAJvO/rCCKdLXbVsiqCKos6gj6qXtjKz9fPKTn9w997nP7W+f9ZobkTEw3I94Uf1bxH2KcC4CxbpHIVAIFAKFQCGwOgSKcG4i4aQ8IHmOjXAIp5lI9hHVFtszHHzwwf2emYoFqUhLNZlV9XSP9ClbrFB7VLg99NBDd+wVujNtzTAN//p+eyKQfSxT9fkhD3lIX3nW3prWZE7anmgMjcypkDvbB5lfZ5xxRr8ly+te97r+nbIZway8G9q5vywjWoRzWUai2lEIFAKFQCGwMyJQhHMTCScH7YIXvGD/IxVuGY5WpZBW62e//fbr9t9//34Tes7kmAo5rJQZ1UWffvjDH3avec1rupe//OW9amrNZuucLkO/qw2FwHoiENLpGRROc0JhoQc+8IF99dg22NO2I/Ox/Z25Rs086aSTuqOPPronnN4jqt1u5ruEoisrQrXdZQiiBcsinOtp3XXvQqAQKAQKgUJgZQTmJpyKyxx11FE9gdhux7Oe9ay+eM1GHjZzR+iW/eDETtpQflrbo3jMqo5Ou199XwhsFwTWOq8Ef1Y7L9cLw7e85S3dPvvss163X9V9N4pwHn/88Z29TnPYj9Weqki44/DDD+8OOuigmfrg2r/5m7/p93StoxAoBAqBQqAQ2MoIzE04Fb1wvOQlL+kQtPxHupVBSNs3g3Aq7MGpmGcbkWXCmsOrSMm5z33ufhN76X11FAKFwNoRkA1w61vfuq80q+LtMimGY73Tvl122aVXXV//+tevHYAF3mGjCKetnf7yL//yT1ru/f6BD3yg/+zEE0/sle1Zj/baWa+p8wqBQqAQKAQKgWVDYNWEU0e2WwR2ownndtmAXaqt9Wgc4zoKgUJgcQgoAPS0pz1tcTfcoDst236fRTg3aODrMYVAIVAIFAKFwAgCayKcuZ/qi362+rHRhHOr45X23+hGN+ouf/nLb8s06+0yRtWPrYlAiNLWbP3ytLoI5/KMRbWkECgECoFCYOdDYCGEE2z/+q//2qfYbuX1JkU4VzcBinCuDre6qhCYhkARzmkIzfZ9Ec7ZcKqzCoFCoBAoBAqB9UBgYYRT45BN+8xlvcp6NHg971mEc3XoFuFcHW51VSEwDYEinNMQmu37Ipyz4VRnFQKFQCFQCBQC64HAQglnGrhVU2yLcK7OxIpwrg63uqoQmIZAEc5pCM32fRHO2XCqswqBQqAQKAQKgfVAYF0Ip4ZuxYJCRThXZ2JFOFeHW11VCExDoAjnNIRm+35ZCecTn/jEfpsxlW1tOXa+853vTzpUVWpnG986qxAoBAqBQmC5EVg3wqnbtkzxH+pW2bOzCOfqjLUI5+pwq6sKgWkIFOGchtBs3y8r4dx999131D2YtqXKbD2tswqBQqAQKAQKgeVDYF0JZ7qroNCTnvSkpd+zcyXCeZaznGVD9sGzVYr97Oxv6fDvs571rN3vfve7/t/+1hbfZ1++jdyCYAyHaYRzo7Bbvum1cS1iF47Yjf1Q2cwY9j5jM7Ep57IlP3/4wx/6+5ztbGfrfvvb325cB+pJowisRDg3Yl55Blv4zW9+09vM73//+x3vodiMc7yn/G7fU2ySPeW3+7g+NrqRQ16EcyPRrmcVAoVAIVAIFAJ/isCGEE6P3AopttMUzvUmdhw2P9e5znW6l770pd2zn/3s7t/+7d/6EfM3YrfPPvt0NoS/4hWv2FcGfvOb39w95SlPGSUWizT2lZzbMcI5PJ/TuRmO5iIxWOZ7cfil5b3+9a/v3vOe93SPe9zjekcf5le5ylW6l7zkJd0PfvCD3k4OPfTQ7otf/GJ/7o9//OPugAMO6JDOC1/4wv1nr3vd67ojjzxyx/XL3O+t3rZpe/FOIpyZX9OuXys+Zz/72Xuy+dCHPrRP/QzJdN8999yze85zntM9/OEP7z7ykY/0tnb00Ud3u+22W3enO92p+9GPftQ//hKXuER38MEHdw972MN6Ypqgxlrb1l4/7f1ShHORaNe9CoFCoBAoBAqB+RDYMMKZZi1zQSFte8ITnnAm8nbZy162u+51r9u94Q1v6L9b1BGFsr3nec5znu4rX/lKd5GLXKQ77bTTurvc5S7d/e9//97pO/bYY7uPfvSj3eUud7meMFztalfrXv7yl/ekE0lwLLJ96ad2Wlt0+9vfvnvrW9/a/exnP+u/ipOHcF7hClfoCXBLNM9xjnN0e+21V3f66af3AYf1aNuixmIr3if2k7b/6le/6s573vN2z33uc3vMBS1gjkxe7GIX6wnn5z//+e7qV7969453vKN79KMf3V3pSlfqbn3rW3cPfOADux/+8IfdpS51qe6Vr3xl96pXvaq3q/Wyqa2I93q02Rje+c537j772c92X/jCF870iElE6ZKXvGR3wxvesHvjG9+48Hk1tKu///u/723lohe96I75jUSeeuqp/f673/jGN3qSqUL5t771rd5uPvOZz/Q25/CuYnMUzl//+tcLzxTRXnZ+73vfu3vnO9/Zfe9739uBY95Hk97tix7TaWmxJ554YnfTm950x2MrpXbRI1D3KwQKgUKgEFhGBDaccALhpJNO6lNsl23PzsMPP7xfc3rBC16wu8UtbtHtt99+3a1udav+3xwJyiOVc5EHh0jEX+Rfutkee+zRHXjggd3+++/f//7ud7/bO3L3uc99ekfqE5/4RH+O1LVrXeta3ZOf/OT++zhZ2jd0GNfa3hBOigUVAyF+05ve1KuviM1Vr3rVngS/7W1v65VXDvRd73rX3gmlkHCqPv3pTy/cMV5rv7by9bGbKE5IJYf+F7/4Rfeud72re8xjHtN98pOf3NFFwYG99967u8Md7tCrVYIZgig+/9jHPtaTzhe/+MXdPe5xj55EvPCFL+zPdSSt29+Ltq2tPAaLaLs5/773va+72c1u1hN+f5tXfpvTeScJJNzylrfs9t133z6Ic/GLX7wnqbvuuutC30mxq/yOwonI3eY2t9nRZfalvccdd1z3iEc8ok+/poA6/5GPfGT/npCVwY68S9/97nf357Xp22xvEfaUVF41A+D0zW9+sw+onHDCCd0HP/jBfilHslfWOw25COciZkXdoxAoBAqBQmC7IbAphBOIyCbSiXwuy/G0pz2tJ32HHHLIDieOssgpErk/5phjeqUv6+XW2m73RWaplB/60Id2pJtRDCibJ598cp8OeY1rXKN73vOe1z396U/vqA3Xu971+kff97737ZUHlQw5WXHe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CoHVILDookF77rln5//MOgqBQqAQKAQKga2MwNyE88c//nHfX2szbX/SFjUQ2T3++ONnSrFt9+zcygBW2wuBQqAQKAQKAQjUtihlB4VAIVAIFAKFwJkRWDXhdKvh9ic+sz6T2nnPe95zKt7DPTunXlAnFAKFQCFQCBQCS4pAEc4lHZhqViFQCBQChcCmIrAmwpmWD9dm+vwhD3lIX1DofOc734odrJShTR3/enghUAgUAoXAghAowrkgIOs2hUAhUAgUAtsKgbkJpzWcYyRS8R+VaNsCQLPs2VlVarePPZ3lLGfp/u///q/z25G/h79955z//d//3XFuzs937fXtd9sHrerJdkQgtt/2bdI8GPt8DJN2Pm1HzLZTn4pwbqfRrL4UAoVAIVAILAqBuQnnSsWBkM2xtZkrXVOEc1FDub3vEzK7vXtZvdvKCGwWMay5sTxWU4RzecaiWlIIFAKFQCGwPAjMTTg1fVq67FiK7aQ9O4twrq8xDJ3R9t/zOqp//ud/3vk529nO1u2yyy690n3BC16wO//5z9+d5zzn6c573vP2n+W3v51/jnOco/uzP/uzHdfm71//+tfdb3/72+4Pf/hD95vf/KZXPP37l7/8ZffTn/60+9nPftb/+Pt//ud/ut/97nf9ec7x428q0e9///v+x3306exnP3t3znOes//tR3v/4i/+ogf6rGc965+osK16OqZOre/obN7d9VUBsItc5CL9+Jxwwgndr371q81r0Do/eZLq3o7/rE1gS7Frds/OL3CBC+yYB5kb+c73rvHD9tkkO/R9bJlts2H/ZtPsPfaf3z//+c/7z3/yk5/0c8K//ZgHrjd/5jnG3gXzvhPmed7OcO6JJ5644hZhKs7OU3X2Wc96VlV03xkMp/pYCBQChcA2R2BVhBMm09JlJxUUGu7ZWYRzfS0sBGuSY80JRhA5zFe4whW6q1/96t3Vrna17opXvGJ3iUtcorv4xS/ekzekjZPNGQ4p/MUvftFXKeYQI4n5N4fYZ5xjJAYR5BD77VqONSeZ480Bz71DZs997nOfibhy4hEjzvu5znWuzjkhsvqgnzk85wc/+EF3xhln9D8cvK9//evdd7/73e7b3/52f5prPde9/O3w/NUQkPUdwcXfHakwPve97327l7/85d2lL33p7j3veU8nALAdD/1tiRQbHh7sSfDkUpe6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cccdu4997GObSKQPSMWDHvSg7na3u1130UUXNTKpFMKv//qvd895znM6x/7Kr/xKd8YZZ3Rnn312d9ZZZzVj3X7rcZs1lmpY6vtGK4uy3377dccdd9ymhQgfQqhudrObNaK1XsdcXxBG7d9+++27008/vdt66603TV9kU/+Uz/jDP/zD7h/+4R+6+93vfq0uqflywAEHdJ/61KcaHuedd1535plndu9973vX4/S/SZuRSv3OYkK//uvmSDjT+WHpk/m62FqUSgbbdT8JqgOFQCFQCBQCGxaBIpwjh36pCWcMrr6xfac73an77ne/u0nl6+8zspkrthuDeFIfNODII4/sXvSiF3W/+qu/umkfZNPfH/7wh7vtttuufX/00Ud3//qv/9oUHJkd99hjj+5b3/pWM8CRzpNPPrm78MILN/XJMVFI1jI2/UG47W1v2/37v/9795Of/OQmBMsfCOdGq8Opv/vuu+8mwomAbbPNNt3jH//4Ngd+9rOfdfe5z31WbB4v9YWibCJWD3/4w9scVye1v73pTW/qPve5z7X5bfvCF77Q5rx75Oqrr+7uec97drvuumv33Oc+t9tpp53aQkwU0vWqdN797nfvrr/++u6CCy7okLDLLrus+6d/+qfWf4QTTi984QtHD8darcM5KU/BpNInYxMKrZccB6MHrnYsBAqBQqAQ2JAIFOEcOexLTThd9la3ulUzRrlZPfKRj2xudTe/+c1Htmjt7BZVU4ui4FxyySWtT7YofTfccEP32c9+tjvhhBO6T37yk92rX/3q7vLLL+++8Y1vdEcddVT3x3/8x834hMsxxxzTvfGNb+yuu+66pvbMUgvXDho3bckhhxzSnXLKKd0nPvGJ7pxzzunOP//87sYbb2w73f/+9+/udre7de9617sW1Xxz6M53vvOiz7OQRuy+++7dt7/97e6KK66YebgxtOhgMeLHP/5x9+QnP7n1/xa3uEVbZOFe/eUvf7l7+ctf3t3xjnds55tEsNbiYoN+UTPNZRvyqE9//dd/3e28886bsHGPf+973+sOOuigbu+9924qKAUUAUNWxft98YtfbC6Z+++/f3fSSSe12D/YwIIifuCBB7aFmuGiz8wBWKUdqL23v/3tu5e97GWNOHtG2Mwb98KJJ57Y3eMe9+he9apXjW7heiKc6VS/9ImSKdROYznXVoRz9JSo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UDKe/P2c5zynO/bYY7vvf//7rXwKtecJT3hCd/XVV7ff/O3zGWecsWHIyrRZYa4hJpRfdUptIe9I+/bbb9/d5S536d71rnet+MTaY489uhtvvLG79tpru1/+5V9u9WRlJqbMbL311i1p2HHHHbfi7VqNC3KPNS4IUhS60047rdXd/Na3vtWaBAsE02LMO97xju7II4/sXvnKV3Zvf/vbuwc/+MHdD37wg84xlE3Pk1122aV9tm20DLc/+9nP2qKUuWVue26o2WtTw/elL31pI+RrafM8W8qtstQuJZp1rkKgECgECoHVQqAI50jkQzjtfqtb3ap70IMe1DG2GYR3uMMdNql4I0+3We3Wd3/jSsgVUPH6888/vzvmmGNaPU2b/dSd9B1F52//9m+7+93vfs2ovO6667p73/vejWQyvG95y1t2H/nIRxrOIVgbRSWbNDkOOeSQpoxJvMX9Up1SRB1297nPfVrd07POOmvF59VjHvOY7h73uEd38MEHd3e9613b9Y0TpRoBvfTSS7uPfexjrSzI5rxRco844oimZPbdh88999y2gPLtb3+7kVFJ1IzbTjvt1FRh2bzV6Nx33307C1eeJ1/72te6N7/5zd0zn/nMVqPV74njpIzuv//+TR3dnO8HOFJ69ZH7vZcNtqeeemoj4y94wQtugvVamF/vf//7m1K9VFsRzqVCss5TCBQChUAhsJoIFOEciT7CScU86qijGhmiNlhdzwr70Ucf3d385jfflDBk5GnX9W6M4K985SvNBTZb3N4e9ahHNRLCYEpyFMoPN7nDDz+8GdiUi/ve977t0GuuuaaV06FiiHtDVi6//PJNhNM+SNVBBx3UVNGNtFF6EG9YMrQZ35l/yAmljGr2wQ9+cMVhsegi9vD6669viiZytNtuu3VbbbVVa+OLXvSi7vjjj2+EaXPfzG8EqU8EEc7DDjusuR0nAZDnByLuvrGIQP1ENm92s5t1n/70pzvlMLikU4533nnnFu/p72Ht1s0ZT8/VH/3oR21xj8eERSseExdddFH3jW98Y80qnDw7kM5hvemFjlURzoUiV8cVAoVAIVAIrCUEinCOHA3uny972cuaUS02a/fdd+/uda97NeP/pz/9aXN53AhGdR+uuA9Ss/qJfhjOVBxGNOL485//vB0mLuvud797U3z222+/pmqKafO75CnbbLNN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OaXbZpttNpHRNdilalIhUAgUAoVAIVAIFAKFwAZEoAjnZjboEsvYEBKf8z78btjt7Ov7/ueVhGd43X77+/1Jm9LXfhtDxFay3Ut9rZDNv/iLv2gE8/DDD2+JgW5729t23/zmN28yPn/yJ3/S1M4dd9yx23vvvVdt7JYag7V2PnMt83HSXOy3V4InKrT9vRvPX/7lX+4o1t69fOc3LtN5952/nX84j53TOHOvlhTKvPDub59//vOftxdF3Hc++90xXo53/Zw313Cs/f0+fFbkmbHWxqLaUwgUAoVAIVAIFALrC4EinOtrvG7S2vkQQwYlY5ZRe7Ob3ax99i7T6a1udatGaP77f//v3a/8yq80g9jffvfy2X6u590WQ9l5HcNwtf37v//7TQxz3zFoGcKMYL8zhGMge/+3f/u39j3l7mc/+1lLhmN/3/nbe4zoGNx+n7T1Cfd6HFrtN0Zbb711c6XdYostGp73ute9us9+9rObiEGIwzOf+czmanvCCSd0X/jCF1qXMxbrsf9rqc2T7i/3g7HZbbfduoc85CFtfNwfIZQhkpmHyF6In7lrLocE5t3vIZF9V+khFiGyCGru52QvRibdk14+px35Pecyb1zD/fOjH/2ovf/93/99U8hlOuaS/a//+q9t95DQzWERZy3Nq2pLIVAIFAKFQCGw0RAowrnGR7yvrGjqUGWhenGlvMc97tH93u/9Xve7v/u73a//+q93v/Zrv9b96q/+aiOIDFDGY8gfo3S4ISlRTUJaGJpRSlJq46c//WlrA+PZ7wihfWJg5zpRc+zTV3AY7La0yf6MY5v90sd++/qKT1SjlAiRLOef/umfui996UvdBz7wge7yyy9vnyeRrkmKqetMUnZWa1okPvMHP/hB91u/9VuNFNz//vfvPvOZz9yk3Im++H2rrbbqTj755Db2sCyyOf+Ryz0Gu+GCxa1vfetG6Pfff//uYQ97WLufELOLL764+/CHP9xIvjmYhZGojP3SNCGKua8QvpXc+kTV/HLvWWSS6RhZppLvtddejXgizubVNddc0730pS/t/vqv/3oT+cw9138GrWQ/6lqFQCFQCBQChUAhsD4RKMK5xsctCgVSxCCWPEY20n322ae7853v3NTAr33ta92NN97Y/d3f/V331a9+tbldfu9732tEjHrICM7xlDLJZWQ97RPPEMUQusDib/vFEI+LYJ9gIox999aoNX1lxGckNeU9YnTn776LXz7PpaxErUWs73KXu3T3vve9W+Kc7bbbrrvTne7UiJqMrggy5RYecEFGP//5z7dyIkhCf1sLio42KH3yR3/0Rx318rd/+7ebgnzDDTfchEzaD0mwPfKRj+wkDqpt/ggMSbr7a5dddume8YxndA9+8IPbIsjf/u3fdm9/+9u7d7/73W3e9O+NzFELKRZ7zMM73vGOjZia21Hn3R/uC/fKLW95yw6RdU4kbz6eCvPv4dxH5Nruo+OOO677+te/3h1zzDHdox/96O7Vr351d/e737278sor2zPHooct7sJV73WpR6POVwgUAoVAIVAIbJ4IFOFcY+M6jEtk0FIdGHwveclL2meG72tf+9pGMJG44dY3YEMgGYdi/J72tKd1D3/4w5vKkWNjNMf4nq8BPLzeMH50EnFMnKK29/ucY4dqSp8Y9JXK9H14DcSBAkX5e93rXtd9+9vfbkl3uEA+5SlP2QQZIsqN8EMf+lBLzgPTGNLzxWGpphLXYiTZAsPuu+/enXPOOY2oDN0tKVMPetCDuje+8Y3dpz/96aW6/IY5j0ULCjH32Cc/+cndPe95z+ZietVVV3VnnHFGmw+U5j7BNCcST4l4IWYWOYyVUjXIKdJJROcqAAAgAElEQVRmIWiuzbHHH3989453vKO5Sq+m26o+mV+eB/e5z326t7zlLd0ll1zSveAFL2h9tfCBhFrIOfXUU5vyye126H2xmn3YMJO2OloIFAKFQCFQCKxDBIpwrqFBY9zFmGW83e1ud+ve9ra3tVixCy64oDvssMOaghmSNit5if0oL1QWBJVSxjUwbpur1XV9RAgTT8p4ZdjHgNWuxbqGpn7l/e53v0YmXI/rI8Vw2223bcb+l7/85UbsfEcl9NKGr3zlK03VQTi4T0b5TMIXyqjv/uVf/qUpVTG042bcd83suyn3DXLEpu+aaEzsS6095JBDmgK9ww47dN/61rcakekf69rcphGdl7/85d1DH/rQ1o+o2P1xHbpvTvt7LjfJucZiGsmYdMyk9vXbmnPNIi5R44eLFfk788i7+W9/iiNX0Qc84AGtVinlzgLEP/7jP3Yf/ehHG/Ez5iGKQ9fatDPzyqIFV+f3v//9zf2UF8F8NuOtny972cvaay1sfddic0pcp/4dddRRrXnc94899tjuwAMPbHPSPOXGboNLvBXWQl+qDYVAIVAIFAKFQCGwdhAowrlGxiKEgxGK+DCAo2z6zIBPjOPYGLCoiOLNLrrook7WU+ecr3G81BCFMOgTEiwGVWkPG7WHe/BcZHqM8hhlN7Gpzg0PxEzsWmJdkQ6GNNJLWaT83vWud21qDsKPsCRBEdzFvCGcXHMRl8suu6y7wx3usCkTaNSiIWbOmy3tN54hHn7jrmm/xzzmMc1NmiJ9+umn/yf44fekJz2p9YfrJ5Wzn90086SvXPdPMlSUZ+0/7Tz5vr9QMCSQGWvYJVY3xDyu0zlmGkkNkfQexT/n7ZNPv4fsh9z2r5kapmIxqZDIfLacJ22aa45xZ6eMI2POn2vNIsp9bHK/81p45Stf+Z/GeMwcX+r7Mufru8w+9rGPba61vASom9kQ9ze84Q1NET3zzDO7Zz/72e3+WQtu6cuFS523ECgECoFCoBAoBBaGQBHOheG2JEclPjPxXZKTyEyK/Ijj4yY5JAcxvvsKzFzqFLJJGRUrhjwlnnNJOrAEJ+n3Q+wb8oToMXqpi9ddd10jd30XxT4mc/V9CZo35ykY2ZSzE088cckuhQhR4qja1DdK0qQFhn333bcptWeffXZT5lZzGxLOLBb0yZw+SGJljKmziD+iL3lNyoEky2pIS5JNOR+Sj/jb91WvetUmYhkSmvsipDXEMa7YIYPcRH/zN3+ze85zntOaN4nYzXLZ5lL6ile8YtNiwULUeNcQK4r0csNNW/r9mfbdtHYv9RzoK54WP/7sz/6sufZbvMpmzNSIfe5zn9vm4VOf+tQWK11xnks9GnW+QqAQKAQKgUJg/SJQhHMVx47ayIiWREQiG+rWH/zBHzSFj2HNkJ1LcbEPg50at+WWWzaiwqD3Yixyi2Oof//7328JSsRmrbY77TS4ExsXtQhRoDRSULiZUkKRTsrS5z73uU2Jkfoq23wUpsUMez/mjVutOEAuwWOV52nX5rpI5aQciZszZkNC5G9jjpAiPfe9733X7Jimn8NFk8Wqdwudwxm3a6+9tvv93//9UVOgn+E1cY5HHnlkG6O4gZubCHSSAXm3uJPyJD67NnIW914LQe985zu7F77whe3+pfq6T6mEEl6lXJA5n8RDi51fozo82Gm4KMYVnbu3pFZc0uOy7zCk1DOGlwIy/Y1vfKMUz4WAXscUAoVAIVAIFAKbGQJFOFd4QKMaMF6RTS6RiAVFk7qZGnsS1ySeUxMZsRQtCqD4MzGJiOXtb3/7dgxVgQEsplASHEQTOZOlFYmR9IOys1BjfSVg6hORSaSEO6vMvBL/INgwQTIZ6JQiGFAF9XfoNtwnPZP60lflxhDXEGSYiuFDGhLft1CsGOvvec97moIkPlPGUyqvcURskREEZOedd27XorD6vFgC12+vc4Ug+b5fM9LfQ3XZd1kUGYPbQrEZHpf7KPdLFLVkL05dSu9UaPeFBR6u28iQREtcq5HFZGGOi7Nzmz+pCZvP5pmXBQ+xi+7ZPj7BZtJ75ot31+SmyjWX2ptSJeZzauHax9/ePSs8C7II5RyeHa4tLlmbZKP+zne+0+aJ79z3w/HoexOMTRDWT9aVBTLtOO+889q9JiYcxq7lmeX9j//4j9s8/tSnPtXcw92PFeO5VDO/zlMIFAKFQCFQCKw/BIpwrsKYhZicf/75jUAiLf0YzRhuVBiZSCW+EWvImGMAIlaXXnppM1Svv/76lghFTCJ3zBR1R1QYq8gZtUy2VopDP6ZxFbq+JJccEizkW1kHJFQCIAQDxnCkDiFpMENKkTbGOBLhlXjCPpkaS5zSDomdqGbi3GwLcbE0rtps0UBCGipRxnMI2hOf+MRup512agsUH/nIR5Y0w6k+cX1Npt7MOWTDfEIuUmM1RM1v5iKiioyEJCFM/bGYa/D7CneumbjPKP1xtc15HNNP1GR/fydRU5LYGH/jjrgr/fHmN7+5ZSNGKDMX9NdrlooYlVQbxDSqU3nuuefOWcu1H7MsS7RkQ1xQ4ZgSQpMI9Vzz0LHw9lyAs3eLHu6FjJXrhjQjfTwn3AMp7TJUnucan/TBtZRV8uyy+INwIpXus5wvz5inP/3pLb7TAgpV1PeLXZRZkgdInaQQKAQKgUKgECgEVhSBIpwrBHcUGYYbI/OTn/xkc6F71KMe1QzEvkLwp3/6p50YPaqMhEGIIhLgHGprSlbCXfZ5z3ted/nllzcV7Oqrr27npXwwLBl3Bx98cDMOlXtIplPnmGVUrxAki77MULUcGuiw5n4KO4Y4Y5mqZb8oh9QghMS5KEUh+2MbFwNa3C33VjgvhHSGcGkrIkPp8jkqbs6ZWEgLDlwYl1Ld7JPu9D/K71gSPok4zVKX+9fyeaHXmkWY3BNUQMQs1+i7ZE86fqh89+NLzRXkUVkVCqNFgi984QttbiFgxsr8MI6UaO7yasMqu5KyRLAZLlBMIoLTMJyFlesjo8ghdZfbvXvCcZ4lvCHEd/vcJ/J9LPpzAIHkVQEH/XLPWPyAgeeSLUpxFgMkRZIc6TWveU3n2Za53o+3HXu/1X6FQCFQCBQChUAhsP4QKMK5QmPGyGJkUtUUUGfkyXLqu7jwPf7xj28xUFzVuNshitxIqaBvfetbm1HIWBRHRdmalN1Sd8T3yUjrWG6Zqbe5uRDNpR4y+PddjWcZ8cPrJ1Mpsn+ve92rkQ7ni0o4n/Zy03ScMjiTyBs1nApKWWLA1zYbgYyvRZoXv/jFrQ5tXy2d73j3iVkIo/uSq3vKrSThEVKFjCKZ7vu+W+vsli/tHv3FCZ8tvmiv5wxSauHFc4krrGdQiKFWJMOvd32xP7dkJBuJPeGEE1o/3/ve93Ynn3xyU1KDAfJto4qK/Xzc4x7XVM9kEB7Wl13aXtfZCoFCoBAoBAqBQmC1ESjCucwjECMvShhlCmFALCibNiQUwZAg5/DDD2+G2bOe9ayWnZX7pBIZkpRwVaR4it3zWwgspWHHHXdsZJQixvh7/etf3x1xxBFtnxh0C3H1XGZ4VvX0fdWo7w6oUQtVDpFN8XncNheyWSSQhfVFL3rRpkyfUYzMIW7Dzq+2aNTUhVxnrR6zUNzn6k8WExBLJMc1kHqqN4XOgky/LNG0c01qWzwX+qR1EoEdll1ZLfz77R2q154f97jHPVr8sGcNN/RPfOITbZ7l2ZHn2H777dfm4TnnnNMWPr797W83d3YZax/4wAd2H//4x5v7Mg8MmHshnkjuFVdc0VytLaTx3hiD/WrhVdctBAqBQqAQKAQKgcUjUIRz8RjOeQaGFoMKqaReUhMYZOKvGHy+v+GGG7qvfOUrLWOl2DJZMJFRsVHUBkmF7Lfnnns2VSGxmNwud9999xaTxaUTWVVj8MEPfnBT2VKHc5m7uKqnn2Tw94nB0GVyLjUrSlgIHrKOACZm0Zj42wv2yUTqd0Sfwgn3l73sZQ0TxJ/C7Pu+omZcGOi+E6eL/CQekkpEoZaZFxlimGuX80cRuvDCC9vxCFPqTjqeQqUt4vacO4mTXF+/LTy4FoLlO+9IgHP4O/GEefdb5mjiGxPr6BrOP/w+8Xve/Z44SucZqyQOXUqH7qRRFWfVfOx7FbhnJLNxP2XLgg+1zpjDHqY+i+20wdP9pZ/Ol++zKOE9Mad9Aje2r6t68wwuPiTU4qKRSPOcmzB35LifG1f4n3baaS3mWNZdLv7iZNURVh6Fkuw4nhjK9yT5kbmmBNRHP/rR5obLHTfZcMsLYy3NiGpLIVAIFAKFQCGwNAgU4VwaHKeeJeqKmMxjjz22ZaVkxNoYXlzY1Nt8/vOf3xSFD3/4w804k4SG2xkVgHsaIw5B4EqL8EjIIakMA1hSIeemNkgQlGyWG0XRjIKCdDGOkTQkAk6UGn8jbP1kKiGXyWraV1ngxvBFmJCukCvjle+o1D4zwL2HtDmv38TPis9lTE/axL0hm+J4kxXW+Epug9zoUzKgOj7E0m9xVYyRHhU7SVni/uj3/iuJqRxvC4GN62R/35DsfrbXYKW9wdI57JMssZlzybLsOj7DUN+QOu8p9QE/L9+by7KsRnXslwNxDHxCcMckv8q9R1GjOFu46WdnDcHqL0qExCZG0T7m0B3ucIdNfTS3+gmGLBYlLnhSdthlfsQsy+lD8pMp27uYcu/mrM0cMPfdW6997WtbiICaohRPiyJimrnsvvzlL2/YcWfmoWEe2YyneGUeGzIHy/xbaueyDGedtBAoBAqBQqAQWFUEinAuI/xR37ipiXXyd1/x9B3CqQg9xUrGS7GajDLJOa677rruxBNPbBlo99prr2a4yXLJQEd+EE3fM9KQm9TvXO2YqKEiFYhnqT4MUeSFYZuyEIx7SUqQnBCdqH7OG9IQhY4R65VyESE0yAtS01fmxmYlndbu9DOELbgb70c84hFtfIwLlYdhHuVUWyikvlM+IkRI/CdXWSpbvxxF1E/9jYqmj8ni2id3fSKWxDXeo0wmM29UzqiUUT6DHzyRpyih3qOG9sczBDNkFwmJEpySJZn3WRjol/jwnf0ztnCJiuw950vG28REIvXGVht9RoLEOFP6jb1xFoeIzJgvhx12WCM6wWTabZ/5NFRPM9Z9csqVXbspgeIYbRIShaRpB8XPvU0dRKSDV5/QOc5YDq+xjI+m0aee5kbcT6aU/nLJpXgKF5C5GQmVlIgbLUIpcZB5dMABBzR107gYJ/gZK3U9d9hhh7bo4LeUfhnd2NqxECgECoFCoBAoBNYkAkU4l3FYoiAx4rmmMTwZcAwprmSM6QMPPLD76le/2p1yyint/aSTTmolE5Q7kWCDwSwuSryUpELiOSU/QWoQGmqCF2M6ytwydmlep9bXkA8k6ra3vW1THhHIuDFG7Q1RChFKwXsEgrGe2oJxA52WkCflRUJkotCFzCIxk4xoRAT5MjaIaZTMSSpxn1DHbdl3XKEZ25LDnHXWWS1WbRJZ5U64/fbbN3Jyt7vdrV0TWWKgW0DgkovMaMek6yceMApe/jY4+a5P9vzu7yx2BIu8hwiHCGY/7wx/Y5h6ln1F2GfH2icLAr7zd9wnHZtyJf0SJClfYpy5rKbOaIhtiLE+OZfzJxGTBQnXMJbps31CVP1mriEzygodcsghLVuza9iy+GCBhlcBsmpRwGfzDO7Iobb08Z9GviYtqOi3OY6Iepn//oaFPruOOGyuvq7dnyeTrjOvG2+Vds69gGCeccYZjTyKRXY/8NJ4wQte0BbVhAUII6D+u7eNrTGR6OzQQw9tzzoeH8YbLhvFU2OVhq0uWwgUAoVAIVAILDsCRTiXAeK4a6ZMCfdX7q5JuHHQQQe1eCdqFmPsSU96UiOXz3jGM7p3v/vdjUByIVRnUdwn0oWsbr311i2xEKJCDbvjHe+4STmLYTZLRZyru0Nlcq5zMQYZiogRhYIKS4VCBkLq4mYa11OkitGvP4z8qI3D64RgOBfioL+MWBlauSTrN+M97rPe+zFgiVV0/RDJENXEFcLBdZMl2PHOQ1lNHcm4imonAmIRgEuzLJ1IEgwQCwQR2XzXu97V4tmyhfT1S630lUu1URnlMBTbi5hQ+JzbuCNAVCP915YsKCQeEiFKLPCksYvCPsS3P1dC9PuGfZTaxF9GPfaeVxYGoszF/TdEMvgm9tHcD8YhtvAJkYWjvmaBQL+Mv1fUz/7ciiuv60RJ5NpKJTNeiMyjH/3oVork9NNPb6Q1NSuj6sbV2rtzm1vmmfH3t/Oas16S4IQcuhdT37V/P/UV72A+TMxjf+cOERWrm+u5DqUPGTP2iKktBLRPRPvjvZh7fikff5lvxte4b7vtti1rrbG3AMPdFslE/qmcFgJk3Hb/xD3XPeE+czxVVIhB3MsnYbmU7a9zFQKFQCFQCBQChcDyIFCEcxlwZTQzzMVmMoARSt8xmBAzJBPZlJn2rne9a6vNJ1YTERXzZJVfLCZVFBmRSIjhvMUWWzR18BWveEV7p4ouxTYkJjFgGcKUGUYx0oPoMf5TBoRhjzx6MZSTvMj3KcWS9jFCGfb6k5qA22yzTSORzqs/fo9aRw1Dup2Loe/8jHBEgpsiN0pKVGIoh9dbClxyDn3Wf+3lIisjMMzUFBRbi2hTohnSCtzD7G/+5m/awoEsn333wxCxofukxQTKJ7IuthPxQc6pX+YHwrPcW+ZBXIRD4hPbGSU0MaT9+M64xfrO/vktxDDutLlG+hISjbAa68TJ9pMRIYhefnd86jvax4KEcyCTj33sY7s/+7M/azVpjZdxEXsZJTZJoOyrveZbFhfSLudyTr/7nJqV9nVOcxcpMvcQT+OC6HIdNVbuhSRrmqZUTvvedd3zxt/9oN3OZd4joZ4lfRKa86wVwjkk33G1Fc9MvbQog0win7w1bG9605vanJdIzX1tnujXxz72sfasdO9bZMtcNCZrsb/LfW/W+QuBQqAQKAQKgfWMQBHOJR69uJVRqLhXxnh1mSh9Ypm4TzLcuZhxo2Rwv/Od72xF1ONCpqzJueee25RO5znqqKNavJ+kQn7jpjaXu9lQGZlk6MblVbkNxI9BHdc/7UX6GH3UF+9J3jI0Lhn3FCLn2WqrrZpRznjWbr8xEhEFpJQBzVhnRHMRDlmNy+WkIen3JaRt2Ib8PSR4YwzzIQFMDF9fSYJ1FEqqNRdBSvMHP/jBRiyplRYDlIJgQFtoQE6REAlRxGvquy3n7Sue6RfsZKpFcmS5haexoApLfvOhD33oJufo93sadsPvY7Snn30i7Le0axruQ7z6feqPz6T9pt1y8QxwDyFbfVdeZBHxR064kkf9Fu9s0cK8TMwfxYxbOhIvU6rv42psDC1WUKy9Gw/zD4FE8CmX+p5YUnM38ZkhttqPEBoT+5r3D3jAA9q7EiLI5yc/+cnmIu/cxr+PTz8OdIj1cCzNAfeROWEewAbxdh0x4O6f/mLLWlNBs/gGR54B+ssLwGKZRZnXve51bZGA2imLsJJQxtmYmev2+cu//MuGL0yjdk56Bizxo7xOVwgUAoVAIVAIFAJLhEARziUC0mlipCOaXMkYpYzaqDJW7RmhlEzkSqwS41SiILUXGc8IBnKHrDAqGWMMLiVP4kp5ySWXtKQ0c21RCnOMfRFJig+lLkSYQYtIMmLFlLn2pNhBSo9jU6eP+sAAZpjbEpf2+c9/vp1HMiTKz7TzLSHsK3aqkDPqjAROxkrpGtk3uW0iJhYHJHvqG/6w5h5oTM0JRMGCBJIaIpLxygJCSAmMxezCmdst3Cl7yJF5I5OxLZlnlyPmbdLCxSRSOY0ETHIJHRLUsQTCubjKUjF5AojDRDYRSLVrEU1qGldM95ONWsztG/Fz38EamUVeKO6Jr7QPFbOfpMl5eRggpu5dbraONY6ILiIVl27X8Zt7nueCBQjtNc6Ik3sDQUzG4aiqY0qB9OeTa4r9pfxZILKZD0q+eJ5oY/AN4V/NOMgsJJi3xky5IGVTfud3fqd5BAgnkOFWpm3zee+9926LLQi9hZrHPe5xbSHAfOeKa3zM82lx3Cv2QKgLFQKFQCFQCBQChcAoBIpwjoJp3E4MWWoEosUlVuKMrMgzsCT/2XnnnZtRyDVTzKbamsoHvPSlL20GFVLKkDz55JMbiUNUuOoxshimyCxDjUI6zYhMfCXjmTssshIDjuKSWDFGXH/jXujc2uOF7CCZVCWGumOVYqE0MMIZ4MgpNWK49Q3kELX17goHVy7Pl112WSMpNgTCmCM51F0EdLgNk5/c//73b8lsYEzxFd+LqCIKQ4UqijnsnJ9iiiRpBxdrcwDZ4JpI+QyZGUvgps3sEOB+AqF+UqG4zMb9NvGqcbtNbGjiQJP91jxKXKdrJ6FQXGjHzBH3zJVXXtmynu63337t3rAgQgGmmHFvhqX5m5hhuMEbWbPw4pgQF9c0hx1PeUcy3Xs8CPTH/WNfeCOl8Pe3hRp1V90L7ilzAul038HFQoO/uYpSW7VBu4w1V9y+i+y4J8z/i+cc3lMWO7jimhfuV9exsCFucprCOvaaS7Ff5g6cjQvXWgmFtFEcp0UcGHlGmjvukcR1Ck3Ybrvt2iIW/NUZ9gyNar0U7atzFAKFQCFQCBQChcDyIVCEcwmwZUwxfpJIheuYeLxkqUXkGH1PfOITu/POO68ZrLLU+huZRE4RDwYVt1rqCLcz7rb9hBmaasWfwU3VSTwT45/BzeD1CkF0TUZxkqT0u0qhEX+IAFPOuCgijwxnSglVhiLj736x+0lw9d1Oh0RnWrzaEsC+YqcImXJBBrM+IRzIOaJJVVN2AxG3aNAnibMaiZxQdxjcjrv00kvbQgWD2hYVLG7CWWSgcHEXRaAY8MiG+YcsKUlhntmX0Z45keQ45opXXFcTkxmV1HXNGfMQITBf++VTUkIlJVOSHCvz30JGkvQgXUn0RI3zPWKHqCNFSbyUfuZdG5wv2WrN92SydT4kHyGk9jtn3J2RyX322aeV53ANZFH8MxdlxGYugg0fhMYx3Muj4LufqJgpv+Jetfjie+1D9tw/joWFe+dzn/tcI6/GlyrtHoWnd88DqrXFHIrexRdf3LwCnDcEPv2ZS/3suysP7zPnpsBz+dYf9zFijLy5z/t4J/HTGLI/az7P9XuuGbJs8YoLLfdaJNyinN8oncg93FKzE57GQz/0TRZbHiLJcLuYdtWxhUAhUAgUAoVAIbC8CBThXAJ8E6fEzU+sFVe7JA5hgHKxVCIDKWHcicOkajE21eBkTDEM//zP/7wZxWI1k6glbmNxA2SYUUcRBmQDofAbl1gvRvGkjXqAxHJPQyAYt2IN1cNDMFPMPSQn76vpircEQ7Mkp4jSwtjlJknZNS7cYilqD3vYw5qLI/KJBCHo1BsEJHMjcXZwT21GMayM7myIExJJ/XQ+6hnlkprXHxefY7QbH8QXoUIsuTxTuZA+Cw4WNLh3u45xR/LMkdTYTH3OtAEpiKqJUEn4ctxxxzWFPOTQ56jm9jEXkaioniGu2qDfrqcdCCMMzdN+fyYRnbQjmWQRuhBB3yEkEkgha9xdXTv3CgJvTnvXLmMhUY0kT7Cf5cI61yKJdlisgTHSy4NAP70s7qT8TIglQuR7zwYu8sYI8aR8Gjfj6FzUV94NCBiSD6eFlgXpk/bcv0g61TDu9Nrieha5EkdqTFbifu8/2yxqIcEW3dxXSKdx5KZO1YRvFGzPS8nVzKnXv/71m8pKldK5JI+5OkkhUAgUAoVAIbBsCBThXCJon/a0pzWjFqFjGEV9kBBIIhmKBqOfSyxSwe2PCkPpRDRtSAPiF5LSbxojjfsgoiBrqX36JT4SJ5WSFgxjqpljKDAMTDFtlC+kp08wop4lq2TIwHIrHksE/bKeJuSDgUvVOuaYYzaVt+EWKTkQ4xhW4nBtxucNb3hD21+MISMZabUxnhEW6o1FhiSrQT6VXOkTUAa3uEQ1OxFZsbwSFMVttq9+Z6wsdiDACAZFyHX8xkVUyR0qF9JDJUJAs+V47ylxom2pbYlQJYMsg9/5knzHfilx47choRu6CWe+DZPnTNpvOBezDyLnvuERIOMzl/T+Ig+XdAs8lFHzX9sl4JLJdixBmUQ8893wN/cOcoSEIo/IMYxcF9ZcSI0nAowMW+hBwI0XAqqEiHNQgSmTFoMkmbr22msnPg9mTfqh18FwnC1ocE3lpg0310GK4TVU1ftx4LOuO+b3YJcyUUinlxhnCwKIuMRQVEwLeBYX7Asjz1eEXOynOeA+m1bvdkxbap9CoBAoBAqBQqAQWH4EinAuEuPEJjHazjzzzBaXGYWIocYYZ0ghlkgAtYmLn9gqn5GVfffdtxnOQ/fZYdPE6DG0EjM5TAxEUZOQCEmhEjg/Uots9g33zcHNdZHDNvpw5IRxjgwiE1HSuLBSIimQEjox2BW0Rw4Z8tz9kBtzAKmgPHKTZSwjmvY3B4yhcWNMi/FDSMQAc8vul0JhhLuexQrkjtusup8IXj/hUP+z+SbrMTUN8aSkIUGMeu6/5mSy5o4GZI3saFzgiFTzFqA2q20b928kz71i3C688MKm7FnkcS8g7UtNoqbBgrAj9lyltddzgrcBd3ZzyFggn8Ya8eS1YD8LRcigjNQS5SzlNlRAXZP6KXbcQhXyJ06Zyho1MgtZS9kO54r7ORXYgoD7Alm3wOO5qe/uOYso2uJ5abyRTGOvre6v2gqBQqAQKAQKgUJg7SJQhHMRY5OstMgB49BqfDJEInwyZXL7E1OGJHJN5MbGJZDqyc3Qir3frOB7n6QqhpQgNEoH9EmFVX4kk2suFcqKPzIils/WTy7Sj/laRLc3zKFRwrimImwwjeEt7kxmWgQTQfA312ilHChrVEwqDfdnLtTcYpGIuDEaf6pc5hBQxTuaR8ipazvefGJgU8WyIZLKsjDIEU7XpF73s23/WbQAACAASURBVJ9m7JO8R3sY7WIKk3gFubUg4hoIhvma2NH+AsVKDfhwIWSuvzM2MKC0IpZIpyyoSVAkttYY+e3AAw9sZAbxE189VuWc1Pe+23Hip1NHFnnz2Vi6zxEqOFOX1d/N1neX5QWhLAhF0yKE5wUXU88DKrmFjuWoM9uP4+xnNzb/eFvoi/lAbU1CK+1fas8Hzz7PS4sFxg8O3KE97yzm8B4xN2Xstolj5x4tXlriJePMa2Op27VS876uUwgUAoVAIVAIbO4IFOFcxAgzGrPKvvvuu7cV+hj6iAgFScyfVXgKgmQYCChXV+oXEhJjay5jCSlRNB2hueCCC9o1uGkqL0C5OfXUU1v8IGLUd6UrA2wRg/v/J+uIAEWKOtYnQBI6SbgkPtDGnRbBOOmkk5oqg2gaN2onYol0MKqNPRLhMxdG4y+zLSNfPB3DmoKJZMTl0LnMI+OPWEqGkw2xoWiLfUMKEFmkNoQmSl7IBQJqkcJ8dE0KnDmsj35DcixcUN6QUERX8hvtN9ec1+fEVvpbX3Js3GVDWL37zT6JMTZP7ZdyJlTXsQpaf9EkZB1JQSaVHkHuldWIciYmWgkbrspcifXVGPEqgF36AockT0oyJTh5IZXam+REVED9933ie5OgyT5cZS0m6R8XeUSKu62ERvZznVwbqUOYvSwG2B/JMz72P/roo5viPSvudHEz/f8dPXx+WACxoGL8xFpSxBPzuZTxnuY6TIwTpZqib764dzzfhCJ4aQPczXOLb9yqJT1zf9ZWCBQChUAhUAgUAmsTgSKcixwXGSkZneKukiyFcSjmTop/RJBBpBg9lznf77bbbpsy2EZZmEYOQ3KoNNwpEU8r/ddcc01TAxink5KELLJbG/7wEJZkCw35g7WYMkRTWQ5xZgjkiSee2Axic4CaxZUVmUAiKZUWI5BNRMX8QBwRI9lQkUwurmL/qKMMbSRM0iCJntSdpHApkcPtVtu4YVrQQLq0yTmRVPNDjVZERUxx30078yRELYQBGUIqxA9KAIR8+ZtSF+WdKygVCXlCeLmmik9FrpBUr8R+5t35XR9pc06ukrCgMHItdm77IIKwQnQTQ+gczo3suq7PMEDI/D0kOzBCOhFluFI2nd89B08KNAUUyedanPhO53Et44bIuAbV13UQeKp23Jb72Vzt36/hqY85j77qt/4YR+eCT0i5zyHZIaCuYx7B1zMi/XUd47aSNSf7z5MsGPjOPLHBJVmyl+JBkeemZ6CanMZKbLTYW2qm+SEu2vOPezjM3F9UTkSd+7TFn763wFK0q85RCBQChUAhUAgUAkuDQBHOBeLIuGGcM3gYRgzjuC8eccQRzSUOCRWvyZWW4UsF5X47JAGTyGZKcTB2GeriMZ1PVlTnQwD67rIL7EYdNgcCcccUR9evb4nMKcdBhUGeuPZRq8WdvfCFL2wLEGL0EBdZR6mHjGVkizJj3ihtIwkQ0pZFBedBXLnMUtFsDGsLDIhpFElzA5nhaui6DHQkJoTJfKLsKbvj2uZJal/259q0WF6qH/KJmCUbLfImVg6Z0hZuueZxkgTFJTLz0m/ak3hmn72QMq6ljovymWQ/SCeVCz5JdJTMuMmGm3qySGTKsiB7yBqC7HpiD7VRv53beZ3PmNknZVxg7OVv+yGBwcd1U5bFtfqxssYl7TMOKd1iP2QsL9/ntxDOsTfcasdZD5MjTUvoNLY/c+2Xc2eRR2Iz95D5a2GAKu2+smhjjHiH2HgVWFygbIvttPi2UkrwUvS7zlEIFAKFQCFQCGwUBIpwLmCk+wTB6rtV+RSRZ0RTJ5BLBq/ELrLWIgd9BXSuy9rPeRjZyI4MtxLGIJ2JH2PwrqTqsQCY1u0hIfIII/IV5STjjrgglIxgZOeVr3xlGy8EkqsmtYX7KzdXiptzmBOUT+SRykahzDiH5Eg6pYQOBQ9poYxxG6SkUnYoq9Qc14vaxGVXnJuSEsrpMLjNRURHsiPXQmDnE7M4TEaVgUQYEU0vpLBPjPUBGfRKIq2od9qTciFIBTKBwEUVdN7+FiKarMnOjbA5FqmLV4C+ugfixhuy4d05Qhj97rjUyTSOlMRk2Q0xdA3KnXH3ilI76z7ru6EOJ325tc/vMZC6mtyuEUous+aw+Geq+2te85rmScDV25wyXpJA8SSg7tdWCBQChUAhUAgUAmsPgSKc8xwTxmXUzcRM9hOAIB2Jc0NEKVSJ1Uuc2tAIzTmjRDn+jDPOaC6USj7ITpt9hq6EZdDOcwBH7i4RD1dXJDFEJrF3kplwdUXwEBNGsZg7cbvKcVgcEEtorCh23CWpg9xvqd/JMtzPlGrskTXxnMgkw1sMH2JEUaWmUjh9JwGOpC79eccYp3xLisMoTzZdKpF5+IIXvKCp8JMUzrhQ9uM9wRQi14/LnM98c964hEaxRxqdI9/33TeH585c7983IZt+83naPTVymOfcra/yZce0sR9LOjxJxVEvHP3MB+q656ZEV9RrccmUTvelRRb3gn0lTBOuINmSe6e2QqAQKAQKgUKgEFh7CBThnOeYRO3ixsXF67Wvfe0mMkiRVIJB5kRZTblb2hJjN+1SUYQQERkXERiZK6mbMcCWMkHHPLu8oXaPEkgRQwD7yqCxkEEUCZQ8BbFESpW0kdyEmm3sKZvUyrgISvjjxc01bqXTXP8mxaGl8L1YYMTSuVyj7+aYdlJeue1y5Q65o35awEBaEVnK3pe+9KUWByweU0mKkOAM9mq7dG6oSVedvQkCuQfcQ1yjLbyJV6eq+453AJKZRR1z1xwXxyu2eD6LIgV9IVAIFAKFQCFQCCw/AkU454kxY4groVV3RnmfQMgaS8USv8nATwZal5hmBIWUiLXjJkYhlaWxnwxmnk2s3ReBANyRfmSTYjgk+hRPpJOLH2PYgoMkL8bNd0rjiBO0IIFUUmjE74rPHDMfND0uvUNXTUY3l1puuUN3XMfFZVvbZdGVeIU7r7hfmWxzbmor8omUcgnnehvVERmVKRQRlV2ZKkrJp+TOZ9FjrhjALMLMdV8sYggXfOg0ZdJCkjhQhEfMp3djmfvfeCWTbdTgxKVqTModJZuv98SRpoSLueKz7/vvSWqU97VEpua7KDGf/XOvmI+ehxI+mYsW8iTs4mpO5YS9xR7f8QRwz87nOgueLHVgIVAIFAKFQCFQCIxGoAjnaKj+347cuxBKRlASpyAhYvok9pFIZJaqGXdDBiYSI0OpQvAM+2QGXUDT6pBFIBBDVbyleD9/h2TlN+7NypQYa8a/TMTcZrnXIqpcWM0P8ZdJFiRT8XxiKIddYFR7cZVVb3Wuc8X1WqZaZTbMLaqr+DZZb5FJSXUmKaxiK2Vele0WCc07Aot0UUeTGIfKq4/INnIqlk68Kvdh8adjk+RMIqbp/0qSqz6Bt0hg0eg+97nPprInktWYF+7PZK5NrGmyz4Z49om5/sE1ZN9n3yV7r/d+giUY+9u54nacciz5Pufvuxwn3jQE1m/arL3Gyvj4Oy/f+c33XtnHsysvY+j5NLZkTX/eLsW4Oseuu+7aFnMe8IAHtDnpvrN4ItZZQiFeBeamOXfxxRe3usZFOBfxEKxDC4FCoBAoBAqBZUCgCOdIUKN+ML4ZbTHsqZ2MHmn73/CGNzSlI4botFOHMMgEyrVRHNLb3va2RjRTeqGyLY4cmCXcjZG/3XbbtUyxcYfO6Y03AiJ287TTTmsufuojitmUNVM2V3MAUeHqRwmjvFC8F0M2Xd+1xadxfaU6Jo5xWtdTH1LmTqVRZPIUdyr5lDmHiJpfiIVzUuu5JCKjSZoz7dxIj74i2eJJJTMSc+o+YPhHAUz5lz5Z8Tm1N/OO6FBQU4IkJIlCmHIrKbmSBEFLOOTtVCEoVDIkRikOC0pIDYVtLW5xtU9sbJIyIbR5mQdRZn2mzPqb6p3yN96NZ1TbHJvSLsk0nMRJifP1t7HqE9ckW7LwgJwbVy/zKwl+HJOxnbWgkHFRMkj5KbU2JeMSL22Bx3ym0tt4h6gZai7OV41fi+NbbSoECoFCoBAoBDYnBIpwjhzNGD9KXyAmErcgE0gIdZMRNUbVjHqJBFCslFRhfCcj58jm1G5LjEDGlyuqBDuSkAzVTS7T4jUZtUgmUsJ1VjZN88I4Uj8tQHC1pXimfudCm5t2Ud0Y8lTKuQz1LIwgEMjT9ddf3wiFBY2h8oN8cNHlXutFQUJGoqRFHfMuZlV8nD4ih6m/OcbNtq/iOb/rIqvUVG3zN6KKpIYI+TvtSIwzDBGXuA4nm26UuBDSfnbaZKtNXGAy22YfmJxzzjlNRUOGlKtxT8IC2UrWXZgnJtaxwTKurtpmn7TB99RgzwXEPspjXGb7GXDjaqsf9k0ypCRGGoPxfObXNNfhWeeIV0bGkxpr7LLQYEyNH1dznzPGVMfLLrusfW/8ncexNn2DEay89J9inhIn5hxXWgo91/BnPOMZzaWcO606tNzG3ROewRIKyQ4utr62QqAQKAQKgUKgEFg7CBThHDkWUakYg0gEV0rqEWISl7d+1tFJpw35kAyIIkRF69dOHNmU2m0ZEAiBQOrEYPZdAkMmKJiKzSvDQHGx6IA4JH7T4oO/qX6UMcrMLDVyTFcY1xIUnXrqqY30zdqQK3Gaj3/84xthuvzyy1t704/+8SEfk0gsUsC1GPlzPrGoIReIIjWsT7iiSCKjUSyRCFikBAlCkf1Sw3NWf+b6PSQoRNS96D7zSg3QEKSogHF9TYmWbbfdttUcFYOLBNsSQx2S2SecaU/f7RUOUR393idlcEpbHNNvn89+T+kYnz0T0q+Ulsnfzm2O5ZkTAp3v4Ut1DHnr1wL12eJBv4bpkACPGYtpLquTvtdObrDHHHPMxFNnvLIQYb5aXNltt926Cy64oMVEI6477rhjSxZkoe6QQw5pXgbKRH3nO99p3yG+1NR3vOMd7V6prRAoBAqBQqAQKATWDgJFOEeOBUNRdlDuktStG2644SaK0Sz3sNSX4/p1/vnnt1qKSYwx69iRTazdFoGA8eW2ytDdf//9N9XedMrE4XHjQwAo0zK8itFEvCQrUQuTukIt87csmkn+s9jx5Tr49Kc/vTv22GOb+jNmE8NJjWScU1rV9pzWjj7pnBX/Nu13JMkcRxhgklqdUcAoX9xw7Yf42TeEzX3Q3/qutH3CFIKKMFEjkSvvIVDTEu4M1cQoilE/ubT7zO141liFVKaEkaRLXDxlD85CRQim62p/rpP3qJ7ajRymD/lbv7Qxqp999H1SXGyfwMLUy6JAXGNha0zg7nuvZF8OAc+7a/YTVmWRzfcWDLQHYe3HeJpjSYKU/obYJixAqAGMcy9Nw5gCarFCXz1nuadnsxDw6U9/urm7c3vnXWLBzr0m9t05PVst9lgcqa0QKAQKgUKgECgE1g4CRTjnMRZiupAOrlwMuGEpiWmnirLpeAlkJBuaz/HzaGLtuggErrrqqm7fffdtiwm2fs1FCgvF8JJLLmnkTX1URq8YMioMdz7xnRRIRrlzJO5tEU1qh6q5GRde7oNjNqSZezBXXy6NS9WWMdde6D59tdI9EwLlXsnfIashTnmP62uyx3pPsqW++pnY65As50ZSeCtQzGZtce91HjVPJU1SL/Laa6/dRMr6GWr7amquGVWvT9IRcv2Na7HP+mCf7IdE+t55QvISLy6BE7XP3OT+LDb8u9/97qLiGbMgkDjR/vikXd5tkzLvai+iiiRyU0ckp225lkRVN954Y1soMdepmrkPlSDyNxd2GFM+JcBSZ5bLrmNOOeWURjiHNWdnjWv9XggUAoVAIVAIFALLh0ARzhHYxtBK7FZix8bEVqXsieymXMS4RSY50JjjRzSvdlkkAlHtkAfGal+ZzG9qWzKquc3KUnreeee1FxdbY4tocsukvnD3S8zgIpvWDhdfSVUVuzaWcDLKX/KSl7TMndTO1d5mqagLjStcin7xNvj4xz/eaujO2qL6SYTDFRepm+R+7Tyz1OJZ15r1e8gsEop8UQgRNuqyGFTJobQXGUdEJYhC2D772c+2DMO2PMt8jluwzynvkjbMUn7nait8PfeQw0lbf248+MEPbq7oiKzFEhlp8/zVP8Tefea+u/LKK1s9WirrwQcf3BR0CinXaAtAtRUChUAhUAgUAoXA2kCgCOeIcWDwSM/P4JekYuwWg1Mdue2337570pOetOgkMmOvXfvNDwFKpXFS1mTSdvrppzdFi8ErU2aMZIlMuNMy8LfZZpuWFEWMbgz4+bXiP+8dQoAIi+VEIOfaMuco6Uqo2P/Rj370YpuxWR+PnKiTSuEes1HBKWwSSC1FjO6Ya44Z87n24e67xRZbtFhILqjImXI5b3rTm7rPfOYzmxIxLUd2bC7d1EkJrObazHV1NhHov/u7v2sLN+I/LfAEZ26z7jmZhC0CUaW5rydbLZVXIi91OmsrBAqBQqAQKAQKgbWBQBHOGeMQAx7R4E7LgB+rTDKgZAGlSolBYkgxVBejFqyNabP5tQJ5YOCqoTkcH4r0n//5n7fMmVwV99prr03xZVQY6spOO+3UYjolFOLSuJDahdNQpVIp+UC9oqaOIR9cC81XyqikKrVNR0AyqOOPP76VQRmzITxwFU/rWTDtedBXPifd88utgOb8/Rqj/WuKO+WGSrUXH/y+972vEc8kP1uq55TYaCrrLJflLOJQLd2PFvfEL3PJzW9irLUVcT7zzDNbnVnEk9pMQTUu7k8Eu7ZCoBAoBAqBQqAQWBsIFOGcMQ797LRikrjVjjHEErfJ9Y7h5H051IO1MY3Wbyvi+opIUihTiiI9YugqOs849xuXP4qYrK9cFg844IBWb1NmTYRQqZTl2Cg/CO1FF100k3Ay7rkxyti5xx57NJWotukISOJ1xBFHtAWFMRvCyWXZwkJ/S2bb4Rwac077DAnoJMI6yfU4iYxmZcnut6Pvxup7NVsl6aHwUyItjk1KUjS2L/37B6F1D0nKZJv2/Iwru9In3NUpm2Jrlarpu7mLz+RWK2aa+zCCakFI6R/3KZdh98BStH++/a39C4FCoBAoBAqBQuA/I1CEc8asYOggIhKwSC4ydkM4JWux2s6IW241Y2y7ar+bImBBQaIWpUO4Gk7aXvSiFzVywVCmrlAbLTzsvPPOrbwNo5jyYq4wlJd6M3fUhmRMj4kzlMRIRmVlIrj4yvhZ23QEJIIS9zc2A7AyOAiaEjrZsjCFqFHbEKyU+vAsSEyksUy2XQl1/J0475SYyXv2SzZe2WrFKw4z86Ze6qzEUNOeQf2yThY0xDJzG067FjN3XNPCDJXdIshcz0G/uYfcX/e85z2besldljLKjT1KMmXT/ajeJnddxBT+yhSlzrG4569//etzEtzF9KuOLQQKgUKgECgECoHxCBThHIEVNy0GzWGHHTaKOMb4ZCDKorlU5TFGNLV2mScCxuYJT3hCc92bNr4IhtixGMKJiUQ6GMWIB2NXDOAVV1wxSgGfZzNbMqP73e9+raTOXBuj/eEPf3gjC0iP2DkxbbVNR0DyGfHV4v/GbJQ08bGITggjcihuFslUm1cSIi6e9hlmrU0ZGAsWVFWEMXU6U4OzX+7Ed87Lw8LiiLIz/Xqjnjd+t/mMoLqmMibII/UeQZM4KJm1Q+4SG9nvx6Me9ahOzLK6q1FNZ5HZuXBDwtUtHvP8DCGV1dYxd7nLXZrbr79tcEFGLRDxKHjXu97V+obUWuCzSY5EJbXP2PCHMeNe+xQChUAhUAgUAoXAwhAowjkCNwYNkvH5z39+kwE212GMIqqmUhZVhHwEwKu8C6P1ta99bSMJk9z9xGmK85M0Cvl8z3ve01psIQLpZOweeuihLdaM6/QYl+v5dpmSSrXMtec6XhIjSqgYzpe//OUtg+5ytGm+fVir+yPku+yyy6bMrbPaKb6QYofYRQW0IPG0pz2tEciQublca+3DHVQmYUQVCU2JE9dHLo1Z303XtUIAU54FwYwSymXf3xa5zBfx49Tu+973vq2t5oHrWiCxECFeOSQuGWqTpEr9VK6rkmHZf7FuwtyQn/3sZ49asNMmcdEUTNemaPIU6bcVkbYAc8wxx7QyVTDkiYJku5e1Vybb2gqBQqAQKAQKgUJg9REowjnHGCQ2iiHnc5TLuYYtBqj0/FSpGIOrP9TVgiECUVPUzOSuSsXpEzO/K8UgBpJavdVWW3XHHXdcK0DPoJXhU71L2WPFSorlXC7XaUlQFLo/55xzZg6kJCpi2hjq4vKobLVNR8BCg9IxY3GiahvvxGRTAxEfhM4WUjhrLiB36rly/6TKUR8tKnhmKA3iPHnmhPClNJNrI1fe84xJLUzv9nc++yCb3Hej9rkeFVPcsTaLR+Wqm3JNua7zIHz3v//9W/ts841DDwYnnXRSy+Y8ZnMM8kih5w6OOCLHErelD0g/ck/J/chHPtIWWCjGXG/FjFqY0c/aCoFCoBAoBAqBQmD1ESjCOYNwMmJkL5W0ZdYWZcPKO3cwmRRrW9sIWCBQgoESNImQcrWlYjK4JSLhSsl4pyJREI888sjmwmpxYTljJZWxeOQjH7mp5MpcqFJelXhhiGtbbXMjgNy5V8VGjtm4NYvZdb9TAk844YTmUj2LYE46t8Q311xzzSayinAiiBTT5diGSYfELZvHvDfES/ZrBIfsigX2/ENKh4sys9qYpFxUR26xY5KuBcejjz66tYkHAbLqXssioORdlE3u8BJ4WTTwzEVEE8fZT6Y0q531eyFQCBQChUAhUAgsHwJFOGdgKw7L6jwVYNYWQ4kBxOWOEbdWY4gWYhzP6v9Cfh8ahYt1/ez3a1Yf/Y5oGl9kbtL2+Mc/vnvIQx7SxvJWt7pV25chztWQ27RyGsaa+2FqZC62D5OIr7g9bp8yz87a3vCGN3QHHXRQS3RlwaS2uRFA7kL0xmClfIh5Yf6IG7T4QPWcz72euYlwuv6NN97YLm2BAOEUV7rcW9xntftBD3pQd+qppzYCx13VZh4nodD3v//9VtrJMfOJ50w/Ke5U4LEqsuOQTPGyCO9b3vKWbp999mnXz0Z9lQH8K1/5SvvdszoZmR2DTCfZ13JjWecvBAqBQqAQKAQKgekIFOGcMTu4cYnPG5N4BRFhKFHDZLQd44K7WpNzqHRMawcDL0ZeFFwKghizvgse5SJlCHx2TPBw7rgEhowlZsw5GbWpU+qzc0s04hxIHoM+5whBlSTF9RjC3OqoLz4PE6PEcJ7WP8qUa09bUJCtk8opGdDtbne7RjC1QZIZxrMMp4xpbpVcc2ddbyHj7XpwQHJmlV2RYIbbr8y6SBAlrra5EXCPb7/99jdJ7jPXETIRI2Y2OIs1/PKXvzyvONkkEkM4LVB99atfbcdzc+W2ar6t1Jb72nXFdpo/l1566ab4VPex55kas1zP+3U9x7aROskdXCbgMQsy8BF7KjFQstWeffbZzY02x3/0ox9trrPiQ3khSCYkjtbme0mDxHbWVggUAoVAIVAIFAKri0ARzin4Z2WeEYbcIDWzDCXHUJYk7JCshdE035in5ZwOyAgyh8DJdilpiXfEkbuov7UZeaOy6I/99YG7IVdSOCQLZtzj/O67fO89ZSCG/ZmG4Sxsc54kS9GHZPuUHEU2S+3gfuf6Pkvgc91117W2T1M7GaZKncgsOmkTo0lFYYhTTRBMbeWyygCnoJx88slNWUF256NyzWesuW4iuRSfaZs+ijk1B0855ZROsiMxgrXNjcBnPvOZloBmrHJnzlC3bdxplfuQaXYhY298LK7IkOv64hbNMXHCK72ldrAQAnM7GZFzL1t485kSaq7Np79iiZFymZzH3OvO73mlPiplFNH9oz/6o3avZlPKhou73yysKJHCNdqxu+66ayOhlNvaCoFCoBAoBAqBQmB1ESjCOQf+iCN3rZQcGDNUX/jCF5oihnzYxhhXs84bBSIG3vCcIZEUOG2m2PnsnWKYdjgPVVBCI8lEJMLxGZFCJpOEJElH5mNQzurDpN+jssZ47auuIYiz8Ev5CKoLHGw+//CHP2xJQxit6vEhBJPOxbDnTgmL/u+pz8lARtwojJIEwcv26le/uiUJQhbEp3H3m29821jMYOE61Buug3Nt2223XSPI1B/GOqO8trkRQDglmhk73ymaIfLmgcWGhYx9SNUb3/jGlvHY/ONGSlVfrS1JzyScog5aiAnhtIhDYYSVRZ2xBF1fKMKePep8zrqn+32XGRrGridDdOYz7CyQib/mdfDZz3623YdqoMYjgIut+6a2QqAQKAQKgUKgEFhdBIpwzoG/FXWJLv7gD/5g5igxchBTho/4voVuIVp9RQ6ponBRr7iYUfPE9DGm7Bd1kYvnd7/73fZCIJEjv1Ei+1v/GiGjC23vUhwXt9q+AsuY1Mfb3OY2m9RYv+uPjSLrb2os1TUvqqZFApiJz0T8kcqQ6GF7ZbWUZdaWBCfBR7ymhC6+R+QQuGyMcerK3e9+9+6pT31qS7yynJuxfvrTn969+c1v3tTOSdfjoimeFGGWWKWvCC1n+9bzuZEWKtmYzdxQRmf33XdvuyM51O6F3kfua6WTKNI2GVlT1mNMe5Zjnyid4kiVg0IU3T/mlNqc3M+j8I69vkUdxyKy89kQe5l0JXaCiyRCqX+KuIo3FUcr6y4cueFm8cgzwXPEM6K2QqAQKAQKgUKgEFg9BIpwTsGeYSm2i/uY+LxpLpkOT1wht7Ett9yyuXLNtc2l5DFAGWbIErWS66j9KXTc7hAqL2SSq+hcqkyuE4Uidf36ZRv67RwqD/0+z9X/nKPfL+3WF2QNOZRl1YvRGhfeuMU6zneuLxFIlFb9o7561/+48yZWtN925FOcGWLo3TmuvvrqpshkjIZYcSe+7LLLmmKT/hlDJRaiKCK9SCm3Xa6zNn3ymYuhxQjHhzAs161MvVXMnsoTYjzpWtxpxRszDMlFXQAAIABJREFUvClSy5k5d7n6utLn7S86zLo2BfCss85qZVFsWXgYc39MOrd7hDqeuWVRg6I3Vm2d1d6F/p5Y6ve+972NzKUeqDkl+3FimMe2c4sttmhur/o2doOpZyByK07Twg7PBSppNu7NFpQ8J8z9xzzmMZsSBXGnR+Cp/Xnmjb127VcIFAKFQCFQCBQCS4dAEc4pWHKhtJKO/El0YZvmChZjk6GPFMxKIJKEIc6H9Igfo4oiYAw4CpWsqJIPIVrZ+gRy7BSYyxBG8tIW12VkRjWlElBGES7t9Lffqbj2pRpQD+yf+NYk/kH2KCJIErLpWFhSJx3r76gmw34MFd5h+7VXm6i8SDki6G/tYXRaJODW7Dr9LJyT8OJ+xx2SKmhfWS2pKMZQkhPJXCTq0XaJSz7wgQ+007geVz/7cHPVH5lLl3NDqLWLwjnXpgYn8nvwwQe3UhEf+tCH5uXCuJx9WKvnvv7661vCmTGbcUDikR+bBalDDjmkLVjM9YyYdm6EU5bjJLdZK4RTe/XpsMMOa88iJDP3lEUW3h99xX8Wdu5TOHFDn+/Ge0CcrOcNNTkLetqHZCL/Yk7dx7BMPLayKgirxGC1FQKFQCFQCBQChcDqIVCEcwL2UZCQJoSJoTVX8p/sjyAiQtMUqBil3tW1k+AGyZShUpwh4tLf5iKLyQKb2MWQOyQSCXRe5LBfxkA/7I/4UQ29x33O31RT/U0SIG1BMhFKx/rN8Yho3HTTpyE+Q7fd9CvY9FXXYT8Tk6q2JTdiiiWSp0/6xl2Y2isrLHe7fqmFvso6iwBQlpyb26n2UJkk5YEFVYdazdDmsofIUZbtx432EY94xKZkQbJhUlOXa4vLMZdBcaSTtr4bMCKgJqGMtlSe+cTMLVcf1vJ55+NS6x5A+vfcc8/WJeSe0r3QbS0TzixGUTnFYMaTw7OAarjTTjuN7rYFPERRVt/5bhZ2KJzuSwmNDjjggHaKZM/VFm7OFu7sl4UhngcWiiwazuUVMN/21P6FQCFQCBQChUAhMD8EinBOwIthZUUeEUxJjlmwUseUxxDzNK0civM63+1vf/tG9pTxsAIvThHJYnwiVIzaEMeUH/E3Qw/5i3tbiB+iGiXUO7UPCUuinMR4DmM5Z/VpPr/HOM0xk0iOvlGIqLqIJBJJtdB/33ullArjknstEk/xlQBkSMjn077+viFnCKbss1xoJWoRr2nBgFKCRHD/o5xsvfXWm8qmOFZSKLG0CN2JJ57YCEhKoiy0TbOOgwv1hkvtXJs+UaXe+ta3tng3Cxm1TUfAeEoadO9733sUTO5RdU732muvdh+K8xXLu9BtLRNOfYLPS17ykpaxlutxFpaovOLbxYuPcatNuZ7nP//584LK9ZFdzwFxnO43WWs949IWNUzdrzwA1J6NF4BnLRfcZLOe14Vr50KgECgECoFCoBBYMgSKcE6B0uo998qxhihDiCuXWnG2aUYYA9Nv3EETq8hll/HEMOqrCIk7WmjW2L6b30Jd/uaaaUlmlEyQDLwkNOIyi0wi18ijjcutJD6IsD4pKYJ0Mx59B49JcaQxfNOWMQbuXO0O4eQGy6WWwWqxgLselUSyHeoq1VL79atfzw85lRwKUZFhlOGNHC/nBmuKLMI5SfnO+CKcCJC+McBhWwrn9JGh4IsBHJs0yOIIVRPhdL/KkCpOcC5vhLnmxVonnPDhBcB1lUKZhaVddtml22qrrTZl1x0z97MYMmbf7ON6v/Vbv9XtvPPOLUMzlZ9XA6+CPB/VDJVJmteBRUJJjTIeFts8hzyD6j6YD/K1byFQCBQChUAhsHQIFOEcYBlDRfFz26wEQDnc6ruEFdxSZ8V6OgZJQ2YQGyonVRMJ811USiTUK/U8fZ+EOa6RUgz2iYuq9ts/MZJUTfvZJ2TW9WM42o9qGoOMgRm3WfsxsP3tHPbRPkZyVFzv2u7c1ITEZzL08nnppuvSnkm8p7p9Si28//3vb8STaomoIcYya37sYx9rhOId73hHuzicKT7+pu5wcVWrc6nU10k9DJl0HS6F0/Yxp6g/2quWI1fg5VS1l3Y0VudsSOOnPvWp0QtLEl8pYfKsZz2rzXsxsuJ4LZ7kvsozZEyimrVMOPskWuI0CrvN97wTzP1k6x0zegtxP447OTdxz2TeBuKquYxnQzY9bywMWcDyzE7bLeZRSKfV2R3T7tqnECgECoFCoBAoBBaHQBHOCfhZ0efC9ZCHPGR0bJ5SHPMphxLyNzRKudAifckSKQ6TC6rvE7eZbLNIoPMgjSGcCMb/196dx9p31eXj//xHNNFoJAEFGQRFRCAVERAsQymDFipTkQISlKGUIRCCDK0EKS0QQJAgEBXQMJRBJplKGKVUCoUyI5PQSkCiUQLxP/3jm9f++Xx+q4dzz9l3/Jx7+6zk5Jx7zh7Wftba+76f9bwHn/Nd3G69I5ZURJ8X1c/Ed3ofs9hmO+/5bYRsvI58Pxrcu5ue+7N3+ie5EKWZuilOTOIYJM3igUQjkj9JmMKdl+ttCKeYT+q3huA99rGPXRnju1dXIXYN4dxKTRMTjBToEyIkDrVtNQLuK0q2eL85jVr2ghe8YFLajAM13Lj43qIF4onAmjNz2iYTTv23oOS+N6eo/BZZsqAmVtL9MrfthHAm9lLsJ5LpuUgppbhqxgABpepL/sR113jkHpFRmCeCMWsrAkWgCBSBIlAETgwCJZwLuDNUGFkUK+6ho4G11RBxLZOsgkvXTtp+uLuu68dcF8BsN77n2DE8l22z6e5r+swtTwweg9SCgeQo973vfY9dfPHFk9LJlc+iw53vfOfjZNMHZFMsmvkhXvJJT3rSOrjX/j4S+2CXd0a0BQQKJ1WJ0W2xYWz25/6NAIkxLOFcC/m0AVX4kksumcrIzGm8ESht3JvHRDTiZWVFRVx/+7d/eyoBRPGnkHPZHcuKjOfZdMKZe5sLrcUvyXnSqJ6yNUvgNed+RxTdNztR3WVdfvOb3zx5HsgMjGDGtZ6XiDhsWZndG1ze0+8nPvGJ03hsR4mdMw+6TREoAkWgCBSBIjAfgRLOJVhFzcvq/jo4qWEUDipA2+FAgPvdu971rkn5uOiii6aSKMimODGEzW9qeIoPWyR4FheomrLVKg8hjm8ugd8KnbgoI5f6RtXWuApSpcViSgREsZE5d7FPzi/umDr/hje8Ybqmu93tbodjME5gL7nFWmAQuzunXfe6151I1qiwGQsx3NyYKaaUcbGE3NiV3rnrXe86JdyRMXVx3DadcAYTSdQsrrj2NAsgMka/5S1vmUU43SfKmySmew7e2cZinnvBWInRhLfwBQ3mSlIhnTe4wQ2OqaWbhmy6p3kytBWBIlAEikARKAInBoESziW4M64oXozBOY3BRfWgZLQdDgSokxI8qSmoGcMHPOABk3KSTMAUUG63cVe2nc9cC233W7/1W5Nx+9rXvnaq1SqbLkKRmNpVSIyKF4KJ8CI/KfmSREpRPhPvS72REZd74iLJVY+QAsQof+973zsRnbbVCMD+ox/96DSWc5rsxGJkk5nWGFgk4GZNvfPMkIEZ8RH/7HcJpixOUEclmRrbYSGc+jyWJHFdrkks69x6nFRgizXm6HabMlLIo3uNOzNSb55HWZWdVuZci0ZcbDV9pDTL1EydbSsCRaAIFIEiUARODAIlnAPuiUeUSEZiEOrEqhaDX+zQrW9962kFfo5r2YkZ6p51RIDro7gwJFPs5oMe9KCpBueznvWsKaaTau3zYiweNYWSzchWAgdhRUy53ap5+da3vvV4QqWtarcim5LVILZc/cwbcaMIa9pIJn1GdG52s5tN6ieyw9V3kXD6Xk1C6tqFF144qa9tqxFARGB2m9vcZhZU4rSp20hnmjlhwWn8bhwb2ZnF1z7kIQ+Z1LmxbuxhIpxcyd0z5qvrs0DC9fz+97//LOyoo0hhEizN2un/NnKuxz3ucZNHgsUBz+axJq37jkvtve51r+neSLMYwEMgZaW2c85uWwSKQBEoAkWgCOwNAiWcA47J3GoFXRr+FHffCuq4QSb5zG7dKvdmSHuUOQhIdsLllJugUiOM2d/93d+dYiAlEOL+iIQmE7BjGl/kQczmn/7pn05qisUJRM98EfPJMJY1c6tarGPfxKWJG0VqbW+xYqvETL/8y7987MY3vvFEXPSVwb14Dn1CmsV7Igeyp7atRoDrsnhX4z6n/eqv/uqkaiNeaeJAuYouU/oo3pp5JIu18jmSCqUdJsJJoeSeOhJG9TlPP/30OdBNJYjEYfIe2UmTfRaxF76A3I9jAH/jYGx4qIxNzKisuvuZSXon19N9ikARKAJFoAhcXRAo4VwgnAxEyhPlC+lY1RAQCSsk0ohr5tVl4hz26+QKKB6Pkv2+973vGHdU3yk9IynJ29/+9qmcwpgYJuNtQYKBq9g8AiJZzM/93M9NkFA9Ze/8xje+sVLtRnQQXG6968ipPiCbXBi5ayLJ6kYuuu7qB5dFJIZxL8aubTUCiAj347n3L9w9G575zGceP7BFBmQM5qvaHe94x+lnivhhI5zmvnuEyzeCHk8OruhqklI91zV1bsUWy/y8k8ZlWZIvfeGFMCbrUsrIIgxPk1HhdJ4f/OAHkxfDd7/73Z2ctvsUgSJQBIpAESgCu0SghHOBcFKYJPhQm1G5hFU1Ne0qTg4xoVa1HR4EqFGURfFkYu2oNFQoiXkk5bGIwMBebIjf/e53v6lEA8VFXB7XPsRTDUDJScSTIZzJoukYiy6yvqOKUl0kPEms5jjf4uLtOEiN7Z1PghtzU7+RUS6dDP7b3va2kyrLuFYaAiFuW42AGD/lTNRcndMQGuVmxgRh3JwRzqc+9akrD+Ecxsr8OGyE0zyTBVkcpUWNNJlnqelXXHHFWvgkWvrUpz51TP3bnTSuzBJiIZASe42Jm7hEUzwlzbJ4MGbC/drXvja5M3NbbysCRaAIFIEiUAQOHoESzgHzkIKsiH/ve99bG5PJyEE0VtVHPPhh7RnXISAWTAIS44ekURqpljK9SsgTwrmoPiqf4YVkShQj46ai8pQycWKSxbzuda+bDHBxouLNGLzcKCUCYriHgFIoEVUJUbhl2we5NA+TzZQSitxwF5R8xjYp1ZOaqhR5TXIUhFX/xIbOTeayDquj/Dv3TGr2oiq21TUjXLa14JBxtBhA8VyncCJCxvEwEk5z0gIHUp3r9J1FF2VlqLbr4tfdZ0qoyPy8k2ZOuwckzaJ0cn3nPq5R/t3P7gULRWMmXH1Dit/xjnfs5LTdpwgUgSJQBIpAEdglAiWcSwBkOCEPc7KNcruVCATp0NYZXbscr+6+RwhQSCwsyHZJ0ZT8hFqtbh9jlpLCdXJUGZ2ayyxFi/FK1UIAJSZBWiSgkSFTAhOEkWoqnpOrH+KJbEhQQ+FBZDNfkExZcxnNFE/EFHlU61H9Q8qOxY+496ZP5tqy+XbyySdP8annnnvuHqF1dA9DMRZXGHfXdVdqOwrzi170ouObGncJcZCvVY0CbQFB+ZS0wxLDac55JiLaXFkzF81xMZPioNc1c9l+FOWdNPcnJf/jH//4lNDLvWXxJQmM3HdcfnmbuLfTfP+BD3zgxzIE76QP3acIFIEiUASKQBHYPgIlnANmSIAXox9hmJMESGF3WRoZPm2HBwGus8oqKF4v+c9JJ500JQKiCorhVOcPkaRcj0leqDQSv9hXTJlxp7JQVBjkXG6RWcSUkatWYBYuzC3umNz/uBaK9TTPkigo5VcQU0a9fZ1/LLUiKcpNbnKTKW6U2+Dothv0nds5bNO2GoHULZVleE5DemQL5kqqeUYgjcjmmMRm2bEQTkq4GMjDRjjTX+o/V+0QTio+F/OxPudWOPIeUN6H98BOGldxccwWCKibFn0SK20cxGJbrJHEa8z4LE4bUV23ILCTPnWfIlAEikARKAJFYD0CJZwLGElsIQuo8gdzCKd4TzUUtyqBsX4IusWJQEDyEjFg3KEl4UHuxKbJfvk3f/M3U13OZz/72VO5E662aRKkUDXFg/mekvLNb37z2Oc+97mJcDK+kRElSWSgtXgRFXLMRCsW0EIFZdUcWnTdpco4FndNrrMaJSlJiRxfiYllhFNMsfk7qnAnAuPDcE5Jv7hAzyWcFgxkDLYokUa15Ga6jtBYBBAzihgdVsLpuhG6qOtcyC28eGaua9yRLZZY7NlJszgg0ZZMuRJ3cVUX/5zGVRnhdA/zXEizEOB+EJffVgSKQBEoAkWgCBw8AiWcC5hzr6QwzU0igixQPNoOFwLURy6rSplwneUS+9GPfvSYBQfutBRG5AIhpJCkPeIRjzj2xS9+cXo973nPm+YKFdKCgwREfkf0kMXXv/71P1ZWJcmBvNtHMhMk5KUvfemkGkXl5IYr8yYX37Fxr0U8uf3+8Ic/XEo4kWJEdaxTeLhG5+B6u13CqZyOOUPFTqNaUsbXuTBzxTV2suIeVsIpOyzlPDGSrt1cRABXNfPdIovEQ3Pcb5cd66d+6qemsidI76mnnjplhhZ7ncZV2T0h5llN3PGeNW4WYtqKQBEoAkWgCBSBg0eghHPAnFHEfVKdOCRknQFF0aJ0MaLaDhcCEokwQKkulCeqJMJIHaEuInbiKH/0ox9NSmIaVVSBeaomt1s1CRFUc4Drq3fKpxqYamIuq6uZY8UtUQ1IxMd5Qzi9U1yRmMSjcfHlvitmkOq5TN10bMa//Z2/bTUCYmeNL3fPOe1e97rXVAvVIoPmmYF0mTdcslc17qf2ffe73318s8MUw2lOcZ2lUHJZ9bcFF4rjuprFLpjbunvtla985Ryof2wb5zrrrLMmgou8Ot64qKImqHvFd6PyyWWeKqtmblsRKAJFoAgUgSJw8AiUcA6YU4W+/vWvH2O4zHERE48kjmhuDb+DH96ecSsEKJzUQyojd0g1ODXfcbcVq4lAcs0T55nG/ZaSoqQKkuo45owXAml/Cgvl0n5bJfZZJJ2O63ijGzclSWIU5xq393krsuk3KitCSmFtW40AtRIxn0s4kRfK2qjS/ezP/uykiI+1OZedFeFEcD1fMs6HhXBGfUesJf0x35O8ykLJOvXQtmIwkT5xoDtp3M55IMgwLYxBAidqZ1zWqZ2U1wsvvHBKBJYmgZZFIGS3rQgUgSJQBIpAETh4BEo4B8wZjspTWLFPEgyGVtwfbTrWSxS/RIXirtV2uBBgJDOcZc5EOMVlMlwpITLJUrIoiZKSjDFnDN53vetdU+yneSIByq/8yq9MSYAokEnWw/UvpGRO5uJHPepR03kSC4xQyoJLraEmjfMuJVO2QpwKJFvn6G54uEbn4HqLcFoYkAxoTuP5YF5EPTYuIZzrFE4kSfynuZd2WAhn+isDLPVQzHKa+0hM8bqGcCL23Me320LQ3atc2cd6uO4dKrXjwtO8d4+mKWNj4ebmN7/5rLj87fat2xeBIlAEikARKAKrESjhHPBhDCIOypyIVdJi3FPAqBMSyoQAMCAZQNSwtsOFAKOZkYw4MmYRPIsLXGn9hoBIBsN1dlQ4JUiRDIjrHkVSllruler//e///u+UgAjx4NYad785hPOP/uiPJtdcx9EP847rpVg1TR+ve93rTi62SLFzbZWoijqvjIp+tq1G4PrXv/50TwfndXj9wR/8wbSwILY3jeJpTCwQrGqeFxYnlFJKO2yEU+Id8cuXXnrp8Wswzyi/65oMs3BOht912y/7XXZaz2bPYnH2SKz7jzeAe1FdW4sBYrLTuM1bHLrpTW+6k1N2nyJQBIpAESgCRWCXCJRwDgBKImMlnFEzGkVUTG6Un/3sZydDU61FySmUOWCAIQtthwsBcZhc8pRLSEMkZLTkJqtupmQ+iNsYc6bwPVVTbCcjVkIhmWipXEgiBQcp3CnhFKOJ/DoHpVLWTeRSQyTNRUXsue4uZrbNdSA/V1555eS62bYagRve8IYTYeF2OaeJVUT+uStnIYFrvYUKtSFXNcnFkC4ZkLdyqbWgYU6tcpme08/92kYiKzHuamGmIdAyLq9ryKAsy2Iwd9q49ErKBXPPYnPdPXLKKadMCqdFGorrqCLzOqCAOv+czOM77Vv3KwJFoAgUgSJQBJYjUMI54MKlUYwRgy9xRte4xjUmRZNhKnPoNa95zYlcUEWQCyR1TsKMTsDNQkDSoMR1IXlURRlEqScUEZ+VYaCaWIRIU/qCoUuJpKQggOLGbItw3upWtzqGlJoXIapzFE5uga997WuPl0CRBVWCoiQWcn7ZZyk3VDJqvHqEy46N8H7lK1+pwjljynGLR0YsPsxpxskCg1IqGgJjriCc62I4lQQxPyjZaRROMbchYZQ6r00lnGecccbkrm0BLk3WXeVKVjU4URi5qj//+c+fA/XSbcRHm9/cmi+//PKJ5PMkuPa1rz0tCFJfkc7RDR7htEDADbetCBSBIlAEikAROHgESjgHzCWjkOwFEQnJoCKJ76NOMALF5vn7Pe95zzGxQYhFEs4c/PD1jDtFgHEqO+yocOZYFGyZR7mwUk/GmDMu1AgD0iFGkxLusznBqBbjiXiYE9txqaWISnaCyGoMaUazLLhROC1smHcMfklqkNJl/aeSqVE4xrHtFKejvp/6jBTOuS617n+uzFE4jblFKOrzOpdahEsW4zG2FuH0DIlHhfll0WNTCafwAUmsxDmnzXGphRPCLd59N/VheSAIeVAiRYZwyjQ3doSdK/zHPvaxiXC6l9J4K1ggsFBThfOo39G9viJQBIpAEdhEBEo4h1GRQIbxxKU2igMDRVF4LmNf+MIXJldLLrSUJ3X1GJrczNoOFwJi0MRp/vd///ePdZxa8zM/8zPHxPf5fcyqaW5QFrnUIirIp8RCEpKkLAqjGIFESOeomzpgTjGSQyCVfbCgQW3PMRBOapL4UYTWXNWPxcbN8Dvf+c5V4tgO1+gcXG8pnMZpLuGMS20UTj1FOB//+MevJZziDbl1HuYYTvNaYrUxhpPqvi5LLZz2wqU2MZzKCMFc6SKLg89+9rOnUlbqb3JZHl1qhT5YvEH4SzgP7t7qmYpAESgCRaAIBIESzmEuqJHHYEE2zz///OkXtTb/53/+ZzIquW196UtfmogFlYMBw9CZE7/UKbdZCFBDxJMtEjYGKSLKbZobtfIio8JJwaSgqNlJlbI/tUtyIWQR2aROzlU4YwBzq+RSy72Xqk7V9Dc32jQJaz70oQ8d+4//+I8pdjixpIvIyiSqf4hx22oEtps06IEPfOBUezK1WY2fWF8q2zqXWoSTyjYmczpsSYMe/ehHT66s1MU0paF4Bawjc3uRNIi7Opdc4yakwcKKcjNi6iVvslBjbPQpbUwatK6PvV+KQBEoAkWgCBSBvUeghHPAlPGn7iKDxUr6sjaWp7DKbuV8bsKRvR++HnGnCEh6Ip6MWrjYJCBhvFqA0MYkJ6nTifRRxqifJ5988rFLLrlkIiLUFHFmiKI4X22VypkYTYa87cfMs8o/ILXf//73p2NQcJyH261YQq6Fy5pjMcBbFmX97FAWxT1szOc0i0vcrSWMSkM4zYt1hFMMOEV1JEOHhXCGqCHWFj0svOW7uWVRhCUkuc8crJdtE8JJLY17rnjO1N+0OMhT4H3ve9/x3XmocONFTNuKQBEoAkWgCBSBg0eghHPAHGFgSH30ox+dEnmsaowtxqJYJqvqbYcLgYsvvnhSZf7zP//zxzqONFKiGLIy144Zi7lQ25crHyP2q1/96uRWK9ZTLKeEJogi18uUU1kVjxcFPbFpMeIR0ZNOOmly9XQ8TfygcyHAktT8xE/8xPEkQ+NFiAlkeI+lOw7X6Bxcb5XXQDjn1uE0Z2RITY1V44WAyp66rg6n8XQ+BC3tsBDO9Bfh47IqU21qFFvYsBiyrolf5Sb+spe9bN2mS393r3AXd98h72KwxTGnxdWdZ4CkYGlc5N2XlM62IlAEikARKAJF4OARKOFcwByZQB4YKevcrxhACqBbuW87XAh85CMfmUihsidjM+bGkzHLrVUtzpFwcmU15oim5C5iPBEW2UepkNwGKZzcXxE+ZHORcDpHXhRNSiXDmXtg1NAon3Gr9Td1jAs3cvrd73532naZesqd1/HHTJ2Ha3QOrrcSQ/FomKtwqt0qI7H43TTxvhI1ITWrmphvbvlcsg8r4ZRBV2ZmCr9mkU5yrNH1eysM3CMW58YyQ3NH2nx2Luq9BReLQu5TSnOe01RNruS8DtRTTuMGbQFxbpzu3D51uyJQBIpAESgCRWAeAiWcCzhxd2NQSqW/inDmN+UnkIy2w4XA+9///sl4lV12sYndRCxkiFV+JAqj7SSI4nb9mc98ZoolQyZlg/3yl788uec+5SlPmWI+73vf+04xltxfR1Jo3iCPiQFWa9NxlN7RFrflpklRQnAXyehWrrrILpdgxKBtNQLc4iUA4nY5p1mIMj+CrfGUMZXyd84556w8hIRjYsElfjpshDPPO2TPHE/mZGqveHcLMesakiiONa7m67Yff3d+c5pLM8J6+umnT32QtTlN/VyutUoXeS6n8Uq4/e1vf0yG3bYiUASKQBEoAkXg4BEo4RwwZ9RYgVdjjmqxTuG0q/IajBnJZRYJw8EPZ884FwEkUZyujJuLhq26ihQRNf24QVIsEUsEj9GqNqcYUGRQiRLElNKJeCj9ILMswvrOd75zUsu1xP46jnqAZ5555kR2qaCUcgR0VCyRUsmDxJHKxklBW1RGt7pW57YIMhLlubhc3baDLzdl9XfnNPHaxjiZi+NaT3VGdFY1i1jiPSlxebYcNpda7rAInPlpvnI997c5uq7d4Q53OHajG93oeMKlddsv3pfibSnRXNWd0z3I2yBNbKnYZYm9xoUk5WpSK3U75+y2RaAIFIEiUASKwN4gUMI54MiI0hj/Me7XlbWwqq6kxSoXx70Zqh5lLxGQWETdVRnkEwo8AAAgAElEQVQ3FxviyEhV7oHy9cIXvnDKHossSjSkXXTRRZOq9e1vf3tanJDMx1xBSChmFiEsRvjdftwB73jHO06ut1xnqZaOGddZ28h+zOXSu2Mhq//1X/81ESLxm+akfdY1fXD+dXUh1x3n6vA7vCnRxmZOkxlVCZzRzRppRDbXEU4Kn3hP6nraYSGcIciuW+KgNPNM0ixu4esW6MxLLupjWZg5mNvGsbkkX+ta15pckqnJskOHWLpnLPBY+BHnqVZoGkXVfZjM43PP2e2KQBEoAkWgCBSBvUGghHMJjox6ZTEkgVlHOBkzklUgnuu23Zsh61H2AgFueQzfD37wg1c5HMP2Gte4xmRAI4NUmcRzIoXcIm9xi1tMsWPnnXfeZNhKPKTgvCQ+97znPaekMBYg/C6plIyamriyMbbMuSxucOuk/FBLHU98XOaSbexPraRcrmv6LDmKDJ5Ut7bVCHAJVaZEMps5zXaUSosQIUI/+ZM/OcVvrsPbuNh2nHOHhXC6Vn2n9lMQo9iLF0byLKCsaxIucTEfM8iu22f83Zzmem6RSD+MgXtGs+jjOexvGZzzvd+4MFtUSCmb7Zyz2xaBIlAEikARKAK7R6CEc8AwK/Rf+9rXpgymY9zcVlBzvbTq3tXz3U/GgzyC5DvivJaVDjEPvvCFL0zxmmpqPu1pTztmTiCcYjrvd7/7TQTQMWwrAREXVplhue5J9COLrd+4HKrR6bcY6cgkRcbxJC7iuut8y7LZZk4iugxpZBSZ5V7IeBfHhrQiA+KPEVoq6kMe8pBjT3rSkw4S0kN5LnGBcJtLOJFNKudYkkY2YxlqzZNV7TATTvOQ+7HnncRBaZ578Pv0pz+9dsHN/eReUAN3J43Kb2GHWsmlmZLpXkpCLZmD/X3aaadNNXHT1AyliAqVaCsCRaAIFIEiUAQOHoESzgFzhgsiwJBnHH7iE59YOyKMe650SMg6l7K1B+sGB4ZAYs4Si5cTZwyRwIc//OFTZlhJYrjfaoxuZUeol2JA/e43hI8LLLdB7rViQx1LHGbiMxcvTmkTCjkyulXGWfs4hkRWVBxlWrj1ypDLPTFzlhovcyqjHhl1fY7fthoBngxcNLmGzmlqOSI0FhvSKNvcl9cRTuegnlO90w6TwinO1dway+2Yv8jc6MK6FY7mpHIlFld20iir5rjEQC9/+cuPnX322ccP474TF61cirjr0dvkyiuvnDwPxkRCOzl/9ykCRaAIFIEiUAR2hkAJ54BbyAZjhusWUrGqMfYZjFbdGTpthwcByX9uetObTol/ljUu0sZV2Qy1WVM7EEFh+HKhpPYozYBsWKiw+CALp/hQBjijd9kihO+QFLULufnZN1k/l/XF9hINUUsRTzF03Hq10bCmxiqvgpSau9wd21YjIKaSi+fcGo3GVxbgsQSKsaT6WYDYqhlDcaIWFyxIHEbCKROthZhLL730eP/FOVtsW1VrNhvLbivO8utf//qOpiVCz7PA4g7CL5GWBltk1vOYx8BiXWQE1cJQSrns6OTdqQgUgSJQBIpAEdgxAiWcSwinJEDS7yuBsMqAjLFPzUJeqnDueB4e+I7cIhEHbqrLmvFnuJoDyqdE7UbmuBEydimN97jHPSa3W8cThylzJqK6riUJioyn3HqpoGmLscAhnEgnwqk/Kdtjn2wvhtCxxK9Rgs4444x13bja/27BSEylhD5zGtJvoWEklxJCiSkMAcpx8jzIu7mGbCqhk3aYFE5KvhI+al2mvfWtb50I55xmfkqARXHcSYM5ZZ/KyvtgdO31vXvplre85UQux+besigwJ+HWTvrVfYpAESgCRaAIFIHVCJRwDvgkxo7RYiX++te//qz5I24OMZE8pomDZkF2wjeyQMBITdbZxQ7JTkvNQjC4AUowFOLADZeiQrGSyERMpVIp5oEanesUS+eyDUNY0hrxg9QXyg9jflHtpNxw5TUvGc5PfvKTp0RGOQYXX66NiKiEKhRZyhMy3LYaAfGXYnDFyM5p3KspzE984hOnzZNkKoRzXHRCRMX0mmvGlkJnjMZ2mAhnSqKk/2qKylpLVZzTqMJKmnzve9+bs/lVthFrKy7Z+bjHUjkle8rz1iIPBdXij9/T3C8/+tGPptJDbUWgCBSBIlAEisCJQaCEcwnujFAq0VwjRRF4Bci55pVwnpiJvJ2zIgXqISZZzJjMJ8cRE0b1Qva+8Y1vTCUY0mJ4c6GlhFJ+lC8Ra2n817kXOh+lVKzwL/3SL02fNe66yKa6nuZfarvanoHNbVuiFEoal+8UvpdxN66/DHNz0cs1tK1GAK4WFBbdMLfa6xd/8RencjjqQKYZvwsuuGBSvhFXbrqIjgUo5N/CAHdUiwLf+ta3rqJmHxbC6Rpe8pKXHL9uc1JMp3tkTKC0Cm2k/EUvetGxH/zgB9uelkrRUDAt/CD8am7CNs3fFg64uHOXT7NAYCHIwk5bESgCRaAIFIEicGIQKOFcwD0KhSyHjHfxP+uaJCJeZ5111rpNt/x9lTvu4m/b2XarE27H/Xc72+4YgAPcMYTvk5/85ETixutLXUxZZyXgoVx6qa2Z9uIXv3hSq5A8RMJnx7Dv6Bq71SUhphYzxKHpA3UTQVH/U/Ob+pAIqZIpjGnugJKzyJ6czLTUHIa0BQ/ECfGhyIoLVSf07ne/+wGiejhPRYXkBq3G45xmXLhyRqk05sbTnLAQYa5YfLCgcde73nWKvfUsEVubWq7jotRhIJzmtnl1n/vcZ3KpTf9l5jU352adRTYlWDOvt9se+MAHTom4JBxCfB0nCzIZQ8mY4E7xT+PB4P6cmxRqu/3q9kWgCBSBIlAEisB6BEo4l2Ck9AUXOGoGtWldo2gwdiheO2mjwsaAXZWxdCfHt88y0ur7sd7j4rGT9GbZ9zvtxybttyr2FgFECKmbFEvqVDD0Pbdahi43Pu6V61TNXHeOgaDYd6sMthkzypLzIaNUtaioXGz/6q/+akoMJMkVpVW9Tu6Ejq0ERBXO9bNN1ljxubLPzmlcZJEuMYTmCNJjjLh3ctHmHu0e5jZKOaVoGnOvZXPkMBBOuCDYEgbBKs8MtS0tslHj53h2vPSlL93WvTKOh3vMPajmpwWWMQOz5657gZJpsUaMbZp7x6LMYx7zmDnD222KQBEoAkWgCBSBfUCghHMB1ChcDEivUdlahb/YPSrAHIVrkWAiLhQqMaPceTUklpqCYMhs6bip5RgD1t8a5SSfqQcM26gp1DC/+c678hnKdzDcHMfx/cZgzHaMcOdzLHjoG0POdtQa2/neK/usm5ubqJJyyUM0UpZkvAa4qKep31RIqkqugUulGElqFtWG0R385+DAfTPZjbfKTpt5yG1R3Jr4zXGsuA/e+973npIeSRBkrJRNUXuT+vP+979/iiueMx/X9fko/04VNr5KacxpvB5e+MIXToRT83xwr775zW8+9vnPf35S4XKfZrzMm63G4bAQTgsslEIEO8SZir6dOOFFojgH79wH1FSZl81xSr/FmjRk2FxH8t0Hia/1u/sEGZU5uq0IFIEiUASKQBE4MQiUcG6BO+NK0hiJKuY0ZTSsuitsvkyhHEmmz1bdqSUIJsLJkGOoIooIIWLISPV3VLAYenkfVYVRjWSk5Xxj38d+MYa9xu2cCwEKEY2hTMmh4mR/RjfFze++95nh7HfHcE36KFbLdbgu8WxILhfldSQofQrBm6OezBmjbJPjXnzxxcfue9/7Tol6Fs8BQzF51BvjM2bElJVTIhKJSiRBQThdW1qK0efvRWVLwiFqTcZ27HuwNw5Kn4gzFec5kheEFdlUDxFREtdme1lAYY0QiSfmApmFh+3gc3Xa1kLKpz/96YnQz2nibC0+POxhD5vmubI6FiDG+2hZluGt5vCmE87Mu1e96lXHZO/WXCsvEMmrFpMgrcIwybbm4Jxt3IeePxRK81qyLPcFEqnBldJ62WWXTe7LyhEpU5R7nLu6uNorrrhilgq7nb512yJQBIpAESgCRWAeAiWcS3BirIjhQyK5Lq5rtufaiBikruMyAxM5Q9Y0qojVeAYnQsPwZcB6T0IZvyNnCIvPSCmFESGNqpl4vlV1HBf7v1O1cZE0x+Abj+8aqRCuyWcqrThE+/rOZ+SMiupaETrX9MMf/vDYd77znYmY+uy1zAVxp31fJHXGRyIg5AHhWDZekvNc61rXmvqk/l+MbYlSEBSkkZsgF0tEOuM0Ks6jO2X6LvGP/ZY1Br4xRyT//M//fCLEwSL7i9Fk/EtWpCaohnz+9V//9bHTTz99SirECLcA0szJq+9eeH/2s589Xtd03b3+0z/901Ospvhe89sYGc+dtk0nnAifGqXmO9ftNCoir45/+Id/mHXp5i5vgMzXWTv9H7l1L3i2WlixqGIR5qtf/ep0CPet8UP6lTnitWBMxsWqZHOee85uVwSKQBEoAkWgCOwtAiWcS/BkrFhVZ+gjRetIjt8RSfX8JKGJG9gykuM3yiZSZjWeCugcvkc0GUfevZAyJI2C6BUSZ1v76KPt4g6LkCZxTRRT5I5RTZFzLn8jePqMpK5KijQSzJCtXFMU1WUxoKPaukqddA3cdV0b/JBR78g4Q1yj2Omv0iNc5pBSqkUI9iIJXuzXqttFfBdFGllb1qjbXFrVDUTu9EOzCIHwybqpNiDMxY/FNdrfxtG1UV64WqafCPgpp5zyY67aUaWRTclmTj755Kk0z2c+85nj8884ahLQvOUtb5kMfn1DdClOyDHXQka5bShCYgj3WiHe20fQiT2acZGIRhbUOc2YcmF+6EMfOo27BYujSjjz3LOwwoXV8zBeDu9+97unuOG5Cnq8BBDD7TR94L7Mm8C9iuyPMdPus6985SvT/SlJFtdmiy2a56x94o3R+2A7yHfbIlAEikARKAJ7h0AJ5wosGf+IIZK2yliJYcb4v9GNbjQRgK2SyGRbZJELmEQviAQyY6VeuYsUKM+26wjvsktgiDHyop66FgQWkcuKv3Pqp+8Zz9RG6qlMj/rAwPSOBCJ+fk/JB4QPgfW34zkO8mr79Hc7qmuuYfFaHZsb48///M9PhFRRd0owoq3/SKgET8iX/mquRVs1Bs7DLRWx20p1kdmS2yB3PPFjSY7i3MgcoiFmktrChVVb7D+VEaGFjTlEHfV+6aWXXmXYkG8Yy8bJDdm5GfoM5rFRmpBKRFRioDSujRYwEE+ui9wKqU/OU0N79QNTMpy5hNP9xI36zDPPnA66EzfRsTebrHB6LlkgsTCTzK9xcX3rW986xW8uLkpthbRnCtJqMWS7jdeIPuiPONBkA3du2YX/9m//dlqAsThkOwncNPeJv+dmIN5uv7p9ESgCRaAIFIEiMA+BEs4lOIU0IDBWzalXc7KQSkwh1kmpgK2M/LhYRolzXAQG+VQgHqmioiB+3CFlSaXu+bwsMc1IcHLskK38tkpxXbx8+4Sw6aP+RbELkU7CIISSIRnCqd8MaASWC7B35ND3Y/Zd1wFbJAy5Qhwpsl6OOTcGznHhJdZWRmHkFwlG3C+//PLpeCPe43F9f73rXW8idaeeeurSu4WhGhWUgiJjcY4RooG0WjSQoTRtHAeJpBjtFBr4cfu75JJLjh8r2/qNokoN1Z8vf/nLk1oOD4sYrkX5CSQX0bQIgIxyIUSWKE5qECLmfleL8Gtf+9pEOks4945wule5NKfWY2qy7mRRSK82lXDmehC5s88+eyr1Yo76XgyyhR4urtqc+eU+lT12jIWe8y8KyRRPL57aPPc8ttiT/vEyUJ/TAgzVmeoqcZNG7bTgwsW2rQgUgSJQBIpAEThxCJRwrsCecYTEjFkPt9qcASQ5BZcxcXfbactUArFiyIPC5bLXUvli3CFVDMDvf//7kyKKvFHflimKu1FJt3MN67ZFSpHPxKkii0iT6/RiyMPaOyKq38nYO8asIqeUPIl+bJe4VgSXump/BI3S53fkE1aJjRz7Sa1iqCJqy4i35CRiLcXyUk3GeoMIJ/UT2WTojlkzx2PpzwMe8IApXlTjiuuz/rpG/TJuitkjm1yfqd8MZfGYzmnsbaf8g1g2Sg7DGxbmm2yh5oT+whARVSOUi+0Yd7dujK6uvyP3y+bAMjyMg4WlM844Y/rZ/LAIsGxRZw6em0g4My+VeLnNbW4zxShnEYqnRPDazjUji4633floP2Pzxje+cYpNdi9ygQ7JlfhL7LLniXG4853vPGWP9rsFIos3IaBzxqPbFIEiUASKQBEoAnuPQAnnFpgypmQDRQ6oj3MbMsTQ302Lyph4qVFB4HrJzRdZo+ohFkk8FFKVuEdEFClFuLz8ndjO3fRvu/suEupRec01Ljtm4lkTG4lMIV9IHDLqusVnxRhOyRbXKXZRrOc1r3nNSR1mhC5rjFEG7TIFm7GKSL7mNa+Z1OUoOo7DZVWmTP1nRK9aZJDRlCqmUXmoqmnGkHumeDME1uIGMsuw9z2iK4GVd8ScgsOlE4bqbCpsj3Ai2ZRNhNRvrvn3f//3J0LathoBLrXI+hylDrZiBEM41Tw1bqvm8aqzm8fGNPODu6h5NcejYr/G1XPEfUU1v8Md7jC55adEErWTVwI31nXZpsf+uZc8t9xDc3DOvrLTclfn1i52Nllx80yhtCa5F7ffeAVkPOJ9sZ1z7heuPW4RKAJFoAgUgasrAiWcW4w8g4ahlaQ7cycI40jNOMrZXhs5c932KGTIGHdX5VeQLmSFCsDARdCQMwajbSmBFMO4tjIu4/KaJEN+y/XEtXbO9cUwhN9WCX1GFdbnuO5tJwFQxoeByZXXtYv3ZJAinzn/4jh+/OMfn4iZ619s3CYREYoKzKJS2k4ik29/+9uT6y63QwSEErtIFFzPaaedduwTn/jEdA4uulxdjQ/ybDze8573TJ/VzlRX85WvfOXUFeen6FDOzSt9sMDgb+dkaKvRiQzf8Y53nBQd2yiH8oY3vGHKrDu3rM/c+X0Ut6Msq8c6l0AhTUiixr3z3HPPnZ08J/jlvrA4xQ2f67PzW7gwfu7Bg25Z6DKHuGonvpwCb6FL/8x5Hhfus+3EaLs/qPASq815bmTxzMIOTxP3i/n8uMc9boJFX2WvlVhLmSLeDXDkBeA3niESdiUr+EFj2fMVgSJQBIpAESgC/z8CJZxLZkMMLwYWEkE1WlarcXFXhpqkMM94xjMmknEi2xi7uBXZ8j1SnYy4iBoVAkHVEBm/IauOx6jzQlAZm6kbGrdQRrLv8j01ddFwjhoZozHvydKa+NAY5N5DIhFmxIzxmZhQSgzXYwou8ubcxoqrsfhXaswYP7o4JlwiKYPUnMWG1FFWPve5z00ElvKYJr6TccvIpU5JbMIYX1S69J/hTsH8x3/8x2MPfvCDJ2Kpv/BWcsI2roPx/MhHPnJScjSEU98o7VTMuDByy6VyUn9ko9W47YoNhTkiyg2SMssYb1uNALdrJH5ZjPSyPSXMCa5id5/73OceTyg1F+ssslDsLCbwjDB39MM8HxNCzT3mbrbL88I8VCZIXLTm/g35g5Pr/td//deVidGW9cN1IoAWaOY0c909p9wUUi8BkL8t+oSwiqvmfYKgUzctAtzznvec7ieJwGApCVdbESgCRaAIFIEicGIRKOFcgv/oAiqWTv24Oa5gIQRW8q2sO85c1WQ/psGoHM5NxLPdfowK5rJ9U8ojJB55jHLpcxISJZtu6pD6zT7+phoiukhuPnunvnohCnBedo36tEpRkfSHu59EKGNDuhE+CZsY4dx5x9qZiK+FBS63yJ1Yy60S9Lg2RrHYPy61stbqM/VZ1lnX4hz2HwknVUgCqhDOYH27291uItP6jvBq6kK+613vmpTpxBX6+/d+7/e2O6RXu+15I8gKnLI36wBQB5Iqbjy4mCJSjrGdez33piRS9hV3a54qiaMflPf9blmISd1f55aEJ4sgSRjmus4555xpoYmivu6eWtbvZz3rWZOrMI+DOU3fxDArg4QAOy/vALHq+gUrKqyEQhaL9DvlihwfpvpsoaatCBSBIlAEikAROLEIlHCuwZ/qJJGLxDDrWgw4qhODcVyNX7dvfz94BBj9FgYYrJTpsckYjPCJhaREipFELsamRIOyJ8gHBZNBvVVDCBFNhJMiinAitVRSRDqEc3Sppdrom2QrFjxCUsScIgHKUqgDqXHxtQ1F3vyjflJUudq2rUYAoVEehxo+p42E02KABQAkf46r6OLxKXBUPwsI2kERzngOmIcWUyTe4TqOuCXLdFRPiXgohhYvUr5nDk7jNtRI7rFzMbYvrwH9QTDdM2KhNYtYvBl4MbjvXIMx+ehHPzrV4zQOub88u3cyLtu9vm5fBIpAESgCRaAIbI1ACeea2WGVnYoUN9NVcZQx0Lh8UiwYQ9vJ5NiJerAIZCzV8EQotaiIiIBYNe65lBNuu2puji7CVBcKJ/dD84RBvVWjcFIrHVfClSicYge3IpxcBLnJShpk3/QNOUZQMjcXCSejm/pqsQQZTl3Xg0X38Jztk5/85LG73OUuk4I3pyE3SRKFDL3tbW+b/kaEEsO7juRkLO2nZI4EVxo3UHNMXOl+tNF7Q4wz92uLLrIk60PcZ/PckqXWAoZ4SUr9XBU4fc9xLIxIrjRHBbYP1RXJveCCCyb12X1igSe4Ip8WVSyyOPZXvvKVKb6Tu7rroaQizque1/uBb49ZBIpAESgCRaAI/DgCJZwrZgVjJbUdxVUxBOdmo5QkhnskQ+hEZpzspF+PAMIhRkxcJVdeZFB2VwoK11ku0gxy5UgoiDGiJTMRS0n1ocRQJCk4i2TD9mLNGMAMZ661SCCX2q0Ip33EZVLfJAqiVqYlhlNG0yQYonCqO4g0Ib4UN78xwufEH69H6ehuYfy5VVPD5jRZaiVjMk88I5B69Va5VhtjY7uOcGYOmTdIHldoCw8WNzwvUnfXfNT8FsIXN/SQN9v7nGRe+uVZJZ6XCyq3c4mzzA0u3OYxsilu1KKJee48cUtPQiCYWLyQ+XWnymYIX9y85xBA10fV1w8LLepoCmtAIoOr+wEBFdfpnhPnyVtA4iyZm7nTIsttRaAIFIEiUASKwIlHoIRzxhgwaLgvqvmmrTMmGZAMRy5elLM5RtaMbnSTfUKAMStWV5IgLeUVEAtEguFLSUn8mG2MqQQlFiLMi/POO28ieBKrLIslpdhQ0RABxjLjnhstd8x8HmM4nZOC+fWvf33KJCxO0Ly6znWuMyk+SKsFjbjxSq5CaUOafOYeyT0XoWgdwtUTh4oM62WZipft+drXvnYqz5GEVIgepVvtV26gShHNacbegsZ73/veOZtvuQ0yaG6YMzwxbnKTmxy79rWvPanyVHqJwJBNCibi+ZGPfGTywDCHo2jmGYXsmY+ug7sw8jaXRC/rYLw+EE6LH3OfhZRX+yDvPALMaS1JxxByHiQyPHNV/5M/+ZMpo7Qms7PFF27CbUWgCBSBIlAEisCJR6CEc8YYcHnjdklFmmMwZRtucRLPIA3LktrMOHU32WcEGLBURooIt1eKyd3vfvfJmJWdlhKkFiHVkBIUMmmMKY/mBHUFSaUkyQy7VROfp5A9tcp8cG7K1pe//OWJGCCcSCIXRgRVzJxz2kYpFd/JcsvF2/mpYxRQRMnChnhPhrikL8iGGp8Udm6GbVsj4P7m6gzrOY2qzd3TAoQW0iYbsThf40QtT1Ir2xlvY4a8+R1JlP3aeJkPjpHEWuNn24UYhlQmmY/9kkwrWaOd98orr5yO6yXpFWIcL4tlzy/zMNfgfBRftWJf9rKXbbv8ySJ+zifLtfsLKVzXco1ioymbYpDFU8vc7N6L8q/0lPtUH3kdwDUZaS26UHHdv/UuWYd4fy8CRaAIFIEisP8IlHDOwJh68fSnP30iI3MIp0My3LjjfvWrX51Uhxh0M07XTQ4IgcSzUYaME9KGQCpJQT2UzAUR5MonLlfikrExfqmaSCIDF5kcS6csbivWUwIWqqNzmk/Iru+okJQacWkIpbnDDRdRkXGT0oqwIiuI0ete97rJxZJ7rZqbiCiFk7pG3ZKkyIIHEpTEQgcE66E7jbIkcFcCZ04z5hYguKSmRckLwaFcps4qJTvEVAxkiGJc9I1xXGJH19iQyfw+d9Eq89o5x5jNZZ4ZY7/NJW7i3FmRVs+w3cb/Oj7ll1LKk2DV8zN9cX7uwJ/61KemxRdk1aJLXIh5I6QUDZIJZ8qt7ai5XOC5qyPc67xR5ox3tykCRaAIFIEiUAR2h0AJ5xr8QhQZQBQjCsKcVfMYVhQvioEV+hh/c/bf3bB27+0iQA3hqqrMAtIofi01SLnWKsmAWC62l7/85VN8p3gxLrZca8fEKlxuJTHhCnu9611vMoApmcjGaOy//e1vn1wOkUyultQxpPRa17rW5J6tPASjm+JjLoptsw0l1hzl8ktJ4kprP+qQ1xOf+MSpf21bI6Cu5rnnnjvb9Ziqpv6mepSLbSR4+4l5ni8jgRvPve6zvqU8kdIskkxRbl/84hcfj+fMNru5Dv1wb1hsoZquI5z6lBhl9x+3WAmCovIi79yB3RMUfm7C7htZxLmqi8XmZhvX2xLO3Yxe9y0CRaAIFIEisDcIlHCuwTEGEvWJWy3iMdeISfINBAFxiGtbCefeTN69PIo6gYgiZeff//3fp88ycxp/BJQRu6ymJTdB9S6pLNREJUvEBDKMqUPG2iIFwxipZRhzcXWOtMwTChCFSTZcbtgSTy2qbpQ1LpqILgXKnBK7xigXt0YVMj/Fv0l8JP4troZ7iddROpaYTCowJXlOQ8qo0IcpIdhI9CxMcBNX9of6aLHD4oR5k0y7e/mMElZAeRc7uqrpo3InYp0tyojbpCK7X5Ks7XnPe950j/FEoOxTm9033G7ds+JhLewguG1FoAgUgSJQBIrAZiBQwrlmHLJSTnlCAKhVqbc5h3giExrT7coAACAASURBVPbh8sWYsmovi+ReqAebMYUOfy8YuhYEkEqZLqk9iNr97ne/aawYtVRObrbixTJ29lO/kSuuRCVi8hi73F3HuRG1yTtjGgHlrquFCJgXCCrXbUTGccQWUiyjRNlechvElmqezLV+129z9I1vfON0XCT58Y9//KSEnnLKKYdqkOa6rS9T98b7aisVcPG+5baJrK8jRI7t3pfplXKM5GexYKu+BPgx9jfjOb5nu1VllJbhshVWvucGTgnkFk41v+ENbzi5mloAE/uLsFFpbZtnWvBbnL/L5vM4L5fhnmtyP7l/LNitI5wWecSdIpr6d+aZZ04kWONS6zdZgZFLbrqy0iLOp5122rSNa5NIq6r+obrl29kiUASKQBE44giUcG5jgJGPpOFnpInFWteiGHCF5F7L6EMu7LuXKsK6fvT39QgwZrlNKwXBtVYiIGNFLRTHK7mPeL8Y14x0iwhc+6iSyCeiiLyYK4s1B20v0RAXw2TEHXsV920qKIIgJi2F65MohpL6hCc8YTLeX//6109EgVstd1/qJtKsUTepoFxtJVc5DG0VeZqzuLN4jbDxCqHK57hn5nxw/qd/+qepbum6ljFKTUg4z63fue7Yi7/rH0LrnNRsc1FyHM8g88C4i1n02YKJ2F3b2N67WEaLG+a1xTJxyuIa0+a6/87dLscNebWfeSveUsmYJFlahYM6pOaxRRUKp/tQc0yLLTxMZM+1OKAsEKWZS7RziKG2QGOB5cMf/vB24e72RaAIFIEiUASKwD4hUMK5DWAljUEixBgtKgJbHSZGIwJCMUNmKGFRtOaqOdvoZjfdIQJi2MTnUa4oJDJlasiFUhNULcllFseMooLw2Y9LHxUT6VxWHgUZsC0yuGzso5gpw8N9VsbZqF45HtIrVo0CKsGK4+gjtUfGXIsZkggx3Ll/3ve+971KXOmqubpMddsu4djq+MmGijxJeESBU/LFZ0RKvCt3T+7Ikia5R+CRd/s5hm31yfcjeQrByUKOaxlrVfo9f8dF03cWAYwbRW3d/eh3/aWkSeIkW63zyRQsptZ9TqnWb9+PZDcZWL3nlWvybp9xrB3LMZLVWJ+RWyTSyzm5VHPXRiq9O/cYQ7xuLEJmXZPzwzYviynGxG8ZM+Pldzg6l/MnG6+4ZOcWaxyszUlJsiySrGq2dz5zgvuteWu/xMnC4Rvf+Mb0/KTui7ml4PMGkHiL6zm3aN/xKNGHnSxS7PDR0d2KQBEoAkWgCBSBFQiUcM6cHgxB2WYZNgqhM4rFfDG+GFrrWpSRu93tbtOKPGVCc9y42K47Rn/fPwSMg4UASon6qQgcVZMqk3p+iJ7EQIuk5Pzzz59UUG6tanLaL7G+DOVFd0rGN8I5EqLxyjJXKJOMaPFpDP5sf+9733sqe8LYppxTWBEBsYgUN+7bjHDbmG8S3DD8VxngrmkrYrm430hIKGvcNM1nhCGfkZcQqLynNAhSgji5b5CWvKi5XtyWERnb+c127pH8vZjRNeRxp7ODoqz/3JDnkuvFOeB54GUc4oZv7PV1sXzJmHU22yz2fSSnxj5ED5YIoJfvYO7dNsh6SqqEyOqnzxqCnn47b1RzuCLQsA5hDu5UUmNhDLyP45WsuTnWONfH63FvhHAG3/H3zC/k1jk0MdVeeUZyrbXYoz6nxRSJgpRGMb8tumhINyJO6WwrAkWgCBSBIlAENgeBEs6ZYxESINkLty8kgOHPlTIZR1e5yI617hAbq/USW3DTjKo1syvdbB8QiLJEUaFmMs65833pS1+alC9GMdXy0Y9+9ERCRxLJ6LUYwS1TEpYvfvGLU6IeZHEkJjG2JR9CAI39VosNmW/cCKloiOUYy0bl4XYrjlMsmz45t+2pnIgfl+DUZVTqRVtFOmFAYYp7plIsriuKo99DlqKkibXjpokkeqe6UZdCJqPSbWfI4hXgvgjZQqpG0mV8/B0FLsTLe8hYXGhDwuzj+r37zfFdGywpY/CjWlJXfY8oRjUdPRVCznNPx9shf4cswirndt70Jyqyv50jf48lUUJEvYdsh3AH+2DsGAhjCGFqcsZtP8ddNQarlN11qu+q4xo/ibW41Bor88sYcQumRJpfXtyD/e0lCRbczGljmbJEknMljl5iLm614qslPDJX1aq1+EP9bCsCRaAIFIEiUAQ2B4ESzpljEbKAZMqUiHAyzGWvFY8n5X/c6BxyK/IZo9M21FIJZiSKSaxn3cBmDsg+bcYwFh+JlFApGbJIlEZhQeCMd8bXuDGibfvkJz/5mIyclEbEVMKeb3/721eJ5cz4m0OU0Iy744+GfeYBgzsxah//+MenfjiGWGBKbDKNmkf6RAlCZKmc1CCKKwJNsdVS6kWMnGRHrg8RiJskssjQd51i/nxGJL2vU/Lj/hq1Den1EmPo+BQ4n70jdQhjFLjEW0aZQ7KcL6RqVENdJzdOBCtEK5/9jZjZP4Qr9Sz9nVeUR+/IMtIOZwlp3v3udx8nRunXSAozVlH4/BaCmOPmuzwLxr/3aeru6rDLFNW4PZvfXlFxEUTjhzgaS6/87j2E3DGNe1RT4xI1lZJt8c69lXef4ypsHtrPS8ym5yvFH5mUydnCgIUVc9tc4ILL5Z2XgWzQjY/f1XTozkWgCBSBIlAE9hSBEs5twBkVjFGZ5EEMIi5e1DAGkdX4VW62ienyzvilgj3gAQ+Y3MAYW1G2ttGtbrpHCBgTrpWf//znp+Q/l1122aQsIjN+Y2gzbB/ykIdMZ4xhzbhVZxXJ5J4pmY/vxIMifYsJhMwjxxcjKkMqMod8xT2V2sO4d3yup0giJZMqHjdI7+LZnIvijnCGWCGzsuyqr+j44hOps84ZIoeUWvCgCsWFdRmMSCRCyj3X9d/gBjeYyC7CgTwm7i7kwDH0gysmourdNSAFYgz97Xr9PaqgiwmWthrSkPLx3baLGVPz3bqp4TjuOfei60RslAxR9xShhzvyjgwhsztRbJf1YVkyI/2I8mrMkwAo8ZWw9myJS63+RuH1bg4lBjZKomP6PosBiX9F7PMsiitsXGNdY1yaMzeMYeI1jSPCiBR6xRXaNiH743yYMwaL2xjPPAudw2IPT4PMf4sC5pA5ron71D+ZmkPy1523vxeBIlAEikARKAIHg0AJ5w5wFjv0m7/5m5P7IsMtSgcDmlqpLlzKnyxTLOOCF0OXiy2SI4ZMCYHRDW+uIb6Dy+guWyDAJVZSnosuumiKD7MQkKb8yamnnnr87xAfc0JJEoQMQeGayzgW/ynJ1DgfEuOHJFikMIeQNIa7BYt/+7d/O56AJieimiKvUVvNEfvIrIp0IpT6glAw+iUyMp/0Q+ypzJ0I02JzbuSWYs9Yl6WX8onU6J++IoiMfv1ybfqIdHghJOb9dpX5rQjjSBzXfV6MjV10X57bp3gvxGUYRkqJ3P72t5+SNlGD46qbZD/BMedwn8Le32P26tH9NsQuMafZd3Sf9Z1xjetyEgYlhtIYji9jnRhL88dv3n0XAmibqMVZ/BgTEe3lg2AnY7DospvxgIUstJI6cUOnaEqExR1d7VDjo14tlVM8s6RuMtu2FYEiUASKQBEoApuFQAnnNsdjzCJJRYjrnsPc+c53nkiK5BXiwcYMmVudZlRYZCXlMiYxzQc/+MFJlQiZ3WY3u/kOETC+XPgk3/nsZz87GbwIVhol04ICtXEkPEqd3Pa2t53IH5KicH0ygFIZkU5jPS4gbCc2TtZaRFe8GuKHpIyxv8nYiqxQTqmRXA8RJUlbxHMikhZKJBSiolLpkwSGGzG10wtJRVrmZDvdIcwbvdt2xiUXkkUkf88luhsNwgnunIUQ89VCHGLpHrz00ksnlR7ZtCDiOalxNb/ZzW42eRhwdy/+J3jwevoiUASKQBEoAgsIlHBuc0pEsUBIlJtATpIsBPlUUB1pVA/xPve5z0Q85hDHbOP4Yv+onuJFGVxRxHabjXObl3q13DxufAxcJI1rpcRBmnFQa5NaSNFMy6KBBCaPeMQjJpWFS2uOxXhGVLldUwVDaGIYhzgmaQ+SiDBSEylWjGulVrioIpySBY1Ex3nMPfuIKb7wwgunONIolMgj9YfqRSH653/+54lYUi3HNipL+bw4CRZVx8M4SRavM9e0lTeCaxxjAsf9swA1uleP88L3cQMdjz+S2nHhIvuOfVqlBh9G/Ff1eVyAc+9xcbZw4jkqThrhdJ+5D81hiyZU/8svv3z6zhwv4Txqs6LXUwSKQBEoAocdgRLObY7gaBBRh6ysU4dSc4+brZIX4ujUchQnh6DMdZMNSeHaKE4JWRGnpKC53zY9+cg24dy4zUPuLRaomyoJzyK5ky2T4riohEnMw6VaAhqurgif5CYMZ8l7lIaQRMj+SaYSIuN497///SeDmbsjdZGroKRA1EileKiYXK6pqZlPtpXZ84ILLpjOR90U22becKN8//vfP5WXkN1zp20xbnLxOPqVOppjTc3EFXoPIcuxkmAreC/rW+6pYJS/o/qnjIe/g1tKqIyZWpPl1XY+74aQLCOWO8W1+10VAdjGrZm3hwRO7h+eI2KjvXiQiNe02KfxBLHQgnzKDN1WBIpAESgCRaAIbB4CJZw7GJMQP3FFXC4RgiQBYdR+85vfnIiHUhSULkYT44lyiQisq7vJ8GKQ20782N///d9P8VjKC0hioo3Kym4M6B1c/pHeZVxQQNxkWU1MXS4cmaRiil9MvJ7xQFCRIgsQ5gjiSdlEuKjVjGVj+qhHPWpKPsQ1NuMoIYp6mRQcx0CcJJNCMLluI5/UHMSSq6FtfEc19fmZz3zm5MqN+OmvOUHlpP4o3bOVyr7MfXT8LqVDnFNCJf3THF9//O5axYH6W9Ka1HsMmXTNY+yje8ArSXJSHiRxhWNyLueCReqQJmus7+NGnGQ3UYOT3CcZUZFRcaghMyk1AqfET6avrl1/kwxnjIM03uaE7+JKf3WNsd6J2/GcB4f5JCkVrwL3j+edGGqqvxhOpFNMpybmWOzmO97xjulZS/nss3AOyt2mCBSBIlAEisDBIlDCuUO841bHaGUESRiTFXoJWNT2o34ydLmCSQ4jNk7Nxmw3JhdZ1o1RTeHCSfVEQs4555xJRQ3xHPdtOYAdDujCbgiIGLGzzjprMnzH7MGyEiOBEvPEwLU9Yim+U01H+xgL8WbIIIXztNNOO6ZuJWKptqZ9ZZflZksRR6wkQUFo7GvOGHcLGlysKTn6YXtzzsIGI1zm15FQUsT/4i/+YjqHmNIscowkIQQrZM/lUyclPTJ/qab2c06k+9rXvvb03UiwEDr9Qfx8jgKZUi/uDf3ych9I9uJaEHZkW/ZURDXk1W9in2Hr3sj++qWFCCJ+qfeJYIfMyi6rFqrSGH43Hvr1C7/wC1P5Fx4DSXiEhLq+ZHz1nvtNf5HnlG5xXiRWP0OwQ2b1JYTXu76kREsytsIsiZcSG5vEP1slXFpUfk/UfZ2FNPi7jtQw3UmiqHV3ZlzLjZ17xIv7t/jn61znOtPf7oc3velNU1/e9ra3TWOb+wG2V9cFgHXY9vciUASKQBEoAicSgRLOXaKPYHBjVCIirn4MVMYtIiCmj3HG8GdAc5v04uo4pwRKSIIVfO6VFJbzzjtvSpDxmc98Zqo9p8TF6I62y0vq7oOCjCCmZE2MWWqLOEmkMi3jhISaD9wAGesIm8y2jkOtRtoQQqQUkfMZwRJjiXyddNJJk3KJSClF8vCHP3w6hbFHpJAeyYzUjNSfxAhSHqmdyriE5NovmZAX4wT97Ry/9mu/NiUSQr707Za3vOU0lxn/DHjEz3Xkb67d6hyq0cnQ973jpOxGFEjfpbSH6/K3F5UUgUCq7W8+2wcRpNC6Z5Axv1O2EDUELrUcoyyOsaSuERlRBxXGxkvWXo1rNDzcKwg8MnP22Wcfv1/1SdN/46p/iGrqgaYkTghviKO+JwbWGIxExzFC0H0e6/OGnOc4IaWpUelakF8LD+LBkfRVZZb282Yd3Z+Tqdeimb7r716qiXkWyqhMJedSy23WfcNLRCyncZFASDv//POP3eIWt5gUTmWB3G/7pbruJ8Y9dhEoAkWgCBSBqwMCJZw7HOUQPMYk45hrLRLob78xWBmkXGklEEIqxO4pk8GdkqFE7WTQj8RzmRHneNQ2ZOD5z3/+8QQmksfIQEqVcn4JZRRRX4yXc4lNOLT9gTYuiBy3Pu9x9XQkY0ptjvIVxfthD3vYFGOGSFHJxIAileaDOSDOTCZN+3K3DfFDhozjlVdeOdXNRKwQQHGfvleqhdvtmDFX3U7ElWs3ImBeqR2ZuTnW7MwcQCbvdKc7TW6J+vfrv/7rE7FNDGTiTS+55JIp9jQqPNKDPMdlNvUgR/fZkNuopqn5SQV0L8DEootz7aQF45DNuJ2/5jWvmdyUuVgimNyOkTb4iJ+GDbVXqRtu6eL9qKzjYkGUy8SjGi/XiCwbN6/Ep3qnziJAwTh9S61MuFloQsyQdATSggFsnMP+UXLNF5/9bj597GMfm8i+JDiOQ8XezzaqmIkRh4e4YQsgnm/IL0U9z5G9JHe5r8S8P+5xj5uei5RMsccIp8UdhNJ8NceUKqJsSpBlkcE2VM8TpQLv59j02EWgCBSBIlAEjgICJZy7GEWGEgOMoqXmIXVJiv4YY4985CMnA9f3lArbUUIQjpe85CUTGaVQIosMXMblVqoBQ4tSJlupNrrb6geio04jw5WaqhQHwqBFdVrnwrsLKI7krlkIECNGMWP4huxQyZB7YzkSF/hTvRnPyA5lCEmUHRYx5OqK9JkbVLmMZcZdyRIuuIxoahxXbWQzjWshEoqMUJqQVmp6Fi5sF+UzJBOhRGiRJ6SMMqTZBxFyjssuu+x4GZSR2G3qwMZN2PWLUXWNvAnETiOEiB4C7re4grp+JEU87bh4sJ1rXEe09AuhdC4LBsZa3yQT07+x1IzfkEwvZNx96/hUPm7zPr/sZS+bxgtR3482jjXcLGJRDH2PKFtsQTjzrNtLVTNz37tSQmKceQ1Y2OBKy3OD8m+8/I7wau5Dc96iCTd15Yh2Op77gWmPWQSKQBEoAkWgCFwVgRLOXcwIRk5KUiB3lBvGYVQCBj0jSfIWqf0ZccgLMoI0qOWIKDI8reAjJmNtxcWuMUgR2NRhjBEYY8t5KSfUM4a2mDhqCfIpS+lisqIYz+uM6F1AdKh3hUtUO2MJ2yg84vu4+SVb5nihjGQLCQgnsiirLKXIYgSl1HEZzcYaAaQ4GitkhZFtjshmm0bZRlAZ3RRQbruyc2Y8x3i/9M95LE5QhbiYimF0DUgFFZRqRnl0TeM1ZtGDWuRYue4k9NmuijTOrcX5tmrebbXtuNBC3bVYQ6WlXlLEkv0XEXFPhmgjcDA3Loj8TmL9FhXWLD6M7sr5TAm22KBvMKfwcoOmzhlvpArZ51qvn8gp92YLDo5hXhmXhzzkIdMc2i3RS9/HeeqY3LolNRM7S111Luq2uZHkaPvlHZFYXzHDzmthzqIMF2gLNJIAGVcLdTwKzD0LI0pR6ZM5Lgbafm1FoAgUgSJQBIrA5iJQwrkHY8NwYjBSpSTzYSDFTQ2RYFByiaVQSvzD8JXghPsfd0nGHaXmBS94wRSHtyyjqONRHyglFDAkFcGlfCSL6kg8QgyQFG5qSA+DEumRbIPhJl4urQrB1hPB+FpIkC1YtlYKFswVokceEL8QmCTJ+fCHPzyNKZXIWDGObcdNkQpqO/hbZFBDUIwhJUlDPE899dRpMUKyIO7XjO+UNslCg20RiYw10sD4dnwkE+FRu9MCBXdciw+2R2oQoiTccT2uccwe6zsxlVxVKaAUu5EghmxR7LiOmlvekTnX5VqS0XWRpI7kZysX8kViNP4NO9eKhFu0oTQjcyFISDSlk1tmMtea/5QyxHMnbas+I5OyqrqPLSr42zkRTHjCzVzxGeZisd178PUssOBgnMwNsbvmB5dqRFTiMftmQWAn/R7nCqy5/FrAQNqQTXPDedT71YeDUrezcGB+G0MZni3OfeQjH5mepdR/3wkZ4BWgWeB57nOfO90LflebM0mndrKAsBM8u08RKAJFoAgUgSKwfQRKOLeP2Y/tEfc+pTLEk3HxskKvMfKSAENsElLKtQ6BoXIyUiXCEN8pDokBxtCS1XR0YwshpE4hOYxQMWQMLgZ2yINEK4x97paLCpLtERKuvAxOKh0yrAQBBQGxQYDWlW0JAFcXZTTYM34RLCqz7yjVcKZohlTBJLGF4jUpWfZBvoy9eD1j5DW6OFMiJZOSHMh4IofUO0Z4jPNR3cv5EEuqGQIj+Q9C7HxImLlobG0j5s0cCUFMbUqLHeaLxYvUsESY/O1YrgVpZtBH9RxvgJQ3SUwjsovUmFs+67Nt7Is8OV8SDkVBTqbbxIWa046RJD6OE1dVpE2fkHikTKkhxxlVfnHOT33qU6fziJ+V5Ej2WosvqzwIlj0KHNf5nY8SJxmQe1Rf4ZTsu/aFUbbVT6TTub300aKD+YCgJuOvsUNWqdoWpIwXjHJNjrkuudiq+9C8SGIorr3GwJyyIGJhYJxbB0XaMlYWPpBvC2+uGQbmTchmCKbtJZoS1wpvCyDmr0U7ngBJ1rYHj/IeoggUgSJQBIpAEdgHBEo49wjUGIWMYIYQAzWEk3F0xRVXTO5f1EnGN8UJIWBkIp+SmjCSGcW+l6SDsUwxGmsrcqe04s+YXjQQGbsMWXF+lBZGOgMTuaFWeV9UmxjBDD+KWsphpIwFw5QBTH2TaAWJWUZGR4M3Kut2XS/3aBj27TAhKmLLJIeiFMcFlkq1qBAvupKOHYuqx93yj//4j6eYOQSP8syYHpVn+5lbITTezRcLB8bYZ4TFOFMzJaXibrvo7pnzO5b5lEUKx0BKzB0LElE+c73G0VyO+/iia2bG2e8hpVF8Edgkz3E+ZEvWVsdAclMvNJln8x6FEMGIUoqQOJ7zZcHF3HWvBGt94EILBwoot1SLN9zZZTqNm3JU6NQODUlM6Rl4ILuOh+A4nr7YPzU8XYsXAppFBSqhe0WSIgsI+pCkQ9RM/YclguWzuGCqtTnlmrdSF5cRymw77hOXeu7TFh8omJp7nxqfpD8HpWKOcz7EFvbG3cKKMRGzqb+PecxjprmsPBBlXxZa8avGgMuvBTIeA7IDi4dXcsoizn65++7bg6QHLgJFoAgUgSJwNUSghHMPBz1KJ8IgJkliF8Yro8jKPYWLukjNZAwiGAxkhINhTHWgijBS//AP/3Dan0EdRQ1ZYJxR1rg6LrZFt79kRqVuIUUxovWH0ubFpQ4RHRsjjyF9/etff4pBQ6AZ98gsssL4Z/QxwKmiXmILGYMM6aPa4kqLHHCDdM0WGLhRc+9b5R4ad8Z73OMeU+ZaBATRYHQjr3FnjIvsIilgjFPDkCNjYjzMBwo1w1zcnRaFNeRvq7FYdLXMdrtVrUMsdkME0ofF9/TxQQ960OR2KqZZTKYFFhlpxURyXRefiqgm46zFGzjbDtlJXU2LOea+ey61PSnAyDHijYC7ByiDvkMW3dsInPvb+RBS2xoPSWwcP2VR3Auuwf2DIFE69RsxNW4Z8yzS7ERhdG7zgYqN+Dqf+5KHhUWucV5lbu02HnQn9/eo/Itpt7CGWHrueTZ6nkm2ZQGGZwCPC+SUKzTCyZ3d4hc36ec85zlLww520q/uUwSKQBEoAkWgCOw/AiWce4hx3OCQMgbvQx/60EnVTAZaLrcMJkYxxRDZFIfGlZLBZT9utZQRqhUDUtIMJJNhnVIO3C2R0a3IwTJDfdyW+oJ8ihdzDsY04zxqEoOVUY1Ajlk1A5V9Gdj6ydDVV+ooopz4U0Y8MisJDmVFnBaCy8hfVRZjK2Vw/D7qnf4chPE8kigkz99wgSPsXCdC/y//8i8/ls0TRgxrZBE2CIdFhJQ3GRcJRuLh+5SlQPQtSiBMSAyy/5d/+ZeTahWSOWIxlzTO3S7n2IpQj+MxEtdlKvc4N7PtqMbO6RNFHn7uAUq/sTAG4vvEK5tfYqfhiSyax1FwzXffmcPGD9kxhiFjiUO1GGA/pI266Vi2Mwa5ZxLzanGGkovcWUjiUu8c5oN7FTHN/B/Ha3z0jImHluHiOwTYfWfxAbl1v1H5YKA267I5tV1s9/BxeHxuZqEGYeeeTdWVQVj5Gh4bFktk+UYsxZfCTYOjl3uOSg17hD/PmIO6//cakx6vCBSBIlAEisDVDYESzj0e8ShHCBiyxaiN6xejVJkBhiwSguCpnWnlHjFVDoF6ydildojxpHqKZWK8M5JloE22UvGcuyFci+TO8amhjFkvBiKXS9dEuWHsUWYotV5I5TJCah8kidGNcEmGAg9YMMhTq9QxHYerrhdDk4GP7CKmVCdq4lblXOaQk70Y3sXzIBzGT5KnuPxRLcUJMvzF5RonhABeFB3jiAgtKoCLqjQyJTkUcsONEJkxF7hpUlITG7zoZrsX17mTY8wZgyzExC0XUTMHLLAkbjN1L123lzmEYLnO7Bfy5PuogRZHbGMeIl6IOHInTtL8grtjI43UTIse5rF7MnGr+ud8iTs1781V95zfECbnTP3NuMYitZRu94x7GpniUmvMqd9ccc3drZTaRbxHLJ3LQo74S8fXJ/1xf3heWMRJkqlNdWN3PUl4JGTA/SLrrjF/ylOeMrk8Gydu4J4DIZfwNffFuiOhxti7cUzm5J3M1e5TBIpAESgCRaAInBgESjj3AffEv1E4reAzoBlLDEPGFDc8cZgplcIoRmAYZ1b+ZdOU+ATpQ26UOBHPSd2glCGyFFJG27qEIusubyQ8WykrvqcQIYtIJEM7SWgYxoxA6g4jHgllaFPhfHatDP9F0hjFKLFwrpWS6x3Jcg6uibaDp3MwsJPQBmlAUkNY4xrpfON2iQtkrCMpSTAyEr8QIlh6GS/kG2lOv7hEIs6+Q1TEbmXYKQAAHLdJREFU4DKgjReVmiugBQL7qc0pFjNKTY4fAhPilL8RVK6DSAWS4Twa/MS0UTIdNzikzuZi3OgyAmObkfCFBIxEzufENUa1M67BI2OQv7Nt9guW4/XpS/D2nmzKSUyUMivekUW/+822zqcf2jg2iIpzI3+20ceolPCBI6KS+FCqMDyNYa478zXHjaszsmmuJLOsa7GtOc+tVnynhria28bE+PpsLlogSXzz4twaF4UWF4hcj3nu+BZn3Ffmn3sJOXafI9Ihl4v36yLh380C1LpnxZzfc+3ejaW5LIQAaXSfWDxDyD37xKzz7JDV23PSGLpORJSnhyZW2UIO0r9V4qo5/eo2RaAIFIEiUASKwIlDoIRzn7BPPKfYMTFWkngwmBlNSAsVjwHGvRLp4nrHhVJCGvsiNBIKJc6Jget76hdiRvmQREO8WurZnUhj07UxnBnuyKJrQqB8x3BPshCEMQQjCVkY1wgjw93vyxITuUbHEbNGOXRsZMBL/J6/c76oUYnhWyRZcEJYogwhPQhGSGkyueofZZGaJE6V8ozkhggl6yuCHIJJYVPmRFuMkwxB9G4+IJnIhc+IPPIseZNahIzslM2IG++o9I1urGP22HEOuK68cn0heqPx7jPMs29UpHGb8TfHCvkM6YwSvux7vyETyUYbddMihvmSTMvZLmOT8ychURYZKN+IH+JvPMyZxGYircbFPDH3ZDy18EOJdN8lntpvMDd/bJ+yL4gjQoTscYX91re+dTxuM3N3meK+TOkdvwuxRICpeknsZY46J0UUsfRciNfAXGV0nx5h2z6s/maxzT3o2SdsgOcGHN1HxsfYee4h7GKa3WfmhjmovA3CmfJSWRjYSXzrti+gOxSBIlAEikARKAL7gkAJ577A+v+RDcZkXP2s2CuPknhOiUQkmuE2xsiixii7wa2My6y4ToaZYvbUTrGfEmxECRIHajuERZINiUgYeyEW+3RZVzls1Bbvi+pWSNkiCXb9KXeBADD0Gf+Jh0xNyLEWKWMTuUA0XL/PyFlIR+pARkndS+I9koaRAASIKDpZSKByii2k1CjlYDyRIn8jKkiWhFCuj5plP+rPS17ykonoiGWTiAhpN3e84oIcdTaEOQsNUSt9H2Uw8y+/wdVxQubikpvvka4Q2nEMxs+jS6y+wB3mcXtOHKPf9DsKN0KRa0n87lg7FoZwCXlN380TxMXvcU1Nf8wZ21vYSLZZmLkf4JDSMEoRWdhB5HkG6BPiygVWzKPFDn0xl6KGj5M8czwEf5wPi/Ms7sGILG8EfRfb65pdizmLXHL5FXPq3LlPtjrnXs7l3TwTFnEY+zUquuaY2EyxtG9/+9snwg93KvN55503EX8LNO4TSdNgZh75nju6e8A9YwHKWI8LIbvpf/ctAkWgCBSBIlAEThwCJZz7jH0SZjCcuMMqsh6CRnlhkFE1kc+HP/zhE9E87bTTjsnEiZSeffbZUw/VqJPhloFtG+qAY59yyinT/kgrIuM75G+ruMd9vtw9P3zcNylhjFOGO3ISNdV3UTRT4iMKXEpYxFUzah8ChAQgSox+v/sbKTROcf8cXXBXXdgyJco4IDZcBSmvSajk2NwwJYEy9hRRY0qlpcohWymDEwUWsQrhiWrqOHFbHN2Ek5U0hNB+UTDjipv+Rjm0jVcWDZBW28S9NvGVoyo89i1j5PiuOyTKZ2MSV9iUX8l3xi1xnBlbxzVOxsPYGCvH9dn4pIYpwphFiLipx3074wYjLp3KxFAUt2ojmYoKPX6X/eCQOqDGy7gZG5/9ph8IL2VU36LoLYtz3vMbZZ8OmPmWZ5YxHJ8twcv8efrTnz4RTXGsz3jGM6ZYU/cqJf9pT3va5Joss7BFtLh6GyvhBQioUALut5vgsbFPcPawRaAIFIEiUASulgiUcO7zsEdhSjkRq/uM5ZAFhPKcc86Z4jTV5ZM0yDZKZXA7Y7hddNFFE6k699xzJ1KpifmicnLDQ5zUsUNIfWff3cZ27jMs2zr8YqziIsFb5s44kgSEKO613qmpqUUJV0axbfLuc8bNZy3u0D7HhdU71RWhcFzqGcObsmOMxXf6HMUt7qyOgZCIz4wq63wIC+LC/dD5opDH1dd+joHUJJmQ76I82i4LDuM7o97x4vLoHHFRTgKfHCPz0nFDRPOec9lGv3P9IexIITxSdiRJeeKKCqfU07R/XKsT4xkVeHTlnVvPNQQx467PUcllekbuxeEu3hejm7NFDcdJtlmY+WxeeOlzCBh11DmWlQIaFb+Q77nXsa0bY582XryfEisLz7i/j5lin/zkJ0/xmObtK17xiqn8i/kpRIBXBhfiV7/61dNzzvw1N82Z29/+9sckPuNyi2w6b8jmYcJrn4ahhy0CRaAIFIEicGQQKOE8gKGMAcq9ThIQhmwMKgaYzI2vfOUrJ4WASyWXzLvc5S4T+aCoqEF3oxvdaDJuqQTqLjICGexc0RhujHpqp0LqF1988WToHbSL7QFAeZVSMKuI5tiXZQrkTvsao5hhbHwQ1iSaQTiNj7IPss0aE26eUfgSyxrix31wdE10HN+96lWvmlykkZ2QX+dJLUhzQokdbpu2GRWhKJq+Q5BCZEO0Ql7tFzU36maIHmxGdTe/RyHO3yMR3Sme+7HfOC9CKN1byonwHAgWSGRU15TbMEaJM7TduEiw2NfF+bdsPs6do/uBw7pjjiQ9/Yy7tmcVgu5vcaU8KmCkmZPmDo8MRF6cs6RZsvSapxbFZKWFowzNMnGbi36zCGH+XnbZZVNMrURP5vzoQr+u3/29CBSBIlAEikAROFwIlHAe0HjFyEUkP/ShD01Gbww+xv2tbnWrqWSK5ECMN8lFGGfIKIWAEccYpmAimRSFMWupBDOMOklQKGfiOxlzkpEcJbXzgIZrW6cJqVEKhQtt1MexJIYDbkU+xu/VITQXKELLGiMdeRILaJx30kaisSkxgju5jrn7ZP4jROI5kZ2xjWraMlfauec5TNuNcw7pFmMpjtzCFjwQTImruH+Pya/sx50dhp4tap8ipOaRrM13utOdplhMcefvfve7j2ccRlAdVyIhidA8z5DRo7godpjmQftaBIpAESgCReAgECjhPAiU/+8cyeDI9ZWrZdw1Y/whnmrSnXHGGZNbrCy0CKSMtAw2BqBsqVRMMVGOw7hbjBETL6jcAEJChVDjM1lzD/ByD+RUi+RpMTPsVp1I3GG2h0/qpW6HhOX8ktNQp2UQXjSiR4VVfxaPn2N4l9xGkiEZcbn+JvsudRMxEIsoVpHavViHdVHJXaWurfttVT/HBDqLZG072M2dIHNUwnGbRdLob+Ob+Eoxl6tI95zzze37fm+3eB3LVNdxLOEg9lQJFgpmki9JYqTGq4RGnieOs+xYVHWLYhKcJZu0BTKJknheSH5lbrqv8swxRyTQotwri4L0O3YU5P3GqMcvAkWgCBSBIlAETiwCJZwHjH9Ip3IBYjMpk1SEuNky4iTGERd1+umnT2oZQ1CGS0TDu6ym4qQuvPDCiZgiOdQb8ZyMO65vDEdqKGOQi6dY0Zz7gC95X0+3LCYPfnCj2iDsjOokpZGNFKGDpdIX3GDjPko1HEuMzOl43J4Z7Mn4upOETVFJzzzzzEkpUsuUcqS/XklkpN8WGrglIgzcFveD5CX5z+g+GzxCRPTZnIJBYmSTBGiso5ksu2MW2iQdGo+Z5EYpU5MMpXH19Z5MuEmMld/Gci9jNt/FMeRdAGP30dgOE8lcNS/hmvJBiCWCiGBTxuMRYQ6Jt5TUBzmMEp/jLptPmZ8IpecKjMVeSmDmPpIYSMu4wtM2wgNs53nks7lcj4s5T5ZuUwSKQBEoAkXg6CBQwnkCxjLETwZNJJEaSdmMMpZMnbomJlDWWnGa1C1EA4lijH/6058+9uEPf3hyr6SC2l9SFoRLAhSGI+IlwRByylg8DIb1VmrV+H1KYsDn5je/+YSLGLFkNEUkxZYhFsgbQxc5W2zr1MdV0yOGs3OopcnwZrzvhADqx61vfevJzdC80NRvlUhH371HyX7wgx88kQqE+tnPfva07U7OudW1pSYlkivOMQmMUpIkGUbtr9+UQ++JUU1225DAsbTFOIaLfbZfSqLA1ss5jWm8AfJ9khyNf4+q9bJrE1NrEYfrunsmZVC4rpsvFO5kL4a17c2ZkNxcz15ive7xk6ROIZHmuPub+u3eho+/vSeLsLmi767piiuumEqwIJajJ4RxiLqf61l3Xcm4jby6pyQ141qrZqZ+jsm0JAySHRjGagfrh23GOOF1197fi0ARKAJFoAgUgaOBQAnnCRrHsSwApYFByTBjGK4qC8DQREioW4gWFUM9R66XjGPGZ4xkRrUEQoiJYuq2OwzqQq4/RMo1UWpcs2th+HopkSHWjFqD7MUl9iCGNK6Mj3/844/d9KY3nbIE75bMc7MWE0fRRiqV13CNKeOCACIFYnMtPpx//vnTHNjrMhK7vY6DwH+754gLpyROSL3Mte4ZZNnLgoV7MCV2EO2ou+ZVMu0aD4s6IU6wt5193dMhfyGKzhsijMjbz2/jPlGFowQngY7jZcy9Oy8yiRRbhHB/mxu+83tcXLeLzZzto1wilbwvLJLd9a53nbwzUlvYbxIz8dxwf1JCEdJg1Myzc5DuNkWgCBSBIlAEjh4CJZwncEzjdshQFJepFieXP+SQQbmoQMToSwzdaMDF2KU+UECpH7LWipcSP/WBD3xgOmaymJ7Ay1566jHujgssUuUVY5absPp+3IldR1qUmtSQ3I5RuxtiFTU6WWL3gsjf4x73mNw9JVSRZdh8QFBCvL3HtfE+97nPVH9VoiJEZJ06daLHezdYL/Z9p8fK/YM0mmPaqHDnvhrft8It8zWqYuJER5fiqK9RZ0fPhbgEWxyiPEZFNZ8y5svOPcZs5vf9HPvEcuovAil28znPec6xv/u7vzteL9b5hQi84Q1vmLpkbn7sYx87Xmsz83c79+aJnq89fxEoAkWgCBSBIrB3CJRw7h2WOz7SSFae8pSnTKUGJOZ46EMfOhWPj1G7Kp5uKyOckSh+E6FlDEcx2XFn92DHkESHihEqlpVbKgXTdX7xi1+c4lQpODtpi4Z58NnKODcGIfgM/riKxljOfiF8FC/q8ROf+MSp1M143PHcOe9izKLjJlNx9kWq1XekRMtMLLELt8QRp2CBbFLo9OM973nPcYiQm1zH6HY69j81Ou2U5C45QIhTrjvb5PtlCY+ycJJj5Pzpi7+RKgsIxtiCCLWPKhhlMHM8cYbjHHHcxHX6rOSGNo5pMA9hQ+TiiuszbPVTiQ5u7LI/5xj23S0Z2ikJ3snc3u99ogZHYZU1WcIfc9HzKXPA2Kkb/KxnPWtyXVdLUyz5qIbud197/CJQBIpAESgCRWDzESjh3KAxGoknsqk2J/XqCU94wrE3v/nNU0+34z4Zw19soFqe3FITh3UiLzv9YrByDZXhksGPuHETDBEIuduJgjMqM0iMcg8Ij7jI1M4MkYm7pHIzjGtxoch5fs/5Y4iPcaJcNEO4QlpGwrlIZLYivlGeKUPG/V3vetekTCsjoS1mgxXTy736Gc94xuTGqR8jKXOeJENKf/J38E0SnvyeGp2L5Blhy5iN82Y8Xn4fz5ttoz7DWcKm1PP0e9S8Udkb+5NjjGq/cRpblETnWVQVJcwx5ymajhESiqRzrb388suvkkAo597JnDuR99Renjsx5u4ZqqVFL54SXHk15VNk0Ban+c53vnNKTCamM2ECWRjbyz71WEWgCBSBIlAEisDhRaCEc8PGLspOEnCoy6i2IyOPwvCkJz1pyi4Z0pDuj26AIWp+S/wUUifekeEdojHuO8KwqNaMboe2GwlYzrsKxkUC43iIACKDUCMbi6pgSMpWhv9IDEIuF12NkdnHPe5xU9fEmsFNMiV1LMVLIkDICxLqpT9UVUSEa3Oy1h7kFOESTSXSd2ovlVP5k5F8u16EWAkV5XGQz7Z5CLziFa+YYn7FPSoZJC5YDCfV06LOG9/4xunzOMeX3WPzznY4tsozx7vFAO74r3/966d7E0bUYfPyz/7szyY3buTysY997LG3ve1tE055xoz36tWZsB+OUW8vi0ARKAJFoAgcHAIlnAeH9bbPNKp0jLqzzjprUrS4XMpQK45KbCYyxYBe15AUmVtltGVE7taNcN35dvP7KhfFVSoUIqtEg9IhjGVGs2vmxikxjH1l7eQCqFQDt1iJTairUXBOtMolVpXLp1qcXKElYTFWWYQI+TQfkAPbIUs18lfPOOMKr5REyfx3X/ACEDsrI7TFGa7N1Dt1Iz//+c8fV2KPkuts0HL9Flu4aFMuLUghlr6jbHKZlUTp1a9+9bTAIYb6RN8ju3m2dN8iUASKQBEoAkXgYBEo4TxYvLd9tpDOxJkhFVxCJQRCqJAr7pTc4FIKQVZN2W5TEgHB8mJIXnnllRPJUh4i5S9yjiiNITSpZzi6+jLSuSiOhjeDdZHsxG0y6kl+d0zHS7KdkCi/L5afSImRqJ2u0bkpUq6ZAkih9PKZCoNgiv/kQvymN73pOFETQ8iAXlcaJTifKGLBPdd1cPW0sOB6jbExGxsM73a3u01KJ8U2dRC3PcGuhjssU9NHGMx/mYcRUEmZxNNyBba487rXve7YJz/5yWnB5qg01ys28053utOxF77whcdufOMbT+V2LNK8//3vn7wqqL5akmW5X7vAcVRmQK+jCBSBIlAEisD+IlDCub/47tvRFwkRAsJdlsuoUikIGcORooO4UP4ofFQMpMz3YihTv8/xHEMLAR0T3eRzjMzEaUlChMSNbreOk7hG3/s8GvnLXO+iNsWQTUwjguocIYwpCyHTKOWSMvnlL395ijOjSqU0xIkijLsd8JB9qqZYzne84x1T7C31lStj3IZdn/G7y13ucuycc845dvLJJ0/kelWG09327eq0/+L84dp8//vff8ogzc3dOFFKLeoYF8mtvHPDttiDoKauZ+piGpuULIpinTjY/L3K62C8L8eEUL5HBFP/1LtFKQszlEn3uu/cQ+aM54RnhGeB7ZBqizvqdrp/xA9z47dwozUJ0NVp5vdai0ARKAJFoAjsPQIlnHuP6YEdcSSBi7GUO1EfxqyiyRrKUI1xm+/G98QTxlBmuGrj+X2XuoXL3qOk5rftuvouKlaLsZwHNiB7dKK4OMLDZ/hZPFASJopwVGduteI9ueFyAd3JuO9Rt4/kYRZrwuYiETWZlRFRizvUQAQOkZPMiUotmVPqfBrH1OZMduLcR8sWeIzjuOCTeyoLMrlHRqKKLKbcCnLJ4wHpRYSdQ1+4wyLHqe3qeOKZKerjYkX6NC4wHckB7kUVgSJQBIpAESgC+45ACee+Q3ywJzisyt7BorT5Z0M2kJlPfepTk2qNpHAbFq8bddlYizmMS+Qd7nCHzb+wI9DDo3aPNR7zCEzKXkIRKAJFoAgUgQ1GoIRzgwenXbv6IpAyIFxmxaNSz+IySbmKiisO93a3u92xCy64YEp8Y7+ozFdf9HrlRaAIFIEiUASKQBEoApuCQAnnpoxE+1EEFhBIPKfSHUq6qHcoU6g21qV8zGMeM8XpUkPF37UVgSJQBIpAESgCRaAIFIFNQaCEc1NGov0oAksQSJwf1VINyQc96EFTPVbZUtXrlLjmpJNOOvYbv/EbU/KX3/md3ymORaAIFIEiUASKQBEoAkVgYxAo4dyYoWhHisByBJJBOK6ySqAgnsrBSFYj2Qt3W+63ksE0cVBnUhEoAkWgCBSBIlAEisCmIFDCuSkj0X4UgRkIrErwkoyqJZwzgOwmRaAIFIEiUASKQBEoAgeCQAnngcDckxSBvUUgxHOsf3rYy8HsLUI9WhEoAkWgCBSBIlAEisAmIFDCuQmj0D4UgSJQBIpAESgCRaAIFIEiUASOIAIlnEdwUHtJRaAIFIEiUASKQBEoAkWgCBSBTUCghHMTRqF9KAJFoAgUgSJQBIpAESgCRaAIHEEESjiP4KD2kopAESgCRaAIFIEiUASKQBEoApuAQAnnJoxC+1AEikARKAJFoAgUgSJQBIpAETiCCJRwHsFB7SUVgSJQBIpAESgCRaAIFIEiUAQ2AYESzk0YhfahCBSBIlAEikARKAJFoAgUgSJwBBEo4TyCg9pLKgJFoAgUgSJQBIpAESgCRaAIbAICJZybMArtQxEoAkWgCBSBIlAEikARKAJF4AgiUMJ5BAe1l1QEikARKAJFoAgUgSJQBIpAEdgEBEo4N2EU2ociUASKQBEoAkWgCBSBIlAEisARRKCE8wgOai+pCBSBIlAEikARKAJFoAgUgSKwCQiUcG7CKLQPRaAIFIEiUASKQBEoAkWgCBSBI4hACecRHNReUhEoAkWgCBSBIlAEikARKAJFYBMQKOHchFFoH4pAESgCRaAIFIEiUASKQBEoAkcQgRLOIziovaQiUASKQBEoAkWgCBSBIlAEisAmIFDCuQmj0D4UgSJQBIpAESgCRaAIFIEiUASOIAIlnEdwUHtJRaAIFIEiUASKQBEoAkWgCBSBTUCghHMTRqF9KAJFoAgUgSJQBIpAESgCRaAIHEEESjiP4KD2kopAESgCRaAIFIEiUASKQBEoApuAQAnnJoxC+1AEikARKAJFoAgUgSJQBIpAETiCCJRwHsFB7SUVgSJQBIpAESgCRaAIFIEiUAQ2AYESzk0YhfahCBSBIlAEikARKAJFoAgUgSJwBBEo4TyCg9pLKgJFoAgUgSJQBIpAESgCRaAIbAICJZybMArtQxEoAkWgCBSBIlAEikARKAJF4AgiUMJ5BAe1l1QEikARKAJFoAgUgSJQBIpAEdgEBEo4N2EU2ociUASKQBEoAkWgCBSBIlAEisARRKCE8wgOai+pCBSBIlAEikARKAJFoAgUgSKwCQiUcG7CKLQPRaAIFIEiUASKQBEoAkWgCBSBI4hACecRHNReUhEoAkWgCBSBIlAEikARKAJFYBMQKOHchFFoH4pAESgCRaAIFIEiUASKQBEoAkcQgRLOIziovaQiUASKQBEoAkWgCBSBIlAEisAmIFDCuQmj0D4UgSJQBIpAESgCRaAIFIEiUASOIAIlnEdwUHtJRaAIFIEiUASKQBEoAkWgCBSBTUCghHMTRqF9KAJFoAgUgSJQBIpAESgCRaAIHEEESjiP4KD2kopAESgCRaAIFIEiUASKQBEoApuAQAnnJoxC+1AEikARKAJFoAgUgSJQBIpAETiCCJRwHsFB7SUVgSJQBIpAESgCRaAIFIEiUAQ2AYESzk0YhfahCBSBIlAEikARKAJFoAgUgSJwBBEo4TyCg9pLKgJFoAgUgSJQBIpAESgCRaAIbAICJZybMArtQxEoAkWgCBSBIlAEikARKAJF4AgiUMJ5BAe1l1QEikARKAJFoAgUgSJQBIpAEdgEBEo4N2EU2ociUASKQBEoAkWgCBSBIlAEisARRKCE8wgOai+pCBSBIlAEikARKAJFoAgUgSKwCQiUcG7CKLQPRaAIFIEiUASKQBEoAkWgCBSBI4hACecRHNReUhEoAkWgCBSBIlAEikARKAJFYBMQKOHchFFoH4pAESgCRaAIFIEiUASKQBEoAkcQgRLOIziovaQiUASKQBEoAkWgCBSBIlAEisAmIFDCuQmj0D4UgSJQBIpAESgCRaAIFIEiUASOIAIlnEdwUHtJRaAIFIEiUASKQBEoAkWgCBSBTUCghHMTRqF9KAJFoAgUgSJQBIpAESgCRaAIHEEESjiP4KD2kopAESgCRaAIFIEiUASKQBEoApuAwP8DSY5AM+oKSCoAAAAASUVORK5CYII="}],"animations":[{"uuid":"79010dec-f6e1-033b-fdb0-7fed83a46717","name":"animation.cape_creation_tool.migration","loop":"once","override":false,"length":0,"snapping":24,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"91d65ecf-f78b-6339-d66f-548e29eb89d3":{"name":"Cape","type":"bone","keyframes":[{"channel":"position","data_points":[{"x":"0","y":"-0.5","z":"1"}],"uuid":"cc03a0f0-4c89-3d51-fa9d-ba5d7cc0b3a0","time":0,"color":-1,"interpolation":"linear"}]}}},{"uuid":"f88e2510-c78f-4521-3629-cedb0e6326d8","name":"animation.cape_creation_tool.solo","loop":"once","override":false,"length":0,"snapping":24,"selected":false,"anim_time_update":"","blend_weight":"","start_delay":"","loop_delay":"","animators":{"91d65ecf-f78b-6339-d66f-548e29eb89d3":{"name":"Cape","type":"bone","keyframes":[{"channel":"rotation","data_points":[{"x":"0","y":"180","z":"0"}],"uuid":"1c2da9a3-7a80-1b48-04dc-fa18e3c13147","time":0,"color":-1,"interpolation":"linear"}]}}}]}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
deleted file mode 100644
index 8b0b895..0000000
--- a/gradle.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# Done to increase the memory available to gradle.
-org.gradle.jvmargs=-Xmx1G -XX:+UseParallelGC
-
-org.gradle.daemon=true
-org.gradle.parallel=true
-org.gradle.configureondemand=true
-org.gradle.caching=true
-
-minecraft_version=1.21.4
-yarn_mappings=1.21.4+build.7
-loader_version=0.16.10
-fabric_version=0.114.0+1.21.4
-
-mod_version = 0.0.7-beta1
-maven_group = org.saturnclient
-archives_base_name = saturnclient
-
-player_anim = 2.0.3+1.21.4
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 9bbc975..0000000
Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 37f853b..0000000
--- a/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
-networkTimeout=10000
-validateDistributionUrl=true
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
deleted file mode 100755
index faf9300..0000000
--- a/gradlew
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright © 2015-2021 the original authors.
-#
-# Licensed 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
-#
-# https://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.
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-
-##############################################################################
-#
-# Gradle start up script for POSIX generated by Gradle.
-#
-# Important for running:
-#
-# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
-# noncompliant, but you have some other compliant shell such as ksh or
-# bash, then to run this script, type that shell name before the whole
-# command line, like:
-#
-# ksh Gradle
-#
-# Busybox and similar reduced shells will NOT work, because this script
-# requires all of these POSIX shell features:
-# * functions;
-# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
-# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
-# * compound commands having a testable exit status, especially «case»;
-# * various built-in commands including «command», «set», and «ulimit».
-#
-# Important for patching:
-#
-# (2) This script targets any POSIX shell, so it avoids extensions provided
-# by Bash, Ksh, etc; in particular arrays are avoided.
-#
-# The "traditional" practice of packing multiple parameters into a
-# space-separated string is a well documented source of bugs and security
-# problems, so this is (mostly) avoided, by progressively accumulating
-# options in "$@", and eventually passing that to Java.
-#
-# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
-# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
-# see the in-line comments for details.
-#
-# There are tweaks for specific operating systems such as AIX, CygWin,
-# Darwin, MinGW, and NonStop.
-#
-# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
-# within the Gradle project.
-#
-# You can find Gradle at https://github.com/gradle/gradle/.
-#
-##############################################################################
-
-# Attempt to set APP_HOME
-
-# Resolve links: $0 may be a link
-app_path=$0
-
-# Need this for daisy-chained symlinks.
-while
- APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
- [ -h "$app_path" ]
-do
- ls=$( ls -ld "$app_path" )
- link=${ls#*' -> '}
- case $link in #(
- /*) app_path=$link ;; #(
- *) app_path=$APP_HOME$link ;;
- esac
-done
-
-# This is normally unused
-# shellcheck disable=SC2034
-APP_BASE_NAME=${0##*/}
-# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD=maximum
-
-warn () {
- echo "$*"
-} >&2
-
-die () {
- echo
- echo "$*"
- echo
- exit 1
-} >&2
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "$( uname )" in #(
- CYGWIN* ) cygwin=true ;; #(
- Darwin* ) darwin=true ;; #(
- MSYS* | MINGW* ) msys=true ;; #(
- NONSTOP* ) nonstop=true ;;
-esac
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD=$JAVA_HOME/jre/sh/java
- else
- JAVACMD=$JAVA_HOME/bin/java
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD=java
- if ! command -v java >/dev/null 2>&1
- then
- die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-fi
-
-# Increase the maximum file descriptors if we can.
-if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
- case $MAX_FD in #(
- max*)
- # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
- MAX_FD=$( ulimit -H -n ) ||
- warn "Could not query maximum file descriptor limit"
- esac
- case $MAX_FD in #(
- '' | soft) :;; #(
- *)
- # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
- ulimit -n "$MAX_FD" ||
- warn "Could not set maximum file descriptor limit to $MAX_FD"
- esac
-fi
-
-# Collect all arguments for the java command, stacking in reverse order:
-# * args from the command line
-# * the main class name
-# * -classpath
-# * -D...appname settings
-# * --module-path (only if needed)
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if "$cygwin" || "$msys" ; then
- APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
- CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
-
- JAVACMD=$( cygpath --unix "$JAVACMD" )
-
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- for arg do
- if
- case $arg in #(
- -*) false ;; # don't mess with options #(
- /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
- [ -e "$t" ] ;; #(
- *) false ;;
- esac
- then
- arg=$( cygpath --path --ignore --mixed "$arg" )
- fi
- # Roll the args list around exactly as many times as the number of
- # args, so each arg winds up back in the position where it started, but
- # possibly modified.
- #
- # NB: a `for` loop captures its iteration list before it begins, so
- # changing the positional parameters here affects neither the number of
- # iterations, nor the values presented in `arg`.
- shift # remove old arg
- set -- "$@" "$arg" # push replacement arg
- done
-fi
-
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-
-# Collect all arguments for the java command:
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
-# and any embedded shellness will be escaped.
-# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
-# treated as '${Hostname}' itself on the command line.
-
-set -- \
- "-Dorg.gradle.appname=$APP_BASE_NAME" \
- -classpath "$CLASSPATH" \
- org.gradle.wrapper.GradleWrapperMain \
- "$@"
-
-# Stop when "xargs" is not available.
-if ! command -v xargs >/dev/null 2>&1
-then
- die "xargs is not available"
-fi
-
-# Use "xargs" to parse quoted args.
-#
-# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
-#
-# In Bash we could simply go:
-#
-# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
-# set -- "${ARGS[@]}" "$@"
-#
-# but POSIX shell has neither arrays nor command substitution, so instead we
-# post-process each arg (as a line of input to sed) to backslash-escape any
-# character that might be a shell metacharacter, then use eval to reverse
-# that process (while maintaining the separation between arguments), and wrap
-# the whole thing up as a single "set" statement.
-#
-# This will of course break if any of these variables contains a newline or
-# an unmatched quote.
-#
-
-eval "set -- $(
- printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
- xargs -n1 |
- sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
- tr '\n' ' '
- )" '"$@"'
-
-exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
deleted file mode 100644
index 9b42019..0000000
--- a/gradlew.bat
+++ /dev/null
@@ -1,94 +0,0 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-goto fail
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
-
-:end
-@rem End local scope for the variables with windows NT shell
-if %ERRORLEVEL% equ 0 goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-set EXIT_CODE=%ERRORLEVEL%
-if %EXIT_CODE% equ 0 set EXIT_CODE=1
-if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
-exit /b %EXIT_CODE%
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/settings.gradle b/settings.gradle
index f91a4fe..f9b84c1 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,9 +1,23 @@
-pluginManagement {
- repositories {
- maven {
- name = 'Fabric'
- url = 'https://maven.fabricmc.net/'
- }
- gradlePluginPortal()
- }
-}
+rootProject.name = "saturn-client"
+
+include("common")
+
+def versions = [
+ "1.21",
+ "1.21.1",
+ "1.21.2",
+ "1.21.3",
+ "1.21.4",
+ "1.21.5",
+ "1.21.6",
+ "1.21.7",
+ "1.21.8",
+ "1.21.9",
+ "1.21.10",
+ "1.21.11"
+]
+
+versions.each { v ->
+ include("mc-$v")
+ project(":mc-$v").projectDir = file("versions/$v")
+}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/cosmetics/Emotes.java b/src/main/java/org/saturnclient/cosmetics/Emotes.java
deleted file mode 100644
index bc0353b..0000000
--- a/src/main/java/org/saturnclient/cosmetics/Emotes.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.saturnclient.cosmetics;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class Emotes {
- public static List availableEmotes = new ArrayList<>();
-
- public static void initialize() {
- availableEmotes.add("tpose");
- availableEmotes.add("back_flip");
- availableEmotes.add("facepalm");
- availableEmotes.add("cry");
- availableEmotes.add("giga_chad");
- availableEmotes.add("front_flip");
- }
-}
diff --git a/src/main/java/org/saturnclient/cosmetics/cloak/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/cosmetics/cloak/CloakFeatureRenderer.java
deleted file mode 100644
index a91ff29..0000000
--- a/src/main/java/org/saturnclient/cosmetics/cloak/CloakFeatureRenderer.java
+++ /dev/null
@@ -1,343 +0,0 @@
-package org.saturnclient.cosmetics.cloak;
-
-import java.util.Arrays;
-
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-import org.saturnclient.saturnclient.config.Config;
-
-import net.minecraft.client.render.OverlayTexture;
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.client.render.VertexConsumer;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.entity.equipment.EquipmentModel;
-import net.minecraft.client.render.entity.equipment.EquipmentModelLoader;
-import net.minecraft.client.render.entity.equipment.EquipmentModel.LayerType;
-import net.minecraft.client.render.entity.feature.FeatureRenderer;
-import net.minecraft.client.render.entity.feature.FeatureRendererContext;
-import net.minecraft.client.render.entity.model.PlayerEntityModel;
-import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.component.DataComponentTypes;
-import net.minecraft.component.type.EquippableComponent;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.equipment.EquipmentAsset;
-import net.minecraft.registry.RegistryKey;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.math.RotationAxis;
-import net.minecraft.util.math.Vec3d;
-
-/**
- * The cloak renderer
- * - **Efficient**: uses a image only consisting of the cloak texture, 16x8
- * whitespace.
- * - **Curving**: Curves when player velocity increases.
- * - **Wavey**: Makes the cloak feel like wind, when jump sprinting.
- */
-public class CloakFeatureRenderer extends FeatureRenderer {
- private final EquipmentModelLoader equipmentModelLoader;
- private static final int PARTS = 24;
- private final float[] segmentValues = new float[PARTS];
-
- private static final float TEX_W = 176f;
- private static final float TEX_H = 138f;
-
- private static final class PxRect {
- final int x, y, w, h;
-
- PxRect(int x, int y, int w, int h) {
- this.x = x;
- this.y = y;
- this.w = w;
- this.h = h;
- }
-
- float u1() {
- return x / TEX_W;
- }
-
- float v1() {
- return y / TEX_H;
- }
-
- float u2() {
- return (x + w) / TEX_W;
- }
-
- float v2() {
- return (y + h) / TEX_H;
- }
- }
-
- private static final PxRect FRONT_RECT = new PxRect(8, 8, 80, 128);
- private static final PxRect BACK_RECT = new PxRect(96, 8, 80, 128);
- private static final PxRect LEFT_EDGE_RECT = new PxRect(0, 8, 8, 128);
- private static final PxRect RIGHT_EDGE_RECT = new PxRect(88, 8, 8, 128);
- private static final PxRect TOP_RECT = new PxRect(8, 0, 80, 8);
- private static final PxRect BOTTOM_RECT = new PxRect(88, 0, 80, 8);
-
- public CloakFeatureRenderer(FeatureRendererContext context,
- EquipmentModelLoader equipmentModelLoader) {
- super(context);
- this.equipmentModelLoader = equipmentModelLoader;
- Arrays.fill(segmentValues, 0.0f);
- }
-
- private boolean hasCustomModelForLayer(ItemStack stack, EquipmentModel.LayerType layerType) {
- EquippableComponent equippableComponent = (EquippableComponent) stack
- .get(DataComponentTypes.EQUIPPABLE);
- if (equippableComponent != null && !equippableComponent.assetId().isEmpty()) {
- EquipmentModel equipmentModel = this.equipmentModelLoader
- .get((RegistryKey) equippableComponent.assetId().get());
- return !equipmentModel.getLayers(layerType).isEmpty();
- } else {
- return false;
- }
- }
-
- private void renderCapeQuad(VertexConsumer vertexConsumer, MatrixStack matrixStack,
- Vec3d bottomLeft, Vec3d bottomRight, Vec3d topRight, Vec3d topLeft,
- float u1, float v1, float u2, float v2, int light, int overlay,
- float normalX, float normalY, float normalZ, boolean flipWinding) {
- MatrixStack.Entry entry = matrixStack.peek();
-
- if (!flipWinding) {
- // CCW
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) bottomLeft.x, (float) bottomLeft.y,
- (float) bottomLeft.z)
- .color(255, 255, 255, 255).texture(u1, v2).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) bottomRight.x, (float) bottomRight.y,
- (float) bottomRight.z)
- .color(255, 255, 255, 255).texture(u2, v2).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) topRight.x, (float) topRight.y,
- (float) topRight.z)
- .color(255, 255, 255, 255).texture(u2, v1).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) topLeft.x, (float) topLeft.y,
- (float) topLeft.z)
- .color(255, 255, 255, 255).texture(u1, v1).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- } else {
- // CW
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) topLeft.x, (float) topLeft.y,
- (float) topLeft.z)
- .color(255, 255, 255, 255).texture(u1, v1).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) topRight.x, (float) topRight.y,
- (float) topRight.z)
- .color(255, 255, 255, 255).texture(u2, v1).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) bottomRight.x, (float) bottomRight.y,
- (float) bottomRight.z)
- .color(255, 255, 255, 255).texture(u2, v2).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- vertexConsumer.vertex(entry.getPositionMatrix(), (float) bottomLeft.x, (float) bottomLeft.y,
- (float) bottomLeft.z)
- .color(255, 255, 255, 255).texture(u1, v2).overlay(overlay).light(light)
- .normal(normalX, normalY, normalZ);
- }
- }
-
- private void renderCape(MatrixStack matrixStack, VertexConsumer vertexConsumer, PlayerEntityRenderState playerState,
- int light, int overlay) {
- float capeWidth = 10.0f / 16.0f;
- float capeHeight = 16.0f / 16.0f;
- float capeDepth = 1.0f / 16.0f;
- float capePartHeight = capeHeight / PARTS;
-
- float x1 = -capeWidth / 2.0f;
- float x2 = capeWidth / 2.0f;
-
- final float frontU1 = FRONT_RECT.u1();
- final float frontU2 = FRONT_RECT.u2();
- final float frontV1 = FRONT_RECT.v1();
- final float frontV2 = FRONT_RECT.v2();
- final float frontPartV = (frontV2 - frontV1) / PARTS;
- final float backU1 = BACK_RECT.u1();
- final float backU2 = BACK_RECT.u2();
- final float backV1 = BACK_RECT.v1();
- final float backV2 = BACK_RECT.v2();
- final float backPartV = (backV2 - backV1) / PARTS;
- final float leftU1 = LEFT_EDGE_RECT.u1();
- final float leftU2 = LEFT_EDGE_RECT.u2();
- final float leftV1 = LEFT_EDGE_RECT.v1();
- final float leftV2 = LEFT_EDGE_RECT.v2();
- final float leftPartV = (leftV2 - leftV1) / PARTS;
- final float rightU1 = RIGHT_EDGE_RECT.u1();
- final float rightU2 = RIGHT_EDGE_RECT.u2();
- final float rightV1 = RIGHT_EDGE_RECT.v1();
- final float rightV2 = RIGHT_EDGE_RECT.v2();
- final float rightPartV = (rightV2 - rightV1) / PARTS;
- final float topU1 = TOP_RECT.u1();
- final float topU2 = TOP_RECT.u2();
- final float topV1 = TOP_RECT.v1();
- final float topV2 = TOP_RECT.v2();
- final float bottomU1 = BOTTOM_RECT.u1();
- final float bottomU2 = BOTTOM_RECT.u2();
- final float bottomV1 = BOTTOM_RECT.v1();
- final float bottomV2 = BOTTOM_RECT.v2();
-
- float curY = 0.0f;
- float curZ = 0.0f;
-
- for (int i = 0; i < PARTS; i++) {
- float angle = (2.0f - segmentValues[i]) * ((float) Math.PI / 2f);
- float dirY = -(float) Math.cos(angle);
- float dirZ = (float) Math.sin(angle);
-
- // 1. Thickness at the START of this segment (Must match PREVIOUS segment's end)
- float prevAngle = (i > 0) ? (2.0f - segmentValues[i - 1]) * ((float) Math.PI / 2f) : angle;
- float startAvgAngle = (angle + prevAngle) / 2.0f;
- float thickYStart = (float) Math.sin(startAvgAngle) * capeDepth;
- float thickZStart = (float) Math.cos(startAvgAngle) * capeDepth;
-
- // 2. Thickness at the END of this segment (Must match NEXT segment's start)
- float nextAngle = (i < PARTS - 1) ? (2.0f - segmentValues[i + 1]) * ((float) Math.PI / 2f) : angle;
- float endAvgAngle = (angle + nextAngle) / 2.0f;
- float thickYEnd = (float) Math.sin(endAvgAngle) * capeDepth;
- float thickZEnd = (float) Math.cos(endAvgAngle) * capeDepth;
-
- float nextY = curY + dirY * capePartHeight;
- float nextZ = curZ + dirZ * capePartHeight;
-
- // Inner Vertices (The spine of the cape)
- Vec3d innerTopLeft = new Vec3d(x2, curY, curZ);
- Vec3d innerTopRight = new Vec3d(x1, curY, curZ);
- Vec3d innerBotLeft = new Vec3d(x2, nextY, nextZ);
- Vec3d innerBotRight = new Vec3d(x1, nextY, nextZ);
-
- // Outer Vertices (Offset by the specific joint thickness)
- Vec3d outerTopLeft = new Vec3d(x2, curY - thickYStart, curZ - thickZStart);
- Vec3d outerTopRight = new Vec3d(x1, curY - thickYStart, curZ - thickZStart);
- Vec3d outerBotLeft = new Vec3d(x2, nextY - thickYEnd, nextZ - thickZEnd);
- Vec3d outerBotRight = new Vec3d(x1, nextY - thickYEnd, nextZ - thickZEnd);
-
- // FRONT (facing camera)
- this.renderCapeQuad(vertexConsumer, matrixStack,
- outerBotRight, outerBotLeft, outerTopLeft, outerTopRight,
- frontU2, frontV1 + (frontPartV * i), frontU1, frontV1 + (frontPartV * (i + 1)),
- light, overlay, 0, 0, 1, false);
-
- // BACK (Facing player)
- this.renderCapeQuad(vertexConsumer, matrixStack,
- innerBotLeft, innerBotRight, innerTopRight, innerTopLeft,
- backU2, backV1 + (backPartV * i), backU1, backV1 + (backPartV * (i + 1)),
- light, overlay, 0, 0, -1, false);
-
- // LEFT EDGE
- this.renderCapeQuad(vertexConsumer, matrixStack,
- innerBotLeft, outerBotLeft, outerTopLeft, innerTopLeft,
- leftU1, leftV1 + (leftPartV * i), leftU2, leftV1 + (leftPartV * (i + 1)),
- light, overlay, 1, 0, 0, false);
-
- // RIGHT EDGE
- this.renderCapeQuad(vertexConsumer, matrixStack,
- outerBotRight, innerBotRight, innerTopRight, outerTopRight,
- rightU1, rightV1 + (rightPartV * i), rightU2, rightV1 + (rightPartV * (i + 1)),
- light, overlay, -1, 0, 0, false);
-
- // TOP FACE (Only on first segment)
- if (i == 0) {
- this.renderCapeQuad(vertexConsumer, matrixStack,
- outerTopLeft, outerTopRight, innerTopRight, innerTopLeft,
- topU1, topV1, topU2, topV2, light, overlay, 0, 1, 0, false);
- }
-
- // BOTTOM FACE (Only on last segment)
- if (i == PARTS - 1) {
- this.renderCapeQuad(vertexConsumer, matrixStack,
- innerBotLeft, innerBotRight, outerBotRight, outerBotLeft,
- bottomU1, bottomV1, bottomU2, bottomV2, light, overlay, 0, -1, 0, false);
- }
-
- curY = nextY;
- curZ = nextZ;
- }
- }
-
- // Shift array left and insert new value at the start
- private void updateSegmentValues(float value) {
- // Shift all elements one position to the right (from end to start)
- for (int i = segmentValues.length - 1; i > 0; i--) {
- segmentValues[i] = segmentValues[i - 1];
- }
-
- // Insert the new value at index 0
- segmentValues[0] = value;
- }
-
- private long lastUpdate = 0;
-
- public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int light,
- PlayerEntityRenderState playerEntityRenderState, float f, float g) {
- if (playerEntityRenderState.invisible || !playerEntityRenderState.capeVisible
- || playerEntityRenderState.skinTextures.capeTexture() != null) {
- return;
- }
-
- SaturnPlayer player = SaturnPlayer.get(playerEntityRenderState.name);
-
- if (player == null) {
- return;
- }
-
- Identifier customCape = Cloaks.getCurrentCloakTexture(player.uuid);
- if (customCape == null
- || this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.WINGS)) {
- return;
- }
-
- int minBrightness = 7;
- int blockLight = (light >> 4) & 0xF;
- int skyLight = (light >> 20) & 0xF;
- blockLight = Math.max(blockLight, minBrightness);
- skyLight = Math.max(skyLight, minBrightness);
- light = (skyLight << 20) | (blockLight << 4);
-
- VertexConsumer vertexConsumer = vertexConsumerProvider
- .getBuffer(RenderLayer.getEntityAlpha(customCape));
-
- matrixStack.push();
-
- matrixStack.translate(0.0f, 0.0f, 0.12f);
-
- if (this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.HUMANOID)) {
- matrixStack.translate(0.0F, -0.053125F, 0.06875F);
- }
-
- if (playerEntityRenderState.isInSneakingPose) {
- matrixStack.translate(0, 0.16f, 0.0f);
- matrixStack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(29.0f));
- }
-
- long now = System.currentTimeMillis();
- if (now - lastUpdate >= 20) {
- float velX = Math.min(1.0f, playerEntityRenderState.field_53537 / 108.0f);
- float rawVelY = playerEntityRenderState.field_53536;
- float velY = (rawVelY > 4.0f ? rawVelY : 0.0f) / 16;
-
- float value = playerEntityRenderState.isSwimming ? 0.0f : velX + velY;
-
- if (Config.cloakPhysics.value) {
- updateSegmentValues(value);
- } else {
- float last = segmentValues[0];
- float maxStep = 0.02f;
- float next = value;
-
- if (next > last)
- next = Math.min(next, last + maxStep);
- else if (next < last)
- next = Math.max(next, last - maxStep);
-
- Arrays.fill(segmentValues, next);
- }
- lastUpdate = now;
- }
-
- renderCape(matrixStack, vertexConsumer, playerEntityRenderState, light, OverlayTexture.DEFAULT_UV);
-
- matrixStack.pop();
- }
-}
diff --git a/src/main/java/org/saturnclient/cosmetics/cloak/Cloaks.java b/src/main/java/org/saturnclient/cosmetics/cloak/Cloaks.java
deleted file mode 100644
index ef54f85..0000000
--- a/src/main/java/org/saturnclient/cosmetics/cloak/Cloaks.java
+++ /dev/null
@@ -1,265 +0,0 @@
-package org.saturnclient.cosmetics.cloak;
-
-import net.minecraft.util.Identifier;
-
-import org.saturnclient.saturnclient.client.ServiceClient;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-
-import javax.imageio.ImageIO;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import org.saturnclient.cosmetics.cloak.utils.AnimatedCloakData;
-import org.saturnclient.cosmetics.cloak.utils.IdentifierUtils;
-import org.saturnclient.saturnclient.SaturnClient;
-
-/**
- * Manages the cloak system for Saturn Client.
- * Handles loading and caching of player cloaks.
- * Originally created by IIpho3nix and modified for Saturn Client by leo.
- */
-public class Cloaks {
- public static final String[] ALL_CLOAKS = { "glitch", "mercedes_flow", "crimson_mark", "bmw", "amg", "amg_petronas",
- "ferrari", "redbull", "black_hole_amethyst", "black_hole_flame", "black_hole_white" };
- private static final String[] ANIMATED_CLOAKS = { "glitch", "black_hole_amethyst", "black_hole_flame",
- "black_hole_white" };
-
- private static final String CLOAKS_RESOURCE_PATH = "assets/saturnclient/textures/cloaks/";
- public static final List availableCloaks = new ArrayList<>();
- public static Identifier cloakCacheIdentifier = null;
- public static final Map> animatedCloaks = new ConcurrentHashMap<>();
- private static final Map lastFrameTime = new ConcurrentHashMap<>();
-
- private static final ExecutorService CLOAK_LOADER_EXECUTOR = Executors.newFixedThreadPool(
- Math.min(4, Runtime.getRuntime().availableProcessors()),
- r -> {
- Thread t = new Thread(r, "cloak-loader");
- t.setDaemon(true);
- t.setPriority(Thread.NORM_PRIORITY - 1);
- return t;
- });
-
- private static final ConcurrentHashMap> CLOAK_CACHE = new ConcurrentHashMap<>();
-
- /**
- * Initializes the cloak system.
- * Loads cloak textures from resources.
- */
- public static void initialize() {
- availableCloaks.add(0, "");
- }
-
- /**
- * Sets cloak of the current player
- *
- * @param cloakName Name of the cloak file to load
- */
- public static void setCloak(String cloakName) {
- if (availableCloaks.contains(cloakName)) {
- setCloak(ServiceClient.uuid, cloakName);
- ServiceClient.setCloak(cloakName);
- }
- }
-
- /**
- * Handles loading and caching of a new cloak texture, without connecting to the
- * server.
- *
- * @param cloakName Name of the cloak file to load
- */
- public static void setCloak(UUID uuid, String cloakName) {
- SaturnPlayer player = SaturnPlayer.get(uuid);
-
- if (player != null) {
- player.cloak = cloakName;
- }
-
- loadCloak(uuid);
- }
-
- /**
- * Handles loading and caching of a new cloak texture, without connecting to the
- * server.
- *
- * @param cloakName Name of the cloak file to load
- */
- public static void loadCloak(UUID uuid) {
- SaturnPlayer player = SaturnPlayer.get(uuid);
-
- if (player != null && player.cloak != null) {
- if (!player.cloak.isEmpty()) {
- if (Arrays.asList(ANIMATED_CLOAKS).contains(player.cloak)) {
- loadAnimatedCloakAsync(uuid, player.cloak)
- .exceptionally(throwable -> {
- SaturnClient.LOGGER.error("Failed to load animated cloak for player: " + player.cloak,
- throwable);
- return null;
- });
-
- } else {
- SaturnClient.client.execute(() -> loadStaticCloak(player.cloak + ".png"));
- }
- }
- }
- }
-
- /**
- * Loads and processes a static cloak from a PNG file in resources.
- *
- * @param fileName Name of the PNG file to load
- */
- private static void loadStaticCloak(String fileName) {
- try {
- String resourcePath = CLOAKS_RESOURCE_PATH + fileName;
- InputStream inputStream = Cloaks.class.getClassLoader().getResourceAsStream(resourcePath);
-
- if (inputStream != null) {
- BufferedImage image = ImageIO.read(inputStream);
-
- // Add debug logging for static cloak
- SaturnClient.LOGGER.info("Static cloak dimensions: " + image.getWidth() + "x" + image.getHeight());
-
- String safeFileName = fileName.toLowerCase(Locale.ROOT)
- .replace(' ', '_')
- .replaceAll("[^a-z0-9/._-]", "");
-
- cloakCacheIdentifier = Identifier.of(SaturnClient.MOD_ID, "cloaks_" + safeFileName);
- IdentifierUtils.registerBufferedImageTexture(cloakCacheIdentifier, image);
- }
- } catch (IOException e) {
- SaturnClient.LOGGER.error("Failed to load static cloak from resources: " + fileName, e);
- }
- }
-
- public static CompletableFuture loadAnimatedCloakAsync(UUID uuid, String cloakName) {
- return CompletableFuture.runAsync(() -> {
- String fileName = cloakName + ".gif";
-
- // Check cache first
- List cached = CLOAK_CACHE.get(fileName);
- if (cached != null) {
- animatedCloaks.put(uuid, cached);
- lastFrameTime.put(uuid, System.currentTimeMillis());
- return;
- }
-
- String resourcePath = CLOAKS_RESOURCE_PATH + fileName;
-
- try (InputStream inputStream = Cloaks.class.getClassLoader().getResourceAsStream(resourcePath)) {
- if (inputStream == null) {
- SaturnClient.LOGGER.warn("Cloak resource not found: " + resourcePath);
- return;
- }
-
- // Read all bytes at once - more efficient than multiple reads
- byte[] data = inputStream.readAllBytes();
- GifDecoder.GifImage gif = GifDecoder.read(data);
-
- int frameCount = gif.getFrameCount();
- if (frameCount == 0) {
- SaturnClient.LOGGER.warn("No frames found in animated cloak: " + fileName);
- return;
- }
-
- // Pre-allocate collections with known size
- List animatedFrames = new ArrayList<>(frameCount);
- String baseFrameId = fileName.replace(".gif", "");
-
- // Process frames in batch
- for (int i = 0; i < frameCount; i++) {
- BufferedImage frame = gif.getFrame(i);
- int delay = Math.max(gif.getDelay(i) * 10, 50); // Minimum 50ms delay
-
- String frameId = baseFrameId + "_frame_" + i;
- Identifier frameIdentifier = Identifier.of(SaturnClient.MOD_ID, "cloaks_" + frameId);
-
- try {
- IdentifierUtils.registerBufferedImageTextureFast(frameIdentifier, frame);
- // Register texture on main thread if required by the graphics system
- if (SaturnClient.client.isOnThread()) {
- // IdentifierUtils.registerBufferedImageTexture(frameIdentifier, frame);
- } else {
- // Queue for main thread execution
- // SaturnClient.client.execute(
- // () -> IdentifierUtils.registerBufferedImageTexture(frameIdentifier, frame));
- }
-
- animatedFrames.add(new AnimatedCloakData(frameIdentifier, delay));
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to register frame " + i + " for cloak: " + fileName, e);
- // Continue with other frames instead of failing completely
- }
- }
-
- if (!animatedFrames.isEmpty()) {
- // Cache the result for future use
- CLOAK_CACHE.put(fileName, animatedFrames);
- animatedCloaks.put(uuid, animatedFrames);
- lastFrameTime.put(uuid, System.currentTimeMillis());
-
- SaturnClient.LOGGER.info("Loaded {} frames for animated cloak: {} (cached)",
- animatedFrames.size(), fileName);
- } else {
- SaturnClient.LOGGER.error("No valid frames could be loaded for cloak: " + fileName);
- }
-
- } catch (IOException e) {
- SaturnClient.LOGGER.error("Failed to load animated cloak from resources: " + fileName, e);
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Unexpected error loading animated cloak: " + fileName, e);
- }
- }, CLOAK_LOADER_EXECUTOR);
- }
-
- public static Identifier getCurrentCloakTexture(UUID uuid) {
- SaturnPlayer player = SaturnPlayer.get(uuid);
-
- if (player == null || player.cloak.isEmpty()) {
- return null;
- }
-
- String cloakName = player.cloak;
-
- if (Arrays.asList(ANIMATED_CLOAKS).contains(cloakName)) {
- List frames = animatedCloaks.get(uuid);
- if (frames == null || frames.isEmpty()) {
- return null;
- }
-
- long currentTime = System.currentTimeMillis();
- long lastTime = lastFrameTime.getOrDefault(uuid, currentTime);
- int currentFrame = 0;
-
- long elapsedTime = currentTime - lastTime;
- long totalTime = 0;
- for (int i = 0; i < frames.size(); i++) {
- totalTime += frames.get(i).getDelayMs();
- if (elapsedTime < totalTime) {
- currentFrame = i;
- break;
- }
- }
-
- if (elapsedTime >= totalTime) {
- lastFrameTime.put(uuid, currentTime);
- currentFrame = 0;
- }
-
- Identifier identifier = frames.get(currentFrame).getTextureId();
-
- if (identifier == null) {
- return Identifier.of(SaturnClient.MOD_ID, "textures/cloaks/" + cloakName + ".png");
- }
-
- return identifier;
- } else {
- return Identifier.of(SaturnClient.MOD_ID, "textures/cloaks/" + cloakName + ".png");
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/cosmetics/cloak/GifDecoder.java b/src/main/java/org/saturnclient/cosmetics/cloak/GifDecoder.java
deleted file mode 100644
index dcb4b2b..0000000
--- a/src/main/java/org/saturnclient/cosmetics/cloak/GifDecoder.java
+++ /dev/null
@@ -1,791 +0,0 @@
-package org.saturnclient.cosmetics.cloak;
-
-import java.awt.*;
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferInt;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-/*
- * Copyright 2014 Dhyan Blum
- *
- * Licensed 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.
- */
-
-/**
- *
- * A thread-safe decoder capable of processing a GIF data stream to render the graphics
- * contained in it. This implementation follows the official
- * GIF
- * specification .
- *
- *
- *
- * Example usage:
- *
- *
- *
- *
- *
- * final GifImage gifImage = GifDecoder.read(int[] data);
- * final int width = gifImage.getWidth();
- * final int height = gifImage.getHeight();
- * final int frameCount = gifImage.getFrameCount();
- * for (int i = 0; i < frameCount; i++) {
- * final BufferedImage image = gifImage.getFrame(i);
- * final int delay = gif.getDelay(i);
- * }
- *
- *
- *
- *
- * @author Dhyan Blum
- * @version 1.09 November 2017 (Thread-safe version)
- */
-public final class GifDecoder {
-
- // Thread-local storage for reusable objects to avoid synchronization overhead
- private static final ThreadLocal DECODING_CONTEXT =
- ThreadLocal.withInitial(DecodingContext::new);
-
- /**
- * Thread-local context containing reusable objects for decoding operations.
- * This eliminates the need for synchronization while maintaining performance benefits
- * of object reuse within each thread.
- */
- static final class DecodingContext {
- final BitReader bitReader = new BitReader();
- final CodeTable codeTable = new CodeTable();
- int[] pixelBuffer;
- int[] prevPixelBuffer;
- int[] tempBuffer;
-
- // Get or create a pixel buffer of the specified size
- int[] getPixelBuffer(int size) {
- if (pixelBuffer == null || pixelBuffer.length < size) {
- pixelBuffer = new int[Math.max(size, 1024)]; // Minimum size to reduce allocations
- }
- return pixelBuffer;
- }
-
- // Get or create a previous pixel buffer of the specified size
- int[] getPrevPixelBuffer(int size) {
- if (prevPixelBuffer == null || prevPixelBuffer.length < size) {
- prevPixelBuffer = new int[Math.max(size, 1024)];
- }
- return prevPixelBuffer;
- }
-
- // Get or create a temporary buffer of the specified size
- int[] getTempBuffer(int size) {
- if (tempBuffer == null || tempBuffer.length < size) {
- tempBuffer = new int[Math.max(size, 1024)];
- }
- return tempBuffer;
- }
- }
-
- static final class BitReader {
- private int nextBitToRead;
- private int numberOfBitsToRead;
- private int bitMask; // Used to kill unwanted higher bits
- private byte[] bytes; // Data array
-
- // To avoid costly bounds checks, 'in' needs 2 more 0-bytes at the end
- private void init(final byte[] bytes) {
- this.bytes = bytes;
- nextBitToRead = 0;
- }
-
- private int read() {
- // Byte indices: (bitPos / 8), (bitPos / 8) + 1, (bitPos / 8) + 2
- final int byteIndex = nextBitToRead >>> 3; // Byte = bit / 8
- final int bitsToShiftRight = nextBitToRead & 7; // & 7 is the same as MODULO 8
-
- // Use int operations to avoid repeated array access
- final int byte0 = bytes[byteIndex] & 0xFF;
- final int byte1 = bytes[byteIndex + 1] & 0xFF;
- final int byte2 = bytes[byteIndex + 2] & 0xFF;
-
- // Optimized bit manipulation
- final int buffer = ((byte2 << 16) | (byte1 << 8) | byte0) >>> bitsToShiftRight;
- nextBitToRead += numberOfBitsToRead;
- return buffer & bitMask; // Kill the unwanted higher bits
- }
-
- private void setNumberOfBitsToRead(final int numberOfBitsToRead) {
- this.numberOfBitsToRead = numberOfBitsToRead;
- bitMask = (1 << numberOfBitsToRead) - 1;
- }
- }
-
- static final class CodeTable {
- private final int[][] table; // Maps codes to lists of colors
- private int initTableSize; // Number of colors +2 for CLEAR + EOI
- private int initCodeSize; // Initial code size
- private int initCodeLimit; // First code limit
- private int codeSize; // Current code size, maximum is 12 bits
- private int nextCode; // Next available code for a new entry
- private int nextCodeLimit; // Increase codeSize when nextCode == limit
- private BitReader bitReader; // Notify when code sizes increases
-
- public CodeTable() {
- table = new int[4096][];
- }
-
- private int add(final int[] indices) {
- if (nextCode < 4096) {
- if (nextCode == nextCodeLimit && codeSize < 12) {
- codeSize++; // Max code size is 12
- bitReader.setNumberOfBitsToRead(codeSize);
- nextCodeLimit = (1 << codeSize) - 1; // 2^codeSize - 1
- }
- table[nextCode++] = indices;
- }
- return codeSize;
- }
-
- private int clear() {
- codeSize = initCodeSize;
- bitReader.setNumberOfBitsToRead(codeSize);
- nextCodeLimit = initCodeLimit;
- nextCode = initTableSize; // Don't recreate table, reset pointer
- return codeSize;
- }
-
- private void init(final GifFrame fr, final int[] activeColTbl, final BitReader br) {
- this.bitReader = br;
- final int numColors = activeColTbl.length;
- initCodeSize = fr.firstCodeSize;
- initCodeLimit = (1 << initCodeSize) - 1; // 2^initCodeSize - 1
- initTableSize = fr.endOfInfoCode + 1;
- nextCode = initTableSize;
-
- // Initialize single color entries
- for (int c = 0; c < numColors; c++) {
- table[c] = new int[]{activeColTbl[c]}; // Single element array
- }
-
- table[fr.clearCode] = new int[] { fr.clearCode }; // CLEAR
- table[fr.endOfInfoCode] = new int[] { fr.endOfInfoCode }; // EOI
-
- // Locate transparent color in code table and set to 0
- if (fr.transpColFlag && fr.transpColIndex < numColors) {
- table[fr.transpColIndex] = new int[]{0};
- }
- }
- }
-
- final class GifFrame {
- // Graphic control extension (optional)
- // Disposal: 0=NO_ACTION, 1=NO_DISPOSAL, 2=RESTORE_BG, 3=RESTORE_PREV
- private volatile int disposalMethod; // 0-3 as above, 4-7 undefined
- private volatile boolean transpColFlag; // 1 Bit
- private volatile int delay; // Unsigned, LSByte first, n * 1/100 * s
- private volatile int transpColIndex; // 1 Byte
- // Image descriptor
- private volatile int x; // Position on the canvas from the left
- private volatile int y; // Position on the canvas from the top
- private volatile int w; // May be smaller than the base image
- private volatile int h; // May be smaller than the base image
- private volatile int wh; // width * height
- private volatile boolean hasLocColTbl; // Has local color table? 1 Bit
- private volatile boolean interlaceFlag; // Is an interlace image? 1 Bit
- @SuppressWarnings("unused")
- private volatile boolean sortFlag; // True if local colors are sorted, 1 Bit
- private volatile int sizeOfLocColTbl; // Size of the local color table, 3 Bits
- private volatile int[] localColTbl; // Local color table (optional)
- // Image data
- private volatile int firstCodeSize; // LZW minimum code size + 1 for CLEAR & EOI
- private volatile int clearCode;
- private volatile int endOfInfoCode;
- private volatile byte[] data; // Holds LZW encoded data
- private volatile BufferedImage img; // Full drawn image, not just the frame area
-
- // Synchronization for frame image creation
- private final Object imageLock = new Object();
- }
-
- public final class GifImage {
- public volatile String header; // Bytes 0-5, GIF87a or GIF89a
- private volatile int w; // Unsigned 16 Bit, the least significant byte first
- private volatile int h; // Unsigned 16 Bit, the least significant byte first
- private volatile int wh; // Image width * image height
- public volatile boolean hasGlobColTbl; // 1 Bit
- public volatile int colorResolution; // 3 Bits
- public volatile boolean sortFlag; // True if global colors are sorted, 1 Bit
- public volatile int sizeOfGlobColTbl; // 2^(val(3 Bits) + 1), see spec
- public volatile int bgColIndex; // Background color index, 1 Byte
- public volatile int pxAspectRatio; // Pixel aspect ratio, 1 Byte
- public volatile int[] globalColTbl; // Global color table
- private final List frames = new ArrayList<>(64);
- public volatile String appId = ""; // 8 Bytes at in[i+3], usually "NETSCAPE"
- public volatile String appAuthCode = ""; // 3 Bytes at in[i+11], usually "2.0"
- public volatile int repetitions = 0; // 0: infinite loop, N: number of loops
-
- // Thread-safe frame rendering state
- private volatile BufferedImage img = null; // Currently, drawn frame
- private volatile Graphics2D g;
- private final ReadWriteLock renderLock = new ReentrantReadWriteLock();
-
- // Synchronization objects
- private final Object initLock = new Object();
-
- private int[] decode(final GifFrame fr, final int[] activeColTbl) {
- final DecodingContext ctx = DECODING_CONTEXT.get();
- ctx.codeTable.init(fr, activeColTbl, ctx.bitReader);
- ctx.bitReader.init(fr.data); // Incoming codes
- final int clearCode = fr.clearCode, endCode = fr.endOfInfoCode;
-
- // Use thread-local pixel buffer
- final int[] out = ctx.getPixelBuffer(wh);
-
- final int[][] tbl = ctx.codeTable.table; // Code table
- int outPos = 0; // Next pixel position in the output image array
- ctx.codeTable.clear(); // Init code table
- ctx.bitReader.read(); // Skip leading clear code
- int code = ctx.bitReader.read(); // Read first code
- int[] pixels = tbl[code]; // Output pixel for first code
-
- // Use System.arraycopy for better performance
- System.arraycopy(pixels, 0, out, outPos, pixels.length);
- outPos += pixels.length;
-
- try {
- while (true) {
- final int prevCode = code;
- code = ctx.bitReader.read(); // Get next code in stream
- if (code == clearCode) { // After a CLEAR table, there is
- ctx.codeTable.clear(); // no previous code, we need to read
- code = ctx.bitReader.read(); // a new one
- pixels = tbl[code]; // Output pixels
- System.arraycopy(pixels, 0, out, outPos, pixels.length);
- outPos += pixels.length;
- continue; // Back to the loop with a valid previous code
- } else if (code == endCode) {
- break;
- }
- final int[] prevVals = tbl[prevCode];
- final int[] prevValsAndK = new int[prevVals.length + 1];
- System.arraycopy(prevVals, 0, prevValsAndK, 0, prevVals.length);
- if (code < ctx.codeTable.nextCode) { // Code table contains code
- pixels = tbl[code]; // Output pixels
- System.arraycopy(pixels, 0, out, outPos, pixels.length);
- outPos += pixels.length;
- prevValsAndK[prevVals.length] = tbl[code][0]; // K
- } else {
- prevValsAndK[prevVals.length] = prevVals[0]; // K
- System.arraycopy(prevValsAndK, 0, out, outPos, prevValsAndK.length);
- outPos += prevValsAndK.length;
- }
- ctx.codeTable.add(prevValsAndK); // Previous indices + K
- }
- } catch (final ArrayIndexOutOfBoundsException ignored) {
- }
-
- // Return a properly sized array
- return Arrays.copyOf(out, outPos);
- }
-
- private int[] deinterlace(final int[] src, final GifFrame fr) {
- final int w = fr.w, h = fr.h, wh = fr.wh;
- final DecodingContext ctx = DECODING_CONTEXT.get();
- final int[] dest = ctx.getTempBuffer(src.length);
-
- // Interlaced images are organized in 4 sets of pixel lines
- final int set2Y = (h + 7) >>> 3; // Line no. = ceil(h/8.0)
- final int set3Y = set2Y + ((h + 3) >>> 3); // ceil(h-4/8.0)
- final int set4Y = set3Y + ((h + 1) >>> 2); // ceil(h-2/4.0)
-
- // Sets' start indices in source array
- final int set2 = w * set2Y, set3 = w * set3Y, set4 = w * set4Y;
-
- // Line skips in destination array - use bit shifts for multiplication
- final int w2 = w << 1, w4 = w2 << 1, w8 = w4 << 1;
-
- // Group 1 contains every 8th line starting from 0
- int from = 0, to = 0;
- for (; from < set2; from += w, to += w8) {
- System.arraycopy(src, from, dest, to, w);
- }
- // Group 2 contains every 8th line starting from 4
- for (to = w4; from < set3; from += w, to += w8) {
- System.arraycopy(src, from, dest, to, w);
- }
- // Group 3 contains every 4th line starting from 2
- for (to = w2; from < set4; from += w, to += w4) {
- System.arraycopy(src, from, dest, to, w);
- }
- // Group 4 contains every 2nd line starting from 1 (biggest group)
- for (to = w; from < wh; from += w, to += w2) {
- System.arraycopy(src, from, dest, to, w);
- }
- return Arrays.copyOf(dest, src.length); // Return a copy, not the shared buffer
- }
-
- private void drawFrame(final GifFrame fr) {
- renderLock.writeLock().lock();
- try {
- // Determine the color table that will be active for this frame
- final int[] activeColTbl = fr.hasLocColTbl ? fr.localColTbl : globalColTbl;
-
- // Get pixels from data stream
- int[] pixels = decode(fr, activeColTbl);
- if (fr.interlaceFlag) {
- pixels = deinterlace(pixels, fr); // Rearrange pixel lines
- }
-
- // Create image of type TYPE_INT_ARGB for frame area
- final BufferedImage frame = new BufferedImage(fr.w, fr.h, BufferedImage.TYPE_INT_ARGB);
- final int[] frameData = ((DataBufferInt) frame.getRaster().getDataBuffer()).getData();
- System.arraycopy(pixels, 0, frameData, 0, Math.min(pixels.length, fr.wh));
-
- // Draw frame area on top of working image
- g.drawImage(frame, fr.x, fr.y, null);
-
- // Keep a copy of the previous frame's pixels
- final DecodingContext ctx = DECODING_CONTEXT.get();
- final int[] prevPixelBuffer = ctx.getPrevPixelBuffer(wh);
- final int[] imgData = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
- System.arraycopy(imgData, 0, prevPixelBuffer, 0, wh);
-
- // Create another copy for the end user to not expose internal state
- synchronized (fr.imageLock) {
- if (fr.img == null) { // Double-checked locking
- fr.img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
- final int[] frameImgData = ((DataBufferInt) fr.img.getRaster().getDataBuffer()).getData();
- System.arraycopy(prevPixelBuffer, 0, frameImgData, 0, wh);
- }
- }
-
- // Handle disposal of current frame
- if (fr.disposalMethod == 2) {
- // Restore to background color (clear frame area only)
- g.clearRect(fr.x, fr.y, fr.w, fr.h);
- } else if (fr.disposalMethod == 3) {
- // Restore previous frame
- System.arraycopy(prevPixelBuffer, 0, imgData, 0, wh);
- }
- } finally {
- renderLock.writeLock().unlock();
- }
- }
-
- /**
- * Returns the background color of the first frame in this GIF image. If
- * the frame has a local color table, the returned color will be from
- * that table. If not, the color will be from the global color table.
- * Returns 0 if there is neither a local nor a global color table.
- *
- * @return 32 bit ARGB color in the form 0xAARRGGBB
- */
- public final int getBackgroundColor() {
- renderLock.readLock().lock();
- try {
- final GifFrame frame = frames.get(0);
- if (frame.hasLocColTbl) {
- return frame.localColTbl[bgColIndex];
- } else if (hasGlobColTbl) {
- return globalColTbl[bgColIndex];
- }
- return 0;
- } finally {
- renderLock.readLock().unlock();
- }
- }
-
- /**
- * If not 0, the delay specifies how many hundredths (1/100) of a second
- * to wait before displaying the frame after the current frame.
- *
- * @param index Index of the current frame, 0 to N-1
- * @return Delay as number of hundredths (1/100) of a second
- */
- public final int getDelay(final int index) {
- renderLock.readLock().lock();
- try {
- return frames.get(index).delay;
- } finally {
- renderLock.readLock().unlock();
- }
- }
-
- /**
- * @param index Index of the frame to return as image, starting from 0.
- * For incremental calls such as [0, 1, 2, ...] the method's
- * run time is O(1) as only one frame is drawn per call. For
- * random access calls such as [7, 12, ...] the run time is
- * O(N+1) with N being the number of previous frames that
- * need to be drawn before N+1 can be drawn on top. Once a
- * frame has been drawn it is being cached and the run time
- * is more or less O(0) to retrieve it from the list.
- * @return A BufferedImage for the specified frame.
- */
- public BufferedImage getFrame(final int index) {
- // Initialize rendering context if needed
- if (img == null) {
- synchronized (initLock) {
- if (img == null) { // Double-checked locking
- img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
- g = img.createGraphics();
- g.setBackground(new Color(0, true)); // Transparent color
- // Set rendering hints for better performance
- g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
- g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
- }
- }
- }
-
- GifFrame fr = frames.get(index);
-
- // Check if frame is already rendered using double-checked locking
- if (fr.img == null) {
- synchronized (fr.imageLock) {
- if (fr.img == null) {
- // Draw all frames until and including the requested frame
- for (int i = 0; i <= index; i++) {
- fr = frames.get(i);
- if (fr.img == null) {
- drawFrame(fr);
- }
- }
- }
- }
- }
-
- return fr.img;
- }
-
- /**
- * @return The number of frames contained in this GIF image
- */
- public final int getFrameCount() {
- return frames.size();
- }
-
- /**
- * @return The height of the GIF image
- */
- public final int getHeight() {
- return h;
- }
-
- /**
- * @return The width of the GIF image
- */
- public final int getWidth() {
- return w;
- }
- }
-
- static final boolean DEBUG_MODE = false;
-
- /**
- * @param in Raw image data as a byte[] array
- * @return A GifImage object exposing the properties of the GIF image.
- * @throws IOException If the image violates the GIF specification or is
- * truncated.
- */
- public static GifImage read(final byte[] in) throws IOException {
- final GifDecoder decoder = new GifDecoder();
- final GifImage img = decoder.new GifImage();
- GifFrame frame = null; // Currently open frame
- int pos = readHeader(in, img); // Read header, get next byte position
- pos = readLogicalScreenDescriptor(img, in, pos);
- if (img.hasGlobColTbl) {
- img.globalColTbl = new int[img.sizeOfGlobColTbl];
- pos = readColTbl(in, img.globalColTbl, pos);
- }
-
- // Main parsing loop with bounds checking optimization
- while (pos < in.length) {
- final int block = in[pos] & 0xFF;
- switch (block) {
- case 0x21: // Extension introducer
- if (pos + 1 >= in.length) {
- throw new IOException("Unexpected end of file.");
- }
- switch (in[pos + 1] & 0xFF) {
- case 0xFE: // Comment extension
- pos = readTextExtension(in, pos);
- break;
- case 0xFF: // Application extension
- pos = readAppExt(img, in, pos);
- break;
- case 0x01: // Plain text extension
- frame = null; // End of current frame
- pos = readTextExtension(in, pos);
- break;
- case 0xF9: // Graphic control extension
- if (frame == null) {
- frame = decoder.new GifFrame();
- img.frames.add(frame);
- }
- pos = readGraphicControlExt(frame, in, pos);
- break;
- default:
- throw new IOException("Unknown extension at " + pos);
- }
- break;
- case 0x2C: // Image descriptor
- if (frame == null) {
- frame = decoder.new GifFrame();
- img.frames.add(frame);
- }
- pos = readImgDescr(frame, in, pos);
- if (frame.hasLocColTbl) {
- frame.localColTbl = new int[frame.sizeOfLocColTbl];
- pos = readColTbl(in, frame.localColTbl, pos);
- }
- pos = readImgData(frame, in, pos);
- frame = null; // End of current frame
- break;
- case 0x3B: // GIF Trailer
- return img; // Found trailer, finished reading.
- default:
- // Unknown block. The image is corrupted. Strategies: a) Skip
- // and wait for a valid block. Experience: It'll get worse. b)
- // Throw exception. c) Return gracefully if we are almost done
- // processing. The frames we have so far should be error-free.
- final double progress = (double) pos / in.length;
- if (progress < 0.9) {
- throw new IOException("Unknown block at: " + pos);
- }
- pos = in.length; // Exit loop
- }
- }
- return img;
- }
-
- /**
- * @param is Image data as input stream. This method will read from the
- * input stream's current position. It will not reset the
- * position before reading and won't reset or close the stream
- * afterwards. Call these methods before and after calling this
- * method as needed.
- * @return A GifImage object exposing the properties of the GIF image.
- * @throws IOException If an I/O error occurs, the image violates the GIF
- * specification or the GIF is truncated.
- */
- public static GifImage read(final InputStream is) throws IOException {
- final byte[] data = new byte[is.available()];
- is.read(data, 0, data.length);
- return read(data);
- }
-
- /**
- * @param img GIF image
- * @param in Raw data
- * @param i Index of the first byte of the application extension
- * @return Index of the first byte after this extension
- */
- static int readAppExt(final GifImage img, final byte[] in, int i) {
- // Use StandardCharsets for better performance if available, otherwise fallback
- img.appId = new String(in, i + 3, 8); // should be "NETSCAPE"
- img.appAuthCode = new String(in, i + 11, 3); // should be "2.0"
- i += 14; // Go to sub-block size, it's value should be 3
- final int subBlockSize = in[i] & 0xFF;
- // The only app extension widely used is NETSCAPE, it's got 3 data bytes
- if (subBlockSize == 3) {
- // in[i+1] should have value 01, in[i+5] should be block terminator
- img.repetitions = (in[i + 2] & 0xFF) | ((in[i + 3] & 0xFF) << 8); // Short
- return i + 5;
- } // Skip unknown application extensions
- while ((in[i] & 0xFF) != 0) { // While sub-block size != 0
- i += (in[i] & 0xFF) + 1; // Skip to next sub-block
- }
- return i + 1;
- }
-
- /**
- * @param in Raw data
- * @param colors Pre-initialized target array to store ARGB colors
- * @param i Index of the color table's first byte
- * @return Index of the first byte after the color table
- */
- static int readColTbl(final byte[] in, final int[] colors, int i) {
- final int numColors = colors.length;
- for (int c = 0; c < numColors; c++) {
- final int r = in[i++] & 0xFF; // 1st byte is red
- final int g = in[i++] & 0xFF; // 2nd byte is green
- final int b = in[i++] & 0xFF; // 3rd byte is blue
- // Optimized color packing - alpha is always 0xFF for opaque
- colors[c] = 0xFF000000 | (r << 16) | (g << 8) | b;
- }
- return i;
- }
-
- /**
- * @param fr GIF frame
- * @param in Raw data
- * @param i Index of the extension introducer
- * @return Index of the first byte after this block
- */
- static int readGraphicControlExt(final GifFrame fr, final byte[] in, final int i) {
- final int packed = in[i + 3] & 0xFF;
- fr.disposalMethod = (packed & 0b00011100) >>> 2; // Bits 4-2
- fr.transpColFlag = (packed & 1) == 1; // Bit 0
- fr.delay = (in[i + 4] & 0xFF) | ((in[i + 5] & 0xFF) << 8); // 16 bit LSB
- fr.transpColIndex = in[i + 6] & 0xFF; // Byte 6
- return i + 8; // Skipped byte 7 (blockTerminator), as it's always 0x00
- }
-
- /**
- * @param in Raw data
- * @param img The GifImage object that is currently read
- * @return Index of the first byte after this block
- * @throws IOException If the GIF header/trailer is missing, incomplete or
- * unknown
- */
- static int readHeader(final byte[] in, final GifImage img) throws IOException {
- if (in.length < 6) { // Check first 6 bytes
- throw new IOException("Image is truncated.");
- }
- // Use ASCII encoding for header - faster than default charset
- img.header = new String(in, 0, 6);
- if (!img.header.equals("GIF87a") && !img.header.equals("GIF89a")) {
- throw new IOException("Invalid GIF header.");
- }
- return 6;
- }
-
- /**
- * @param fr The GIF frame to whom this image descriptor belongs
- * @param in Raw data
- * @param i Index of the first byte of this block, i.e. the minCodeSize
- * @return Byte index
- */
- static int readImgData(final GifFrame fr, final byte[] in, int i) {
- final int fileSize = in.length;
- final int minCodeSize = in[i++] & 0xFF; // Read code size, go to block
- final int clearCode = 1 << minCodeSize; // CLEAR = 2^minCodeSize
- fr.firstCodeSize = minCodeSize + 1; // Add 1 bit for CLEAR and EOI
- fr.clearCode = clearCode;
- fr.endOfInfoCode = clearCode + 1;
-
- // Pre-calculate image data size for better memory allocation
- final int imgDataSize = readImgDataSize(in, i);
- final byte[] imgData = new byte[imgDataSize + 2];
- int imgDataPos = 0;
- int subBlockSize = in[i] & 0xFF;
-
- while (subBlockSize > 0) { // While block has data
- try { // Next line may throw exception if sub-block size is fake
- final int nextSubBlockSizePos = i + subBlockSize + 1;
- final int nextSubBlockSize = in[nextSubBlockSizePos] & 0xFF;
- System.arraycopy(in, i + 1, imgData, imgDataPos, subBlockSize);
- imgDataPos += subBlockSize; // Move output data position
- i = nextSubBlockSizePos; // Move to next sub-block size
- subBlockSize = nextSubBlockSize;
- } catch (final Exception e) {
- // Sub-block exceeds file end, only use remaining bytes
- subBlockSize = fileSize - i - 1; // Remaining bytes
- if (subBlockSize > 0) {
- System.arraycopy(in, i + 1, imgData, imgDataPos, subBlockSize);
- imgDataPos += subBlockSize; // Move output data position
- }
- i += subBlockSize + 1; // Move to next sub-block size
- break;
- }
- }
- fr.data = imgData; // Holds LZW encoded data
- i++; // Skip last sub-block size, should be 0
- return i;
- }
-
- static int readImgDataSize(final byte[] in, int i) {
- final int fileSize = in.length;
- int imgDataPos = 0;
- int subBlockSize = in[i] & 0xFF;
- while (subBlockSize > 0) { // While block has data
- try { // Next line may throw exception if sub-block size is fake
- final int nextSubBlockSizePos = i + subBlockSize + 1;
- final int nextSubBlockSize = in[nextSubBlockSizePos] & 0xFF;
- imgDataPos += subBlockSize; // Move output data position
- i = nextSubBlockSizePos; // Move to next sub-block size
- subBlockSize = nextSubBlockSize;
- } catch (final Exception e) {
- // Sub-block exceeds file end, only use remaining bytes
- subBlockSize = fileSize - i - 1; // Remaining bytes
- if (subBlockSize > 0) {
- imgDataPos += subBlockSize; // Move output data position
- }
- break;
- }
- }
- return imgDataPos;
- }
-
- /**
- * @param fr The GIF frame to whom this image descriptor belongs
- * @param in Raw data
- * @param i Index of the image separator, i.e. the first block byte
- * @return Index of the first byte after this block
- */
- static int readImgDescr(final GifFrame fr, final byte[] in, int i) {
- fr.x = (in[++i] & 0xFF) | ((in[++i] & 0xFF) << 8); // Byte 1-2: left
- fr.y = (in[++i] & 0xFF) | ((in[++i] & 0xFF) << 8); // Byte 3-4: top
- fr.w = (in[++i] & 0xFF) | ((in[++i] & 0xFF) << 8); // Byte 5-6: width
- fr.h = (in[++i] & 0xFF) | ((in[++i] & 0xFF) << 8); // Byte 7-8: height
- fr.wh = fr.w * fr.h;
- final int packed = in[++i] & 0xFF; // Byte 9 is a packed byte
- fr.hasLocColTbl = (packed & 0b10000000) != 0; // Bit 7
- fr.interlaceFlag = (packed & 0b01000000) != 0; // Bit 6
- fr.sortFlag = (packed & 0b00100000) != 0; // Bit 5
- final int colTblSizePower = (packed & 7) + 1; // Bits 2-0
- fr.sizeOfLocColTbl = 1 << colTblSizePower; // 2^(N+1), As per the spec
- return ++i;
- }
-
- /**
- * @param img GIF image
- * @param i Start index of this block.
- * @return Index of the first byte after this block.
- */
- static int readLogicalScreenDescriptor(final GifImage img, final byte[] in, final int i) {
- img.w = (in[i] & 0xFF) | ((in[i + 1] & 0xFF) << 8); // 16 bit, LSB 1st
- img.h = (in[i + 2] & 0xFF) | ((in[i + 3] & 0xFF) << 8); // 16 bit
- img.wh = img.w * img.h;
- final int packed = in[i + 4] & 0xFF; // Byte 4 is a packed byte
- img.hasGlobColTbl = (packed & 0b10000000) != 0; // Bit 7
- final int colResPower = ((packed & 0b01110000) >>> 4) + 1; // Bits 6-4
- img.colorResolution = 1 << colResPower; // 2^(N+1), As per the spec
- img.sortFlag = (packed & 0b00001000) != 0; // Bit 3
- final int globColTblSizePower = (packed & 7) + 1; // Bits 0-2
- img.sizeOfGlobColTbl = 1 << globColTblSizePower; // 2^(N+1), see spec
- img.bgColIndex = in[i + 5] & 0xFF; // 1 Byte
- img.pxAspectRatio = in[i + 6] & 0xFF; // 1 Byte
- return i + 7;
- }
-
- /**
- * @param in Raw data
- * @param pos Index of the extension introducer
- * @return Index of the first byte after this block
- */
- static int readTextExtension(final byte[] in, final int pos) {
- int i = pos + 2; // Skip extension introducer and label
- int subBlockSize = in[i++] & 0xFF;
- while (subBlockSize != 0 && i < in.length) {
- i += subBlockSize;
- if (i >= in.length) break; // Safety check
- subBlockSize = in[i++] & 0xFF;
- }
- return i;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/cosmetics/cloak/utils/AnimatedCloakData.java b/src/main/java/org/saturnclient/cosmetics/cloak/utils/AnimatedCloakData.java
deleted file mode 100644
index ca92aa0..0000000
--- a/src/main/java/org/saturnclient/cosmetics/cloak/utils/AnimatedCloakData.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.saturnclient.cosmetics.cloak.utils;
-
-import net.minecraft.util.Identifier;
-
-/**
- * Represents a single frame of an animated cloak.
- */
-public class AnimatedCloakData {
- private final Identifier textureId;
- private final int delayMs;
-
- /**
- * Creates a new animated cloak frame.
- *
- * @param textureId The texture identifier for this frame
- * @param delayMs The delay in milliseconds before the next frame
- */
- public AnimatedCloakData(Identifier textureId, int delayMs) {
- this.textureId = textureId;
- this.delayMs = delayMs;
- }
-
- /**
- * @return The texture identifier for this frame
- */
- public Identifier getTextureId() {
- return textureId;
- }
-
- /**
- * @return The delay in milliseconds before the next frame
- */
- public int getDelayMs() {
- return delayMs;
- }
-}
diff --git a/src/main/java/org/saturnclient/cosmetics/cloak/utils/IdentifierUtils.java b/src/main/java/org/saturnclient/cosmetics/cloak/utils/IdentifierUtils.java
deleted file mode 100644
index 93fb940..0000000
--- a/src/main/java/org/saturnclient/cosmetics/cloak/utils/IdentifierUtils.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.saturnclient.cosmetics.cloak.utils;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import net.minecraft.client.texture.NativeImage;
-import net.minecraft.client.texture.NativeImageBackedTexture;
-import net.minecraft.util.Identifier;
-
-import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferInt;
-
-public class IdentifierUtils {
-
- /**
- * ORIGINAL METHOD - EXTREMELY SLOW - causes 10-20 second freezes
- * This converts BufferedImage -> PNG bytes -> ByteBuffer -> NativeImage ->
- * Texture
- * This is completely unnecessary and wastes massive amounts of CPU time!
- */
- public static void registerBufferedImageTexture(Identifier i, BufferedImage bi) {
- try {
- // This is the performance killer:
- // 1. Converts BufferedImage to PNG (expensive compression)
- // 2. Creates ByteBuffer copy (memory allocation)
- // 3. NativeImage.read() parses PNG back to raw pixels (expensive decompression)
- // This is doing compression -> decompression for no reason!
-
- java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
- javax.imageio.ImageIO.write(bi, "png", baos);
- byte[] bytes = baos.toByteArray();
- java.nio.ByteBuffer bb = org.lwjgl.BufferUtils.createByteBuffer(bytes.length).put(bytes);
- bb.flip();
- NativeImageBackedTexture nibt = new NativeImageBackedTexture(NativeImage.read(bb));
- SaturnClient.client.getTextureManager().registerTexture(i, nibt);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * OPTIMIZED METHOD - Direct pixel conversion without unnecessary PNG
- * encoding/decoding
- * This should reduce loading time from 10-20 seconds to under 1 second
- */
- public static void registerBufferedImageTextureFast(Identifier identifier, BufferedImage bufferedImage) {
- try {
- int width = bufferedImage.getWidth();
- int height = bufferedImage.getHeight();
-
- // Create NativeImage directly with the correct format
- NativeImage nativeImage = new NativeImage(NativeImage.Format.RGBA, width, height, false);
-
- // Direct pixel copy - much faster than PNG conversion
- if (bufferedImage.getType() == BufferedImage.TYPE_INT_ARGB) {
- // Fast path for ARGB images - direct memory access
- int[] pixels = ((DataBufferInt) bufferedImage.getRaster().getDataBuffer()).getData();
- for (int y = 0; y < height; y++) {
- for (int x = 0; x < width; x++) {
- int pixel = pixels[y * width + x];
- nativeImage.setColorArgb(x, y, pixel);
- }
- }
- } else {
- // Fallback for other image types - still faster than PNG conversion
- for (int y = 0; y < height; y++) {
- for (int x = 0; x < width; x++) {
- int rgb = bufferedImage.getRGB(x, y);
- nativeImage.setColorArgb(x, y, rgb);
- }
- }
- }
-
- // Register the texture
- NativeImageBackedTexture texture = new NativeImageBackedTexture(nativeImage);
- SaturnClient.client.execute(
- () -> SaturnClient.client.getTextureManager().registerTexture(identifier, texture));
-
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to register texture: " + identifier, e);
- // Fallback to slow method if fast method fails
- registerBufferedImageTexture(identifier, bufferedImage);
- }
- }
-
- /**
- * EVEN FASTER VERSION - Bulk texture registration
- * Use this when registering many textures at once (like animated cloak frames)
- */
- public static void registerBufferedImageTexturesBulk(java.util.Map textures) {
- long startTime = System.currentTimeMillis();
-
- for (java.util.Map.Entry entry : textures.entrySet()) {
- registerBufferedImageTextureFast(entry.getKey(), entry.getValue());
- }
-
- long endTime = System.currentTimeMillis();
- SaturnClient.LOGGER.info("Registered {} textures in {}ms", textures.size(), (endTime - startTime));
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/cosmetics/cloak/utils/RandomUtils.java b/src/main/java/org/saturnclient/cosmetics/cloak/utils/RandomUtils.java
deleted file mode 100644
index b555d83..0000000
--- a/src/main/java/org/saturnclient/cosmetics/cloak/utils/RandomUtils.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.saturnclient.cosmetics.cloak.utils;
-
-import java.util.Random;
-
-/**
- * Utility class for generating random strings and numbers.
- */
-public final class RandomUtils {
- private static final String ALPHANUMERIC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
- private static final String ALPHANUMERIC_LOWERCASE = "0123456789abcdefghijklmnopqrstuvwxyz";
- private static final Random RANDOM = new Random();
-
- private RandomUtils() {
- // Prevent instantiation
- }
-
- /**
- * Generates a random string of specified length using given characters.
- */
- private static String random(final int length, final char[] chars) {
- StringBuilder sb = new StringBuilder(length);
- for (int i = 0; i < length; i++) {
- sb.append(chars[RANDOM.nextInt(chars.length)]);
- }
- return sb.toString();
- }
-
- /**
- * Generates a random string of specified length using alphanumeric characters.
- */
- public static String randomString(final int length) {
- return random(length, ALPHANUMERIC.toCharArray());
- }
-
- /**
- * Generates a random lowercase string of specified length.
- */
- public static String randomStringLowercase(final int length) {
- return random(length, ALPHANUMERIC_LOWERCASE.toCharArray());
- }
-
- /**
- * Generates a random integer between min and max (inclusive).
- */
- public static int randBetween(int min, int max) {
- return RANDOM.nextInt(max - min + 1) + min;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/cosmetics/hat/HatFeatureRenderer.java b/src/main/java/org/saturnclient/cosmetics/hat/HatFeatureRenderer.java
deleted file mode 100644
index 98b536e..0000000
--- a/src/main/java/org/saturnclient/cosmetics/hat/HatFeatureRenderer.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.saturnclient.cosmetics.hat;
-
-import org.saturnclient.cosmetics.obj.MtlLoader;
-import org.saturnclient.cosmetics.obj.ObjModel;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-
-import net.minecraft.client.render.OverlayTexture;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.entity.feature.FeatureRenderer;
-import net.minecraft.client.render.entity.feature.FeatureRendererContext;
-import net.minecraft.client.render.entity.model.PlayerEntityModel;
-import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
-import net.minecraft.client.util.math.MatrixStack;
-
-public class HatFeatureRenderer extends FeatureRenderer {
- public HatFeatureRenderer(FeatureRendererContext context) {
- super(context);
- }
-
- @Override
- public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light,
- PlayerEntityRenderState state, float limbAngle, float limbDistance) {
- SaturnPlayer player = SaturnPlayer.get(state.name);
-
- if (state.invisible || player == null || player.hat.isEmpty()) {
- return;
- }
-
- matrices.push();
-
- this.getContextModel().head.rotate(matrices);
-
- ObjModel.cosmetic("hat", player.hat).render(MtlLoader.cosmetic(player.hat),
- matrices, vertexConsumers, light,
- OverlayTexture.DEFAULT_UV);
-
- matrices.pop();
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/cosmetics/hat/Hats.java b/src/main/java/org/saturnclient/cosmetics/hat/Hats.java
deleted file mode 100644
index 6aee225..0000000
--- a/src/main/java/org/saturnclient/cosmetics/hat/Hats.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.saturnclient.cosmetics.hat;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
-import org.saturnclient.saturnclient.client.ServiceClient;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-
-public class Hats {
- public static final String[] ALL_HATS = { "horns_black", "horns_white", "halo", "halo_black" };
- public static List availableHats = new ArrayList<>();
-
- public static void initialize() {
- availableHats.add(0, "");
- }
-
- public static void setHat(String hatName) {
- if (availableHats.contains(hatName)) {
- setHat(ServiceClient.uuid, hatName);
- ServiceClient.setHat(hatName);
- }
- }
-
- public static void setHat(UUID uuid, String hatName) {
- SaturnPlayer player = SaturnPlayer.get(uuid);
- if (player != null) {
- player.hat = hatName;
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/cosmetics/obj/MtlLoader.java b/src/main/java/org/saturnclient/cosmetics/obj/MtlLoader.java
deleted file mode 100644
index 22ce3b9..0000000
--- a/src/main/java/org/saturnclient/cosmetics/obj/MtlLoader.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.saturnclient.cosmetics.obj;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import de.javagl.obj.*;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.util.Identifier;
-
-public class MtlLoader {
- static Map> loadedMtls = new HashMap<>();
-
- static Map loadMtl(Identifier mtlId) throws IOException {
- try (InputStream is = MinecraftClient.getInstance().getResourceManager()
- .getResource(mtlId).get().getInputStream()) {
- List mtlList = MtlReader.read(is);
- Map mtlMap = new java.util.LinkedHashMap<>();
- for (Mtl mtl : mtlList) {
- mtlMap.put(mtl.getName(), mtl);
- }
- return mtlMap;
- }
- }
-
- public static Map of(Identifier mtlId) {
- System.out.println(mtlId);
- if (loadedMtls.containsKey(mtlId))
- return loadedMtls.get(mtlId);
-
- try {
- Map mtl = loadMtl(mtlId);
- loadedMtls.put(mtlId, mtl);
-
- return mtl;
- } catch (IOException e) {
- e.printStackTrace();
-
- return null;
- }
-
- }
-
- public static Map cosmetic(String cosmeticId) {
- int index = cosmeticId.indexOf('_');
-
- String mtlId = (index == -1) ? "" : cosmeticId.substring(index + 1);
-
- if (mtlId.isEmpty())
- mtlId = "white";
-
- return of(Identifier.of("saturnclient", "models/cosmetic/materials/" + mtlId + ".mtl"));
- }
-}
diff --git a/src/main/java/org/saturnclient/cosmetics/obj/ObjModel.java b/src/main/java/org/saturnclient/cosmetics/obj/ObjModel.java
deleted file mode 100644
index bfe2ac1..0000000
--- a/src/main/java/org/saturnclient/cosmetics/obj/ObjModel.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.saturnclient.cosmetics.obj;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import de.javagl.obj.Mtl;
-import de.javagl.obj.Obj;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.resource.Resource;
-import net.minecraft.resource.ResourceManager;
-import net.minecraft.util.Identifier;
-
-public class ObjModel {
- private static final ObjectMapper MAPPER = new ObjectMapper();
- public static final Map loadedObjModels = new HashMap<>();
-
- public record Config(
- @JsonProperty("translate") Vec3d transform,
- @JsonProperty("scale") Vec3d scale,
- @JsonProperty("rotation") Vec3d rotation) {
-
- public Config {
- transform = transform == null ? new Vec3d(0, 0, 0) : transform;
- scale = scale == null ? new Vec3d(1, 1, 1) : scale;
- rotation = rotation == null ? new Vec3d(0, 0, 0) : rotation;
- }
-
- @JsonFormat(shape = JsonFormat.Shape.ARRAY)
- public record Vec3d(float x, float y, float z) {
- }
- }
-
- Obj obj;
- Config config;
-
- public static ObjModel cosmetic(String cosmeticKind, String id) {
- return of(Identifier.of("saturnclient", "models/cosmetic/" + cosmeticKind + "/" + id.split("_")[0] + "/model"));
- }
-
- public static ObjModel of(Identifier obj) {
- if (loadedObjModels.containsKey(obj))
- return loadedObjModels.get(obj);
-
- ObjModel o = new ObjModel(obj);
- loadedObjModels.put(obj, o);
- return o;
- }
-
- ObjModel(Identifier identifier) {
- Identifier objId = Identifier.of(identifier.getNamespace(), identifier.getPath() + ".obj");
- Identifier jsonId = Identifier.of(identifier.getNamespace(), identifier.getPath() + ".json");
-
- try {
- this.obj = ObjRenderer.loadObj(objId);
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- // Try loading JSON config if it exists
- ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager();
- Optional resource = resourceManager.getResource(jsonId);
-
- if (resource.isPresent()) {
- try (InputStream stream = resource.get().getInputStream()) {
- this.config = MAPPER.readValue(stream, Config.class);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- public void render(Map mtlMap, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light,
- int overlay) {
- matrices.push();
-
- matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(180.0f));
- matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(180.0f));
-
- if (this.config != null) {
- matrices.translate(config.transform.x, config.transform.y, config.transform.z);
-
- matrices.scale(config.scale.x, config.scale.y, config.scale.z);
-
- matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(config.rotation.x));
- matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(config.rotation.y));
- matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Z.rotationDegrees(config.rotation.z));
- }
-
- ObjRenderer.renderObj(this.obj, mtlMap, matrices, vertexConsumers, light, overlay);
-
- matrices.pop();
- }
-}
diff --git a/src/main/java/org/saturnclient/cosmetics/obj/ObjRenderer.java b/src/main/java/org/saturnclient/cosmetics/obj/ObjRenderer.java
deleted file mode 100644
index 498e4f0..0000000
--- a/src/main/java/org/saturnclient/cosmetics/obj/ObjRenderer.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package org.saturnclient.cosmetics.obj;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-import de.javagl.obj.*;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.client.render.VertexConsumer;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.util.Identifier;
-
-public class ObjRenderer {
- public static Obj loadObj(Identifier objId) throws IOException {
- try (InputStream is = MinecraftClient.getInstance().getResourceManager()
- .getResource(objId).get().getInputStream()) {
- return ObjReader.read(is);
- }
- }
-
- public static void renderObj(Obj obj, Map mtlMap, MatrixStack matrices,
- VertexConsumerProvider vertexConsumers, int light, int overlay) {
- MatrixStack.Entry entry = matrices.peek();
-
- Map materialGroups = ObjSplitting.splitByMaterialGroups(obj);
-
- for (Map.Entry group : materialGroups.entrySet()) {
- String materialName = group.getKey();
- Obj groupObj = group.getValue();
-
- Mtl mtl = mtlMap != null ? mtlMap.get(materialName) : null;
-
- // Resolve texture identifier using same logic as ObjUnbakedModelModel
- Identifier texture = Identifier.of("minecraft:textures/misc/white.png");
-
- if (mtl != null) {
- String mapKd = mtl.getMapKd();
- if (mapKd != null) {
- // "#key" references are not resolvable at runtime without a texture map,
- // so we only support direct resource location strings here
- if (!mapKd.startsWith("#")) {
- texture = Identifier.of(mapKd);
- }
- }
- }
-
- // Diffuse color (Kd)
- float r = 1f, g = 1f, b = 1f;
- if (mtl != null) {
- FloatTuple kd = mtl.getKd();
- if (kd != null) {
- r = kd.getX();
- g = kd.getY();
- b = kd.getZ();
- }
- }
-
- VertexConsumer consumer = vertexConsumers.getBuffer(RenderLayer.getEntityAlpha(texture));
-
- int faces = groupObj.getNumFaces();
- final float fr = r, fg = g, fb = b;
-
- for (int f = 0; f < faces; f++) {
- ObjFace face = groupObj.getFace(f);
- int verts = face.getNumVertices();
-
- // Your original winding order logic, untouched
- for (int i = verts - 1; i >= 0; i--) {
- writeVertex(groupObj, face, i, consumer, entry, light, overlay, fr, fg, fb);
- }
- }
- }
- }
-
- private static void writeVertex(Obj obj, ObjFace face, int index, VertexConsumer consumer,
- MatrixStack.Entry matrix, int light, int overlay,
- float r, float g, float b) {
-
- FloatTuple pos = obj.getVertex(face.getVertexIndex(index));
- float x = pos.getX();
- float y = pos.getY();
- float z = pos.getZ();
-
- float nx = 0f, ny = 1f, nz = 0f;
- int normalIndex = face.getNormalIndex(index);
- if (normalIndex >= 0) {
- FloatTuple n = obj.getNormal(normalIndex);
- nx = n.getX();
- ny = n.getY();
- nz = n.getZ();
- }
-
- float u = 0f, v = 0f;
- int texIndex = face.getTexCoordIndex(index);
- if (texIndex >= 0) {
- FloatTuple tc = obj.getTexCoord(texIndex);
- u = tc.getX();
- v = 1f - tc.getY(); // Flip V: OBJ bottom-left origin -> Minecraft top-left
- }
-
- consumer.vertex(matrix, x, y, z)
- .color(r, g, b, 1f)
- .texture(u, v)
- .overlay(overlay)
- .light(light)
- .normal(matrix, nx, ny, nz);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/HudMod.java b/src/main/java/org/saturnclient/modules/HudMod.java
deleted file mode 100644
index fa5b280..0000000
--- a/src/main/java/org/saturnclient/modules/HudMod.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.saturnclient.modules;
-
-import org.saturnclient.ui2.RenderScope;
-
-public interface HudMod {
- public ModDimensions getDimensions();
-
- public void renderDummy(RenderScope scope);
-
- public void renderHud(RenderScope scope);
-}
diff --git a/src/main/java/org/saturnclient/modules/ModDimensions.java b/src/main/java/org/saturnclient/modules/ModDimensions.java
deleted file mode 100644
index 77f6e6f..0000000
--- a/src/main/java/org/saturnclient/modules/ModDimensions.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.saturnclient.modules;
-
-import java.util.Map;
-
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.saturnclient.config.manager.Property.NamedProperty;
-
-public class ModDimensions {
- public Property x = Property.integer(0);
- public Property y = Property.integer(0);
- public Property scale = Property.floatProp(1.0f);
- public Property bgColor = Property.color(0x00000000);
- public Property fgColor = Property.color(0xFFffffff);
- public Property radius = Property.integer(0);
- public Property font = Property.font(0);
- public boolean renderBackground = true;
-
- public int width = 0;
- public int height = 0;
-
- public NamedProperty>> prop() {
- return Property.namespace(Map.of(
- "X", x,
- "Y", y,
- "Scale", scale,
- "Background Color", bgColor,
- "Foreground Color", fgColor,
- "Corner Radius", radius,
- "Font", font)).named("In-Game Display");
- }
-
- public ModDimensions() {
- }
-
- public ModDimensions(int width, int height) {
- this.width = width;
- this.height = height;
- }
-
- public ModDimensions(int x, int y, int width, int height) {
- this.x.value = x;
- this.y.value = y;
- this.width = width;
- this.height = height;
- }
-
- public ModDimensions(int x, int y, int width, int height, float scale) {
- this.x.value = x;
- this.y.value = y;
- this.scale.value = scale;
- this.width = width;
- this.height = height;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/ModManager.java b/src/main/java/org/saturnclient/modules/ModManager.java
deleted file mode 100644
index 9a2ef26..0000000
--- a/src/main/java/org/saturnclient/modules/ModManager.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.saturnclient.modules;
-
-import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.saturnclient.modules.mods.*;
-
-public class ModManager {
- public static final List ENABLED_MODS = new ArrayList<>();
- public static final Module[] ALL_MODS = {
- new Crosshair(),
- new AutoSprint(),
- new ArmorDisplay(),
- new Fps(),
- new StatusEffects(),
- new Coordinates(),
- new Freelook(),
- new Keystrokes(),
- new Fullbright(),
- new NoFog(),
- new DayCounter(),
- new Speedometer(),
- new Zoom(),
- new HealthDisplay(),
- new Nametags(),
- new Ping(),
- new Tps(),
- new Clock()
- };
-
- public static void init() {
- // Pre-filter enabled modules to avoid checking every tick
- updateEnabledModules();
-
- ClientTickEvents.END_CLIENT_TICK.register(client -> {
- // Only iterate over enabled modules
- for (Module m : ENABLED_MODS) {
- m.tick();
- }
- });
- }
-
- public static synchronized void updateEnabledModules() {
- ENABLED_MODS.clear();
- for (Module m : ALL_MODS) {
- if (m.isEnabled()) {
- ENABLED_MODS.add(m);
- }
- }
- }
-
- public static Module[] getAllMods() {
- return ALL_MODS;
- }
-
- public static void refreshEnabledModules() {
- updateEnabledModules();
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/Module.java b/src/main/java/org/saturnclient/modules/Module.java
deleted file mode 100644
index 6c719d6..0000000
--- a/src/main/java/org/saturnclient/modules/Module.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.saturnclient.modules;
-
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.config.manager.Property.NamedProperty;
-import org.saturnclient.ui2.RenderScope;
-
-import net.minecraft.util.Identifier;
-
-public abstract class Module {
- private final ModuleDetails details;
- private final ConfigManager configManager;
-
- public Module(ModuleDetails details, NamedProperty>... props) {
- this.details = details;
- configManager = new ConfigManager(details.name);
- for (NamedProperty> prop : props) {
- configManager.property(prop.name, prop.prop);
- }
- }
-
- public void render(RenderScope scope) {
- }
-
- public void tick() {
- }
-
- public abstract boolean isEnabled();
-
- public final void setEnabled(boolean e) {
- onEnabled(e);
- ModManager.updateEnabledModules();
- }
-
- public abstract void onEnabled(boolean e);
-
- public final String getName() {
- return details.name;
- }
-
- public Identifier getIconTexture() {
- return Textures.getModIcon(details.namespace);
- }
-
- public ConfigManager getConfig() {
- return configManager;
- }
-
- public String getDescription() {
- return details.description;
- }
-
- public String[] getTags() {
- return details.tags;
- }
-
- public String getVersion() {
- return details.version;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/ModuleDetails.java b/src/main/java/org/saturnclient/modules/ModuleDetails.java
deleted file mode 100644
index 3cce480..0000000
--- a/src/main/java/org/saturnclient/modules/ModuleDetails.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.saturnclient.modules;
-
-public class ModuleDetails {
- public String name;
- public String namespace;
- public String description;
- public String version;
- public String[] tags = {};
-
- public ModuleDetails(String name, String namespace) {
- this.name = name;
- this.namespace = namespace;
- }
-
- public ModuleDetails name(String name) {
- this.name = name;
- return this;
- }
-
- public ModuleDetails namespace(String namespace) {
- this.namespace = namespace;
- return this;
- }
-
- public ModuleDetails description(String description) {
- this.description = description;
- return this;
- }
-
- public ModuleDetails version(String version) {
- this.version = version;
- return this;
- }
-
- public ModuleDetails tags(String... tags) {
- this.tags = tags;
- return this;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/README.md b/src/main/java/org/saturnclient/modules/README.md
deleted file mode 100644
index 0eb81ca..0000000
--- a/src/main/java/org/saturnclient/modules/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Credits
-### Freelook
-- https://github.com/Celibistrial/freelook
-- https://modrinth.com/mod/freelook
-
-**The other mods are coded by us, if you have a concern or we missed something feel free to submit a issue with the credits tag**
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/mods/ArmorDisplay.java b/src/main/java/org/saturnclient/modules/mods/ArmorDisplay.java
deleted file mode 100644
index 5778b71..0000000
--- a/src/main/java/org/saturnclient/modules/mods/ArmorDisplay.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-
-import net.minecraft.entity.EquipmentSlot;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.Items;
-
-public class ArmorDisplay extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static ModDimensions dimensions = new ModDimensions(40, 75);
- private static Property useMainHand = Property.bool(false);
-
- public ArmorDisplay() {
- super(new ModuleDetails("Armor Display", "armor")
- .description("Displays armor durability")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- useMainHand.named("Use Main Hand"),
- dimensions.prop());
- }
-
- public void renderArmor(RenderScope scope, ItemStack mainHand, ItemStack helmet, ItemStack chestplate,
- ItemStack leggings, ItemStack boots) {
- int row = 0;
-
- if (useMainHand.value && !mainHand.isEmpty()) {
- scope.drawItem(mainHand, 0, 15 * row);
- renderHealth(scope, row, mainHand.getMaxDamage(), mainHand.getDamage());
- row++;
- }
-
- if (!helmet.isEmpty()) {
- scope.drawItem(helmet, 0, 15 * row);
- renderHealth(scope, row, helmet.getMaxDamage(), helmet.getDamage());
- row++;
- }
-
- if (!chestplate.isEmpty()) {
- scope.drawItem(chestplate, 0, 15 * row);
- renderHealth(scope, row, chestplate.getMaxDamage(), chestplate.getDamage());
- row++;
- }
- if (!leggings.isEmpty()) {
- scope.drawItem(leggings, 0, 15 * row);
- renderHealth(scope, row, leggings.getMaxDamage(), leggings.getDamage());
- row++;
- }
-
- if (!boots.isEmpty()) {
- scope.drawItem(boots, 0, 15 * row);
- renderHealth(scope, row, boots.getMaxDamage(), boots.getDamage());
- row++;
- }
- }
-
- public void renderHealth(RenderScope scope, int i, int max_damage, int damage) {
- if (max_damage > 0) {
- scope.drawText(0.5f, "" + (max_damage - damage), 17, (15 * i) + 3, dimensions.font.value,
- dimensions.fgColor.value);
- }
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- renderArmor(scope,
- SaturnClient.client.player.getEquippedStack(EquipmentSlot.MAINHAND),
- SaturnClient.client.player.getEquippedStack(EquipmentSlot.HEAD),
- SaturnClient.client.player.getEquippedStack(EquipmentSlot.CHEST),
- SaturnClient.client.player.getEquippedStack(EquipmentSlot.LEGS),
- SaturnClient.client.player.getEquippedStack(EquipmentSlot.FEET));
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- renderArmor(scope, new ItemStack(Items.DIAMOND_SWORD), new ItemStack(Items.DIAMOND_HELMET),
- new ItemStack(Items.DIAMOND_CHESTPLATE),
- new ItemStack(Items.DIAMOND_LEGGINGS), new ItemStack(Items.DIAMOND_BOOTS));
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/AutoSprint.java b/src/main/java/org/saturnclient/modules/mods/AutoSprint.java
deleted file mode 100644
index 7a413b4..0000000
--- a/src/main/java/org/saturnclient/modules/mods/AutoSprint.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import java.util.Objects;
-
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-public class AutoSprint extends Module {
- private static Property enabled = Property.bool(false);
-
- public AutoSprint() {
- super(
- new ModuleDetails("Auto Sprint", "sprint")
- .description("Makes the player always sprint")
- .tags("Movement")
- .version("v0.1.0"),
- enabled.named("Enabled"));
- }
-
- @Override
- public void tick() {
- if (SaturnClient.client.player == null || SaturnClient.client.getNetworkHandler() == null) {
- return;
- }
- if (SaturnClient.client.options.forwardKey.isPressed()
- && !SaturnClient.client.options.backKey.isPressed()
- && !SaturnClient.client.player.isSneaking()
- && !SaturnClient.client.player.horizontalCollision
- && !SaturnClient.client.player.isUsingItem()) {
-
- Objects.requireNonNull(SaturnClient.client.player).setSprinting(true);
- }
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Clock.java b/src/main/java/org/saturnclient/modules/mods/Clock.java
deleted file mode 100644
index 2492162..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Clock.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import java.time.format.DateTimeFormatter;
-import java.time.LocalTime;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class Clock extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static Property format = Property.select(0, "24 hour", "12 hour");
- private static Property seconds = Property.bool(false);
- private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight());
-
- public Clock() {
- super(new ModuleDetails("Clock", "clock")
- .description("Displays the current real-world time")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- format.named("Format"),
- seconds.named("Show seconds"),
- dimensions.prop()
- );
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- renderClock(scope);
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- renderClock(scope);
- }
-
- public void renderClock(RenderScope scope) {
- String text = "";
- LocalTime currentTime = LocalTime.now();
-
- switch (format.value) {
- case 0:
- if (seconds.value) { text = currentTime.format(DateTimeFormatter.ofPattern("HH:mm:ss")); }
- else { text = currentTime.format(DateTimeFormatter.ofPattern("HH:mm")); }
- break;
- case 1:
- if (seconds.value) { text = currentTime.format(DateTimeFormatter.ofPattern("hh:mm:ss a")); }
- else { text = currentTime.format(DateTimeFormatter.ofPattern("hh:mm a")); }
- break;
- }
-
- scope.drawText(text,
- 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- dimensions.height = 18 * text.split("\n").length;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/mods/Coordinates.java b/src/main/java/org/saturnclient/modules/mods/Coordinates.java
deleted file mode 100644
index 7ad5c0b..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Coordinates.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-import net.minecraft.util.math.Vec3d;
-
-public class Coordinates extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static Property displayMethod = Property.select(0, "Flat", "Flat annotated", "Newline", "Newline annotated");
- private static ModDimensions dimensions = new ModDimensions(40, 18);
-
- public Coordinates() {
- super(new ModuleDetails("Coordinates", "coords")
- .description("Displays your current coordinates")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- displayMethod.named("Display Method"),
- dimensions.prop()
- );
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- renderCoords(532, 69, 253, scope);
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- Vec3d pos = SaturnClient.client.player.getPos();
- renderCoords((int) pos.x, (int) pos.y, (int) pos.z, scope);
- }
-
- public void renderCoords(int x, int y, int z, RenderScope scope) {
- String f = "%d %d %d"; // Flat
- switch (displayMethod.value) {
- case 1: // Flat annotated
- f = "X: %d Y: %d Z: %d";
- break;
- case 2: // Newline
- f = "%d\n%d\n%d";
- break;
- case 3: // Newline annotated
- f = "X: %d\nY: %d\nZ: %d";
- break;
- }
- String text = String.format(f, x, y, z);
- scope.drawText(text,
- 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- dimensions.height = 18 * text.split("\n").length;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Crosshair.java b/src/main/java/org/saturnclient/modules/mods/Crosshair.java
deleted file mode 100644
index 5a4ed46..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Crosshair.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Textures;
-
-import net.minecraft.client.render.RenderLayer;
-
-public class Crosshair extends Module {
- public static Property enabled = Property.bool(false);
-
- public Crosshair() {
- super(
- new ModuleDetails("Crosshair", "crosshair")
- .description("Changes the crosshair if you're aiming at a entity")
- .tags("Visuals", "Utility")
- .version("v0.1.0"),
- enabled.named("Enabled"));
- }
-
- @Override
- public void render(RenderScope scope) {
- if (enabled.value
- && SaturnClient.client.targetedEntity != null
- && SaturnClient.client.targetedEntity.isAlive()) {
- int scaledWidth = 15;
- int scaledHeight = 15;
-
- scope.setRenderLayer(RenderLayer::getCrosshair);
- scope.drawTexture(Textures.CROSSHAIR_RANGE,
- (scope.getScaledWindowWidth() - scaledWidth) / 2,
- (scope.getScaledWindowHeight() - scaledHeight) / 2, 0.0F, 0.0F, scaledWidth, scaledHeight);
- }
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/DayCounter.java b/src/main/java/org/saturnclient/modules/mods/DayCounter.java
deleted file mode 100644
index bbb0b25..0000000
--- a/src/main/java/org/saturnclient/modules/mods/DayCounter.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class DayCounter extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static ModDimensions dimensions = new ModDimensions(40, 18);
- long day = 0;
-
- public DayCounter() {
- super(new ModuleDetails("DayCounter", "day")
- .description("Displays the number of days that have passed")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- dimensions.prop()
- );
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- renderDay(271, scope);
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- day = (SaturnClient.client.world.getTimeOfDay() / 24000L);
- renderDay(day, scope);
- }
-
- public void renderDay(long day, RenderScope scope) {
- String text = "Day: " + day;
- scope.drawText(text,
- 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- dimensions.height = 18 * text.split("\n").length;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
-
diff --git a/src/main/java/org/saturnclient/modules/mods/Fps.java b/src/main/java/org/saturnclient/modules/mods/Fps.java
deleted file mode 100644
index f788e71..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Fps.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class Fps extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight());
-
- public Fps() {
- super(new ModuleDetails("FPS Display", "fps")
- .description("Displays current FPS")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- dimensions.prop());
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- String text = String.valueOf(SaturnClient.client.getCurrentFps()) + " FPS";
- scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- String text = "369 FPS";
- scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Freelook.java b/src/main/java/org/saturnclient/modules/mods/Freelook.java
deleted file mode 100644
index e894211..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Freelook.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.lwjgl.glfw.GLFW;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-import net.minecraft.client.option.Perspective;
-
-public class Freelook extends Module {
- private static Property enabled = Property.bool(false);
- private static Property toggle = Property.bool(true);
- public static Property freelookKey = Property.keybinding(GLFW.GLFW_KEY_H);
- public static boolean isFreeLooking = false;
- private static boolean was1stPerson = false;
-
- public Freelook() {
- super(
- new ModuleDetails("Freelook", "freelook")
- .description("Allows you to look around freely without moving your character")
- .tags("Movement", "Camera")
- .version("0.1.0"),
- enabled.named("Enabled"),
- toggle.named("Toggle freelook"),
- freelookKey.named("Freelook Keybinding")
- );
- }
-
- @Override
- public void tick() {
- if (toggle.value) {
- if (freelookKey.wasKeyPressed()) {
- if (isFreeLooking) {
- stopFreelook();
- } else {
- startFreelook();
- }
- }
- } else if (freelookKey.isKeyPressed()) {
- if (!isFreeLooking) {
- startFreelook();
- }
- } else if (isFreeLooking) {
- stopFreelook();
- }
- }
-
- private void startFreelook() {
- isFreeLooking = true;
- was1stPerson = SaturnClient.client.options.getPerspective() == Perspective.FIRST_PERSON;
- SaturnClient.client.options.setPerspective(Perspective.THIRD_PERSON_BACK);
- }
-
- private void stopFreelook() {
- if (was1stPerson) {
- SaturnClient.client.options.setPerspective(Perspective.FIRST_PERSON);
- }
- isFreeLooking = false;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Fullbright.java b/src/main/java/org/saturnclient/modules/mods/Fullbright.java
deleted file mode 100644
index 7c4a3d3..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Fullbright.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-public class Fullbright extends Module {
- private static Property enabled = Property.bool(false);
- private static Property brightness = Property.integer(100);
-
- public Fullbright() {
- super(
- new ModuleDetails("Fullbright", "fullbright")
- .description("Allows you to see in the dark")
- .tags("Camera")
- .version("v0.1.0"),
- enabled.named("Enabled"),
- brightness.named("Brightness %"));
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-
- public static boolean shouldOverrideBrightness() {
- return enabled.value;
- }
-
- public static float getBrightnessValue() {
- return brightness.value / 10;
- }
-
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java b/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java
deleted file mode 100644
index e831ec2..0000000
--- a/src/main/java/org/saturnclient/modules/mods/HealthDisplay.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-import net.minecraft.util.math.Vec3d;
-
-public class HealthDisplay extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static Property displayMode = Property.select(0, "Health", "Hearts");
- private static Property decimals = Property.select(0, "0", "1", "2");
- private static ModDimensions dimensions = new ModDimensions(40, 18);
- double speed = 0.;
- Vec3d velocity;
- double y = 0.;
-
- public HealthDisplay() {
- super(new ModuleDetails("Health display", "health")
- .description("Displays your current health")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- displayMode.named("Display mode"),
- decimals.named("Decimals"),
- dimensions.prop()
- );
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- renderHealth(10, scope);
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- float health = SaturnClient.client.player.getHealth();
- switch (displayMode.value) {
- case 1:
- health = health / 2;
- }
- renderHealth(health, scope);
- }
-
- public void renderHealth(float health, RenderScope scope) {
- String text = "";
-
- switch (decimals.value) {
- case 0:
- text = String.format("%.0f ", health);
- break;
- case 1:
- text = String.format("%.1f ", health);
- break;
- case 2:
- text = String.format("%.2f ", health);
- break;
- }
-
- scope.drawText(text,
- 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- dimensions.height = 18 * text.split("\n").length;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Keystrokes.java b/src/main/java/org/saturnclient/modules/mods/Keystrokes.java
deleted file mode 100644
index f67e755..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Keystrokes.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.modules.ModuleDetails;
-
-public class Keystrokes extends Module implements HudMod {
-
- private static final Property enabled = Property.bool(false);
- private static final Property showMouse = Property.bool(true);
- private static final Property showSpace = Property.bool(false);
-
- private static final Property clickBg = Property.color(0xFFCCCCCC);
- private static final Property clickFg = Property.color(0xFFFFFFFF);
-
- private static final ModDimensions dimensions = new ModDimensions(78, 54);
-
- // Key states
- private boolean w, a, s, d, lmb, rmb, space;
-
- // Layout constants
- private static final int KEY_SIZE = 24;
- private static final int KEY_SPACING = 3;
- private static final int MOUSE_WIDTH = 38;
- private static final int MOUSE_HEIGHT = 24;
- private static final int SPACE_HEIGHT = 19;
-
- public Keystrokes() {
- super(new ModuleDetails("Keystrokes", "keystrokes")
- .description("Displays movement keystrokes")
- .version("v0.2.0")
- .tags("Utility"),
-
- enabled.named("Enabled"),
- showMouse.named("Show mouse clicks"),
- showSpace.named("Show space"),
- dimensions.prop(),
- clickFg.named("Clicked fg"),
- clickBg.named("Clicked bg")
- );
-
- dimensions.renderBackground = false;
- }
-
- @Override
- public void tick() {
- w = SaturnClient.client.options.forwardKey.isPressed();
- a = SaturnClient.client.options.leftKey.isPressed();
- s = SaturnClient.client.options.backKey.isPressed();
- d = SaturnClient.client.options.rightKey.isPressed();
- lmb = SaturnClient.client.options.attackKey.isPressed();
- rmb = SaturnClient.client.options.useKey.isPressed();
- space = SaturnClient.client.options.jumpKey.isPressed();
-
- updateHeight();
- }
-
- private void updateHeight() {
- int height = KEY_SIZE * 2 + KEY_SPACING;
-
- if (showSpace.value)
- height += SPACE_HEIGHT + KEY_SPACING;
-
- if (showMouse.value)
- height += MOUSE_HEIGHT + KEY_SPACING;
-
- dimensions.height = height;
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- render(scope, false);
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- render(scope, true);
- }
-
- private void render(RenderScope scope, boolean live) {
-
- int yOffset = 0;
-
- // --- W ---
- renderKey(scope, live && w, 'W', KEY_SIZE + KEY_SPACING, yOffset);
-
- // --- A S D ---
- yOffset += KEY_SIZE + KEY_SPACING;
-
- renderKey(scope, live && a, 'A', 0, yOffset);
- renderKey(scope, live && s, 'S', KEY_SIZE + KEY_SPACING, yOffset);
- renderKey(scope, live && d, 'D', (KEY_SIZE + KEY_SPACING) * 2, yOffset);
-
- yOffset += KEY_SIZE + KEY_SPACING;
-
- // --- SPACE ---
- if (showSpace.value) {
- renderKeySpace(scope, live && space, 0, yOffset);
- yOffset += SPACE_HEIGHT + KEY_SPACING;
- }
-
- // --- MOUSE ---
- if (showMouse.value) {
- renderKeyMouse(scope, live && lmb, "LMB", 0, yOffset);
- renderKeyMouse(scope, live && rmb, "RMB", MOUSE_WIDTH + KEY_SPACING, yOffset);
- }
- }
-
- private void renderKey(RenderScope scope, boolean pressed, char c, int x, int y) {
- int bg = pressed ? clickBg.value : dimensions.bgColor.value;
- int fg = pressed ? clickFg.value : dimensions.fgColor.value;
-
- scope.drawRoundedRectangle(x, y, KEY_SIZE, KEY_SIZE, dimensions.radius.value, bg);
- scope.drawText(0.6f, String.valueOf(c), x + 9, y + 7, dimensions.font.value, fg);
- }
-
- private void renderKeyMouse(RenderScope scope, boolean pressed, String text, int x, int y) {
- int bg = pressed ? clickBg.value : dimensions.bgColor.value;
- int fg = pressed ? clickFg.value : dimensions.fgColor.value;
-
- scope.drawRoundedRectangle(x, y, MOUSE_WIDTH, MOUSE_HEIGHT, dimensions.radius.value, bg);
- scope.drawText(0.6f, text, x + 9, y + 7, dimensions.font.value, fg);
- }
-
- private void renderKeySpace(RenderScope scope, boolean pressed, int x, int y) {
- int bg = pressed ? clickBg.value : dimensions.bgColor.value;
- int fg = pressed ? clickFg.value : dimensions.fgColor.value;
-
- scope.drawRoundedRectangle(x, y, dimensions.width, SPACE_HEIGHT, dimensions.radius.value, bg);
-
- int lineY = y + SPACE_HEIGHT / 2;
- scope.drawRect(x + (dimensions.width - 30) / 2, lineY, 30, 1, fg);
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/mods/Nametags.java b/src/main/java/org/saturnclient/modules/mods/Nametags.java
deleted file mode 100644
index 5f4948f..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Nametags.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.modules.mods.utils.HealthRenderState;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-import net.minecraft.client.render.entity.state.LivingEntityRenderState;
-
-// todo: rendering modes, custom names
-
-public class Nametags extends Module {
- private static Property enabled = Property.bool(false);
- private static Property healthDisplay = Property.bool(false);
- private static Property players = Property.bool(true);
- private static Property hostile = Property.bool(false);
- private static Property passive = Property.bool(false);
- private static Property heartEmoji = Property.bool(true);
- private static Property obfuscate = Property.bool(false);
- private static Property unit = Property.select(0, "Health", "Hearts");
- private static Property format = Property.select(0, "Value", "Value / Total", "%");
- private static Property nameColor = Property.select(15,
- "Black",
- "Dark Blue",
- "Dark Green",
- "Dark Aqua",
- "Dark Red",
- "Dark Purple",
- "Gold",
- "Gray",
- "Dark Gray",
- "Blue",
- "Green",
- "Aqua",
- "Red",
- "Light Purple",
- "Yellow",
- "White"
- );
- private static Property healthColor = Property.select(12,
- "Black",
- "Dark Blue",
- "Dark Green",
- "Dark Aqua",
- "Dark Red",
- "Dark Purple",
- "Gold",
- "Gray",
- "Dark Gray",
- "Blue",
- "Green",
- "Aqua",
- "Red",
- "Light Purple",
- "Yellow",
- "White"
- );
-
- private static final String[] COLOR_CODES = {
- "§0", "§1", "§2", "§3", "§4", "§5", "§6", "§7",
- "§8", "§9", "§a", "§b", "§c", "§d", "§e", "§f"
- };
-
- public Nametags() {
- super(
- new ModuleDetails("Nametags", "nametags")
- .description("Allows you to modify entity nametags")
- .tags("Camera", "Utility")
- .version("0.1.0"),
- enabled.named("Enabled"),
- healthDisplay.named("Display health"),
- players.named("Players"),
- hostile.named("Hostile"),
- passive.named("Passive"),
- heartEmoji.named("Heart emoji"),
- obfuscate.named("Obfuscate enemy names"),
- unit.named("Unit"),
- format.named("Format"),
- nameColor.named("Name color"),
- healthColor.named("Health color")
- );
- }
-
- @Override
- public void tick() {
-
- }
-
- public static String getHealthString(LivingEntityRenderState state, HealthRenderState hrs, float health, float maxHealth) {
- String ret = "";
-
- switch (format.value){
- case 0: // value
- ret = String.format("%.1f", health / (unit.value + 1));
- break;
-
- case 1: // value / total
- ret = String.format("%.1f", health / (unit.value + 1)) + " / " + String.format("%.1f", maxHealth / (unit.value + 1));
- break;
-
- case 2: // %
- ret = String.format("%.0f%%", (health / maxHealth) * 100);
- break;
- }
- return ret;
- }
-
- public static String getNametagString(LivingEntityRenderState state) {
- if (state.customName == null) return null;
- if (!healthDisplay.value) return state.customName.getString(); // name only
- if (!(state instanceof HealthRenderState hrs)) return null;
-
- float health = hrs.saturn$getHealth();
- float maxHealth = hrs.saturn$getMaxHealth();
-
- HealthRenderState.EntityType type = hrs.saturn$getEntityType();
- if (type == HealthRenderState.EntityType.PASSIVE && !passive.value) return null;
- if (type == HealthRenderState.EntityType.HOSTILE && !hostile.value) return null;
- if (type == HealthRenderState.EntityType.PLAYER && !players.value) return null;
- if (type == HealthRenderState.EntityType.OTHER) return null;
-
- if (health < 0f || maxHealth < 0f || health > maxHealth) return null;
-
- String hpColor = COLOR_CODES[healthColor.value];
- String color = COLOR_CODES[nameColor.value];
- String heart = heartEmoji.value ? " ❤" : "";
- String obf = obfuscate.value ? "§k" : "";
- String reset = "§r";
-
- String ret = color + obf + state.customName.getString() + reset + " " + hpColor + getHealthString(state, hrs, health, maxHealth) + heart;
-
- return ret;
- }
-
- public static boolean shouldReplaceName() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/NoFog.java b/src/main/java/org/saturnclient/modules/mods/NoFog.java
deleted file mode 100644
index bd8d17e..0000000
--- a/src/main/java/org/saturnclient/modules/mods/NoFog.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-public class NoFog extends Module {
- private static Property enabled = Property.bool(false);
- private static Property liquids = Property.bool(false);
-
- public NoFog() {
- super(
- new ModuleDetails("No Fog", "nofog")
- .description("Stops fog from rendering")
- .tags("Camera")
- .version("v0.1.0"),
- enabled.named("Enabled"),
- liquids.named("See through liquids"));
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-
- // static for the mixin
- public static boolean isActive() {
- return enabled.value;
- }
-
- public static boolean liquids() {
- return liquids.value;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Ping.java b/src/main/java/org/saturnclient/modules/mods/Ping.java
deleted file mode 100644
index 06c103d..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Ping.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-
-public class Ping extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight());
-
- public Ping() {
- super(new ModuleDetails("Ping Display", "ping")
- .description("Displays ping")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- dimensions.prop());
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- MinecraftClient client = MinecraftClient.getInstance();
- ClientPlayNetworkHandler handler = client.getNetworkHandler();
- String text = "0 ms";
- if (handler != null) {
- text = String.valueOf(handler.getPlayerListEntry(client.player.getUuid()).getLatency()) + " ms";
- }
- scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- String text = "10 ms";
- scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Speedometer.java b/src/main/java/org/saturnclient/modules/mods/Speedometer.java
deleted file mode 100644
index ec3663c..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Speedometer.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-import net.minecraft.util.math.Vec3d;
-import net.minecraft.entity.Entity;
-
-public class Speedometer extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static Property axis = Property.select(1, "Absolute", "X axis", "Y axis");
- private static Property unitText = Property.select(0, "None", "Blocks/s", "blocks/s", "b/s");
- private static Property speedText = Property.bool(true);
- private static ModDimensions dimensions = new ModDimensions(40, 18);
- double speed = 0.;
- Vec3d velocity;
- double y = 0.;
-
- public Speedometer() {
- super(new ModuleDetails("Speedometer", "speed")
- .description("Displays your current speed")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- axis.named("Speed type"),
- unitText.named("Unit text"),
- speedText.named("Show speed text"),
- dimensions.prop()
- );
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- renderSpeed(2.71, scope);
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- Entity vehicle = SaturnClient.client.player.getVehicle();
- Entity player = SaturnClient.client.player;
-
- if (vehicle == null) {
- velocity = player.getVelocity();
- y = player.isOnGround() ? 0. : velocity.y;
- } else {
- velocity = vehicle.getVelocity();
- y = vehicle.isOnGround() ? 0. : velocity.y;
- }
-
- switch (axis.value) {
- case 0: // Absolute
- speed = (Math.sqrt(Math.pow(velocity.x, 2) + Math.pow(y, 2) + Math.pow(velocity.z, 2)));
- break;
-
- case 1: // x axis
- speed = (Math.sqrt(Math.pow(velocity.x, 2) + Math.pow(velocity.z, 2)));
- break;
-
- case 2: // y axis
- speed = (Math.abs(y));
- break;
- }
- renderSpeed(speed * 20, scope); // blocks/tick to blocks/s
- }
-
- public void renderSpeed(double speed, RenderScope scope) {
- String f = String.format("%.2f ", speed);
-
- switch (unitText.value) {
- case 1:
- f += "Blocks/s";
- break;
-
- case 2:
- f += "blocks/s";
- break;
- case 3:
- f += "b/s";
- break;
- }
-
- String text = f;
-
- if (speedText.value) {
- text = "Speed: " + text;
- }
-
- scope.drawText(text,
- 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- dimensions.height = 18 * text.split("\n").length;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/StatusEffects.java b/src/main/java/org/saturnclient/modules/mods/StatusEffects.java
deleted file mode 100644
index 3d4a1e0..0000000
--- a/src/main/java/org/saturnclient/modules/mods/StatusEffects.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import java.util.Arrays;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-
-import net.minecraft.client.resource.language.I18n;
-import net.minecraft.client.texture.Sprite;
-import net.minecraft.client.texture.StatusEffectSpriteManager;
-import net.minecraft.entity.effect.StatusEffect;
-import net.minecraft.entity.effect.StatusEffectInstance;
-import net.minecraft.registry.Registries;
-import net.minecraft.registry.entry.RegistryEntry;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.math.MathHelper;
-
-public class StatusEffects extends Module implements HudMod {
- public static Property enabled = Property.bool(false);
- private static ModDimensions dimensions = new ModDimensions(60, 0);
-
- private final StatusEffectInstance[] dummyEffects = {
- new StatusEffectInstance(Registries.STATUS_EFFECT.getEntry(Identifier.ofVanilla("speed")).get(), 12000, 2),
- new StatusEffectInstance(Registries.STATUS_EFFECT.getEntry(Identifier.ofVanilla("strength")).get(), 12000, 2),
- new StatusEffectInstance(Registries.STATUS_EFFECT.getEntry(Identifier.ofVanilla("fire_resistance")).get(), 12000, 2),
- };
-
- public StatusEffects() {
- super(new ModuleDetails("Status effects", "effect")
- .description("Displays status effects")
- .version("v0.1.0")
- .tags("Utility"),
-
- enabled.named("Enabled"),
- dimensions.prop());
- }
-
- private void renderEffects(RenderScope scope, Iterable effects) {
- int row = 0;
-
- StatusEffectSpriteManager statusEffectSpriteManager = SaturnClient.client.getStatusEffectSpriteManager();
-
- for (StatusEffectInstance effect : effects) {
- if (effect.shouldShowIcon()) {
- RegistryEntry registryEntry = effect.getEffectType();
- Sprite sprite = statusEffectSpriteManager.getSprite(registryEntry);
- scope.drawSpriteStretched(sprite, 0, 18 * row, 16, 16);
- scope.drawText(0.5f, getDurationAsString(effect), 18, 18 * row + 3, dimensions.font.value, -1);
- row++;
- }
- }
-
- dimensions.height = 18 * row;
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- renderEffects(scope, SaturnClient.client.player.getStatusEffects());
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- renderEffects(scope, Arrays.asList(dummyEffects));
- }
-
- // This code was from: https://github.com/magicus/statuseffecttimer/blob/master/src/main/java/se/icus/mag/statuseffecttimer/mixin/StatusEffectTimerMixin.java
- private String getDurationAsString(StatusEffectInstance statusEffectInstance) {
- if (statusEffectInstance.isInfinite()) {
- return I18n.translate("effect.duration.infinite");
- }
-
- int ticks = MathHelper.floor((float) statusEffectInstance.getDuration());
- int totalSeconds = ticks / 20;
-
- if (totalSeconds >= 3600) {
- return totalSeconds / 3600 + "h";
- } else if (totalSeconds >= 60) {
- int minutes = totalSeconds / 60;
- int seconds = totalSeconds % 60;
- return String.format("%d:%02d", minutes, seconds);
- } else {
- return String.valueOf(totalSeconds) + "s";
- }
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Tps.java b/src/main/java/org/saturnclient/modules/mods/Tps.java
deleted file mode 100644
index a8eb977..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Tps.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class Tps extends Module implements HudMod {
- private static Property enabled = Property.bool(false);
- private static ModDimensions dimensions = new ModDimensions(60, Fonts.getHeight());
-
- private static long lastWorldAge = -1;
- private static long lastRealTime = -1;
- private static double currentTps = 20.0;
-
- private static final int SAMPLE_COUNT = 2;
- private static final double[] samples = new double[SAMPLE_COUNT];
- static {
- java.util.Arrays.fill(samples, 20.0);
- }
- private static int sampleIndex = 0;
- private static int samplesFilled = 0;
-
- public Tps() {
- super(new ModuleDetails("TPS Display", "tps")
- .description("Displays the TPS")
- .version("v0.1.0")
- .tags("Utility"),
- enabled.named("Enabled"),
- dimensions.prop()
- );
- }
-
- public static void onTimePacket(long worldAge) {
- long now = System.currentTimeMillis();
-
- if (lastWorldAge != -1 && lastRealTime != -1) {
- long tickDelta = worldAge - lastWorldAge;
- long timeDelta = now - lastRealTime;
-
- if (timeDelta > 0 && tickDelta > 0) {
- double sample = (tickDelta / (double) timeDelta) * 1000.0;
- sample = Math.min(sample, 20.0);
-
- samples[sampleIndex % SAMPLE_COUNT] = sample;
- sampleIndex++;
- samplesFilled = Math.min(samplesFilled + 1, SAMPLE_COUNT);
-
- double sum = 0;
- for (int i = 0; i < samplesFilled; i++) sum += samples[i];
- currentTps = sum / samplesFilled;
- }
- }
-
- lastWorldAge = worldAge;
- lastRealTime = now;
- }
-
- public static void reset() {
- lastWorldAge = -1;
- lastRealTime = -1;
- currentTps = 20.0;
- sampleIndex = 0;
- samplesFilled = SAMPLE_COUNT;
- for (int i = 0; i < SAMPLE_COUNT; i++) samples[i] = 20.0;
- }
-
- @Override
- public void renderHud(RenderScope scope) {
- String text = String.format("%.1f TPS", currentTps);
- scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- }
-
- @Override
- public void renderDummy(RenderScope scope) {
- String text = "20.0 TPS";
- scope.drawText(text, 0, 0, dimensions.font.value, dimensions.fgColor.value);
- dimensions.width = Fonts.getWidth(text, dimensions.font.value);
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- }
-
- @Override
- public ModDimensions getDimensions() {
- return dimensions;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/Zoom.java b/src/main/java/org/saturnclient/modules/mods/Zoom.java
deleted file mode 100644
index cd9d28a..0000000
--- a/src/main/java/org/saturnclient/modules/mods/Zoom.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.saturnclient.modules.mods;
-
-import org.lwjgl.glfw.GLFW;
-import org.saturnclient.modules.Module;
-import org.saturnclient.modules.ModuleDetails;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-public class Zoom extends Module {
- private static Property enabled = Property.bool(false);
- private static Property toggle = Property.bool(false);
- public static Property zoomKey = Property.keybinding(GLFW.GLFW_KEY_C);
- public static Property zoomLevel = Property.floatProp(3.0f);
-
- public static boolean isZooming = false;
-
- public Zoom() {
- super(
- new ModuleDetails("Zoom", "zoom")
- .description("Allows you to zoom in for a closer view")
- .tags("Camera", "Utility")
- .version("0.1.0"),
- enabled.named("Enabled"),
- toggle.named("Toggle zoom"),
- zoomKey.named("Zoom Keybinding"),
- zoomLevel.named("Zoom Level")
- );
- }
-
- @Override
- public void tick() {
- if (toggle.value) {
- if (zoomKey.wasKeyPressed()) {
- isZooming = !isZooming;
- }
- } else {
- isZooming = zoomKey.isKeyPressed();
- }
- }
-
- public static float getZoomLevel() {
- return zoomLevel.value;
- }
-
- public static boolean shouldZoom() {
- return enabled.value;
- }
-
- @Override
- public void onEnabled(boolean e) {
- enabled.value = e;
- if (!e) {
- isZooming = false;
- }
- }
-
- @Override
- public boolean isEnabled() {
- return enabled.value;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/BackgroundRendererMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/BackgroundRendererMixin.java
deleted file mode 100644
index b34bf23..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/BackgroundRendererMixin.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import net.minecraft.client.render.BackgroundRenderer;
-
-import org.saturnclient.modules.mods.NoFog;
-import net.minecraft.entity.Entity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-import org.spongepowered.asm.mixin.injection.Redirect;
-
-@Mixin(BackgroundRenderer.class)
-public class BackgroundRendererMixin {
-
- @ModifyVariable(method = "applyFog", at = @At("HEAD"), ordinal = 0, argsOnly = true)
- private static float modifyFogStart(float viewDistance) {
- if (NoFog.isActive()) {
- return Float.MAX_VALUE; // this could be customised
- }
- return viewDistance;
- }
- // liquids
- @Redirect(
- method = "applyFog",
- at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;isSpectator()Z")
- )
- private static boolean redirectIsSpectator(Entity entity) {
- if (NoFog.isActive() && NoFog.liquids()) {
- return true; // pretend to be spectator
- }
- return entity.isSpectator();
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/CameraMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/CameraMixin.java
deleted file mode 100644
index 7c2cabc..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/CameraMixin.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.client.render.Camera;
-import net.minecraft.entity.Entity;
-import net.minecraft.world.BlockView;
-
-import org.saturnclient.modules.mods.Freelook;
-import org.saturnclient.modules.mods.utils.CameraOverriddenEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(Camera.class)
-public abstract class CameraMixin {
- @Unique
- boolean firstTime = true;
-
- @Shadow
- protected abstract void setRotation(float yaw, float pitch);
-
- @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;setRotation(FF)V", ordinal = 1, shift = At.Shift.AFTER))
- public void lockRotation(BlockView focusedBlock, Entity cameraEntity, boolean isThirdPerson, boolean isFrontFacing, float tickDelta, CallbackInfo ci) {
- if (Freelook.isFreeLooking && cameraEntity instanceof ClientPlayerEntity) {
- CameraOverriddenEntity cameraOverriddenEntity = (CameraOverriddenEntity) cameraEntity;
-
- if (firstTime && MinecraftClient.getInstance().player != null) {
- cameraOverriddenEntity.freelook$setCameraPitch(MinecraftClient.getInstance().player.getPitch());
- cameraOverriddenEntity.freelook$setCameraYaw(MinecraftClient.getInstance().player.getYaw());
- firstTime = false;
- }
- this.setRotation(cameraOverriddenEntity.freelook$getCameraYaw(), cameraOverriddenEntity.freelook$getCameraPitch());
-
- }
- if (!Freelook.isFreeLooking && cameraEntity instanceof ClientPlayerEntity) {
- firstTime = true;
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/EntityMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/EntityMixin.java
deleted file mode 100644
index 8442b43..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/EntityMixin.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-
-import net.minecraft.client.network.ClientPlayerEntity;
-import net.minecraft.entity.Entity;
-import net.minecraft.util.math.MathHelper;
-
-import org.saturnclient.modules.mods.Freelook;
-import org.saturnclient.modules.mods.utils.CameraOverriddenEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(Entity.class)
-public class EntityMixin implements CameraOverriddenEntity {
- @Unique
- private float cameraPitch;
-
- @Unique
- private float cameraYaw;
-
- @Inject(method = "changeLookDirection", at = @At("HEAD"), cancellable = true)
- public void changeCameraLookDirection(double xDelta, double yDelta, CallbackInfo ci) {
- //noinspection ConstantValue// IntelliJ is incorrect here, this code block is reachable
- if (Freelook.isFreeLooking && (Object) this instanceof ClientPlayerEntity) {
- double pitchDelta = (yDelta * 0.15);
- double yawDelta = (xDelta * 0.15);
-
- this.cameraPitch = MathHelper.clamp(this.cameraPitch + (float) pitchDelta, -90.0f, 90.0f);
- this.cameraYaw += (float) yawDelta;
-
- ci.cancel();
-
- }
- }
-
- @Override
- @Unique
- public float freelook$getCameraPitch() {
- return this.cameraPitch;
- }
-
- @Override
- @Unique
- public float freelook$getCameraYaw() {
- return this.cameraYaw;
- }
-
- @Override
- @Unique
- public void freelook$setCameraPitch(float pitch) {
- this.cameraPitch = pitch;
- }
-
- @Override
- @Unique
- public void freelook$setCameraYaw(float yaw) {
- this.cameraYaw = yaw;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/GameRendererMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/GameRendererMixin.java
deleted file mode 100644
index 2518f06..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/GameRendererMixin.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
-import org.saturnclient.modules.mods.Zoom;
-
-import net.minecraft.client.render.GameRenderer;
-
-@Mixin(GameRenderer.class)
-public class GameRendererMixin {
-
- @Inject(method = "getFov", at = @At("RETURN"), cancellable = true)
- private void onGetFov(CallbackInfoReturnable cir) {
- if (Zoom.isZooming && Zoom.shouldZoom()) {
- float originalFov = cir.getReturnValue();
- float zoomedFov = originalFov / Zoom.getZoomLevel();
- cir.setReturnValue(zoomedFov);
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/LightmapTextureManagerMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/LightmapTextureManagerMixin.java
deleted file mode 100644
index 34289f6..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/LightmapTextureManagerMixin.java
+++ /dev/null
@@ -1,23 +0,0 @@
-// code modified from Gamma utils: https://github.com/Sjouwer/gamma-utils
-package org.saturnclient.modules.mods.mixins;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import net.minecraft.client.render.LightmapTextureManager;
-import org.saturnclient.modules.mods.Fullbright;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(LightmapTextureManager.class)
-public class LightmapTextureManagerMixin {
-
- @ModifyExpressionValue(
- method = "update",
- at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(FF)F", ordinal = 0)
- )
- private float modifyGamma(float original) {
- if (Fullbright.shouldOverrideBrightness()) {
- return Fullbright.getBrightnessValue();
- }
- return original;
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java
deleted file mode 100644
index dacee20..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRenderStateMixin.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import net.minecraft.client.render.entity.state.LivingEntityRenderState;
-
-import org.saturnclient.modules.mods.utils.HealthRenderState;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Unique;
-
-@Mixin(LivingEntityRenderState.class)
-public class LivingEntityRenderStateMixin implements org.saturnclient.modules.mods.utils.HealthRenderState {
-
- @Unique private float saturn$health = 0f;
- @Unique private float saturn$maxHealth = 1f;
- @Unique private HealthRenderState.EntityType saturn$entityType = HealthRenderState.EntityType.OTHER;
-
- public float saturn$getHealth() { return saturn$health; }
- public float saturn$getMaxHealth() { return saturn$maxHealth; }
- public void saturn$setHealth(float health, float maxHealth) {
- this.saturn$health = health;
- this.saturn$maxHealth = maxHealth;
- }
-
- public HealthRenderState.EntityType saturn$getEntityType() { return saturn$entityType; }
- public void saturn$setEntityType(HealthRenderState.EntityType type) { this.saturn$entityType = type; }
-
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java
deleted file mode 100644
index 34e5d1f..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/LivingEntityRendererMixin.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import net.minecraft.client.render.entity.LivingEntityRenderer;
-import net.minecraft.client.render.entity.state.LivingEntityRenderState;
-import org.saturnclient.modules.mods.utils.HealthRenderState;
-import net.minecraft.entity.LivingEntity;
-import net.minecraft.entity.mob.HostileEntity;
-import net.minecraft.entity.passive.PassiveEntity;
-import net.minecraft.entity.player.PlayerEntity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(LivingEntityRenderer.class)
-public abstract class LivingEntityRendererMixin {
-
- @Inject(method = "updateRenderState", at = @At("TAIL"))
- private void saturn$captureHealth(T entity, S state, float tickDelta, CallbackInfo ci) {
- if (!(state instanceof HealthRenderState hrs)) return;
-
- hrs.saturn$setHealth(entity.getHealth(), entity.getMaxHealth());
-
- if (entity instanceof PlayerEntity) {
- hrs.saturn$setEntityType(HealthRenderState.EntityType.PLAYER);
- } else if (entity instanceof HostileEntity) {
- hrs.saturn$setEntityType(HealthRenderState.EntityType.HOSTILE);
- } else if (entity instanceof PassiveEntity) {
- hrs.saturn$setEntityType(HealthRenderState.EntityType.PASSIVE);
- } else {
- hrs.saturn$setEntityType(HealthRenderState.EntityType.OTHER);
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/NametagsMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/NametagsMixin.java
deleted file mode 100644
index be17d91..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/NametagsMixin.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.entity.EntityRenderer;
-import net.minecraft.client.render.entity.state.EntityRenderState;
-import net.minecraft.client.render.entity.state.LivingEntityRenderState;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.text.Text;
-import org.saturnclient.modules.mods.Nametags;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Unique;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(EntityRenderer.class)
-public abstract class NametagsMixin {
-
- @Unique
- private static final ThreadLocal saturn$rendering = ThreadLocal.withInitial(() -> false);
-
- @Shadow
- protected abstract void renderLabelIfPresent(
- S state, Text text, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light
- );
-
- @Inject(method = "renderLabelIfPresent", at = @At("HEAD"), cancellable = true)
- private void saturn$replaceNametag(S state, Text text,
- MatrixStack matrices, VertexConsumerProvider vertexConsumers,
- int light, CallbackInfo ci) {
-
- if (saturn$rendering.get()) return;
- if (!Nametags.shouldReplaceName()) return;
- if (!(state instanceof LivingEntityRenderState living)) return;
-
- String replacement = Nametags.getNametagString(living);
- if (replacement == null) return;
-
- ci.cancel();
- saturn$rendering.set(true);
- try {
- renderLabelIfPresent(state, Text.literal(replacement), matrices, vertexConsumers, light);
- } finally {
- saturn$rendering.set(false);
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/RenderMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/RenderMixin.java
deleted file mode 100644
index a552698..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/RenderMixin.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.ModManager;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.menus.HudEditor;
-import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
-import org.saturnclient.ui2.RenderScope;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.hud.InGameHud;
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.client.render.RenderTickCounter;
-
-@Mixin(InGameHud.class)
-public class RenderMixin {
- @Inject(method = "renderChat", at = @At("TAIL"))
- public void renderMods(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) {
- TextRenderer textRenderer = SaturnClient.client.textRenderer;
-
- if (textRenderer != null &&
- !(SaturnClient.client.currentScreen instanceof HudEditor)) {
- RenderScope renderScope = new RenderScope(context.getMatrices(),
- ((DrawContextAccessor) context).getVertexConsumers());
-
- for (org.saturnclient.modules.Module m : ModManager.ENABLED_MODS) {
- if (m instanceof HudMod && m.isEnabled()) {
- ModDimensions dim = ((HudMod) m).getDimensions();
-
- renderScope.matrices.push();
-
- renderScope.matrices.translate(dim.x.value, (float) dim.y.value, 0);
-
- renderScope.matrices.scale(dim.scale.value, dim.scale.value, 1.0f);
-
- if (dim.renderBackground) {
- renderScope.drawRoundedRectangle(0, 0, dim.width, dim.height, dim.radius.value,
- dim.bgColor.value);
- }
-
- renderScope.setRenderLayer(RenderLayer::getGuiTextured);
-
- ((HudMod) m).renderHud(renderScope);
-
- renderScope.matrices.pop();
- } else {
- m.render(renderScope);
- }
- }
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/mixins/TpsMixin.java b/src/main/java/org/saturnclient/modules/mods/mixins/TpsMixin.java
deleted file mode 100644
index 7a9d15e..0000000
--- a/src/main/java/org/saturnclient/modules/mods/mixins/TpsMixin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.saturnclient.modules.mods.mixins;
-
-import net.minecraft.client.network.ClientPlayNetworkHandler;
-import net.minecraft.network.packet.s2c.play.WorldTimeUpdateS2CPacket;
-import org.saturnclient.modules.mods.Tps;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(ClientPlayNetworkHandler.class)
-public class TpsMixin {
-
- @Inject(method = "onWorldTimeUpdate", at = @At("HEAD"))
- private void onWorldTimeUpdate(WorldTimeUpdateS2CPacket packet, CallbackInfo ci) {
- Tps.onTimePacket(packet.time());
- }
-}
diff --git a/src/main/java/org/saturnclient/modules/mods/utils/CameraOverriddenEntity.java b/src/main/java/org/saturnclient/modules/mods/utils/CameraOverriddenEntity.java
deleted file mode 100644
index 169608f..0000000
--- a/src/main/java/org/saturnclient/modules/mods/utils/CameraOverriddenEntity.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.saturnclient.modules.mods.utils;
-
-public interface CameraOverriddenEntity {
- float freelook$getCameraPitch();
- float freelook$getCameraYaw();
-
- void freelook$setCameraPitch(float pitch);
- void freelook$setCameraYaw(float yaw);
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/modules/mods/utils/HealthRenderState.java b/src/main/java/org/saturnclient/modules/mods/utils/HealthRenderState.java
deleted file mode 100644
index 4853754..0000000
--- a/src/main/java/org/saturnclient/modules/mods/utils/HealthRenderState.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.saturnclient.modules.mods.utils;
-
-public interface HealthRenderState {
- float saturn$getHealth();
- float saturn$getMaxHealth();
- void saturn$setHealth(float health, float maxHealth);
-
- EntityType saturn$getEntityType();
- void saturn$setEntityType(EntityType type);
-
- enum EntityType {
- PLAYER, HOSTILE, PASSIVE, OTHER
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java
deleted file mode 100644
index ba767c9..0000000
--- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.saturnclient.saturnclient;
-
-import net.fabricmc.api.ModInitializer;
-import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
-import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.util.math.MatrixStack;
-
-import org.saturnclient.cosmetics.Emotes;
-import org.saturnclient.cosmetics.cloak.Cloaks;
-import org.saturnclient.cosmetics.hat.Hats;
-import org.saturnclient.modules.ModManager;
-import org.saturnclient.saturnclient.client.ServiceClient;
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.event.KeyInputHandler;
-import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.elements.ImageTexture;
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.ui2.screens.TitleMenu;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Main class for the Saturn Client mod.
- */
-public class SaturnClient implements ModInitializer {
-
- public static final String MOD_ID = "saturnclient";
- public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID);
- public static MinecraftClient client;
-
- @Override
- public void onInitialize() {
- LOGGER.info("Initializing " + MOD_ID);
- client = MinecraftClient.getInstance();
- Config.init();
- ModManager.init();
-
- client.execute(() -> {
- SaturnScreen.preload(client);
- });
-
- ClientLifecycleEvents.CLIENT_STOPPING.register(_o -> ConfigManager.save());
-
- ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
- if (screen != null && !(screen instanceof TitleMenu)) {
- if (screen instanceof SaturnScreen) {
- ((SaturnScreen) screen).draw(new ImageTexture(Textures.LOGO_TEXT_BIG).dimensions(180, 18)
- .position(screen.width - 180 - 20, screen.height - 18 - 20));
- } else {
- ScreenEvents.afterRender(screen).register((screen1, context, mouseX, mouseY, tickDelta) -> {
- RenderScope renderScope = new RenderScope(context.getMatrices(),
- ((DrawContextAccessor) context).getVertexConsumers());
-
- int width = context.getScaledWindowWidth();
- int height = context.getScaledWindowHeight();
-
- float scaleX = (float) screen1.width / width;
- float scaleY = (float) screen1.height / height;
-
- MatrixStack matrixStack = context.getMatrices();
- matrixStack.push();
- matrixStack.translate(width - 95, height - 14, 0);
- matrixStack.scale(0.5f / scaleX, 0.5f / scaleY, 1.0f);
- renderScope.drawTexture(Textures.LOGO_TEXT_BIG, 0, 0, 0, 0, 180, 18);
- matrixStack.pop();
- });
- }
- }
- });
-
- KeyInputHandler.register();
- Emotes.initialize();
- if (ServiceClient.authenticate()) {
- Cloaks.initialize();
- Hats.initialize();
- LOGGER.info(MOD_ID + " initialization complete");
- } else {
- LOGGER.error("Failed to authenticate with the server");
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java b/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java
deleted file mode 100644
index 4102704..0000000
--- a/src/main/java/org/saturnclient/saturnclient/client/ServiceClient.java
+++ /dev/null
@@ -1,205 +0,0 @@
-package org.saturnclient.saturnclient.client;
-
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-import org.saturnclient.cosmetics.cloak.Cloaks;
-import org.saturnclient.cosmetics.hat.Hats;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-
-import dev.kosmx.playerAnim.api.layered.AnimationStack;
-import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess;
-import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationRegistry;
-import dev.selimaj.session.Session;
-import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
-import net.minecraft.client.network.AbstractClientPlayerEntity;
-import net.minecraft.util.Identifier;
-
-public class ServiceClient {
- private static Session session;
- public static UUID uuid;
-
- public static boolean connectTimeout() {
- try {
- session = Session.connect("wss://saturn-server.selimaj.dev", 10, TimeUnit.SECONDS);
- return true;
- } catch (Exception e) {
- return false;
- }
- }
-
- public static boolean authenticate() {
- ClientLifecycleEvents.CLIENT_STOPPING.register(_o -> {
- if (session != null)
- try {
- session.close();
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Unable to close Saturn session");
-
- }
- });
-
- try {
- var mcSession = SaturnClient.client.getSession();
- if (mcSession == null) {
- SaturnClient.LOGGER.error("No active Minecraft session found");
- return false;
- }
-
- String accessToken = mcSession.getAccessToken();
- uuid = mcSession.getUuidOrNull();
- String username = mcSession.getUsername();
-
- SaturnClient.LOGGER.info("Authenticating with UUID: " + uuid);
-
- if (!connectTimeout()) {
- SaturnClient.LOGGER.error("Unable to authenticate: Session Server Timeout");
- return false;
- }
-
- ServiceMethods.Types.Player response = session.request(ServiceMethods.Authenticate, accessToken)
- .get();
-
- for (String availableCloak : response.cloaks()) {
- Cloaks.availableCloaks.add(availableCloak);
- }
-
- for (String availableHat : response.hats()) {
- Hats.availableHats.add(availableHat);
- }
-
- eventHandlers();
-
- SaturnPlayer.set(new SaturnPlayer(uuid, username, response.cloak(), response.hat()));
-
- Cloaks.loadCloak(uuid);
-
- return true;
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Authentication failed", e);
- return false;
- }
- }
-
- public static void setCloak(String itemId) {
- try {
- session.request(ServiceMethods.SetCloak, itemId).whenComplete((msg, throwable) -> {
- if (throwable != null) {
- throwable.printStackTrace();
- } else {
- try {
- session.request(ServiceMethods.SendPlayer,
- new ServiceMethods.Types.SendPlayerRequest(SaturnPlayer.getExternalUUIDAsString()));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to set cloak (service): ", e);
- }
- }
-
- public static void setHat(String itemId) {
- try {
- session.request(ServiceMethods.SetHat, itemId).whenComplete((msg, throwable) -> {
- if (throwable != null) {
- throwable.printStackTrace();
- } else {
- try {
- session.request(ServiceMethods.SendPlayer,
- new ServiceMethods.Types.SendPlayerRequest(SaturnPlayer.getExternalUUIDAsString()));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to set hat (service): ", e);
- }
- }
-
- public static void buyCloak(String itemId) {
- try {
- session.request(ServiceMethods.BuyCloak, itemId).whenComplete((msg, throwable) -> {
- if (throwable != null) {
- throwable.printStackTrace();
- } else {
- Cloaks.availableCloaks.add(itemId);
- }
- });
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to buy cloak (service): ", e);
- }
- }
-
- public static void buyHat(String itemId) {
- try {
- session.request(ServiceMethods.BuyHat, itemId).whenComplete((msg, throwable) -> {
- if (throwable != null) {
- throwable.printStackTrace();
- } else {
- Hats.availableHats.add(itemId);
- }
- });
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to buy hat (service): ", e);
- }
- }
-
- public static void emote(String emote) {
- try {
- session.request(ServiceMethods.Emote,
- new ServiceMethods.Types.EmoteRequest(emote, SaturnPlayer.getExternalUUIDAsString()))
- .whenComplete((msg, throwable) -> {
- if (throwable != null) {
- throwable.printStackTrace();
- }
- });
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to emote (service): ", e);
- }
- }
-
- public static void eventHandlers() {
- session.onNotification(ServiceMethods.EmoteEvent, (data) -> {
- for (AbstractClientPlayerEntity player : SaturnClient.client.world.getPlayers()) {
- if (player.getUuidAsString().equals(data.from())) {
- AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(player);
- if (data.emote() != null && !data.emote().isEmpty()) {
- if (animationStack.isActive() && animationStack.getPriority() == 1000) {
- animationStack.removeLayer(1000);
- }
- animationStack.addAnimLayer(1000,
- PlayerAnimationRegistry
- .getAnimation(Identifier.of("saturnclient", data.emote()))
- .playAnimation());
- } else {
- animationStack.removeLayer(1000);
- }
- }
- }
- });
-
- session.onNotification(ServiceMethods.Player, (player) -> {
- System.out.println(player);
- SaturnPlayer.set(player.toSaturnPlayer());
- });
- }
-
- public static void player(UUID uuid, String name) {
- try {
- session.request(ServiceMethods.GetPlayer, uuid.toString())
- .whenComplete((user, throwable) -> {
- if (throwable != null) {
- throwable.printStackTrace();
- } else if (user != null) {
- SaturnPlayer.set(user.toSaturnPlayer(uuid, name));
- }
- });
- } catch (Exception e) {
- SaturnClient.LOGGER.error("Failed to get player", e);
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/client/ServiceMethods.java b/src/main/java/org/saturnclient/saturnclient/client/ServiceMethods.java
deleted file mode 100644
index 0a09c53..0000000
--- a/src/main/java/org/saturnclient/saturnclient/client/ServiceMethods.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.saturnclient.saturnclient.client;
-
-import java.util.UUID;
-
-import org.saturnclient.saturnclient.client.ServiceMethods.Types.SendPlayerRequest;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-
-import dev.selimaj.session.types.Method;
-
-public class ServiceMethods {
-
- // =========================
- // Types (Rust structs)
- // =========================
- public static class Types {
-
- public record EmoteRequest(String emote, String[] targets) {
- }
-
- public record EmoteEvent(String emote, String from) {
- }
-
- public record Player(
- String cloak,
- String hat,
- String[] cloaks,
- String[] hats) {
- public SaturnPlayer toSaturnPlayer(UUID uuid, String name) {
- return new SaturnPlayer(uuid, name, cloak, hat);
- }
- }
-
- public record PlayerStream(Player player, String name, String uuid) {
- public SaturnPlayer toSaturnPlayer() {
- return new SaturnPlayer(UUID.fromString(uuid), name, this.player.cloak, this.player.hat);
- }
- }
-
- public record SendPlayerRequest(String[] targets) {
- }
- }
-
- // =========================
- // AUTH
- // =========================
- public static final Method Authenticate = new Method<>("auth",
- String.class,
- Types.Player.class,
- String.class);
-
- // =========================
- // EQUIP
- // =========================
- public static final Method SetCloak = new Method<>("set_cloak",
- String.class,
- String.class,
- String.class);
-
- public static final Method SetHat = new Method<>("set_hat",
- String.class,
- String.class,
- String.class);
-
- // =========================
- // BUY
- // =========================
- public static final Method BuyCloak = new Method<>("buy_cloak",
- String.class,
- String.class,
- String.class);
-
- public static final Method BuyHat = new Method<>("buy_hat",
- String.class,
- String.class,
- String.class);
-
- // =========================
- // EMOTE
- // =========================
- public static final Method Emote = new Method<>("emote",
- Types.EmoteRequest.class,
- Void.class,
- String.class);
-
- public static final Method EmoteEvent = new Method<>("emote_event",
- Types.EmoteEvent.class,
- Void.class,
- Void.class);
-
- // =========================
- // GET PLAYER
- // =========================
- public static final Method GetPlayer = new Method<>("get_player",
- String.class,
- Types.Player.class,
- String.class);
-
- // =========================
- // PLAYER (Server Notification)
- // =========================
- public static final Method Player = new Method<>("player",
- Types.PlayerStream.class,
- Void.class,
- Void.class);
-
- // =========================
- // SEND PLAYER
- // =========================
- public static final Method SendPlayer = new Method<>("send_player",
- SendPlayerRequest.class,
- Void.class,
- String.class);
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/saturnclient/client/player/PlayerTracker.java b/src/main/java/org/saturnclient/saturnclient/client/player/PlayerTracker.java
deleted file mode 100644
index f43347f..0000000
--- a/src/main/java/org/saturnclient/saturnclient/client/player/PlayerTracker.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.saturnclient.saturnclient.client.player;
-
-import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
-import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.ServiceClient;
-
-import net.minecraft.client.network.PlayerListEntry;
-import net.minecraft.client.MinecraftClient;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
-
-import com.mojang.authlib.GameProfile;
-
-public class PlayerTracker {
- private static Set trackedPlayers = new HashSet<>();
-
- public static void initialize() {
- // When client joins a server, reset tracked players
- ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
- trackedPlayers.clear();
- client.execute(() -> {
- checkForNewPlayers(SaturnClient.client);
- });
- });
-
- // Check for new players every tick
- ClientTickEvents.END_CLIENT_TICK.register(client -> checkForNewPlayers(client));
- }
-
- private static void checkForNewPlayers(MinecraftClient client) {
- if (client.getNetworkHandler() == null)
- return;
-
- for (PlayerListEntry player : client.getNetworkHandler().getPlayerList()) {
- UUID playerUUID = player.getProfile().getId();
-
- if (!trackedPlayers.contains(playerUUID)) {
- // A new player has joined
- onPlayerJoin(client, player);
- trackedPlayers.add(playerUUID);
- }
- }
- }
-
- private static void onPlayerJoin(MinecraftClient client, PlayerListEntry player) {
- GameProfile profile = player.getProfile();
- ServiceClient.player(profile.getId(), profile.getName());
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/client/player/Roles.java b/src/main/java/org/saturnclient/saturnclient/client/player/Roles.java
deleted file mode 100644
index 219174b..0000000
--- a/src/main/java/org/saturnclient/saturnclient/client/player/Roles.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.saturnclient.saturnclient.client.player;
-
-import java.util.Map;
-import java.util.UUID;
-
-import org.saturnclient.saturnclient.config.Config;
-
-import net.minecraft.util.Formatting;
-
-public class Roles {
- static enum Role {
- OWNER,
- ADMIN,
- PARTNER,
- CONTRIBUTOR
- }
-
- private static final Map ROLES = Map.of(
- UUID.fromString("d362a042-28bd-49e1-a807-ae74dbe8aba9"),
- Role.OWNER,
- UUID.fromString("d8dc7023-179b-4460-bcf6-493fbf1289a6"),
- Role.CONTRIBUTOR);
-
- /*
- * Gets the icon color of a specific individual, here are the different colors
- *
- * - Owner: Dark Red
- * - Admin: Red
- * - Partners: Gold
- * - Contributor: Aqua
- * - Other/player: White
- */
- public static Formatting getIconColor(UUID uuid) {
- Role role = ROLES.get(uuid);
-
- if (role == null) {
- return Formatting.WHITE;
- }
-
- switch (role) {
- case OWNER:
- return Formatting.DARK_RED;
-
- case ADMIN:
- return Formatting.RED;
-
- case PARTNER:
- return Formatting.GOLD;
-
- case CONTRIBUTOR:
- return Formatting.AQUA;
-
- default:
- return Formatting.WHITE;
- }
- }
-
- public static String getSaturnIndicator() {
- return Config.realisticLogo.value ? "" : "";
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/client/player/SaturnPlayer.java b/src/main/java/org/saturnclient/saturnclient/client/player/SaturnPlayer.java
deleted file mode 100644
index f4c935e..0000000
--- a/src/main/java/org/saturnclient/saturnclient/client/player/SaturnPlayer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.saturnclient.saturnclient.client.player;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-import org.jetbrains.annotations.Nullable;
-import org.saturnclient.saturnclient.client.ServiceClient;
-
-public class SaturnPlayer {
- private static Map PLAYERS = new HashMap<>();
- private static Map PLAYER_NAMES = new HashMap<>();
-
- public String cloak = "";
- public String hat = "";
- public final UUID uuid;
- public final String name;
-
- public SaturnPlayer(UUID uuid, String name, String cloak, String hat) {
- this.cloak = cloak;
- this.hat = hat;
- this.uuid = uuid;
- this.name = name;
- }
-
- @Nullable
- public static SaturnPlayer get() {
- return PLAYERS.get(ServiceClient.uuid);
- }
-
- @Nullable
- public static SaturnPlayer get(UUID uuid) {
- return PLAYERS.get(uuid);
- }
-
- @Nullable
- public static SaturnPlayer get(String name) {
- UUID uuid = PLAYER_NAMES.get(name);
- if (uuid == null)
- return null;
- return PLAYERS.get(uuid);
- }
-
- public static void set(SaturnPlayer player) {
- PLAYER_NAMES.put(player.name, player.uuid);
- PLAYERS.put(player.uuid, player);
- }
-
- public static String[] getExternalUUIDAsString() {
- return PLAYERS.keySet().stream().filter(id -> !id.equals(ServiceClient.uuid)).map(UUID::toString)
- .toArray(String[]::new);
- }
-
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/config/AnimationConfig.java b/src/main/java/org/saturnclient/saturnclient/config/AnimationConfig.java
deleted file mode 100644
index 0c76f73..0000000
--- a/src/main/java/org/saturnclient/saturnclient/config/AnimationConfig.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.saturnclient.saturnclient.config;
-
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-public class AnimationConfig {
- public static ConfigManager config;
-
- // Logo
- public static final AnimationConfig logo = new AnimationConfig(true, 700, 0);
-
- // Main menu
- public static final AnimationConfig mainMenu = new AnimationConfig(true, 700, 120);
-
- // Mod menu
- public static final AnimationConfig modMenu = new AnimationConfig(true, 700, 20);
-
- // Shift menu
- public static final AnimationConfig shiftMenu = new AnimationConfig(true, 700, 100);
-
- // Cosmetics menu
- public static final AnimationConfig cosmeticsMenu = new AnimationConfig(true, 700, 40);
-
- // Emote wheel
- public static final AnimationConfig emoteWheel = new AnimationConfig(true, 700, 40);
-
- public static void init(ConfigManager parent) {
- config = new ConfigManager(parent, "Animations");
-
- logo.init("Logo");
- mainMenu.init("Main Menu");
- modMenu.init("Mod Menu");
- shiftMenu.init("Shift Menu");
- cosmeticsMenu.init("Cosmetics Menu");
- emoteWheel.init("Emote Wheel");
- }
-
- // Animation properties
- public final Property duration;
- public final Property stagger;
- public final Property curve;
-
- public AnimationConfig(boolean enabled, int delay, int stagger) {
- this.duration = Property.integer(delay);
- this.stagger = Property.integer(stagger);
- this.curve = Property.select(1, "Ease In Out Cubic", "Ease Out Cubic", "Ease In Out Back");
- }
-
- public void init(String name) {
- // config.property("Enable " + name + " Animations", this.enabled);
- config.property(name + " Duration", this.duration);
- config.property(name + " Stagger", this.stagger);
- config.property(name + " Curve", this.curve);
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/config/Config.java b/src/main/java/org/saturnclient/saturnclient/config/Config.java
deleted file mode 100644
index 109deea..0000000
--- a/src/main/java/org/saturnclient/saturnclient/config/Config.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.saturnclient.saturnclient.config;
-
-import org.lwjgl.glfw.GLFW;
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.resources.Textures;
-
-import net.minecraft.util.Identifier;
-
-public class Config {
- public static ConfigManager config;
-
- public static Property realisticLogo = Property.bool(false);
- public static Property saturnTitleScreen = Property.bool(true);
- public static Property cloakPhysics = Property.bool(true);
- public static Property openEmoteWheel = Property.keybinding(GLFW.GLFW_KEY_B);
- public static Property stagger = Property.bool(true);
-
- public static Identifier getLogo() {
- return realisticLogo.value ? Textures.REALISTIC_LOGO : Textures.LOGO;
- }
-
- public static void init() {
- config = new ConfigManager("Saturn Client");
- config.property("Realistic logo", realisticLogo);
- config.property("Saturn client title screen", saturnTitleScreen);
- config.property("Open Emote Wheel", openEmoteWheel);
- config.property("Cloak Physics", cloakPhysics);
- config.property("Stagger Animations", stagger);
-
- // Initialize a sub namespace for theme
- Theme.init(config);
-
- // Initialize a sub namespace for animations
- AnimationConfig.init(config);
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/config/Theme.java b/src/main/java/org/saturnclient/saturnclient/config/Theme.java
deleted file mode 100644
index 6da4e1a..0000000
--- a/src/main/java/org/saturnclient/saturnclient/config/Theme.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.saturnclient.saturnclient.config;
-
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.config.manager.Property;
-
-public class Theme {
- // Main UI background (slightly warm dark to match Saturn tone)
- public static final Property BACKGROUND = Property.color(0xFF12100D);
-
- // Default text color
- public static final Property FOREGROUND = Property.color(0xFFF2E6D2);
-
- // Widget default background (normal state)
- public static final Property PRIMARY = Property.color(0xFF1C1915);
-
- // Widget text color
- public static final Property PRIMARY_FG = Property.color(0xFFEAD9B8);
-
- // Saturn brand color (hovered / enabled / selected)
- public static final Property ACCENT = Property.color(0xFFE2BF7D);
-
- // Text/icons shown on accent background
- public static final Property ACCENT_FG = Property.color(0xFF1A140A);
-
- // Misc colors
- public static final Property SCROLL = Property.color(0xFFE2BF7D);
-
- // UI metrics
- public static final Property BG_RADIUS = Property.integer(12);
- public static final Property WIDGET_RADIUS = Property.integer(10);
-
- // Font
- public static final Property FONT = Property.font(2);
-
- public static void init(ConfigManager parent) {
- ConfigManager config = new ConfigManager(parent, "UI Style");
- config.property("Background", BACKGROUND);
- config.property("Foreground", FOREGROUND);
- config.property("Primary", PRIMARY);
- config.property("Primary Foreground", PRIMARY_FG);
- config.property("Accent", ACCENT);
- config.property("Accent Foreground", ACCENT_FG);
- config.property("Scrollbar Color", SCROLL);
-
- config.property("Background Radius", BG_RADIUS);
- config.property("Widget Radius", WIDGET_RADIUS);
-
- config.property("Font", FONT);
- }
-
- /**
- * primary by default, accent if true
- */
- public static int getBg(boolean hover) {
- return hover ? ACCENT.value : PRIMARY.value;
- }
-
- /**
- * (Foreground) primary by default, accent if true
- */
- public static int getFg(boolean hover) {
- return hover ? ACCENT_FG.value : PRIMARY_FG.value;
- }
-
- /**
- * Multiplies existing alpha with 0–255 alpha.
- */
- public static int withAlpha(int alpha, int color) {
- alpha = Math.max(0, Math.min(255, alpha));
-
- int originalAlpha = (color >>> 24) & 0xFF;
-
- // Merge (multiply) alphas
- int merged = (originalAlpha * alpha) / 255;
-
- return (color & 0x00FFFFFF) | (merged << 24);
- }
-
- /**
- * Multiplies existing alpha with 0.0–1.0 alpha.
- */
- public static int withAlpha(float alpha, int color) {
- alpha = Math.max(0f, Math.min(1f, alpha));
-
- int originalAlpha = (color >>> 24) & 0xFF;
-
- int merged = (int) (originalAlpha * alpha);
-
- return (color & 0x00FFFFFF) | (merged << 24);
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/config/manager/ConfigManager.java b/src/main/java/org/saturnclient/saturnclient/config/manager/ConfigManager.java
deleted file mode 100644
index 9bdc10d..0000000
--- a/src/main/java/org/saturnclient/saturnclient/config/manager/ConfigManager.java
+++ /dev/null
@@ -1,181 +0,0 @@
-package org.saturnclient.saturnclient.config.manager;
-
-import com.google.gson.*;
-import org.saturnclient.saturnclient.SaturnClient;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-public class ConfigManager {
-
- private static final File configFile = new File(SaturnClient.client.runDirectory, "saturn.json");
-
- // SINGLE ROOT TREE
- private static final Map> ROOT = new LinkedHashMap<>();
-
- private static JsonObject cachedJson = null;
-
- private final Map> currentMap;
-
- private final String[] path;
-
- /**
- * Creates a root namespace
- */
- public ConfigManager(String namespace) {
- this.currentMap = new LinkedHashMap<>();
- this.path = new String[] { namespace }; // Path is just ["namespace"]
- ROOT.put(namespace, Property.namespace(currentMap));
- }
-
- /**
- * Creates a sub-namespace inside a parent
- */
- public ConfigManager(ConfigManager parent, String namespace) {
- this.currentMap = new LinkedHashMap<>();
-
- // Build new path: parent path + current namespace
- this.path = new String[parent.path.length + 1];
- System.arraycopy(parent.path, 0, this.path, 0, parent.path.length);
- this.path[this.path.length - 1] = namespace;
-
- parent.property(namespace, Property.namespace(currentMap));
- }
-
- /**
- * Add a property
- */
- public Property property(String name, Property value) {
- currentMap.put(name, value);
- loadSingleProperty(name, value);
- return value;
- }
-
- /**
- * Add empty namespace
- */
- public ConfigManager sub(String name) {
- return new ConfigManager(this, name);
- }
-
- /**
- * Load entire config
- */
- public static void load() {
- SaturnClient.LOGGER.info("Loading config...");
-
- JsonObject json = loadAndCache();
- if (json == null)
- return;
-
- loadRecursive(json, ROOT);
- }
-
- /**
- * Save entire config
- */
- public static void save() {
- SaturnClient.LOGGER.info("Saving config...");
-
- JsonObject rootJson = new JsonObject();
- saveRecursive(rootJson, ROOT);
-
- try {
- String formatted = new GsonBuilder()
- .setPrettyPrinting()
- .create()
- .toJson(rootJson);
-
- Files.writeString(configFile.toPath(), formatted);
- SaturnClient.LOGGER.info("Config saved successfully.");
- } catch (IOException e) {
- SaturnClient.LOGGER.error("Error saving config file", e);
- }
- }
-
- /**
- * Recursive save
- */
- private static void saveRecursive(JsonObject json, Map> map) {
- map.forEach((name, prop) -> {
- if (prop.isNamespace()) {
- JsonObject child = new JsonObject();
- saveRecursive(child, prop.getNamespaceMap());
- json.add(name, child);
- } else {
- json.add(name, prop.toJson());
- }
- });
- }
-
- /**
- * Recursive load
- */
- private static void loadRecursive(JsonObject json, Map> map) {
- map.forEach((name, prop) -> {
- JsonElement element = json.get(name);
- if (element == null)
- return;
-
- if (prop.isNamespace() && element.isJsonObject()) {
- loadRecursive(element.getAsJsonObject(), prop.getNamespaceMap());
- } else {
- prop.loadFromJson(element);
- }
- });
- }
-
- /**
- * Load only a single property immediately after creation,
- * traversing the JSON tree based on this manager's path.
- */
- private void loadSingleProperty(String name, Property> prop) {
- JsonObject source = cachedJson != null ? cachedJson : loadAndCache();
- if (source == null)
- return;
-
- // Traverse the tree to the correct namespace
- JsonObject currentScope = source;
- for (String segment : path) {
- JsonElement next = currentScope.get(segment);
- if (next != null && next.isJsonObject()) {
- currentScope = next.getAsJsonObject();
- } else {
- return; // Path doesn't exist in config yet
- }
- }
-
- // Now look for the property inside the correctly nested object
- JsonElement element = currentScope.get(name);
- if (element != null) {
- prop.loadFromJson(element);
- }
- }
-
- /**
- * Reads file and caches json
- */
- private static JsonObject loadAndCache() {
- try {
- if (!configFile.exists()) {
- Files.writeString(configFile.toPath(), "{}");
- return new JsonObject();
- }
-
- String json = Files.readString(configFile.toPath());
- cachedJson = JsonParser.parseString(json).getAsJsonObject();
- return cachedJson;
-
- } catch (IOException e) {
- SaturnClient.LOGGER.error("Error reading config file", e);
- return null;
- }
- }
-
- public Map> getProperties() {
- return currentMap;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/saturnclient/config/manager/Property.java b/src/main/java/org/saturnclient/saturnclient/config/manager/Property.java
deleted file mode 100644
index 45ef2b5..0000000
--- a/src/main/java/org/saturnclient/saturnclient/config/manager/Property.java
+++ /dev/null
@@ -1,298 +0,0 @@
-package org.saturnclient.saturnclient.config.manager;
-
-import java.util.Map;
-
-import org.lwjgl.glfw.GLFW;
-import org.saturnclient.saturnclient.SaturnClient;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonPrimitive;
-
-public class Property {
- public static class NamedProperty {
- public String name;
- public Property prop;
-
- public NamedProperty(String name, Property value) {
- this.name = name;
- this.prop = value;
- }
- }
-
- public enum PropertyType {
- BOOLEAN,
- INTEGER,
- FLOAT,
- STRING,
- HEX,
- NAMESPACE,
- SELECT,
- KEYBINDING,
- }
-
- public T value;
- public boolean isReset = false;
- private T defaultValue;
- private String[] availableValues;
- private final PropertyType type;
- private boolean wasPressedLastTick = false;
-
- private Property(T value, PropertyType type) {
- this.value = value;
- this.defaultValue = value;
- this.type = type;
- }
-
- // ---------- Factory Methods ----------
- public static Property from(T value) {
- if (value instanceof Boolean)
- return new Property<>(value, PropertyType.BOOLEAN);
- if (value instanceof Integer)
- return new Property<>(value, PropertyType.INTEGER);
- if (value instanceof Float)
- return new Property<>(value, PropertyType.FLOAT);
- if (value instanceof String)
- return new Property<>(value, PropertyType.STRING);
- if (valueIsNamespace(value))
- return new Property<>(value, PropertyType.NAMESPACE);
- return null;
- }
-
- public static Property font(int value) {
- return select(value, "Default", "Inter", "Inter bold");
- }
-
- public static Property select(Integer value, String... availableValues) {
- Property property = new Property<>(value, PropertyType.SELECT);
- property.availableValues = availableValues;
- return property;
- }
-
- public static Property>> namespace(Map> value) {
- return new Property<>(value, PropertyType.NAMESPACE);
- }
-
- public static Property bool(boolean value) {
- return new Property<>(value, PropertyType.BOOLEAN);
- }
-
- public static Property integer(int value) {
- return new Property<>(value, PropertyType.INTEGER);
- }
-
- public static Property floatProp(float value) {
- return new Property<>(value, PropertyType.FLOAT);
- }
-
- public static Property string(String value) {
- return new Property<>(value, PropertyType.STRING);
- }
-
- public static Property color(int value) {
- return new Property<>(value, PropertyType.HEX);
- }
-
- public static Property keybinding(int value) {
- return new Property<>(value, PropertyType.KEYBINDING);
- }
-
- // ---------- Select Helpers ----------
- public void next() {
- if (type == PropertyType.SELECT) {
- int i = (Integer) value;
- setValue((i < availableValues.length - 1) ? i + 1 : 0);
- }
- }
-
- public void prev() {
- if (type == PropertyType.SELECT) {
- int i = (Integer) value;
- setValue((i > 0) ? i - 1 : availableValues.length - 1);
- }
- }
-
- public void setSelection(int selection) {
- if (type == PropertyType.SELECT && selection >= 0 && selection < availableValues.length) {
- setValue(selection);
- }
- }
-
- public String getSelection() {
- return (type == PropertyType.SELECT) ? availableValues[(Integer) value] : null;
- }
-
- // ---------- Lifecycle ----------
- public void reset() {
- value = defaultValue;
- isReset = true;
- }
-
- public PropertyType getType() {
- return type;
- }
-
- @SuppressWarnings("unchecked")
- public Map> getNamespaceValue() {
- if (type == PropertyType.NAMESPACE && value instanceof Map) {
- return (Map>) value;
- }
- throw new IllegalStateException("Property is not a namespace");
- }
-
- // ---------- JSON Serialization ----------
- /*
- * BOOLEAN,
- * INTEGER,
- * FLOAT,
- * STRING,
- * HEX,
- * NAMESPACE,
- * SELECT,
- * KEYBINDING,
- */
- public JsonElement toJson() {
- switch (type) {
- case BOOLEAN:
- return new JsonPrimitive((Boolean) value);
- case INTEGER:
- return new JsonPrimitive((Integer) value);
- case FLOAT:
- return new JsonPrimitive((Float) value);
- case NAMESPACE:
- JsonObject nested = new JsonObject();
- getNamespaceValue().forEach((k, v) -> nested.add(k, v.toJson()));
- return nested;
- case HEX:
- return new JsonPrimitive(String.format("#%08X", (Integer) value));
- case KEYBINDING:
- return new JsonPrimitive((Integer) value);
- case SELECT:
- return new JsonPrimitive((Integer) value);
- default:
- return new JsonPrimitive(String.valueOf(value));
- }
- }
-
- public void loadFromJson(JsonElement element) {
- if (element == null)
- return;
-
- switch (type) {
- case BOOLEAN:
- if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isBoolean())
- setValue(element.getAsBoolean());
- break;
- case INTEGER:
- if (element.isJsonPrimitive()) {
- JsonPrimitive p = element.getAsJsonPrimitive();
- if (p.isNumber())
- setValue(p.getAsInt());
- else if (p.isString())
- setValue(parseHexToInt(p.getAsString()));
- }
- break;
- case FLOAT:
- if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber())
- setValue(element.getAsFloat());
- break;
- case STRING:
- if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isString())
- setValue(element.getAsString());
- break;
- case HEX:
- if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isString())
- setValue(parseHexToInt(element.getAsString()));
- break;
- case NAMESPACE:
- if (element.isJsonObject()) {
- JsonObject obj = element.getAsJsonObject();
- getNamespaceValue().forEach((k, v) -> v.loadFromJson(obj.get(k)));
- }
- break;
- case SELECT:
- if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber())
- setSelection(element.getAsInt());
- break;
- case KEYBINDING:
- if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber())
- setValue(element.getAsInt());
- break;
- }
- }
-
- // ---------- Utility ----------
- @Override
- public String toString() {
- return String.valueOf(value);
- }
-
- public static boolean valueIsNamespace(Object obj) {
- return obj instanceof Map;
- }
-
- @SuppressWarnings("unchecked")
- public void setValue(Object value) {
- this.value = (T) value;
- }
-
- @SuppressWarnings("unchecked")
- public void setValue(Object value, Object defaultValue) {
- this.value = (T) value;
- this.defaultValue = (T) defaultValue;
- }
-
- public NamedProperty named(String name) {
- return new NamedProperty<>(name, this);
- }
-
- // ---------- Keybindings ----------
- public boolean isKeyPressed() {
- return (Integer) value != -1 &&
- GLFW.glfwGetKey(SaturnClient.client.getWindow().getHandle(), (Integer) value) == GLFW.GLFW_PRESS &&
- SaturnClient.client.currentScreen == null;
- }
-
- public boolean wasKeyPressed() {
- boolean pressed = isKeyPressed();
- boolean result = pressed && !wasPressedLastTick;
- wasPressedLastTick = pressed;
- return result;
- }
-
- // ---------- HEX ----------
- public static int parseHexToInt(String hex) {
- hex = hex.replace("#", "");
- if (hex.length() == 6)
- hex = "FF" + hex;
- if (hex.length() != 8)
- throw new IllegalArgumentException("Hex must be 6 or 8 chars long, got \'" + hex + "\'");
- return (int) Long.parseLong(hex, 16);
- }
-
- // Misc
- public Property copy() {
- return new Property<>(this.value, this.type);
- }
-
- public void load(String name, JsonElement element) {
- if (element != null && element.isJsonObject()) {
- load(name, element.getAsJsonObject());
- }
- }
-
- public void load(String name, JsonObject element) {
- JsonElement value = element.get(name);
- if (value != null)
- this.loadFromJson(value);
- }
-
- public boolean isNamespace() {
- return type == PropertyType.NAMESPACE;
- }
-
- @SuppressWarnings("unchecked")
- public Map> getNamespaceMap() {
- return isNamespace() ? (Map>) (Object) value : null;
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java b/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java
deleted file mode 100644
index 2a3e970..0000000
--- a/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.saturnclient.saturnclient.event;
-
-import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
-import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
-import net.minecraft.client.option.KeyBinding;
-import net.minecraft.client.util.InputUtil;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.ServiceClient;
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.ui2.screens.EmoteWheel;
-import org.saturnclient.ui2.screens.ShiftMenu;
-
-import dev.kosmx.playerAnim.api.layered.AnimationStack;
-import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess;
-
-import org.lwjgl.glfw.GLFW;
-
-/**
- * Handles keyboard input events for the Saturn Client.
- * Manages keybindings and their associated actions.
- */
-public class KeyInputHandler {
- private static final String KEY_CATEGORY = "key.category.saturnclient";
- private static final String MAIN_MENU_KEY_ID = "key.saturnclient.main_menu";
- private static final int DEFAULT_MENU_KEY = GLFW.GLFW_KEY_RIGHT_SHIFT;
- private static KeyBinding mainMenuKeyBinding;
-
- public static void register() {
- mainMenuKeyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding(
- MAIN_MENU_KEY_ID,
- InputUtil.Type.KEYSYM,
- DEFAULT_MENU_KEY,
- KEY_CATEGORY));
-
- // Register the event handler for the main menu key
- ClientTickEvents.END_CLIENT_TICK.register(client -> {
- if (mainMenuKeyBinding.wasPressed()) {
- client.setScreen(new ShiftMenu());
- }
-
- if (Config.openEmoteWheel.wasKeyPressed() && client.currentScreen == null && !InputUtil.isKeyPressed(client.getWindow().getHandle(), GLFW.GLFW_KEY_F3)) {
- client.setScreen(new EmoteWheel());
- }
-
- if (SaturnClient.client.player != null && SaturnClient.client.player.isSneaking()) {
- AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(SaturnClient.client.player);
- if (animationStack.isActive() && animationStack.getPriority() == 1000) {
- animationStack.removeLayer(1000);
- ServiceClient.emote("");
- }
- }
- });
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java b/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java
deleted file mode 100644
index 5e8e214..0000000
--- a/src/main/java/org/saturnclient/saturnclient/menus/HudEditor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package org.saturnclient.saturnclient.menus;
-
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.text.Text;
-
-import org.saturnclient.modules.HudMod;
-import org.saturnclient.modules.ModDimensions;
-import org.saturnclient.modules.ModManager;
-import org.saturnclient.modules.Module;
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.SaturnScreen;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class HudEditor extends Screen {
- private final List hudMods = new ArrayList<>();
- private HudMod draggingMod = null;
- private boolean resizing = false;
- private int offsetX, offsetY;
- private static final int RESIZE_MARGIN = 3;
-
- public HudEditor() {
- super(Text.literal("HUD Editor"));
- for (Module m : ModManager.ENABLED_MODS) {
- if (m.isEnabled() && m instanceof HudMod) {
- hudMods.add((HudMod) m);
- }
- }
- }
-
- @Override
- public boolean mouseClicked(double mouseX, double mouseY, int button) {
- if (button == 0) {
- for (int m = hudMods.size() - 1; m >= 0; m--) {
- HudMod mod = hudMods.get(m);
- ModDimensions dim = mod.getDimensions();
-
- // Check if clicking the corner for resizing
- if (isCorner(mouseX, mouseY, dim)) {
- draggingMod = mod;
- resizing = true;
- offsetX = (int) (mouseX - (dim.x.value + dim.width * dim.scale.value));
- offsetY = (int) (mouseY - (dim.y.value + dim.height * dim.scale.value));
- return true;
- }
-
- // Check if clicking inside the mod
- if (isInside(mouseX, mouseY, dim)) {
- draggingMod = mod;
- resizing = false;
- offsetX = (int) (mouseX - dim.x.value);
- offsetY = (int) (mouseY - dim.y.value);
- return true;
- }
- }
- }
- return super.mouseClicked(mouseX, mouseY, button);
- }
-
- @Override
- public boolean mouseReleased(double mouseX, double mouseY, int button) {
- if (button == 0) {
- draggingMod = null;
- resizing = false;
- }
- return super.mouseReleased(mouseX, mouseY, button);
- }
-
- @Override
- public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
- if (draggingMod != null) {
- ModDimensions dim = draggingMod.getDimensions();
-
- if (resizing) {
- // Scale based on cursor movement
- float newScale = Math.max(0.5f, ((float) (mouseX - dim.x.value) / dim.width));
- dim.scale.value = newScale;
- } else {
- // Move the mod
- dim.x.value = (int) mouseX - offsetX;
- dim.y.value = (int) mouseY - offsetY;
- }
- }
- return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
- }
-
- @Override
- public void render(DrawContext context, int mouseX, int mouseY, float delta) {
- if (client.world == null && client.getCurrentServerEntry() == null) {
- SaturnScreen.ROTATING_PANORAMA_RENDERER.render(context, this.width, this.height, 1.0F, delta);
- }
-
- RenderScope scope = new RenderScope(context.getMatrices(), ((DrawContextAccessor) context).getVertexConsumers());
-
- for (HudMod mod : hudMods) {
- ModDimensions dim = mod.getDimensions();
- MatrixStack matrices = context.getMatrices();
- matrices.push();
-
- matrices.translate(dim.x.value, dim.y.value, 0);
- matrices.scale(dim.scale.value, dim.scale.value, 1.0f);
-
- // Render the mod
- mod.renderDummy(scope);
-
- matrices.pop();
-
- // Draw border around mod
- int borderX = dim.x.value;
- int borderY = dim.y.value;
- int borderW = (int) (dim.width * dim.scale.value);
- int borderH = (int) (dim.height * dim.scale.value);
-
- context.drawBorder(borderX, borderY, borderW, borderH, 0xFFFFFFFF); // White border
- }
- }
-
- private boolean isInside(double mouseX, double mouseY, ModDimensions dim) {
- return mouseX >= dim.x.value && mouseX <= dim.x.value + (dim.width * dim.scale.value) &&
- mouseY >= dim.y.value && mouseY <= dim.y.value + (dim.height * dim.scale.value);
- }
-
- private boolean isCorner(double mouseX, double mouseY, ModDimensions dim) {
- float rightX = dim.x.value + dim.width * dim.scale.value;
- float bottomY = dim.y.value + dim.height * dim.scale.value;
-
- return Math.abs(mouseX - rightX) < RESIZE_MARGIN && Math.abs(mouseY - bottomY) < RESIZE_MARGIN;
- }
-
- @Override
- public void close() {
- ConfigManager.save();
- super.close();
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java b/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java
deleted file mode 100644
index f049e40..0000000
--- a/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.saturnclient.saturnclient.mixin;
-
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.render.VertexConsumerProvider;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(DrawContext.class)
-public interface DrawContextAccessor {
- @Accessor("vertexConsumers")
- VertexConsumerProvider.Immediate getVertexConsumers();
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java
deleted file mode 100644
index 6cb2d0b..0000000
--- a/src/main/java/org/saturnclient/saturnclient/mixin/NameTagMixin.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.saturnclient.saturnclient.mixin;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.font.TextRenderer.TextLayerType;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.entity.EntityRenderDispatcher;
-import net.minecraft.client.render.entity.EntityRenderer;
-import net.minecraft.client.render.entity.state.EntityRenderState;
-import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.text.MutableText;
-import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
-import net.minecraft.util.math.Vec3d;
-
-import org.saturnclient.saturnclient.client.player.Roles;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-
-import java.util.UUID;
-
-import org.joml.Matrix4f;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import org.spongepowered.asm.mixin.Shadow;
-
-@Mixin(value = EntityRenderer.class, priority = 1800)
-public abstract class NameTagMixin {
- @Shadow
- public EntityRenderDispatcher dispatcher;
-
- /**
- * @author HexLeo
- * @reason Adds the Saturn Client icon to the player's name if they are online
- * with Saturn Client
- */
- @Inject(method = "renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", at = @At("HEAD"), cancellable = true)
- private void onRenderLabelIfPresent(S state, Text text, MatrixStack matrices,
- VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) {
-
- UUID uuid = isSaturn(state);
-
- if (uuid != null) {
- MutableText iconText = Text.literal(Roles.getSaturnIndicator())
- .styled(style -> style.withColor(Roles.getIconColor(uuid)));
-
- Text nameText = text.copy().styled(style -> style.withColor(Formatting.WHITE));
-
- renderLabel(state, iconText.append(nameText), matrices,
- vertexConsumers, light);
-
- ci.cancel();
- }
- }
-
- private UUID isSaturn(S state) {
- if (state instanceof PlayerEntityRenderState) {
- String name = ((PlayerEntityRenderState) state).name;
- SaturnPlayer player = SaturnPlayer.get(name);
- if (player != null) {
- return player.uuid;
- }
- }
-
- return null;
- }
-
- private void renderLabel(S state, Text text, MatrixStack matrices,
- VertexConsumerProvider vertexConsumers, int light) {
- Vec3d vec3d = state.nameLabelPos;
- if (vec3d != null) {
- boolean bl = !state.sneaking;
- int i = "deadmau5".equals(text.getString()) ? -10 : 0;
- matrices.push();
- matrices.translate(vec3d.x, vec3d.y + 0.5, vec3d.z);
- matrices.multiply(this.dispatcher.getRotation());
- matrices.scale(0.025F, -0.025F, 0.025F);
- Matrix4f matrix4f = matrices.peek().getPositionMatrix();
- TextRenderer textRenderer = SaturnClient.client.textRenderer;
- float f = (float) (-textRenderer.getWidth(text)) / 2.0F;
- int j = (int) (SaturnClient.client.options.getTextBackgroundOpacity(0.25F) * 255.0F) << 24;
- textRenderer.draw(text, f, (float) i, -2130706433, false, matrix4f, vertexConsumers,
- bl ? TextLayerType.SEE_THROUGH : TextLayerType.NORMAL, j, light);
- if (bl) {
- textRenderer.draw(text, f, (float) i, -1, false, matrix4f, vertexConsumers, TextLayerType.NORMAL, 0,
- light);
- }
- matrices.pop();
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java
deleted file mode 100644
index 5a9228e..0000000
--- a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.saturnclient.saturnclient.mixin;
-
-import net.minecraft.client.render.entity.EntityRendererFactory;
-import net.minecraft.client.render.entity.LivingEntityRenderer;
-import net.minecraft.client.render.entity.PlayerEntityRenderer;
-import net.minecraft.client.render.entity.model.PlayerEntityModel;
-import net.minecraft.client.render.entity.state.PlayerEntityRenderState;
-import net.minecraft.entity.player.PlayerEntity;
-
-import org.saturnclient.cosmetics.cloak.CloakFeatureRenderer;
-import org.saturnclient.cosmetics.hat.HatFeatureRenderer;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.Inject;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-@Mixin(PlayerEntityRenderer.class)
-public abstract class PlayerEntityRendererMixin
- extends LivingEntityRenderer {
-
- protected PlayerEntityRendererMixin() {
- super(null, null, 0.0f);
- }
-
- @Inject(method = "", at = @At("TAIL"))
- private void addCustomFeatureRenderer(EntityRendererFactory.Context ctx, boolean slim, CallbackInfo ci) {
- this.addFeature(new HatFeatureRenderer(this));
- this.addFeature(new CloakFeatureRenderer(this, ctx.getEquipmentModelLoader()));
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java
deleted file mode 100644
index e549083..0000000
--- a/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.saturnclient.saturnclient.mixin;
-
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.ui2.screens.TitleMenu;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-import org.spongepowered.asm.mixin.injection.ModifyVariable;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.screen.TitleScreen;
-
-@Mixin(MinecraftClient.class)
-public class SetScreenMixin {
- @ModifyVariable(method = "setScreen", at = @At("HEAD"), argsOnly = true)
- private Screen replaceTitleScreen(Screen screen) {
- if (Config.saturnTitleScreen.value) {
- if (screen instanceof TitleScreen)
- return new TitleMenu();
- if (screen == null && ((MinecraftClient) (Object) this).world == null)
- return new TitleMenu();
- }
-
- return screen;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java
deleted file mode 100644
index 912fa5c..0000000
--- a/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package org.saturnclient.saturnclient.mixin;
-
-import java.util.Optional;
-import java.util.function.Consumer;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Textures;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Overwrite;
-import org.spongepowered.asm.mixin.Shadow;
-import org.spongepowered.asm.mixin.Final;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.screen.SplashOverlay;
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.resource.ResourceReload;
-import net.minecraft.util.Util;
-import net.minecraft.util.math.MathHelper;
-
-@Mixin(SplashOverlay.class)
-public abstract class SplashOverlayMixin {
-
- @Shadow
- private MinecraftClient client;
- @Shadow
- private ResourceReload reload;
-
- @Shadow
- private long reloadCompleteTime;
-
- @Shadow
- private long reloadStartTime;
-
- @Shadow @Final
- private boolean reloading;
-
- @Shadow @Final
- private Consumer> exceptionHandler;
-
- @Shadow
- private float progress;
-
- /**
- * @author SaturnClient
- * @reason Replace vanilla splash rendering completely but keep exit logic
- */
- @Overwrite
- public void render(DrawContext context, int mouseX, int mouseY, float delta) {
- int screenWidth = context.getScaledWindowWidth();
- int screenHeight = context.getScaledWindowHeight();
- long currentTime = Util.getMeasuringTimeMs();
-
- // Initialize reload start time if not set
- if (reloadStartTime == -1L) {
- reloadStartTime = currentTime;
- }
-
- // Compute fade-out progress after reload completes
- float fadeOutProgress = reloadCompleteTime > -1L
- ? (float) (currentTime - reloadCompleteTime) / 1000f
- : -1f;
-
- int alpha = fadeOutProgress >= 0f
- ? MathHelper.ceil((1.0f - MathHelper.clamp(fadeOutProgress - 1f, 0f, 1f)) * 255f)
- : 255;
-
- // Compute fade-in progress while reloading
- float reloadProgress = reloadStartTime > -1L
- ? (float) (currentTime - reloadStartTime) / 500f
- : -1f;
-
- // Get render scope for better UI
- RenderScope scope = new RenderScope(context);
- scope.setRenderLayer(RenderLayer::getGuiTextured);
-
- // Draw background overlay
- if (fadeOutProgress >= 1.0F) {
- renderCurrentScreen(context, mouseX, mouseY, delta);
- int overlayAlpha = computeOverlayAlpha(fadeOutProgress - 1f);
- scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight,
- Theme.withAlpha(overlayAlpha, 0xFFFFFFFF));
- } else if (reloading) {
- if (reloadProgress < 1.0F) {
- renderCurrentScreen(context, mouseX, mouseY, delta);
- }
- scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight,
- Theme.withAlpha(alpha, 0xFFFFFFFF));
- } else {
- scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight,
- Theme.withAlpha(alpha, 0xFFFFFFFF));
- }
-
- float u = this.reload.getProgress();
- this.progress = MathHelper.clamp(this.progress * 0.95F + u * 0.050000012F, 0.0F, 1.0F);
-
- // Draw central logo
- drawLogo(scope, screenWidth, screenHeight, alpha);
- renderProgressBar(scope, context, screenWidth, screenHeight, alpha);
-
- // Remove overlay after fade-out completes
- if (fadeOutProgress >= 2.0F) {
- client.setOverlay(null);
- }
-
- // Handle reload completion and exceptions
- handleReloadCompletion(context);
- }
-
- private void renderCurrentScreen(DrawContext context, int mouseX, int mouseY, float delta) {
- if (client.currentScreen != null) {
- client.currentScreen.render(context, mouseX, mouseY, delta);
- }
- }
-
- /** Draw the main logo centered */
- private void drawLogo(RenderScope scope, int screenWidth, int screenHeight, int alpha) {
- scope.drawTexture(Textures.LOGO, (screenWidth - 60) / 2, ((screenHeight - 60) / 2) - 20, 0, 0, 60, 60,
- Theme.withAlpha(alpha, 0xFFFFFFFF));
- }
-
- private void renderProgressBar(RenderScope scope, DrawContext context, int screenWidth, int screenHeight,
- int alpha) {
- int progressY = ((screenHeight - 5) / 2) + 25;
- context.drawBorder((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(alpha, 0xFFFFFFFF));
-
- int progressWidth = Math.min((int) (progress * 120), 120);
- int progressX = (screenWidth - 120) / 2;
-
- context.fill(progressX, progressY, progressX + progressWidth, progressY + 5,
- Theme.withAlpha(alpha, 0xFFFFFFFF));
- }
-
- /** Compute overlay alpha from fade progress */
- private int computeOverlayAlpha(float progress) {
- return MathHelper.ceil((1.0F - MathHelper.clamp(progress, 0.0F, 1.0F)) * 255.0F);
- }
-
- /** Handle reload completion logic */
- private void handleReloadCompletion(DrawContext context) {
- float reloadProgress = reloadStartTime > -1L ? (float) (Util.getMeasuringTimeMs() - reloadStartTime) / 500f
- : -1f;
-
- if (reloadCompleteTime == -1L && reload.isComplete() && (!reloading || reloadProgress >= 2.0F)) {
- try {
- reload.throwException();
- exceptionHandler.accept(Optional.empty());
- } catch (Throwable ex) {
- exceptionHandler.accept(Optional.of(ex));
- }
-
- reloadCompleteTime = Util.getMeasuringTimeMs();
-
- if (client.currentScreen != null) {
- client.currentScreen.init(client, context.getScaledWindowWidth(), context.getScaledWindowHeight());
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java
deleted file mode 100644
index e830a3e..0000000
--- a/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.saturnclient.saturnclient.mixin;
-
-import net.minecraft.client.network.PlayerListEntry;
-import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
-
-import java.util.UUID;
-
-import org.jetbrains.annotations.Nullable;
-import org.saturnclient.saturnclient.client.player.Roles;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.Overwrite;
-import org.spongepowered.asm.mixin.Shadow;
-
-import com.mojang.authlib.GameProfile;
-
-@Mixin(PlayerListEntry.class)
-public abstract class TabListMixin {
-
- @Shadow
- private GameProfile profile;
-
- /**
- * @author HexLeo
- * @reason Adds the Saturn Client icon to the player's name if they are online
- * with Saturn Client
- */
- @Overwrite
- @Nullable
- public Text getDisplayName() {
- GameProfile profile = ((PlayerListEntry) (Object) this).getProfile();
- String name = profile.getName();
- UUID uuid = profile.getId();
-
- if (SaturnPlayer.get(uuid) != null) {
- return Text.literal(Roles.getSaturnIndicator())
- .styled(style -> style.withColor(Roles.getIconColor(uuid)))
- .append(Text.literal(name).styled(style -> style.withColor(Formatting.WHITE)));
- }
- return Text.literal(name);
- }
-}
diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java b/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java
deleted file mode 100644
index 041e0cf..0000000
--- a/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at https://mozilla.org/MPL/2.0/.
- */
-
-/*
- * Original code from FokshaWasTaken (GitHub),
- * Repository: https://github.com/FokshaWasTaken/who-am-i/
-*/
-
-package org.saturnclient.saturnclient.mixin;
-
-import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
-import net.minecraft.client.render.entity.LivingEntityRenderer;
-import net.minecraft.entity.Entity;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.injection.At;
-
-@Mixin(LivingEntityRenderer.class)
-public class WhoAmI {
- @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;D)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;getCameraEntity()Lnet/minecraft/entity/Entity;"))
- public Entity obfuscateCameraEntity(Entity original) {
- // hasLabel checks if the rendered entity is equal to the camera entity (aka our
- // player),
- // so by setting the camera entity to null in this instance makes the check
- // always succeed
- // this also allows to keep the other checks in mojang's code, such as checking
- // if the hud is enabled etc.
- return null;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/ui2/Element.java b/src/main/java/org/saturnclient/ui2/Element.java
deleted file mode 100644
index 49e8a16..0000000
--- a/src/main/java/org/saturnclient/ui2/Element.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.saturnclient.ui2;
-
-import org.saturnclient.ui2.anim.Animation;
-
-public class Element {
- public int x;
- public int y;
- public int width;
- public int height;
- public float opacity = 1.0f;
- public boolean focused;
- public Animation animation;
- public float scale = 1.0f;
- public Integer duration = null; // Element duration, will fade out if not null
-
- public void render(RenderScope renderScope, ElementContext ctx) {
- }
-
- public void click(int mouseX, int mouseY) {
- }
-
- public void scroll(int mouseX, int mouseY, double horizontalAmount, double verticalAmount) {
- }
-
- public void keyPressed(int keyCode, int scanCode, int modifiers) {
- }
-
- public void charTyped(char typedChar) {
- }
-
- public void mouseClicked(double mouseX, double mouseY, int button) {
- }
-
- public void mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
- }
-
- public void mouseReleased(double mouseX, double mouseY, int button) {
- }
-
- public void playAnimationFrame(long elapsed) {
- if (this.animation != null && elapsed >= this.animation.delay) {
- this.animation.tick(this.animation.curve
- .apply(Math.min(1.0, (double) (elapsed - this.animation.delay) / this.animation.duration)), this);
- }
- }
-
- public Element dimensions(int width, int height) {
- this.width = width;
- this.height = height;
-
- return this;
- }
-
- public Element position(int x, int y) {
- this.x = x;
- this.y = y;
-
- return this;
- }
-
- public Element centerHorizontal(int w, int h, int offsetX, int offsetY) {
- this.x = (w - (int) (width * scale)) / 2 + offsetX;
- this.y = offsetY;
-
- return this;
- }
-
- public Element center(int w, int h) {
- this.centerOffset(w, h, 0, 0);
- return this;
- }
-
- public Element centerOffset(int w, int h, int offsetX, int offsetY) {
- this.x = (w - (int) (width * scale)) / 2 + offsetX;
- this.y = (h - (int) (height * scale)) / 2 + offsetY;
-
- return this;
- }
-
- public Element animation(Animation animation) {
- this.animation = animation;
- return this;
- }
-
- public Element scale(float scale) {
- this.scale = scale;
- return this;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/ElementContext.java b/src/main/java/org/saturnclient/ui2/ElementContext.java
deleted file mode 100644
index def84dd..0000000
--- a/src/main/java/org/saturnclient/ui2/ElementContext.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.saturnclient.ui2;
-
-public class ElementContext {
- public int mouseX, mouseY;
- public int elementWidth, elementHeight;
- public float elementScale;
- public long elapsed;
-
- public ElementContext(long elapsed, int mouseX, int mouseY, Element e) {
- this.mouseX = mouseX - e.x;
- this.mouseY = mouseY - e.y;
- this.elementWidth = e.width;
- this.elementHeight = e.height;
- this.elementScale = e.scale;
- this.elapsed = elapsed;
- }
-
- public boolean isHovering() {
- return Utils.isHovering(mouseX, mouseY, elementWidth, elementHeight, elementScale);
- }
-
- public boolean isHovering(int x, int y, int width, int height) {
- return Utils.isHovering(mouseX - x, mouseY - y, width, height, elementScale);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/RenderScope.java b/src/main/java/org/saturnclient/ui2/RenderScope.java
deleted file mode 100644
index 1f846e6..0000000
--- a/src/main/java/org/saturnclient/ui2/RenderScope.java
+++ /dev/null
@@ -1,450 +0,0 @@
-package org.saturnclient.ui2;
-
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.Objects;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-import org.jetbrains.annotations.Nullable;
-import org.joml.Matrix4f;
-import org.saturnclient.ui2.resources.Fonts;
-import org.saturnclient.ui2.resources.SvgTexture;
-
-import com.mojang.blaze3d.systems.RenderSystem;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.font.TextRenderer;
-import net.minecraft.client.font.TextRenderer.TextLayerType;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.ScreenRect;
-import net.minecraft.client.render.DiffuseLighting;
-import net.minecraft.client.render.OverlayTexture;
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.client.render.VertexConsumer;
-import net.minecraft.client.render.VertexConsumerProvider;
-import net.minecraft.client.render.item.ItemRenderState;
-import net.minecraft.client.texture.Sprite;
-import net.minecraft.client.util.Window;
-import net.minecraft.client.util.math.MatrixStack;
-import net.minecraft.entity.LivingEntity;
-import net.minecraft.item.ItemStack;
-import net.minecraft.item.ModelTransformationMode;
-import net.minecraft.util.Identifier;
-import net.minecraft.util.crash.CrashException;
-import net.minecraft.util.crash.CrashReport;
-import net.minecraft.util.crash.CrashReportSection;
-import net.minecraft.util.math.RotationAxis;
-import net.minecraft.world.World;
-
-public class RenderScope {
- public MatrixStack matrices;
- public VertexConsumerProvider.Immediate vertexConsumers;
- // private Function renderLayers;
- private ScissorStack scissorStack = new ScissorStack();
- private int opacity = 255 << 24;
- private final ItemRenderState itemRenderState;
-
- public RenderScope(DrawContext context) {
- this(context.getMatrices(), ((DrawContextAccessor) context).getVertexConsumers());
- }
-
- public RenderScope(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers) {
- this.matrices = matrices;
- this.vertexConsumers = vertexConsumers;
- this.scissorStack = new ScissorStack();
- this.itemRenderState = new ItemRenderState();
- }
-
- public void setOpacity(float alpha) {
- this.opacity = (int) (alpha * 255) << 24;
- }
-
- public int getColor(int color) {
- int originalAlpha = (color >>> 24) & 0xFF;
- int newAlpha = (opacity >>> 24) & 0xFF;
- int mixedAlpha = (originalAlpha * newAlpha) / 255;
- return (mixedAlpha << 24) | (color & 0x00FFFFFF);
- }
-
- public void setRenderLayer(Function renderLayers) {
- // this.renderLayers = renderLayers;
- }
-
- public void drawRect(int x, int y, int width, int height, int color) {
- if (color == 0)
- return;
- color = getColor(color);
- Matrix4f matrix4f = this.matrices.peek().getPositionMatrix();
-
- int x1 = x;
- int x2 = x + width;
- int y1 = y;
- int y2 = y + height;
-
- int i;
- if (x1 < x2) {
- i = x1;
- x1 = x2;
- x2 = i;
- }
-
- if (y1 < y2) {
- i = y1;
- y1 = y2;
- y2 = i;
- }
-
- VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(RenderLayer.getGui());
- vertexConsumer.vertex(matrix4f, (float) x1, (float) y1, 0).color(color);
- vertexConsumer.vertex(matrix4f, (float) x1, (float) y2, 0).color(color);
- vertexConsumer.vertex(matrix4f, (float) x2, (float) y2, 0).color(color);
- vertexConsumer.vertex(matrix4f, (float) x2, (float) y1, 0).color(color);
- }
-
- public void drawText(String text, int x, int y, int font, int color) {
- drawText(1.0f, text, x, y, font, color);
- }
-
- public void drawText(float scale, String text, int x, int y, int font, int color) {
- if (color == 0)
- return;
- if (font == 0) {
- scale *= 2;
- }
- int i = 0;
- for (String line : text.split("\n")) {
- color = getColor(color);
- matrices.push();
- matrices.translate(x, y + (i * Fonts.getHeight()), 0);
- matrices.scale(scale, scale, 1.0f);
- TextRenderer textRenderer = SaturnClient.client.textRenderer;
- textRenderer.draw(Fonts.setFont(line, Fonts.getFont(font)), 0, font == 0 ? 1 : 7, color, false,
- this.matrices.peek().getPositionMatrix(),
- this.vertexConsumers, TextLayerType.NORMAL, 0, 15728880);
- matrices.pop();
- i++;
- }
- }
-
- private void drawRoundedCorner(int width, int height, int radius, int color) {
- int w = width * 20;
- int h = height * 20;
-
- for (int y = 0; y < h; y++) {
- int startX = 0;
-
- if (y < radius) {
- double dy = radius - y - 0.5;
- double dx = Math.sqrt(Math.max(0, radius * radius - dy * dy));
- startX = radius - (int) dx;
- }
-
- this.drawRect(startX, y, w - startX, 1, color);
- }
- }
-
- private void drawRoundedSide(int cornerWidth, int cornerHeight, int radius, int color) {
- // Top
- this.matrices.push();
-
- this.matrices.scale(0.05f, 0.05f, 1.0f);
-
- this.drawRoundedCorner(cornerWidth, cornerHeight, radius * 10, color);
-
- this.matrices.pop();
-
- // Bottom
- this.matrices.push();
-
- this.matrices.translate(cornerWidth, cornerHeight * 2, 0);
-
- this.matrices.multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(90));
-
- this.matrices.translate(0, -cornerWidth, 0);
-
- this.matrices.scale(0.05f, 0.05f, 1.0f);
-
- this.drawRoundedCorner(cornerHeight, cornerWidth, radius * 10, color);
-
- this.matrices.pop();
- }
-
- public void drawRoundedRectangle(int x, int y, int width, int height, int radius, int color) {
- if (color == 0)
- return;
- radius = Math.min(radius, Math.min(width, height));
- int cornerWidth = width / 2;
- int cornerHeight = height / 2;
-
- this.matrices.push();
-
- this.matrices.translate(x, y, 0);
-
- this.drawRoundedSide(cornerWidth, cornerHeight, radius, color);
-
- this.matrices.translate(cornerWidth * 2, cornerHeight * 2, 0);
-
- this.matrices.multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(180));
-
- this.matrices.translate(0, 0, 0);
-
- this.drawRoundedSide(cornerWidth, cornerHeight, radius, color);
-
- this.matrices.pop();
- }
-
- public int getScaledWindowWidth() {
- return SaturnClient.client.getWindow().getScaledWidth();
- }
-
- public int getScaledWindowHeight() {
- return SaturnClient.client.getWindow().getScaledHeight();
- }
-
- public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int color) {
- this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height, color);
- }
-
- public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height) {
- this.drawTexture(sprite, x, y, u, v, width, height, width, height, width, height);
- }
-
- public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWith,
- int regionHeight, int textureWidth, int textureHeight) {
- this.drawTexture(sprite, x, y, u, v, width, height, regionWith, regionHeight, textureWidth, textureHeight, -1);
- }
-
- public void drawTexture(Identifier sprite, int x, int y, float u, float v, int width, int height, int regionWidth,
- int regionHeight, int textureWidth, int textureHeight, int color) {
- this.drawTexturedQuad(sprite, x, x + width, y, y + height, (u + 0.0F) / (float) textureWidth,
- (u + (float) regionWidth) / (float) textureWidth, (v + 0.0F) / (float) textureHeight,
- (v + (float) regionHeight) / (float) textureHeight, color);
- }
-
- private void drawTexturedQuad(Identifier sprite, int x1, int x2, int y1, int y2, float u1, float u2, float v1,
- float v2, int color) {
-
- if (sprite.toString().endsWith(".svg")) {
- sprite = SvgTexture.getSvg(MinecraftClient.getInstance(), sprite, (x2 - x1) * 2, (y2 - y1) * 2);
- }
-
- if (color == 0)
- return;
- x1 *= 4;
- x2 *= 4;
- y1 *= 4;
- y2 *= 4;
- color = getColor(color);
-
- matrices.push();
- matrices.scale(0.25f, 0.25f, 1.0f);
- RenderSystem.setShaderTexture(0, sprite);
- RenderLayer renderLayer = (RenderLayer) RenderLayer.getGuiTextured(sprite);
- Matrix4f matrix4f = this.matrices.peek().getPositionMatrix();
- VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(renderLayer);
- vertexConsumer.vertex(matrix4f, (float) x1, (float) y1, 0.0F).texture(u1, v1).color(color);
- vertexConsumer.vertex(matrix4f, (float) x1, (float) y2, 0.0F).texture(u1, v2).color(color);
- vertexConsumer.vertex(matrix4f, (float) x2, (float) y2, 0.0F).texture(u2, v2).color(color);
- vertexConsumer.vertex(matrix4f, (float) x2, (float) y1, 0.0F).texture(u2, v1).color(color);
- matrices.pop();
- }
-
- public void enableScissor(int x1, int y1, int x2, int y2) {
- ScreenRect screenRect = (new ScreenRect(x1, y1, x2 - x1, y2 - y1))
- .transform(this.matrices.peek().getPositionMatrix());
- this.setScissor(this.scissorStack.push(screenRect));
- }
-
- public void disableScissor() {
- this.setScissor(this.scissorStack.pop());
- }
-
- public boolean scissorContains(int x, int y) {
- return this.scissorStack.containsPoint(x, y);
- }
-
- private void setScissor(@Nullable ScreenRect rect) {
- this.draw();
- if (rect != null) {
- Window window = SaturnClient.client.getWindow();
- int i = window.getFramebufferHeight();
- double d = window.getScaleFactor();
- double e = (double) rect.getLeft() * d;
- double f = (double) i - (double) rect.getBottom() * d;
- double g = (double) rect.width() * d;
- double h = (double) rect.height() * d;
- RenderSystem.enableScissor((int) e, (int) f, Math.max(0, (int) g), Math.max(0, (int) h));
- } else {
- RenderSystem.disableScissor();
- }
-
- }
-
- public void draw() {
- this.vertexConsumers.draw();
- }
-
- public void draw(Consumer drawer) {
- drawer.accept(this.vertexConsumers);
- this.vertexConsumers.draw();
- }
-
- static class ScissorStack {
- private final Deque stack = new ArrayDeque<>();
-
- public ScreenRect push(ScreenRect p_281812_) {
- ScreenRect screenrectangle = this.stack.peekLast();
- if (screenrectangle != null) {
- ScreenRect screenrectangle1 = Objects.requireNonNullElse(p_281812_.intersection(screenrectangle),
- ScreenRect.empty());
- this.stack.addLast(screenrectangle1);
- return screenrectangle1;
- } else {
- this.stack.addLast(p_281812_);
- return p_281812_;
- }
- }
-
- @Nullable
- public ScreenRect pop() {
- if (this.stack.isEmpty()) {
- throw new IllegalStateException("Scissor stack underflow");
- } else {
- this.stack.removeLast();
- return this.stack.peekLast();
- }
- }
-
- public boolean containsPoint(int p_329411_, int p_333404_) {
- return this.stack.isEmpty() ? true : this.stack.peek().contains(p_329411_, p_333404_);
- }
- }
-
- public void drawItem(ItemStack item, int x, int y) {
- this.drawItem(SaturnClient.client.player, SaturnClient.client.world, item, x, y, 0);
- }
-
- public void drawItem(ItemStack stack, int x, int y, int seed) {
- this.drawItem(SaturnClient.client.player, SaturnClient.client.world, stack, x, y, seed);
- }
-
- public void drawItem(ItemStack stack, int x, int y, int seed, int z) {
- this.drawItem(SaturnClient.client.player, SaturnClient.client.world, stack, x, y, seed, z);
- }
-
- public void drawItemWithoutEntity(ItemStack stack, int x, int y) {
- this.drawItemWithoutEntity(stack, x, y, 0);
- }
-
- public void drawItemWithoutEntity(ItemStack stack, int x, int y, int seed) {
- this.drawItem((LivingEntity) null, SaturnClient.client.world, stack, x, y, seed);
- }
-
- public void drawItem(LivingEntity entity, ItemStack stack, int x, int y, int seed) {
- this.drawItem(entity, entity.getWorld(), stack, x, y, seed);
- }
-
- private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStack stack, int x, int y,
- int seed) {
- this.drawItem(entity, world, stack, x, y, seed, 0);
- }
-
- private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStack stack, int x, int y, int seed,
- int z) {
- if (!stack.isEmpty()) {
- SaturnClient.client.getItemModelManager().update(this.itemRenderState, stack, ModelTransformationMode.GUI,
- false, world, entity, seed);
- this.matrices.push();
- this.matrices.translate((float) (x + 8), (float) (y + 8),
- (float) (150 + (this.itemRenderState.hasDepth() ? z : 0)));
-
- try {
- this.matrices.scale(16.0F, -16.0F, 16.0F);
- boolean bl = !this.itemRenderState.isSideLit();
- if (bl) {
- this.draw();
- DiffuseLighting.disableGuiDepthLighting();
- }
-
- this.itemRenderState.render(this.matrices, this.vertexConsumers, 15728880, OverlayTexture.DEFAULT_UV);
- this.draw();
- if (bl) {
- DiffuseLighting.enableGuiDepthLighting();
- }
- } catch (Throwable var11) {
- CrashReport crashReport = CrashReport.create(var11, "Rendering item");
- CrashReportSection crashReportSection = crashReport.addElement("Item being rendered");
- crashReportSection.add("Item Type", () -> {
- return String.valueOf(stack.getItem());
- });
- crashReportSection.add("Item Components", () -> {
- return String.valueOf(stack.getComponents());
- });
- crashReportSection.add("Item Foil", () -> {
- return String.valueOf(stack.hasGlint());
- });
- throw new CrashException(crashReport);
- }
-
- this.matrices.pop();
- }
- }
-
- public void drawSpriteStretched(Sprite sprite, int x, int y, int width, int height) {
- this.drawSpriteStretched(sprite, x, y, width, height, -1);
- }
-
- public void drawSpriteStretched(Sprite sprite, int x, int y, int width, int height, int color) {
- if (color == 0)
- return;
- if (width != 0 && height != 0) {
- this.drawTexturedQuad(sprite.getAtlasId(), x, x + width, y, y + height, sprite.getMinU(), sprite.getMaxU(),
- sprite.getMinV(), sprite.getMaxV(), color);
- }
- }
-
- public void fill(int x1, int y1, int x2, int y2, int color) {
- this.fill(x1, y1, x2, y2, 0, color);
- }
-
- public void fill(int x1, int y1, int x2, int y2, int z, int color) {
- this.fill(RenderLayer.getGui(), x1, y1, x2, y2, z, color);
- }
-
- public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int color) {
- this.fill(layer, x1, y1, x2, y2, 0, color);
- }
-
- public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int z, int color) {
- Matrix4f matrix4f = this.matrices.peek().getPositionMatrix();
- int i;
- if (x1 < x2) {
- i = x1;
- x1 = x2;
- x2 = i;
- }
-
- if (y1 < y2) {
- i = y1;
- y1 = y2;
- y2 = i;
- }
-
- VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(layer);
- vertexConsumer.vertex(matrix4f, (float) x1, (float) y1, (float) z).color(color);
- vertexConsumer.vertex(matrix4f, (float) x1, (float) y2, (float) z).color(color);
- vertexConsumer.vertex(matrix4f, (float) x2, (float) y2, (float) z).color(color);
- vertexConsumer.vertex(matrix4f, (float) x2, (float) y1, (float) z).color(color);
- }
-
- public void drawBorder(int x, int y, int width, int height, int color) {
- this.fill(x, y, x + width, y + 1, color);
- this.fill(x, y + height - 1, x + width, y + height, color);
- this.fill(x, y + 1, x + 1, y + height - 1, color);
- this.fill(x + width - 1, y + 1, x + width, y + height - 1, color);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/SaturnScreen.java b/src/main/java/org/saturnclient/ui2/SaturnScreen.java
deleted file mode 100644
index 29651de..0000000
--- a/src/main/java/org/saturnclient/ui2/SaturnScreen.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.saturnclient.ui2;
-
-import java.time.Duration;
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.saturnclient.saturnclient.mixin.DrawContextAccessor;
-import org.saturnclient.ui2.components.ElementRenderer;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gl.PostEffectProcessor;
-import net.minecraft.client.gui.CubeMapRenderer;
-import net.minecraft.client.gui.DrawContext;
-import net.minecraft.client.gui.RotatingCubeMapRenderer;
-import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.render.DefaultFramebufferSet;
-import net.minecraft.client.texture.ResourceTexture;
-import net.minecraft.client.texture.TextureManager;
-import net.minecraft.client.util.Pool;
-import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
-
-public abstract class SaturnScreen extends Screen {
- private final Pool pool = new Pool(3);
- protected List elements = new ArrayList<>();
- protected float backgroundOpacity = 1.0f;
- protected Instant start = null;
- public int backgroundBlur = 10;
-
- protected static final Identifier PANORAMA = Identifier.of("saturnclient",
- "textures/gui/title/background/panorama");
- protected static final CubeMapRenderer PANORAMA_RENDERER = new CubeMapRenderer(PANORAMA);
-
- public static final RotatingCubeMapRenderer ROTATING_PANORAMA_RENDERER;
-
- static {
- ROTATING_PANORAMA_RENDERER = new RotatingCubeMapRenderer(PANORAMA_RENDERER);
- }
-
- public static void preload(MinecraftClient client) {
- TextureManager textureManager = client.getTextureManager();
-
- // Force upload each texture to GPU
- for (int i = 0; i < 6; i++) {
- String var10001 = PANORAMA.getPath();
- Identifier tex = PANORAMA.withPath(var10001 + "_" + i + ".png");
- ResourceTexture resourceTexture = new ResourceTexture(tex);
- textureManager.registerTexture(tex, resourceTexture);
- }
- }
-
- public SaturnScreen(String title) {
- super(Text.literal(title));
- }
-
- public void draw(Element element) {
- ElementRenderer.draw(elements, element);
- }
-
- @Override
- protected void init() {
- elements.clear();
- width *= 2;
- height *= 2;
- ui(); // abstraction to render the saturn ui and also render extra stuff here
- }
-
- public abstract void ui();
-
- @SuppressWarnings("deprecation")
- @Override
- public void render(DrawContext context, int mouseX, int mouseY, float delta) {
- if (start == null) {
- start = Instant.now();
- }
- long elapsed = Duration.between(start, Instant.now()).toMillis();
-
- mouseX *= 2;
- mouseY *= 2;
-
- if (client.world == null && client.getCurrentServerEntry() == null) {
- ROTATING_PANORAMA_RENDERER.render(context, this.width, this.height, backgroundOpacity, delta);
- }
-
- PostEffectProcessor postEffectProcessor = this.client.getShaderLoader().loadPostEffect(
- Identifier.ofVanilla("blur"),
- DefaultFramebufferSet.MAIN_ONLY);
-
- if (postEffectProcessor != null) {
- postEffectProcessor.setUniforms("Radius", backgroundBlur * Math.min((float) elapsed / 700, 1.0f));
- postEffectProcessor.render(this.client.getFramebuffer(), this.pool);
- }
-
- // We are using a Abstracted RenderScope because older minecraft versions don't
- // use DrawContext
- RenderScope renderScope = new RenderScope(context.getMatrices(),
- ((DrawContextAccessor) context).getVertexConsumers());
-
- renderScope.matrices.push();
-
- renderScope.matrices.scale(0.5f, 0.5f, 0.5f);
-
- ElementRenderer.render(new ArrayList<>(elements), elapsed, renderScope, mouseX, mouseY);
-
- renderScope.matrices.pop();
- }
-
- @Override
- public boolean mouseClicked(double mouseX, double mouseY, int button) {
- mouseX *= 2;
- mouseY *= 2;
-
- ElementRenderer.mouseClicked(elements, mouseX, mouseY, button);
-
- return false;
- }
-
- @Override
- public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
- mouseX *= 2;
- mouseY *= 2;
-
- ElementRenderer.mouseDragged(elements, mouseX, mouseY, button, deltaX, deltaY);
-
- return super.mouseReleased(mouseX, mouseY, button);
- }
-
- @Override
- public boolean mouseReleased(double mouseX, double mouseY, int button) {
- mouseX *= 2;
- mouseY *= 2;
-
- ElementRenderer.mouseReleased(elements, mouseX, mouseY, button);
-
- return super.mouseReleased(mouseX, mouseY, button);
- }
-
- @Override
- public boolean mouseScrolled(
- double mouseX,
- double mouseY,
- double horizontalAmount,
- double verticalAmount) {
- mouseX *= 2;
- mouseY *= 2;
-
- ElementRenderer.mouseScrolled(elements, mouseX, mouseY, horizontalAmount, verticalAmount);
-
- return super.mouseScrolled(
- mouseX,
- mouseY,
- horizontalAmount,
- verticalAmount);
- }
-
- @Override
- public void resize(MinecraftClient client, int width, int height) {
- elements.clear();
- super.resize(client, width, height);
- }
-
- @Override
- public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
- ElementRenderer.keyPressed(elements, keyCode, scanCode, modifiers);
-
- return super.keyPressed(keyCode, scanCode, modifiers);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/Utils.java b/src/main/java/org/saturnclient/ui2/Utils.java
deleted file mode 100644
index 6e3efb2..0000000
--- a/src/main/java/org/saturnclient/ui2/Utils.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.saturnclient.ui2;
-
-import java.util.List;
-
-import org.lwjgl.glfw.GLFW;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.ui2.elements.Notification;
-import org.saturnclient.ui2.elements.Notification.NotificationKind;
-
-public class Utils {
- public static boolean isHovering(int mouseX, int mouseY, int elementWidth, int elementHeight, float elementScale) {
- return mouseX >= 0 &&
- mouseX <= (elementWidth * elementScale) &&
- mouseY >= 0 &&
- mouseY <= (elementHeight * elementScale);
- }
-
- public static char getCharFromKey(int keyCode, int modifiers) {
- boolean shift = (modifiers & GLFW.GLFW_MOD_SHIFT) != 0;
-
- // A-Z
- if (keyCode >= GLFW.GLFW_KEY_A && keyCode <= GLFW.GLFW_KEY_Z) {
- return (char) (shift
- ? 'A' + (keyCode - GLFW.GLFW_KEY_A)
- : 'a' + (keyCode - GLFW.GLFW_KEY_A));
- }
-
- // 0-9
- if (keyCode >= GLFW.GLFW_KEY_0 && keyCode <= GLFW.GLFW_KEY_9) {
- return shift
- ? ")!@#$%^&*(".charAt(keyCode - GLFW.GLFW_KEY_0)
- : (char) ('0' + (keyCode - GLFW.GLFW_KEY_0));
- }
-
- // Special characters
- return switch (keyCode) {
- case GLFW.GLFW_KEY_SPACE -> ' ';
- case GLFW.GLFW_KEY_PERIOD -> shift ? '>' : '.';
- case GLFW.GLFW_KEY_COMMA -> shift ? '<' : ',';
- case GLFW.GLFW_KEY_MINUS -> shift ? '_' : '-';
- case GLFW.GLFW_KEY_EQUAL -> shift ? '+' : '=';
- case GLFW.GLFW_KEY_SEMICOLON -> shift ? ':' : ';';
- case GLFW.GLFW_KEY_APOSTROPHE -> shift ? '"' : '\'';
- case GLFW.GLFW_KEY_SLASH -> shift ? '?' : '/';
- case GLFW.GLFW_KEY_BACKSLASH -> shift ? '|' : '\\';
- case GLFW.GLFW_KEY_LEFT_BRACKET -> shift ? '{' : '[';
- case GLFW.GLFW_KEY_RIGHT_BRACKET -> shift ? '}' : ']';
- case GLFW.GLFW_KEY_GRAVE_ACCENT -> shift ? '~' : '`';
- default -> '\0';
- };
- }
-
- public static T getOrNull(List list, int index) {
- return (index >= 0 && index < list.size()) ? list.get(index) : null;
- }
-
- public static void notify(NotificationKind kind, String title, String toast) {
- if (SaturnClient.client.currentScreen instanceof SaturnScreen) {
- ((SaturnScreen) SaturnClient.client.currentScreen)
- .draw(new Notification(SaturnClient.client.currentScreen.width,
- SaturnClient.client.currentScreen.height, kind,
- title, toast));
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/anim/Animation.java b/src/main/java/org/saturnclient/ui2/anim/Animation.java
deleted file mode 100644
index 142ff78..0000000
--- a/src/main/java/org/saturnclient/ui2/anim/Animation.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.saturnclient.ui2.anim;
-
-import java.util.function.Function;
-
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.Element;
-
-public abstract class Animation {
- public int duration;
- public int delay = 0;
- public Function curve = Curve::easeInOutCubic;
-
- Animation(AnimationConfig config) {
- this.duration = config.duration.value;
- switch (config.curve.value) {
- case 0:
- this.curve = Curve::easeInOutCubic;
- break;
- case 1:
- this.curve = Curve::easeOutCubic;
- break;
- case 2:
- this.curve = Curve::easeInOutBack;
- break;
- default:
- break;
- }
- }
-
- Animation(int duration) {
- this.duration = duration;
- }
-
- public abstract void tick(double progress, Element element);
-
- public abstract void init(Element element);
-}
diff --git a/src/main/java/org/saturnclient/ui2/anim/Curve.java b/src/main/java/org/saturnclient/ui2/anim/Curve.java
deleted file mode 100644
index ab9b811..0000000
--- a/src/main/java/org/saturnclient/ui2/anim/Curve.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.saturnclient.ui2.anim;
-
-public class Curve {
- public static double easeOutCubic(double x) {
- return 1 - Math.pow(1 - x, 3);
- }
-
- public static double easeInOutCubic(double x) {
- return (x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2);
- }
-
- public static double easeInOutBack(double x) {
- double c1 = 2.5;
- double c2 = c1 * 1.525;
-
- if (x < 0.5) {
- return (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2;
- } else {
- return (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (2 * x - 2) + c2) + 2) / 2;
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/anim/Fade.java b/src/main/java/org/saturnclient/ui2/anim/Fade.java
deleted file mode 100644
index 68a0329..0000000
--- a/src/main/java/org/saturnclient/ui2/anim/Fade.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.saturnclient.ui2.anim;
-
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.Element;
-
-public class Fade extends Animation {
- float targetOpacity;
-
- public Fade(int duration) {
- super(duration);
- }
-
- public Fade(AnimationConfig config) {
- super(config);
- }
-
- @Override
- public void tick(double progress, Element element) {
- element.opacity = Math.max(0.1f, targetOpacity * (float) progress);
- }
-
- @Override
- public void init(Element element) {
- targetOpacity = element.opacity;
- element.opacity = 0.1f;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/anim/FadeOut.java b/src/main/java/org/saturnclient/ui2/anim/FadeOut.java
deleted file mode 100644
index 76f39c9..0000000
--- a/src/main/java/org/saturnclient/ui2/anim/FadeOut.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.saturnclient.ui2.anim;
-
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.Element;
-
-public class FadeOut extends Animation {
- float targetOpacity;
-
- public FadeOut(int duration) {
- super(duration);
- }
-
- public FadeOut(AnimationConfig config) {
- super(config);
- }
-
- @Override
- public void tick(double progress, Element element) {
- element.opacity = targetOpacity - (float) progress;
- }
-
- @Override
- public void init(Element element) {
- targetOpacity = element.opacity;
- // element.opacity = 1.0f;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/anim/SlideFade.java b/src/main/java/org/saturnclient/ui2/anim/SlideFade.java
deleted file mode 100644
index e0a24b4..0000000
--- a/src/main/java/org/saturnclient/ui2/anim/SlideFade.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.saturnclient.ui2.anim;
-
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.Element;
-
-public class SlideFade extends Animation {
- public Fade fade;
- public SlideY slideY;
-
- public SlideFade(int duration, int offset) {
- super(duration);
- this.fade = new Fade(duration);
- this.slideY = new SlideY(duration, offset);
- }
-
- public SlideFade(AnimationConfig config, int offset) {
- super(config);
- this.fade = new Fade(duration);
- this.slideY = new SlideY(duration, offset);
- }
-
- @Override
- public void tick(double progress, Element element) {
- fade.delay = this.delay;
- fade.duration = this.duration;
-
- slideY.delay = this.delay;
- slideY.duration = this.duration;
-
- fade.tick(progress, element);
- slideY.tick(progress, element);
- }
-
- @Override
- public void init(Element element) {
- fade.init(element);
- slideY.init(element);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/anim/SlideX.java b/src/main/java/org/saturnclient/ui2/anim/SlideX.java
deleted file mode 100644
index b759865..0000000
--- a/src/main/java/org/saturnclient/ui2/anim/SlideX.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.saturnclient.ui2.anim;
-
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.Element;
-
-public class SlideX extends Animation {
- int offset = 20;
- double startX;
-
- public SlideX(AnimationConfig config) {
- super(config);
- }
-
- public SlideX(AnimationConfig config, int offset) {
- super(config);
- this.offset = offset;
- }
-
- public SlideX(int duration) {
- super(duration);
- }
-
- public SlideX(int duration, int offset) {
- super(duration);
- this.offset = offset;
- }
-
- @Override
- public void init(Element element) {
- startX = element.x - offset;
- element.x = (int) startX;
- }
-
- @Override
- public void tick(double progress, Element element) {
- double currentX = startX + offset * progress;
- element.x = (int) currentX;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/anim/SlideY.java b/src/main/java/org/saturnclient/ui2/anim/SlideY.java
deleted file mode 100644
index 5c4ce09..0000000
--- a/src/main/java/org/saturnclient/ui2/anim/SlideY.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.saturnclient.ui2.anim;
-
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.Element;
-
-public class SlideY extends Animation {
- int offset = 20;
- double startY;
-
- public SlideY(AnimationConfig config) {
- super(config);
- }
-
- public SlideY(AnimationConfig config, int offset) {
- super(config);
- this.offset = offset;
- }
-
- public SlideY(int duration) {
- super(duration);
- }
-
- public SlideY(int duration, int offset) {
- super(duration);
- this.offset = offset;
- }
-
- @Override
- public void init(Element element) {
- startY = element.y - offset;
- element.y = (int) startY;
- }
-
- @Override
- public void tick(double progress, Element element) {
- double currentY = startY + offset * progress;
- element.y = (int) currentY;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/CosmeticPreview.java b/src/main/java/org/saturnclient/ui2/components/CosmeticPreview.java
deleted file mode 100644
index 49ace16..0000000
--- a/src/main/java/org/saturnclient/ui2/components/CosmeticPreview.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.saturnclient.ui2.components;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.util.Identifier;
-
-public class CosmeticPreview extends Element {
- static int padding = 14;
-
- Identifier sprite;
- private Runnable onClick;
- private boolean isSelected;
-
- public CosmeticPreview(boolean isSelected, Identifier sprite, Runnable onClick) {
- this.sprite = sprite;
- this.onClick = onClick;
- this.isSelected = isSelected;
-
- this.width = 50;
- this.height = 111;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value,
- isSelected ? Theme.ACCENT.value : Theme.PRIMARY.value);
-
- renderScope.setRenderLayer(RenderLayer::getGuiTextured);
-
- int texWidth = width - padding;
- int texHeight = height - padding;
-
- renderScope.drawTexture(sprite, padding / 2, padding / 2, 0, 0, texWidth, texHeight,
- Theme.FOREGROUND.value);
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- if (onClick != null) {
- onClick.run();
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java b/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java
deleted file mode 100644
index 30842a1..0000000
--- a/src/main/java/org/saturnclient/ui2/components/ElementRenderer.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package org.saturnclient.ui2.components;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.Utils;
-
-public class ElementRenderer {
- public static void draw(List elements, Element element) {
- synchronized (elements) {
- elements.add(element);
- }
-
- if (element.animation != null) {
- element.animation.init(element);
- }
- }
-
- public static void render(List elements, long elapsed, RenderScope renderScope, int mouseX, int mouseY) {
- for (Element element : elements) {
- element.playAnimationFrame(elapsed);
-
- renderScope.matrices.push();
- renderScope.setOpacity(element.opacity);
- renderScope.matrices.translate(element.x, element.y, 0);
- renderScope.matrices.scale(element.scale, element.scale, 1.0f);
- element.render(renderScope, new ElementContext(elapsed, mouseX, mouseY, element));
- renderScope.matrices.pop();
- renderScope.setRenderLayer(null);
- }
- }
-
- public static void mouseClicked(List elements, double mouseX, double mouseY, int button) {
- if (button == 0) {
- for (Element element : new ArrayList<>(elements)) {
- element.focused = false;
-
- int adjustedMouseX = (int) mouseX - element.x;
- int adjustedMouseY = (int) mouseY - element.y;
-
- element.mouseClicked(adjustedMouseX * element.scale, adjustedMouseY * element.scale, button);
-
- if (element.opacity > 0 && Utils.isHovering(adjustedMouseX, adjustedMouseY, element.width,
- element.height, element.scale)) {
- element.focused = true;
- element.click((int) (adjustedMouseX * element.scale), (int) (adjustedMouseY * element.scale));
- }
- }
- }
- }
-
- public static void mouseScrolled(
- List elements,
- double mouseX,
- double mouseY,
- double horizontalAmount,
- double verticalAmount) {
- for (Element element : new ArrayList<>(elements)) {
- if (Utils.isHovering((int) mouseX - element.x, (int) mouseY - element.y, element.width, element.height,
- element.scale)) {
- element.scroll(
- (int) mouseX - element.x,
- (int) mouseY - element.y,
- horizontalAmount,
- verticalAmount);
- }
- }
- }
-
- public static void keyPressed(List elements, int keyCode, int scanCode, int modifiers) {
- for (Element element : new ArrayList<>(elements)) {
- if (element.focused && element.opacity > 0) {
- element.keyPressed(keyCode, scanCode, modifiers);
-
- char typedChar = Utils.getCharFromKey(keyCode, modifiers);
- if (typedChar != '\0') {
- element.charTyped(typedChar);
- }
- }
- }
- }
-
- public static void mouseDragged(List elements, double mouseX, double mouseY, int button, double deltaX,
- double deltaY) {
- for (Element element : new ArrayList<>(elements)) {
- element.mouseDragged(mouseX - element.x, mouseY - element.y, button, deltaX, deltaY);
- }
- }
-
- public static void mouseReleased(List elements, double mouseX, double mouseY, int button) {
- for (Element element : new ArrayList<>(elements)) {
- element.mouseReleased(mouseX - element.x, mouseY - element.y, button);
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/SaturnModule.java b/src/main/java/org/saturnclient/ui2/components/SaturnModule.java
deleted file mode 100644
index 21c8b1c..0000000
--- a/src/main/java/org/saturnclient/ui2/components/SaturnModule.java
+++ /dev/null
@@ -1,165 +0,0 @@
-package org.saturnclient.ui2.components;
-
-import org.saturnclient.modules.Module;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.resources.Fonts;
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.Utils;
-import org.saturnclient.ui2.screens.ConfigEditor;
-
-import net.minecraft.client.render.RenderLayer;
-
-public class SaturnModule extends Element {
-
- private final Module mod;
-
- static int p = 10; // padding
- static int s = 14; // settings icon size
- static int expand = 5; // settings icon click area
-
- public SaturnModule(Module mod) {
- this.mod = mod;
- this.width = 160;
- this.height = 50;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- boolean hovered = ctx.isHovering();
- boolean enabled = mod.isEnabled();
-
- int iconX = width - s - p;
- int iconY = height - s - p;
-
- boolean settingsHover = ctx.isHovering(
- getSettingsX(),
- getSettingsY(),
- getSettingsHitBox(),
- getSettingsHitBox());
-
- renderScope.setRenderLayer(RenderLayer::getGuiTextured);
-
- // Resolve theme colors
- int bgColor = Theme.PRIMARY.value;
- int fgColor = hovered && !settingsHover ? Theme.ACCENT.value : Theme.PRIMARY_FG.value;
-
- int iconBg = enabled ? Theme.ACCENT.value : Theme.PRIMARY.value;
- int iconFg = enabled ? Theme.ACCENT_FG.value : fgColor;
-
- int settingsColor = settingsHover
- ? Theme.ACCENT.value
- : Theme.withAlpha(160, fgColor);
-
- int h = height - (p * 2);
-
- // Main background
- renderScope.drawRoundedRectangle(
- 0, 0,
- width, height,
- Theme.WIDGET_RADIUS.value,
- bgColor);
-
- // Icon background
- renderScope.drawRoundedRectangle(
- p, p,
- h, h,
- Theme.WIDGET_RADIUS.value,
- iconBg);
-
- // Icon
- renderScope.drawTexture(
- mod.getIconTexture(),
- p + (p / 2),
- p + (p / 2),
- 0, 0,
- h - p,
- h - p,
- iconFg);
-
- // Module name
- renderScope.drawText(
- 0.6f,
- mod.getName(),
- p + h + 4,
- p + 1,
- Theme.FONT.value,
- fgColor);
-
- // Version (right aligned)
- String version = mod.getVersion();
- int versionWidth = (int) (Fonts.getWidth(version, Theme.FONT.value) * 0.35f);
-
- renderScope.drawText(
- 0.35f,
- version,
- width - p - versionWidth,
- p + 1,
- Theme.FONT.value,
- fgColor);
-
- // Tags
- int xt = p + h + 4;
- for (String tag : mod.getTags()) {
- int tagWidth = (int) (Fonts.getWidth(tag, Theme.FONT.value) * 0.4f);
-
- renderScope.drawRoundedRectangle(
- xt,
- p + (h / 2),
- tagWidth + 6,
- 12,
- 5,
- Theme.ACCENT.value);
-
- renderScope.drawText(
- 0.4f,
- tag,
- xt + 2,
- p + (h / 2) + 3,
- Theme.FONT.value,
- Theme.ACCENT_FG.value);
-
- xt += tagWidth + 9;
- }
-
- // Settings icon
- renderScope.drawTexture(
- Textures.SETTINGS,
- iconX,
- iconY,
- 0, 0,
- s, s,
- settingsColor);
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- boolean settingsHover = Utils.isHovering(
- mouseX - getSettingsX(),
- mouseY - getSettingsY(),
- getSettingsHitBox(),
- getSettingsHitBox(),
- 1.0f);
-
- if (settingsHover) {
- SaturnClient.client.setScreen(new ConfigEditor(mod.getConfig()));
- } else {
- mod.setEnabled(!mod.isEnabled());
- }
- }
-
- private int getSettingsX() {
- return width - s - p - expand;
- }
-
- private int getSettingsY() {
- return height - s - p - expand;
- }
-
- private int getSettingsHitBox() {
- return s + expand * 2;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/ui2/components/Sidebar.java b/src/main/java/org/saturnclient/ui2/components/Sidebar.java
deleted file mode 100644
index bbb7ef7..0000000
--- a/src/main/java/org/saturnclient/ui2/components/Sidebar.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package org.saturnclient.ui2.components;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.Utils;
-import org.saturnclient.ui2.screens.ConfigEditor;
-import org.saturnclient.ui2.screens.ModMenu;
-import org.saturnclient.ui2.screens.cosmetics.CloakMenu;
-import org.saturnclient.ui2.screens.store.CloakStore;
-
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.util.Identifier;
-
-public class Sidebar extends Element {
- public static class SidebarComponent {
- Runnable onClick;
- boolean end;
- Identifier sprite;
-
- public SidebarComponent(Identifier sprite, Runnable onClick, boolean end) {
- this.onClick = onClick;
- this.end = end;
- this.sprite = sprite;
- }
- }
-
- Runnable onClose;
- SidebarComponent[] components = {
- new Sidebar.SidebarComponent(Textures.MODS_TAB, () -> {
- SaturnClient.client.setScreen(new ModMenu());
- }, false),
- new Sidebar.SidebarComponent(Textures.SETTINGS, () -> {
- SaturnClient.client.setScreen(new ConfigEditor(Config.config));
- }, false),
-
- new Sidebar.SidebarComponent(Textures.SHIRT, () -> {
- SaturnClient.client.setScreen(new CloakMenu());
- }, false),
-
- new Sidebar.SidebarComponent(Textures.CLOSE, () -> {
- onClose.run();
- }, true),
-
- new Sidebar.SidebarComponent(Textures.STORE, () -> {
- SaturnClient.client.setScreen(new CloakStore());
- }, true),
- };
- int active = 0;
-
- public Sidebar(int active, Runnable onClose) {
- this.width = 30;
- this.height = 350;
- this.active = active;
- this.onClose = onClose;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- int topRow = 0;
- int bottomRow = 0;
-
- int gap = 5; // 5px gap between icons
- int padding = 10;
- int sp = 30 - padding + gap;
- int s = 30 - (padding * 2);
- int s2 = s + padding;
-
- renderScope.setRenderLayer(RenderLayer::getGuiTextured);
-
- renderScope.drawRoundedRectangle(0, 0, width, height, Theme.BG_RADIUS.value, Theme.BACKGROUND.value);
-
- int i = 0;
-
- for (SidebarComponent component : components) {
- int y = component.end ? ((height - (sp * bottomRow)) - (s * 2)) : (padding + (sp * topRow));
- boolean selected = ctx.isHovering(0, y - (padding / 2), s2, s2) || active == i;
-
- renderScope.drawRoundedRectangle(padding / 2, y - (padding / 2), s + padding,
- s + padding, Theme.WIDGET_RADIUS.value, Theme.getBg(selected));
-
- renderScope.drawTexture(component.sprite, padding, y, 0, 0, s, s, Theme.getFg(selected));
-
- if (component.end) {
- bottomRow += 1;
- } else {
- topRow += 1;
- }
-
- i++;
- }
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- int topRow = 0;
- int bottomRow = 0;
-
- int gap = 5;
- int padding = 10;
- int sp = 30 - padding + gap;
- int s = 30 - (padding * 2);
- int s2 = s + padding;
-
- for (SidebarComponent component : components) {
- int y = component.end ? ((height - (sp * bottomRow)) - (s * 2)) : (padding + (sp * topRow));
- boolean hovering = Utils.isHovering(mouseX - (padding / 2), mouseY - (y - (padding / 2)), s2, s2, scale);
-
- if (hovering) {
- component.onClick.run();
- break;
- }
-
- if (component.end) {
- bottomRow += 1;
- } else {
- topRow += 1;
- }
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/SkinPreview.java b/src/main/java/org/saturnclient/ui2/components/SkinPreview.java
deleted file mode 100644
index 88407c0..0000000
--- a/src/main/java/org/saturnclient/ui2/components/SkinPreview.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package org.saturnclient.ui2.components;
-
-import org.jetbrains.annotations.Nullable;
-import org.joml.Quaternionf;
-import org.joml.Vector3f;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-
-import net.minecraft.client.render.DiffuseLighting;
-import net.minecraft.client.render.entity.EntityRenderDispatcher;
-import net.minecraft.entity.LivingEntity;
-
-public class SkinPreview extends Element {
- private boolean negativeAngle = false;
- private float angle = 0.0f;
-
- public SkinPreview(float angle, boolean negativeAngle) {
- this.angle = angle;
- this.negativeAngle = negativeAngle;
- }
-
- public static void drawEntity(RenderScope renderScope, int x1, int y1, int x2, int y2, int size, float f, float mouseX,
- float mouseY, LivingEntity entity, float angle, boolean negativeAngle) {
- float g = (float) (x1 + x2) / 2.0F;
- float h = (float) (y1 + y2) / 2.0F;
- renderScope.enableScissor(0, 6, x2, y2);
- float i = (float) Math.atan((double) ((g - mouseX) / 40.0F));
- float j = (float) Math.atan((double) ((h - mouseY) / 40.0F));
- Quaternionf quaternionf = (new Quaternionf()).rotateZ(3.1415927F);
- float k = entity.bodyYaw;
- float l = entity.getYaw();
- float m = entity.getPitch();
- float n = entity.prevHeadYaw;
- float o = entity.headYaw;
- entity.setYaw(angle);
- entity.bodyYaw = angle;
- entity.setPitch(-(j * 20.0F));
- entity.headYaw = negativeAngle ? (i * 40.0F) + 180f : -(i * 40.0F);
- entity.prevHeadYaw = entity.getHeadYaw();
- entity.setCustomNameVisible(false);
-
- float p = entity.getScale();
- Vector3f vector3f = new Vector3f(0.0F, entity.getHeight() / 2.0F + f * p, 0.0F);
- float q = (float) size / p;
- drawEntity(renderScope, g, h, q, vector3f, quaternionf, null, entity);
-
- entity.setCustomNameVisible(true);
- entity.bodyYaw = k;
- entity.setYaw(l);
- entity.setPitch(m);
- entity.prevHeadYaw = n;
- entity.headYaw = o;
- renderScope.disableScissor();
- }
-
- public static void drawEntity(RenderScope renderScope, float x, float y, float size, Vector3f vector3f,
- Quaternionf quaternionf, @Nullable Quaternionf quaternionf2, LivingEntity entity) {
- renderScope.matrices.push();
- renderScope.matrices.translate((double) x, (double) y, 50.0);
- renderScope.matrices.scale(size, size, -size);
- renderScope.matrices.translate(vector3f.x, vector3f.y, vector3f.z);
- renderScope.matrices.multiply(quaternionf);
- renderScope.draw();
- DiffuseLighting.method_34742();
- EntityRenderDispatcher entityRenderDispatcher = SaturnClient.client.getEntityRenderDispatcher();
-
- entityRenderDispatcher.setRenderShadows(false);
- renderScope.draw((vertexConsumers) -> {
- entityRenderDispatcher.render(entity, 0.0, 0.0, 0.0, 1.0F, renderScope.matrices, vertexConsumers,
- 15728880);
- });
- renderScope.draw();
- entityRenderDispatcher.setRenderShadows(true);
- renderScope.matrices.pop();
- DiffuseLighting.enableGuiDepthLighting();
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- LivingEntity entity = SaturnClient.client.player;
- if (entity != null) {
- drawEntity(renderScope, 0, 0, 75, 78, 30, 0.0625F, ctx.mouseX / scale, ctx.mouseY / scale, entity, angle, negativeAngle);
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java
deleted file mode 100644
index d1d3b37..0000000
--- a/src/main/java/org/saturnclient/ui2/components/inputs/FloatInput.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.saturnclient.ui2.components.inputs;
-
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class FloatInput extends Input {
- public Property prop;
-
- public FloatInput(Property prop) {
- this.width = 120;
- this.height = Fonts.getHeight();
- this.prop = prop;
- this.text = String.valueOf(prop.value);
- }
-
- @Override
- public void charTyped(char chr) {
- if ((Character.isDigit(chr) || chr == '.' || (chr == '-' && cursorPosition == 0)) && text.length() < 10) {
- if (text.equals("0") && cursorPosition == 1) {
- text = "" + chr;
- } else {
- text = text.substring(0, cursorPosition) +
- chr +
- text.substring(cursorPosition);
-
- try {
- prop.value = text.isEmpty() ? 0 : Float.parseFloat(text);
- cursorPosition++;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
-
- @Override
- public void backspace() {
- try {
- if (text.length() == 0) {
- text = "0";
- cursorPosition = 1;
- }
- prop.value = Float.parseFloat(text);
- ConfigManager.save();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public void checkReset() {
- if (prop.isReset) {
- this.text = String.valueOf(prop.value);
- this.cursorPosition = 0;
- prop.isReset = false;
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java
deleted file mode 100644
index 92830a1..0000000
--- a/src/main/java/org/saturnclient/ui2/components/inputs/HexInput.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package org.saturnclient.ui2.components.inputs;
-
-import java.awt.Color;
-
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-
-public class HexInput extends Element {
- public Property prop;
-
- // Picker state
- private boolean open = false;
- private float hue = 0f;
- private float opacity = 1f;
- private int selectedX = 0;
- private int selectedY = 0;
-
- private boolean draggingOpacity = false;
-
- // Dimensions
- private static final int PICKER_WIDTH = 100;
- private static final int PICKER_HEIGHT = 100;
- private static final int SLIDER_WIDTH = 100;
- private static final int SLIDER_HEIGHT = 10;
- private static final int HUE_SLIDER_HEIGHT = 10;
-
- public HexInput(Property prop) {
- this.prop = prop;
- this.width = 58;
- this.height = 20;
- syncFromColor();
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- open = !open;
- }
-
- @Override
- public void mouseClicked(double mouseX, double mouseY, int button) {
- if (open) {
- handlePickerClick(mouseX - width - 8, mouseY);
- }
- }
-
- @Override
- public void mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
- if (open) {
- handlePickerDrag(mouseX - width - 8, mouseY);
- }
- }
-
- @Override
- public void mouseReleased(double mouseX, double mouseY, int button) {
- draggingOpacity = false;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- // Draw the main color rectangle
- renderScope.drawRoundedRectangle(0, 0, width, height, 6, prop.value);
-
- if (!open)
- return;
-
- // Draw the picker relative to (width + 8, 0)
- int pickerX = width + 8;
- int pickerY = 0;
-
- renderColorSquare(renderScope, pickerX, pickerY);
- renderOpacitySlider(renderScope, pickerX, pickerY - SLIDER_HEIGHT - 10);
- renderHueSlider(renderScope, pickerX, pickerY + PICKER_HEIGHT + 10);
- }
-
- private void renderColorSquare(RenderScope renderScope, int xStart, int yStart) {
- for (int x = 0; x < PICKER_WIDTH; x++) {
- for (int y = 0; y < PICKER_HEIGHT; y++) {
- float saturation = x / (float) PICKER_WIDTH;
- float value = 1f - y / (float) PICKER_HEIGHT;
- int color = Color.HSBtoRGB(hue, saturation, value);
- int alpha = (int) (opacity * 255) & 0xFF;
- color = (alpha << 24) | (color & 0xFFFFFF);
- renderScope.fill(xStart + x, yStart + y, xStart + x + 1, yStart + y + 1, color);
- }
- }
-
- // Draw selection square
- int selX = xStart + selectedX - 4;
- int selY = yStart + selectedY - 4;
- renderScope.fill(selX, selY, selX + 8, selY + 8, 0xFF000000 | prop.value);
- renderScope.drawBorder(selX, selY, 8, 8, 0xFFFFFFFF);
- }
-
- private void renderOpacitySlider(RenderScope renderScope, int xStart, int yStart) {
- for (int x = 0; x < SLIDER_WIDTH; x++) {
- float localOpacity = x / (float) SLIDER_WIDTH;
- int alpha = (int) (localOpacity * 255) & 0xFF;
- int color = (alpha << 24) | (prop.value & 0xFFFFFF);
- renderScope.fill(xStart + x, yStart, xStart + x + 1, yStart + SLIDER_HEIGHT, color);
- }
-
- int knobX = xStart + (int) (opacity * SLIDER_WIDTH);
- renderScope.fill(knobX - 1, yStart - 2, knobX + 1, yStart + SLIDER_HEIGHT + 2, 0xFF000000);
- }
-
- private void renderHueSlider(RenderScope renderScope, int xStart, int yStart) {
- for (int x = 0; x < SLIDER_WIDTH; x++) {
- float localHue = x / (float) SLIDER_WIDTH;
- int color = Color.HSBtoRGB(localHue, 1f, 1f);
- renderScope.fill(xStart + x, yStart, xStart + x + 1, yStart + HUE_SLIDER_HEIGHT, 0xFF000000 | color);
- }
-
- int knobX = xStart + (int) (hue * SLIDER_WIDTH);
- renderScope.fill(knobX - 1, yStart - 2, knobX + 1, yStart + HUE_SLIDER_HEIGHT + 2, 0xFF000000);
- }
-
- private void handlePickerClick(double mouseX, double mouseY) {
- // Color square
- if (mouseX >= 0 && mouseX < PICKER_WIDTH && mouseY >= 0 && mouseY < PICKER_HEIGHT) {
- selectedX = (int) mouseX;
- selectedY = (int) mouseY;
- updateColorFromSelection();
- }
-
- // Opacity slider
- int opY = -SLIDER_HEIGHT - 10;
- if (mouseX >= 0 && mouseX < SLIDER_WIDTH && mouseY >= opY && mouseY <= opY + SLIDER_HEIGHT) {
- updateOpacity(mouseX);
- draggingOpacity = true;
- }
-
- // Hue slider
- int hueY = PICKER_HEIGHT + 10;
- if (mouseX >= 0 && mouseX < SLIDER_WIDTH && mouseY >= hueY && mouseY <= hueY + HUE_SLIDER_HEIGHT) {
- updateHue(mouseX);
- }
- }
-
- private void handlePickerDrag(double mouseX, double mouseY) {
- // Opacity
- if (draggingOpacity)
- updateOpacity(mouseX);
-
- // Color square
- if (mouseX >= 0 && mouseX < PICKER_WIDTH && mouseY >= 0 && mouseY < PICKER_HEIGHT) {
- selectedX = (int) mouseX;
- selectedY = (int) mouseY;
- updateColorFromSelection();
- }
- }
-
- private void updateColorFromSelection() {
- float saturation = selectedX / (float) PICKER_WIDTH;
- float value = 1f - selectedY / (float) PICKER_HEIGHT;
- int color = Color.HSBtoRGB(hue, saturation, value);
- int alpha = (int) (opacity * 255) & 0xFF;
- prop.value = (alpha << 24) | (color & 0xFFFFFF);
- }
-
- private void updateHue(double mouseX) {
- hue = (float) Math.max(0, Math.min(1, mouseX / SLIDER_WIDTH));
- updateColorFromSelection();
- }
-
- private void updateOpacity(double mouseX) {
- opacity = (float) Math.max(0, Math.min(1, mouseX / SLIDER_WIDTH));
- updateColorFromSelection();
- }
-
- private void syncFromColor() {
- int rgb = prop.value & 0xFFFFFF;
- float[] hsb = Color.RGBtoHSB((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF, null);
- hue = hsb[0];
- selectedX = (int) (hsb[1] * PICKER_WIDTH);
- selectedY = (int) ((1f - hsb[2]) * PICKER_HEIGHT);
- int alpha = (prop.value >> 24) & 0xFF;
- if (alpha == 0)
- alpha = 255;
- opacity = alpha / 255f;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/Input.java b/src/main/java/org/saturnclient/ui2/components/inputs/Input.java
deleted file mode 100644
index fbd48d9..0000000
--- a/src/main/java/org/saturnclient/ui2/components/inputs/Input.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.saturnclient.ui2.components.inputs;
-
-import org.lwjgl.glfw.GLFW;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public abstract class Input extends Element {
- String text = "";
- public int cursorPosition = 0;
-
- public abstract void checkReset();
-
- public abstract void backspace();
-
- public boolean validateBackspace() {
- return true;
- }
-
- @Override
- public void keyPressed(int keyCode, int scanCode, int modifiers) {
- if (keyCode == GLFW.GLFW_KEY_BACKSPACE) {
- if (cursorPosition > 0 && validateBackspace()) {
- text = text.substring(0, cursorPosition - 1) +
- text.substring(cursorPosition);
- cursorPosition--;
- backspace();
- }
- } else if (keyCode == GLFW.GLFW_KEY_LEFT) {
- if (cursorPosition > 0) {
- cursorPosition--;
- }
- } else if (keyCode == GLFW.GLFW_KEY_RIGHT) {
- if (cursorPosition < text.length()) {
- cursorPosition++;
- }
- }
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- int scrollOffset = getScrollOffset();
- String visibleText = text.substring(scrollOffset);
-
- int newCursorPos = scrollOffset;
- float textWidth = 0;
-
- for (int i = 0; i < visibleText.length(); i++) {
- textWidth = SaturnClient.client.textRenderer.getWidth(visibleText.substring(0, i + 1)) * 0.6f;
-
- if (textWidth > mouseX) {
- break;
- }
-
- newCursorPos++;
- }
-
- cursorPosition = newCursorPos;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- checkReset();
-
- renderScope.drawRoundedRectangle(0, 0, width, height, 10, 0xFF000000);
-
- int scrollOffset = getScrollOffset();
- String visibleText = getVisibleText(scrollOffset);
- int textColor = focused ? 0xFFFFFF : 0xAAAAAA;
- renderScope.drawText(0.6f, visibleText, 4, 4, Theme.FONT.value, textColor);
-
- if (focused) {
- int cursorX = 4 +
- (int) (Fonts.getWidth(visibleText.substring(0, cursorPosition - scrollOffset), Theme.FONT.value)
- * 0.6f);
-
- renderScope.drawRect(cursorX, 2, 1, height - 4, 0xFFFFFFFF);
- }
- }
-
- protected int getScrollOffset() {
- if (text.isEmpty()) {
- return 0;
- }
-
- int offset = 0;
- int maxWidth = width - 4; // Available width for text
- while (offset < cursorPosition) { // Ensure cursor remains visible
- String visibleText = text.substring(offset, cursorPosition);
- if (Fonts.getWidth(visibleText, Theme.FONT.value) > maxWidth) {
- offset++;
- } else {
- break;
- }
- }
- return offset;
- }
-
- protected String getVisibleText(int scrollOffset) {
- String visibleText = text.substring(scrollOffset);
-
- // Ensure text does not overflow past the available width
- for (int i = 1; i <= visibleText.length(); i++) {
- if (Fonts.getWidth(visibleText.substring(0, i), Theme.FONT.value) > width - 4) {
- return visibleText.substring(0, i - 1); // Trim overflow
- }
- }
- return visibleText;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/IntInput.java b/src/main/java/org/saturnclient/ui2/components/inputs/IntInput.java
deleted file mode 100644
index af43dc8..0000000
--- a/src/main/java/org/saturnclient/ui2/components/inputs/IntInput.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.saturnclient.ui2.components.inputs;
-
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class IntInput extends Input {
- public Property prop;
-
- public IntInput(Property prop) {
- this.width = 120;
- this.height = Fonts.getHeight();
- this.prop = prop;
- this.text = String.valueOf(prop.value);
- }
-
- @Override
- public void charTyped(char chr) {
- if ((Character.isDigit(chr) || chr == '.' || (chr == '-' && cursorPosition == 0)) && text.length() < 10) {
- if (text.equals("0") && cursorPosition == 1) {
- text = "" + chr;
- } else {
- text = text.substring(0, cursorPosition) +
- chr +
- text.substring(cursorPosition);
-
- try {
- prop.value = text.isEmpty() ? 0 : Integer.parseInt(text);
- cursorPosition++;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
-
- @Override
- public void backspace() {
- try {
- if (text.length() == 0) {
- text = "0";
- cursorPosition = 1;
- }
- prop.value = Integer.parseInt(text);
- ConfigManager.save();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public void checkReset() {
- if (prop.isReset) {
- this.text = String.valueOf(prop.value);
- this.cursorPosition = 0;
- prop.isReset = false;
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/KeybindingSelector.java b/src/main/java/org/saturnclient/ui2/components/inputs/KeybindingSelector.java
deleted file mode 100644
index e4ebafc..0000000
--- a/src/main/java/org/saturnclient/ui2/components/inputs/KeybindingSelector.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.saturnclient.ui2.components.inputs;
-
-import org.lwjgl.glfw.GLFW;
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class KeybindingSelector extends Element {
- Property prop;
-
- public KeybindingSelector(Property prop) {
- this.prop = prop;
- this.width = 120;
- this.height = Fonts.getHeight();
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- int textColor = focused ? 0xFFFFFF : 0xAAAAAA;
- renderScope.drawRoundedRectangle(0, 0, width, height, 10, 0xFF000000);
- String name = GLFW.glfwGetKeyName(prop.value, GLFW.glfwGetKeyScancode(prop.value));
-
- renderScope.drawText(0.6f,
- prop.value == -1 ? ""
- : name != null ? name.toUpperCase() : "",
- 4, 4, Theme.FONT.value, textColor);
- }
-
- @Override
- public void keyPressed(int keyCode, int scanCode, int modifiers) {
- if (keyCode == GLFW.GLFW_KEY_BACKSPACE) {
- prop.value = -1;
- } else {
- prop.value = keyCode;
- }
- focused = false;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/Select.java b/src/main/java/org/saturnclient/ui2/components/inputs/Select.java
deleted file mode 100644
index 59c2c65..0000000
--- a/src/main/java/org/saturnclient/ui2/components/inputs/Select.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.saturnclient.ui2.components.inputs;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.Utils;
-import org.saturnclient.ui2.resources.Fonts;
-import net.minecraft.client.render.RenderLayer;
-
-public class Select extends Element {
- private Property prop;
-
- public Select(Property prop) {
- this.prop = prop;
- this.width = 150;
- this.height = 15;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.setRenderLayer(RenderLayer::getGuiTextured);
-
- renderScope.drawText(0.8f, "<", 0, 0, Theme.FONT.value, Theme.FOREGROUND.value);
-
- String text = prop.getSelection();
-
- renderScope.drawText(0.6f, text, (int) (width - ((float) Fonts.getWidth(text, Theme.FONT.value) * 0.6f)) / 2, 1,
- Theme.FONT.value, Theme.FOREGROUND.value);
-
- renderScope.drawText(0.8f, ">", width - 10, 0, Theme.FONT.value, Theme.FOREGROUND.value);
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- if (Utils.isHovering(mouseX - (width - 10), mouseY, 10, height, 1.0f)) {
- prop.next();
- } else if (Utils.isHovering(mouseX, mouseY, 10, height, 1.0f)) {
- prop.prev();
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/components/inputs/Toggle.java b/src/main/java/org/saturnclient/ui2/components/inputs/Toggle.java
deleted file mode 100644
index 0ff8705..0000000
--- a/src/main/java/org/saturnclient/ui2/components/inputs/Toggle.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.saturnclient.ui2.components.inputs;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-
-public class Toggle extends Element {
- private Property prop;
-
- public Toggle(Property prop) {
- this.prop = prop;
- this.width = 60;
- this.height = 30;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.drawRoundedRectangle(0, 0, width, height, height,
- Theme.withAlpha(0.5f, prop.value ? Theme.ACCENT.value : Theme.PRIMARY.value));
- renderScope.drawRoundedRectangle(prop.value ? 30 : 0, 0, 30, 30, 30,
- prop.value ? Theme.ACCENT.value : Theme.PRIMARY.value);
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- prop.value = !prop.value;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/AnimationStagger.java b/src/main/java/org/saturnclient/ui2/elements/AnimationStagger.java
deleted file mode 100644
index f2b8778..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/AnimationStagger.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.components.ElementRenderer;
-
-public class AnimationStagger extends Element {
- protected List children = new ArrayList<>();
- public int delay;
-
- public AnimationStagger(int delay) {
- this.delay = delay;
- }
-
- public AnimationStagger(AnimationConfig config) {
- this.delay = config.stagger.value;
- }
-
- public void draw(Element element) {
- if (!Config.stagger.value) {
- element.animation = null;
- }
-
- if (element.animation != null) {
- element.animation.delay = delay * children.size();
- }
-
- ElementRenderer.draw(children, element);
-
- this.height = Math.max(this.height, element.y + element.height);
- this.width = Math.max(this.width, element.x + element.width);
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- ElementRenderer.render(children, ctx.elapsed, renderScope,
- ctx.mouseX,
- ctx.mouseY);
- }
-
- @Override
- public void mouseClicked(double mouseX, double mouseY, int button) {
- ElementRenderer.mouseClicked(children, mouseX, mouseY, button);
- }
-
- @Override
- public void keyPressed(int keyCode, int scanCode, int modifiers) {
- ElementRenderer.keyPressed(children, keyCode, scanCode, modifiers);
- }
-
- @Override
- public void mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
- ElementRenderer.mouseDragged(children, mouseX, mouseY, button, deltaX, deltaY);
- }
-
- @Override
- public void mouseReleased(double mouseX, double mouseY, int button) {
- ElementRenderer.mouseReleased(children, mouseX, mouseY, button);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/Button.java b/src/main/java/org/saturnclient/ui2/elements/Button.java
deleted file mode 100644
index 4774f11..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/Button.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class Button extends Element {
- private String text;
- private Runnable onClick;
-
- public Button(String text, Runnable onClick) {
- this.text = text;
- this.onClick = onClick;
- this.dimensions(Fonts.getWidth(text, Theme.FONT.value) + 50, 38);
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value,
- ctx.isHovering() ? Theme.ACCENT.value : Theme.PRIMARY.value);
-
- renderScope.drawText(text, Fonts.centerX(width, text, Theme.FONT.value), Fonts.centerY(height),
- Theme.FONT.value,
- ctx.isHovering() ? Theme.ACCENT_FG.value : Theme.PRIMARY_FG.value);
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- if (onClick != null) {
- onClick.run();
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/ClickableTexture.java b/src/main/java/org/saturnclient/ui2/elements/ClickableTexture.java
deleted file mode 100644
index 877eeea..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/ClickableTexture.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.util.Identifier;
-
-public class ClickableTexture extends Element {
- Identifier sprite;
- private Runnable onClick;
-
- public ClickableTexture(Identifier sprite, Runnable onClick) {
- this.sprite = sprite;
- this.onClick = onClick;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.setRenderLayer(RenderLayer::getGuiTextured);
- renderScope.drawTexture(sprite, 0, 0, 0, 0, width, height,
- ctx.isHovering() ? Theme.ACCENT.value : Theme.PRIMARY.value);
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- if (onClick != null) {
- onClick.run();
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/ImageTexture.java b/src/main/java/org/saturnclient/ui2/elements/ImageTexture.java
deleted file mode 100644
index 037ef31..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/ImageTexture.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.SvgTexture;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.util.Identifier;
-
-public class ImageTexture extends Element {
- Identifier sprite;
-
- public ImageTexture(Identifier sprite) {
- this.sprite = sprite;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- if (sprite.toString().endsWith(".svg")) {
- MinecraftClient client = MinecraftClient.getInstance();
-
- // Get the actual window pixel dimensions for the image
- int renderWidth = (int) (width * client.getWindow().getFramebufferWidth() / client.getWindow().getWidth());
- int renderHeight = (int) (height * client.getWindow().getFramebufferHeight() / client.getWindow().getHeight());
-
- sprite = SvgTexture.getSvg(client, sprite, renderWidth * 2, renderHeight * 2);
- }
-
- renderScope.drawTexture(sprite, 0, 0, 0, 0, width, height);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/Notification.java b/src/main/java/org/saturnclient/ui2/elements/Notification.java
deleted file mode 100644
index 72fae8d..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/Notification.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.anim.SlideX;
-import org.saturnclient.ui2.resources.Fonts;
-import org.saturnclient.ui2.resources.Textures;
-
-public class Notification extends Element {
- private static Property error = Property.color(0xFFbf212f);
- private static Property info = Property.color(0xFF264b96);
- private static Property success = Property.color(0xFF27b376);
-
- public static enum NotificationKind {
- Error,
- Info,
- Success,
- }
-
- NotificationKind kind;
- String text;
- String title;
-
- public Notification(int width, int height, NotificationKind kind, String title, String text) {
- this.kind = kind;
- this.text = text;
- this.title = title;
- this.width = (int) Math.max(Fonts.getWidth(text, 1) * 0.6f, Fonts.getWidth(title, 1)) + 20;
- this.height = 50;
- this.x = width - this.width - 15;
- this.y = height - this.height - 15;
- this.animation = new SlideX(700, -width);
- this.duration = 3000;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.drawRoundedRectangle(0, 0, width, height, 10, Theme.PRIMARY.value);
- switch (kind) {
- case Error:
- renderScope.drawTexture(Textures.CIRCLE_X, 9, 9, 0, 0, 15, 15, error.value);
- break;
-
- case Info:
- renderScope.drawTexture(Textures.INFO, 9, 9, 0, 0, 15, 15, info.value);
- break;
-
- case Success:
- renderScope.drawTexture(Textures.CHECK, 9, 9, 0, 0, 15, 15, success.value);
- break;
- }
- renderScope.drawText(0.7f, title, 32, 10, 1, -1);
- renderScope.drawText(0.5f, text, 32, 28, 1, -1);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/Scroll.java b/src/main/java/org/saturnclient/ui2/elements/Scroll.java
deleted file mode 100644
index 780e9b8..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/Scroll.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.components.ElementRenderer;
-
-public class Scroll extends Element {
- private static Property scrollBarRadius = Property.integer(10);
- private static Property scrollBarWidth = Property.integer(5);
- private static Property scrollBarPadding = Property.integer(5);
-
- int padding = 0;
-
- protected List children = new ArrayList<>();
- int scroll = 0;
- int maxScroll = 0;
-
- public Scroll(int padding) {
- this.padding = padding;
- }
-
- public void draw(Element element) {
- ElementRenderer.draw(children, element);
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- calculateMaxScroll();
-
- renderScope.drawRoundedRectangle(0, 0, width, height,
- Theme.BG_RADIUS.value, Theme.BACKGROUND.value);
-
- renderScope.enableScissor(padding, padding, width - padding, height - padding);
- renderScope.matrices.push();
- renderScope.matrices.translate(padding, -scroll + padding, 0);
-
- ElementRenderer.render(children, ctx.elapsed, renderScope,
- ctx.mouseX - padding,
- ctx.mouseY - padding + scroll);
-
- renderScope.matrices.pop();
- renderScope.disableScissor();
-
- if (maxScroll > 0) {
- renderScope.drawRoundedRectangle(
- width - scrollBarWidth.value - scrollBarPadding.value,
- calculateScrollBarY(),
- scrollBarWidth.value,
- calculateScrollBarHeight(),
- scrollBarRadius.value,
- Theme.SCROLL.value);
- }
- }
-
- @Override
- public void scroll(int mouseX, int mouseY, double horizontalAmount, double verticalAmount) {
- scroll -= verticalAmount;
- if (scroll < 0) {
- scroll = 0;
- } else if (scroll > maxScroll) {
- scroll = maxScroll;
- }
- }
-
- @Override
- public Element dimensions(int width, int height) {
- super.dimensions(width, height);
-
- maxScroll = 0;
- for (Element element : children) {
- maxScroll = Math.max(maxScroll, (element.y + element.height + padding) - (height - padding * 2));
- }
-
- return this;
- }
-
- int calculateScrollBarHeight() {
- if (maxScroll <= 0)
- return height - (scrollBarPadding.value * 2);
- return Math.max(20, (height * height) / (height + maxScroll + 10)) - (scrollBarPadding.value * 2);
- }
-
- int calculateScrollBarY() {
- int scrollBarHeight = calculateScrollBarHeight();
- if (maxScroll <= 0) return scrollBarPadding.value;
- int y = (scroll * (height - scrollBarHeight - scrollBarPadding.value * 2)) / maxScroll + scrollBarPadding.value;
- return Math.min(y, height - scrollBarHeight - scrollBarPadding.value);
- }
-
- private void calculateMaxScroll() {
- maxScroll = 0;
-
- for (Element element : children) {
- int bottom = element.y + element.height;
- maxScroll = Math.max(maxScroll, bottom - height + padding);
- }
-
- if (maxScroll > 0) {
- maxScroll = maxScroll + 10;
- } else {
- maxScroll = 0;
- }
- }
-
- @Override
- public void keyPressed(int keyCode, int scanCode, int modifiers) {
- ElementRenderer.keyPressed(children, keyCode, scanCode, modifiers);
- }
-
- @Override
- public void mouseClicked(double mouseX, double mouseY, int button) {
- ElementRenderer.mouseClicked(children, mouseX - padding, mouseY - padding + scroll, button);
- }
-
- @Override
- public void mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
- ElementRenderer.mouseDragged(children, mouseX - padding, mouseY - padding + scroll, button, deltaX, deltaY);
- }
-
- @Override
- public void mouseReleased(double mouseX, double mouseY, int button) {
- ElementRenderer.mouseReleased(children, mouseX - padding, mouseY - padding + scroll, button);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/TabMenu.java b/src/main/java/org/saturnclient/ui2/elements/TabMenu.java
deleted file mode 100644
index b41757b..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/TabMenu.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.Utils;
-
-import net.minecraft.util.Identifier;
-
-public class TabMenu extends Element {
- public static class TabMenuComponent {
- Runnable onClick;
- Identifier sprite;
-
- public TabMenuComponent(Identifier sprite, Runnable onClick) {
- this.onClick = onClick;
- this.sprite = sprite;
- }
- }
-
- TabMenuComponent[] components;
- public int selectedScreen = 0;
-
- public TabMenu(int active, TabMenuComponent... components) {
- this.components = components;
- width = 25 * components.length + 6;
- height = 30;
- this.selectedScreen = active;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value, Theme.PRIMARY.value);
-
- int col = 0;
- for (TabMenuComponent component : components) {
- int x = 25 * col + 5;
-
- boolean hovering = ctx.isHovering(x, 5, 20, 20) || selectedScreen == col;
-
- if (hovering) {
- renderScope.drawRoundedRectangle(x, 5, 20, 20, Theme.WIDGET_RADIUS.value, Theme.ACCENT.value);
- }
-
- renderScope.drawTexture(component.sprite, x + 5, 10, 0, 0, 10, 10,
- hovering ? Theme.ACCENT_FG.value : Theme.PRIMARY_FG.value);
-
- col++;
- }
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- int col = 0;
- for (TabMenuComponent component : components) {
- int x = 25 * col + 5;
- if (Utils.isHovering(mouseX - x, mouseY - 5, 20, 20, 1.0f)) {
- component.onClick.run();
- }
- col++;
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/Text.java b/src/main/java/org/saturnclient/ui2/elements/Text.java
deleted file mode 100644
index 285433d..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/Text.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class Text extends Element {
- private String text;
-
- public Text(String text) {
- this.text = text;
- width = Fonts.getWidth(text, Theme.FONT.value);
- height = Fonts.getHeight();
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.drawText(this.text, 0, 0, Theme.FONT.value, Theme.FOREGROUND.value);
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/elements/TextureButton.java b/src/main/java/org/saturnclient/ui2/elements/TextureButton.java
deleted file mode 100644
index ccbf1ba..0000000
--- a/src/main/java/org/saturnclient/ui2/elements/TextureButton.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.saturnclient.ui2.elements;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.Element;
-import org.saturnclient.ui2.ElementContext;
-import org.saturnclient.ui2.RenderScope;
-
-import net.minecraft.client.render.RenderLayer;
-import net.minecraft.util.Identifier;
-
-public class TextureButton extends Element {
- Identifier sprite;
- private Runnable onClick;
- static int padding = 14;
-
- public TextureButton(Identifier sprite, Runnable onClick) {
- this.sprite = sprite;
- this.onClick = onClick;
- }
-
- @Override
- public void render(RenderScope renderScope, ElementContext ctx) {
- renderScope.drawRoundedRectangle(0, 0, width, height, Theme.WIDGET_RADIUS.value,
- ctx.isHovering() ? Theme.ACCENT.value : Theme.PRIMARY.value);
-
- renderScope.setRenderLayer(RenderLayer::getGuiTextured);
-
- int texWidth = width - padding;
- int texHeight = height - padding;
-
- renderScope.drawTexture(sprite, padding / 2, padding / 2, 0, 0, texWidth, texHeight,
- ctx.isHovering() ? Theme.ACCENT_FG.value : Theme.PRIMARY_FG.value);
- }
-
- @Override
- public void click(int mouseX, int mouseY) {
- if (onClick != null) {
- onClick.run();
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/resources/Fonts.java b/src/main/java/org/saturnclient/ui2/resources/Fonts.java
deleted file mode 100644
index 5233f45..0000000
--- a/src/main/java/org/saturnclient/ui2/resources/Fonts.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.saturnclient.ui2.resources;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import net.minecraft.text.Style;
-import net.minecraft.text.Text;
-import net.minecraft.util.Identifier;
-
-public class Fonts {
- public static final Identifier INTER = Identifier.of("saturnclient", "inter");
- public static final Identifier INTER_BOLD = Identifier.of("saturnclient", "inter_bold");
- public static final Identifier DEFAULT = Identifier.ofVanilla("default");
-
- public static Identifier getFont(int font) {
- switch (font) {
- case 0:
- return DEFAULT;
- case 1:
- return INTER;
- default:
- return INTER_BOLD;
- }
- }
-
- public static Text setFont(String text, Identifier font) {
- return Text.literal(text).setStyle(
- Style.EMPTY.withFont(font));
- }
-
- public static int getWidth(String text, int font) {
- int w = 0;
- for (String line : text.split("\n")) {
- w = Math.max(w, getWidth(line, getFont(font)));
- }
- if (font == 0) {
- return w * 2;
- } else {
- return w;
- }
- }
-
- private static int getWidth(String text, Identifier font) {
- return SaturnClient.client.textRenderer.getWidth(setFont(text, font));
- }
-
- public static int getHeight() {
- return 18;
- }
-
- public static int centerX(int w, String text, int font) {
- return (w - Fonts.getWidth(text, font)) / 2;
- }
-
- public static int centerY(int h) {
- return (h - 18) / 2;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java b/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java
deleted file mode 100644
index 6cc79d3..0000000
--- a/src/main/java/org/saturnclient/ui2/resources/SvgTexture.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.saturnclient.ui2.resources;
-
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.kitfox.svg.SVGDiagram;
-import com.kitfox.svg.SVGUniverse;
-
-import org.jetbrains.annotations.Nullable;
-import org.saturnclient.cosmetics.cloak.utils.IdentifierUtils;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.util.Identifier;
-
-public class SvgTexture {
-
- private static List svgCache = new ArrayList<>();
-
- private static BufferedImage renderSvg(InputStream svgStream, int width, int height) throws Exception {
- // Load SVG
- SVGUniverse universe = new SVGUniverse();
- java.net.URI uri = universe.loadSVG(svgStream, "tempSvg");
- SVGDiagram diagram = universe.getDiagram(uri);
-
- // Get intrinsic size of SVG
- float svgWidth = (float) diagram.getWidth();
- float svgHeight = (float) diagram.getHeight();
-
- // Compute scale factors
- float scaleX = width / svgWidth;
- float scaleY = height / svgHeight;
-
- // Create output image
- BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
- Graphics2D g = image.createGraphics();
-
- // Enable anti-aliasing for smooth scaling
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
-
- // Apply scaling transform
- g.scale(scaleX, scaleY);
-
- // Render SVG
- diagram.render(g);
-
- g.dispose();
- return image;
- }
-
- @Nullable
- public static Identifier getSvg(MinecraftClient client, Identifier svgImage, int width, int height) {
- Identifier id = Identifier
- .of(svgImage.toString().replaceAll("\\.svg$", (width + "_" + height).toString() + ".png"));
-
- if (svgCache.contains(id)) {
- return id;
- }
-
- try (InputStream svgStream = client
- .getResourceManager()
- .getResource(svgImage).get()
- .getInputStream()) {
-
- BufferedImage image = renderSvg(svgStream, width, height);
-
- IdentifierUtils.registerBufferedImageTexture(id, image);
-
- return id;
-
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/org/saturnclient/ui2/resources/Textures.java b/src/main/java/org/saturnclient/ui2/resources/Textures.java
deleted file mode 100644
index 35a238c..0000000
--- a/src/main/java/org/saturnclient/ui2/resources/Textures.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.saturnclient.ui2.resources;
-
-import net.minecraft.util.Identifier;
-
-public class Textures {
- public static final Identifier CROSSHAIR_RANGE = Identifier.of("saturnclient", "textures/gui/hud/crosshair_range.png");
- public static final Identifier COSMETICS = Identifier.of("saturnclient", "textures/gui/components/cosmetics.png");
- public static final Identifier HUD_ICON = Identifier.of("saturnclient", "textures/gui/components/hud.png");
- public static final Identifier SEARCH = Identifier.of("saturnclient", "textures/gui/components/search.png");
- public static final Identifier CLOSE = Identifier.of("saturnclient", "textures/gui/components/close.png");
- public static final Identifier MODS_TAB = Identifier.of("saturnclient", "textures/gui/components/mods_tab.png");
- public static final Identifier SETTINGS = Identifier.of("saturnclient", "textures/gui/components/settings.png");
- public static final Identifier CLOAK = Identifier.of("saturnclient", "textures/gui/components/cloak.png");
- public static final Identifier HAT = Identifier.of("saturnclient", "textures/gui/components/hat.png");
- public static final Identifier RESET = Identifier.of("saturnclient", "textures/gui/components/reset.png");
- public static final Identifier TOGGLE_INDICATOR = Identifier.of("saturnclient",
- "textures/gui/components/toggle_indicator.png");
- public static final Identifier LEFT = Identifier.of("saturnclient", "textures/gui/components/left.png");
- public static final Identifier RIGHT = Identifier.of("saturnclient", "textures/gui/components/right.png");
- public static final Identifier STORE = Identifier.of("saturnclient", "textures/gui/components/store.png");
- public static final Identifier COINS = Identifier.of("saturnclient", "textures/gui/components/coins.png");
- public static final Identifier SHIRT = Identifier.of("saturnclient", "textures/gui/components/shirt.png");
- public static final Identifier CIRCLE_X = Identifier.of("saturnclient", "textures/gui/components/circle_x.png");
- public static final Identifier INFO = Identifier.of("saturnclient", "textures/gui/components/info.png");
- public static final Identifier CHECK = Identifier.of("saturnclient", "textures/gui/components/check.png");
-
- public static final Identifier LOGO = Identifier.of("saturnclient", "textures/logo/logo.png");
- public static final Identifier REALISTIC_LOGO = Identifier.of("saturnclient", "textures/logo/realistic.png");
- public static final Identifier LOGO_TEXT = Identifier.of("saturnclient", "textures/logo/text.png");
- public static final Identifier LOGO_TEXT_BIG = Identifier.of("saturnclient", "textures/logo/text_big.png");
- public static final Identifier SPLASH = Identifier.of("saturnclient", "textures/gui/splash.png");
-
- // Widgets
- public static final Identifier BUTTON_BORDER = Identifier.of("saturnclient", "button_border");
- public static final Identifier BUTTON = Identifier.of("saturnclient", "button");
- public static final Identifier BUTTON_OP = Identifier.of("saturnclient", "button_op");
- public static final Identifier SETTINGS_BG = Identifier.of("saturnclient", "settings_bg");
- public static final Identifier RECT = Identifier.of("saturnclient", "rect");
- public static final Identifier RECT_BORDER = Identifier.of("saturnclient", "rect_border");
- public static final Identifier MOD = Identifier.of("saturnclient", "textures/gui/components/mod.png");
- public static final Identifier MOD_BG = Identifier.of("saturnclient", "textures/gui/components/mod_bg.png");
-
- public static Identifier getCloakPreview(String cloak) {
- return Identifier.of("saturnclient", "textures/gui/cloak/" + (cloak.isEmpty() ? "none" : cloak) + ".png");
- }
-
- public static Identifier getHatPreview(String hat) {
- return Identifier.of("saturnclient", "textures/gui/hat/" + (hat.isEmpty() ? "none" : hat) + ".png");
- }
-
- public static Identifier getEmotePreview(String emote) {
- return Identifier.of("saturnclient", "textures/gui/emote/" + (emote == null ? "none" : emote) + ".png");
- }
-
- public static Identifier getModIcon(String modId) {
- return Identifier.of("saturnclient", "textures/gui/mod/" + modId + ".svg");
- }
-
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java b/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java
deleted file mode 100644
index 52d2f55..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/ConfigEditor.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.saturnclient.ui2.screens;
-
-import java.util.Map;
-
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.saturnclient.config.manager.ConfigManager;
-import org.saturnclient.saturnclient.config.manager.Property;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.components.Sidebar;
-import org.saturnclient.ui2.components.inputs.FloatInput;
-import org.saturnclient.ui2.components.inputs.HexInput;
-import org.saturnclient.ui2.components.inputs.IntInput;
-import org.saturnclient.ui2.components.inputs.KeybindingSelector;
-import org.saturnclient.ui2.components.inputs.Select;
-import org.saturnclient.ui2.components.inputs.Toggle;
-import org.saturnclient.ui2.elements.Scroll;
-import org.saturnclient.ui2.elements.Text;
-import org.saturnclient.ui2.resources.Fonts;
-
-public class ConfigEditor extends SaturnScreen {
- private ConfigManager config;
-
- public ConfigEditor(ConfigManager config) {
- super("Config Editor");
-
- this.config = config;
- }
-
- @Override
- public void ui() {
- int p = 10;
- int g = 10;
-
- Scroll scroll = new Scroll(p);
-
- drawProperties(scroll, config.getProperties(), 0, 0, 480 + 10 + (g * 2));
-
- int scrollWidth = 480 + 10 + (g * 2) + (p * 2);
-
- draw(scroll.dimensions(scrollWidth, 350).center(width, height));
-
- draw(new Sidebar(1, this::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0));
- }
-
- @SuppressWarnings("unchecked")
- private int drawProperties(Scroll configScroll, Map> properties, int row, int col, int w) {
- for (Map.Entry> propEntry : properties.entrySet()) {
- Property> prop = propEntry.getValue();
- String propName = propEntry.getKey();
- boolean full = isFull(prop);
-
- // Always reset to col 0 if full-width component needs to be drawn mid-row
- if (full && col != 0) {
- col = 0;
- row++;
- }
-
- int modX = (w / 2) * col; // two-column layout
- int modY = 25 * row;
-
- if (prop.getType() == Property.PropertyType.NAMESPACE) {
- configScroll.draw(
- new Text(
- propName).position(Fonts.centerX(520, propName, Theme.FONT.value), modY + 1)
- .scale(0.7f));
- } else {
- configScroll.draw(
- new Text(
- propName).position(modX, modY + 1).scale(0.7f));
- }
-
- switch (prop.getType()) {
- case BOOLEAN:
- configScroll.draw(
- new Toggle((Property) prop)
- .position(modX + (w / 2) - 40, modY)
- .scale(0.5f));
- break;
-
- case HEX:
- configScroll.draw(new HexInput((Property) prop).position(w / 2, modY));
- break;
-
- case INTEGER:
- configScroll.draw(new IntInput((Property) prop).position(w / 2, modY));
- break;
-
- case FLOAT:
- configScroll.draw(new FloatInput((Property) prop).position(w / 2, modY));
- break;
-
- case NAMESPACE:
- Map> nestedProperties = (Map>) prop.value;
- row = drawProperties(configScroll, nestedProperties, row + 1, col, w);
- break;
-
- case SELECT:
- configScroll.draw(new Select((Property) prop).position(w / 2, modY));
- break;
-
- case KEYBINDING:
- configScroll.draw(new KeybindingSelector((Property) prop).position(w / 2, modY));
- break;
-
- case STRING:
- }
-
- if (full) {
- row++; // full-width takes a whole row
- col = 0;
- } else {
- col++;
- if (col > 1) { // max 2 columns
- col = 0;
- row++;
- }
- }
- }
-
- return row;
- }
-
- public static boolean isFull(Property> prop) {
- switch (prop.getType()) {
- case BOOLEAN:
- return false;
- default:
- return true;
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java b/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java
deleted file mode 100644
index 96fa7f6..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/EmoteWheel.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package org.saturnclient.ui2.screens;
-
-import org.saturnclient.cosmetics.Emotes;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.ServiceClient;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.Utils;
-import org.saturnclient.ui2.anim.Fade;
-import org.saturnclient.ui2.anim.SlideY;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.ImageTexture;
-import org.saturnclient.ui2.elements.TextureButton;
-import org.saturnclient.ui2.resources.Textures;
-
-import dev.kosmx.playerAnim.api.layered.AnimationStack;
-import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationAccess;
-import dev.kosmx.playerAnim.minecraftApi.PlayerAnimationRegistry;
-import net.minecraft.util.Identifier;
-
-public class EmoteWheel extends SaturnScreen {
- int page = 1;
-
- public EmoteWheel() {
- super("Emote Wheel");
- }
-
- @Override
- public void ui() {
- int row = 0;
- int col = 0;
-
- // =============================
- // Logo
- // =============================
-
- draw(new ImageTexture(Textures.LOGO_TEXT)
- .dimensions(98, 10)
- .centerOffset(width, height, 0, -105)
- .animation(new Fade(AnimationConfig.logo.duration.value)));
-
- draw(new ImageTexture(Config.getLogo())
- .dimensions(98, 98)
- .centerOffset(width, height, 0, -149)
- .animation(new SlideY(AnimationConfig.logo, -20)));
-
- // =============================
- // Navigation Buttons
- // =============================
-
- draw(new TextureButton(Textures.LEFT, () -> {
- if (page > 1) {
- page--;
- elements.clear();
- ui();
- }
- }).dimensions(30, 30)
- .centerOffset(width, height, -50, 105)
- .animation(new Fade(500)));
-
- draw(new TextureButton(Textures.RIGHT, () -> {
- if ((page * 8) < Emotes.availableEmotes.size()) {
- page++;
- elements.clear();
- ui();
- }
- }).dimensions(30, 30)
- .centerOffset(width, height, 50, 105)
- .animation(new Fade(500)));
-
- // =============================
- // Emote Grid (Staggered)
- // =============================
-
- AnimationStagger emoteStagger = new AnimationStagger(AnimationConfig.emoteWheel);
-
- while (row < 3) {
-
- int idx = (row * 3 + col) + ((page - 1) * 8);
-
- if (row == 1 && col == 1) {
- col++;
- }
-
- String emote = Utils.getOrNull(Emotes.availableEmotes, idx);
-
- emoteStagger.draw(
- new TextureButton(Textures.getEmotePreview(emote), () -> {
-
- if (emote == null)
- return;
-
- AnimationStack animationStack = PlayerAnimationAccess.getPlayerAnimLayer(
- SaturnClient.client.player);
-
- if (animationStack.isActive()
- && animationStack.getPriority() == 1000) {
- animationStack.removeLayer(1000);
- }
-
- animationStack.addAnimLayer(
- 1000,
- PlayerAnimationRegistry
- .getAnimation(
- Identifier.of("saturnclient", emote))
- .playAnimation());
-
- ServiceClient.emote(emote);
- close();
- })
- .dimensions(70, 70)
- .centerOffset(width, height,
- -80 + (col * 80),
- -35 + (row * 80))
- .animation(new SlideY(AnimationConfig.emoteWheel, 12)));
-
- if (col < 2) {
- col++;
- } else {
- col = 0;
- row++;
- }
- }
-
- draw(emoteStagger);
- }
-
- @Override
- public boolean shouldPause() {
- return false;
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java b/src/main/java/org/saturnclient/ui2/screens/ModMenu.java
deleted file mode 100644
index 44b1aca..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/ModMenu.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.saturnclient.ui2.screens;
-
-import org.saturnclient.modules.ModManager;
-import org.saturnclient.modules.Module;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.anim.SlideFade;
-import org.saturnclient.ui2.components.SaturnModule;
-import org.saturnclient.ui2.components.Sidebar;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.ImageTexture;
-import org.saturnclient.ui2.elements.Scroll;
-import org.saturnclient.ui2.resources.Textures;
-
-public class ModMenu extends SaturnScreen {
- public ModMenu() {
- super("Mod Menu");
- }
-
- @Override
- public void ui() {
- int p = 10;
- int g = 10;
-
- Scroll scroll = new Scroll(p);
-
- int row = 0;
- int col = 0;
-
- AnimationStagger moduleStagger = new AnimationStagger(AnimationConfig.modMenu);
-
- for (Module mod : ModManager.ALL_MODS) {
- moduleStagger.draw(
- new SaturnModule(mod)
- .position((160 + g) * col, (50 + g) * row)
- .animation(new SlideFade(AnimationConfig.modMenu, -12)));
-
- if (col == 2) {
- col = 0;
- row++;
- } else {
- col++;
- }
- }
-
- scroll.draw(moduleStagger);
-
- int scrollWidth = 480 + 10 + (g * 2) + (p * 2);
-
- draw(scroll.dimensions(scrollWidth, 350).center(width, height));
-
- draw(new Sidebar(0, this::close).centerOffset(width, height, -(scrollWidth / 2 + 20), 0));
-
- draw(new ImageTexture(Textures.LOGO_TEXT_BIG).dimensions(180, 18).position(width - 180 - 20, height - 18 - 20));
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java b/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java
deleted file mode 100644
index 185120b..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/ShiftMenu.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.saturnclient.ui2.screens;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.saturnclient.menus.HudEditor;
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.ui2.screens.cosmetics.CloakMenu;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.Button;
-import org.saturnclient.ui2.elements.ImageTexture;
-import org.saturnclient.ui2.elements.TextureButton;
-import org.saturnclient.ui2.anim.Fade;
-import org.saturnclient.ui2.anim.SlideY;
-
-public class ShiftMenu extends SaturnScreen {
- public ShiftMenu() {
- super("Shift Menu");
- }
-
- @Override
- public void ui() {
- // Logo animations (unchanged)
- draw(new ImageTexture(Textures.LOGO_TEXT)
- .dimensions(98, 10)
- .centerOffset(width, height, 0, -36)
- .animation(new Fade(AnimationConfig.logo.duration.value)));
-
- draw(new ImageTexture(Config.getLogo())
- .dimensions(98, 98)
- .centerOffset(width, height, 0, -80)
- .animation(new SlideY(AnimationConfig.logo, -20)));
-
- // Spacing and sizes
- int btnWidth = 120;
- int btnHeight = 40;
- int spacing = 4;
-
- // Create stagger
-
- AnimationStagger stagger = new AnimationStagger(AnimationConfig.shiftMenu.stagger.value);
-
- stagger.draw(new TextureButton(Textures.HUD_ICON, () -> {
- client.setScreen(new HudEditor());
- }).dimensions(btnHeight, btnHeight).position(0, 0)
- .animation(new Fade(AnimationConfig.shiftMenu)));
-
- stagger.draw(new Button("Settings", () -> {
- SaturnClient.client.setScreen(new ModMenu());
- }).dimensions(btnWidth, btnHeight).position(btnHeight + spacing, 0)
- .animation(new Fade(AnimationConfig.shiftMenu)));
-
- stagger.draw(new TextureButton(Textures.COSMETICS, () -> {
- client.setScreen(new CloakMenu());
- }).dimensions(btnHeight, btnHeight).position(btnWidth + btnHeight + (spacing * 2), 0)
- .animation(new Fade(AnimationConfig.shiftMenu)));
-
- // Draw the stagger at the absolute center of the screen
- draw(stagger.dimensions(btnWidth + (btnHeight * 2) + (spacing * 2), btnHeight).centerOffset(width, height, 0,
- 0));
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java b/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java
deleted file mode 100644
index aa7101e..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/TitleMenu.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.saturnclient.ui2.screens;
-
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.saturnclient.config.Config;
-import org.saturnclient.saturnclient.menus.HudEditor;
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.ui2.screens.cosmetics.CloakMenu;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.anim.Fade;
-import org.saturnclient.ui2.anim.SlideFade;
-import org.saturnclient.ui2.anim.SlideY;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.Button;
-import org.saturnclient.ui2.elements.ImageTexture;
-import org.saturnclient.ui2.elements.TextureButton;
-import org.saturnclient.ui2.resources.Fonts;
-
-import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen;
-import net.minecraft.client.gui.screen.option.OptionsScreen;
-import net.minecraft.client.gui.screen.world.SelectWorldScreen;
-
-public class TitleMenu extends SaturnScreen {
- public TitleMenu() {
- super("Title Menu");
- }
-
- @Override
- public void ui() {
- backgroundBlur = 0;
-
- draw(new ImageTexture(Textures.LOGO_TEXT).dimensions(98, 10).centerOffset(width, height, 0, -40)
- .animation(new Fade(AnimationConfig.logo.duration.value)));
- draw(new ImageTexture(Config.getLogo()).dimensions(98, 98).centerOffset(width, height, 0, -84)
- .animation(new SlideY(AnimationConfig.logo, -20)));
-
- AnimationStagger mainButtonStagger = new AnimationStagger(AnimationConfig.mainMenu);
-
- mainButtonStagger.draw(new Button("SINGLEPLAYER", () -> {
- client.setScreen(new SelectWorldScreen(new TitleMenu()));
- }).scale(0.69f).dimensions(420, 52).position(0, 0)
- .animation(new SlideFade(AnimationConfig.mainMenu, -10)));
-
- mainButtonStagger.draw(new Button("MULTIPLAYER", () -> {
- client.setScreen(new MultiplayerScreen(new TitleMenu()));
- }).scale(0.69f).dimensions(420, 52).position(0, 40)
- .animation(new SlideFade(AnimationConfig.mainMenu, -10)));
-
- mainButtonStagger.draw(new Button("OPTIONS", () -> {
- client.setScreen(new OptionsScreen(new TitleMenu(), SaturnClient.client.options));
- }).scale(0.69f).dimensions(206, 52).position(0, 80)
- .animation(new SlideFade(AnimationConfig.mainMenu, -10)));
-
- mainButtonStagger.draw(new Button("QUIT", () -> {
- client.scheduleStop();
- }).scale(0.69f).dimensions(206, 52).position(146, 80)
- .animation(new SlideFade(AnimationConfig.mainMenu, -10)));
-
- draw(mainButtonStagger.dimensions(289, 143).centerOffset(width, height, 0, 50));
-
- int s = Fonts.getHeight() + 20;
-
- AnimationStagger saturnStagger = new AnimationStagger(AnimationConfig.mainMenu.stagger.value);
-
- saturnStagger.draw(new TextureButton(Textures.HUD_ICON, () -> {
- client.setScreen(new HudEditor());
- }).dimensions(s, s).position(0, 0).animation(new SlideFade(AnimationConfig.mainMenu, s + 8)));
-
- saturnStagger.draw(new TextureButton(Textures.SETTINGS, () -> {
- SaturnClient.client.setScreen(new ModMenu());
- }).dimensions(s, s).position(s + 2, 0)
- .animation(new SlideFade(AnimationConfig.mainMenu, s + 8)));
-
- saturnStagger.draw(new TextureButton(Textures.CLOAK, () -> {
- client.setScreen(new CloakMenu());
- }).dimensions(s, s).position((s + 2) * 2, 0)
- .animation(new SlideFade(AnimationConfig.mainMenu, s + 8)));
-
- draw(saturnStagger.dimensions(((s + 2) * 2) + s, s).centerHorizontal(width, height, 0, 8));
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java b/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java
deleted file mode 100644
index 724407a..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/cosmetics/CloakMenu.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.saturnclient.ui2.screens.cosmetics;
-
-import org.saturnclient.cosmetics.cloak.Cloaks;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.anim.Fade;
-import org.saturnclient.ui2.anim.SlideY;
-import org.saturnclient.ui2.components.CosmeticPreview;
-import org.saturnclient.ui2.components.Sidebar;
-import org.saturnclient.ui2.components.SkinPreview;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.Scroll;
-import org.saturnclient.ui2.elements.TabMenu;
-import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent;
-
-public class CloakMenu extends SaturnScreen {
- public CloakMenu() {
- super("Cloaks Menu");
- }
-
- @Override
- public void ui() {
- int p = 10;
- int g = 10;
-
- Scroll scroll = new Scroll(p);
-
- int row = 0;
- int col = 0;
-
- SaturnPlayer player = SaturnPlayer.get();
-
- AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
-
- if (player != null) {
- for (String cloak : Cloaks.availableCloaks) {
-
- stagger.draw(
- new CosmeticPreview(
- cloak == player.cloak,
- Textures.getCloakPreview(cloak),
- () -> Cloaks.setCloak(cloak))
- .position((50 + g) * col, (111 + g) * row)
- .animation(new SlideY(AnimationConfig.cosmeticsMenu, 14)));
-
- if (col == 5) {
- col = 0;
- row++;
- } else {
- col++;
- }
- }
- }
-
- scroll.draw(stagger);
-
- int scrollWidth = 480 + 10 + (g * 2) + (p * 2);
-
- draw(scroll
- .dimensions(scrollWidth, 350)
- .center(width, height));
-
- draw(new SkinPreview(-30.0f, false)
- .scale(3.5f)
- .position(scroll.x + (scrollWidth - 220), scroll.y + 40)
- .animation(new Fade(500)));
-
- draw(new Sidebar(2, this::close)
- .centerOffset(width, height, -(scrollWidth / 2 + 20), 0)
- .animation(new Fade(400)));
-
- draw(new TabMenu(0,
- new TabMenuComponent(Textures.CLOAK, () -> {
- }),
- new TabMenuComponent(Textures.HAT, () -> {
- SaturnClient.client.setScreen(new HatMenu());
- }))
- .centerOffset(width, height, 0, -195));
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java b/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java
deleted file mode 100644
index f21723a..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/cosmetics/HatMenu.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.saturnclient.ui2.screens.cosmetics;
-
-import org.saturnclient.cosmetics.hat.Hats;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.ui2.resources.Textures;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.anim.Fade;
-import org.saturnclient.ui2.anim.SlideY;
-import org.saturnclient.ui2.components.CosmeticPreview;
-import org.saturnclient.ui2.components.Sidebar;
-import org.saturnclient.ui2.components.SkinPreview;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.Scroll;
-import org.saturnclient.ui2.elements.TabMenu;
-import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent;
-
-public class HatMenu extends SaturnScreen {
- public HatMenu() {
- super("Hats Menu");
- }
-
- @Override
- public void ui() {
- int p = 10;
- int g = 10;
-
- Scroll scroll = new Scroll(p);
-
- int row = 0;
- int col = 0;
-
- SaturnPlayer player = SaturnPlayer.get();
-
- AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
-
- if (player != null) {
- for (String hat : Hats.availableHats) {
-
- stagger.draw(
- new CosmeticPreview(
- hat == player.hat,
- Textures.getHatPreview(hat),
- () -> Hats.setHat(hat))
- .dimensions(50, 50)
- .position((50 + g) * col, (50 + g) * row)
- .animation(new SlideY(AnimationConfig.cosmeticsMenu, 14)));
-
- if (col == 5) {
- col = 0;
- row++;
- } else {
- col++;
- }
- }
- }
-
- scroll.draw(stagger);
-
- int scrollWidth = 480 + 10 + (g * 2) + (p * 2);
-
- draw(scroll
- .dimensions(scrollWidth, 350)
- .center(width, height));
-
- draw(new SkinPreview(170f, true)
- .scale(3.5f)
- .position(scroll.x + (scrollWidth - 220), scroll.y + 40)
- .animation(new Fade(500)));
-
- draw(new Sidebar(2, this::close)
- .centerOffset(width, height, -(scrollWidth / 2 + 20), 0)
- .animation(new Fade(400)));
-
- draw(new TabMenu(1,
- new TabMenuComponent(Textures.CLOAK, () -> {
- SaturnClient.client.setScreen(new CloakMenu());
- }),
- new TabMenuComponent(Textures.HAT, () -> {
- }))
- .centerOffset(width, height, 0, -195));
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java b/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java
deleted file mode 100644
index 2978972..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/store/CloakStore.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package org.saturnclient.ui2.screens.store;
-
-import org.saturnclient.cosmetics.cloak.Cloaks;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.ServiceClient;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.Utils;
-import org.saturnclient.ui2.anim.Fade;
-import org.saturnclient.ui2.anim.SlideY;
-import org.saturnclient.ui2.components.CosmeticPreview;
-import org.saturnclient.ui2.components.Sidebar;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.ImageTexture;
-import org.saturnclient.ui2.elements.Notification.NotificationKind;
-import org.saturnclient.ui2.elements.Scroll;
-import org.saturnclient.ui2.elements.TabMenu;
-import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent;
-import org.saturnclient.ui2.elements.Text;
-import org.saturnclient.ui2.resources.Fonts;
-import org.saturnclient.ui2.resources.Textures;
-
-import com.mojang.blaze3d.systems.RenderSystem;
-
-public class CloakStore extends SaturnScreen {
- private long lastPurchaseTime = 0;
-
- public CloakStore() {
- super("Cloak Store");
- }
-
- public CloakStore(long lastPurchaseTime) {
- super("Cloak Store");
- this.lastPurchaseTime = lastPurchaseTime;
- }
-
- @Override
- public void ui() {
- int p = 10;
- int gx = 10;
- int gy = 20;
-
- Scroll scroll = new Scroll(p);
-
- int row = 0;
- int col = 0;
-
- SaturnPlayer player = SaturnPlayer.get();
-
- AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
-
- if (player != null) {
- for (String cloak : Cloaks.ALL_CLOAKS) {
- if (!Cloaks.availableCloaks.contains(cloak)) {
-
- int x = (50 + gx) * col;
- int y = (111 + gy) * row;
-
- stagger.draw(
- new CosmeticPreview(
- cloak == player.cloak,
- Textures.getCloakPreview(cloak),
- () -> handlePurchase(cloak))
- .position(x, y)
- .animation(new SlideY(AnimationConfig.cosmeticsMenu, 16)));
-
- String t = "100";
-
- stagger.draw(
- new Text(t)
- .position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 113)
- .scale(0.5f)
- .animation(new Fade(400)));
-
- stagger.draw(
- new ImageTexture(Textures.COINS)
- .dimensions(16, 16)
- .position(x + Fonts.getWidth(t, Theme.FONT.value) - 1, y + 112)
- .scale(0.5f)
- .animation(new Fade(400)));
-
- if (col == 8) {
- col = 0;
- row++;
- } else {
- col++;
- }
- }
- }
- }
-
- scroll.draw(stagger);
-
- int scrollWidth = 480 + 40 + (gx * 2) + (p * 2);
-
- draw(scroll
- .dimensions(scrollWidth, 350)
- .centerOffset(width, height, 15, 0));
-
- draw(new Sidebar(5, this::close)
- .centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0)
- .animation(new Fade(400)));
-
- draw(new TabMenu(0,
- new TabMenuComponent(Textures.CLOAK, () -> {
- }),
- new TabMenuComponent(Textures.HAT, () -> {
- SaturnClient.client.setScreen(new HatStore());
- }))
- .centerOffset(width, height, 0, -195));
- }
-
- private void handlePurchase(String cloak) {
- long now = System.currentTimeMillis();
-
- if (now - lastPurchaseTime >= 3000) {
- Utils.notify(NotificationKind.Info, "Purchase processing", "Please wait");
-
- ServiceClient.buyCloak(cloak);
- lastPurchaseTime = now;
-
- new Thread(() -> {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException ignored) {
- }
-
- RenderSystem.recordRenderCall(() -> {
- SaturnClient.client.setScreen(new CloakStore(now));
- Utils.notify(NotificationKind.Success,
- "Purchase complete",
- "Congrats, enjoy your new cloak!");
- });
- }).start();
-
- } else {
- Utils.notify(NotificationKind.Error,
- "Timeout error",
- "Please wait 3 seconds");
- }
- }
-}
diff --git a/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java b/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java
deleted file mode 100644
index 328f701..0000000
--- a/src/main/java/org/saturnclient/ui2/screens/store/HatStore.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.saturnclient.ui2.screens.store;
-
-import org.saturnclient.cosmetics.hat.Hats;
-import org.saturnclient.saturnclient.SaturnClient;
-import org.saturnclient.saturnclient.client.ServiceClient;
-import org.saturnclient.saturnclient.client.player.SaturnPlayer;
-import org.saturnclient.saturnclient.config.AnimationConfig;
-import org.saturnclient.saturnclient.config.Theme;
-import org.saturnclient.ui2.SaturnScreen;
-import org.saturnclient.ui2.Utils;
-import org.saturnclient.ui2.anim.Fade;
-import org.saturnclient.ui2.anim.SlideY;
-import org.saturnclient.ui2.components.CosmeticPreview;
-import org.saturnclient.ui2.components.Sidebar;
-import org.saturnclient.ui2.elements.AnimationStagger;
-import org.saturnclient.ui2.elements.ImageTexture;
-import org.saturnclient.ui2.elements.Notification.NotificationKind;
-import org.saturnclient.ui2.elements.Scroll;
-import org.saturnclient.ui2.elements.TabMenu;
-import org.saturnclient.ui2.elements.TabMenu.TabMenuComponent;
-import org.saturnclient.ui2.elements.Text;
-import org.saturnclient.ui2.resources.Fonts;
-import org.saturnclient.ui2.resources.Textures;
-
-import com.mojang.blaze3d.systems.RenderSystem;
-
-public class HatStore extends SaturnScreen {
- private long lastPurchaseTime = 0;
-
- public HatStore() {
- super("Hat Store");
- }
-
- public HatStore(long lastPurchaseTime) {
- super("Hat Store");
- this.lastPurchaseTime = lastPurchaseTime;
- }
-
- @Override
- public void ui() {
- int p = 10;
- int gx = 10;
- int gy = 20;
-
- Scroll scroll = new Scroll(p);
-
- int row = 0;
- int col = 0;
-
- SaturnPlayer player = SaturnPlayer.get();
-
- AnimationStagger stagger = new AnimationStagger(AnimationConfig.cosmeticsMenu);
-
- if (player != null) {
- for (String hat : Hats.ALL_HATS) {
- if (!Hats.availableHats.contains(hat)) {
-
- int x = (50 + gx) * col;
- int y = (50 + gy) * row;
-
- stagger.draw(
- new CosmeticPreview(
- hat == player.hat,
- Textures.getHatPreview(hat),
- () -> handlePurchase(hat))
- .dimensions(50, 50)
- .position(x, y)
- .animation(new SlideY(AnimationConfig.cosmeticsMenu, 16)));
-
- String t = "50";
-
- stagger.draw(
- new Text(t)
- .position(x + Fonts.centerX(50, t, Theme.FONT.value), y + 53)
- .scale(0.5f)
- .animation(new Fade(400)));
-
- stagger.draw(
- new ImageTexture(Textures.COINS)
- .dimensions(16, 16)
- .position(x + Fonts.getWidth(t, Theme.FONT.value) + 4, y + 52)
- .scale(0.5f)
- .animation(new Fade(400)));
-
- if (col == 8) {
- col = 0;
- row++;
- } else {
- col++;
- }
- }
- }
- }
-
- scroll.draw(stagger);
-
- int scrollWidth = 480 + 40 + (gx * 2) + (p * 2);
-
- draw(scroll
- .dimensions(scrollWidth, 350)
- .centerOffset(width, height, 15, 0));
-
- draw(new Sidebar(5, this::close)
- .centerOffset(width, height, -((scrollWidth - 30) / 2 + 20), 0)
- .animation(new Fade(400)));
-
- draw(new TabMenu(1,
- new TabMenuComponent(Textures.CLOAK, () -> {
- SaturnClient.client.setScreen(new CloakStore());
- }),
- new TabMenuComponent(Textures.HAT, () -> {
- }))
- .centerOffset(width, height, 0, -195));
- }
-
- private void handlePurchase(String hat) {
- long now = System.currentTimeMillis();
-
- if (now - lastPurchaseTime >= 3000) {
- Utils.notify(NotificationKind.Info, "Purchase processing", "Please wait");
-
- ServiceClient.buyHat(hat);
- lastPurchaseTime = now;
-
- new Thread(() -> {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException ignored) {
- }
-
- RenderSystem.recordRenderCall(() -> {
- SaturnClient.client.setScreen(new HatStore(now));
- Utils.notify(NotificationKind.Success,
- "Purchase complete",
- "Congrats, enjoy your new hat!");
- });
- }).start();
-
- } else {
- Utils.notify(NotificationKind.Error,
- "Timeout error",
- "Please wait 3 seconds");
- }
- }
-}
diff --git a/src/main/resources/assets/minecraft/font/fonts.json b/src/main/resources/assets/minecraft/font/fonts.json
deleted file mode 100644
index 7606077..0000000
--- a/src/main/resources/assets/minecraft/font/fonts.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "providers": [
- {
- "type": "reference",
- "id": "saturnclient:inter"
- },
- {
- "type": "reference",
- "id": "saturnclient:inter_bold"
- }
- ]
-}
diff --git a/src/main/resources/assets/minecraft/font/include/default.json b/src/main/resources/assets/minecraft/font/include/default.json
deleted file mode 100644
index e3abe77..0000000
--- a/src/main/resources/assets/minecraft/font/include/default.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "providers": [
- {
- "type": "bitmap",
- "file": "minecraft:font/custom/saturn.png",
- "ascent": 7,
- "height": 8,
- "chars": ["\uE002"]
- },
- {
- "type": "bitmap",
- "file": "minecraft:font/custom/saturn_realistic.png",
- "ascent": 7,
- "height": 8,
- "chars": ["\uE003"]
- }
- ]
-}
diff --git a/src/main/resources/assets/minecraft/textures/font/custom/saturn.png b/src/main/resources/assets/minecraft/textures/font/custom/saturn.png
deleted file mode 100644
index f464196..0000000
Binary files a/src/main/resources/assets/minecraft/textures/font/custom/saturn.png and /dev/null differ
diff --git a/src/main/resources/assets/minecraft/textures/font/custom/saturn_realistic.png b/src/main/resources/assets/minecraft/textures/font/custom/saturn_realistic.png
deleted file mode 100644
index 271937a..0000000
Binary files a/src/main/resources/assets/minecraft/textures/font/custom/saturn_realistic.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/font/README.md b/src/main/resources/assets/saturnclient/font/README.md
deleted file mode 100644
index 4af02e8..0000000
--- a/src/main/resources/assets/saturnclient/font/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Here is the font download: https://fonts.google.com/specimen/Inter
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/font/inter.json b/src/main/resources/assets/saturnclient/font/inter.json
deleted file mode 100644
index 8ffca49..0000000
--- a/src/main/resources/assets/saturnclient/font/inter.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "providers": [
- {
- "type": "ttf",
- "file": "saturnclient:inter.ttf",
- "shift": [0, 0],
- "size": 18,
- "oversample": 12.0,
- "skip_missing": true
- }
- ]
-}
diff --git a/src/main/resources/assets/saturnclient/font/inter.ttf b/src/main/resources/assets/saturnclient/font/inter.ttf
deleted file mode 100644
index acae361..0000000
Binary files a/src/main/resources/assets/saturnclient/font/inter.ttf and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/font/inter_bold.json b/src/main/resources/assets/saturnclient/font/inter_bold.json
deleted file mode 100644
index ff7a168..0000000
--- a/src/main/resources/assets/saturnclient/font/inter_bold.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "providers": [
- {
- "type": "ttf",
- "file": "saturnclient:inter_bold.ttf",
- "shift": [0, 0],
- "size": 18,
- "oversample": 8.0,
- "skip_missing": true
- }
- ]
-}
diff --git a/src/main/resources/assets/saturnclient/font/inter_bold.ttf b/src/main/resources/assets/saturnclient/font/inter_bold.ttf
deleted file mode 100644
index cd13f60..0000000
Binary files a/src/main/resources/assets/saturnclient/font/inter_bold.ttf and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/icon.png b/src/main/resources/assets/saturnclient/icon.png
deleted file mode 100644
index 39d03ec..0000000
Binary files a/src/main/resources/assets/saturnclient/icon.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.json b/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.json
deleted file mode 100644
index e1f2835..0000000
--- a/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "translate": [0.0, 0.62, 0.0],
- "scale": [0.2, 0.1, 0.2]
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.obj b/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.obj
deleted file mode 100644
index 0289ac5..0000000
--- a/src/main/resources/assets/saturnclient/models/cosmetic/hat/halo/model.obj
+++ /dev/null
@@ -1,2083 +0,0 @@
-# Blender 4.0.2 OBJ File: ''
-# www.blender.org
-mtllib ../white.mtl
-o Torus
-v 1.250000 0.000000 0.000000
-v 1.216506 0.125000 0.000000
-v 1.125000 0.216506 0.000000
-v 1.000000 0.250000 0.000000
-v 0.875000 0.216506 0.000000
-v 0.783494 0.125000 0.000000
-v 0.750000 0.000000 0.000000
-v 0.783494 -0.125000 0.000000
-v 0.875000 -0.216506 0.000000
-v 1.000000 -0.250000 0.000000
-v 1.125000 -0.216506 0.000000
-v 1.216506 -0.125000 0.000000
-v 1.239306 0.000000 -0.163158
-v 1.206099 0.125000 -0.158786
-v 1.115376 0.216506 -0.146842
-v 0.991445 0.250000 -0.130526
-v 0.867514 0.216506 -0.114210
-v 0.776791 0.125000 -0.102266
-v 0.743584 0.000000 -0.097895
-v 0.776791 -0.125000 -0.102266
-v 0.867514 -0.216506 -0.114210
-v 0.991445 -0.250000 -0.130526
-v 1.115376 -0.216506 -0.146842
-v 1.206099 -0.125000 -0.158786
-v 1.207407 0.000000 -0.323524
-v 1.175055 0.125000 -0.314855
-v 1.086667 0.216506 -0.291171
-v 0.965926 0.250000 -0.258819
-v 0.845185 0.216506 -0.226467
-v 0.756797 0.125000 -0.202783
-v 0.724444 0.000000 -0.194114
-v 0.756797 -0.125000 -0.202783
-v 0.845185 -0.216506 -0.226467
-v 0.965926 -0.250000 -0.258819
-v 1.086667 -0.216506 -0.291171
-v 1.175055 -0.125000 -0.314855
-v 1.154849 0.000000 -0.478354
-v 1.123905 0.125000 -0.465537
-v 1.039364 0.216506 -0.430519
-v 0.923880 0.250000 -0.382683
-v 0.808395 0.216506 -0.334848
-v 0.723854 0.125000 -0.299830
-v 0.692910 0.000000 -0.287013
-v 0.723854 -0.125000 -0.299830
-v 0.808395 -0.216506 -0.334848
-v 0.923880 -0.250000 -0.382683
-v 1.039364 -0.216506 -0.430519
-v 1.123905 -0.125000 -0.465537
-v 1.082532 0.000000 -0.625000
-v 1.053525 0.125000 -0.608253
-v 0.974279 0.216506 -0.562500
-v 0.866025 0.250000 -0.500000
-v 0.757772 0.216506 -0.437500
-v 0.678525 0.125000 -0.391747
-v 0.649519 0.000000 -0.375000
-v 0.678525 -0.125000 -0.391747
-v 0.757772 -0.216506 -0.437500
-v 0.866025 -0.250000 -0.500000
-v 0.974279 -0.216506 -0.562500
-v 1.053525 -0.125000 -0.608253
-v 0.991692 0.000000 -0.760952
-v 0.965119 0.125000 -0.740562
-v 0.892523 0.216506 -0.684856
-v 0.793353 0.250000 -0.608761
-v 0.694184 0.216506 -0.532666
-v 0.621587 0.125000 -0.476961
-v 0.595015 0.000000 -0.456571
-v 0.621587 -0.125000 -0.476961
-v 0.694184 -0.216506 -0.532666
-v 0.793353 -0.250000 -0.608761
-v 0.892523 -0.216506 -0.684856
-v 0.965119 -0.125000 -0.740562
-v 0.883883 0.000000 -0.883884
-v 0.860200 0.125000 -0.860200
-v 0.795495 0.216506 -0.795495
-v 0.707107 0.250000 -0.707107
-v 0.618718 0.216506 -0.618719
-v 0.554014 0.125000 -0.554014
-v 0.530330 0.000000 -0.530330
-v 0.554014 -0.125000 -0.554014
-v 0.618718 -0.216506 -0.618719
-v 0.707107 -0.250000 -0.707107
-v 0.795495 -0.216506 -0.795495
-v 0.860200 -0.125000 -0.860200
-v 0.760952 0.000000 -0.991691
-v 0.740562 0.125000 -0.965119
-v 0.684857 0.216506 -0.892522
-v 0.608762 0.250000 -0.793353
-v 0.532666 0.216506 -0.694184
-v 0.476961 0.125000 -0.621587
-v 0.456571 0.000000 -0.595015
-v 0.476961 -0.125000 -0.621587
-v 0.532666 -0.216506 -0.694184
-v 0.608762 -0.250000 -0.793353
-v 0.684857 -0.216506 -0.892522
-v 0.740562 -0.125000 -0.965119
-v 0.625000 0.000000 -1.082532
-v 0.608253 0.125000 -1.053525
-v 0.562500 0.216506 -0.974279
-v 0.500000 0.250000 -0.866025
-v 0.437500 0.216506 -0.757772
-v 0.391747 0.125000 -0.678525
-v 0.375000 0.000000 -0.649519
-v 0.391747 -0.125000 -0.678525
-v 0.437500 -0.216506 -0.757772
-v 0.500000 -0.250000 -0.866025
-v 0.562500 -0.216506 -0.974279
-v 0.608253 -0.125000 -1.053525
-v 0.478355 0.000000 -1.154849
-v 0.465537 0.125000 -1.123905
-v 0.430519 0.216506 -1.039364
-v 0.382684 0.250000 -0.923879
-v 0.334848 0.216506 -0.808394
-v 0.299830 0.125000 -0.723854
-v 0.287013 0.000000 -0.692910
-v 0.299830 -0.125000 -0.723854
-v 0.334848 -0.216506 -0.808394
-v 0.382684 -0.250000 -0.923879
-v 0.430519 -0.216506 -1.039364
-v 0.465537 -0.125000 -1.123905
-v 0.323524 0.000000 -1.207407
-v 0.314855 0.125000 -1.175055
-v 0.291171 0.216506 -1.086667
-v 0.258819 0.250000 -0.965926
-v 0.226467 0.216506 -0.845185
-v 0.202783 0.125000 -0.756797
-v 0.194114 0.000000 -0.724444
-v 0.202783 -0.125000 -0.756797
-v 0.226467 -0.216506 -0.845185
-v 0.258819 -0.250000 -0.965926
-v 0.291171 -0.216506 -1.086667
-v 0.314855 -0.125000 -1.175055
-v 0.163158 0.000000 -1.239306
-v 0.158786 0.125000 -1.206099
-v 0.146842 0.216506 -1.115376
-v 0.130526 0.250000 -0.991445
-v 0.114210 0.216506 -0.867514
-v 0.102266 0.125000 -0.776791
-v 0.097895 0.000000 -0.743584
-v 0.102266 -0.125000 -0.776791
-v 0.114210 -0.216506 -0.867514
-v 0.130526 -0.250000 -0.991445
-v 0.146842 -0.216506 -1.115376
-v 0.158786 -0.125000 -1.206099
-v 0.000000 0.000000 -1.250000
-v 0.000000 0.125000 -1.216506
-v 0.000000 0.216506 -1.125000
-v 0.000000 0.250000 -1.000000
-v 0.000000 0.216506 -0.875000
-v 0.000000 0.125000 -0.783494
-v 0.000000 0.000000 -0.750000
-v 0.000000 -0.125000 -0.783494
-v 0.000000 -0.216506 -0.875000
-v 0.000000 -0.250000 -1.000000
-v 0.000000 -0.216506 -1.125000
-v 0.000000 -0.125000 -1.216506
-v -0.163158 0.000000 -1.239306
-v -0.158786 0.125000 -1.206099
-v -0.146842 0.216506 -1.115375
-v -0.130526 0.250000 -0.991445
-v -0.114211 0.216506 -0.867514
-v -0.102267 0.125000 -0.776791
-v -0.097895 0.000000 -0.743584
-v -0.102267 -0.125000 -0.776791
-v -0.114211 -0.216506 -0.867514
-v -0.130526 -0.250000 -0.991445
-v -0.146842 -0.216506 -1.115375
-v -0.158786 -0.125000 -1.206099
-v -0.323524 0.000000 -1.207407
-v -0.314855 0.125000 -1.175055
-v -0.291171 0.216506 -1.086667
-v -0.258819 0.250000 -0.965926
-v -0.226467 0.216506 -0.845185
-v -0.202783 0.125000 -0.756797
-v -0.194114 0.000000 -0.724444
-v -0.202783 -0.125000 -0.756797
-v -0.226467 -0.216506 -0.845185
-v -0.258819 -0.250000 -0.965926
-v -0.291171 -0.216506 -1.086667
-v -0.314855 -0.125000 -1.175055
-v -0.478354 0.000000 -1.154849
-v -0.465537 0.125000 -1.123905
-v -0.430519 0.216506 -1.039364
-v -0.382684 0.250000 -0.923880
-v -0.334848 0.216506 -0.808395
-v -0.299830 0.125000 -0.723854
-v -0.287013 0.000000 -0.692910
-v -0.299830 -0.125000 -0.723854
-v -0.334848 -0.216506 -0.808395
-v -0.382684 -0.250000 -0.923880
-v -0.430519 -0.216506 -1.039364
-v -0.465537 -0.125000 -1.123905
-v -0.625000 0.000000 -1.082532
-v -0.608253 0.125000 -1.053526
-v -0.562500 0.216506 -0.974279
-v -0.500000 0.250000 -0.866026
-v -0.437500 0.216506 -0.757772
-v -0.391747 0.125000 -0.678525
-v -0.375000 0.000000 -0.649519
-v -0.391747 -0.125000 -0.678525
-v -0.437500 -0.216506 -0.757772
-v -0.500000 -0.250000 -0.866026
-v -0.562500 -0.216506 -0.974279
-v -0.608253 -0.125000 -1.053526
-v -0.760952 0.000000 -0.991692
-v -0.740562 0.125000 -0.965119
-v -0.684857 0.216506 -0.892522
-v -0.608761 0.250000 -0.793353
-v -0.532666 0.216506 -0.694184
-v -0.476961 0.125000 -0.621587
-v -0.456571 0.000000 -0.595015
-v -0.476961 -0.125000 -0.621587
-v -0.532666 -0.216506 -0.694184
-v -0.608761 -0.250000 -0.793353
-v -0.684857 -0.216506 -0.892522
-v -0.740562 -0.125000 -0.965119
-v -0.883884 0.000000 -0.883883
-v -0.860200 0.125000 -0.860200
-v -0.795495 0.216506 -0.795495
-v -0.707107 0.250000 -0.707107
-v -0.618719 0.216506 -0.618718
-v -0.554014 0.125000 -0.554013
-v -0.530330 0.000000 -0.530330
-v -0.554014 -0.125000 -0.554013
-v -0.618719 -0.216506 -0.618718
-v -0.707107 -0.250000 -0.707107
-v -0.795495 -0.216506 -0.795495
-v -0.860200 -0.125000 -0.860200
-v -0.991692 0.000000 -0.760952
-v -0.965119 0.125000 -0.740562
-v -0.892522 0.216506 -0.684857
-v -0.793353 0.250000 -0.608761
-v -0.694184 0.216506 -0.532666
-v -0.621587 0.125000 -0.476961
-v -0.595015 0.000000 -0.456571
-v -0.621587 -0.125000 -0.476961
-v -0.694184 -0.216506 -0.532666
-v -0.793353 -0.250000 -0.608761
-v -0.892522 -0.216506 -0.684857
-v -0.965119 -0.125000 -0.740562
-v -1.082532 0.000000 -0.625000
-v -1.053525 0.125000 -0.608253
-v -0.974278 0.216506 -0.562500
-v -0.866025 0.250000 -0.500000
-v -0.757772 0.216506 -0.437500
-v -0.678525 0.125000 -0.391747
-v -0.649519 0.000000 -0.375000
-v -0.678525 -0.125000 -0.391747
-v -0.757772 -0.216506 -0.437500
-v -0.866025 -0.250000 -0.500000
-v -0.974278 -0.216506 -0.562500
-v -1.053525 -0.125000 -0.608253
-v -1.154849 0.000000 -0.478354
-v -1.123905 0.125000 -0.465537
-v -1.039364 0.216506 -0.430519
-v -0.923880 0.250000 -0.382683
-v -0.808395 0.216506 -0.334848
-v -0.723854 0.125000 -0.299830
-v -0.692910 0.000000 -0.287013
-v -0.723854 -0.125000 -0.299830
-v -0.808395 -0.216506 -0.334848
-v -0.923880 -0.250000 -0.382683
-v -1.039364 -0.216506 -0.430519
-v -1.123905 -0.125000 -0.465537
-v -1.207407 0.000000 -0.323524
-v -1.175055 0.125000 -0.314855
-v -1.086667 0.216506 -0.291171
-v -0.965926 0.250000 -0.258819
-v -0.845185 0.216506 -0.226467
-v -0.756797 0.125000 -0.202783
-v -0.724444 0.000000 -0.194114
-v -0.756797 -0.125000 -0.202783
-v -0.845185 -0.216506 -0.226467
-v -0.965926 -0.250000 -0.258819
-v -1.086667 -0.216506 -0.291171
-v -1.175055 -0.125000 -0.314855
-v -1.239306 0.000000 -0.163158
-v -1.206099 0.125000 -0.158786
-v -1.115375 0.216506 -0.146842
-v -0.991445 0.250000 -0.130526
-v -0.867514 0.216506 -0.114211
-v -0.776791 0.125000 -0.102267
-v -0.743584 0.000000 -0.097895
-v -0.776791 -0.125000 -0.102267
-v -0.867514 -0.216506 -0.114211
-v -0.991445 -0.250000 -0.130526
-v -1.115375 -0.216506 -0.146842
-v -1.206099 -0.125000 -0.158786
-v -1.250000 0.000000 -0.000000
-v -1.216506 0.125000 -0.000000
-v -1.125000 0.216506 -0.000000
-v -1.000000 0.250000 -0.000000
-v -0.875000 0.216506 -0.000000
-v -0.783494 0.125000 -0.000000
-v -0.750000 0.000000 -0.000000
-v -0.783494 -0.125000 -0.000000
-v -0.875000 -0.216506 -0.000000
-v -1.000000 -0.250000 -0.000000
-v -1.125000 -0.216506 -0.000000
-v -1.216506 -0.125000 -0.000000
-v -1.239306 0.000000 0.163158
-v -1.206099 0.125000 0.158786
-v -1.115375 0.216506 0.146842
-v -0.991445 0.250000 0.130526
-v -0.867514 0.216506 0.114211
-v -0.776791 0.125000 0.102267
-v -0.743584 0.000000 0.097895
-v -0.776791 -0.125000 0.102267
-v -0.867514 -0.216506 0.114211
-v -0.991445 -0.250000 0.130526
-v -1.115375 -0.216506 0.146842
-v -1.206099 -0.125000 0.158786
-v -1.207407 0.000000 0.323524
-v -1.175055 0.125000 0.314855
-v -1.086667 0.216506 0.291171
-v -0.965926 0.250000 0.258819
-v -0.845185 0.216506 0.226467
-v -0.756797 0.125000 0.202783
-v -0.724444 0.000000 0.194114
-v -0.756797 -0.125000 0.202783
-v -0.845185 -0.216506 0.226467
-v -0.965926 -0.250000 0.258819
-v -1.086667 -0.216506 0.291171
-v -1.175055 -0.125000 0.314855
-v -1.154850 0.000000 0.478354
-v -1.123906 0.125000 0.465536
-v -1.039365 0.216506 0.430518
-v -0.923880 0.250000 0.382683
-v -0.808395 0.216506 0.334848
-v -0.723854 0.125000 0.299830
-v -0.692910 0.000000 0.287012
-v -0.723854 -0.125000 0.299830
-v -0.808395 -0.216506 0.334848
-v -0.923880 -0.250000 0.382683
-v -1.039365 -0.216506 0.430518
-v -1.123906 -0.125000 0.465536
-v -1.082532 0.000000 0.625000
-v -1.053526 0.125000 0.608253
-v -0.974279 0.216506 0.562500
-v -0.866026 0.250000 0.500000
-v -0.757772 0.216506 0.437500
-v -0.678525 0.125000 0.391747
-v -0.649519 0.000000 0.375000
-v -0.678525 -0.125000 0.391747
-v -0.757772 -0.216506 0.437500
-v -0.866026 -0.250000 0.500000
-v -0.974279 -0.216506 0.562500
-v -1.053526 -0.125000 0.608253
-v -0.991692 0.000000 0.760952
-v -0.965119 0.125000 0.740562
-v -0.892522 0.216506 0.684857
-v -0.793353 0.250000 0.608761
-v -0.694184 0.216506 0.532666
-v -0.621587 0.125000 0.476961
-v -0.595015 0.000000 0.456571
-v -0.621587 -0.125000 0.476961
-v -0.694184 -0.216506 0.532666
-v -0.793353 -0.250000 0.608761
-v -0.892522 -0.216506 0.684857
-v -0.965119 -0.125000 0.740562
-v -0.883884 0.000000 0.883883
-v -0.860200 0.125000 0.860200
-v -0.795495 0.216506 0.795495
-v -0.707107 0.250000 0.707107
-v -0.618719 0.216506 0.618718
-v -0.554014 0.125000 0.554013
-v -0.530330 0.000000 0.530330
-v -0.554014 -0.125000 0.554013
-v -0.618719 -0.216506 0.618718
-v -0.707107 -0.250000 0.707107
-v -0.795495 -0.216506 0.795495
-v -0.860200 -0.125000 0.860200
-v -0.760952 0.000000 0.991691
-v -0.740563 0.125000 0.965119
-v -0.684857 0.216506 0.892522
-v -0.608762 0.250000 0.793353
-v -0.532667 0.216506 0.694184
-v -0.476961 0.125000 0.621587
-v -0.456571 0.000000 0.595015
-v -0.476961 -0.125000 0.621587
-v -0.532667 -0.216506 0.694184
-v -0.608762 -0.250000 0.793353
-v -0.684857 -0.216506 0.892522
-v -0.740563 -0.125000 0.965119
-v -0.625000 0.000000 1.082532
-v -0.608253 0.125000 1.053526
-v -0.562500 0.216506 0.974279
-v -0.500000 0.250000 0.866026
-v -0.437500 0.216506 0.757772
-v -0.391747 0.125000 0.678525
-v -0.375000 0.000000 0.649519
-v -0.391747 -0.125000 0.678525
-v -0.437500 -0.216506 0.757772
-v -0.500000 -0.250000 0.866026
-v -0.562500 -0.216506 0.974279
-v -0.608253 -0.125000 1.053526
-v -0.478354 0.000000 1.154849
-v -0.465537 0.125000 1.123905
-v -0.430519 0.216506 1.039364
-v -0.382684 0.250000 0.923880
-v -0.334848 0.216506 0.808395
-v -0.299830 0.125000 0.723854
-v -0.287013 0.000000 0.692910
-v -0.299830 -0.125000 0.723854
-v -0.334848 -0.216506 0.808395
-v -0.382684 -0.250000 0.923880
-v -0.430519 -0.216506 1.039364
-v -0.465537 -0.125000 1.123905
-v -0.323524 0.000000 1.207407
-v -0.314855 0.125000 1.175055
-v -0.291172 0.216506 1.086666
-v -0.258819 0.250000 0.965926
-v -0.226467 0.216506 0.845185
-v -0.202783 0.125000 0.756797
-v -0.194115 0.000000 0.724444
-v -0.202783 -0.125000 0.756797
-v -0.226467 -0.216506 0.845185
-v -0.258819 -0.250000 0.965926
-v -0.291172 -0.216506 1.086666
-v -0.314855 -0.125000 1.175055
-v -0.163158 0.000000 1.239306
-v -0.158787 0.125000 1.206099
-v -0.146843 0.216506 1.115375
-v -0.130527 0.250000 0.991445
-v -0.114211 0.216506 0.867514
-v -0.102267 0.125000 0.776791
-v -0.097895 0.000000 0.743584
-v -0.102267 -0.125000 0.776791
-v -0.114211 -0.216506 0.867514
-v -0.130527 -0.250000 0.991445
-v -0.146843 -0.216506 1.115375
-v -0.158787 -0.125000 1.206099
-v 0.000000 0.000000 1.250000
-v 0.000000 0.125000 1.216506
-v 0.000000 0.216506 1.125000
-v 0.000000 0.250000 1.000000
-v 0.000000 0.216506 0.875000
-v 0.000000 0.125000 0.783494
-v 0.000000 0.000000 0.750000
-v 0.000000 -0.125000 0.783494
-v 0.000000 -0.216506 0.875000
-v 0.000000 -0.250000 1.000000
-v 0.000000 -0.216506 1.125000
-v 0.000000 -0.125000 1.216506
-v 0.163158 0.000000 1.239306
-v 0.158786 0.125000 1.206099
-v 0.146842 0.216506 1.115376
-v 0.130526 0.250000 0.991445
-v 0.114210 0.216506 0.867514
-v 0.102266 0.125000 0.776791
-v 0.097895 0.000000 0.743584
-v 0.102266 -0.125000 0.776791
-v 0.114210 -0.216506 0.867514
-v 0.130526 -0.250000 0.991445
-v 0.146842 -0.216506 1.115376
-v 0.158786 -0.125000 1.206099
-v 0.323523 0.000000 1.207407
-v 0.314854 0.125000 1.175055
-v 0.291171 0.216506 1.086667
-v 0.258819 0.250000 0.965926
-v 0.226466 0.216506 0.845185
-v 0.202783 0.125000 0.756797
-v 0.194114 0.000000 0.724444
-v 0.202783 -0.125000 0.756797
-v 0.226466 -0.216506 0.845185
-v 0.258819 -0.250000 0.965926
-v 0.291171 -0.216506 1.086667
-v 0.314854 -0.125000 1.175055
-v 0.478355 0.000000 1.154849
-v 0.465537 0.125000 1.123905
-v 0.430519 0.216506 1.039364
-v 0.382684 0.250000 0.923879
-v 0.334848 0.216506 0.808394
-v 0.299830 0.125000 0.723854
-v 0.287013 0.000000 0.692910
-v 0.299830 -0.125000 0.723854
-v 0.334848 -0.216506 0.808394
-v 0.382684 -0.250000 0.923879
-v 0.430519 -0.216506 1.039364
-v 0.465537 -0.125000 1.123905
-v 0.625000 0.000000 1.082532
-v 0.608253 0.125000 1.053525
-v 0.562500 0.216506 0.974279
-v 0.500000 0.250000 0.866025
-v 0.437500 0.216506 0.757772
-v 0.391747 0.125000 0.678525
-v 0.375000 0.000000 0.649519
-v 0.391747 -0.125000 0.678525
-v 0.437500 -0.216506 0.757772
-v 0.500000 -0.250000 0.866025
-v 0.562500 -0.216506 0.974279
-v 0.608253 -0.125000 1.053525
-v 0.760952 0.000000 0.991692
-v 0.740562 0.125000 0.965120
-v 0.684856 0.216506 0.892523
-v 0.608761 0.250000 0.793353
-v 0.532666 0.216506 0.694184
-v 0.476961 0.125000 0.621587
-v 0.456571 0.000000 0.595015
-v 0.476961 -0.125000 0.621587
-v 0.532666 -0.216506 0.694184
-v 0.608761 -0.250000 0.793353
-v 0.684856 -0.216506 0.892523
-v 0.740562 -0.125000 0.965120
-v 0.883883 0.000000 0.883884
-v 0.860199 0.125000 0.860200
-v 0.795495 0.216506 0.795496
-v 0.707106 0.250000 0.707107
-v 0.618718 0.216506 0.618719
-v 0.554013 0.125000 0.554014
-v 0.530330 0.000000 0.530330
-v 0.554013 -0.125000 0.554014
-v 0.618718 -0.216506 0.618719
-v 0.707106 -0.250000 0.707107
-v 0.795495 -0.216506 0.795496
-v 0.860199 -0.125000 0.860200
-v 0.991692 0.000000 0.760952
-v 0.965119 0.125000 0.740562
-v 0.892523 0.216506 0.684856
-v 0.793353 0.250000 0.608761
-v 0.694184 0.216506 0.532666
-v 0.621587 0.125000 0.476961
-v 0.595015 0.000000 0.456571
-v 0.621587 -0.125000 0.476961
-v 0.694184 -0.216506 0.532666
-v 0.793353 -0.250000 0.608761
-v 0.892523 -0.216506 0.684856
-v 0.965119 -0.125000 0.740562
-v 1.082532 0.000000 0.625000
-v 1.053525 0.125000 0.608253
-v 0.974279 0.216506 0.562500
-v 0.866025 0.250000 0.500000
-v 0.757772 0.216506 0.437500
-v 0.678525 0.125000 0.391747
-v 0.649519 0.000000 0.375000
-v 0.678525 -0.125000 0.391747
-v 0.757772 -0.216506 0.437500
-v 0.866025 -0.250000 0.500000
-v 0.974279 -0.216506 0.562500
-v 1.053525 -0.125000 0.608253
-v 1.154849 0.000000 0.478355
-v 1.123905 0.125000 0.465537
-v 1.039364 0.216506 0.430519
-v 0.923879 0.250000 0.382684
-v 0.808394 0.216506 0.334848
-v 0.723854 0.125000 0.299830
-v 0.692910 0.000000 0.287013
-v 0.723854 -0.125000 0.299830
-v 0.808394 -0.216506 0.334848
-v 0.923879 -0.250000 0.382684
-v 1.039364 -0.216506 0.430519
-v 1.123905 -0.125000 0.465537
-v 1.207407 0.000000 0.323523
-v 1.175055 0.125000 0.314855
-v 1.086667 0.216506 0.291171
-v 0.965926 0.250000 0.258819
-v 0.845185 0.216506 0.226466
-v 0.756797 0.125000 0.202783
-v 0.724444 0.000000 0.194114
-v 0.756797 -0.125000 0.202783
-v 0.845185 -0.216506 0.226466
-v 0.965926 -0.250000 0.258819
-v 1.086667 -0.216506 0.291171
-v 1.175055 -0.125000 0.314855
-v 1.239306 0.000000 0.163158
-v 1.206099 0.125000 0.158786
-v 1.115376 0.216506 0.146842
-v 0.991445 0.250000 0.130526
-v 0.867514 0.216506 0.114210
-v 0.776791 0.125000 0.102266
-v 0.743584 0.000000 0.097895
-v 0.776791 -0.125000 0.102266
-v 0.867514 -0.216506 0.114210
-v 0.991445 -0.250000 0.130526
-v 1.115376 -0.216506 0.146842
-v 1.206099 -0.125000 0.158786
-vn 0.9640 0.2583 -0.0632
-vn 0.7063 0.7063 -0.0463
-vn 0.2588 0.9658 -0.0170
-vn -0.2588 0.9658 0.0170
-vn -0.7063 0.7063 0.0463
-vn -0.9640 0.2583 0.0632
-vn -0.9640 -0.2583 0.0632
-vn -0.7063 -0.7063 0.0463
-vn -0.2588 -0.9658 0.0170
-vn 0.2588 -0.9658 -0.0170
-vn 0.7063 -0.7063 -0.0463
-vn 0.9640 -0.2583 -0.0632
-vn 0.9475 0.2583 -0.1885
-vn 0.6943 0.7063 -0.1381
-vn 0.2544 0.9658 -0.0506
-vn -0.2544 0.9658 0.0506
-vn -0.6943 0.7063 0.1381
-vn -0.9475 0.2583 0.1885
-vn -0.9475 -0.2583 0.1885
-vn -0.6943 -0.7063 0.1381
-vn -0.2544 -0.9658 0.0506
-vn 0.2544 -0.9658 -0.0506
-vn 0.6943 -0.7063 -0.1381
-vn 0.9475 -0.2583 -0.1885
-vn 0.9148 0.2583 -0.3105
-vn 0.6703 0.7063 -0.2275
-vn 0.2456 0.9658 -0.0834
-vn -0.2456 0.9658 0.0834
-vn -0.6703 0.7063 0.2275
-vn -0.9148 0.2583 0.3105
-vn -0.9148 -0.2583 0.3105
-vn -0.6703 -0.7063 0.2275
-vn -0.2456 -0.9658 0.0834
-vn 0.2456 -0.9658 -0.0834
-vn 0.6703 -0.7063 -0.2275
-vn 0.9148 -0.2583 -0.3105
-vn 0.8664 0.2583 -0.4273
-vn 0.6349 0.7063 -0.3131
-vn 0.2326 0.9658 -0.1147
-vn -0.2326 0.9658 0.1147
-vn -0.6349 0.7063 0.3131
-vn -0.8664 0.2583 0.4273
-vn -0.8664 -0.2583 0.4273
-vn -0.6349 -0.7063 0.3131
-vn -0.2326 -0.9658 0.1147
-vn 0.2326 -0.9658 -0.1147
-vn 0.6349 -0.7063 -0.3131
-vn 0.8664 -0.2583 -0.4273
-vn 0.8033 0.2583 -0.5367
-vn 0.5886 0.7063 -0.3933
-vn 0.2156 0.9658 -0.1441
-vn -0.2156 0.9658 0.1441
-vn -0.5886 0.7063 0.3933
-vn -0.8033 0.2583 0.5367
-vn -0.8033 -0.2583 0.5367
-vn -0.5886 -0.7063 0.3933
-vn -0.2156 -0.9658 0.1441
-vn 0.2156 -0.9658 -0.1441
-vn 0.5886 -0.7063 -0.3933
-vn 0.8033 -0.2583 -0.5367
-vn 0.7263 0.2583 -0.6370
-vn 0.5322 0.7063 -0.4667
-vn 0.1950 0.9658 -0.1710
-vn -0.1950 0.9658 0.1710
-vn -0.5322 0.7063 0.4667
-vn -0.7263 0.2583 0.6370
-vn -0.7263 -0.2583 0.6370
-vn -0.5322 -0.7063 0.4667
-vn -0.1950 -0.9658 0.1710
-vn 0.1950 -0.9658 -0.1710
-vn 0.5322 -0.7063 -0.4667
-vn 0.7263 -0.2583 -0.6370
-vn 0.6370 0.2583 -0.7263
-vn 0.4667 0.7063 -0.5322
-vn 0.1710 0.9658 -0.1950
-vn -0.1710 0.9658 0.1950
-vn -0.4667 0.7063 0.5322
-vn -0.6370 0.2583 0.7263
-vn -0.6370 -0.2583 0.7263
-vn -0.4667 -0.7063 0.5322
-vn -0.1710 -0.9658 0.1950
-vn 0.1710 -0.9658 -0.1950
-vn 0.4667 -0.7063 -0.5322
-vn 0.6370 -0.2583 -0.7263
-vn 0.5367 0.2583 -0.8033
-vn 0.3933 0.7063 -0.5886
-vn 0.1441 0.9658 -0.2156
-vn -0.1441 0.9658 0.2156
-vn -0.3933 0.7063 0.5886
-vn -0.5367 0.2583 0.8033
-vn -0.5367 -0.2583 0.8033
-vn -0.3933 -0.7063 0.5886
-vn -0.1441 -0.9658 0.2156
-vn 0.1441 -0.9658 -0.2156
-vn 0.3933 -0.7063 -0.5886
-vn 0.5367 -0.2583 -0.8033
-vn 0.4273 0.2583 -0.8664
-vn 0.3131 0.7063 -0.6349
-vn 0.1147 0.9658 -0.2326
-vn -0.1147 0.9658 0.2326
-vn -0.3131 0.7063 0.6349
-vn -0.4273 0.2583 0.8664
-vn -0.4273 -0.2583 0.8664
-vn -0.3131 -0.7063 0.6349
-vn -0.1147 -0.9658 0.2326
-vn 0.1147 -0.9658 -0.2326
-vn 0.3131 -0.7063 -0.6349
-vn 0.4273 -0.2583 -0.8664
-vn 0.3105 0.2583 -0.9148
-vn 0.2275 0.7063 -0.6703
-vn 0.0834 0.9658 -0.2456
-vn -0.0834 0.9658 0.2456
-vn -0.2275 0.7063 0.6703
-vn -0.3105 0.2583 0.9148
-vn -0.3105 -0.2583 0.9148
-vn -0.2275 -0.7063 0.6703
-vn -0.0834 -0.9658 0.2456
-vn 0.0834 -0.9658 -0.2456
-vn 0.2275 -0.7063 -0.6703
-vn 0.3105 -0.2583 -0.9148
-vn 0.1885 0.2583 -0.9475
-vn 0.1381 0.7063 -0.6943
-vn 0.0506 0.9658 -0.2544
-vn -0.0506 0.9658 0.2544
-vn -0.1381 0.7063 0.6943
-vn -0.1885 0.2583 0.9475
-vn -0.1885 -0.2583 0.9475
-vn -0.1381 -0.7063 0.6943
-vn -0.0506 -0.9658 0.2544
-vn 0.0506 -0.9658 -0.2544
-vn 0.1381 -0.7063 -0.6943
-vn 0.1885 -0.2583 -0.9475
-vn 0.0632 0.2583 -0.9640
-vn 0.0463 0.7063 -0.7063
-vn 0.0170 0.9658 -0.2588
-vn -0.0170 0.9658 0.2588
-vn -0.0463 0.7063 0.7063
-vn -0.0632 0.2583 0.9640
-vn -0.0632 -0.2583 0.9640
-vn -0.0463 -0.7063 0.7063
-vn -0.0170 -0.9658 0.2588
-vn 0.0170 -0.9658 -0.2588
-vn 0.0463 -0.7063 -0.7063
-vn 0.0632 -0.2583 -0.9640
-vn -0.0632 0.2583 -0.9640
-vn -0.0463 0.7063 -0.7063
-vn -0.0170 0.9658 -0.2588
-vn 0.0170 0.9658 0.2588
-vn 0.0463 0.7063 0.7063
-vn 0.0632 0.2583 0.9640
-vn 0.0632 -0.2583 0.9640
-vn 0.0463 -0.7063 0.7063
-vn 0.0170 -0.9658 0.2588
-vn -0.0170 -0.9658 -0.2588
-vn -0.0463 -0.7063 -0.7063
-vn -0.0632 -0.2583 -0.9640
-vn -0.1885 0.2583 -0.9475
-vn -0.1381 0.7063 -0.6943
-vn -0.0506 0.9658 -0.2544
-vn 0.0506 0.9658 0.2544
-vn 0.1381 0.7063 0.6943
-vn 0.1885 0.2583 0.9475
-vn 0.1885 -0.2583 0.9475
-vn 0.1381 -0.7063 0.6943
-vn 0.0506 -0.9658 0.2544
-vn -0.0506 -0.9658 -0.2544
-vn -0.1381 -0.7063 -0.6943
-vn -0.1885 -0.2583 -0.9475
-vn -0.3105 0.2583 -0.9148
-vn -0.2275 0.7063 -0.6703
-vn -0.0834 0.9658 -0.2456
-vn 0.0834 0.9658 0.2456
-vn 0.2275 0.7063 0.6703
-vn 0.3105 0.2583 0.9148
-vn 0.3105 -0.2583 0.9148
-vn 0.2275 -0.7063 0.6703
-vn 0.0834 -0.9658 0.2456
-vn -0.0834 -0.9658 -0.2456
-vn -0.2275 -0.7063 -0.6703
-vn -0.3105 -0.2583 -0.9148
-vn -0.4273 0.2583 -0.8664
-vn -0.3131 0.7063 -0.6349
-vn -0.1147 0.9658 -0.2326
-vn 0.1147 0.9658 0.2326
-vn 0.3131 0.7063 0.6349
-vn 0.4273 0.2583 0.8664
-vn 0.4273 -0.2583 0.8664
-vn 0.3131 -0.7063 0.6349
-vn 0.1147 -0.9658 0.2326
-vn -0.1147 -0.9658 -0.2326
-vn -0.3131 -0.7063 -0.6349
-vn -0.4273 -0.2583 -0.8664
-vn -0.5367 0.2583 -0.8033
-vn -0.3933 0.7063 -0.5886
-vn -0.1441 0.9658 -0.2156
-vn 0.1441 0.9658 0.2156
-vn 0.3933 0.7063 0.5886
-vn 0.5367 0.2583 0.8033
-vn 0.5367 -0.2583 0.8033
-vn 0.3933 -0.7063 0.5886
-vn 0.1441 -0.9658 0.2156
-vn -0.1441 -0.9658 -0.2156
-vn -0.3933 -0.7063 -0.5886
-vn -0.5367 -0.2583 -0.8033
-vn -0.6370 0.2583 -0.7263
-vn -0.4667 0.7063 -0.5322
-vn -0.1710 0.9658 -0.1950
-vn 0.1710 0.9658 0.1950
-vn 0.4667 0.7063 0.5322
-vn 0.6370 0.2583 0.7263
-vn 0.6370 -0.2583 0.7263
-vn 0.4667 -0.7063 0.5322
-vn 0.1710 -0.9658 0.1950
-vn -0.1710 -0.9658 -0.1950
-vn -0.4667 -0.7063 -0.5322
-vn -0.6370 -0.2583 -0.7263
-vn -0.7263 0.2583 -0.6370
-vn -0.5322 0.7063 -0.4667
-vn -0.1950 0.9658 -0.1710
-vn 0.1950 0.9658 0.1710
-vn 0.5322 0.7063 0.4667
-vn 0.7263 0.2583 0.6370
-vn 0.7263 -0.2583 0.6370
-vn 0.5322 -0.7063 0.4667
-vn 0.1950 -0.9658 0.1710
-vn -0.1950 -0.9658 -0.1710
-vn -0.5322 -0.7063 -0.4667
-vn -0.7263 -0.2583 -0.6370
-vn -0.8033 0.2583 -0.5367
-vn -0.5886 0.7063 -0.3933
-vn -0.2156 0.9658 -0.1441
-vn 0.2156 0.9658 0.1441
-vn 0.5886 0.7063 0.3933
-vn 0.8033 0.2583 0.5367
-vn 0.8033 -0.2583 0.5367
-vn 0.5886 -0.7063 0.3933
-vn 0.2156 -0.9658 0.1441
-vn -0.2156 -0.9658 -0.1441
-vn -0.5886 -0.7063 -0.3933
-vn -0.8033 -0.2583 -0.5367
-vn -0.8664 0.2583 -0.4273
-vn -0.6349 0.7063 -0.3131
-vn -0.2326 0.9658 -0.1147
-vn 0.2326 0.9658 0.1147
-vn 0.6349 0.7063 0.3131
-vn 0.8664 0.2583 0.4273
-vn 0.8664 -0.2583 0.4273
-vn 0.6349 -0.7063 0.3131
-vn 0.2326 -0.9658 0.1147
-vn -0.2326 -0.9658 -0.1147
-vn -0.6349 -0.7063 -0.3131
-vn -0.8664 -0.2583 -0.4273
-vn -0.9148 0.2583 -0.3105
-vn -0.6703 0.7063 -0.2275
-vn -0.2456 0.9658 -0.0834
-vn 0.2456 0.9658 0.0834
-vn 0.6703 0.7063 0.2275
-vn 0.9148 0.2583 0.3105
-vn 0.9148 -0.2583 0.3105
-vn 0.6703 -0.7063 0.2275
-vn 0.2456 -0.9658 0.0834
-vn -0.2456 -0.9658 -0.0834
-vn -0.6703 -0.7063 -0.2275
-vn -0.9148 -0.2583 -0.3105
-vn -0.9475 0.2583 -0.1885
-vn -0.6943 0.7063 -0.1381
-vn -0.2544 0.9658 -0.0506
-vn 0.2544 0.9658 0.0506
-vn 0.6943 0.7063 0.1381
-vn 0.9475 0.2583 0.1885
-vn 0.9475 -0.2583 0.1885
-vn 0.6943 -0.7063 0.1381
-vn 0.2544 -0.9658 0.0506
-vn -0.2544 -0.9658 -0.0506
-vn -0.6943 -0.7063 -0.1381
-vn -0.9475 -0.2583 -0.1885
-vn -0.9640 0.2583 -0.0632
-vn -0.7063 0.7063 -0.0463
-vn -0.2588 0.9658 -0.0170
-vn 0.2588 0.9658 0.0170
-vn 0.7063 0.7063 0.0463
-vn 0.9640 0.2583 0.0632
-vn 0.9640 -0.2583 0.0632
-vn 0.7063 -0.7063 0.0463
-vn 0.2588 -0.9658 0.0170
-vn -0.2588 -0.9658 -0.0170
-vn -0.7063 -0.7063 -0.0463
-vn -0.9640 -0.2583 -0.0632
-vt 0.500000 0.500000
-vt 0.520833 0.500000
-vt 0.520833 0.583333
-vt 0.500000 0.583333
-vt 0.520833 0.666667
-vt 0.500000 0.666667
-vt 0.520833 0.750000
-vt 0.500000 0.750000
-vt 0.520833 0.833333
-vt 0.500000 0.833333
-vt 0.520833 0.916667
-vt 0.500000 0.916667
-vt 0.520833 1.000000
-vt 0.500000 1.000000
-vt 0.500000 0.000000
-vt 0.520833 0.000000
-vt 0.520833 0.083333
-vt 0.500000 0.083333
-vt 0.520833 0.166667
-vt 0.500000 0.166667
-vt 0.520833 0.250000
-vt 0.500000 0.250000
-vt 0.520833 0.333333
-vt 0.500000 0.333333
-vt 0.520833 0.416667
-vt 0.500000 0.416667
-vt 0.541667 0.500000
-vt 0.541667 0.583333
-vt 0.541667 0.666667
-vt 0.541667 0.750000
-vt 0.541667 0.833333
-vt 0.541667 0.916667
-vt 0.541667 1.000000
-vt 0.541667 0.000000
-vt 0.541667 0.083333
-vt 0.541667 0.166667
-vt 0.541667 0.250000
-vt 0.541667 0.333333
-vt 0.541667 0.416667
-vt 0.562500 0.500000
-vt 0.562500 0.583333
-vt 0.562500 0.666667
-vt 0.562500 0.750000
-vt 0.562500 0.833333
-vt 0.562500 0.916667
-vt 0.562500 1.000000
-vt 0.562500 0.000000
-vt 0.562500 0.083333
-vt 0.562500 0.166667
-vt 0.562500 0.250000
-vt 0.562500 0.333333
-vt 0.562500 0.416667
-vt 0.583333 0.500000
-vt 0.583333 0.583333
-vt 0.583333 0.666667
-vt 0.583333 0.750000
-vt 0.583333 0.833333
-vt 0.583333 0.916667
-vt 0.583333 1.000000
-vt 0.583333 0.000000
-vt 0.583333 0.083333
-vt 0.583333 0.166667
-vt 0.583333 0.250000
-vt 0.583333 0.333333
-vt 0.583333 0.416667
-vt 0.604167 0.500000
-vt 0.604167 0.583333
-vt 0.604167 0.666667
-vt 0.604167 0.750000
-vt 0.604167 0.833333
-vt 0.604167 0.916667
-vt 0.604167 1.000000
-vt 0.604167 0.000000
-vt 0.604167 0.083333
-vt 0.604167 0.166667
-vt 0.604167 0.250000
-vt 0.604167 0.333333
-vt 0.604167 0.416667
-vt 0.625000 0.500000
-vt 0.625000 0.583333
-vt 0.625000 0.666667
-vt 0.625000 0.750000
-vt 0.625000 0.833333
-vt 0.625000 0.916667
-vt 0.625000 1.000000
-vt 0.625000 0.000000
-vt 0.625000 0.083333
-vt 0.625000 0.166667
-vt 0.625000 0.250000
-vt 0.625000 0.333333
-vt 0.625000 0.416667
-vt 0.645833 0.500000
-vt 0.645833 0.583333
-vt 0.645833 0.666667
-vt 0.645833 0.750000
-vt 0.645833 0.833333
-vt 0.645833 0.916667
-vt 0.645833 1.000000
-vt 0.645833 0.000000
-vt 0.645833 0.083333
-vt 0.645833 0.166667
-vt 0.645833 0.250000
-vt 0.645833 0.333333
-vt 0.645833 0.416667
-vt 0.666667 0.500000
-vt 0.666667 0.583333
-vt 0.666667 0.666667
-vt 0.666667 0.750000
-vt 0.666667 0.833333
-vt 0.666667 0.916667
-vt 0.666667 1.000000
-vt 0.666667 0.000000
-vt 0.666667 0.083333
-vt 0.666667 0.166667
-vt 0.666667 0.250000
-vt 0.666667 0.333333
-vt 0.666667 0.416667
-vt 0.687500 0.500000
-vt 0.687500 0.583333
-vt 0.687500 0.666667
-vt 0.687500 0.750000
-vt 0.687500 0.833333
-vt 0.687500 0.916667
-vt 0.687500 1.000000
-vt 0.687500 0.000000
-vt 0.687500 0.083333
-vt 0.687500 0.166667
-vt 0.687500 0.250000
-vt 0.687500 0.333333
-vt 0.687500 0.416667
-vt 0.708333 0.500000
-vt 0.708333 0.583333
-vt 0.708333 0.666667
-vt 0.708333 0.750000
-vt 0.708333 0.833333
-vt 0.708333 0.916667
-vt 0.708333 1.000000
-vt 0.708333 0.000000
-vt 0.708333 0.083333
-vt 0.708333 0.166667
-vt 0.708333 0.250000
-vt 0.708333 0.333333
-vt 0.708333 0.416667
-vt 0.729167 0.500000
-vt 0.729167 0.583333
-vt 0.729167 0.666667
-vt 0.729167 0.750000
-vt 0.729167 0.833333
-vt 0.729167 0.916667
-vt 0.729167 1.000000
-vt 0.729167 0.000000
-vt 0.729167 0.083333
-vt 0.729167 0.166667
-vt 0.729167 0.250000
-vt 0.729167 0.333333
-vt 0.729167 0.416667
-vt 0.750000 0.500000
-vt 0.750000 0.583333
-vt 0.750000 0.666667
-vt 0.750000 0.750000
-vt 0.750000 0.833333
-vt 0.750000 0.916667
-vt 0.750000 1.000000
-vt 0.750000 0.000000
-vt 0.750000 0.083333
-vt 0.750000 0.166667
-vt 0.750000 0.250000
-vt 0.750000 0.333333
-vt 0.750000 0.416667
-vt 0.770833 0.500000
-vt 0.770833 0.583333
-vt 0.770833 0.666667
-vt 0.770833 0.750000
-vt 0.770833 0.833333
-vt 0.770833 0.916667
-vt 0.770833 1.000000
-vt 0.770833 0.000000
-vt 0.770833 0.083333
-vt 0.770833 0.166667
-vt 0.770833 0.250000
-vt 0.770833 0.333333
-vt 0.770833 0.416667
-vt 0.791667 0.500000
-vt 0.791667 0.583333
-vt 0.791667 0.666667
-vt 0.791667 0.750000
-vt 0.791667 0.833333
-vt 0.791667 0.916667
-vt 0.791667 1.000000
-vt 0.791667 0.000000
-vt 0.791667 0.083333
-vt 0.791667 0.166667
-vt 0.791667 0.250000
-vt 0.791667 0.333333
-vt 0.791667 0.416667
-vt 0.812500 0.500000
-vt 0.812500 0.583333
-vt 0.812500 0.666667
-vt 0.812500 0.750000
-vt 0.812500 0.833333
-vt 0.812500 0.916667
-vt 0.812500 1.000000
-vt 0.812500 0.000000
-vt 0.812500 0.083333
-vt 0.812500 0.166667
-vt 0.812500 0.250000
-vt 0.812500 0.333333
-vt 0.812500 0.416667
-vt 0.833333 0.500000
-vt 0.833333 0.583333
-vt 0.833333 0.666667
-vt 0.833333 0.750000
-vt 0.833333 0.833333
-vt 0.833333 0.916667
-vt 0.833333 1.000000
-vt 0.833333 0.000000
-vt 0.833333 0.083333
-vt 0.833333 0.166667
-vt 0.833333 0.250000
-vt 0.833333 0.333333
-vt 0.833333 0.416667
-vt 0.854167 0.500000
-vt 0.854167 0.583333
-vt 0.854167 0.666667
-vt 0.854167 0.750000
-vt 0.854167 0.833333
-vt 0.854167 0.916667
-vt 0.854167 1.000000
-vt 0.854167 0.000000
-vt 0.854167 0.083333
-vt 0.854167 0.166667
-vt 0.854167 0.250000
-vt 0.854167 0.333333
-vt 0.854167 0.416667
-vt 0.875000 0.500000
-vt 0.875000 0.583333
-vt 0.875000 0.666667
-vt 0.875000 0.750000
-vt 0.875000 0.833333
-vt 0.875000 0.916667
-vt 0.875000 1.000000
-vt 0.875000 0.000000
-vt 0.875000 0.083333
-vt 0.875000 0.166667
-vt 0.875000 0.250000
-vt 0.875000 0.333333
-vt 0.875000 0.416667
-vt 0.895833 0.500000
-vt 0.895833 0.583333
-vt 0.895833 0.666667
-vt 0.895833 0.750000
-vt 0.895833 0.833333
-vt 0.895833 0.916667
-vt 0.895833 1.000000
-vt 0.895833 0.000000
-vt 0.895833 0.083333
-vt 0.895833 0.166667
-vt 0.895833 0.250000
-vt 0.895833 0.333333
-vt 0.895833 0.416667
-vt 0.916667 0.500000
-vt 0.916667 0.583333
-vt 0.916667 0.666667
-vt 0.916667 0.750000
-vt 0.916667 0.833333
-vt 0.916667 0.916667
-vt 0.916667 1.000000
-vt 0.916667 0.000000
-vt 0.916667 0.083333
-vt 0.916667 0.166667
-vt 0.916667 0.250000
-vt 0.916667 0.333333
-vt 0.916667 0.416667
-vt 0.937500 0.500000
-vt 0.937500 0.583333
-vt 0.937500 0.666667
-vt 0.937500 0.750000
-vt 0.937500 0.833333
-vt 0.937500 0.916667
-vt 0.937500 1.000000
-vt 0.937500 0.000000
-vt 0.937500 0.083333
-vt 0.937500 0.166667
-vt 0.937500 0.250000
-vt 0.937500 0.333333
-vt 0.937500 0.416667
-vt 0.958333 0.500000
-vt 0.958333 0.583333
-vt 0.958333 0.666667
-vt 0.958333 0.750000
-vt 0.958333 0.833333
-vt 0.958333 0.916667
-vt 0.958333 1.000000
-vt 0.958333 0.000000
-vt 0.958333 0.083333
-vt 0.958333 0.166667
-vt 0.958333 0.250000
-vt 0.958333 0.333333
-vt 0.958333 0.416667
-vt 0.979167 0.500000
-vt 0.979167 0.583333
-vt 0.979167 0.666667
-vt 0.979167 0.750000
-vt 0.979167 0.833333
-vt 0.979167 0.916667
-vt 0.979167 1.000000
-vt 0.979167 0.000000
-vt 0.979167 0.083333
-vt 0.979167 0.166667
-vt 0.979167 0.250000
-vt 0.979167 0.333333
-vt 0.979167 0.416667
-vt 1.000000 0.500000
-vt 1.000000 0.583333
-vt 1.000000 0.666667
-vt 1.000000 0.750000
-vt 1.000000 0.833333
-vt 1.000000 0.916667
-vt 1.000000 1.000000
-vt 1.000000 0.000000
-vt 1.000000 0.083333
-vt 1.000000 0.166667
-vt 1.000000 0.250000
-vt 1.000000 0.333333
-vt 1.000000 0.416667
-vt 0.000000 0.500000
-vt 0.020833 0.500000
-vt 0.020833 0.583333
-vt 0.000000 0.583333
-vt 0.020833 0.666667
-vt 0.000000 0.666667
-vt 0.020833 0.750000
-vt 0.000000 0.750000
-vt 0.020833 0.833333
-vt 0.000000 0.833333
-vt 0.020833 0.916667
-vt 0.000000 0.916667
-vt 0.020833 1.000000
-vt 0.000000 1.000000
-vt 0.000000 0.000000
-vt 0.020833 0.000000
-vt 0.020833 0.083333
-vt 0.000000 0.083333
-vt 0.020833 0.166667
-vt 0.000000 0.166667
-vt 0.020833 0.250000
-vt 0.000000 0.250000
-vt 0.020833 0.333333
-vt 0.000000 0.333333
-vt 0.020833 0.416667
-vt 0.000000 0.416667
-vt 0.041667 0.500000
-vt 0.041667 0.583333
-vt 0.041667 0.666667
-vt 0.041667 0.750000
-vt 0.041667 0.833333
-vt 0.041667 0.916667
-vt 0.041667 1.000000
-vt 0.041667 0.000000
-vt 0.041667 0.083333
-vt 0.041667 0.166667
-vt 0.041667 0.250000
-vt 0.041667 0.333333
-vt 0.041667 0.416667
-vt 0.062500 0.500000
-vt 0.062500 0.583333
-vt 0.062500 0.666667
-vt 0.062500 0.750000
-vt 0.062500 0.833333
-vt 0.062500 0.916667
-vt 0.062500 1.000000
-vt 0.062500 0.000000
-vt 0.062500 0.083333
-vt 0.062500 0.166667
-vt 0.062500 0.250000
-vt 0.062500 0.333333
-vt 0.062500 0.416667
-vt 0.083333 0.500000
-vt 0.083333 0.583333
-vt 0.083333 0.666667
-vt 0.083333 0.750000
-vt 0.083333 0.833333
-vt 0.083333 0.916667
-vt 0.083333 1.000000
-vt 0.083333 0.000000
-vt 0.083333 0.083333
-vt 0.083333 0.166667
-vt 0.083333 0.250000
-vt 0.083333 0.333333
-vt 0.083333 0.416667
-vt 0.104167 0.500000
-vt 0.104167 0.583333
-vt 0.104167 0.666667
-vt 0.104167 0.750000
-vt 0.104167 0.833333
-vt 0.104167 0.916667
-vt 0.104167 1.000000
-vt 0.104167 0.000000
-vt 0.104167 0.083333
-vt 0.104167 0.166667
-vt 0.104167 0.250000
-vt 0.104167 0.333333
-vt 0.104167 0.416667
-vt 0.125000 0.500000
-vt 0.125000 0.583333
-vt 0.125000 0.666667
-vt 0.125000 0.750000
-vt 0.125000 0.833333
-vt 0.125000 0.916667
-vt 0.125000 1.000000
-vt 0.125000 0.000000
-vt 0.125000 0.083333
-vt 0.125000 0.166667
-vt 0.125000 0.250000
-vt 0.125000 0.333333
-vt 0.125000 0.416667
-vt 0.145833 0.500000
-vt 0.145833 0.583333
-vt 0.145833 0.666667
-vt 0.145833 0.750000
-vt 0.145833 0.833333
-vt 0.145833 0.916667
-vt 0.145833 1.000000
-vt 0.145833 0.000000
-vt 0.145833 0.083333
-vt 0.145833 0.166667
-vt 0.145833 0.250000
-vt 0.145833 0.333333
-vt 0.145833 0.416667
-vt 0.166667 0.500000
-vt 0.166667 0.583333
-vt 0.166667 0.666667
-vt 0.166667 0.750000
-vt 0.166667 0.833333
-vt 0.166667 0.916667
-vt 0.166667 1.000000
-vt 0.166667 0.000000
-vt 0.166667 0.083333
-vt 0.166667 0.166667
-vt 0.166667 0.250000
-vt 0.166667 0.333333
-vt 0.166667 0.416667
-vt 0.187500 0.500000
-vt 0.187500 0.583333
-vt 0.187500 0.666667
-vt 0.187500 0.750000
-vt 0.187500 0.833333
-vt 0.187500 0.916667
-vt 0.187500 1.000000
-vt 0.187500 0.000000
-vt 0.187500 0.083333
-vt 0.187500 0.166667
-vt 0.187500 0.250000
-vt 0.187500 0.333333
-vt 0.187500 0.416667
-vt 0.208333 0.500000
-vt 0.208333 0.583333
-vt 0.208333 0.666667
-vt 0.208333 0.750000
-vt 0.208333 0.833333
-vt 0.208333 0.916667
-vt 0.208333 1.000000
-vt 0.208333 0.000000
-vt 0.208333 0.083333
-vt 0.208333 0.166667
-vt 0.208333 0.250000
-vt 0.208333 0.333333
-vt 0.208333 0.416667
-vt 0.229167 0.500000
-vt 0.229167 0.583333
-vt 0.229167 0.666667
-vt 0.229167 0.750000
-vt 0.229167 0.833333
-vt 0.229167 0.916667
-vt 0.229167 1.000000
-vt 0.229167 0.000000
-vt 0.229167 0.083333
-vt 0.229167 0.166667
-vt 0.229167 0.250000
-vt 0.229167 0.333333
-vt 0.229167 0.416667
-vt 0.250000 0.500000
-vt 0.250000 0.583333
-vt 0.250000 0.666667
-vt 0.250000 0.750000
-vt 0.250000 0.833333
-vt 0.250000 0.916667
-vt 0.250000 1.000000
-vt 0.250000 0.000000
-vt 0.250000 0.083333
-vt 0.250000 0.166667
-vt 0.250000 0.250000
-vt 0.250000 0.333333
-vt 0.250000 0.416667
-vt 0.270833 0.500000
-vt 0.270833 0.583333
-vt 0.270833 0.666667
-vt 0.270833 0.750000
-vt 0.270833 0.833333
-vt 0.270833 0.916667
-vt 0.270833 1.000000
-vt 0.270833 0.000000
-vt 0.270833 0.083333
-vt 0.270833 0.166667
-vt 0.270833 0.250000
-vt 0.270833 0.333333
-vt 0.270833 0.416667
-vt 0.291667 0.500000
-vt 0.291667 0.583333
-vt 0.291667 0.666667
-vt 0.291667 0.750000
-vt 0.291667 0.833333
-vt 0.291667 0.916667
-vt 0.291667 1.000000
-vt 0.291667 0.000000
-vt 0.291667 0.083333
-vt 0.291667 0.166667
-vt 0.291667 0.250000
-vt 0.291667 0.333333
-vt 0.291667 0.416667
-vt 0.312500 0.500000
-vt 0.312500 0.583333
-vt 0.312500 0.666667
-vt 0.312500 0.750000
-vt 0.312500 0.833333
-vt 0.312500 0.916667
-vt 0.312500 1.000000
-vt 0.312500 0.000000
-vt 0.312500 0.083333
-vt 0.312500 0.166667
-vt 0.312500 0.250000
-vt 0.312500 0.333333
-vt 0.312500 0.416667
-vt 0.333333 0.500000
-vt 0.333333 0.583333
-vt 0.333333 0.666667
-vt 0.333333 0.750000
-vt 0.333333 0.833333
-vt 0.333333 0.916667
-vt 0.333333 1.000000
-vt 0.333333 0.000000
-vt 0.333333 0.083333
-vt 0.333333 0.166667
-vt 0.333333 0.250000
-vt 0.333333 0.333333
-vt 0.333333 0.416667
-vt 0.354167 0.500000
-vt 0.354167 0.583333
-vt 0.354167 0.666667
-vt 0.354167 0.750000
-vt 0.354167 0.833333
-vt 0.354167 0.916667
-vt 0.354167 1.000000
-vt 0.354167 0.000000
-vt 0.354167 0.083333
-vt 0.354167 0.166667
-vt 0.354167 0.250000
-vt 0.354167 0.333333
-vt 0.354167 0.416667
-vt 0.375000 0.500000
-vt 0.375000 0.583333
-vt 0.375000 0.666667
-vt 0.375000 0.750000
-vt 0.375000 0.833333
-vt 0.375000 0.916667
-vt 0.375000 1.000000
-vt 0.375000 0.000000
-vt 0.375000 0.083333
-vt 0.375000 0.166667
-vt 0.375000 0.250000
-vt 0.375000 0.333333
-vt 0.375000 0.416667
-vt 0.395833 0.500000
-vt 0.395833 0.583333
-vt 0.395833 0.666667
-vt 0.395833 0.750000
-vt 0.395833 0.833333
-vt 0.395833 0.916667
-vt 0.395833 1.000000
-vt 0.395833 0.000000
-vt 0.395833 0.083333
-vt 0.395833 0.166667
-vt 0.395833 0.250000
-vt 0.395833 0.333333
-vt 0.395833 0.416667
-vt 0.416667 0.500000
-vt 0.416667 0.583333
-vt 0.416667 0.666667
-vt 0.416667 0.750000
-vt 0.416667 0.833333
-vt 0.416667 0.916667
-vt 0.416667 1.000000
-vt 0.416667 0.000000
-vt 0.416667 0.083333
-vt 0.416667 0.166667
-vt 0.416667 0.250000
-vt 0.416667 0.333333
-vt 0.416667 0.416667
-vt 0.437500 0.500000
-vt 0.437500 0.583333
-vt 0.437500 0.666667
-vt 0.437500 0.750000
-vt 0.437500 0.833333
-vt 0.437500 0.916667
-vt 0.437500 1.000000
-vt 0.437500 0.000000
-vt 0.437500 0.083333
-vt 0.437500 0.166667
-vt 0.437500 0.250000
-vt 0.437500 0.333333
-vt 0.437500 0.416667
-vt 0.458333 0.500000
-vt 0.458333 0.583333
-vt 0.458333 0.666667
-vt 0.458333 0.750000
-vt 0.458333 0.833333
-vt 0.458333 0.916667
-vt 0.458333 1.000000
-vt 0.458333 0.000000
-vt 0.458333 0.083333
-vt 0.458333 0.166667
-vt 0.458333 0.250000
-vt 0.458333 0.333333
-vt 0.458333 0.416667
-vt 0.479167 0.500000
-vt 0.479167 0.583333
-vt 0.479167 0.666667
-vt 0.479167 0.750000
-vt 0.479167 0.833333
-vt 0.479167 0.916667
-vt 0.479167 1.000000
-vt 0.479167 0.000000
-vt 0.479167 0.083333
-vt 0.479167 0.166667
-vt 0.479167 0.250000
-vt 0.479167 0.333333
-vt 0.479167 0.416667
-usemtl tex
-s off
-f 1/1/1 13/2/1 14/3/1 2/4/1
-f 2/4/2 14/3/2 15/5/2 3/6/2
-f 3/6/3 15/5/3 16/7/3 4/8/3
-f 4/8/4 16/7/4 17/9/4 5/10/4
-f 5/10/5 17/9/5 18/11/5 6/12/5
-f 6/12/6 18/11/6 19/13/6 7/14/6
-f 7/15/7 19/16/7 20/17/7 8/18/7
-f 8/18/8 20/17/8 21/19/8 9/20/8
-f 9/20/9 21/19/9 22/21/9 10/22/9
-f 10/22/10 22/21/10 23/23/10 11/24/10
-f 11/24/11 23/23/11 24/25/11 12/26/11
-f 12/26/12 24/25/12 13/2/12 1/1/12
-f 13/2/13 25/27/13 26/28/13 14/3/13
-f 14/3/14 26/28/14 27/29/14 15/5/14
-f 15/5/15 27/29/15 28/30/15 16/7/15
-f 16/7/16 28/30/16 29/31/16 17/9/16
-f 17/9/17 29/31/17 30/32/17 18/11/17
-f 18/11/18 30/32/18 31/33/18 19/13/18
-f 19/16/19 31/34/19 32/35/19 20/17/19
-f 20/17/20 32/35/20 33/36/20 21/19/20
-f 21/19/21 33/36/21 34/37/21 22/21/21
-f 22/21/22 34/37/22 35/38/22 23/23/22
-f 23/23/23 35/38/23 36/39/23 24/25/23
-f 24/25/24 36/39/24 25/27/24 13/2/24
-f 25/27/25 37/40/25 38/41/25 26/28/25
-f 26/28/26 38/41/26 39/42/26 27/29/26
-f 27/29/27 39/42/27 40/43/27 28/30/27
-f 28/30/28 40/43/28 41/44/28 29/31/28
-f 29/31/29 41/44/29 42/45/29 30/32/29
-f 30/32/30 42/45/30 43/46/30 31/33/30
-f 31/34/31 43/47/31 44/48/31 32/35/31
-f 32/35/32 44/48/32 45/49/32 33/36/32
-f 33/36/33 45/49/33 46/50/33 34/37/33
-f 34/37/34 46/50/34 47/51/34 35/38/34
-f 35/38/35 47/51/35 48/52/35 36/39/35
-f 36/39/36 48/52/36 37/40/36 25/27/36
-f 37/40/37 49/53/37 50/54/37 38/41/37
-f 38/41/38 50/54/38 51/55/38 39/42/38
-f 39/42/39 51/55/39 52/56/39 40/43/39
-f 40/43/40 52/56/40 53/57/40 41/44/40
-f 41/44/41 53/57/41 54/58/41 42/45/41
-f 42/45/42 54/58/42 55/59/42 43/46/42
-f 43/47/43 55/60/43 56/61/43 44/48/43
-f 44/48/44 56/61/44 57/62/44 45/49/44
-f 45/49/45 57/62/45 58/63/45 46/50/45
-f 46/50/46 58/63/46 59/64/46 47/51/46
-f 47/51/47 59/64/47 60/65/47 48/52/47
-f 48/52/48 60/65/48 49/53/48 37/40/48
-f 49/53/49 61/66/49 62/67/49 50/54/49
-f 50/54/50 62/67/50 63/68/50 51/55/50
-f 51/55/51 63/68/51 64/69/51 52/56/51
-f 52/56/52 64/69/52 65/70/52 53/57/52
-f 53/57/53 65/70/53 66/71/53 54/58/53
-f 54/58/54 66/71/54 67/72/54 55/59/54
-f 55/60/55 67/73/55 68/74/55 56/61/55
-f 56/61/56 68/74/56 69/75/56 57/62/56
-f 57/62/57 69/75/57 70/76/57 58/63/57
-f 58/63/58 70/76/58 71/77/58 59/64/58
-f 59/64/59 71/77/59 72/78/59 60/65/59
-f 60/65/60 72/78/60 61/66/60 49/53/60
-f 61/66/61 73/79/61 74/80/61 62/67/61
-f 62/67/62 74/80/62 75/81/62 63/68/62
-f 63/68/63 75/81/63 76/82/63 64/69/63
-f 64/69/64 76/82/64 77/83/64 65/70/64
-f 65/70/65 77/83/65 78/84/65 66/71/65
-f 66/71/66 78/84/66 79/85/66 67/72/66
-f 67/73/67 79/86/67 80/87/67 68/74/67
-f 68/74/68 80/87/68 81/88/68 69/75/68
-f 69/75/69 81/88/69 82/89/69 70/76/69
-f 70/76/70 82/89/70 83/90/70 71/77/70
-f 71/77/71 83/90/71 84/91/71 72/78/71
-f 72/78/72 84/91/72 73/79/72 61/66/72
-f 73/79/73 85/92/73 86/93/73 74/80/73
-f 74/80/74 86/93/74 87/94/74 75/81/74
-f 75/81/75 87/94/75 88/95/75 76/82/75
-f 76/82/76 88/95/76 89/96/76 77/83/76
-f 77/83/77 89/96/77 90/97/77 78/84/77
-f 78/84/78 90/97/78 91/98/78 79/85/78
-f 79/86/79 91/99/79 92/100/79 80/87/79
-f 80/87/80 92/100/80 93/101/80 81/88/80
-f 81/88/81 93/101/81 94/102/81 82/89/81
-f 82/89/82 94/102/82 95/103/82 83/90/82
-f 83/90/83 95/103/83 96/104/83 84/91/83
-f 84/91/84 96/104/84 85/92/84 73/79/84
-f 85/92/85 97/105/85 98/106/85 86/93/85
-f 86/93/86 98/106/86 99/107/86 87/94/86
-f 87/94/87 99/107/87 100/108/87 88/95/87
-f 88/95/88 100/108/88 101/109/88 89/96/88
-f 89/96/89 101/109/89 102/110/89 90/97/89
-f 90/97/90 102/110/90 103/111/90 91/98/90
-f 91/99/91 103/112/91 104/113/91 92/100/91
-f 92/100/92 104/113/92 105/114/92 93/101/92
-f 93/101/93 105/114/93 106/115/93 94/102/93
-f 94/102/94 106/115/94 107/116/94 95/103/94
-f 95/103/95 107/116/95 108/117/95 96/104/95
-f 96/104/96 108/117/96 97/105/96 85/92/96
-f 97/105/97 109/118/97 110/119/97 98/106/97
-f 98/106/98 110/119/98 111/120/98 99/107/98
-f 99/107/99 111/120/99 112/121/99 100/108/99
-f 100/108/100 112/121/100 113/122/100 101/109/100
-f 101/109/101 113/122/101 114/123/101 102/110/101
-f 102/110/102 114/123/102 115/124/102 103/111/102
-f 103/112/103 115/125/103 116/126/103 104/113/103
-f 104/113/104 116/126/104 117/127/104 105/114/104
-f 105/114/105 117/127/105 118/128/105 106/115/105
-f 106/115/106 118/128/106 119/129/106 107/116/106
-f 107/116/107 119/129/107 120/130/107 108/117/107
-f 108/117/108 120/130/108 109/118/108 97/105/108
-f 109/118/109 121/131/109 122/132/109 110/119/109
-f 110/119/110 122/132/110 123/133/110 111/120/110
-f 111/120/111 123/133/111 124/134/111 112/121/111
-f 112/121/112 124/134/112 125/135/112 113/122/112
-f 113/122/113 125/135/113 126/136/113 114/123/113
-f 114/123/114 126/136/114 127/137/114 115/124/114
-f 115/125/115 127/138/115 128/139/115 116/126/115
-f 116/126/116 128/139/116 129/140/116 117/127/116
-f 117/127/117 129/140/117 130/141/117 118/128/117
-f 118/128/118 130/141/118 131/142/118 119/129/118
-f 119/129/119 131/142/119 132/143/119 120/130/119
-f 120/130/120 132/143/120 121/131/120 109/118/120
-f 121/131/121 133/144/121 134/145/121 122/132/121
-f 122/132/122 134/145/122 135/146/122 123/133/122
-f 123/133/123 135/146/123 136/147/123 124/134/123
-f 124/134/124 136/147/124 137/148/124 125/135/124
-f 125/135/125 137/148/125 138/149/125 126/136/125
-f 126/136/126 138/149/126 139/150/126 127/137/126
-f 127/138/127 139/151/127 140/152/127 128/139/127
-f 128/139/128 140/152/128 141/153/128 129/140/128
-f 129/140/129 141/153/129 142/154/129 130/141/129
-f 130/141/130 142/154/130 143/155/130 131/142/130
-f 131/142/131 143/155/131 144/156/131 132/143/131
-f 132/143/132 144/156/132 133/144/132 121/131/132
-f 133/144/133 145/157/133 146/158/133 134/145/133
-f 134/145/134 146/158/134 147/159/134 135/146/134
-f 135/146/135 147/159/135 148/160/135 136/147/135
-f 136/147/136 148/160/136 149/161/136 137/148/136
-f 137/148/137 149/161/137 150/162/137 138/149/137
-f 138/149/138 150/162/138 151/163/138 139/150/138
-f 139/151/139 151/164/139 152/165/139 140/152/139
-f 140/152/140 152/165/140 153/166/140 141/153/140
-f 141/153/141 153/166/141 154/167/141 142/154/141
-f 142/154/142 154/167/142 155/168/142 143/155/142
-f 143/155/143 155/168/143 156/169/143 144/156/143
-f 144/156/144 156/169/144 145/157/144 133/144/144
-f 145/157/145 157/170/145 158/171/145 146/158/145
-f 146/158/146 158/171/146 159/172/146 147/159/146
-f 147/159/147 159/172/147 160/173/147 148/160/147
-f 148/160/148 160/173/148 161/174/148 149/161/148
-f 149/161/149 161/174/149 162/175/149 150/162/149
-f 150/162/150 162/175/150 163/176/150 151/163/150
-f 151/164/151 163/177/151 164/178/151 152/165/151
-f 152/165/152 164/178/152 165/179/152 153/166/152
-f 153/166/153 165/179/153 166/180/153 154/167/153
-f 154/167/154 166/180/154 167/181/154 155/168/154
-f 155/168/155 167/181/155 168/182/155 156/169/155
-f 156/169/156 168/182/156 157/170/156 145/157/156
-f 157/170/157 169/183/157 170/184/157 158/171/157
-f 158/171/158 170/184/158 171/185/158 159/172/158
-f 159/172/159 171/185/159 172/186/159 160/173/159
-f 160/173/160 172/186/160 173/187/160 161/174/160
-f 161/174/161 173/187/161 174/188/161 162/175/161
-f 162/175/162 174/188/162 175/189/162 163/176/162
-f 163/177/163 175/190/163 176/191/163 164/178/163
-f 164/178/164 176/191/164 177/192/164 165/179/164
-f 165/179/165 177/192/165 178/193/165 166/180/165
-f 166/180/166 178/193/166 179/194/166 167/181/166
-f 167/181/167 179/194/167 180/195/167 168/182/167
-f 168/182/168 180/195/168 169/183/168 157/170/168
-f 169/183/169 181/196/169 182/197/169 170/184/169
-f 170/184/170 182/197/170 183/198/170 171/185/170
-f 171/185/171 183/198/171 184/199/171 172/186/171
-f 172/186/172 184/199/172 185/200/172 173/187/172
-f 173/187/173 185/200/173 186/201/173 174/188/173
-f 174/188/174 186/201/174 187/202/174 175/189/174
-f 175/190/175 187/203/175 188/204/175 176/191/175
-f 176/191/176 188/204/176 189/205/176 177/192/176
-f 177/192/177 189/205/177 190/206/177 178/193/177
-f 178/193/178 190/206/178 191/207/178 179/194/178
-f 179/194/179 191/207/179 192/208/179 180/195/179
-f 180/195/180 192/208/180 181/196/180 169/183/180
-f 181/196/181 193/209/181 194/210/181 182/197/181
-f 182/197/182 194/210/182 195/211/182 183/198/182
-f 183/198/183 195/211/183 196/212/183 184/199/183
-f 184/199/184 196/212/184 197/213/184 185/200/184
-f 185/200/185 197/213/185 198/214/185 186/201/185
-f 186/201/186 198/214/186 199/215/186 187/202/186
-f 187/203/187 199/216/187 200/217/187 188/204/187
-f 188/204/188 200/217/188 201/218/188 189/205/188
-f 189/205/189 201/218/189 202/219/189 190/206/189
-f 190/206/190 202/219/190 203/220/190 191/207/190
-f 191/207/191 203/220/191 204/221/191 192/208/191
-f 192/208/192 204/221/192 193/209/192 181/196/192
-f 193/209/193 205/222/193 206/223/193 194/210/193
-f 194/210/194 206/223/194 207/224/194 195/211/194
-f 195/211/195 207/224/195 208/225/195 196/212/195
-f 196/212/196 208/225/196 209/226/196 197/213/196
-f 197/213/197 209/226/197 210/227/197 198/214/197
-f 198/214/198 210/227/198 211/228/198 199/215/198
-f 199/216/199 211/229/199 212/230/199 200/217/199
-f 200/217/200 212/230/200 213/231/200 201/218/200
-f 201/218/201 213/231/201 214/232/201 202/219/201
-f 202/219/202 214/232/202 215/233/202 203/220/202
-f 203/220/203 215/233/203 216/234/203 204/221/203
-f 204/221/204 216/234/204 205/222/204 193/209/204
-f 205/222/205 217/235/205 218/236/205 206/223/205
-f 206/223/206 218/236/206 219/237/206 207/224/206
-f 207/224/207 219/237/207 220/238/207 208/225/207
-f 208/225/208 220/238/208 221/239/208 209/226/208
-f 209/226/209 221/239/209 222/240/209 210/227/209
-f 210/227/210 222/240/210 223/241/210 211/228/210
-f 211/229/211 223/242/211 224/243/211 212/230/211
-f 212/230/212 224/243/212 225/244/212 213/231/212
-f 213/231/213 225/244/213 226/245/213 214/232/213
-f 214/232/214 226/245/214 227/246/214 215/233/214
-f 215/233/215 227/246/215 228/247/215 216/234/215
-f 216/234/216 228/247/216 217/235/216 205/222/216
-f 217/235/217 229/248/217 230/249/217 218/236/217
-f 218/236/218 230/249/218 231/250/218 219/237/218
-f 219/237/219 231/250/219 232/251/219 220/238/219
-f 220/238/220 232/251/220 233/252/220 221/239/220
-f 221/239/221 233/252/221 234/253/221 222/240/221
-f 222/240/222 234/253/222 235/254/222 223/241/222
-f 223/242/223 235/255/223 236/256/223 224/243/223
-f 224/243/224 236/256/224 237/257/224 225/244/224
-f 225/244/225 237/257/225 238/258/225 226/245/225
-f 226/245/226 238/258/226 239/259/226 227/246/226
-f 227/246/227 239/259/227 240/260/227 228/247/227
-f 228/247/228 240/260/228 229/248/228 217/235/228
-f 229/248/229 241/261/229 242/262/229 230/249/229
-f 230/249/230 242/262/230 243/263/230 231/250/230
-f 231/250/231 243/263/231 244/264/231 232/251/231
-f 232/251/232 244/264/232 245/265/232 233/252/232
-f 233/252/233 245/265/233 246/266/233 234/253/233
-f 234/253/234 246/266/234 247/267/234 235/254/234
-f 235/255/235 247/268/235 248/269/235 236/256/235
-f 236/256/236 248/269/236 249/270/236 237/257/236
-f 237/257/237 249/270/237 250/271/237 238/258/237
-f 238/258/238 250/271/238 251/272/238 239/259/238
-f 239/259/239 251/272/239 252/273/239 240/260/239
-f 240/260/240 252/273/240 241/261/240 229/248/240
-f 241/261/241 253/274/241 254/275/241 242/262/241
-f 242/262/242 254/275/242 255/276/242 243/263/242
-f 243/263/243 255/276/243 256/277/243 244/264/243
-f 244/264/244 256/277/244 257/278/244 245/265/244
-f 245/265/245 257/278/245 258/279/245 246/266/245
-f 246/266/246 258/279/246 259/280/246 247/267/246
-f 247/268/247 259/281/247 260/282/247 248/269/247
-f 248/269/248 260/282/248 261/283/248 249/270/248
-f 249/270/249 261/283/249 262/284/249 250/271/249
-f 250/271/250 262/284/250 263/285/250 251/272/250
-f 251/272/251 263/285/251 264/286/251 252/273/251
-f 252/273/252 264/286/252 253/274/252 241/261/252
-f 253/274/253 265/287/253 266/288/253 254/275/253
-f 254/275/254 266/288/254 267/289/254 255/276/254
-f 255/276/255 267/289/255 268/290/255 256/277/255
-f 256/277/256 268/290/256 269/291/256 257/278/256
-f 257/278/257 269/291/257 270/292/257 258/279/257
-f 258/279/258 270/292/258 271/293/258 259/280/258
-f 259/281/259 271/294/259 272/295/259 260/282/259
-f 260/282/260 272/295/260 273/296/260 261/283/260
-f 261/283/261 273/296/261 274/297/261 262/284/261
-f 262/284/262 274/297/262 275/298/262 263/285/262
-f 263/285/263 275/298/263 276/299/263 264/286/263
-f 264/286/264 276/299/264 265/287/264 253/274/264
-f 265/287/265 277/300/265 278/301/265 266/288/265
-f 266/288/266 278/301/266 279/302/266 267/289/266
-f 267/289/267 279/302/267 280/303/267 268/290/267
-f 268/290/268 280/303/268 281/304/268 269/291/268
-f 269/291/269 281/304/269 282/305/269 270/292/269
-f 270/292/270 282/305/270 283/306/270 271/293/270
-f 271/294/271 283/307/271 284/308/271 272/295/271
-f 272/295/272 284/308/272 285/309/272 273/296/272
-f 273/296/273 285/309/273 286/310/273 274/297/273
-f 274/297/274 286/310/274 287/311/274 275/298/274
-f 275/298/275 287/311/275 288/312/275 276/299/275
-f 276/299/276 288/312/276 277/300/276 265/287/276
-f 277/300/277 289/313/277 290/314/277 278/301/277
-f 278/301/278 290/314/278 291/315/278 279/302/278
-f 279/302/279 291/315/279 292/316/279 280/303/279
-f 280/303/280 292/316/280 293/317/280 281/304/280
-f 281/304/281 293/317/281 294/318/281 282/305/281
-f 282/305/282 294/318/282 295/319/282 283/306/282
-f 283/307/283 295/320/283 296/321/283 284/308/283
-f 284/308/284 296/321/284 297/322/284 285/309/284
-f 285/309/285 297/322/285 298/323/285 286/310/285
-f 286/310/286 298/323/286 299/324/286 287/311/286
-f 287/311/287 299/324/287 300/325/287 288/312/287
-f 288/312/288 300/325/288 289/313/288 277/300/288
-f 289/326/6 301/327/6 302/328/6 290/329/6
-f 290/329/5 302/328/5 303/330/5 291/331/5
-f 291/331/4 303/330/4 304/332/4 292/333/4
-f 292/333/3 304/332/3 305/334/3 293/335/3
-f 293/335/2 305/334/2 306/336/2 294/337/2
-f 294/337/1 306/336/1 307/338/1 295/339/1
-f 295/340/12 307/341/12 308/342/12 296/343/12
-f 296/343/11 308/342/11 309/344/11 297/345/11
-f 297/345/10 309/344/10 310/346/10 298/347/10
-f 298/347/9 310/346/9 311/348/9 299/349/9
-f 299/349/8 311/348/8 312/350/8 300/351/8
-f 300/351/7 312/350/7 301/327/7 289/326/7
-f 301/327/18 313/352/18 314/353/18 302/328/18
-f 302/328/17 314/353/17 315/354/17 303/330/17
-f 303/330/16 315/354/16 316/355/16 304/332/16
-f 304/332/15 316/355/15 317/356/15 305/334/15
-f 305/334/14 317/356/14 318/357/14 306/336/14
-f 306/336/13 318/357/13 319/358/13 307/338/13
-f 307/341/24 319/359/24 320/360/24 308/342/24
-f 308/342/23 320/360/23 321/361/23 309/344/23
-f 309/344/22 321/361/22 322/362/22 310/346/22
-f 310/346/21 322/362/21 323/363/21 311/348/21
-f 311/348/20 323/363/20 324/364/20 312/350/20
-f 312/350/19 324/364/19 313/352/19 301/327/19
-f 313/352/30 325/365/30 326/366/30 314/353/30
-f 314/353/29 326/366/29 327/367/29 315/354/29
-f 315/354/28 327/367/28 328/368/28 316/355/28
-f 316/355/27 328/368/27 329/369/27 317/356/27
-f 317/356/26 329/369/26 330/370/26 318/357/26
-f 318/357/25 330/370/25 331/371/25 319/358/25
-f 319/359/36 331/372/36 332/373/36 320/360/36
-f 320/360/35 332/373/35 333/374/35 321/361/35
-f 321/361/34 333/374/34 334/375/34 322/362/34
-f 322/362/33 334/375/33 335/376/33 323/363/33
-f 323/363/32 335/376/32 336/377/32 324/364/32
-f 324/364/31 336/377/31 325/365/31 313/352/31
-f 325/365/42 337/378/42 338/379/42 326/366/42
-f 326/366/41 338/379/41 339/380/41 327/367/41
-f 327/367/40 339/380/40 340/381/40 328/368/40
-f 328/368/39 340/381/39 341/382/39 329/369/39
-f 329/369/38 341/382/38 342/383/38 330/370/38
-f 330/370/37 342/383/37 343/384/37 331/371/37
-f 331/372/48 343/385/48 344/386/48 332/373/48
-f 332/373/47 344/386/47 345/387/47 333/374/47
-f 333/374/46 345/387/46 346/388/46 334/375/46
-f 334/375/45 346/388/45 347/389/45 335/376/45
-f 335/376/44 347/389/44 348/390/44 336/377/44
-f 336/377/43 348/390/43 337/378/43 325/365/43
-f 337/378/54 349/391/54 350/392/54 338/379/54
-f 338/379/53 350/392/53 351/393/53 339/380/53
-f 339/380/52 351/393/52 352/394/52 340/381/52
-f 340/381/51 352/394/51 353/395/51 341/382/51
-f 341/382/50 353/395/50 354/396/50 342/383/50
-f 342/383/49 354/396/49 355/397/49 343/384/49
-f 343/385/60 355/398/60 356/399/60 344/386/60
-f 344/386/59 356/399/59 357/400/59 345/387/59
-f 345/387/58 357/400/58 358/401/58 346/388/58
-f 346/388/57 358/401/57 359/402/57 347/389/57
-f 347/389/56 359/402/56 360/403/56 348/390/56
-f 348/390/55 360/403/55 349/391/55 337/378/55
-f 349/391/66 361/404/66 362/405/66 350/392/66
-f 350/392/65 362/405/65 363/406/65 351/393/65
-f 351/393/64 363/406/64 364/407/64 352/394/64
-f 352/394/63 364/407/63 365/408/63 353/395/63
-f 353/395/62 365/408/62 366/409/62 354/396/62
-f 354/396/61 366/409/61 367/410/61 355/397/61
-f 355/398/72 367/411/72 368/412/72 356/399/72
-f 356/399/71 368/412/71 369/413/71 357/400/71
-f 357/400/70 369/413/70 370/414/70 358/401/70
-f 358/401/69 370/414/69 371/415/69 359/402/69
-f 359/402/68 371/415/68 372/416/68 360/403/68
-f 360/403/67 372/416/67 361/404/67 349/391/67
-f 361/404/78 373/417/78 374/418/78 362/405/78
-f 362/405/77 374/418/77 375/419/77 363/406/77
-f 363/406/76 375/419/76 376/420/76 364/407/76
-f 364/407/75 376/420/75 377/421/75 365/408/75
-f 365/408/74 377/421/74 378/422/74 366/409/74
-f 366/409/73 378/422/73 379/423/73 367/410/73
-f 367/411/84 379/424/84 380/425/84 368/412/84
-f 368/412/83 380/425/83 381/426/83 369/413/83
-f 369/413/82 381/426/82 382/427/82 370/414/82
-f 370/414/81 382/427/81 383/428/81 371/415/81
-f 371/415/80 383/428/80 384/429/80 372/416/80
-f 372/416/79 384/429/79 373/417/79 361/404/79
-f 373/417/90 385/430/90 386/431/90 374/418/90
-f 374/418/89 386/431/89 387/432/89 375/419/89
-f 375/419/88 387/432/88 388/433/88 376/420/88
-f 376/420/87 388/433/87 389/434/87 377/421/87
-f 377/421/86 389/434/86 390/435/86 378/422/86
-f 378/422/85 390/435/85 391/436/85 379/423/85
-f 379/424/96 391/437/96 392/438/96 380/425/96
-f 380/425/95 392/438/95 393/439/95 381/426/95
-f 381/426/94 393/439/94 394/440/94 382/427/94
-f 382/427/93 394/440/93 395/441/93 383/428/93
-f 383/428/92 395/441/92 396/442/92 384/429/92
-f 384/429/91 396/442/91 385/430/91 373/417/91
-f 385/430/102 397/443/102 398/444/102 386/431/102
-f 386/431/101 398/444/101 399/445/101 387/432/101
-f 387/432/100 399/445/100 400/446/100 388/433/100
-f 388/433/99 400/446/99 401/447/99 389/434/99
-f 389/434/98 401/447/98 402/448/98 390/435/98
-f 390/435/97 402/448/97 403/449/97 391/436/97
-f 391/437/108 403/450/108 404/451/108 392/438/108
-f 392/438/107 404/451/107 405/452/107 393/439/107
-f 393/439/106 405/452/106 406/453/106 394/440/106
-f 394/440/105 406/453/105 407/454/105 395/441/105
-f 395/441/104 407/454/104 408/455/104 396/442/104
-f 396/442/103 408/455/103 397/443/103 385/430/103
-f 397/443/114 409/456/114 410/457/114 398/444/114
-f 398/444/113 410/457/113 411/458/113 399/445/113
-f 399/445/112 411/458/112 412/459/112 400/446/112
-f 400/446/111 412/459/111 413/460/111 401/447/111
-f 401/447/110 413/460/110 414/461/110 402/448/110
-f 402/448/109 414/461/109 415/462/109 403/449/109
-f 403/450/120 415/463/120 416/464/120 404/451/120
-f 404/451/119 416/464/119 417/465/119 405/452/119
-f 405/452/118 417/465/118 418/466/118 406/453/118
-f 406/453/117 418/466/117 419/467/117 407/454/117
-f 407/454/116 419/467/116 420/468/116 408/455/116
-f 408/455/115 420/468/115 409/456/115 397/443/115
-f 409/456/126 421/469/126 422/470/126 410/457/126
-f 410/457/125 422/470/125 423/471/125 411/458/125
-f 411/458/124 423/471/124 424/472/124 412/459/124
-f 412/459/123 424/472/123 425/473/123 413/460/123
-f 413/460/122 425/473/122 426/474/122 414/461/122
-f 414/461/121 426/474/121 427/475/121 415/462/121
-f 415/463/132 427/476/132 428/477/132 416/464/132
-f 416/464/131 428/477/131 429/478/131 417/465/131
-f 417/465/130 429/478/130 430/479/130 418/466/130
-f 418/466/129 430/479/129 431/480/129 419/467/129
-f 419/467/128 431/480/128 432/481/128 420/468/128
-f 420/468/127 432/481/127 421/469/127 409/456/127
-f 421/469/138 433/482/138 434/483/138 422/470/138
-f 422/470/137 434/483/137 435/484/137 423/471/137
-f 423/471/136 435/484/136 436/485/136 424/472/136
-f 424/472/135 436/485/135 437/486/135 425/473/135
-f 425/473/134 437/486/134 438/487/134 426/474/134
-f 426/474/133 438/487/133 439/488/133 427/475/133
-f 427/476/144 439/489/144 440/490/144 428/477/144
-f 428/477/143 440/490/143 441/491/143 429/478/143
-f 429/478/142 441/491/142 442/492/142 430/479/142
-f 430/479/141 442/492/141 443/493/141 431/480/141
-f 431/480/140 443/493/140 444/494/140 432/481/140
-f 432/481/139 444/494/139 433/482/139 421/469/139
-f 433/482/150 445/495/150 446/496/150 434/483/150
-f 434/483/149 446/496/149 447/497/149 435/484/149
-f 435/484/148 447/497/148 448/498/148 436/485/148
-f 436/485/147 448/498/147 449/499/147 437/486/147
-f 437/486/146 449/499/146 450/500/146 438/487/146
-f 438/487/145 450/500/145 451/501/145 439/488/145
-f 439/489/156 451/502/156 452/503/156 440/490/156
-f 440/490/155 452/503/155 453/504/155 441/491/155
-f 441/491/154 453/504/154 454/505/154 442/492/154
-f 442/492/153 454/505/153 455/506/153 443/493/153
-f 443/493/152 455/506/152 456/507/152 444/494/152
-f 444/494/151 456/507/151 445/495/151 433/482/151
-f 445/495/162 457/508/162 458/509/162 446/496/162
-f 446/496/161 458/509/161 459/510/161 447/497/161
-f 447/497/160 459/510/160 460/511/160 448/498/160
-f 448/498/159 460/511/159 461/512/159 449/499/159
-f 449/499/158 461/512/158 462/513/158 450/500/158
-f 450/500/157 462/513/157 463/514/157 451/501/157
-f 451/502/168 463/515/168 464/516/168 452/503/168
-f 452/503/167 464/516/167 465/517/167 453/504/167
-f 453/504/166 465/517/166 466/518/166 454/505/166
-f 454/505/165 466/518/165 467/519/165 455/506/165
-f 455/506/164 467/519/164 468/520/164 456/507/164
-f 456/507/163 468/520/163 457/508/163 445/495/163
-f 457/508/174 469/521/174 470/522/174 458/509/174
-f 458/509/173 470/522/173 471/523/173 459/510/173
-f 459/510/172 471/523/172 472/524/172 460/511/172
-f 460/511/171 472/524/171 473/525/171 461/512/171
-f 461/512/170 473/525/170 474/526/170 462/513/170
-f 462/513/169 474/526/169 475/527/169 463/514/169
-f 463/515/180 475/528/180 476/529/180 464/516/180
-f 464/516/179 476/529/179 477/530/179 465/517/179
-f 465/517/178 477/530/178 478/531/178 466/518/178
-f 466/518/177 478/531/177 479/532/177 467/519/177
-f 467/519/176 479/532/176 480/533/176 468/520/176
-f 468/520/175 480/533/175 469/521/175 457/508/175
-f 469/521/186 481/534/186 482/535/186 470/522/186
-f 470/522/185 482/535/185 483/536/185 471/523/185
-f 471/523/184 483/536/184 484/537/184 472/524/184
-f 472/524/183 484/537/183 485/538/183 473/525/183
-f 473/525/182 485/538/182 486/539/182 474/526/182
-f 474/526/181 486/539/181 487/540/181 475/527/181
-f 475/528/192 487/541/192 488/542/192 476/529/192
-f 476/529/191 488/542/191 489/543/191 477/530/191
-f 477/530/190 489/543/190 490/544/190 478/531/190
-f 478/531/189 490/544/189 491/545/189 479/532/189
-f 479/532/188 491/545/188 492/546/188 480/533/188
-f 480/533/187 492/546/187 481/534/187 469/521/187
-f 481/534/198 493/547/198 494/548/198 482/535/198
-f 482/535/197 494/548/197 495/549/197 483/536/197
-f 483/536/196 495/549/196 496/550/196 484/537/196
-f 484/537/195 496/550/195 497/551/195 485/538/195
-f 485/538/194 497/551/194 498/552/194 486/539/194
-f 486/539/193 498/552/193 499/553/193 487/540/193
-f 487/541/204 499/554/204 500/555/204 488/542/204
-f 488/542/203 500/555/203 501/556/203 489/543/203
-f 489/543/202 501/556/202 502/557/202 490/544/202
-f 490/544/201 502/557/201 503/558/201 491/545/201
-f 491/545/200 503/558/200 504/559/200 492/546/200
-f 492/546/199 504/559/199 493/547/199 481/534/199
-f 493/547/210 505/560/210 506/561/210 494/548/210
-f 494/548/209 506/561/209 507/562/209 495/549/209
-f 495/549/208 507/562/208 508/563/208 496/550/208
-f 496/550/207 508/563/207 509/564/207 497/551/207
-f 497/551/206 509/564/206 510/565/206 498/552/206
-f 498/552/205 510/565/205 511/566/205 499/553/205
-f 499/554/216 511/567/216 512/568/216 500/555/216
-f 500/555/215 512/568/215 513/569/215 501/556/215
-f 501/556/214 513/569/214 514/570/214 502/557/214
-f 502/557/213 514/570/213 515/571/213 503/558/213
-f 503/558/212 515/571/212 516/572/212 504/559/212
-f 504/559/211 516/572/211 505/560/211 493/547/211
-f 505/560/222 517/573/222 518/574/222 506/561/222
-f 506/561/221 518/574/221 519/575/221 507/562/221
-f 507/562/220 519/575/220 520/576/220 508/563/220
-f 508/563/219 520/576/219 521/577/219 509/564/219
-f 509/564/218 521/577/218 522/578/218 510/565/218
-f 510/565/217 522/578/217 523/579/217 511/566/217
-f 511/567/228 523/580/228 524/581/228 512/568/228
-f 512/568/227 524/581/227 525/582/227 513/569/227
-f 513/569/226 525/582/226 526/583/226 514/570/226
-f 514/570/225 526/583/225 527/584/225 515/571/225
-f 515/571/224 527/584/224 528/585/224 516/572/224
-f 516/572/223 528/585/223 517/573/223 505/560/223
-f 517/573/234 529/586/234 530/587/234 518/574/234
-f 518/574/233 530/587/233 531/588/233 519/575/233
-f 519/575/232 531/588/232 532/589/232 520/576/232
-f 520/576/231 532/589/231 533/590/231 521/577/231
-f 521/577/230 533/590/230 534/591/230 522/578/230
-f 522/578/229 534/591/229 535/592/229 523/579/229
-f 523/580/240 535/593/240 536/594/240 524/581/240
-f 524/581/239 536/594/239 537/595/239 525/582/239
-f 525/582/238 537/595/238 538/596/238 526/583/238
-f 526/583/237 538/596/237 539/597/237 527/584/237
-f 527/584/236 539/597/236 540/598/236 528/585/236
-f 528/585/235 540/598/235 529/586/235 517/573/235
-f 529/586/246 541/599/246 542/600/246 530/587/246
-f 530/587/245 542/600/245 543/601/245 531/588/245
-f 531/588/244 543/601/244 544/602/244 532/589/244
-f 532/589/243 544/602/243 545/603/243 533/590/243
-f 533/590/242 545/603/242 546/604/242 534/591/242
-f 534/591/241 546/604/241 547/605/241 535/592/241
-f 535/593/252 547/606/252 548/607/252 536/594/252
-f 536/594/251 548/607/251 549/608/251 537/595/251
-f 537/595/250 549/608/250 550/609/250 538/596/250
-f 538/596/249 550/609/249 551/610/249 539/597/249
-f 539/597/248 551/610/248 552/611/248 540/598/248
-f 540/598/247 552/611/247 541/599/247 529/586/247
-f 541/599/258 553/612/258 554/613/258 542/600/258
-f 542/600/257 554/613/257 555/614/257 543/601/257
-f 543/601/256 555/614/256 556/615/256 544/602/256
-f 544/602/255 556/615/255 557/616/255 545/603/255
-f 545/603/254 557/616/254 558/617/254 546/604/254
-f 546/604/253 558/617/253 559/618/253 547/605/253
-f 547/606/264 559/619/264 560/620/264 548/607/264
-f 548/607/263 560/620/263 561/621/263 549/608/263
-f 549/608/262 561/621/262 562/622/262 550/609/262
-f 550/609/261 562/622/261 563/623/261 551/610/261
-f 551/610/260 563/623/260 564/624/260 552/611/260
-f 552/611/259 564/624/259 553/612/259 541/599/259
-f 553/612/270 565/625/270 566/626/270 554/613/270
-f 554/613/269 566/626/269 567/627/269 555/614/269
-f 555/614/268 567/627/268 568/628/268 556/615/268
-f 556/615/267 568/628/267 569/629/267 557/616/267
-f 557/616/266 569/629/266 570/630/266 558/617/266
-f 558/617/265 570/630/265 571/631/265 559/618/265
-f 559/619/276 571/632/276 572/633/276 560/620/276
-f 560/620/275 572/633/275 573/634/275 561/621/275
-f 561/621/274 573/634/274 574/635/274 562/622/274
-f 562/622/273 574/635/273 575/636/273 563/623/273
-f 563/623/272 575/636/272 576/637/272 564/624/272
-f 564/624/271 576/637/271 565/625/271 553/612/271
-f 565/625/282 1/1/282 2/4/282 566/626/282
-f 566/626/281 2/4/281 3/6/281 567/627/281
-f 567/627/280 3/6/280 4/8/280 568/628/280
-f 568/628/279 4/8/279 5/10/279 569/629/279
-f 569/629/278 5/10/278 6/12/278 570/630/278
-f 570/630/277 6/12/277 7/14/277 571/631/277
-f 571/632/288 7/15/288 8/18/288 572/633/288
-f 572/633/287 8/18/287 9/20/287 573/634/287
-f 573/634/286 9/20/286 10/22/286 574/635/286
-f 574/635/285 10/22/285 11/24/285 575/636/285
-f 575/636/284 11/24/284 12/26/284 576/637/284
-f 576/637/283 12/26/283 1/1/283 565/625/283
diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.json b/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.json
deleted file mode 100644
index 1387e00..0000000
--- a/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "translate": [0.0, 0.25, 0.0],
- "scale": [0.25, 0.25, 0.25]
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.obj b/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.obj
deleted file mode 100644
index ae6f75c..0000000
--- a/src/main/resources/assets/saturnclient/models/cosmetic/hat/horns/model.obj
+++ /dev/null
@@ -1,1109 +0,0 @@
-# Blender 4.4.0
-# www.blender.org
-mtllib horns.mtl
-o Cylinder.002
-v -1.242236 1.125547 0.100000
-v -0.992896 1.414159 0.021275
-v -1.261081 1.130596 0.098079
-v -0.996905 1.415234 0.020866
-v -1.279201 1.135451 0.092388
-v -1.000761 1.416267 0.019656
-v -1.295900 1.139926 0.083147
-v -1.004313 1.417219 0.017690
-v -1.310538 1.143848 0.070711
-v -1.007428 1.418053 0.015044
-v -1.322550 1.147067 0.055557
-v -1.009983 1.418738 0.011820
-v -1.331476 1.149459 0.038268
-v -1.011882 1.419247 0.008142
-v -1.336973 1.150931 0.019509
-v -1.013052 1.419560 0.004151
-v -1.338829 1.151429 0.000000
-v -1.013447 1.419666 -0.000000
-v -1.336973 1.150931 -0.019509
-v -1.013052 1.419560 -0.004151
-v -1.331476 1.149459 -0.038268
-v -1.011882 1.419247 -0.008142
-v -1.322550 1.147067 -0.055557
-v -1.009983 1.418738 -0.011820
-v -1.310538 1.143848 -0.070711
-v -1.007428 1.418053 -0.015044
-v -1.295900 1.139926 -0.083147
-v -1.004313 1.417219 -0.017690
-v -1.279201 1.135451 -0.092388
-v -1.000761 1.416267 -0.019656
-v -1.261081 1.130596 -0.098079
-v -0.996905 1.415234 -0.020866
-v -1.242236 1.125547 -0.100000
-v -0.992896 1.414159 -0.021275
-v -1.223392 1.120497 -0.098079
-v -0.988887 1.413085 -0.020866
-v -1.205272 1.115642 -0.092388
-v -0.985032 1.412052 -0.019656
-v -1.188572 1.111168 -0.083147
-v -0.981479 1.411100 -0.017690
-v -1.173935 1.107245 -0.070711
-v -0.978365 1.410266 -0.015044
-v -1.161923 1.104027 -0.055557
-v -0.975809 1.409581 -0.011820
-v -1.152996 1.101635 -0.038268
-v -0.973910 1.409072 -0.008142
-v -1.147500 1.100162 -0.019509
-v -0.972741 1.408759 -0.004151
-v -1.145644 1.099665 -0.000000
-v -0.972346 1.408653 -0.000000
-v -1.147500 1.100162 0.019509
-v -0.972741 1.408759 0.004151
-v -1.152996 1.101635 0.038268
-v -0.973910 1.409072 0.008142
-v -1.161923 1.104027 0.055557
-v -0.975809 1.409581 0.011820
-v -1.173935 1.107245 0.070711
-v -0.978365 1.410266 0.015044
-v -1.188572 1.111168 0.083147
-v -0.981479 1.411100 0.017690
-v -1.205272 1.115642 0.092388
-v -0.985032 1.412052 0.019656
-v -1.223392 1.120497 0.098079
-v -0.988887 1.413085 0.020866
-v -1.211112 0.788704 0.150000
-v -1.235372 0.772340 0.147118
-v -1.258701 0.756605 0.138582
-v -1.280200 0.742103 0.124720
-v -1.299044 0.729392 0.106066
-v -1.314510 0.718961 0.083336
-v -1.326001 0.711210 0.057403
-v -1.333078 0.706437 0.029264
-v -1.335467 0.704825 0.000000
-v -1.333078 0.706437 -0.029264
-v -1.326001 0.711210 -0.057403
-v -1.314510 0.718961 -0.083336
-v -1.299044 0.729392 -0.106066
-v -1.280200 0.742103 -0.124720
-v -1.258701 0.756605 -0.138582
-v -1.235372 0.772340 -0.147118
-v -1.211112 0.788704 -0.150000
-v -1.186851 0.805068 -0.147118
-v -1.163523 0.820803 -0.138582
-v -1.142023 0.835304 -0.124720
-v -1.123179 0.848015 -0.106066
-v -1.107714 0.858447 -0.083336
-v -1.096222 0.866198 -0.057403
-v -1.089146 0.870971 -0.029264
-v -1.086756 0.872583 -0.000000
-v -1.089146 0.870971 0.029264
-v -1.096222 0.866198 0.057403
-v -1.107714 0.858447 0.083336
-v -1.123179 0.848015 0.106066
-v -1.142023 0.835304 0.124720
-v -1.163523 0.820803 0.138582
-v -1.186851 0.805068 0.147118
-v -0.880525 0.487694 0.190000
-v -1.067972 0.630938 0.190000
-v -0.901786 0.457330 0.186349
-v -1.089233 0.600574 0.186349
-v -0.922230 0.428133 0.175537
-v -1.109677 0.571377 0.175537
-v -0.941071 0.401225 0.157979
-v -1.128518 0.544469 0.157979
-v -0.957585 0.377640 0.134350
-v -1.145033 0.520884 0.134350
-v -0.971138 0.358285 0.105558
-v -1.158586 0.501529 0.105558
-v -0.981209 0.343902 0.072710
-v -1.168656 0.487146 0.072710
-v -0.987411 0.335045 0.037067
-v -1.174858 0.478289 0.037067
-v -0.989505 0.332055 -0.000000
-v -1.176952 0.475299 -0.000000
-v -0.987411 0.335045 -0.037067
-v -1.174858 0.478289 -0.037067
-v -0.981209 0.343902 -0.072710
-v -1.168656 0.487146 -0.072710
-v -0.971138 0.358285 -0.105558
-v -1.158586 0.501529 -0.105558
-v -0.957585 0.377640 -0.134350
-v -1.145033 0.520884 -0.134350
-v -0.941071 0.401225 -0.157979
-v -1.128518 0.544469 -0.157979
-v -0.922230 0.428133 -0.175537
-v -1.109677 0.571377 -0.175537
-v -0.901786 0.457330 -0.186349
-v -1.089233 0.600574 -0.186349
-v -0.880525 0.487694 -0.190000
-v -1.067972 0.630938 -0.190000
-v -0.859264 0.518057 -0.186349
-v -1.046712 0.661301 -0.186349
-v -0.838820 0.547254 -0.175537
-v -1.026268 0.690498 -0.175537
-v -0.819979 0.574162 -0.157979
-v -1.007427 0.717406 -0.157979
-v -0.803465 0.597747 -0.134350
-v -0.990912 0.740991 -0.134350
-v -0.789912 0.617103 -0.105558
-v -0.977359 0.760347 -0.105558
-v -0.779841 0.631485 -0.072710
-v -0.967288 0.774729 -0.072710
-v -0.773640 0.640342 -0.037067
-v -0.961087 0.783586 -0.037067
-v -0.771546 0.643333 -0.000000
-v -0.958993 0.786576 -0.000000
-v -0.773640 0.640342 0.037067
-v -0.961087 0.783586 0.037067
-v -0.779841 0.631485 0.072710
-v -0.967288 0.774729 0.072710
-v -0.789912 0.617103 0.105558
-v -0.977359 0.760347 0.105558
-v -0.803465 0.597747 0.134350
-v -0.990912 0.740991 0.134350
-v -0.819979 0.574162 0.157979
-v -1.007427 0.717406 0.157979
-v -0.838820 0.547254 0.175537
-v -1.026268 0.690498 0.175537
-v -0.859264 0.518057 0.186349
-v -1.046712 0.661301 0.186349
-vn -0.0225 0.2811 0.9594
-vn -0.1736 0.4046 0.8979
-vn -0.3068 0.5120 0.8023
-vn -0.4181 0.6006 0.6815
-vn -0.5061 0.6697 0.5434
-vn -0.5708 0.7202 0.3943
-vn -0.6132 0.7530 0.2388
-vn -0.6341 0.7691 0.0799
-vn -0.6341 0.7691 -0.0799
-vn -0.6132 0.7530 -0.2388
-vn -0.5708 0.7202 -0.3943
-vn -0.5061 0.6697 -0.5434
-vn -0.4181 0.6006 -0.6815
-vn -0.3068 0.5120 -0.8023
-vn -0.1736 0.4046 -0.8979
-vn -0.0225 0.2811 -0.9594
-vn 0.1392 0.1469 -0.9793
-vn 0.3019 0.0096 -0.9533
-vn 0.4554 -0.1219 -0.8819
-vn 0.5905 -0.2396 -0.7706
-vn 0.7015 -0.3374 -0.6277
-vn 0.7851 -0.4120 -0.4624
-vn 0.8407 -0.4620 -0.2826
-vn 0.8682 -0.4870 -0.0950
-vn 0.8682 -0.4870 0.0950
-vn 0.8407 -0.4620 0.2826
-vn 0.7851 -0.4120 0.4624
-vn 0.7015 -0.3374 0.6277
-vn 0.5905 -0.2396 0.7706
-vn 0.4554 -0.1219 0.8819
-vn 0.2588 0.9659 -0.0000
-vn 0.3019 0.0096 0.9533
-vn 0.1392 0.1469 0.9793
-vn 0.0687 0.1567 0.9853
-vn 0.0722 0.3343 0.9397
-vn -0.0596 -0.0779 0.9952
-vn -0.1764 -0.2308 0.9569
-vn -0.2864 -0.3748 0.8818
-vn -0.3854 -0.5043 0.7727
-vn -0.4695 -0.6144 0.6341
-vn -0.5356 -0.7009 0.4711
-vn -0.5811 -0.7604 0.2901
-vn -0.6043 -0.7907 0.0979
-vn -0.6043 -0.7907 -0.0979
-vn -0.5811 -0.7604 -0.2901
-vn -0.5356 -0.7009 -0.4711
-vn -0.4695 -0.6144 -0.6341
-vn -0.3854 -0.5043 -0.7727
-vn -0.2864 -0.3748 -0.8818
-vn -0.1764 -0.2308 -0.9569
-vn -0.0596 -0.0779 -0.9952
-vn 0.0596 0.0779 -0.9952
-vn 0.1764 0.2308 -0.9569
-vn 0.2864 0.3748 -0.8818
-vn 0.3854 0.5043 -0.7727
-vn 0.4695 0.6144 -0.6341
-vn 0.5356 0.7009 -0.4711
-vn 0.5811 0.7604 -0.2901
-vn 0.6043 0.7907 -0.0979
-vn 0.6043 0.7907 0.0979
-vn 0.5811 0.7604 0.2901
-vn 0.5356 0.7009 0.4711
-vn 0.4695 0.6144 0.6341
-vn 0.3854 0.5043 0.7727
-vn 0.2864 0.3748 0.8818
-vn -0.0628 0.1980 0.9782
-vn 0.1764 0.2308 0.9569
-vn 0.0596 0.0779 0.9952
-vn 0.8192 -0.5736 -0.0000
-vn 0.1987 0.4621 0.8642
-vn 0.3116 0.5764 0.7554
-vn 0.4067 0.6728 0.6180
-vn 0.4805 0.7479 0.4579
-vn 0.5310 0.7993 0.2814
-vn 0.5565 0.8254 0.0949
-vn 0.5565 0.8254 -0.0949
-vn 0.5310 0.7993 -0.2814
-vn 0.4805 0.7479 -0.4579
-vn 0.4067 0.6728 -0.6180
-vn 0.3116 0.5764 -0.7554
-vn 0.1987 0.4621 -0.8642
-vn 0.0722 0.3343 -0.9397
-vn -0.0628 0.1980 -0.9782
-vn -0.2008 0.0589 -0.9779
-vn -0.3357 -0.0772 -0.9388
-vn -0.4620 -0.2046 -0.8629
-vn -0.5747 -0.3184 -0.7539
-vn -0.6696 -0.4141 -0.6166
-vn -0.7434 -0.4887 -0.4567
-vn -0.7938 -0.5396 -0.2806
-vn -0.8194 -0.5654 -0.0946
-vn -0.8194 -0.5654 0.0946
-vn -0.7938 -0.5396 0.2806
-vn -0.7434 -0.4887 0.4567
-vn -0.6696 -0.4141 0.6166
-vn -0.5747 -0.3184 0.7539
-vn -0.4620 -0.2046 0.8629
-vn -0.3357 -0.0772 0.9388
-vn -0.2008 0.0589 0.9779
-vn 0.2759 0.1827 0.9437
-vn 0.4667 0.2045 0.8604
-vn 0.6317 0.2217 0.7429
-vn 0.7653 0.2341 0.5996
-vn 0.8653 0.2424 0.4388
-vn 0.9314 0.2474 0.2671
-vn 0.9642 0.2497 0.0896
-vn 0.9642 0.2497 -0.0896
-vn 0.9314 0.2474 -0.2671
-vn 0.8653 0.2424 -0.4388
-vn 0.7653 0.2341 -0.5996
-vn 0.6317 0.2217 -0.7429
-vn 0.4667 0.2045 -0.8604
-vn 0.2759 0.1827 -0.9437
-vn 0.0687 0.1567 -0.9853
-vn -0.1430 0.1281 -0.9814
-vn -0.3462 0.0988 -0.9330
-vn -0.5298 0.0708 -0.8452
-vn -0.6862 0.0458 -0.7260
-vn -0.8115 0.0249 -0.5838
-vn -0.9046 0.0090 -0.4262
-vn -0.9659 -0.0018 -0.2591
-vn -0.9962 -0.0072 -0.0869
-vn -0.9962 -0.0072 0.0869
-vn -0.9659 -0.0018 0.2591
-vn -0.9046 0.0090 0.4262
-vn -0.8115 0.0249 0.5838
-vn -0.6862 0.0458 0.7260
-vn -0.5298 0.0708 0.8452
-vn -0.3462 0.0988 0.9330
-vn -0.1430 0.1281 0.9814
-vt 1.000000 0.500000
-vt 1.000000 1.000000
-vt 0.968750 1.000000
-vt 0.968750 0.500000
-vt 0.937500 1.000000
-vt 0.937500 0.500000
-vt 0.906250 1.000000
-vt 0.906250 0.500000
-vt 0.875000 1.000000
-vt 0.875000 0.500000
-vt 0.843750 1.000000
-vt 0.843750 0.500000
-vt 0.812500 1.000000
-vt 0.812500 0.500000
-vt 0.781250 1.000000
-vt 0.781250 0.500000
-vt 0.750000 1.000000
-vt 0.750000 0.500000
-vt 0.718750 1.000000
-vt 0.718750 0.500000
-vt 0.687500 1.000000
-vt 0.687500 0.500000
-vt 0.656250 1.000000
-vt 0.656250 0.500000
-vt 0.625000 1.000000
-vt 0.625000 0.500000
-vt 0.593750 1.000000
-vt 0.593750 0.500000
-vt 0.562500 1.000000
-vt 0.562500 0.500000
-vt 0.531250 1.000000
-vt 0.531250 0.500000
-vt 0.500000 1.000000
-vt 0.500000 0.500000
-vt 0.468750 1.000000
-vt 0.468750 0.500000
-vt 0.437500 1.000000
-vt 0.437500 0.500000
-vt 0.406250 1.000000
-vt 0.406250 0.500000
-vt 0.375000 1.000000
-vt 0.375000 0.500000
-vt 0.343750 1.000000
-vt 0.343750 0.500000
-vt 0.312500 1.000000
-vt 0.312500 0.500000
-vt 0.281250 1.000000
-vt 0.281250 0.500000
-vt 0.250000 1.000000
-vt 0.250000 0.500000
-vt 0.218750 1.000000
-vt 0.218750 0.500000
-vt 0.187500 1.000000
-vt 0.187500 0.500000
-vt 0.156250 1.000000
-vt 0.156250 0.500000
-vt 0.125000 1.000000
-vt 0.125000 0.500000
-vt 0.093750 1.000000
-vt 0.093750 0.500000
-vt 0.062500 1.000000
-vt 0.062500 0.500000
-vt 0.296822 0.485388
-vt 0.250000 0.490000
-vt 0.203178 0.485388
-vt 0.158156 0.471731
-vt 0.116663 0.449553
-vt 0.080294 0.419706
-vt 0.050447 0.383337
-vt 0.028269 0.341844
-vt 0.014612 0.296822
-vt 0.010000 0.250000
-vt 0.014612 0.203178
-vt 0.028269 0.158156
-vt 0.050447 0.116663
-vt 0.080294 0.080294
-vt 0.116663 0.050447
-vt 0.158156 0.028269
-vt 0.203178 0.014612
-vt 0.250000 0.010000
-vt 0.296822 0.014612
-vt 0.341844 0.028269
-vt 0.383337 0.050447
-vt 0.419706 0.080294
-vt 0.449553 0.116663
-vt 0.471731 0.158156
-vt 0.485388 0.203178
-vt 0.490000 0.250000
-vt 0.485388 0.296822
-vt 0.471731 0.341844
-vt 0.449553 0.383337
-vt 0.419706 0.419706
-vt 0.383337 0.449553
-vt 0.341844 0.471731
-vt 0.031250 1.000000
-vt 0.031250 0.500000
-vt 0.000000 1.000000
-vt 0.000000 0.500000
-vt 0.750000 0.490000
-vt 0.796822 0.485388
-vt 0.841844 0.471731
-vt 0.883337 0.449553
-vt 0.919706 0.419706
-vt 0.949553 0.383337
-vt 0.971731 0.341844
-vt 0.985388 0.296822
-vt 0.990000 0.250000
-vt 0.985388 0.203178
-vt 0.971731 0.158156
-vt 0.949553 0.116663
-vt 0.919706 0.080294
-vt 0.883337 0.050447
-vt 0.841844 0.028269
-vt 0.796822 0.014612
-vt 0.750000 0.010000
-vt 0.703178 0.014612
-vt 0.658156 0.028269
-vt 0.616663 0.050447
-vt 0.580294 0.080294
-vt 0.550447 0.116663
-vt 0.528269 0.158156
-vt 0.514612 0.203178
-vt 0.510000 0.250000
-vt 0.514612 0.296822
-vt 0.528269 0.341844
-vt 0.550447 0.383337
-vt 0.580294 0.419706
-vt 0.616663 0.449553
-vt 0.658156 0.471731
-vt 0.703178 0.485388
-usemtl tex
-s off
-f 1/1/1 2/2/1 4/3/1 3/4/1
-f 3/4/2 4/3/2 6/5/2 5/6/2
-f 5/6/3 6/5/3 8/7/3 7/8/3
-f 7/8/4 8/7/4 10/9/4 9/10/4
-f 9/10/5 10/9/5 12/11/5 11/12/5
-f 11/12/6 12/11/6 14/13/6 13/14/6
-f 13/14/7 14/13/7 16/15/7 15/16/7
-f 15/16/8 16/15/8 18/17/8 17/18/8
-f 17/18/9 18/17/9 20/19/9 19/20/9
-f 19/20/10 20/19/10 22/21/10 21/22/10
-f 21/22/11 22/21/11 24/23/11 23/24/11
-f 23/24/12 24/23/12 26/25/12 25/26/12
-f 25/26/13 26/25/13 28/27/13 27/28/13
-f 27/28/14 28/27/14 30/29/14 29/30/14
-f 29/30/15 30/29/15 32/31/15 31/32/15
-f 31/32/16 32/31/16 34/33/16 33/34/16
-f 33/34/17 34/33/17 36/35/17 35/36/17
-f 35/36/18 36/35/18 38/37/18 37/38/18
-f 37/38/19 38/37/19 40/39/19 39/40/19
-f 39/40/20 40/39/20 42/41/20 41/42/20
-f 41/42/21 42/41/21 44/43/21 43/44/21
-f 43/44/22 44/43/22 46/45/22 45/46/22
-f 45/46/23 46/45/23 48/47/23 47/48/23
-f 47/48/24 48/47/24 50/49/24 49/50/24
-f 49/50/25 50/49/25 52/51/25 51/52/25
-f 51/52/26 52/51/26 54/53/26 53/54/26
-f 53/54/27 54/53/27 56/55/27 55/56/27
-f 55/56/28 56/55/28 58/57/28 57/58/28
-f 57/58/29 58/57/29 60/59/29 59/60/29
-f 59/60/30 60/59/30 62/61/30 61/62/30
-f 4/63/31 2/64/31 64/65/31 62/66/31 60/67/31 58/68/31 56/69/31 54/70/31 52/71/31 50/72/31 48/73/31 46/74/31 44/75/31 42/76/31 40/77/31 38/78/31 36/79/31 34/80/31 32/81/31 30/82/31 28/83/31 26/84/31 24/85/31 22/86/31 20/87/31 18/88/31 16/89/31 14/90/31 12/91/31 10/92/31 8/93/31 6/94/31
-f 61/62/32 62/61/32 64/95/32 63/96/32
-f 63/96/33 64/95/33 2/97/33 1/98/33
-f 65/98/34 96/96/34 63/96/34 1/98/34
-f 160/95/35 158/61/35 95/62/35 96/96/35
-f 97/1/36 98/2/36 100/3/36 99/4/36
-f 99/4/37 100/3/37 102/5/37 101/6/37
-f 101/6/38 102/5/38 104/7/38 103/8/38
-f 103/8/39 104/7/39 106/9/39 105/10/39
-f 105/10/40 106/9/40 108/11/40 107/12/40
-f 107/12/41 108/11/41 110/13/41 109/14/41
-f 109/14/42 110/13/42 112/15/42 111/16/42
-f 111/16/43 112/15/43 114/17/43 113/18/43
-f 113/18/44 114/17/44 116/19/44 115/20/44
-f 115/20/45 116/19/45 118/21/45 117/22/45
-f 117/22/46 118/21/46 120/23/46 119/24/46
-f 119/24/47 120/23/47 122/25/47 121/26/47
-f 121/26/48 122/25/48 124/27/48 123/28/48
-f 123/28/49 124/27/49 126/29/49 125/30/49
-f 125/30/50 126/29/50 128/31/50 127/32/50
-f 127/32/51 128/31/51 130/33/51 129/34/51
-f 129/34/52 130/33/52 132/35/52 131/36/52
-f 131/36/53 132/35/53 134/37/53 133/38/53
-f 133/38/54 134/37/54 136/39/54 135/40/54
-f 135/40/55 136/39/55 138/41/55 137/42/55
-f 137/42/56 138/41/56 140/43/56 139/44/56
-f 139/44/57 140/43/57 142/45/57 141/46/57
-f 141/46/58 142/45/58 144/47/58 143/48/58
-f 143/48/59 144/47/59 146/49/59 145/50/59
-f 145/50/60 146/49/60 148/51/60 147/52/60
-f 147/52/61 148/51/61 150/53/61 149/54/61
-f 149/54/62 150/53/62 152/55/62 151/56/62
-f 151/56/63 152/55/63 154/57/63 153/58/63
-f 153/58/64 154/57/64 156/59/64 155/60/64
-f 155/60/65 156/59/65 158/61/65 157/62/65
-f 98/97/66 160/95/66 96/96/66 65/98/66
-f 157/62/67 158/61/67 160/95/67 159/96/67
-f 159/96/68 160/95/68 98/97/68 97/98/68
-f 97/99/69 99/100/69 101/101/69 103/102/69 105/103/69 107/104/69 109/105/69 111/106/69 113/107/69 115/108/69 117/109/69 119/110/69 121/111/69 123/112/69 125/113/69 127/114/69 129/115/69 131/116/69 133/117/69 135/118/69 137/119/69 139/120/69 141/121/69 143/122/69 145/123/69 147/124/69 149/125/69 151/126/69 153/127/69 155/128/69 157/129/69 159/130/69
-f 158/61/70 156/59/70 94/60/70 95/62/70
-f 156/59/71 154/57/71 93/58/71 94/60/71
-f 154/57/72 152/55/72 92/56/72 93/58/72
-f 152/55/73 150/53/73 91/54/73 92/56/73
-f 150/53/74 148/51/74 90/52/74 91/54/74
-f 148/51/75 146/49/75 89/50/75 90/52/75
-f 146/49/76 144/47/76 88/48/76 89/50/76
-f 144/47/77 142/45/77 87/46/77 88/48/77
-f 142/45/78 140/43/78 86/44/78 87/46/78
-f 140/43/79 138/41/79 85/42/79 86/44/79
-f 138/41/80 136/39/80 84/40/80 85/42/80
-f 136/39/81 134/37/81 83/38/81 84/40/81
-f 134/37/82 132/35/82 82/36/82 83/38/82
-f 132/35/83 130/33/83 81/34/83 82/36/83
-f 130/33/84 128/31/84 80/32/84 81/34/84
-f 128/31/85 126/29/85 79/30/85 80/32/85
-f 126/29/86 124/27/86 78/28/86 79/30/86
-f 124/27/87 122/25/87 77/26/87 78/28/87
-f 122/25/88 120/23/88 76/24/88 77/26/88
-f 120/23/89 118/21/89 75/22/89 76/24/89
-f 118/21/90 116/19/90 74/20/90 75/22/90
-f 116/19/91 114/17/91 73/18/91 74/20/91
-f 114/17/92 112/15/92 72/16/92 73/18/92
-f 112/15/93 110/13/93 71/14/93 72/16/93
-f 110/13/94 108/11/94 70/12/94 71/14/94
-f 108/11/95 106/9/95 69/10/95 70/12/95
-f 106/9/96 104/7/96 68/8/96 69/10/96
-f 104/7/97 102/5/97 67/6/97 68/8/97
-f 102/5/98 100/3/98 66/4/98 67/6/98
-f 100/3/99 98/2/99 65/1/99 66/4/99
-f 96/96/100 95/62/100 61/62/100 63/96/100
-f 95/62/101 94/60/101 59/60/101 61/62/101
-f 94/60/102 93/58/102 57/58/102 59/60/102
-f 93/58/103 92/56/103 55/56/103 57/58/103
-f 92/56/104 91/54/104 53/54/104 55/56/104
-f 91/54/105 90/52/105 51/52/105 53/54/105
-f 90/52/106 89/50/106 49/50/106 51/52/106
-f 89/50/107 88/48/107 47/48/107 49/50/107
-f 88/48/108 87/46/108 45/46/108 47/48/108
-f 87/46/109 86/44/109 43/44/109 45/46/109
-f 86/44/110 85/42/110 41/42/110 43/44/110
-f 85/42/111 84/40/111 39/40/111 41/42/111
-f 84/40/112 83/38/112 37/38/112 39/40/112
-f 83/38/113 82/36/113 35/36/113 37/38/113
-f 82/36/114 81/34/114 33/34/114 35/36/114
-f 81/34/115 80/32/115 31/32/115 33/34/115
-f 80/32/116 79/30/116 29/30/116 31/32/116
-f 79/30/117 78/28/117 27/28/117 29/30/117
-f 78/28/118 77/26/118 25/26/118 27/28/118
-f 77/26/119 76/24/119 23/24/119 25/26/119
-f 76/24/120 75/22/120 21/22/120 23/24/120
-f 75/22/121 74/20/121 19/20/121 21/22/121
-f 74/20/122 73/18/122 17/18/122 19/20/122
-f 73/18/123 72/16/123 15/16/123 17/18/123
-f 72/16/124 71/14/124 13/14/124 15/16/124
-f 71/14/125 70/12/125 11/12/125 13/14/125
-f 70/12/126 69/10/126 9/10/126 11/12/126
-f 69/10/127 68/8/127 7/8/127 9/10/127
-f 68/8/128 67/6/128 5/6/128 7/8/128
-f 67/6/129 66/4/129 3/4/129 5/6/129
-f 66/4/130 65/1/130 1/1/130 3/4/130
-o Cylinder.003
-v 1.242236 1.125547 -0.100000
-v 0.992896 1.414159 -0.021275
-v 1.261081 1.130596 -0.098079
-v 0.996905 1.415234 -0.020866
-v 1.279201 1.135451 -0.092388
-v 1.000761 1.416267 -0.019656
-v 1.295900 1.139926 -0.083147
-v 1.004313 1.417219 -0.017690
-v 1.310538 1.143848 -0.070711
-v 1.007428 1.418053 -0.015044
-v 1.322550 1.147067 -0.055557
-v 1.009983 1.418738 -0.011820
-v 1.331476 1.149459 -0.038268
-v 1.011882 1.419247 -0.008142
-v 1.336973 1.150931 -0.019509
-v 1.013052 1.419560 -0.004151
-v 1.338829 1.151429 0.000000
-v 1.013447 1.419666 0.000000
-v 1.336973 1.150931 0.019509
-v 1.013052 1.419560 0.004151
-v 1.331476 1.149459 0.038268
-v 1.011882 1.419247 0.008142
-v 1.322550 1.147067 0.055557
-v 1.009983 1.418738 0.011820
-v 1.310538 1.143848 0.070711
-v 1.007428 1.418053 0.015044
-v 1.295900 1.139926 0.083147
-v 1.004313 1.417219 0.017690
-v 1.279201 1.135451 0.092388
-v 1.000761 1.416267 0.019656
-v 1.261081 1.130596 0.098079
-v 0.996905 1.415234 0.020866
-v 1.242236 1.125547 0.100000
-v 0.992896 1.414159 0.021275
-v 1.223392 1.120497 0.098079
-v 0.988887 1.413085 0.020866
-v 1.205272 1.115642 0.092388
-v 0.985032 1.412052 0.019656
-v 1.188572 1.111168 0.083147
-v 0.981479 1.411100 0.017690
-v 1.173935 1.107245 0.070711
-v 0.978365 1.410266 0.015044
-v 1.161923 1.104027 0.055557
-v 0.975809 1.409581 0.011820
-v 1.152996 1.101635 0.038268
-v 0.973910 1.409072 0.008142
-v 1.147500 1.100162 0.019509
-v 0.972741 1.408759 0.004151
-v 1.145644 1.099665 0.000000
-v 0.972346 1.408653 0.000000
-v 1.147500 1.100162 -0.019509
-v 0.972741 1.408759 -0.004151
-v 1.152996 1.101635 -0.038268
-v 0.973910 1.409072 -0.008142
-v 1.161923 1.104027 -0.055557
-v 0.975809 1.409581 -0.011820
-v 1.173935 1.107245 -0.070711
-v 0.978365 1.410266 -0.015044
-v 1.188572 1.111168 -0.083147
-v 0.981479 1.411100 -0.017690
-v 1.205272 1.115642 -0.092388
-v 0.985032 1.412052 -0.019656
-v 1.223392 1.120497 -0.098079
-v 0.988887 1.413085 -0.020866
-v 1.211112 0.788704 -0.150000
-v 1.235372 0.772340 -0.147118
-v 1.258701 0.756605 -0.138582
-v 1.280200 0.742103 -0.124720
-v 1.299044 0.729392 -0.106066
-v 1.314510 0.718961 -0.083336
-v 1.326001 0.711210 -0.057403
-v 1.333078 0.706437 -0.029264
-v 1.335467 0.704825 0.000000
-v 1.333078 0.706437 0.029264
-v 1.326001 0.711210 0.057403
-v 1.314510 0.718961 0.083336
-v 1.299044 0.729392 0.106066
-v 1.280200 0.742103 0.124720
-v 1.258701 0.756605 0.138582
-v 1.235372 0.772340 0.147118
-v 1.211112 0.788704 0.150000
-v 1.186851 0.805068 0.147118
-v 1.163523 0.820803 0.138582
-v 1.142023 0.835304 0.124720
-v 1.123179 0.848015 0.106066
-v 1.107714 0.858447 0.083336
-v 1.096222 0.866198 0.057403
-v 1.089146 0.870971 0.029264
-v 1.086756 0.872583 0.000000
-v 1.089146 0.870971 -0.029264
-v 1.096222 0.866198 -0.057403
-v 1.107714 0.858447 -0.083336
-v 1.123179 0.848015 -0.106066
-v 1.142023 0.835304 -0.124720
-v 1.163523 0.820803 -0.138582
-v 1.186851 0.805068 -0.147118
-v 0.880525 0.487694 -0.190000
-v 1.067972 0.630938 -0.190000
-v 0.901786 0.457330 -0.186349
-v 1.089233 0.600574 -0.186349
-v 0.922230 0.428133 -0.175537
-v 1.109677 0.571377 -0.175537
-v 0.941071 0.401225 -0.157979
-v 1.128518 0.544469 -0.157979
-v 0.957585 0.377640 -0.134350
-v 1.145033 0.520884 -0.134350
-v 0.971138 0.358285 -0.105558
-v 1.158586 0.501529 -0.105558
-v 0.981209 0.343902 -0.072710
-v 1.168656 0.487146 -0.072710
-v 0.987411 0.335045 -0.037067
-v 1.174858 0.478289 -0.037067
-v 0.989505 0.332055 -0.000000
-v 1.176952 0.475299 0.000000
-v 0.987411 0.335045 0.037067
-v 1.174858 0.478289 0.037067
-v 0.981209 0.343902 0.072710
-v 1.168656 0.487146 0.072710
-v 0.971138 0.358285 0.105558
-v 1.158586 0.501529 0.105558
-v 0.957585 0.377640 0.134350
-v 1.145033 0.520884 0.134350
-v 0.941071 0.401225 0.157979
-v 1.128518 0.544469 0.157979
-v 0.922230 0.428133 0.175537
-v 1.109677 0.571377 0.175537
-v 0.901786 0.457330 0.186349
-v 1.089233 0.600574 0.186349
-v 0.880525 0.487694 0.190000
-v 1.067972 0.630938 0.190000
-v 0.859264 0.518057 0.186349
-v 1.046712 0.661301 0.186349
-v 0.838820 0.547254 0.175537
-v 1.026268 0.690498 0.175537
-v 0.819979 0.574162 0.157979
-v 1.007427 0.717406 0.157979
-v 0.803465 0.597747 0.134350
-v 0.990912 0.740991 0.134350
-v 0.789912 0.617103 0.105558
-v 0.977359 0.760347 0.105558
-v 0.779841 0.631485 0.072710
-v 0.967288 0.774729 0.072710
-v 0.773640 0.640342 0.037067
-v 0.961087 0.783586 0.037067
-v 0.771546 0.643333 -0.000000
-v 0.958993 0.786576 0.000000
-v 0.773640 0.640342 -0.037067
-v 0.961087 0.783586 -0.037067
-v 0.779841 0.631485 -0.072710
-v 0.967288 0.774729 -0.072710
-v 0.789912 0.617103 -0.105558
-v 0.977359 0.760347 -0.105558
-v 0.803465 0.597747 -0.134350
-v 0.990912 0.740991 -0.134350
-v 0.819979 0.574162 -0.157979
-v 1.007427 0.717406 -0.157979
-v 0.838820 0.547254 -0.175537
-v 1.026268 0.690498 -0.175537
-v 0.859264 0.518057 -0.186349
-v 1.046712 0.661301 -0.186349
-vn 0.0225 0.2811 -0.9594
-vn 0.1736 0.4046 -0.8979
-vn 0.3068 0.5120 -0.8023
-vn 0.4181 0.6006 -0.6815
-vn 0.5061 0.6697 -0.5434
-vn 0.5708 0.7202 -0.3943
-vn 0.6132 0.7530 -0.2388
-vn 0.6341 0.7691 -0.0799
-vn 0.6341 0.7691 0.0799
-vn 0.6132 0.7530 0.2388
-vn 0.5708 0.7202 0.3943
-vn 0.5061 0.6697 0.5434
-vn 0.4181 0.6006 0.6815
-vn 0.3068 0.5120 0.8023
-vn 0.1736 0.4046 0.8979
-vn 0.0225 0.2811 0.9594
-vn -0.1392 0.1469 0.9793
-vn -0.3019 0.0096 0.9533
-vn -0.4554 -0.1219 0.8819
-vn -0.5905 -0.2396 0.7706
-vn -0.7015 -0.3374 0.6277
-vn -0.7851 -0.4120 0.4624
-vn -0.8407 -0.4620 0.2826
-vn -0.8682 -0.4870 0.0950
-vn -0.8682 -0.4870 -0.0950
-vn -0.8407 -0.4620 -0.2826
-vn -0.7851 -0.4120 -0.4624
-vn -0.7015 -0.3374 -0.6277
-vn -0.5905 -0.2396 -0.7706
-vn -0.4554 -0.1219 -0.8819
-vn -0.2588 0.9659 -0.0000
-vn -0.3019 0.0096 -0.9533
-vn -0.1392 0.1469 -0.9793
-vn -0.0687 0.1567 -0.9853
-vn -0.0722 0.3343 -0.9397
-vn 0.0596 -0.0779 -0.9952
-vn 0.1764 -0.2308 -0.9569
-vn 0.2864 -0.3748 -0.8818
-vn 0.3854 -0.5043 -0.7727
-vn 0.4695 -0.6144 -0.6341
-vn 0.5356 -0.7009 -0.4711
-vn 0.5811 -0.7604 -0.2901
-vn 0.6043 -0.7907 -0.0979
-vn 0.6043 -0.7907 0.0979
-vn 0.5811 -0.7604 0.2901
-vn 0.5356 -0.7009 0.4711
-vn 0.4695 -0.6144 0.6341
-vn 0.3854 -0.5043 0.7727
-vn 0.2864 -0.3748 0.8818
-vn 0.1764 -0.2308 0.9569
-vn 0.0596 -0.0779 0.9952
-vn -0.0596 0.0779 0.9952
-vn -0.1764 0.2308 0.9569
-vn -0.2864 0.3748 0.8818
-vn -0.3854 0.5043 0.7727
-vn -0.4695 0.6144 0.6341
-vn -0.5356 0.7009 0.4711
-vn -0.5811 0.7604 0.2901
-vn -0.6043 0.7907 0.0979
-vn -0.6043 0.7907 -0.0979
-vn -0.5811 0.7604 -0.2901
-vn -0.5356 0.7009 -0.4711
-vn -0.4695 0.6144 -0.6341
-vn -0.3854 0.5043 -0.7727
-vn -0.2864 0.3748 -0.8818
-vn 0.0628 0.1980 -0.9782
-vn -0.1764 0.2308 -0.9569
-vn -0.0596 0.0779 -0.9952
-vn -0.8192 -0.5736 -0.0000
-vn -0.1987 0.4621 -0.8642
-vn -0.3116 0.5764 -0.7554
-vn -0.4067 0.6728 -0.6180
-vn -0.4805 0.7479 -0.4579
-vn -0.5310 0.7993 -0.2814
-vn -0.5565 0.8254 -0.0949
-vn -0.5565 0.8254 0.0949
-vn -0.5310 0.7993 0.2814
-vn -0.4805 0.7479 0.4579
-vn -0.4067 0.6728 0.6180
-vn -0.3116 0.5764 0.7554
-vn -0.1987 0.4621 0.8642
-vn -0.0722 0.3343 0.9397
-vn 0.0628 0.1980 0.9782
-vn 0.2008 0.0589 0.9779
-vn 0.3357 -0.0772 0.9388
-vn 0.4620 -0.2046 0.8629
-vn 0.5747 -0.3184 0.7539
-vn 0.6696 -0.4141 0.6166
-vn 0.7434 -0.4887 0.4567
-vn 0.7938 -0.5396 0.2806
-vn 0.8194 -0.5654 0.0946
-vn 0.8194 -0.5654 -0.0946
-vn 0.7938 -0.5396 -0.2806
-vn 0.7434 -0.4887 -0.4567
-vn 0.6696 -0.4141 -0.6166
-vn 0.5747 -0.3184 -0.7539
-vn 0.4620 -0.2046 -0.8629
-vn 0.3357 -0.0772 -0.9388
-vn 0.2008 0.0589 -0.9779
-vn -0.2759 0.1827 -0.9437
-vn -0.4667 0.2045 -0.8604
-vn -0.6317 0.2217 -0.7429
-vn -0.7653 0.2341 -0.5996
-vn -0.8653 0.2424 -0.4388
-vn -0.9314 0.2474 -0.2671
-vn -0.9642 0.2497 -0.0896
-vn -0.9642 0.2497 0.0896
-vn -0.9314 0.2474 0.2671
-vn -0.8653 0.2424 0.4388
-vn -0.7653 0.2341 0.5996
-vn -0.6317 0.2217 0.7429
-vn -0.4667 0.2045 0.8604
-vn -0.2759 0.1827 0.9437
-vn -0.0687 0.1567 0.9853
-vn 0.1430 0.1281 0.9814
-vn 0.3462 0.0988 0.9330
-vn 0.5298 0.0708 0.8452
-vn 0.6862 0.0458 0.7260
-vn 0.8115 0.0249 0.5838
-vn 0.9046 0.0090 0.4262
-vn 0.9659 -0.0018 0.2591
-vn 0.9962 -0.0072 0.0869
-vn 0.9962 -0.0072 -0.0869
-vn 0.9659 -0.0018 -0.2591
-vn 0.9046 0.0090 -0.4262
-vn 0.8115 0.0249 -0.5838
-vn 0.6862 0.0458 -0.7260
-vn 0.5298 0.0708 -0.8452
-vn 0.3462 0.0988 -0.9330
-vn 0.1430 0.1281 -0.9814
-vt 1.000000 0.500000
-vt 1.000000 1.000000
-vt 0.968750 1.000000
-vt 0.968750 0.500000
-vt 0.937500 1.000000
-vt 0.937500 0.500000
-vt 0.906250 1.000000
-vt 0.906250 0.500000
-vt 0.875000 1.000000
-vt 0.875000 0.500000
-vt 0.843750 1.000000
-vt 0.843750 0.500000
-vt 0.812500 1.000000
-vt 0.812500 0.500000
-vt 0.781250 1.000000
-vt 0.781250 0.500000
-vt 0.750000 1.000000
-vt 0.750000 0.500000
-vt 0.718750 1.000000
-vt 0.718750 0.500000
-vt 0.687500 1.000000
-vt 0.687500 0.500000
-vt 0.656250 1.000000
-vt 0.656250 0.500000
-vt 0.625000 1.000000
-vt 0.625000 0.500000
-vt 0.593750 1.000000
-vt 0.593750 0.500000
-vt 0.562500 1.000000
-vt 0.562500 0.500000
-vt 0.531250 1.000000
-vt 0.531250 0.500000
-vt 0.500000 1.000000
-vt 0.500000 0.500000
-vt 0.468750 1.000000
-vt 0.468750 0.500000
-vt 0.437500 1.000000
-vt 0.437500 0.500000
-vt 0.406250 1.000000
-vt 0.406250 0.500000
-vt 0.375000 1.000000
-vt 0.375000 0.500000
-vt 0.343750 1.000000
-vt 0.343750 0.500000
-vt 0.312500 1.000000
-vt 0.312500 0.500000
-vt 0.281250 1.000000
-vt 0.281250 0.500000
-vt 0.250000 1.000000
-vt 0.250000 0.500000
-vt 0.218750 1.000000
-vt 0.218750 0.500000
-vt 0.187500 1.000000
-vt 0.187500 0.500000
-vt 0.156250 1.000000
-vt 0.156250 0.500000
-vt 0.125000 1.000000
-vt 0.125000 0.500000
-vt 0.093750 1.000000
-vt 0.093750 0.500000
-vt 0.062500 1.000000
-vt 0.062500 0.500000
-vt 0.296822 0.485388
-vt 0.250000 0.490000
-vt 0.203178 0.485388
-vt 0.158156 0.471731
-vt 0.116663 0.449553
-vt 0.080294 0.419706
-vt 0.050447 0.383337
-vt 0.028269 0.341844
-vt 0.014612 0.296822
-vt 0.010000 0.250000
-vt 0.014612 0.203178
-vt 0.028269 0.158156
-vt 0.050447 0.116663
-vt 0.080294 0.080294
-vt 0.116663 0.050447
-vt 0.158156 0.028269
-vt 0.203178 0.014612
-vt 0.250000 0.010000
-vt 0.296822 0.014612
-vt 0.341844 0.028269
-vt 0.383337 0.050447
-vt 0.419706 0.080294
-vt 0.449553 0.116663
-vt 0.471731 0.158156
-vt 0.485388 0.203178
-vt 0.490000 0.250000
-vt 0.485388 0.296822
-vt 0.471731 0.341844
-vt 0.449553 0.383337
-vt 0.419706 0.419706
-vt 0.383337 0.449553
-vt 0.341844 0.471731
-vt 0.031250 1.000000
-vt 0.031250 0.500000
-vt 0.000000 1.000000
-vt 0.000000 0.500000
-vt 0.750000 0.490000
-vt 0.796822 0.485388
-vt 0.841844 0.471731
-vt 0.883337 0.449553
-vt 0.919706 0.419706
-vt 0.949553 0.383337
-vt 0.971731 0.341844
-vt 0.985388 0.296822
-vt 0.990000 0.250000
-vt 0.985388 0.203178
-vt 0.971731 0.158156
-vt 0.949553 0.116663
-vt 0.919706 0.080294
-vt 0.883337 0.050447
-vt 0.841844 0.028269
-vt 0.796822 0.014612
-vt 0.750000 0.010000
-vt 0.703178 0.014612
-vt 0.658156 0.028269
-vt 0.616663 0.050447
-vt 0.580294 0.080294
-vt 0.550447 0.116663
-vt 0.528269 0.158156
-vt 0.514612 0.203178
-vt 0.510000 0.250000
-vt 0.514612 0.296822
-vt 0.528269 0.341844
-vt 0.550447 0.383337
-vt 0.580294 0.419706
-vt 0.616663 0.449553
-vt 0.658156 0.471731
-vt 0.703178 0.485388
-usemtl tex
-s off
-f 161/131/131 162/132/131 164/133/131 163/134/131
-f 163/134/132 164/133/132 166/135/132 165/136/132
-f 165/136/133 166/135/133 168/137/133 167/138/133
-f 167/138/134 168/137/134 170/139/134 169/140/134
-f 169/140/135 170/139/135 172/141/135 171/142/135
-f 171/142/136 172/141/136 174/143/136 173/144/136
-f 173/144/137 174/143/137 176/145/137 175/146/137
-f 175/146/138 176/145/138 178/147/138 177/148/138
-f 177/148/139 178/147/139 180/149/139 179/150/139
-f 179/150/140 180/149/140 182/151/140 181/152/140
-f 181/152/141 182/151/141 184/153/141 183/154/141
-f 183/154/142 184/153/142 186/155/142 185/156/142
-f 185/156/143 186/155/143 188/157/143 187/158/143
-f 187/158/144 188/157/144 190/159/144 189/160/144
-f 189/160/145 190/159/145 192/161/145 191/162/145
-f 191/162/146 192/161/146 194/163/146 193/164/146
-f 193/164/147 194/163/147 196/165/147 195/166/147
-f 195/166/148 196/165/148 198/167/148 197/168/148
-f 197/168/149 198/167/149 200/169/149 199/170/149
-f 199/170/150 200/169/150 202/171/150 201/172/150
-f 201/172/151 202/171/151 204/173/151 203/174/151
-f 203/174/152 204/173/152 206/175/152 205/176/152
-f 205/176/153 206/175/153 208/177/153 207/178/153
-f 207/178/154 208/177/154 210/179/154 209/180/154
-f 209/180/155 210/179/155 212/181/155 211/182/155
-f 211/182/156 212/181/156 214/183/156 213/184/156
-f 213/184/157 214/183/157 216/185/157 215/186/157
-f 215/186/158 216/185/158 218/187/158 217/188/158
-f 217/188/159 218/187/159 220/189/159 219/190/159
-f 219/190/160 220/189/160 222/191/160 221/192/160
-f 164/193/161 162/194/161 224/195/161 222/196/161 220/197/161 218/198/161 216/199/161 214/200/161 212/201/161 210/202/161 208/203/161 206/204/161 204/205/161 202/206/161 200/207/161 198/208/161 196/209/161 194/210/161 192/211/161 190/212/161 188/213/161 186/214/161 184/215/161 182/216/161 180/217/161 178/218/161 176/219/161 174/220/161 172/221/161 170/222/161 168/223/161 166/224/161
-f 221/192/162 222/191/162 224/225/162 223/226/162
-f 223/226/163 224/225/163 162/227/163 161/228/163
-f 225/228/164 256/226/164 223/226/164 161/228/164
-f 320/225/165 318/191/165 255/192/165 256/226/165
-f 257/131/166 258/132/166 260/133/166 259/134/166
-f 259/134/167 260/133/167 262/135/167 261/136/167
-f 261/136/168 262/135/168 264/137/168 263/138/168
-f 263/138/169 264/137/169 266/139/169 265/140/169
-f 265/140/170 266/139/170 268/141/170 267/142/170
-f 267/142/171 268/141/171 270/143/171 269/144/171
-f 269/144/172 270/143/172 272/145/172 271/146/172
-f 271/146/173 272/145/173 274/147/173 273/148/173
-f 273/148/174 274/147/174 276/149/174 275/150/174
-f 275/150/175 276/149/175 278/151/175 277/152/175
-f 277/152/176 278/151/176 280/153/176 279/154/176
-f 279/154/177 280/153/177 282/155/177 281/156/177
-f 281/156/178 282/155/178 284/157/178 283/158/178
-f 283/158/179 284/157/179 286/159/179 285/160/179
-f 285/160/180 286/159/180 288/161/180 287/162/180
-f 287/162/181 288/161/181 290/163/181 289/164/181
-f 289/164/182 290/163/182 292/165/182 291/166/182
-f 291/166/183 292/165/183 294/167/183 293/168/183
-f 293/168/184 294/167/184 296/169/184 295/170/184
-f 295/170/185 296/169/185 298/171/185 297/172/185
-f 297/172/186 298/171/186 300/173/186 299/174/186
-f 299/174/187 300/173/187 302/175/187 301/176/187
-f 301/176/188 302/175/188 304/177/188 303/178/188
-f 303/178/189 304/177/189 306/179/189 305/180/189
-f 305/180/190 306/179/190 308/181/190 307/182/190
-f 307/182/191 308/181/191 310/183/191 309/184/191
-f 309/184/192 310/183/192 312/185/192 311/186/192
-f 311/186/193 312/185/193 314/187/193 313/188/193
-f 313/188/194 314/187/194 316/189/194 315/190/194
-f 315/190/195 316/189/195 318/191/195 317/192/195
-f 258/227/196 320/225/196 256/226/196 225/228/196
-f 317/192/197 318/191/197 320/225/197 319/226/197
-f 319/226/198 320/225/198 258/227/198 257/228/198
-f 257/229/199 259/230/199 261/231/199 263/232/199 265/233/199 267/234/199 269/235/199 271/236/199 273/237/199 275/238/199 277/239/199 279/240/199 281/241/199 283/242/199 285/243/199 287/244/199 289/245/199 291/246/199 293/247/199 295/248/199 297/249/199 299/250/199 301/251/199 303/252/199 305/253/199 307/254/199 309/255/199 311/256/199 313/257/199 315/258/199 317/259/199 319/260/199
-f 318/191/200 316/189/200 254/190/200 255/192/200
-f 316/189/201 314/187/201 253/188/201 254/190/201
-f 314/187/202 312/185/202 252/186/202 253/188/202
-f 312/185/203 310/183/203 251/184/203 252/186/203
-f 310/183/204 308/181/204 250/182/204 251/184/204
-f 308/181/205 306/179/205 249/180/205 250/182/205
-f 306/179/206 304/177/206 248/178/206 249/180/206
-f 304/177/207 302/175/207 247/176/207 248/178/207
-f 302/175/208 300/173/208 246/174/208 247/176/208
-f 300/173/209 298/171/209 245/172/209 246/174/209
-f 298/171/210 296/169/210 244/170/210 245/172/210
-f 296/169/211 294/167/211 243/168/211 244/170/211
-f 294/167/212 292/165/212 242/166/212 243/168/212
-f 292/165/213 290/163/213 241/164/213 242/166/213
-f 290/163/214 288/161/214 240/162/214 241/164/214
-f 288/161/215 286/159/215 239/160/215 240/162/215
-f 286/159/216 284/157/216 238/158/216 239/160/216
-f 284/157/217 282/155/217 237/156/217 238/158/217
-f 282/155/218 280/153/218 236/154/218 237/156/218
-f 280/153/219 278/151/219 235/152/219 236/154/219
-f 278/151/220 276/149/220 234/150/220 235/152/220
-f 276/149/221 274/147/221 233/148/221 234/150/221
-f 274/147/222 272/145/222 232/146/222 233/148/222
-f 272/145/223 270/143/223 231/144/223 232/146/223
-f 270/143/224 268/141/224 230/142/224 231/144/224
-f 268/141/225 266/139/225 229/140/225 230/142/225
-f 266/139/226 264/137/226 228/138/226 229/140/226
-f 264/137/227 262/135/227 227/136/227 228/138/227
-f 262/135/228 260/133/228 226/134/228 227/136/228
-f 260/133/229 258/132/229 225/131/229 226/134/229
-f 256/226/230 255/192/230 221/192/230 223/226/230
-f 255/192/231 254/190/231 219/190/231 221/192/231
-f 254/190/232 253/188/232 217/188/232 219/190/232
-f 253/188/233 252/186/233 215/186/233 217/188/233
-f 252/186/234 251/184/234 213/184/234 215/186/234
-f 251/184/235 250/182/235 211/182/235 213/184/235
-f 250/182/236 249/180/236 209/180/236 211/182/236
-f 249/180/237 248/178/237 207/178/237 209/180/237
-f 248/178/238 247/176/238 205/176/238 207/178/238
-f 247/176/239 246/174/239 203/174/239 205/176/239
-f 246/174/240 245/172/240 201/172/240 203/174/240
-f 245/172/241 244/170/241 199/170/241 201/172/241
-f 244/170/242 243/168/242 197/168/242 199/170/242
-f 243/168/243 242/166/243 195/166/243 197/168/243
-f 242/166/244 241/164/244 193/164/244 195/166/244
-f 241/164/245 240/162/245 191/162/245 193/164/245
-f 240/162/246 239/160/246 189/160/246 191/162/246
-f 239/160/247 238/158/247 187/158/247 189/160/247
-f 238/158/248 237/156/248 185/156/248 187/158/248
-f 237/156/249 236/154/249 183/154/249 185/156/249
-f 236/154/250 235/152/250 181/152/250 183/154/250
-f 235/152/251 234/150/251 179/150/251 181/152/251
-f 234/150/252 233/148/252 177/148/252 179/150/252
-f 233/148/253 232/146/253 175/146/253 177/148/253
-f 232/146/254 231/144/254 173/144/254 175/146/254
-f 231/144/255 230/142/255 171/142/255 173/144/255
-f 230/142/256 229/140/256 169/140/256 171/142/256
-f 229/140/257 228/138/257 167/138/257 169/140/257
-f 228/138/258 227/136/258 165/136/258 167/138/258
-f 227/136/259 226/134/259 163/134/259 165/136/259
-f 226/134/260 225/131/260 161/131/260 163/134/260
diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/materials/black.mtl b/src/main/resources/assets/saturnclient/models/cosmetic/materials/black.mtl
deleted file mode 100644
index 3661766..0000000
--- a/src/main/resources/assets/saturnclient/models/cosmetic/materials/black.mtl
+++ /dev/null
@@ -1,13 +0,0 @@
-# Blender MTL File: 'None'
-# Material Count: 1
-
-newmtl tex
-Ns 250.000000
-Ka 1.000000 1.000000 1.000000
-Kd 0.800000 0.800000 0.800000
-Ks 0.500000 0.500000 0.500000
-Ke 0.000000 0.000000 0.000000
-Ni 1.450000
-d 1.000000
-illum 2
-map_Kd saturnclient:textures/item/halo_black.png
diff --git a/src/main/resources/assets/saturnclient/models/cosmetic/materials/white.mtl b/src/main/resources/assets/saturnclient/models/cosmetic/materials/white.mtl
deleted file mode 100644
index 9c0dc53..0000000
--- a/src/main/resources/assets/saturnclient/models/cosmetic/materials/white.mtl
+++ /dev/null
@@ -1,13 +0,0 @@
-# Blender MTL File: 'None'
-# Material Count: 1
-
-newmtl tex
-Ns 250.000000
-Ka 1.000000 1.000000 1.000000
-Kd 0.800000 0.800000 0.800000
-Ks 0.500000 0.500000 0.500000
-Ke 0.000000 0.000000 0.000000
-Ni 1.450000
-d 1.000000
-illum 2
-map_Kd saturnclient:textures/item/halo.png
diff --git a/src/main/resources/assets/saturnclient/player_animations/back_flip.json b/src/main/resources/assets/saturnclient/player_animations/back_flip.json
deleted file mode 100644
index 3a15c12..0000000
--- a/src/main/resources/assets/saturnclient/player_animations/back_flip.json
+++ /dev/null
@@ -1,1385 +0,0 @@
-{
- "name": "back_flip",
- "author": "Kale Ko",
- "description": "Makes You Do A Back Flip",
- "uuid": "ebfb1e69-330a-4970-8bca-f5625c90681a",
- "emote":{
- "isLoop": "false",
- "returnTick": 2,
- "beginTick":0,
- "endTick":80,
- "stopTick":81,
- "degrees":false,
- "moves":[
-
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "y":-0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "y":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "z":-0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "z":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "x":-0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "x":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "yaw":-0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "yaw":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "roll":0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "roll":0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "pitch":-0.2994975745677948
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "head":{
- "pitch":-0.0
- }
- },
- {
- "tick":10,
- "easing": "EASEOUTQUAD",
- "turn": 0,
- "torso":{
- "yaw":0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINSINE",
- "turn": 0,
- "torso":{
- "yaw":0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "yaw":0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEOUTSINE",
- "turn": 0,
- "torso":{
- "yaw":0.0
- }
- },
- {
- "tick":70,
- "easing": "CONSTANT",
- "turn": 0,
- "torso":{
- "yaw":0.0
- }
- },
- {
- "tick":71,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "yaw":0.0
- }
- },
- {
- "tick":10,
- "easing": "EASEOUTQUAD",
- "turn": 0,
- "torso":{
- "roll":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINSINE",
- "turn": 0,
- "torso":{
- "roll":0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "roll":0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEOUTSINE",
- "turn": 0,
- "torso":{
- "roll":0.0
- }
- },
- {
- "tick":70,
- "easing": "CONSTANT",
- "turn": 0,
- "torso":{
- "roll":0.0
- }
- },
- {
- "tick":71,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "roll":-0.0
- }
- },
- {
- "tick":10,
- "easing": "EASEOUTQUAD",
- "turn": 0,
- "torso":{
- "pitch":0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINSINE",
- "turn": 0,
- "torso":{
- "pitch":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "pitch":0.9649674892425537
- }
- },
- {
- "tick":55,
- "easing": "EASEOUTSINE",
- "turn": 0,
- "torso":{
- "pitch":5.110422611236572
- }
- },
- {
- "tick":70,
- "easing": "CONSTANT",
- "turn": 0,
- "torso":{
- "pitch":6.2831854820251465
- }
- },
- {
- "tick":71,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "pitch":0.0
- }
- },
- {
- "tick":10,
- "easing": "EASEOUTQUAD",
- "turn": 0,
- "torso":{
- "y":-0.05682346969842911
- }
- },
- {
- "tick":40,
- "easing": "EASEINQUAD",
- "turn": 0,
- "torso":{
- "y":1.46522855758667
- }
- },
- {
- "tick":71,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "y":0.0
- }
- },
- {
- "tick":10,
- "easing": "EASEOUTQUAD",
- "turn": 0,
- "torso":{
- "x":0.0
- }
- },
- {
- "tick":40,
- "easing": "EASEINQUAD",
- "turn": 0,
- "torso":{
- "x":0.0
- }
- },
- {
- "tick":71,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "x":0.0
- }
- },
- {
- "tick":10,
- "easing": "EASEOUTQUAD",
- "turn": 0,
- "torso":{
- "z":-0.0
- }
- },
- {
- "tick":40,
- "easing": "EASEINQUAD",
- "turn": 0,
- "torso":{
- "z":-0.0
- }
- },
- {
- "tick":71,
- "easing": "LINEAR",
- "turn": 0,
- "torso":{
- "z":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "rightArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "rightArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "rightArm":{
- "roll":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "rightArm":{
- "roll":0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "roll":-0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightArm":{
- "roll":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "roll":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "rightArm":{
- "y":2.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "rightArm":{
- "y":2.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "y":2.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightArm":{
- "y":2.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "y":2.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "rightArm":{
- "z":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "rightArm":{
- "z":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "z":-0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightArm":{
- "z":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "z":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "rightArm":{
- "x":-5.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "rightArm":{
- "x":-5.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "x":-5.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightArm":{
- "x":-5.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "x":-5.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "rightArm":{
- "pitch":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "rightArm":{
- "pitch":-3.4906585216522217
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "pitch":-3.665191411972046
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightArm":{
- "pitch":-2.7925267219543457
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightArm":{
- "pitch":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "leftArm":{
- "roll":0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "leftArm":{
- "roll":0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "roll":0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftArm":{
- "roll":0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "roll":0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "leftArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "leftArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "yaw":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "leftArm":{
- "pitch":0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "leftArm":{
- "pitch":-3.4906585216522217
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "pitch":-3.665191411972046
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftArm":{
- "pitch":-2.7925267219543457
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "pitch":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "leftArm":{
- "y":2.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "leftArm":{
- "y":2.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "y":2.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftArm":{
- "y":2.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "y":2.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "leftArm":{
- "z":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "leftArm":{
- "z":-0.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "z":-0.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftArm":{
- "z":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "z":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINSINE",
- "turn": 0,
- "leftArm":{
- "x":5.0
- }
- },
- {
- "tick":15,
- "easing": "EASEOUTQUART",
- "turn": 0,
- "leftArm":{
- "x":5.0
- }
- },
- {
- "tick":24,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "x":5.0
- }
- },
- {
- "tick":55,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftArm":{
- "x":5.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftArm":{
- "x":5.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "rightLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "rightLeg":{
- "roll":-0.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "roll":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "roll":0.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "roll":0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "roll":0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "roll":0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "rightLeg":{
- "pitch":-0.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "pitch":0.2617993950843811
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "pitch":-0.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "pitch":0.45378559827804565
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "pitch":-0.1745329201221466
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "pitch":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "rightLeg":{
- "x":-1.9
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "x":-1.9
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "x":-1.9
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "x":-1.9
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "x":-1.9
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "x":-1.9
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "rightLeg":{
- "y":12.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "y":12.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "y":12.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "y":12.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "y":12.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "y":12.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "rightLeg":{
- "z":0.1
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "z":0.1
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "z":0.1
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "rightLeg":{
- "z":0.1
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "z":0.1
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "rightLeg":{
- "z":0.1
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "leftLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "yaw":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "leftLeg":{
- "roll":0.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "roll":-0.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "roll":-0.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "roll":-0.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "roll":-0.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "roll":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "leftLeg":{
- "pitch":-0.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "pitch":0.2617993950843811
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "pitch":-0.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "pitch":0.45378559827804565
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "pitch":-0.1745329201221466
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "pitch":-0.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "leftLeg":{
- "y":12.0
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "y":12.0
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "y":12.0
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "y":12.0
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "y":12.0
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "y":12.0
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "leftLeg":{
- "z":-0.1
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "z":-0.1
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "z":-0.1
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "z":-0.1
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "z":-0.1
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "z":-0.1
- }
- },
- {
- "tick":1,
- "easing": "EASEINOUTQUAD",
- "turn": 0,
- "leftLeg":{
- "x":1.9
- }
- },
- {
- "tick":5,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "x":1.9
- }
- },
- {
- "tick":15,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "x":1.9
- }
- },
- {
- "tick":24,
- "easing": "EASEINOUTSINE",
- "turn": 0,
- "leftLeg":{
- "x":1.9
- }
- },
- {
- "tick":55,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "x":1.9
- }
- },
- {
- "tick":70,
- "easing": "LINEAR",
- "turn": 0,
- "leftLeg":{
- "x":1.9
- }
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/player_animations/cry.json b/src/main/resources/assets/saturnclient/player_animations/cry.json
deleted file mode 100644
index d6a1817..0000000
--- a/src/main/resources/assets/saturnclient/player_animations/cry.json
+++ /dev/null
@@ -1,305 +0,0 @@
-{
- "version": 1,
- "valid": true,
- "name": "cry",
- "description": "T_T",
- "author": "dsty",
- "emote": {
- "beginTick": 0,
- "endTick": 60,
- "stopTick": 61,
- "isLoop": true,
- "returnTick": 5,
- "nsfw": false,
- "degrees": false,
- "moves": [
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.34134695
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.22808763
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.21269174
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.32248768
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.0874397
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.17582592
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.21476103
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -6.320644E-4
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.029434478
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.039604172
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.037607383
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.050604735
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.00930274
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0010032838
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.009209918
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.012478679
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.031160546
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -1.8700758
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.4349194
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.4970688
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -0.9622451
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 2.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.9203311
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.6307226
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.2971223
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "bend": -0.8864816
- }
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/player_animations/facepalm.json b/src/main/resources/assets/saturnclient/player_animations/facepalm.json
deleted file mode 100644
index cf79018..0000000
--- a/src/main/resources/assets/saturnclient/player_animations/facepalm.json
+++ /dev/null
@@ -1,389 +0,0 @@
-{
- "version": 1,
- "valid": true,
- "name": "facepalm",
- "description": "just facepalm",
- "author": "dsty",
- "emote": {
- "beginTick": 0,
- "endTick": 60,
- "stopTick": 61,
- "isLoop": false,
- "returnTick": 2,
- "nsfw": false,
- "degrees": false,
- "moves": [
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.067995355
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.14453278
- }
- },
- {
- "tick": 30,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.11871816
- }
- },
- {
- "tick": 40,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.19018666
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.20064461
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.060454715
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.086299464
- }
- },
- {
- "tick": 30,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.087619215
- }
- },
- {
- "tick": 40,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.083825104
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.036273066
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0041144555
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.12942825
- }
- },
- {
- "tick": 30,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.050149817
- }
- },
- {
- "tick": 40,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.08701207
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.08676299
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -3.8523226
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -3.8523226
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -2.0664942
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -2.074402
- }
- },
- {
- "tick": 30,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -2.074402
- }
- },
- {
- "tick": 40,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -2.02932
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -2.02932
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.47555572
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.5093512
- }
- },
- {
- "tick": 30,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.5093512
- }
- },
- {
- "tick": 40,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.38563538
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.38563538
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.20147677
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.20521602
- }
- },
- {
- "tick": 30,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.3274244
- }
- },
- {
- "tick": 40,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.30787703
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.40478125
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -0.49199954
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -0.54730254
- }
- },
- {
- "tick": 40,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -0.52019864
- }
- },
- {
- "tick": 60,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -0.0
- }
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/player_animations/front_flip.json b/src/main/resources/assets/saturnclient/player_animations/front_flip.json
deleted file mode 100644
index c97d782..0000000
--- a/src/main/resources/assets/saturnclient/player_animations/front_flip.json
+++ /dev/null
@@ -1,697 +0,0 @@
-{
- "version": 1,
- "valid": true,
- "name": "front_flip",
- "description": "Parkour!!!!1",
- "author": "DKinchik",
- "emote": {
- "beginTick": 0,
- "endTick": 17,
- "stopTick": 18,
- "isLoop": false,
- "returnTick": 1,
- "nsfw": false,
- "degrees": false,
- "moves": [
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.7020477
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.7020477
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -1.9
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -1.9
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 11.169379
- }
- },
- {
- "tick": 3,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -0.39214998
- }
- },
- {
- "tick": 3,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": 0.1
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": 0.1
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 3,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -1.9707682
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -1.9707682
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "bend": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -1.3665518
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -1.3665518
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 2.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 2.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.0793308
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.0793308
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftArm": {
- "bend": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 1.9
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 1.9
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 10.861001
- }
- },
- {
- "tick": 3,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -0.5082285
- }
- },
- {
- "tick": 3,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -0.1
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -0.1
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 3,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -1.9850811
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -1.9850811
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "bend": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 16,
- "easing": "INQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INQUAD",
- "body": {
- "y": -0.061333913
- }
- },
- {
- "tick": 7,
- "easing": "OUTQUAD",
- "body": {
- "y": 0.48852682
- }
- },
- {
- "tick": 15,
- "easing": "CONSTANT",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 16,
- "easing": "INQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INQUAD",
- "body": {
- "z": -0.0
- }
- },
- {
- "tick": 16,
- "easing": "INQUAD",
- "body": {
- "z": -0.0
- }
- },
- {
- "tick": 2,
- "easing": "INQUAD",
- "body": {
- "pitch": 0.0
- }
- },
- {
- "tick": 7,
- "easing": "OUTQUAD",
- "body": {
- "pitch": -2.8362873
- }
- },
- {
- "tick": 15,
- "easing": "CONSTANT",
- "body": {
- "pitch": -6.2831855
- }
- },
- {
- "tick": 16,
- "easing": "INQUAD",
- "body": {
- "pitch": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 16,
- "easing": "INQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INQUAD",
- "body": {
- "roll": -0.0
- }
- },
- {
- "tick": 16,
- "easing": "INQUAD",
- "body": {
- "roll": 0.0
- }
- },
- {
- "tick": 2,
- "easing": "INOUTQUAD",
- "body": {
- "bend": -0.0
- }
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/player_animations/giga_chad.json b/src/main/resources/assets/saturnclient/player_animations/giga_chad.json
deleted file mode 100644
index da2ae51..0000000
--- a/src/main/resources/assets/saturnclient/player_animations/giga_chad.json
+++ /dev/null
@@ -1,5135 +0,0 @@
-{
- "version": 1,
- "valid": true,
- "name": "giga_chad",
- "description": "The Chaddest of them all",
- "author": "Wah0o",
- "emote": {
- "beginTick": 0,
- "endTick": 165,
- "stopTick": 166,
- "isLoop": true,
- "returnTick": 5,
- "nsfw": false,
- "degrees": false,
- "moves": [
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "head": {
- "x": -0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "head": {
- "y": -0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "head": {
- "z": -0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.0
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.13989598
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.13989598
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.032506067
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.032506067
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.04490119
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.04490119
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.13459775
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.13459775
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -1.5314963
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -1.5314963
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -1.1120538
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -1.1120538
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.14775816
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.14775816
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.037381746
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.037381746
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.037799735
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.037799735
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.060097966
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.060097966
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -1.286084
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -1.286084
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "head": {
- "pitch": 0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.4168441
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.4168441
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -1.00269
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -1.00269
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.11216698
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.11216698
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.24195862
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.24195862
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.002758297
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.002758297
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.0013488329
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.0013488329
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0029103598
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0029103598
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -1.4095863
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -1.4095863
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 1.0407902E-4
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 1.0407902E-4
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.15502043
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.15502043
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.20529102
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": 0.20529102
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.013530715
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.013530715
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "head": {
- "yaw": -0.4168441
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.21926047
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.21926047
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.025936412
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.025936412
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.0
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.015539514
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.015539514
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.054117903
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.054117903
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 9.091206E-5
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 9.091206E-5
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0027981726
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0027981726
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.78003484
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.78003484
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0014062009
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0014062009
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.0
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.0
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0016081737
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0016081737
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.017228942
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.017228942
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.018058004
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.018058004
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "head": {
- "roll": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "head": {
- "roll": 0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -1.9
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -2.252326
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -2.252326
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -2.9982228
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -2.9982228
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -2.5480254
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -2.5480254
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -1.9
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -1.9
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -1.7722428
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -1.7722428
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -3.169594
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -3.169594
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "x": -2.252326
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 10.195459
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 10.195459
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 10.277176
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 10.277176
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 10.025742
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 10.025742
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 11.914537
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 11.914537
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "y": 10.195459
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": 0.1
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -2.9733403
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -2.9733403
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -3.4964054
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -3.4964054
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": 0.1
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": 0.1
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -1.5458566
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -1.5458566
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "z": -2.9733403
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.33713692
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.33713692
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.3196764
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.3196764
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.027517445
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.027517445
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.047809538
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.047809538
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0026976853
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0026976853
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.03274877
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.03274877
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.007906961
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.007906961
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.07262061
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.07262061
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 5.0244353E-10
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 5.0244353E-10
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.0
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.22003074
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.22003074
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -1.5668823
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -1.5668823
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.9465621
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.9465621
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": -0.33713692
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.37796307
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.37796307
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.76882756
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.76882756
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.27188113
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.27188113
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.26609528
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.26609528
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.2948
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.2948
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.26220575
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.26220575
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.039796446
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.039796446
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.39853075
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.39853075
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 2.5175512E-5
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 2.5175512E-5
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.38755667
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.38755667
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.10965421
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.10965421
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.660008
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.660008
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": -0.018245801
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": -0.018245801
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 1.5213028
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 1.5213028
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.6063431
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.6063431
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "yaw": 0.37796307
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.025020538
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.025020538
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.048341107
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.048341107
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.069259174
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.069259174
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.1402302
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.1402302
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.20118771
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.20118771
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.095185064
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.095185064
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -7.341183E-7
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -7.341183E-7
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.21809976
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.21809976
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 6.93035E-4
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 6.93035E-4
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.061397005
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.061397005
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.0
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.22244482
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.22244482
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.08971669
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 0.08971669
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 2.2946439
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": 2.2946439
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "roll": -0.025020538
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.9686313
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.9686313
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -6.0498323
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -6.0498323
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.9686313
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 3.9937258
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 3.9937258
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -1.961665
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -1.961665
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -1.9947729E-8
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -1.9947729E-8
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -1.961665
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.0
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.87733024
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.87733024
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.8773303
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.8773303
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.037967823
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.037967823
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.67362005
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.67362005
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.67564476
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.67564476
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.142549
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.142549
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 2.9807994
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 2.9807994
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 1.693267
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 1.693267
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0014576487
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0014576487
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.65763783
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.65763783
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.4441948
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.4441948
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.149893
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.149893
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.65401036
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.65401036
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.1320117
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -3.1320117
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.7990288
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.7990288
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.8078986
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.8078986
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.8078987
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.8078987
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.31803387
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.31803387
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.14138679
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.14138679
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.9297993
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.9297993
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 0.2030788
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 0.2030788
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 1.0315573
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 1.0315573
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 0.010718631
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 0.010718631
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.049475487
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.049475487
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.21283935
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.21283935
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 0.88883036
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 0.88883036
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0376238
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0376238
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 1.4946102
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": 1.4946102
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -1.3037015
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -1.3037015
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.7990288
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.30187678
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.30187678
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.2721525
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.2721525
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.18416819
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.18416819
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.09789227
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.09789227
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.2198998
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.2198998
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.48504347
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.48504347
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.67907065
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.67907065
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -6.110932E-5
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -6.110932E-5
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 4.3807907
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 4.3807907
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.009480219
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.009480219
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.029465547
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.029465547
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.6154332
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.6154332
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.8863503
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.8863503
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 1.5616314E-4
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 1.5616314E-4
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 1.8965981
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 1.8965981
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.2532393
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.2532393
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": -0.30187678
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 2.9568586
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 2.9568586
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 2.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 4.0875206
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 4.0875206
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 2.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 2.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 4.0875206
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -2.203474
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -2.203474
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.51976997
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.51976997
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.6709974
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.6709974
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.6709973
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.6709973
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.30776563
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.30776563
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.65677315
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.65677315
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.6417192
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.6417192
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 3.1355157
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 3.1355157
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.0010496362
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.0010496362
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 1.6392988
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 1.6392988
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.0025698922
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.0025698922
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.5024246
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.5024246
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -2.8041947
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -2.8041947
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -3.1532238
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -3.1532238
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.1308259
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.1308259
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -0.51976997
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 1.172347
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 1.172347
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.037808705
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.037808705
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.037808713
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.037808713
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.62366265
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.62366265
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.7531556
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.7531556
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 1.2664338
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 1.2664338
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.13954905
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.13954905
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.013174082
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.013174082
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.010205563
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.010205563
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.06644766
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.06644766
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.010088136
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.010088136
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.6029994
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.6029994
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.03762318
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.03762318
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.44563633
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.44563633
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 1.172347
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.48641014
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.48641014
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.10834044
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.10834044
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.5676788
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.5676788
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.07504642
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.07504642
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.006862871
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.006862871
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.5692944
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.5692944
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -2.8592016E-5
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -2.8592016E-5
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -1.7287096
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -1.7287096
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.009529364
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.009529364
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.038684685
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.038684685
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.31971967
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.31971967
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.88968116
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.88968116
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 2.188246E-4
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 2.188246E-4
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -2.1538641
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -2.1538641
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": 0.48641014
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 1.9
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 2.338033
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 2.338033
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 2.4034452
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 2.4034452
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 1.9
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 1.9
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "x": 2.338033
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 9.917855
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 9.917855
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 10.922021
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 10.922021
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 10.576937
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 10.576937
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 12.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "y": 9.917855
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -0.1
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -3.7886016
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -3.7886016
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -3.7174206
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -3.7174206
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -0.1
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -0.1
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "z": -3.7886016
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.28943428
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.28943428
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.29512814
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.29512814
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.01708789
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.01708789
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.04704775
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.04704775
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.0030718336
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.0030718336
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.043501973
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.043501973
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.0
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -1.5781744
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -1.5781744
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 3.203295E-12
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 3.203295E-12
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.13094698
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.13094698
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.109108955
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.109108955
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -1.5687531
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -1.5687531
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": -0.28943428
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.24234551
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.24234551
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.04647371
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.04647371
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.046473704
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.046473704
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.14872508
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.14872508
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.27384213
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.27384213
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.22910896
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.22910896
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.29659358
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.29659358
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.09799422
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.09799422
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": 0.009622238
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": 0.009622238
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.37212652
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.37212652
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": 0.22992273
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": 0.22992273
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.297723
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.297723
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.01908363
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.01908363
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.0
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.16646482
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.16646482
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "yaw": -0.24234551
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.07622462
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.07622462
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.066452764
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.066452764
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.18356355
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.18356355
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.04682022
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.04682022
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.0011612747
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.0011612747
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.16643818
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.16643818
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.09162157
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.09162157
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -1.1308775E-5
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -1.1308775E-5
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": 0.19563156
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": 0.19563156
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": 0.009551507
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": 0.009551507
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.08669772
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.08669772
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.02894436
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.02894436
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.1509232
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.1509232
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.1525886
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.1525886
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.73833025
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.73833025
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": 0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "roll": -0.07622462
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.04586473
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.019460544
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.14749607
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.055940144
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.04586473
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.019460544
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.16599017
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.15493058
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.1035458
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.025333587
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.11034301
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.21000633
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.26974648
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.22764045
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.15241866
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.16667084
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.21193272
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.29072618
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.2166983
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.14110439
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "body": {
- "x": 0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "body": {
- "x": -0.04586473
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "body": {
- "y": -0.1720419
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "body": {
- "y": -0.1720419
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "body": {
- "y": -0.1720419
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "body": {
- "y": -0.1720419
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.5178939
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.5178939
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.28458548
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.28458548
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.4809237
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.4809237
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.4706339
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.4706339
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 164,
- "easing": "INOUTQUAD",
- "body": {
- "y": 0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "body": {
- "y": -0.1720419
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "body": {
- "z": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "body": {
- "z": -0.0
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "body": {
- "z": -0.0
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "body": {
- "z": 0.011486796
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "body": {
- "z": 0.011486796
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "body": {
- "z": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "body": {
- "z": -0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "body": {
- "pitch": 0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "body": {
- "pitch": 0.0
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "body": {
- "pitch": -0.0
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "body": {
- "pitch": 0.23216064
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "body": {
- "pitch": 0.23216064
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "body": {
- "pitch": 0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "body": {
- "pitch": 0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -1.3986131
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -1.3986131
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 34,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 35,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -0.07036926
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -0.07036926
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -0.07036925
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -0.07036925
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 1.5803477
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 1.5803477
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 114,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 115,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -0.11275339
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -0.11275339
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.43098667
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.43098667
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -1.5896086
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": -1.5896086
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "body": {
- "yaw": 0.0
- }
- },
- {
- "tick": 4,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.0
- }
- },
- {
- "tick": 5,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.0
- }
- },
- {
- "tick": 14,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 0.0
- }
- },
- {
- "tick": 15,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.10164733
- }
- },
- {
- "tick": 24,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.10164733
- }
- },
- {
- "tick": 25,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.0
- }
- },
- {
- "tick": 44,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.0
- }
- },
- {
- "tick": 45,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.061503474
- }
- },
- {
- "tick": 54,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.061503474
- }
- },
- {
- "tick": 55,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.037977725
- }
- },
- {
- "tick": 64,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.037977725
- }
- },
- {
- "tick": 65,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.010051205
- }
- },
- {
- "tick": 74,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.010051205
- }
- },
- {
- "tick": 75,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -3.1445053
- }
- },
- {
- "tick": 84,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -3.1445053
- }
- },
- {
- "tick": 85,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 1.7155838
- }
- },
- {
- "tick": 94,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 1.7155838
- }
- },
- {
- "tick": 95,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -1.6908722
- }
- },
- {
- "tick": 104,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -1.6908722
- }
- },
- {
- "tick": 105,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.0
- }
- },
- {
- "tick": 124,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 0.0
- }
- },
- {
- "tick": 125,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 0.030365204
- }
- },
- {
- "tick": 134,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 0.030365204
- }
- },
- {
- "tick": 135,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -3.145151
- }
- },
- {
- "tick": 144,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -3.145151
- }
- },
- {
- "tick": 145,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 2.160377
- }
- },
- {
- "tick": 154,
- "easing": "INOUTQUAD",
- "body": {
- "roll": 2.160377
- }
- },
- {
- "tick": 155,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.0
- }
- },
- {
- "tick": 165,
- "easing": "INOUTQUAD",
- "body": {
- "roll": -0.0
- }
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/player_animations/tpose.json b/src/main/resources/assets/saturnclient/player_animations/tpose.json
deleted file mode 100644
index abd421f..0000000
--- a/src/main/resources/assets/saturnclient/player_animations/tpose.json
+++ /dev/null
@@ -1,354 +0,0 @@
-{
- "version": 1,
- "valid": true,
- "name": "tpose",
- "description": "MENACING",
- "author": "stephanieisdumb",
- "emote": {
- "beginTick": 0,
- "endTick": 80,
- "stopTick": 81,
- "isLoop": true,
- "returnTick": 20,
- "nsfw": false,
- "degrees": false,
- "moves": [
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -5.0
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -6.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "rightArm": {
- "x": -6.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 2.0
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 3.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "rightArm": {
- "y": 3.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "rightArm": {
- "z": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -1.0704756
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": 0.059108086
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "rightArm": {
- "pitch": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.61077195
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.008776078
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "rightArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 0.6060502
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 1.5707964
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 1.5765934
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "rightArm": {
- "roll": 1.5707964
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -1.3806202
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "rightArm": {
- "bend": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 5.0
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 6.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "leftArm": {
- "x": 6.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 2.0
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 3.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "leftArm": {
- "y": 3.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "leftArm": {
- "z": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": -1.0045553
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.0
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.010133168
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "leftArm": {
- "pitch": 0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.44322997
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": 0.038214765
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "leftArm": {
- "yaw": -0.0
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -0.5571526
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -1.5707964
- }
- },
- {
- "tick": 50,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -1.5692185
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "leftArm": {
- "roll": -1.5707964
- }
- },
- {
- "tick": 10,
- "easing": "INOUTQUAD",
- "leftArm": {
- "bend": -1.3810014
- }
- },
- {
- "tick": 20,
- "easing": "INOUTQUAD",
- "leftArm": {
- "bend": -0.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "leftLeg": {
- "pitch": 0.0
- }
- },
- {
- "tick": 80,
- "easing": "INOUTQUAD",
- "rightLeg": {
- "pitch": 0.0
- }
- }
- ]
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/amg.png b/src/main/resources/assets/saturnclient/textures/cloaks/amg.png
deleted file mode 100644
index ee63ca0..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/amg.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/amg_petronas.png b/src/main/resources/assets/saturnclient/textures/cloaks/amg_petronas.png
deleted file mode 100644
index ba0169d..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/amg_petronas.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_amethyst.gif b/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_amethyst.gif
deleted file mode 100644
index 4efb183..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_amethyst.gif and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_amethyst.png b/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_amethyst.png
deleted file mode 100644
index 4b4c8c9..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_amethyst.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_flame.gif b/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_flame.gif
deleted file mode 100644
index fa833b5..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_flame.gif and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_flame.png b/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_flame.png
deleted file mode 100644
index 0d30ca3..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_flame.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_white.gif b/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_white.gif
deleted file mode 100644
index f534763..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_white.gif and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_white.png b/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_white.png
deleted file mode 100644
index 17fa98e..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/black_hole_white.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/bmw.png b/src/main/resources/assets/saturnclient/textures/cloaks/bmw.png
deleted file mode 100644
index 2f3a171..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/bmw.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/crimson_mark.png b/src/main/resources/assets/saturnclient/textures/cloaks/crimson_mark.png
deleted file mode 100644
index ed56e71..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/crimson_mark.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/ferrari.png b/src/main/resources/assets/saturnclient/textures/cloaks/ferrari.png
deleted file mode 100644
index f7b2db6..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/ferrari.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/glitch.gif b/src/main/resources/assets/saturnclient/textures/cloaks/glitch.gif
deleted file mode 100644
index e7cdfbd..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/glitch.gif and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/glitch.png b/src/main/resources/assets/saturnclient/textures/cloaks/glitch.png
deleted file mode 100644
index beb3cd3..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/glitch.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/mercedes_flow.png b/src/main/resources/assets/saturnclient/textures/cloaks/mercedes_flow.png
deleted file mode 100644
index 2f7ad61..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/mercedes_flow.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/cloaks/redbull.png b/src/main/resources/assets/saturnclient/textures/cloaks/redbull.png
deleted file mode 100644
index 7f1fa5c..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/cloaks/redbull.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/amg.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/amg.png
deleted file mode 100644
index 55c0cd4..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/amg.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/amg_petronas.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/amg_petronas.png
deleted file mode 100644
index 0013b33..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/amg_petronas.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_amethyst.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_amethyst.png
deleted file mode 100644
index d68de7d..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_amethyst.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_flame.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_flame.png
deleted file mode 100644
index 714a073..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_flame.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_white.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_white.png
deleted file mode 100644
index 1fd6c4e..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/black_hole_white.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/bmw.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/bmw.png
deleted file mode 100644
index db981dd..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/bmw.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/crimson_mark.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/crimson_mark.png
deleted file mode 100644
index c946473..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/crimson_mark.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/ferrari.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/ferrari.png
deleted file mode 100644
index 210c9e2..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/ferrari.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/glitch.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/glitch.png
deleted file mode 100644
index b0ea453..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/glitch.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/mercedes_flow.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/mercedes_flow.png
deleted file mode 100644
index 0e40488..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/mercedes_flow.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/none.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/none.png
deleted file mode 100644
index 57b0853..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/none.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/cloak/redbull.png b/src/main/resources/assets/saturnclient/textures/gui/cloak/redbull.png
deleted file mode 100644
index 23e5add..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/cloak/redbull.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/check.png b/src/main/resources/assets/saturnclient/textures/gui/components/check.png
deleted file mode 100644
index 039befb..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/check.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/circle_x.png b/src/main/resources/assets/saturnclient/textures/gui/components/circle_x.png
deleted file mode 100644
index 11401de..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/circle_x.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/cloak.png b/src/main/resources/assets/saturnclient/textures/gui/components/cloak.png
deleted file mode 100644
index ab853dd..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/cloak.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/close.png b/src/main/resources/assets/saturnclient/textures/gui/components/close.png
deleted file mode 100644
index cf7f967..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/close.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/coins.png b/src/main/resources/assets/saturnclient/textures/gui/components/coins.png
deleted file mode 100644
index 0946546..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/coins.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/cosmetics.png b/src/main/resources/assets/saturnclient/textures/gui/components/cosmetics.png
deleted file mode 100644
index 725110f..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/cosmetics.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/hat.png b/src/main/resources/assets/saturnclient/textures/gui/components/hat.png
deleted file mode 100644
index b84414f..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/hat.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/hud.png b/src/main/resources/assets/saturnclient/textures/gui/components/hud.png
deleted file mode 100644
index a71c971..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/hud.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/info.png b/src/main/resources/assets/saturnclient/textures/gui/components/info.png
deleted file mode 100644
index 81686b1..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/info.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/left.png b/src/main/resources/assets/saturnclient/textures/gui/components/left.png
deleted file mode 100644
index 073a748..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/left.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/mods_tab.png b/src/main/resources/assets/saturnclient/textures/gui/components/mods_tab.png
deleted file mode 100644
index 3c46cd0..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/mods_tab.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/reset.png b/src/main/resources/assets/saturnclient/textures/gui/components/reset.png
deleted file mode 100644
index fa62098..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/reset.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/right.png b/src/main/resources/assets/saturnclient/textures/gui/components/right.png
deleted file mode 100644
index fa6ee7c..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/right.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/search.png b/src/main/resources/assets/saturnclient/textures/gui/components/search.png
deleted file mode 100644
index ac03290..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/search.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/settings.png b/src/main/resources/assets/saturnclient/textures/gui/components/settings.png
deleted file mode 100644
index 93074e0..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/settings.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/shirt.png b/src/main/resources/assets/saturnclient/textures/gui/components/shirt.png
deleted file mode 100644
index 96a85f1..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/shirt.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/components/store.png b/src/main/resources/assets/saturnclient/textures/gui/components/store.png
deleted file mode 100644
index b067b97..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/components/store.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/back_flip.png b/src/main/resources/assets/saturnclient/textures/gui/emote/back_flip.png
deleted file mode 100644
index 7d8cdad..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/back_flip.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/cry.png b/src/main/resources/assets/saturnclient/textures/gui/emote/cry.png
deleted file mode 100644
index ac33bfe..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/cry.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/facepalm.png b/src/main/resources/assets/saturnclient/textures/gui/emote/facepalm.png
deleted file mode 100644
index b67f0b1..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/facepalm.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/giga_chad.png b/src/main/resources/assets/saturnclient/textures/gui/emote/giga_chad.png
deleted file mode 100644
index c0a166b..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/giga_chad.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/none.png b/src/main/resources/assets/saturnclient/textures/gui/emote/none.png
deleted file mode 100644
index 515541c..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/none.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/tpose.png b/src/main/resources/assets/saturnclient/textures/gui/emote/tpose.png
deleted file mode 100644
index 8a64524..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/tpose.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/back_flip.png b/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/back_flip.png
deleted file mode 100644
index f2edac8..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/back_flip.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/cry.png b/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/cry.png
deleted file mode 100644
index 2b743f6..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/cry.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/facepalm.png b/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/facepalm.png
deleted file mode 100644
index 5afc49b..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/facepalm.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/giga_chad.png b/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/giga_chad.png
deleted file mode 100644
index 9802c3f..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/giga_chad.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/tpose.png b/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/tpose.png
deleted file mode 100644
index c49dd68..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/emote/with_bg/tpose.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/hat/halo.png b/src/main/resources/assets/saturnclient/textures/gui/hat/halo.png
deleted file mode 100644
index cbdeafa..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/hat/halo.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/hat/halo_black.png b/src/main/resources/assets/saturnclient/textures/gui/hat/halo_black.png
deleted file mode 100644
index 244aeca..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/hat/halo_black.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/hat/horns_black.png b/src/main/resources/assets/saturnclient/textures/gui/hat/horns_black.png
deleted file mode 100644
index 446bf41..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/hat/horns_black.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/hat/horns_white.png b/src/main/resources/assets/saturnclient/textures/gui/hat/horns_white.png
deleted file mode 100644
index d411bb7..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/hat/horns_white.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/hat/none.png b/src/main/resources/assets/saturnclient/textures/gui/hat/none.png
deleted file mode 100644
index 16c2bbe..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/hat/none.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/hud/crosshair_range.png b/src/main/resources/assets/saturnclient/textures/gui/hud/crosshair_range.png
deleted file mode 100644
index fe1e8cf..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/hud/crosshair_range.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/armor.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/armor.svg
deleted file mode 100644
index c5995e0..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/armor.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/clock.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/clock.svg
deleted file mode 100644
index c928bd6..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/clock.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/coords.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/coords.svg
deleted file mode 100644
index 317f49b..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/coords.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/crosshair.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/crosshair.svg
deleted file mode 100644
index bb0cb50..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/crosshair.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/day.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/day.svg
deleted file mode 100644
index 9432885..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/day.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/effect.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/effect.svg
deleted file mode 100644
index 0e61d06..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/effect.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/fps.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/fps.svg
deleted file mode 100644
index 6e76d84..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/fps.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/freelook.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/freelook.svg
deleted file mode 100644
index 199e319..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/freelook.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/fullbright.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/fullbright.svg
deleted file mode 100644
index 3e8360d..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/fullbright.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/health.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/health.svg
deleted file mode 100644
index 491bbd7..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/health.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/keystrokes.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/keystrokes.svg
deleted file mode 100644
index f7e19c9..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/keystrokes.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/nametags.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/nametags.svg
deleted file mode 100644
index 876a0f0..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/nametags.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/nofog.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/nofog.svg
deleted file mode 100644
index 63a48cc..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/nofog.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/particles.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/particles.svg
deleted file mode 100644
index f4addd6..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/particles.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/ping.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/ping.svg
deleted file mode 100644
index 6eaafc9..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/ping.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/speed.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/speed.svg
deleted file mode 100644
index e8ff01c..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/speed.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/sprint.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/sprint.svg
deleted file mode 100644
index 35e91e7..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/sprint.svg
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-Created by potrace 1.15, written by Peter Selinger 2001-2017
-
-
-
-
-
-
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/tps.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/tps.svg
deleted file mode 100644
index f2ad6c9..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/tps.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
performance_line
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/mod/zoom.svg b/src/main/resources/assets/saturnclient/textures/gui/mod/zoom.svg
deleted file mode 100644
index 320a59d..0000000
--- a/src/main/resources/assets/saturnclient/textures/gui/mod/zoom.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/main/resources/assets/saturnclient/textures/gui/splash.png b/src/main/resources/assets/saturnclient/textures/gui/splash.png
deleted file mode 100644
index 84f2988..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/splash.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_0.png b/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_0.png
deleted file mode 100644
index 6653bad..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_0.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_1.png b/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_1.png
deleted file mode 100644
index 523b7a4..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_1.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_2.png b/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_2.png
deleted file mode 100644
index 354c1b1..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_2.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_3.png b/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_3.png
deleted file mode 100644
index da74054..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_3.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_4.png b/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_4.png
deleted file mode 100644
index f0c51f7..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_4.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_5.png b/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_5.png
deleted file mode 100644
index 93663f5..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/gui/title/background/panorama_5.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/item/halo.png b/src/main/resources/assets/saturnclient/textures/item/halo.png
deleted file mode 100644
index 341eb3a..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/item/halo.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/item/halo_black.png b/src/main/resources/assets/saturnclient/textures/item/halo_black.png
deleted file mode 100644
index c0d7493..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/item/halo_black.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/logo/logo.png b/src/main/resources/assets/saturnclient/textures/logo/logo.png
deleted file mode 100644
index cff8085..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/logo/logo.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/logo/realistic.png b/src/main/resources/assets/saturnclient/textures/logo/realistic.png
deleted file mode 100644
index ee0a6ea..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/logo/realistic.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/logo/text.png b/src/main/resources/assets/saturnclient/textures/logo/text.png
deleted file mode 100644
index 6fd0bf1..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/logo/text.png and /dev/null differ
diff --git a/src/main/resources/assets/saturnclient/textures/logo/text_big.png b/src/main/resources/assets/saturnclient/textures/logo/text_big.png
deleted file mode 100644
index 62eb09c..0000000
Binary files a/src/main/resources/assets/saturnclient/textures/logo/text_big.png and /dev/null differ
diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
deleted file mode 100644
index fc7fb33..0000000
--- a/src/main/resources/fabric.mod.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "schemaVersion": 1,
- "id": "saturnclient",
- "version": "${version}",
- "name": "saturnclient",
- "description": "The ultimate open source client",
- "authors": ["Saturn Mc", "ORUS"],
- "contact": {
- "website": "https://kleo-dev.netlify.app",
- "sources": "https://github.com/saturnclientmc/saturnclient"
- },
- "license": "Apache-2.0",
- "icon": "assets/saturnclient/icon.png",
- "environment": "client",
- "entrypoints": {
- "main": ["org.saturnclient.saturnclient.SaturnClient"]
- },
- "mixins": [
- "saturnclient.mixins.json",
- "mods.mixins.json"
- ],
- "depends": {
- "fabricloader": ">=${loader_version}",
- "fabric": "*",
- "minecraft": "${minecraft_version}"
- }
-}
diff --git a/src/main/resources/mods.mixins.json b/src/main/resources/mods.mixins.json
deleted file mode 100644
index 6cd236b..0000000
--- a/src/main/resources/mods.mixins.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "required": true,
- "minVersion": "0.8",
- "package": "org.saturnclient.modules.mods.mixins",
- "compatibilityLevel": "JAVA_21",
- "client": [
- "CameraMixin",
- "EntityMixin",
- "RenderMixin",
- "LightmapTextureManagerMixin",
- "BackgroundRendererMixin",
- "GameRendererMixin",
- "NametagsMixin",
- "LivingEntityRenderStateMixin",
- "LivingEntityRendererMixin",
- "TpsMixin"
- ],
- "injectors": {
- "defaultRequire": 1
- }
-}
diff --git a/src/main/resources/saturnclient.mixins.json b/src/main/resources/saturnclient.mixins.json
deleted file mode 100644
index 3bc9ccc..0000000
--- a/src/main/resources/saturnclient.mixins.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "required": true,
- "minVersion": "0.8",
- "package": "org.saturnclient.saturnclient.mixin",
- "compatibilityLevel": "JAVA_21",
- "client": [
- "TabListMixin",
- "NameTagMixin",
- "PlayerEntityRendererMixin",
- "WhoAmI",
- "DrawContextAccessor",
- "SplashOverlayMixin",
- "SetScreenMixin"
- ],
- "injectors": {
- "defaultRequire": 1
- }
-}