From a34dc4a4dc42130901f0321df5fd8ce2966518b6 Mon Sep 17 00:00:00 2001 From: austin Date: Sat, 23 Nov 2024 14:49:57 -0500 Subject: [PATCH] cleaning up top level folder --- .gitignore | 1 + DEPENDENCIES.md | 23 + README.md | 54 +- build.sh | 6 +- buildNumber.properties | 4 +- docs/NetworkFlow.drawio | 1 - docs/phyicsForDummies.png | Bin 51396 -> 0 bytes docs/src/progress/renderertodo.md | 4 + pom.xml | 85 +-- .../asset-gen}/symbolism-calculatorxlsx.xlsx | Bin {launcher => src/launcher}/Makefile | 0 {launcher => src/launcher}/src/main.c | 0 {net => src/net}/character.json | 0 {net => src/net}/combat.json | 0 {net => src/net}/entity.json | 558 +++++++++--------- {net => src/net}/inventory.json | 0 {net => src/net}/lore.json | 56 +- {net => src/net}/player.json | 88 +-- {net => src/net}/server.json | 130 ++-- {net => src/net}/synchronization.json | 0 {net => src/net}/terrain.json | 504 ++++++++-------- template.json | 18 +- tools/jenkinsDockerfile | 22 - 23 files changed, 764 insertions(+), 790 deletions(-) create mode 100644 DEPENDENCIES.md delete mode 100644 docs/NetworkFlow.drawio delete mode 100644 docs/phyicsForDummies.png rename {asset-gen => src/asset-gen}/symbolism-calculatorxlsx.xlsx (100%) rename {launcher => src/launcher}/Makefile (100%) rename {launcher => src/launcher}/src/main.c (100%) rename {net => src/net}/character.json (100%) rename {net => src/net}/combat.json (100%) rename {net => src/net}/entity.json (97%) rename {net => src/net}/inventory.json (100%) rename {net => src/net}/lore.json (96%) rename {net => src/net}/player.json (97%) rename {net => src/net}/server.json (96%) rename {net => src/net}/synchronization.json (100%) rename {net => src/net}/terrain.json (96%) delete mode 100644 tools/jenkinsDockerfile diff --git a/.gitignore b/.gitignore index 5d2b19d9..e3db7342 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ /build /launcher/launcher.exe +/src/launcher/launcher.exe /dependency-reduced-pom.xml /nb-configuration.xml diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md new file mode 100644 index 00000000..b0bca28f --- /dev/null +++ b/DEPENDENCIES.md @@ -0,0 +1,23 @@ +# Dependencies + - [OpenSimplex2](https://github.com/KdotJPG/OpenSimplex2) --- [CC0](https://github.com/KdotJPG/OpenSimplex2/blob/master/LICENSE) + - [LWJGL 3](https://www.lwjgl.org/) --- [Modified BSD License](https://www.lwjgl.org/license) + - [Assimp](https://github.com/assimp/assimp) --- [assimp license](https://github.com/assimp/assimp/blob/master/LICENSE) + - [GLFW](https://github.com/glfw/glfw) --- [zlib license](https://github.com/glfw/glfw/blob/master/LICENSE.md) + - [OpenAL Soft](https://www.openal-soft.org/) --- [LGPL](https://www.openal-soft.org/) + - [STB](https://github.com/nothings/stb) --- [MIT](https://github.com/nothings/stb/blob/master/LICENSE) + - [Remotery](https://github.com/Celtoys/Remotery) --- [Apache 2](https://github.com/Celtoys/Remotery/blob/main/LICENSE) + - [par_shapes](https://github.com/prideout/par/blob/master/par_shapes.h) --- [MIT](https://github.com/prideout/par/blob/master/par_shapes.h) + - [JOML](https://github.com/JOML-CI/JOML) --- [MIT](https://github.com/JOML-CI/JOML/blob/main/LICENSE) + - [GSON](https://github.com/google/gson) --- [Apache 2](https://github.com/google/gson/blob/main/LICENSE) + - [ode4j](https://github.com/tzaeschke/ode4j) --- [LGPL or BSD-3](https://github.com/tzaeschke/ode4j/blob/master/ODE4J-LICENSE-BSD.TXT) + - [sqlite-jdbc](https://github.com/xerial/sqlite-jdbc) --- [Apache 2](https://github.com/xerial/sqlite-jdbc/blob/master/LICENSE) + - [junit 5](https://github.com/junit-team/junit5) --- [Eclipse 2](https://github.com/junit-team/junit5/blob/main/LICENSE.md) + - [mockito](https://github.com/mockito/mockito) --- [MIT](https://github.com/mockito/mockito/blob/main/LICENSE) + - [graaljs](https://github.com/oracle/graaljs) --- [UPL](https://github.com/oracle/graaljs/blob/master/LICENSE) + - [steamworks4j](https://github.com/code-disaster/steamworks4j) --- [MIT](https://github.com/code-disaster/steamworks4j/blob/master/LICENSE) + - [recast4j](https://github.com/recast4j/recast4j) --- [zlib](https://github.com/recast4j/recast4j/blob/main/License.txt) + - [imgui](https://github.com/ocornut/imgui) --- [MIT](https://github.com/ocornut/imgui/blob/master/LICENSE.txt) + - [yoga](https://github.com/facebook/yoga) --- [MIT](https://github.com/facebook/yoga/blob/main/LICENSE) + - [MathUtils](https://github.com/StudioRailgun/MathUtils) --- [MIT](https://github.com/StudioRailgun/MathUtils/blob/main/LICENSE) + - [DataStructures](https://github.com/StudioRailgun/DataStructures) --- [MIT](https://github.com/StudioRailgun/DataStructures/blob/main/LICENSE) + - [Typescript](https://github.com/microsoft/TypeScript) --- [Apache 2](https://github.com/microsoft/TypeScript/blob/main/LICENSE.txt) \ No newline at end of file diff --git a/README.md b/README.md index ee3906fb..9c1d0382 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,49 @@ +# Storm Engine -# Building -## Windows -Install gitbash, choco, Eclipse Temurin 17, maven, 7zip -From choco, install mingw, make -run build.sh -Build will be in ./build \ No newline at end of file +A multiplayer-focused game engine + + + + +## Building + +### Windows +1. Install + - [gitbash](https://git-scm.com/downloads) + - [choco](https://chocolatey.org/install) + - [Eclipse Temurin 17](https://adoptium.net/temurin/releases/) + - [maven](https://maven.apache.org/download.cgi) + - [7zip](https://www.7-zip.org/) + +2. From choco install + - [mingw](https://community.chocolatey.org/packages/mingw) + - [make](https://community.chocolatey.org/packages/make) + +3. Run build.sh + +The build will be in `/build` + +### Alternate Build Profiles + +Several build profiles are defined in maven to support different functions + - fast - Only runs the fast unit tests + - integration - Runs the integration tests + - integrationDebug - Runs the integration tests with the memory-debug jar linked + + + + + + +## Documentation + +### Building +The documentation uses [Doxygen](https://github.com/doxygen/doxygen) to build. + +On windows, it's recommended to use [Doxywizard](https://www.doxygen.nl/manual/doxywizard_usage.html) to build the documentation. + +To build + - Open the file `/docs/Doxyfile` + - Navigate to the `Run` tab + - Click `Run doxygen` + - Click `Show HTML output` diff --git a/build.sh b/build.sh index e188ec84..1579c6a6 100755 --- a/build.sh +++ b/build.sh @@ -25,12 +25,12 @@ mkdir ./build/assets mvn clean package cp ./target/Renderer-${BUILD_VER}.jar ./build/engine.jar #build launcher -cd ./launcher/ +cd ./src/launcher/ make clean make build -cd .. +cd ../.. #copy launcher, jdk, and assets into build dir -mv ./launcher/launcher.exe ./build/ +mv ./src/launcher/launcher.exe ./build/ curl -L $JRE_URL >> jdk.zip unzip ./jdk.zip -d ./build/ mv ./build/jdk-* ./build/jdk diff --git a/buildNumber.properties b/buildNumber.properties index 0e12f248..adb720ba 100644 --- a/buildNumber.properties +++ b/buildNumber.properties @@ -1,3 +1,3 @@ #maven.buildNumber.plugin properties file -#Thu Nov 21 19:02:13 EST 2024 -buildNumber=400 +#Sat Nov 23 11:28:50 EST 2024 +buildNumber=401 diff --git a/docs/NetworkFlow.drawio b/docs/NetworkFlow.drawio deleted file mode 100644 index 124df2e4..00000000 --- a/docs/NetworkFlow.drawio +++ /dev/null @@ -1 +0,0 @@ -7Zhhj5owGMc/DS9NoAjiS2V3t0u2nDlzu3u3NFChW6GslIH36dceRURqMjNRF01MpP+ntuX5/SGPj2H7SfXAYBZ/pSEiBjDDyrA/GQBYYwAM+THDda1MTacWIoZDNakVlvgdKdFUaoFDlHcmckoJx1lXDGiaooB3NMgYLbvTVpR0d81ghHrCMoCkr77ikMe16jlmq39GOIqbnS1TRRLYTFZCHsOQlluSfWfYPqOU11dJ5SMik9fkpf7d/Z7o5mAMpfxvflDNAH5zifsNVfH780v55jEwUqv8hqRQN6wOy9dNBhgt0hDJRUzDnpcx5miZwUBGS8FcaDFPiBhZ4rJ/qGYHxDiqtiR1yAdEE8TZWkxR0bHK17o7LNvsO57S4q3MTyZKhIp4tFm5TYq4UHk5IEdAkyOXiG3nKyrucjtZ7q+CNoFR/mHmmZhgeVnVBsVVJL8XMcyRjDbLidPVK9bxHgmRQN5Nd84Z/Yl8SigTSkpTJDfHhOxIkOAoFcNAYEFCn0scWLh8pgIJDkO5jZZv1wFHQDzpIrasPmPL1TC2h0Js9xA3cPrPw2VQkEZRb0vLG4SKbZ+byngvFftqqTjg3FScfVSuhYgFdpD0iZwUiNsDsuSQF/n1EHGsyyIy+feKAegqhlkhbkcUsUTUkbLkTTKCOCIyE7DgVJScIssnKyYIWvGLs8JuaaEpHy1d+QiG8oI3kBe+UIZuXjjIC27fC5v/mSfxwnQgL/gxZDCQb+abIQ4xhHduQzSbHd0RzyjPYJne/HCIH4B5Qj+8jIrl7HH6/Ye/CKt5/sTKp3tNO+b1cfEf1HFgmDpO1xgYqpDT8ui3fhYEpql8cK6Via4tcFImml7NtTPRNQWOxEQM2xb1R2yr0W/f/QE=7Vpdb5swFP01SNtDIj4CTR/bpF/SWnVLpW1PlQUOODWYgmmS/fpdJyaB2J02LUCiVKpaODYX+5xzsS/UcEbx4iZDaXTPAkwN2wwWhjM2bNsa2LYhfsxguUbOTXcNhBkJZKctMCG/sARNiRYkwHmtI2eMcpLWQZ8lCfZ5DUNZxub1blNG63dNUYgVYOIjqqLfScCjNTp0zS1+i0kYlXe2TNkSo7KzBPIIBWxegZwrwxlljPH1UbwYYSrIK3lZX3f9TutmYBlO+N9cYPZurK/30y/Py2QavrzOLp/th55U5w3RQk5YDpYvSwYyViQBFkFMw7mcR4TjSYp80ToHzQGLeEzhzILDKUu4FNGCGV6qg5TjfsMZx4sKJAd9g1mMebaELrJ1IPlb1k/nWzXsocSiihKbjkg6INxE3pIEB5Knf+DM0XDmUS6IgJl4oTgaIY5DtprGA4px2QHut+1TgmkJXBOKE9HbuRCOliH6s5wllQDpu9c/FlnKcnn5hInbbqIIFWSzbX4i4jcqePRZH3jHAqAUr+uc84y94BGjLAMkYQkW4hNKd6AcnEKSEAB3e/bEwDXjnv2enxiYY0pXuRKRIMAJYHUXNmAzt24zV2MzT2czew82u7PMxWx29Vw8jXuzxY/ze/xz1rM0Nvuf1Nx/Kjq2StKZjqSB1xRJ6vNL+n7ln/35GFESgg3HFE9FBEEZgUXiQsIx2FTcRKtBXaX9W9VxVBksRyOD05QK6hNxRImYX9eG9ey+W+dqqLGszrFNUTVQDYszmFDnVDnDs0PjylW4emSwluwyVU3nco8lOAtQHm0ILBPYB4aA7T+kMMRIReR4EYotbX+9i7TXf0VYQY/Z98Sh4G4gwieM+9H+Mtw63zXuQLPvsQZtquEdTZLruGrVuGfHk+SdczVUk5wcaJJPKUlv5SAaT3jd07fdhD8/moR3zY5NXL6tOIaM754stbK5gFIUkG/4tcC5arCTS36dRu0mv6VWVlKkMeaI0PwgRWpeGK9zYY6n2NKR1e6T5oiqre7JUsutQzWWp3vx1CpXajF0sMbqnixNOVT4Ps5hDTEZUGZew4JSZPggl5RW132dVi0vL2o9Jj5LAMIjIgSLQTfxzQziiFOfJTnPCp+DHrZ5lygaHsI71yY+F5RKleWa7ruUTrnGXsJaar32xALWn6E3dLKqaIrodlUpB/ShilF55+R2rYpagp68Kq7ZuSpqzZlg3vdXu9C+KD8nrMh8LBak05bK61wqtQoVUuWrTfCHVNUdXXNSwen234dWbZV/wnKufgM=7VptT9s8FP01lbYPVKnThPIR2jEm7YWNRw+fLcc0Ho6dOc7a7tfvunHaBhu2Sc0LAgmV5Ni+sc85N85tOgrn2fq9wnn6SSaUj1CQrEfhYoTQZIrQyPwFyaZCzoKoApaKJbbTHrhhv6gFA4uWLKFFo6OWkmuWN0EihaBENzCslFw1u91J3rxqjpfUAW4I5i56yxKdVugsCvb4FWXLtL7yJLAtGa47W6BIcSJXB1D4bhTOlZS6OsrWc8oNeTUv1bjLR1p3E1NU6L8ZMP//6nx9sdqoW337+exXyj9++npio/zEvLQLtpPVm5oBJUuRUBMkGIUXq5RpepNjYlpXoDlgqc44nE3g8E4KbUWcwAov3EnWV6RK0/UBZCf9nsqMarWBLrZ1avnbNE9XezXQzGLpgRK7jtg6YLmLvCcJDixP/8AZ8nAWc22IgJXES3N0QxWssMbhMvumGsxr4JJxKnAGsc4N89uR4++FFAfD80dHX5cql4UdfIELRnZBjN85WA4Fb1IsEs7Ecp8pTIri7QjNDUOlTkEfRrBBLSaSwzgZZkLDLAXoDuGY+bxn5L4KmXO8oaqoRuaAneTSNJhTqslb/0Ie+AzsoJtmKrSS93QuuVSACCmocRjj/AFUgB3NRMJFtD/7T4I1FyfoMdNKWNiWnXCRsiShArCm1VvwctT0cuTxcuzzMmrLy+GR8//4+R4il6RTH0nTuC2Spg5JX3IqKutXCXY0K2POluDEBad3JoJhDdKSn1s4A6eai3hlaAp1fLeGoavEJPQoEbYlROQIMefMrK9vz8ZoHDW5mnlc6zNtW1TFDlX1ltQzVeHsdGhcnTpcXW+3rwdMHaZz/SxnOEtwke4IrBOYAEPA9hMpDDFyEzlbL82j87h6WkXVfxPW0BOMY3NouJua8EJqkh4vwydnD4079TxfTaZdqjF7Nknu46pT4549nyTvnau6oDzMcjbQLL/jLL+yk2g94323324zfuJWoUNN+Sjo28Zu9TnYnO+fLLe8OYdaF5Bv9EdJC9dgLy77fRp1nP1ueWVFWlCNGS8GKVL7wsS9C/N8yi0fWd3eaZ5RvdU/WW7BNVRjxb5vnzrlyi2HBmus/snyFEQlIbSAPSSQQFlwCRtKqeggt5RO932fVt1uL8gtyMybEEB0yoxgGehm3s5BHHNKpCi0KokGPVDwQTgaDuFb1zbeGdRE1fWa7w2YT7nWvoZFbr1GOSVAdpGnVNGxoHps32NVN6trJbUkkr9YzTw1dseauXWjqxnZ7sLj3Kr1Kl51B5xGfYvn1rGvCfekZlHQu2ZuWfvnhDOF74uXLu5dOrfwfU23JzWLUXuawen+R1LbtoOfmoXvfgM=5Vdbb5swGP01kdaHIsAhSR9zaZtO3U3Zmu3RBQe8GRsZsyT79fsMdgKB7iKRtdKesI/v55zP/higebq7lThL3oiIsIHvRrsBWgx830OBCx+N7CtkMp5UQCxpZDodgRX9QQxoxsUFjUje6KiEYIpmTTAUnJNQNTAspdg2u20Ea66a4Zi0gFWIWRtd00gl5hT2WBpfEhondmXPNS0ptp0NkCc4EtsahK4HaC6FUFUp3c0J0+RZXqpxN0+0HjYmCVd/MmCGxvLdF3TnB58/3F+t195aiEszy3fMCnNgs1m1twxIUfCI6EncAZptE6rIKsOhbt2C5oAlKmVQ86C4EVwZET044ay9SbsikYrsapDZ9C0RKVFyD11M69Dwt29Wt0c1/InBkpoSh47YOCA+zHwkCQqGp7/gzO/gbMSUJgJOMop16ZorqvYWh2WOTRbMLHBDGeE4hbmmMC0pRzpfc8Frw7MnR78vZCZyM3ha7p6YxV1JGFYgHbiR5DlYNYfiq1ASrCiPbU+qYaDCLbLINqiEpBUI0aek2J/CRIUX3fs7sQ+orJoe0fN9I3PBhASEC060cShjJ1AOLtPLokVwrH0U4LjFpf+UFwUYa8PKOEtoFBEOWNPBZ7Bo0LRo0GHRUZdF/R4s+vA6jaPHt7E3/+SjYDmfzpay97DuP4zRqE3SpCuOPXQuktpxPNeRQQCz4dublzGjMVhxwchGz6Bpo/DITA2cglX1Ip06NJXq365o3JbiwHpdirMpgdpKMKrP99ymHflO0Hx9/DZX4w6q+nh8OqkatqhaEQkHenaq0GT80riatLi6pzmYyhUbfVqG9/iR6XCXwEv5NOpX96JFZT3ebRKnSY1wnhwYthEeAoUgxy9iHObI9MzpLtY5s1OlqX711dNq/lxnpIua3GH5ajGaLc0muFBh0t914F25v9XNG/5L4a5awukcqcw/aH7MZvQ0eZX7wz1chFWqc8df5L19jrTDP7nIJx2JR5dwZ7vI7V9bTbkHLKkoTIb5WKhSGSyVFo5ynUky+G+TIs8SIokTQyLs5OWV5kA2CoQy5lRX3AKq1Sb+T3mHftCSd+j2Iy9Uj3+iZVvtfx5d/wQ=7Vttc9o4EP41nmk/1GNsMPAxgabJXXPNlE7zWWcLW41sObII0F9/WiwDRsqF9vBLjmQywV7LK/t5VtoXNpY3SVafOMriWxZiarlOuLK8qeW6vb7rWvDrhOtCMnYGhSDiJFSDdoIZ+YmV0FHSBQlxXhkoGKOCZFVhwNIUB6IiQ5yzZXXYnNHqrBmKsCaYBYjq0nsSiriQjgbOTn6NSRSXM/ccdSVB5WAlyGMUsuWeyPtoeRPOmCiOktUEUwCvxKW47+qZq9sH4zgVx9xwf/PHxWffefz76kf4XTzcPE3Y0wel5QnRhXph9bBiXSLA2SINMShxLO9yGROBZxkK4OpSci5lsUioPOvJwzlLhSKxJ9/wUn/IckbMBV7tidRDf8IswYKv5RB1ta/wW1dPlzs23JGSxXtMbAciZQHRVvMOJHmgcPoFzFwDZj4VAIR8Ez+CowkSOGKb1/gLJbgcIOfbjSmFWSm4IhSnMNq7AItWKuwfOUv3FGTP3n+34BnL1e0zBtNutQAL6rLrvCPwFy1E/N6s+MAEJFOiynMuOHvAE0YZl5KUpRjIJ5QeiHJpKSSNpGCwO/vGpNVMP7jP2ROTxjGnm7USkzDEqZRVrbAGMxtUzWxgMDPfZGZuXWbmnXhpnn4p+oa1OBwaQOr7dYHU10D6ih8XOBdS+A1zjkh6QmtGlETSGKcUz0EDAEekq7hQ4kQaK0xiZKLK1ekN1jdYbM8zkOHVti86Ghmwo4HHjkkOLhHnObhbqScvXLYEfhEIiYrr3HSTqDp2GveAOd+w1/QbZU4PAzCV0RRneRZjju1IeiU7oES+tB1Ihbk95WgJqm9RKinl58rd0DkyHKmPOz0ceePuOO78QdvrTvfxVe5SLOwcc/mOdsaZYAGj9mxzfqdOz5W8kds6eXrs8UbekeSNWidv8Ebeb5I37rdOnq+Rt4v6J/EifbDgmX2UAECb9HZluZP1VmTOcveJK2s1gGmI8ngLcElVIAGVrvNfyJI6MtCcrCIojdlFNcotPkEt4OnYPhwC1H1QnzIRxKfLEXqjQ5dnSBJM3NVXPBlq3E02sYlGR9PJ7eBlqIy5bW1IjTSkig2odaS84aBjUI1fiVGN3JaRKvfk7htV+1DpSXHpWz4zBCWLmUBcaK7Ggqi+rHXkr8DnzCnJrtVD1Ox/TKQ26388PV2+QyKGehRJBZMfKYRxrhMA11Isp3EEJ5FMlKGQ7Tpa9uxsbuPbCKS803mXZzggc2CKrjcTwOAYCmCLLEQC36TyMUionlu+YMzC95qN/Pe48mXDaaRi2Tt0sYbiiddoydLTE/BuOg5/rAfdze6GerbbTaRGo7b9hp5adtXFtg6VnsjdooDDdvodRPnZ+0sDQw37y9eSr41NX0Y2itSrydfah0rP14ommgRltyzchEyCMP0bwTNb/iaiml3+peJKqS3DCOLcOUkRtfa/1p0zCIdREc3u8Zjb8kcj8/8T146rtPWcnoG3QU2B7c2f0y/e9L53j+6ur55+jh+fki8n7+s6AUoHzSOeqWhk7LBx6gJJTwUv0aY/6p5xCgn+LRZI5mmoBtPtYguJNzSYbV35mJGRzqZjvmtXfWi/wfKUESo9H+tKtDEadg0rPSPTV7iz/QqpgzHHqeOM8THmXFukYeRITwU7u/QbTJuNUOkpWXeXfttY6UlZtVqvbwRnXa8/iGRN9DW7LeiZ4ltP6RFNGp6BuNqaNMwZiJ456h02qi1x22GjWrbPvcXG5I0bZu+ljmBTf9Qbe2rTrK9BSp7u/mNsc23v/+68j/8A7Vxbc6JIFP41Vu0+xOImmsdEJ5PU5jYxW8nuy1YvtEBsaAJt1Pz67cZGwT6ZyU7k4sQ8RDxAA993rn0aO+YwXHxNUOxfUReTjqG5i4456hiGbvY0/iEky5Vk0B+sBF4SuPKgjWAcvGIplOd5s8DFaelARilhQVwWOjSKsMNKMpQkdF4+bEJJ+aox8rAiGDuIqNKHwGW+fIr8sYT8HAeen19Z1+SeEOUHS0HqI5fOCyLzS8ccJpSy1Va4GGIiwMtxWZ139sbe9Y0lOGLvOeF5+nhFrizz4Q80DuNpfKedPh7JUV4QmckHljfLljkCCZ1FLhaDaB3zdO4HDI9j5Ii9c845l/ksJPybzjcnNGKSRJ0/4al6k/kVccLwoiCSN/0V0xCzZMkPkXtzqJflr/MNG2aOuV9gwrCkEEkN8NYjb0DiGxKn/4GZAWBmEyaA4E9ie2LrlqAlTvhRVyjiKhKKx5cH8WtujsuFcS44CwiOUMgHPhHAZcN0n1IaFU6P3zz7dpbENJUnn2SPwlA6TflngglinEZhP+uRxY7fPMxYEHnCiHyUIIdlN06ClN/yUEgTjNQDxJ40RvMI3MPdAIbPwcz5HX6WLb3j6sHKypWyhE7xkBKacElEIyw0LiBkS8RvyxHXNke9zbd7ylV1dGS8pcSUa+SEZAbqB66LIy4rq34Fum2XddtWddsYQLptVKXb5o79we7t3zRVkPo2AJJ+XJkD0BSUhNkK0/IDYVIhTlMRV/g46So2cdWdOSvzu4h2qOqIBB7X1BHBEzGCQDXgwetEikOuyeIiIE2Va3fP3KLOAvTbAqgzK2NOjXf31KXdJ/SCPi0r/V7TrKgR9dOzYtVpK0+pdv90dcHih9nx67l3823puTtPDStIBYF4WV0oAEFS4+UhErxDu3v9prXbOricbVJsrcZAAJLSO5CikGI3TYrd+jjQP248DgwOceBntHugNx0Hjg8uRyHFatrl5FpRYAUT7HCw09jHCe5GmHVTnPBn7MYJZdShpDvM55lupeSz8nesNW1UevtrB10z3hk01jNwu4fpUD38lILrWvPF8aF+UGnRjcYDx6GCAGgZ1EjLI+sfnV+Q8evlX8439BCf34VzoNgeFjpNl1mnaYucIit541QA5qLUX6OX8+BwtPhQ32GCjxGLkcOFJ/rU3VVr2Fh9imEFWFrXFpsCR0sMH1Hm+PJSOyBmXX2sJ15VL6ZDvOyikwnyolrLkARZq7LhYG3/GKl+nUCpNfA4yz4bB8rMbbstSPX3RKUsqI1YJ1DqjEFLVapxpNQSfRUxNDrh/4qRZIQZCkjaymAyIUF8Lm+i4sACMVZvYAEKeDXia3f4eYaB2N+GxKyCIAYULXqvzjRMN1RWxNoeUWB2DBuFAoZsYU6BLCmG1+i0wbAqNiYbmE2p2ZjUaYJ2xlQIqlojBVCVtzSoNg/VvuT+NtTkrxWpvUn+m4dKzf7HM8fBqZi9pCLyn/H8bJbgVgaSGjM0iKmag4paf6zTsVJOnWUIAW3nZPPu3Q20MkWHjKiyLA1YXToW66y/l6RpF6PPmKkZ3bIDHEApdq1mBSwwbUtYfQ9YtUYLQy1HWhNY+60DSy0Ccq9Q8gNR9nbHA02IW4HH/rFjqMdnK7oMFWn1em219Ojyv/ub0c2vywO3gS0ioLUHUFN9FzyMLfTPFUPe9Ob1yLKe/77XaG9vWhq6Dq0/qMijgEjtTVnTPFRAU6M46xxg1de2Id+qsaABOaos9QJJUguacmtAvI/7y3piJSLqGtQEqCokgoSofZu2uuJBw/4FaJe01hc3jpVaYf0ZEYpccbHsdBcxdbHPp/PHAE/1+mOg27R+K774orkbYDE9GIhSJpVar6VBOCNVzTvtwmdXsHBLV5Y5gu9+rD19LU4caD611TVpNU5/31jG9eIxGVwfvRiDf9PRWWxMgR+G2MfFhwoDAE/vX3xo1PkyAchKld3TD2G1nYYYNc4xgUhV2T39EFKKqTcOlTrNcI3nXHBJHThqtT//+BBDSv4BMbSr/IN/3fxsUrav8ONT5pf/AA==5Vhdb5swFP01kbqHImJCkj6mSb+kTqqWaVUfKdwEr8ZmxizJfv3uLSZAoWsnJU2rSpGCj+1r+5xzwXbPmybrCx2k8VcVgegxN1r3vFmPsf6AsR793GhTICeuXwBLzSPbqALm/A9Y0LVoziPIGg2NUsLwtAmGSkoITQMLtFarZrOFEs1R02AJLWAeBqKN3vLIxAU69t0KvwS+jMuR+66tSYKysQWyOIjUqgZ5Zz1vqpUyxVOynoIg8kpein7nz9RuJ6ZBmtd0kA/pDzcM51cX/ckdv709ze/4sY3yOxC5XbCdrNmUDGiVywgoiNvzTlcxNzBPg5BqV6g5YrFJBJb6+LhQ0lgR+7jC0/YkyxFBG1jXIDvpC1AJGL3BJrZ2YPnbNIurSg02tlhcU2LbMLAOWG4jVyThg+XpPzhjHZwNhSEicCXDJT1dKw0lioNUFSWYlsA5FyCDBCNNMKjAfs7PTMla5/TZvje5TlVmu54LMjtZXFOS6EBmC9BcLm1YouJe5YYqYyqtlMZkwA5aJVswA43SPGbZFgsFJ/mYe5SKYBPcCwI1WgCHm9IjCL7kStoimNBxvnQv4Im30AKmaaDMaPUAU4UzRkQqCeQqLsQTKEML0tq8mV+Vviu04+yYPWdUhUtbiMckjHkUgUSsae89+Ndv+tfv8O+wy79sX/71dpzzu89xb9gmadRJkrsvkgYtkm4q738rvL8zMweYP+jFmYAFRSDeOH6CJhZO0Ks0SKcQTal271dv1Nai73Vo4e1LCr8lxdS+kA7s2iFz/Oa3iXX4toOqvX2ahi2q5vZ9fmCqvPHovXE1einD6Q9+5ZC1nVbP8XJbR0RGQRZvWS2zOkTaUIJ/5DXGSClysl7SLtopNq6s+KewxJnrDOmRCB1QeKlMGO8u7fsnr3Fzf/CWEo0/TuaPD+zmkw+U+Yfmqjxb1si65pTlrlrQclubXPeItuRf3uVrYCF4emknsfNXgvuicG/7QmBt5ej89HhS4SRUAllGJ3qMQ8UQDyVG56EBOuhcyZaC72HPto8zB3uyietQjnUpt7dNHGvfNIS5piUKmjeX9XPmJDfxjVZGhUp8Vsm6vr5vLFn7ogMEhEh2lsagwZFgnOK+wEmtWg5dfHx66cZ+Wzp/N9JhsboyfKyrXbx6Z38B5Vhrb9owFP01fGwUEsLjYwuF7tGqGtNeXyovuRB3jh05ToH++l0TBxJitk4D2qpSRZNj+9o559zYNy1/mCwnkqTxtYiAtTw3Wrb8Ucvz2h3Pa+k/N1oVyMANCmAuaWQ6bYEpfQQDugbNaQRZraMSgima1sFQcA6hqmFESrGod5sJVp81JXNoANOQsCb6lUYqLtB+4G7xK6DzuJy57ZqWhJSdDZDFJBKLCuRftvyhFEIVV8lyCEyTV/JSjBvvad0sTAJXTxpw/y1XN3c/42n7w93VmMY3j50zE+WBsNw8sFmsWpUMSJHzCHQQt+VfLGKqYJqSULcuUHPEYpUwvGvj5UxwZURs4xNeNBdZzghSwbICmUVPQCSg5Aq7mNaO4W9Vv11s1fD6BosrSmw6EuOA+SbyliS8MDz9A2eehbMuU5oIfJLuXF8NYyJJqECWTTjTtrUE0xIYUwacJBjuXHu5HOzcZ4JXIqR7A9zmMhWZGT8WUkeRQBTV413Co7UjObo10Up4rphpXRhZwaYvRNW5M/u8O+ZADVXdAZmS4hcMBcNF+CMuOGhbUMZ2oAw9RPkcgWB791mgn0Zn3j6nCbTNjK2zKKZRBByxuj+PYMCgbsDAYsCuzYDeAQw4DT71Bu73H8nk492XbLiQ+cP7gyftHkIstD01Sf1uk6SelST3WCQ1s3S4NjlileQ8mJ0Jo3N044jBTEfQZFLcRc4NnKBb9SRWKepiHUCNHcf6vaYabd+ihn8sMfymGIyuX0TP7Nuu5wT17cWzONdC1SF2FytVnQZVU5APFq+emiq/33tpXAX7cxx3LJJoEtZ7mIIE9zrdYFD7blbN+/K0psmNSBZvmC4zPUTeUJY/5DrGSHXkZDnXh2OnOI96xX8dVvPoOl19qUnu6PBcqDA+3KugPXiKw9udU8rWfT1vg/4zO7z3it4Gz81Vv8lVHoaQ4Ul2PCaU5RJeZMbPGE2vzCIOnv3uXzU6be4PGiLp2kdX9THNdJGCeumSHMNkRVmPJ7A8LIqTd7wh4Es4sdlrjv87wXk7RziLcJ5NuKMd4coPMhXlgEGIZGdpDBIcLCxz5xp/JsBBEiVkdp3rDzWmyHybwtl22xML1ywX68JxUE623lWcVAolQsGcTYl0a5A3q18/aOoXHEY/vN1+/lu3VT6i+pe/AQ== \ No newline at end of file diff --git a/docs/phyicsForDummies.png b/docs/phyicsForDummies.png deleted file mode 100644 index 5ef74fff8b5fec09c8e36b40800b86b7d74343d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51396 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

jPA@L0jWAntBRbTOEzRZ@I??0uyo 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

Q5 z*T7NC_&G#FH!Y3#|9Yx22NS}`gW?4_q&Hck8lmsuFtJv18B@p|TajhkY)~it+`B!` zH!Z>ol_pczzE8F{My{r_X~v1eQNZSv@^WWsOlzeX;AB3Bw!i6;4az?KA;~wh$2(WL zCI7Z+hY2UiuBQ5svQfkLK2DaMli>$ybp$JN3(JDX{c`lga{4Jfg2AN7h~q{kWjjOK zUScy8TsmHWnU*C<;mRqL+1WR(xhfSo{$fL4CBqDfgYc0pnEOlNQ1mQt5g z|8r)j+;v{-hI6+*K>4;S?Dmw05bM+2y&Ao8xYlVXoqEp* zZCqSdk*sS*WSMo2Imo>0-ZylXQ+=g$8VtB9CEDxwu~SsF!mpjg6NhgRtrqhtth@!7 zmU$uF(q{V7X9BX%V*Ql1<)q$`qzL@)dFu`s+g{@x;$dOZ!J8K*fxz1J$Sj9d8 z=lH$$o0Qn&`N1r>Y3A?51zz1tJM1 zr^CAWEm^YqrMypWFUN9u7TM=UKr0@YV&E+EV}`DQQByv$U-fq+N5yHDohM{gvIt23 z@}JL>RU65}JZPzky%*S=5{KcUi&qB|2&();6B}h%`61}E{n zVN9pfqoo=ntQprq*XVI`u~V-wvfUX`iE{+IcL5=WP5?cEM4I`wASlG$6Z@i8Yc+Qn zA?egu0IEJyrl{-Uf2Fd|s5*!0*;egjQ48EVSEOseNqeFidHb>^<_vUC6L_&x*>3o)kIQY2dL}XlmP)(0u5u)=N~6H1C*(`}k3&wm z*rXAtXZ8mguN==_mYLAPXOD;8g6%lJ7UK1k^U3n@;UOOY$i@4VsO|g~)B0BNer;Yr zBW&iYQh6ICXV^P3KoICmd``3tNmg{q!Dh^Gh4fl)PNn&$12gyaSuvnLNY7K4N*x|U zxvvZQ)PR_JR`>nmH@%cj}fMF?;CYJYNiJ;u1MV+N!6IvLUn{`3zw%v)L?zNtt5%W$9|YK<@QEqAouln(M=!$r)O5^aqO>yVJ@)k_oqO*@QbG( zHIQQWVm9)h)jk2~npzN+GXu6c0*}i!yq;Qu`vB^hEIiL!q@I&n zjX5;ntOE%*$BPGLcEmhI)~I4s8m&1SfG0Hrzen3|9|F5(gbM$}CHQ^fYx1vFXTIzz zpP15U^#NSS(>AljX(mfC0Q4(Gucv!ar&ovFA>PrN5mAPV?OAkZ-!*o1-vefEqbpm_ zA@uzoSJf~TD6_-v9)#vT0W6?~$jfWjeTGXlyipo&lceI}&$y(&%OWCm|WU4|u|_^8^!^*H|_sj}~_kAz34Lbcwrr(<}f5zvIz?fjeT7n-#O2%TfA ztB;EI(LD=0b$=UrH3o+Q`V-9Z)bmtPUL#|JocK=sQwxaBo*~&wEjJ z3B8&)!KD7c`nrH@=0ww_xOx?We$+k2INK=N+tj&P_#Ltk(n%_n6Kg|Vw> zeNEGn5m+MO5ZWa4=$(}o6YFd6bjT44^gKIqAGaLSUYH+s!)KT{IN@VFeK$zTC7gtM zzVnap3s~_dmJtFaMYhqc9i!^kq61I5>EQB&U5_tH8I=D#>G^WpzMNv7dORVzJl20k zEW7Ls(@@rS&2YVNQ==c^P`zsiIk^a58Z>i?QB+pYES-4>Br}6B2Q6oaj%*+&RQSS1 zEXwrdPW{w<&sDzpI3go0yvs5dZHykz;7HcnHxvP0sot@xX47s5F{2$EVoyB96#3{@ z#ygMx4UlYD2XBc_ZFQzjXdwEC7nfb{nzHAz7(q@qX%ClKcaBwMQ{3%mgKeua+@qX#W3h|dI;K!~82vlr z86tYlNPivnCnIn%{}P96UadM7P6J?EfLhNT|1q-pI$gf=0ElWzmo zU1le(b15eQGgkmyRfPyZ3sVG7%%)iet_w$^rH7p*X8beF z1e`nOB5_Q;@YSU-`N#ETLk!R~Bog4djh0N7&uv^{U}#&a0x~WIX!~L+VP1IrS1Z~p z2Y?TNL~1@+3bMc=?F%H#T_r5FgA{?RMboP1$RlN5;Pk+qE7Yp0s&|)*cD@ne)*cBK z#{@{p2SC<$ZOzyBteD<7(LS?M!Z#1l4-hjzQ}9EC3=a%Z~vZM8!qL`jX#1ZWkL*qNt9A z@K-_K;Wa)yIS97-01y|Y@8kT_sOU=lNFtLJoX_mNnS3s&1~jFF%U``cn|Ul}2Kg=e zjL#2ou|A1^HCj*G>Q3LVIN0Ynkai+K8oFbcx|c9Yy9S-t*RC@w{obqh_1n%t(_<_a zsn*7)fAHOQu?p$En!wlukQVqa^}k}$>}92zyb{;-WdTT~+Ci;GDM=XQR9yJQKY#{~ zOcMj1}OjrF$#N&tXL@*8X8vy$Pj~G;Y1HC8xFWlk#yTI>A$*ZKL)6Oq<<+EpJ z8V>0e6bJ6*^=&^cc`H_|ZYQIDe;qwmmM#qY{@|Kh`Z8V|9;7-lT$z&;70RguGSv|E ze-TB~O_oMOamRg5-BE<1yUW3G`=iKt ze2c_&&?gR%&cHG74Yi1LzpQ*!R5u#`HY^ zF9puc0huT^VhY)rebNK?ME_qk-utds_%{wf{v-y*8%5p`N0{{s>- zHEadaD9f=Tum|uuy!Iai1?XSUj@UVX2tGE??J!huk#DDVpAkVr4jGn-QZHhcPjY6; z0P)lAEsV?je*im|PqLWVa4#V6XY{XG#rAl14uwz*Me_jo-N=6-TX~(pgG-BqK^A&5 zM{46mXrsLUHj)oa)=?MV!T$*BHu?VN1JPw~{s-p+{QZAZSy*I(|83dgrkCp?eE<>i z=fPwbmU}01%N|OiMqJ}n*H;G?e1ShpzXPO$eE@ETyU;5ulG@!`a)BHbASx*OYU%E+ z?zNc~jhV&>E+CR3*RZw-4QUX~z$TO5AI&v2Y>NO?UVS0}CDR}vdCK05TxdQT3&?-u zZlbQv1H%!RW(JuuUM<@O1EU21X*|181Z)+wO?0_b?Q;<)mxnh3|BKj7mm@`3o1dSe zC8)NsT-P-bc&1#`fEcpk1!(T)&1L}HvY<8LGd-udw6tfm%%S6=%6mR}-_`U{iD}?l z01$Ues%`4QBax_yn&_uZ4y6Y3KH{B#N`cdFA4|ZSMRs$p3xo9P^(_r%K(=uR^!2H) zP3f3u&b5ZrFtumm^jFBv^P*oz@$6(!v1` z9syPF2si44*!^@n)}z~}-*SlQ2kaB%FB0kzhH(b_9cjL|#V$Do#;*dq)<+vrk2LMU z`xK?)cMidULB1@-L0svLS`fM!otvz%-D|YN)$_=Gwu4CBTZ~g(+!U%Z;d8~4^Qo>d zua?{#UWFhAEsvt3QqaOTPC|L{&C9QcXZw;YFf+1Oi7yl~oYf-n|6JO-45ZYn=(yop z>yeNe5k}!?NIm9m;m!+B4$D7rN6MbNSG+d3`tb85|FG>;`tMWwW6C}yt2_b;hmv*9 zYjjs1lL7P*#l-0MH1&r8;LpdJyxM<7X1@H~LeDHNcfuVLdvol?{;W`NY@U3+b7)46 z9A(o%`4-XzKcAeBJWt$O)iM;uLLK&Miw2t*r|M->El-9oK8@eo_)dHRklF!lwpLwc z+ClD!8HwG#No6rEybPBdtr5DF11OV-pKjmnZ1|q?SAAV?e~URq@SW``Xk4Q;>Z!VA zfs=i8&y+jWl4>OI|I_}8#l;5O$^W1?Cu9aQENK>}Am*r!2wM3Tz?!uwjBMP0C`(u} zMv=bz(_N$g^?AB~XTxU&mHOPYoN!@_;hpp;*-MZ+Z}lHkHyKoD!FtP)?~SPan!W7; zu>M}eMUOKGarNy$4nyxz9!;#h^P z1BqnA{~3^FB0o`H4wr0ztE~fEEIF5l^`iWE6c()2a~tSn@iOqv9F<$zWUJ0_hNUR9`-*(J-9Kc}QZMG(H~pAjzXKrPCMd7F^{V?Bwwjdt z=b09pWk4nxzG~kUOBRT9bpdDM?}n5URdhIBdhh2%=%z^MJZRV>7c4+U4MvNDw$^jI zSN+sSd_<9tCNQCQsTF-|0da%<6UPQ9(y(;DP&%o60*QmXP_SvX0iM4|==tTg2#Ap> zBy|0+iG?KhKj}YmyJP2Iy<)4;v>T3`GAbJXuB^K=3qIP=(A^ZZlfB!6W`}13;U$7PoB5CDy~ z{A?#f^BMZr0EjdLTe_vTo05rNI{~a%0GKrsPYs>E>serJ-r{p2IwRaOyQ4v?%y8pA z=Fy{{p}&>?yaXul3Q(^N?5XOv~VZlQsye(T}$ zu`s0)!g>$#)y~nG5M2)^JPJ#9W`e0Sdgzv8s?GXLka&WV*if(GWHBmz34y2NFNwOQ zv|mMk7^V#^LVUVY`+{EmRjP2;5aTNC?Z(86%+tl(JvaJ<^zPRWJ=sB9Sn#>7(a(>j zn*!~!k!(~Vq?aF}cAOFReHGun8-*PJaS$u4*M$6XljvEuNbmy}0FXo!V!Uo{!A`|0 z?p7^5Vs(F|P0|9F33ZjU%I|Ac*q^E|v< z;sJzYV?%5=<&}~y&uX*6{8!ev9ju%V-1-trs|qr*MP-|-JQ48QWd?mxzpNZgg|dx_ zKU6xrs8JobesVqOPtn>m&HSZ5JaZ#H6T5DQ>|k}}1pB{AiImiO`eAe-qf6}kYULv0 z%efB;P*?FY3FbK|0{Q~(F{rwo2+_1Tf{*0`SU$S|117l*NTrqlR5ey{rEA#Bh_|PE zCjGlOZa%uOX^8LRM=V6+z0RSsXPWnKil$oMyKkX&Jk+s==8y~r9 zzB&0baxHQ5VVJd#FHaG;r>O4p!HGdEsHfC)OMi%8e|#1e^Uw~C3NO8{5O6aip%>{l z#tO0WQsY>O-Qi5@b^DulXR+OsBpsgR%*(hk|5;ezId_DSL)uzvmt%-}Q}v)Mj9t3? zxtj!JY07oOM1|V$=e;`tDEp;NR-c~DIE>l7xSdr$AOU6^Xp>e8>t=tEHqj#NkR{Jxy0rmyPX#alh3tYAY&%R~;ZQd~HJLbwau$pzjhKy`JPOe|?~o0sfj z7Q`Q^@$Jn+yj6&fG|_N(_30i~sxQzs@t37|l1A){`58mMq=tGXm#_}w>LfK01N@zK z2F~@LV+IxnENKx_YotMEmiG#<5D&Mrw=1hhkpx~wS zfp}BA;Gix*z%;r-w505XMuft6-m3VT+gURDsxU%jG2>F?@Nt)fFnLhu2#)=(ym5Uo z%!y^GUECv7uUGKqTxcQ52G|4Ij5(I*-^2lZe82_M+A?Oe#+lmRX*-<}SL7oR_q2y= zWFgrkE1KTv9f!h3TvZLyN^#8=O=J&4^hOTLyTbQ0kO_4NtrhC!eCfKvCra3ckE{X! zv+FFY-DqQ<&CeIWrk{Lkv3<)EY_L0e`?5y@f>Zv`A#v)9s!*@49Q{$+F}Bj+P${D$ z%qe%zazT<|<5Jbh4a#2-mzN!dHbxA^_0nG>YGXWDRU50Nrm%+tqU_s=mch{{*yP*?h|Fb?_r%` z+;U#sE2sD1MA+ky_e_NX>CZxpdpWhp9%EL5OX(ULXYbX7JKYm$&yFc?q1M@s%UVCPHO8KjxHfo4us~S`w^4D$W4ZKtr_Dg+t;bZ&WMKzr|XItRJXtOnj#R3 z<$X$?joVKX7ttThH^lAF+4(Mohnl-2T2o4Uc(kr#VA{77P7=oxDX8GBhA5xaVTkU~ zHU4xXJe|{WHn6+kTS!yyk_|DFdfs>HhGnWtu?MId;(|+(Wm=t64+v99$K*Zo?gwZE z#>w z%dQcW6Os1|5b-U6qI11G8?XtFT^b^1#-_^BtfKl{IOq(5NotDB-4@Zk8l#|Pa>6>I z0uleaZY(;yW{prC>kpuN#F`A^8>{5x4gE5|YU$@Q`P{Bmdqc8d32maXlB2tezzOj_elp&=Ql+t+ zw7wb=hZ$RmmBxBFG#+-tX{>;BW7i?;TG#@S=Nm;l9(hmavTsts`9qJ6`y&cyFOIM3 z6>ORHg`Mw(HnQCVvqJf#J$G7$FNVBzI&ccQ(+t2oN_vrSf&F&Ul1C;NGA~rT=Xf60 z4KkA1^FbKp(x&}nTQ;jJ%Vb+1j$BtODhB_KaT@|k&@ zE)9BTrTbX-3Io5Cmhy7Ue0PcAG_~-{s*2Q37PQ^1n_?;&0~OT^L744JFt zT(CU691DmR5qx*AR32WoX2}A~RkX^AkH?pRwLGvy+o|FgP}54ERM=)$tfUNaDa*o`#iHk>zm5YDa;JNe z*)A~SbX6QHW?~J2fxXwftT&#KN5j?MKz*{h!XMBxCmtT(FS3^(>%cAjWUY*&@H;%V zNQryeMKxY$t2~fv8*p1(?HtW-5<1g&dBCYXTMYx^lM7Bg%ecw2aqoK5TzIzF)Vco<5U$v=$_&lcatKvd@7Vi$!pR zzljE!4tKB@g7953>V&a4Xzr0(B{QY;8y*sE3(8}bIItA-BNtUoisUIG3PBuy|<==m=mZdn)DE(%5 zjb`r~IP2M9M$Ad;QJ+0Yax~qMv(;IR<25B<3)wjB4W6Cm6$gdOs`*zWp*3RZh1~ct zvOY0UCW~)0I^rid zcEF_O#LbWPz5JGn%Z{adq^VfRHE)qO^479)#^BOi=r+zhb%0gE*almTFz&p0^DIr;v%sWum!XgV^~Pdk*1WsE-2tQ{F9d6L;RK?-g4YO zUXE5yW>8>b9jJ{&K)hlf-D-m$DYh#&eX@G?GCW7$E1%c z$f=-S>NPj}>9Ykm#?oui#l(&wx`QwXpV$7MYLYV730JBdDB*}P%wbw;pMlrwKW?xS zu}a)FiBs&o!(UfsaHd67&+1%K8*p+a~b5=;6>o*{xTG?sCZ=W;8la|a4VUxx#M!q7v_CHBWl`I%r9%?K`~w=3#~-Qf?)p7IjN~yn>nw0; zLwH_)b@2K$UC*k;l*z_Oyb%3L?8H6o$9xC4qzZp;-S#FsgHA(qw!=V4 zV42{qRg;nN)|V~ZyC3trPQrR@LX{3Yl6Wu`vV#@7jSWa#{8e43D-J}6ftSUodBUb| zlGH_u)+eWrRFD+*c-#k0S~;R52V*o*!O)-qrs}vo<_SA!ZdiYV$JA5gZcPBOB2)e& zL&bsGT%#=y9%ze0oCM7ko?4nEgVMGd2lh?gyZ;c9fj8v;pf6|%&v0?h@Pu0g#Z~T(JN}_kJ0cms(=bLC_wvvy*t(kybEY+0%4#@-Ug51qTur1 zX2!22^5tuQ-u%h*ZPee)bpG#6RO}6@oBMk!>Y`2$ef6Ik)m+?)BSvKtLN`RAY`upp zY1e%~=plV8G53xUiU(M)S(~@Of~|32m+}9h0ajN=2}Q7@4Q>9q*!bl{{vPd&6Zq-oxI45yldfVLLrFUfdNbSbo#r*?` zr56TiVSgh4zLDLZpmqhzWTLa_0#}o{m1*8)JBq< zq_p;OQ~P5e3jHHg6i|4Z|6T&K3#Hk!Ck8$kk$ z`9CG0=5)xRINtJ|$A@JZtQb^Aw+&ZPZ29}P*`Fbo_2Y>@mNn`pmtT#>DS8Sn!d0TP zjJo?wZr@W%*3HYk9#W?Ua3vdT(J1pwb#D8&MGZUuxv-9w57Oh)_&G-HjePz)r{56Y zLK55L1GF`)mS2IYngWNmDy)zO#GhBKrYS(Si@Da}zXphTvw)Z=HhT6`+DQcILfore zNo_VU=7d)x2aaBKDzs-llw!9#KIQ?U@j3j2>NA5zFVz15#3r&7Ww1@8+XCyUd5dY}R;Xm8sSJVAl9BT93ib^mAR0^xVDnY*$81+jDb#wQ7>)HS!8@-Lg8^k`}qt^GY! zjamKlR+F8&Q_JMZ?2+^2avD|@bL7!x0_ea!Qi&r?C4hLhQ`wOV7(WtZVg^I3p22Ww>G6ZTacl~JBf*~G29 z?>7?eW@>mQ^6m1a_0bHAk(pogoKM91V)U@4p?>$wprx<%CZf<^{}~8&Itq3)~QjcdqRIjo||YWICjdc`_yB;#qj}K z-LTGZ)H5epVW_;%4gL?3zcLV@O?UYxCgOIwoo>XhJ=ju^?G8p1Dr42{f;RrxD_J)& z|DO%lS)NKzpl?w}K(S1|myI)$V4sGK!|JLimZL3E+dsmPE(=WQAQ#4Ua3oN`tl^ zyO-d`T#;E@TEEm38x|0O5s_eRYwz@8pLsZ7XiUyomeLA(ko; z%Wc{$IRhYH_=C1g_^8*J?G$c=1tvQS3XvF ze>z}TIYs-L6Vu!I>UTrGXL76u3;I{-0nUBId&v5~l2MU!3Wv9CGxU}f+uOg2KHM}} zL5k;v`Ql47%>HSdDdQU<7;oM6SAatx^#|*0Li0Zx(;XYrYgd{brWX6OmY*LU@Y_v6 zv{87E$OrpFta%16#$SiF>fBK_{M(ILRR0ml_cw+DbH*kC2@biPXH{BS%B!nrxwF!| z3eG9dk8R1Bk}0M2pbZ(A$r*5>(nZdAXfVk+^HRHA2IiA1(&G(x;$5G*rj4!rG>*jh znE3WSh)VCJ@t7o4;v-^7HUau z&Z{M$q?RE-t+r|}nqehGqNQ}_ux4|x8{;*hz8-M%Lf4R)Y~=m3mJHXD>Ucs5>y7y9 z0)7Av3HvBfo%aT-xm2{o{P1nqSAc)ta{-9y-YhvI62GXI$HVUDIsmbRDw`9H+dZT} zBsiNdQh5$yu+i8EH#qqkIkZfVj-G7>3hZ>>N;!8u@?I7bo!$>okz51Ra+-fyw^ z{zVc()}%F!I4Rn(+#GVJxqX@|BI=@UTc7{&haqyyuD-%5?Z9va$PL`;RnG44NH3hQ z%gUtp-WB8Q`=0l8>};mf@avCKl4}R7{7|6oeQ9rf5*K*ZP~B^6#(FnDwDe4i8d)nc z7bxN3wqdx*HEf)x1bLV7hTDAaskw!Qs2!ca)!cD-HX^Gn0`*9{`@WgI2`&lvTvvZ? zL}|rj$l15~KyWE%(9(JA={jM@2fHu2);1v$eU=#-r5~zfD#35pe}()yWR~Fk>7u zeP^UrfDiG5<9zQTPOGo+j+is~&-q{=EF8G@Aui>``Erc3Q^5jfGDQN%lU_jgiV}*O zGb~KO1W@v>JRe=%EEPJ>UZF$8Mgy$KPb?2}>5?_GP_T=5dAbjKKvv%Ch2Ah++91+x zo28$=1aSKy;1Y%(reX}G_G94UuJyes1Wc6mE&A!K;-d$L|L*+;Cz987(29>g<0dI< z;W(nx7KS+E^&0V;MCH{kj}{C$HS}3u_(swdy1E~O1SV7-CNbNIIhJGfr@+?ZXxZf9 zT6nP%8E0oSt*;MS21HT6ls5*X*IY2L4l`r?WyI$6+6N`h{5cJ?o>cLC?wvAg4jsdB z%hR3D(i`x@gUos|D9katC0Nr(+F($3XU-fV)N7061 zZcWDQa;28B=ocB}k$~EnOH&+hdhtcOskFk@u<14Dt6uAYa{vH^Cz;FG(SkO3TWlL< zu(YQEnN{%XlF&>#qrh8vBE+k@J@q|p?~CO#^rDYF)N|utY4B*TO+d~#EyH{XC;J@M zg}5VBkHwE$$Ia4`k0QKtF)3*|?0-5bCOn7s1Ejhc#pQ-b==|d}$HnfJ33kTDFiRNv zgAa#Iwskr_PS@Ff8F3%9HJ2J+?40oP^v?TW%RZoRU)fWQvxN0_F&fHZ@*REYgx~^q zzM$sLOcMsp32~Sur+}4zxk0B=g8b9oi5@Fe?r3(zZc0R?9Jt(_bweq5qL7>BSbyRA z{E*s3vR>qx_c~-Q*?|GXT@zSyj#Kvcwh>>NgqOMx!$;a}0{{>axsh?3jP~yIHiPb6 zKS00d$yu&eOQT!ZPX?>*!NJx3r z)4&u)IOMh@=UeIY>V0?e_2ZB{gc6wsk?=VqR6il_p=rkZ;W=Y~ikH78Yk6_z&{Ewk zd8%EFJj6D@A=Au-I(4{l9}`3OS3ldY{kFuVFrj;rBI-976EyoUF6zj2>~L;hs3b*# zl1N-LZoCVZuMK-yxNfxc4`bkxKmHJrTbFi+h#0UCVYHkS}*`dHJu+lMofj6|Cdx~Oo zK-q2IP(i2x%kcM1eTw~LkI<(J6M zo}I0y@Jz)hwwv1C=oqYayt23B;D@QV8Ggxo8VW#Vy9j9NR|5wBYB87}Q48bcjMbYR zWzK?!n3I8tZ)A?vjj!f&!Po#<%k1CXsRlvW?F-y^da|oOAcb;_MN#r~;Td|otA}}T@dOFfmYH;6A`y10hI3!Vu1bp%PHg!Oznb`0 zB6{+I->1PY-as{h1T}8bpXY|)T>Xr7|L!Bm_dP;(rK-1>`DFTxtbFMHO9}dUcQ&*E4l#A=3MVs&j^v2IB7q% z-rbpTMAh1~WJ z(R4PUry@0^6*Gfo#w^J}i2<8Me`4~fCyo>?Oqy>lnZNH&F^H3;mDi@)b-K-Kx&*g;S1zmqwpN`VG4$V5;4(9Ee zYPNkq{9Ffoy%h$dts+-=sOB!i3JCl9yFzvCS%{0VjMoHWXvuDTY0r^l6(h!&Z0iw? z62U{NCdPcIL0={m)%*x|0kg-^zF70_@G&RnM1MLN1t#v0AE*0=B7*lrVJ}m34hsjT z;^`M&Q+_ThVaTh3&Q-Jn6w5c;aCSwtcr(+2p_7o7QsrJV&^bdwf+rzg&!NMqF>6p$ z!#cNcK%d|VPLau=Mgq77!)lZ()8K2aa*bYFwryaYWiGzI549ZJCBr)IZ?1!xFilNgOQQcDeMCk7|$l&vF1|B z%4zy&c2)D933|wO-apEv4w_QW?F@t(SRF=h_knoD$Txj|v{enXG`7ngtnGvwpim#B z>+-1&0SINOZPpLV^@XKqhIOn42;%M+929Yf>l zmNV_IrB{c00-SI>LCBZZ%cj{*A@zjhbCQ}K7OD4ezlN0pZ`1E?jfvzk#CM82?Hkr{ z{YO<9Kxa%wjFkoGAr0dJhXD`@xTEggIyIcg z>Bmavi9zj{ocL$puJCf}?x=Zz98gQs->JT>eyCnG2P#vwuE;Hr*@fKWGi!R^YUw+I z1x4QS8pz*ejyl(WGuz;AO*=4AYa*l@HBh3&|BD9i;JTR?eBaFDL)HYk;~!TkC@2a( zH0uzOJumK@E3w+&6V`dEIaNHf{DWLygf!X*P?eBBi`r}sxg`ApH7Y~H`ncfLxtK0= zoV~5L4#CPVZcPtS2HkKZSp9J%jK9Vvcv_aO?Q1K{rEdG#aM9XSS1m|xjnrJw8`jn< zj(jKVxyoj_`vx7EI2r%of6kBM2ms9WtW+uxumsH;k7F zp~==wwGT)t>xZh6%WuV~_Gq@uMt)l}$c1^DL^$blA9w+F*l8P(4cE9UM6!u3S#zF< zF=QEnn4I6zmW;EFzM5*^b(Rr>qo352LWHySwq+KV1Z0Q~J`##jYh8C}N_aI(MmN#1 z+frazm8cKk0sxz|?7Hc$jR1?sDo&CZx3XmkoM&Ti%`V1f@C1IZA&m$sbD1%hThDI9 zW_Q>yb*rk;?dq$tY+So$LcD$~yt`+mPcB23Y@eG`_ z8D6J&VSJ5ydlnSCd&6ptY3)ZQB6?-uRO%ER`?bA%I6xj*lnX@!7@;2*s0({JgT}on zL?&i{ttqE_;^PBSX?hek6g}`)0E>-3QK?7UE&^{#xhZ;%!)n>?A$!a|$NLKDp z1Qh)5uDtGhcs85CJ=zVFe73ZVkHx_{C=RLc&vX8-@&)SPRf2-F6kNeOt zk7kOHc7VKlZ$92#yEwy(^EHF>p;8b~4@>uw4{0N>=2@w1k{=x`5W1YxT6%%)+n_Fb z?jv%PYlc@wuJy6(IzNM&?hhBVQ}cN(pa;K_oxAB*$wWG^(hAnRodC1I+?hu$CpAxK z`F;d_HRw)Ob|FmqyQ8nq%3gzHpEft7IWYq$$1-inz7tH-pMBnAl>N&zOMF)o>bp!i zmSjrN4;|-grtoo`26O#{p@DXJ{5`Ut!RV4>5$@_^V)bdG_*Xe+(p1UUzpXjgPcCH? zlxetgvS71m`!uhG{~5Tio^cfUb>)tr^Unt#;_>-6ia>8GHs%K`@dJ`>XOCh+rgf*j zCZJ~>d2^zAT;~IIpqP3Bvtd_*Gbqz!>XqHlU7pROa*ZPOoeE;NuricJO`+C!Ol^x5 zr)XWgp=plaGgFMapGin&1wnC~O-sQCj*6y6VgzXU%hYn8u!RA~QCtfDis&bJl6<~L z06Q>HpBwE2RJw8-Yj!ybpo$c6OLBCM$1NoSiVRWYOZ|~;!(K2cXHw+Ujsy%2kTYW@ z8hX2ek>iQ-{F<`gb^M7)dR~AFpm#Sa+5N0KW_0HWT0d-UGb`r<^7oQ?s3mg#TI!E? zfg5)3?G?ifbl;#Q zRo`Cp4ajvU*nf!+ToB$&cobjpSRfhMO35X2J;@ads`ao zS%!%@UGus1il$O;RQnGByr;c9J|1%eraaXC+F`NeM%#kiz>#eFN+vb`gLu|~fk!G* zfnSp~+{3m9ln!__%lvcF^wZ)g`h6d#TzQ6-P9`PJ7XaPB-gAE>5bLL$8gt3yec!mb=BMTN<>iz=@+=ngjNqrf9RHU#Qx zF3IRsvo>!CxkKMY;h9x;``<(wlBqo0sdJdQ(S>dy>3ZDPjZ;07I!;N=$(%(1vPO3{)T!b7 zC{CE=;_9~FT-Q~zK83jR?|a9+DV`4>^*Y-tbFuum?&dMfJ;I5kg3i}*;dedH8A+LM zHeel(_e{3z*b9}V<6Y3Un(@c7@0MabCiOBxpee6jd!^__U2#;gdk=^*6mt{m|LXEc zIad7EL@-v}BTd<;_v)uwW$W~0+8bs@qu8B9ZH%7>Y9eee?%K?f+Yr&C2C#w`=$5dK ziQIqsI$!_PVcqgFmqvq7gUMB>R7!My=+i^lYBsZA-vAw;rqkR&p#8-*S=y$I|Cq7q z`s)i;fhxT_M*SJj1_EOiXwOr+j~L7WyxXwjT$G$5rsVAWCX$JN6BpcZ*jdgMa{dh;1BE(ZO_fx9 z%yeuRsN|uQb@}iH)CH`%ym`nkVC4c&+q@|`5njaIG*btX1zY=XRhX9LKV?N zLMsWs(^|S#ae+@!Z}fq0`?^R(R+ji<8I3q%B=h=3;F@D)pY7YDvK9y>%$6nD)-~s( z%=HV}&u=qEO1(;<>v-T>1VtNi?W`w)IwVFiskI3mC;~>T5q;-cDdP#GbyAry_n>lN zxSqkSqIEvA)jVrhUKFo2h4a)4hPPd5AA@$7N&|JB5eZ86sbyuQ_3S@?Dfh)Cg;Khm z?xP&=Y%7WT7g4uC1MV+r+oBlT1YefGP4otXZ5YUW<-1r%6+fM)wtV zsbarOqObXM90}2;bkURJM@*jfu33j5L}ErROewDUO+BXwn3d{opZKB;v6^_zXbba% z%paLOs1*t>8dG|>!68YFkQt*{1t2HtZ_qkAFgrijwlgIExvjmmGwm~E7DE;H%g6Nh z44scu$~hfc67?cm$|y2|*lq1}$E~$WX4))q#6lQP%HEjqt+R#D+T0D2XPD>ClV5Pk9JM#X3rplX=sOe3>z+9hngVeCc=fj+Km-?PRs$>kQs9- zNjUM4{7BYFm6(Lc_IG+;QW~8G3W_Kv#yT)~#l#Q=+Z%|lmDw&EJppTa6tx*lNN7G* zOzWuLIdLTgg7Ct*7y{X-{+*|t6NlUuP=BoWIKIqRtWp2=V?s*N1TBu>0B$^K6d_f! z`#lTvVIyB;;f}mkrsV5A5_k_}lFqcYrOVwh@T9WKWfhj5Y0m`7a{|RtHhCAULNQCjyLZ@M=Vc8xUA8 zwHm+TF3&Kl>BD|!s^#=P=j(dmX>uel16r-F8CjTT9ha(%ulbXz}qM(r~P5@!ZcUw?9m{w#5_xD#8-qcvn!>RvX~A=Y_Xmem4(S; z)MhDfk?@4-beaU*(VZj}^z&Z5TdbvpP{%%#dM z#)Zqg!Z|kRSpzlR+B~!73>5R*wsTbk6g1GF2VOQ7uHI-V%&o%GI-0=NNX79$=qzU>Wt3Ncq4{x-(~A{i$B| zhpRH_YCzuPt?s<&ytZNPm^t%1DOhj0Fg>Q=ysw?>Xm97*)QzR4lV$p{A^H|v&xY%y zO`i}&jr?|V5vqXeLJe|VxZ*;QQ5{9_4O^bk z;TPZ5n_~1gm7R-j9IJY(vDr0DIqHi5D_9aTqV<+DLqY_Mm*ue`_vENm1ZVE_r@~Fb zwh<{z6|lHe3(!NG8)g6WXkp7NuREjU_ zzU?O3fTq|r3YyldefQP;rzL^P*2JaiuwmTrb{TU2V*=Ac)#P#f#hWM*EIdtQZ(_C# z&3ht<)Tuq{wMKp-BX8lelSMI}LlyFY-rnIdGK$$aY3gae7O?;R1aZlJ)Z3YanBSS7 zr3XuyvM|x(1})AlR&JEF`r3;#kIvGH6UIM~+Oraji~sbS8rM9>E;}A(L0}&r$>FxB zT+q$bRrA-rQ?U3_x+j|e-#!6tw_>t(vCSt<-ZtC6{{61GK~m>yUZ2OT;3U>8357Jt zI_X0#f=1@s%<=U&F1SHeU0kDOlGmnc$*gnCL75Z;>Z&kYN)#FxM-VM$q4~~_cejV)n$!zE)_6b@}mNF!(*img?^3Xm(ePDdKxk!Xl>v4 z%v3wewWlA`he&(L@m2s%Yc*{y>r?(U+MDSaPzm|Xl=PhVI5MZRE0|QZGx9J!HKpcG zaLLYF`u4NfvvG{p^KY|`cN}le99v&8y@b-{=Ue>IF&;FK5bb_uyKR{vsfU=_>frJn zdzV{F>ciNP0)Qcmqjt2a~IDn*FuFHx9{6GwkY?MdijYXx6xG_#PS z=*qZU%aMM~b!Y$m3WT_<`ptP_Etg%Czqdrsp(lb6STSv9H~{(GiS;pCtmw96@dKRt zC;D=*#KGCyW&zKJI0X=$yW7Ib=RJVqXc#wtDi?m}{VpO~I0sC0X={peZgsQ`r9>eL zVYV8VUIzJ$3L0R<=cFg@xPe8rT+cunqu0oR0*Dgh5+(VsX!m?6TG0?mWO_tT9Xhv) zCf<>JqAueLW(ATF?xR21m6eYGVc`{!)?xv@AsxEd!Vy}|q>dQsp5hl08J&u3a^hrlS`JqaUGZulMpuk_$7<%kSw;f zn^_I~mkx7d2{jtNoP*5L$WwQvtyXjSHNh%I&yG#^0 zH?Y7(nj&}fP24{H_4#&C4xLl7i5%uo;{zXSxrPSPldwMjvYOcNhcdTRnj@6P+6u8f z)l2){3nI{g_9JL`PP5IyyWFXY=`FX4pH@L|@sH|9Z7F;{!hK4l;rCqBEEB%6-`TUZ zuVW__!;Iozz*^ax`oLNex2O}kf%B%d-Nsf)`Bu;{QO=)|#mWV~z5U!p=)d;42ne(` zY@SKF2A-&9mEkrK)B8%}K2@peqzSneakJ_Z4{Qy@ci)Qii2<EEMJMtY zK$`8z@|cB}_1#C1QB3W0C!djUNq^2@FhIro19RrJoO~#~kx{UtugrvVEU*IYM1w3H zUS1U9@)~?o$Xeo_lhH2ckNlM~un}}sc>eBj7@9nD1clIzLnxeG0;cVAH4P)-9=p8- z#m^cmo)XDyuODdus zRmr1jz@GSOd-DC>CR-eg3~}4NbLG}f&k*Uoi{WhD*qHICmR$xZ^ZTe}*HBE^p8?nZ zZY-8oue(26kl$$m7ZB2>^Tk`J;E$ptNK7i zEaOk!d%MK9XhSz4qrW2gMaT)W%HZKy_`<4w5qqq|dF%?%++U<1+lK&qA+`DX*LzT> zc(j!;t6lo>%_1?pf|4$+$drF6GBZy7gEIop|M%)u!=nFDasEec`UAeQP&&loh00e8 zj2?bbmn#9`Fbb5zO0q!V?zOFGffYbKxXZ}nkMv#!gVe!)94)}-E?)hIPy+rRee{oy z1o;2IRXv;Wg4Y>=;`B`&2&4JMI%@is?iK{@LfD5^n+(z z(_m8*0OYg#czlvAH;H|?+ad-)Ql2wc15mkv7qqn{bkrC3%M2U^Y}15)h)bB6(Qj`6 ziFqB!YuVcZ0;@@NJd_Hclt_iKyTG1g_iu5B!k&9B$ESyGaF>C@0T|+V!085?9W2Jj z*r$tkMH(VAfhXrhvwyO63J!97c|f<vOU47 z>tpd0#2wCW#aA+Rb5mrGMyj;F@M`0AKsjDb7RXQ8A7|TNPfnK;PYFui%$LADo^hk7Rqd=eHBd?YW zH7*IilfL>X@T{F(jwqnIGH>hJ@$_VKNUd|Yedp&Gq3euq>Nx^7h`Q#FJuhwrWZuyk zxz%vSU%J))Jqbj+YS}l`x9Qf}HX0mlUS6b)5&u!W&)5tAeJBlD(K`~GZVm8rFj*hk zc^?0lQ`@I3@)=YrK;s3hwtWmNMRKE?;<(0rLTN*Ql^$Xx*k5|!z3UExL9WEHb=NCn z?$7qr=2V{srD-EJs?mGH{paI3z0ddLuG}m{LkkOnRMigo0*&)q8{Lj*$e!)1d(t3U zm!GVkZ8HBmZt&dkUCuCUqAfRcWqwTCNxw8q$3>X$T%>e!9LGpI^7#jciOSB5ihlWS z+i9XYuyPR-swdqzR`}cp6yj%?`o=B&r=UJ*YB*J5!$7eLZ!5TNL^`r6Rb@RNbS?qH zcTrKu!wy@oC4A4prYFH+sEm$HlxpB4a3;Ojg*(3^)~XT(#wV8xi9tOE7YouUcdLzW zA$dXDI{Jb#wBO(`f@D1W1QM&9%Ee>euA;dk8$)TBRONC zx-O|(mtuj)cla2|EMi!&%p$SZgx*GdEc?M5Ao{SCE!~G|#i3-WscjnMV{LCLVVWgT zdLKH5^{y^m{l*l{sb9M6Fk87pM>J)O%E_loG@9ad@2yT;E%lRbuY_Q!*In7vt9b{S<&R7aUT&k3 z*=4x~%Bw)lNTH;T^D}EAL{s8nZ^Po1_?;x zQ&raXyl?no--F0G130?Af1ytM%VCy9!8C_mQAJRvNcfncW-+U8(vaO|J`*5PqYV6H@^jdMk{ z^Wqaihj2Ub(Xe3n^GZuQrQz*op>s@U4Z989{1)7H5o8Hv&KrGsBW(pz_E1Dhas8d& z^t^cb9xWKwD$daOJ#KLqHHSajC(Vq2;y5yXhiA`n$po!oV7n%|D4#`MD_V=lv=uW- zgtB%zKsQz@CC2lQFxl4C!8eH`m2@unQH|6}#mzrdc3}&Qy!Pa0{wN!^jIbt3@F8y> z`V5684xc2?mPhhE@iNPpzHyXpNNdCKiy#RuA;N5z-FX(2)~CG`i#btW)1R5oY8)5$ zjNs0WHF^E5hRg1vw5g-=;#cbQBzht(#j#&8b^z3X&-09isE4J#rk&sT@XTqtRSPPm z5OV`NSu_TD#8dcr-chvo8jFZLNe&A|T~)zLgYoSTpS%wmI{7DuSx6NOVn5QeyUB8S z4aC{Ae-pU>ur`7l1I&%)av#*Vzw5xd5v-{u+t>{&rFwiR7L!d2@$|GLmCSuktD55x zdT-wZFiu@7^CNQzg!0A!_tw7}Ik)9R0;M)HS59?mzELmTIp8Z6UW4A{KIxlb2>Q|`sbBi0eK5FzTmd?LSe&S{G?qPGzAuH_N*QPI`kxbp?Uzyrlq!JlnAbG{ z9s;sf#hy-r9$X2m@`aDm#ULalaFO^=*5-W;>)vLCyAVsByJ+y=N>khs8Q88PWU6as z^l4V?rem)Cqt$|XX7v6DH`$b{ves#IP_9G`4&0a3-w?Pw=Zi9;DE3+^uMcG0wr5<~ zE)QipJrTK3+BQH-+3s28-Vbc}zr9FIl&aI3&tO{@N*>N8cjOtbTtuKZUPYJUeK#SU zxJ#iiMO!?0H8Zvfnfj3uEVOWQ{8D{a?cEI8-g=5i{a3K0(5*G;v@z`Dcux|l%Q1vc z9jn5DRGVJiIzZQuRtJGaH6^@sWM{?jhXmbA5NWG1k*9c7MGbPQcLjNGdQ=HL!*Klg zwW>JZ-3_1HdhS1`qGV;-zur=0-at%>I2w~qyjH4-A`rNC0=Hu1fqSvu!C&I3J?XRcCUAl&WdAWZ&IX7~;3* zLkx_VI%~;=BU}5HeNONqP5y1B9csvxO?KUf?2d&YSzdkBDhnA(XR=BYm-+*DhR~Y@ zS8&y?D}L9F#(dirNhPQL{4xuOt?b!ykju47(65;;-R0T|qExTV9yBe56rm>#S$Kwh z_L}SLQfm37E?LC`2S1N8OA$oW1Q&OJi`1}54=;$@yS5z5TJv^G4d?0))wqkrQ>%x) zX-;z{U&WVsL6%B1$zUfF+fZPEkSv7^xoBPl|0kQsNoF5%6{DH5xOVgXoq;=(+56^8 z&-SIokNv%oSdwFe)3`D=iKxs$EDPZ2VQ8K6{csp0F;BY zIS7l|PoBJ|xCDkv8KrK0l7vVnZ>CVUMeS>>^qP@O1FH5QNX&mIYjuOZ+s9_8&wYbR zUu~7TX`zXdo8xE7g3`}eqn^eO^IX8#j8_>96{5TSxF2sWv{hreET@-FKY+{?#pqkc z=~Q_S8>u_31=|<~h{Ie(kXq8_frT0gtEC+%FpXZ{_^}*Xnv!}2`O4PdPAtHqt}cme zm3eA8>~h1)(GKZ4(%t?@0p;~vUTxCp?J_NCy4o8LOLtxJM{Ke{iQZcFx!-FixV^y4 z=k(EN)*D^HzR3@-VThZ#^SwPZ&E>6W6k6-Ryw+(t#WOQ}z!H8_Bx`$~DE+QNP`5Q= zu0twz@9@)32?#2H*&kn-)^54<8-)Z+pHd00Y|GO*X~4vL;v=Wt;CyP8T6e1?NkX6AopCz;-oZW515Rw1yhzhDM^paz&8+3~w@P(_bm zJDO1^j^j-&OvhAG0m=Pq7i1D#m4sI0_g=RopaN=)p%z5DDAtA)`@s}4&IiPrQFcRd zKk9Qwmc`z`IUCA<%?)ptyf*}xikGV&lz?k~!r@|0w|(8A-M3`ES1#FW)Q8|wVUuw~ z7zJ$+bWM}i*SVV0o-h>m=^#Uwz;t%8cPe`#@YzS?su6Q`# zt&110sTib#Vb0jyQs@r})#^(_5?_gGzWcw3m-0%jzY8xq3O5~YYEOuFH+@`l(u6?Z z$0J4;1<6bAln4v1*L-j$a5OKaT%9KZ#q)CoW2KXRlXI6Is|^2{^g?KF;wYuZKu)JEw)P(IU`Uc9FHHAlns7X6M zL(KAn0w}#bF0q*$xf{%8q9HN3(;f8G5%pYw*TP~@;+0^-Y14`WV|_x75~Wa$u3&@W zB@>F0HjoKh%mUtq)8`lQC5e2Gy?pj#ML0v)65+lqSfBdU}@<`}VX2M7LBBJ~mQ9;is&xChh#}Q`htnr(KHk?e^mY>6$BTI=9>R7^Q-; zPfzCCqsi#n1hw&~`!l-RXCPI7jSNVn=t=}pd$)27X@i(~w5Lc+z~~e8oud>)pLv7a zkq1i}EQ{6!0*D!^puBjU-r%)*9auBVpNA|YH8UeZYqQ+t1Hp7Uac3Xhv$4NZ*DZwI zSZykLem=lBcS?#G+v@UZZ*YGuCAgp+*L6HG8? z8=#61H@v5lh2~qng@97n9F(OzUBl61Slm&Ue}-CF?&VQ1m@3|Lno?6G9z^}h3))H! z9qF~tBf`e#@xr6F$$Dzyad{{89P6UOcz5Ugeq#X@9|nKA;9yY462*0bvKnTq)aek4 zsRme&6r7sn(YiZ}n>8yoo8x$QSew-SsVhsw-;b$l$WPx|^>%SuI^`G4Xh9Ns!V4yM z!A*g0iQ>fZZ^O6*r>50sMq@hA(lU%hzGs=jH`!l-!PMB|}P{Gj$x3!R_8dg4KI8H75CAYuK2zjWH;fV0E-Kaz;< zvIG~EtPbD)_JBpt$?2ZQ> zHGxbEudfX^i74j%p3294^KR8iJML!htL0FgNn}StLoS9YWkk19jTt{O`c>d0rG8Px z6YCM`gJDIPo0ys4Nuu!VY(htneQmsCdc5D`=3*P&9*0YASd+hE6uRp(`GTj4#R($( z-jO5Vj_rs`ezlVD%!*(ZBz#bctA_KcAayUNV*0VrB>J|9C$*J9{Ewrx$EAaN^ZBhOLIKb@_^E zPAcpR)hK(n(ftc#@jUfVQZ|_R35z z2oMU{QbYcedWbID^s;)d+F_hVBE^4Bs%XbWtIrTuaGA=E$2@lDCIUZwn8?VyeNwz?GG+ z5?h+M=T^OPu?b*Ek5_S@5HiCq6aN(fvY6BddJTaBRik9it{EAO3n+ z*T0(My_n0;t8eyqa@tGiC7%_;wT#YI_TG{4l*S4a`HIO_zoNf#(k=7d+ZP2CK;Mw~ zVViMk^^a0lBWfII(ml|L+j?UZL+75gQ&Es@nI}5yigFwf{qZ9)gszyxkl3e2==v&$ zi?#QsHX?n`c2luC@y?tsdvspuw@Rsa>|L7|&I^`J+rtjR8nSS9-csD!p6imF7V^Q; z_7+8}^r*_#C0-jyL)w4*mo}Ifmd~+yXE=KXQaZSrdEIkG%gQN1N~mHZ(Ku%TANt5v zHS}w10PAwni-Q%-U4B1$#4S8I$8JgEU^Swv~p1KoX zXoFlj|mPjs(RiO1FD7 zacu8q{ccBEJciE}tO-_;Vc#%0QAIFS*J?@0x^IWWu;zn@Bc74nf$DoDKdpT@vgD7u zCJZNwDGU{i)RaPo-nh2{tF-#q3I*4kYM~0BI{CWU$-6*FciMim$QwpdPQhJJW;7Q1 z_Kd_5sswwt_kl(0t?|hHaXtO|-R|Yo5p!PpMI97xF=495A2|6<>^v)a4B7O;!aP;K z9HBqo=^2_2)Wt0Ly*~M6sS1^kC2B1Vtq7b@N><|&({|_=RiE~b9cn08s8pgy@*NMq zXlD_3#0N1&1HXv~OZ=O5<3AZ1I7z1EiMF=hwe2x&l(2MVa7tH{Z;Cn?qPY@y_7Smt zB&%6D5&P)v9Frw$FdXE0qJjcXs)*eybAM{OahNSToHV8JPgf}U13}ZkAYlBXSJ<-d zY7N!=1tjPLR8wDNa@%lr_EzLC^fw}HuodD9g|~+=Ddb3!axXP0`1LtVltnQ3oizR*?vY%NrKX)k}ImXl21|B^9j z_{HSK>Q^Bbb(?-;aM+0Km|t%j>NcY^^hj_&<-A3;=u-&t%oSP6+m=kF6hV0w;M847RPD_-wnH2axNki>4LW#ck#Dcu!Y zMni3l1QswUJO=sSNRz6FCc=l_<1{8QVuGmVT7hjv{c3?cp5j8ip1l^JYSr2|s){?9 zC+{&@d3sTp7*GA}7*=n*6bK-3g5;=(>cX}b+=Xe(dWv~N{$kg72{vmr2`a-lhVOr% z>gc_(9N+_MJpb-Ypotr5wNobyEQ4RLYAX0WbVxHNb75bwl!aCt`u0ldrFEc6Cd0H) zo)hLE^2phaO3x$+6DxRW9mS;RL&H11tT~e$zveUSfE~3tQc@b-P_cVn?wk*m& zN{K72qh@7yx`QFwajb;U{^>q!L&s1uD#dXSNX7}#1^(-mRGsz61k)sWuvGLkXW`NlQ~Ni5?`wNz_fEvrm@-P%ol&L49%GPx zdqz+h`Sv;gt@I~+^#SGBx2TzXmt#$B+H5<=d=zdD=X5gEqTAKdor97^0*KR{J8zqt z(;f)~N8V4+DoEN>9cKm8|LE0k)NW1l{+yZ_w5ah(1RB8r{sw#fXsu<&p%o@Pu-AsS(N>zZ!n{hSaCRQ$)1{CoPn0 zsKfjR%hr7}Hvuv6Vfo+QaRUS0k;1nUa5|V4<0jM;s;`86eEVkKJZIiciHB};2wq>k#pX8rpoHHltLsiEXB(}NSHp-c-c@>MW%i4Hp2M~O&CkK8M&%8=>$>FbiRU#TCBGv%vFkW+SF<(^ z!U{*eK~AL_!u@$BfaL)SwHX?IJes7sDiq7bndW$8Gu)9iA;FF2+#l$P;EQl}yV}T= zKavi0>?r0BUCY_0w0Af$i8{vg2{T&qx#k6zgBW5uC^?fZ?O1Ovmyz54L;MY)T^4`mkx1-=nuhsWJ%N+y z3IZ}!WAo=t5X-~MCy?&tj|EDze=syg2J0N%H}-xpv7hBbkNTWHTx&yUPws76>sX^E zo%37Y`0)5N=?7D|oD1a!#ViCeyfraRKV8h)&F52+jdrAFzu~?*uRgkOKm!880=&pD zttS7no?WTG!jdiTrX(Qmj$?rOiI@_gw(HH~6K-iEiLzB>MhhfnFv;TJ?U-)?9&BL+ zX`_(69fIH9Yd&q)0pK=|jiixMI?@jzX<G>6o zvk`8|MKwOd-lHi)w6yHZ6<0ZfZD+?z-Q68?5*$-`GJ%`!AWwmH=gWGj>oK9k%+$$_ z8C9bkGxxsgcs|&Ej;tYi=~jwUz2HNm`>82l;VxmPT~$}t7o5k#pm*zE-GeXO_3)Ve zEU0OsFq&Y_Jk(jQBF*yy>Mzh!9X`p^on#xu%Cf|Sb#m4x4xc{w$S$cV$E2=CS@ zc$umsv*#l=3TG4I4s(?Uyuv(t-@dkBW8Becic2)7&Lpd4F=$Rq||Xd%V_$wX3s! zeN!pVcd9l8!s;H6Y3cRm&|5|-Ps$6&j;leK8iy~=VS4u8{&usWtCl9^p4Pdu0`m5V zIVw#1n!s1ZL|k%LT<$mv5;?MPNv#_GTy*w}`EGoFPWK_tV5HYgLBS}I3D2CyEoZ{2W(V!d9K3#tu&C85!#YhFZikqCeQ>~IffihAn zKy8Hwmk%cQPGa>^m!*io+LgI07GIiz6)svIx+w&BeX5>)E7U&}_UoM<9buQw5`t!M zgU4poNJgUp(-x0=$&4j~qA?2$6;?0@(-jS*(ie|8ndh6nvy@PnZwS3MrInd(a#DdA zuWxOw{0$*y;Jtu9-N^Io3R85eUZqQ9ls^o+GEt8tPRha2V;B{^X9$hAjtZkv(B6`2 zd7K%fstgfMNjY(AeDF~y{*e8ZT@N_e(lwFA$N|rZOWS7EYK-Q04S1ZBKVH#+=3Bm5 z&^G2VR%yWgQ|=m4)_Qs}S!y#LF-3biVzca-J7-C=GkjegmXtev`Sn*`M!MoxM!!7o z-&OFqf4POIrf-x3ecYE2nf7o;U&CX87+4^BbvR+ZEk@vL-Cu1>-rlrxfYMD9Tn!&Q zS2Ou$(qi(Nj&1hTe9eKuxIUg9BeS=M1xVS7cz@&98{*ay`O_|E-EtofZCO)xRg8R& z>%U0)(xJQJ9MtmdFiZQrl_4MPeir$n&WBhvX*G|gJck*g%d)^`vJBkxi)wTT{qOtJ zu*HoH*5;}x&ahkVO@O*+=tNLa3-o>|Vw}+%ppsw|G9b=*u1)Va#A{KQ#g=#Bd56i_ zVOkUqh_p6c|K~*gzc3zL))vxei!x-EbH0GP$n#&5(z$mxXrb``_9wjQWzcYz{ZzU7 zf=F@p~BRtNKg7ALxY zlC&sJPQeSEz)aD!N~()r+mAeZflY3w=KX#E^UGh(zO#2o65TQH%(myxQDiX7ez%p% z!ksVKs~Ea?bA(593S|_ztbKA?`@~dT%L!e{iQ?I*OmkVsD3<@QVEDe~ls9Piza9J3 zT(-m1zOW2!($e4I9f`}-Wh0{sZ_w@g>7r{j06w0AZAB*sGl#*Q-!tXYyj%ldJaE0+ z#Z&tX0`Q4W_3I@$x*67<`R>}5c2ExSVFcK@NdkNSfFQOo=Mp-6vu7A(w@iUfR<{pr zIid62+#LPc|C#@pR&P{H!M=Qa>^fQ`#siDwEoS3^C6LtoV)s?)V2rA6t%2UF?^|3I z;I$Z6i#;VB_I3TO+`FS8@5R>Z>-TRO{H=aFev{k`R!xbr88v@yTt%aRsp1SS>Q}T~ z`jIK_Gc$vAbv&RGX*}fEA={LV3rLf0P|9?7qQS9Y?H&jBBjjA!j?OK0956xtHdJ+g z!Me0RUmR0*(sdUV0iAEKgVGAu(=LriJ*b;4Sz0AVFGw+$%-24vZtbQv1bik;SmM?P zKMAAD@S2eI8Q$bz$aOn5tEzAER{I>grDe1JPlE0M7YF1lV5_Y@aL?cTl3&aHIQ2s9 zOa2r11wRIP0JTf3QFrSNe9!#a44NKfB9!3NdG+qNQ~Lz^3d(X9mSvV7RTcaEfxXMz ze&*lr^>5SdR~*$ld|PC6FxKKn==H>3>Nl{XcQ2-XhHUW-MD3pS@kcKj|Mq*}`=Jh7 zwEt#A?kk@74Q#dN>hB5eAI4T#YynxoGcKmo2JNs5tCy@;%wNA7-$gMXjC)@j`SM@# zBsK{(DkI?mq${lwjgl.natives} - + org.lwjgl @@ -159,10 +159,6 @@ - - - - org.ode4j core @@ -287,7 +283,7 @@ - + org.lwjgl lwjgl-yoga @@ -342,6 +338,7 @@ exec-maven-plugin 3.0.0 + Download Typescript generate-sources @@ -365,52 +362,6 @@ - - - - - - lwjgl-natives-macos - - - mac - - - - 17 - natives-macos - - - - - org.codehaus.mojo - exec-maven-plugin - 3.0.0 - - - Download Typescript - generate-sources - - exec - - - bash - ${basedir}/Assets/Scripts/compiler/get_typescript.sh - - - - - - - - - - - - - - - lwjgl-natives-windows @@ -432,6 +383,7 @@ exec-maven-plugin 3.0.0 + Download Typescript generate-sources @@ -448,8 +400,9 @@ + - Run Net Arranger + Run NetArranger generate-sources exec @@ -576,39 +529,13 @@ false true electrosphere.engine.Main - -cp target/classes;target/Renderer-${version}-jar-with-dependencies.jar electrosphere.engine.Main - - - diff --git a/asset-gen/symbolism-calculatorxlsx.xlsx b/src/asset-gen/symbolism-calculatorxlsx.xlsx similarity index 100% rename from asset-gen/symbolism-calculatorxlsx.xlsx rename to src/asset-gen/symbolism-calculatorxlsx.xlsx diff --git a/launcher/Makefile b/src/launcher/Makefile similarity index 100% rename from launcher/Makefile rename to src/launcher/Makefile diff --git a/launcher/src/main.c b/src/launcher/src/main.c similarity index 100% rename from launcher/src/main.c rename to src/launcher/src/main.c diff --git a/net/character.json b/src/net/character.json similarity index 100% rename from net/character.json rename to src/net/character.json diff --git a/net/combat.json b/src/net/combat.json similarity index 100% rename from net/combat.json rename to src/net/combat.json diff --git a/net/entity.json b/src/net/entity.json similarity index 97% rename from net/entity.json rename to src/net/entity.json index 8aba58c8..3eb75712 100644 --- a/net/entity.json +++ b/src/net/entity.json @@ -1,280 +1,280 @@ -{ - "outputPath" : "./src/main/java/electrosphere/net/parser/", - "packageName" : "electrosphere.net.parser", - "categories":[ - { - "categoryName" : "Entity", - "data" : [ - { - "name" : "entityCategory", - "type" : "FIXED_INT" - }, - { - "name" : "entitySubtype", - "type" : "VAR_STRING" - }, - { - "name" : "entityID", - "type" : "FIXED_INT" - }, - { - "name" : "creatureTemplate", - "type" : "VAR_STRING" - }, - { - "name" : "positionX", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "positionY", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "positionZ", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "rotationX", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "rotationY", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "rotationZ", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "rotationW", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "linVelX", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "linVelY", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "linVelZ", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "angVelX", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "angVelY", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "angVelZ", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "linForceX", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "linForceY", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "linForceZ", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "angForceX", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "angForceY", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "angForceZ", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "yaw", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "pitch", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "velocity", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "treeState", - "type" : "FIXED_INT" - }, - { - "name" : "propertyType", - "type" : "FIXED_INT" - }, - { - "name" : "propertyValue", - "type" : "FIXED_INT" - }, - { - "name" : "time", - "type" : "FIXED_LONG" - }, - { - "name" : "bone", - "type" : "VAR_STRING" - }, - { - "name" : "targetID", - "type" : "FIXED_INT" - }, - { - "name" : "bTreeID", - "type" : "FIXED_INT" - }, - { - "name" : "propertyValueInt", - "type" : "FIXED_INT" - } - ], - "messageTypes" : [ - { - "messageName" : "Create", - "description" : "Spawns an entity on the client", - "data" : [ - "entityID", - "entityCategory", - "entitySubtype", - "creatureTemplate", - "positionX", - "positionY", - "positionZ", - "rotationX", - "rotationY", - "rotationZ", - "rotationW" - ] - }, - { - "messageName" : "moveUpdate", - "description" : "Updates a client on the move state of an entity", - "data" : [ - "entityID", - "time", - "positionX", - "positionY", - "positionZ", - "rotationX", - "rotationY", - "rotationZ", - "rotationW", - "velocity", - "propertyValueInt", - "treeState" - ] - }, - { - "messageName" : "attackUpdate", - "description" : "(Deprecated) Updates the client on the status of a given attack", - "data" : [ - "entityID", - "time", - "positionX", - "positionY", - "positionZ", - "rotationX", - "rotationY", - "rotationZ", - "velocity", - "treeState" - ] - }, - { - "messageName" : "startAttack", - "description" : "Alerts the server that the client wants to start attacking", - "data" : [] - }, - { - "messageName" : "Kill", - "description" : "Kills an entity (ie plays death animation, creates effects, etc -- does not actually delete the entity from data/scene)", - "data" : [ - "time", - "entityID" - ] - }, - { - "messageName" : "Destroy", - "description" : "Destroys an entity, clearing it from the client scene", - "data" : [ - "entityID" - ] - }, - { - "messageName" : "setProperty", - "description" : "Sets a property on an entity (old method user to set the player's entity)", - "data" : [ - "entityID", - "time", - "propertyType", - "propertyValue" - ] - }, - { - "messageName" : "attachEntityToEntity", - "description" : "Tells the client to attach an entity to another entity", - "data" : [ - "entityID", - "bone", - "targetID" - ] - }, - { - "messageName" : "updateEntityViewDir", - "description" : "Updates the server's value for where the player is looking", - "data" : [ - "entityID", - "time", - "propertyType", - "yaw", - "pitch" - ] - }, - { - "messageName" : "syncPhysics", - "description" : "Synchronizes server physics state to client", - "data" : [ - "entityID", - "time", - "positionX", - "positionY", - "positionZ", - "rotationX", - "rotationY", - "rotationZ", - "rotationW", - "linVelX", - "linVelY", - "linVelZ", - "angVelX", - "angVelY", - "angVelZ", - "linForceX", - "linForceY", - "linForceZ", - "angForceX", - "angForceY", - "angForceZ" - ] - } - - - - ] - } - ] +{ + "outputPath" : "./src/main/java/electrosphere/net/parser/", + "packageName" : "electrosphere.net.parser", + "categories":[ + { + "categoryName" : "Entity", + "data" : [ + { + "name" : "entityCategory", + "type" : "FIXED_INT" + }, + { + "name" : "entitySubtype", + "type" : "VAR_STRING" + }, + { + "name" : "entityID", + "type" : "FIXED_INT" + }, + { + "name" : "creatureTemplate", + "type" : "VAR_STRING" + }, + { + "name" : "positionX", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "positionY", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "positionZ", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "rotationX", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "rotationY", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "rotationZ", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "rotationW", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "linVelX", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "linVelY", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "linVelZ", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "angVelX", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "angVelY", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "angVelZ", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "linForceX", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "linForceY", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "linForceZ", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "angForceX", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "angForceY", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "angForceZ", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "yaw", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "pitch", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "velocity", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "treeState", + "type" : "FIXED_INT" + }, + { + "name" : "propertyType", + "type" : "FIXED_INT" + }, + { + "name" : "propertyValue", + "type" : "FIXED_INT" + }, + { + "name" : "time", + "type" : "FIXED_LONG" + }, + { + "name" : "bone", + "type" : "VAR_STRING" + }, + { + "name" : "targetID", + "type" : "FIXED_INT" + }, + { + "name" : "bTreeID", + "type" : "FIXED_INT" + }, + { + "name" : "propertyValueInt", + "type" : "FIXED_INT" + } + ], + "messageTypes" : [ + { + "messageName" : "Create", + "description" : "Spawns an entity on the client", + "data" : [ + "entityID", + "entityCategory", + "entitySubtype", + "creatureTemplate", + "positionX", + "positionY", + "positionZ", + "rotationX", + "rotationY", + "rotationZ", + "rotationW" + ] + }, + { + "messageName" : "moveUpdate", + "description" : "Updates a client on the move state of an entity", + "data" : [ + "entityID", + "time", + "positionX", + "positionY", + "positionZ", + "rotationX", + "rotationY", + "rotationZ", + "rotationW", + "velocity", + "propertyValueInt", + "treeState" + ] + }, + { + "messageName" : "attackUpdate", + "description" : "(Deprecated) Updates the client on the status of a given attack", + "data" : [ + "entityID", + "time", + "positionX", + "positionY", + "positionZ", + "rotationX", + "rotationY", + "rotationZ", + "velocity", + "treeState" + ] + }, + { + "messageName" : "startAttack", + "description" : "Alerts the server that the client wants to start attacking", + "data" : [] + }, + { + "messageName" : "Kill", + "description" : "Kills an entity (ie plays death animation, creates effects, etc -- does not actually delete the entity from data/scene)", + "data" : [ + "time", + "entityID" + ] + }, + { + "messageName" : "Destroy", + "description" : "Destroys an entity, clearing it from the client scene", + "data" : [ + "entityID" + ] + }, + { + "messageName" : "setProperty", + "description" : "Sets a property on an entity (old method user to set the player's entity)", + "data" : [ + "entityID", + "time", + "propertyType", + "propertyValue" + ] + }, + { + "messageName" : "attachEntityToEntity", + "description" : "Tells the client to attach an entity to another entity", + "data" : [ + "entityID", + "bone", + "targetID" + ] + }, + { + "messageName" : "updateEntityViewDir", + "description" : "Updates the server's value for where the player is looking", + "data" : [ + "entityID", + "time", + "propertyType", + "yaw", + "pitch" + ] + }, + { + "messageName" : "syncPhysics", + "description" : "Synchronizes server physics state to client", + "data" : [ + "entityID", + "time", + "positionX", + "positionY", + "positionZ", + "rotationX", + "rotationY", + "rotationZ", + "rotationW", + "linVelX", + "linVelY", + "linVelZ", + "angVelX", + "angVelY", + "angVelZ", + "linForceX", + "linForceY", + "linForceZ", + "angForceX", + "angForceY", + "angForceZ" + ] + } + + + + ] + } + ] } \ No newline at end of file diff --git a/net/inventory.json b/src/net/inventory.json similarity index 100% rename from net/inventory.json rename to src/net/inventory.json diff --git a/net/lore.json b/src/net/lore.json similarity index 96% rename from net/lore.json rename to src/net/lore.json index e8ff4786..55e30f9f 100644 --- a/net/lore.json +++ b/src/net/lore.json @@ -1,29 +1,29 @@ -{ - "outputPath" : "./src/main/java/electrosphere/net/parser/", - "packageName" : "electrosphere.net.parser", - "categories":[ - { - "categoryName" : "Lore", - "data" : [ - { - "name" : "data", - "type" : "VAR_STRING" - } - ], - "messageTypes" : [ - { - "messageName" : "RequestRaces", - "description" : "Requests the data for all races available to the character to play", - "data" : [] - }, - { - "messageName" : "ResponseRaces", - "description" : "Responds with the data on all races available for play", - "data" : [ - "data" - ] - } - ] - } - ] +{ + "outputPath" : "./src/main/java/electrosphere/net/parser/", + "packageName" : "electrosphere.net.parser", + "categories":[ + { + "categoryName" : "Lore", + "data" : [ + { + "name" : "data", + "type" : "VAR_STRING" + } + ], + "messageTypes" : [ + { + "messageName" : "RequestRaces", + "description" : "Requests the data for all races available to the character to play", + "data" : [] + }, + { + "messageName" : "ResponseRaces", + "description" : "Responds with the data on all races available for play", + "data" : [ + "data" + ] + } + ] + } + ] } \ No newline at end of file diff --git a/net/player.json b/src/net/player.json similarity index 97% rename from net/player.json rename to src/net/player.json index 5b1b6add..5ae875f6 100644 --- a/net/player.json +++ b/src/net/player.json @@ -1,45 +1,45 @@ -{ - "outputPath" : "./src/main/java/electrosphere/net/parser/", - "packageName" : "electrosphere.net.parser", - "categories":[ - { - "categoryName" : "Player", - "data" : [ - { - "name" : "playerID", - "type" : "FIXED_INT" - }, - { - "name" : "initialDiscretePositionX", - "type" : "FIXED_INT" - }, - { - "name" : "initialDiscretePositionY", - "type" : "FIXED_INT" - }, - { - "name" : "initialDiscretePositionZ", - "type" : "FIXED_INT" - } - ], - "messageTypes" : [ - { - "messageName" : "Set_ID", - "description" : "Provides the server's id for the player", - "data" : [ - "playerID" - ] - }, - { - "messageName" : "SetInitialDiscretePosition", - "description" : "Tells the client the initial position of the player entity", - "data" : [ - "initialDiscretePositionX", - "initialDiscretePositionY", - "initialDiscretePositionZ" - ] - } - ] - } - ] +{ + "outputPath" : "./src/main/java/electrosphere/net/parser/", + "packageName" : "electrosphere.net.parser", + "categories":[ + { + "categoryName" : "Player", + "data" : [ + { + "name" : "playerID", + "type" : "FIXED_INT" + }, + { + "name" : "initialDiscretePositionX", + "type" : "FIXED_INT" + }, + { + "name" : "initialDiscretePositionY", + "type" : "FIXED_INT" + }, + { + "name" : "initialDiscretePositionZ", + "type" : "FIXED_INT" + } + ], + "messageTypes" : [ + { + "messageName" : "Set_ID", + "description" : "Provides the server's id for the player", + "data" : [ + "playerID" + ] + }, + { + "messageName" : "SetInitialDiscretePosition", + "description" : "Tells the client the initial position of the player entity", + "data" : [ + "initialDiscretePositionX", + "initialDiscretePositionY", + "initialDiscretePositionZ" + ] + } + ] + } + ] } \ No newline at end of file diff --git a/net/server.json b/src/net/server.json similarity index 96% rename from net/server.json rename to src/net/server.json index e1ff1730..583d73b9 100644 --- a/net/server.json +++ b/src/net/server.json @@ -1,66 +1,66 @@ -{ - "outputPath" : "./src/main/java/electrosphere/net/parser/", - "packageName" : "electrosphere.net.parser", - "categories":[ - - { - "categoryName" : "Server", - "data" : [ - ], - "messageTypes" : [ - { - "messageName" : "Ping", - "description" : "Pings the other side of the socket", - "data" : [] - }, - { - "messageName" : "Pong", - "description" : "Replies to a ping from the other side of the socket", - "data" : [] - } - ] - }, - - - { - "categoryName" : "Auth", - "data" : [ - { - "name" : "user", - "type" : "VAR_STRING" - }, - { - "name" : "pass", - "type" : "VAR_STRING" - } - ], - "messageTypes" : [ - { - "messageName" : "AuthRequest", - "description" : "Requests authorization from the client", - "data" : [] - }, - { - "messageName" : "AuthDetails", - "description" : "Tells the server the auth details of this client", - "data" : [ - "user", - "pass" - ] - }, - { - "messageName" : "AuthSuccess", - "description" : "Tells the client it successfully logged in", - "data" : [] - }, - { - "messageName" : "AuthFailure", - "description" : "Tells the client it failed to log in", - "data" : [] - } - ] - } - - ] - +{ + "outputPath" : "./src/main/java/electrosphere/net/parser/", + "packageName" : "electrosphere.net.parser", + "categories":[ + + { + "categoryName" : "Server", + "data" : [ + ], + "messageTypes" : [ + { + "messageName" : "Ping", + "description" : "Pings the other side of the socket", + "data" : [] + }, + { + "messageName" : "Pong", + "description" : "Replies to a ping from the other side of the socket", + "data" : [] + } + ] + }, + + + { + "categoryName" : "Auth", + "data" : [ + { + "name" : "user", + "type" : "VAR_STRING" + }, + { + "name" : "pass", + "type" : "VAR_STRING" + } + ], + "messageTypes" : [ + { + "messageName" : "AuthRequest", + "description" : "Requests authorization from the client", + "data" : [] + }, + { + "messageName" : "AuthDetails", + "description" : "Tells the server the auth details of this client", + "data" : [ + "user", + "pass" + ] + }, + { + "messageName" : "AuthSuccess", + "description" : "Tells the client it successfully logged in", + "data" : [] + }, + { + "messageName" : "AuthFailure", + "description" : "Tells the client it failed to log in", + "data" : [] + } + ] + } + + ] + } \ No newline at end of file diff --git a/net/synchronization.json b/src/net/synchronization.json similarity index 100% rename from net/synchronization.json rename to src/net/synchronization.json diff --git a/net/terrain.json b/src/net/terrain.json similarity index 96% rename from net/terrain.json rename to src/net/terrain.json index 4fc87611..496656ba 100644 --- a/net/terrain.json +++ b/src/net/terrain.json @@ -1,253 +1,253 @@ -{ - "outputPath" : "./src/main/java/electrosphere/net/parser/", - "packageName" : "electrosphere.net.parser", - "categories":[ - { - "categoryName" : "Terrain", - "data" : [ - { - "name" : "worldSizeDiscrete", - "type" : "FIXED_INT" - }, - { - "name" : "dynamicInterpolationRatio", - "type" : "FIXED_INT" - }, - { - "name" : "randomDampener", - "type" : "FIXED_FLOAT" - }, - { - "name" : "worldMinX", - "type" : "FIXED_INT" - }, - { - "name" : "worldMinY", - "type" : "FIXED_INT" - }, - { - "name" : "worldMaxX", - "type" : "FIXED_INT" - }, - { - "name" : "worldMaxY", - "type" : "FIXED_INT" - }, - - - { - "name" : "value", - "type" : "FIXED_FLOAT" - }, - - - { - "name" : "worldX", - "type" : "FIXED_INT" - }, - { - "name" : "worldY", - "type" : "FIXED_INT" - }, - { - "name" : "worldZ", - "type" : "FIXED_INT" - }, - - { - "name" : "voxelX", - "type" : "FIXED_INT" - }, - { - "name" : "voxelY", - "type" : "FIXED_INT" - }, - { - "name" : "voxelZ", - "type" : "FIXED_INT" - }, - - - - - { - "name" : "realLocationX", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "realLocationY", - "type" : "FIXED_DOUBLE" - }, - { - "name" : "realLocationZ", - "type" : "FIXED_DOUBLE" - }, - - - - { - "name" : "chunkData", - "type" : "BYTE_ARRAY" - }, - - { - "name" : "homogenousValue", - "type" : "FIXED_INT" - }, - - { - "name" : "chunkResolution", - "type" : "FIXED_INT" - }, - - { - "name" : "terrainWeight", - "type" : "FIXED_FLOAT" - }, - { - "name" : "terrainValue", - "type" : "FIXED_INT" - } - ], - "messageTypes" : [ - { - "messageName" : "RequestMetadata", - "description" : "Requests terrain metadata from the server", - "data" : [] - }, - { - "messageName" : "ResponseMetadata", - "description" : "Tell the client the terrain metadata", - "data" : [ - "worldSizeDiscrete", - "dynamicInterpolationRatio", - "randomDampener", - "worldMinX", - "worldMinY", - "worldMaxX", - "worldMaxY" - ] - }, - { - "messageName" : "RequestEditVoxel", - "description" : "Requests that a voxel be edited on the server", - "data" : [ - "worldX", - "worldY", - "worldZ", - "voxelX", - "voxelY", - "voxelZ", - "terrainWeight", - "terrainValue" - ] - }, - { - "messageName" : "UpdateVoxel", - "description" : "Tells the client to update a voxel's value", - "data" : [ - "worldX", - "worldY", - "worldZ", - "voxelX", - "voxelY", - "voxelZ", - "terrainWeight", - "terrainValue" - ] - }, - { - "messageName" : "RequestUseTerrainPalette", - "description" : "Requests that the current player entity use a given terrain palette", - "data" : [ - "realLocationX", - "realLocationY", - "realLocationZ", - "value", - "terrainWeight", - "terrainValue" - ] - }, - { - "messageName" : "SpawnPosition", - "description" : "Sets the spawn position of the client", - "data" : [ - "realLocationX", - "realLocationY", - "realLocationZ" - ] - }, - { - "messageName" : "RequestChunkData", - "description" : "Requests chunk data from the server", - "data" : [ - "worldX", - "worldY", - "worldZ" - ] - }, - { - "messageName" : "sendChunkData", - "description" : "Sends chunk data to the client", - "data" : [ - "worldX", - "worldY", - "worldZ", - "chunkData" - ] - }, - { - "messageName" : "RequestReducedChunkData", - "description" : "Requests reduced resolution chunk data from the server", - "data" : [ - "worldX", - "worldY", - "worldZ", - "chunkResolution" - ] - }, - { - "messageName" : "SendReducedChunkData", - "description" : "Sends chunk data to the client", - "data" : [ - "worldX", - "worldY", - "worldZ", - "chunkResolution", - "homogenousValue", - "chunkData" - ] - }, - { - "messageName" : "RequestFluidData", - "description" : "Requests a fluid data from the server", - "data" : [ - "worldX", - "worldY", - "worldZ" - ] - }, - { - "messageName" : "sendFluidData", - "description" : "Sends fluid data to the client", - "data" : [ - "worldX", - "worldY", - "worldZ", - "chunkData" - ] - }, - { - "messageName" : "updateFluidData", - "description" : "Updates fluid data on the client", - "data" : [ - "worldX", - "worldY", - "worldZ", - "chunkData" - ] - } - ] - } - ] +{ + "outputPath" : "./src/main/java/electrosphere/net/parser/", + "packageName" : "electrosphere.net.parser", + "categories":[ + { + "categoryName" : "Terrain", + "data" : [ + { + "name" : "worldSizeDiscrete", + "type" : "FIXED_INT" + }, + { + "name" : "dynamicInterpolationRatio", + "type" : "FIXED_INT" + }, + { + "name" : "randomDampener", + "type" : "FIXED_FLOAT" + }, + { + "name" : "worldMinX", + "type" : "FIXED_INT" + }, + { + "name" : "worldMinY", + "type" : "FIXED_INT" + }, + { + "name" : "worldMaxX", + "type" : "FIXED_INT" + }, + { + "name" : "worldMaxY", + "type" : "FIXED_INT" + }, + + + { + "name" : "value", + "type" : "FIXED_FLOAT" + }, + + + { + "name" : "worldX", + "type" : "FIXED_INT" + }, + { + "name" : "worldY", + "type" : "FIXED_INT" + }, + { + "name" : "worldZ", + "type" : "FIXED_INT" + }, + + { + "name" : "voxelX", + "type" : "FIXED_INT" + }, + { + "name" : "voxelY", + "type" : "FIXED_INT" + }, + { + "name" : "voxelZ", + "type" : "FIXED_INT" + }, + + + + + { + "name" : "realLocationX", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "realLocationY", + "type" : "FIXED_DOUBLE" + }, + { + "name" : "realLocationZ", + "type" : "FIXED_DOUBLE" + }, + + + + { + "name" : "chunkData", + "type" : "BYTE_ARRAY" + }, + + { + "name" : "homogenousValue", + "type" : "FIXED_INT" + }, + + { + "name" : "chunkResolution", + "type" : "FIXED_INT" + }, + + { + "name" : "terrainWeight", + "type" : "FIXED_FLOAT" + }, + { + "name" : "terrainValue", + "type" : "FIXED_INT" + } + ], + "messageTypes" : [ + { + "messageName" : "RequestMetadata", + "description" : "Requests terrain metadata from the server", + "data" : [] + }, + { + "messageName" : "ResponseMetadata", + "description" : "Tell the client the terrain metadata", + "data" : [ + "worldSizeDiscrete", + "dynamicInterpolationRatio", + "randomDampener", + "worldMinX", + "worldMinY", + "worldMaxX", + "worldMaxY" + ] + }, + { + "messageName" : "RequestEditVoxel", + "description" : "Requests that a voxel be edited on the server", + "data" : [ + "worldX", + "worldY", + "worldZ", + "voxelX", + "voxelY", + "voxelZ", + "terrainWeight", + "terrainValue" + ] + }, + { + "messageName" : "UpdateVoxel", + "description" : "Tells the client to update a voxel's value", + "data" : [ + "worldX", + "worldY", + "worldZ", + "voxelX", + "voxelY", + "voxelZ", + "terrainWeight", + "terrainValue" + ] + }, + { + "messageName" : "RequestUseTerrainPalette", + "description" : "Requests that the current player entity use a given terrain palette", + "data" : [ + "realLocationX", + "realLocationY", + "realLocationZ", + "value", + "terrainWeight", + "terrainValue" + ] + }, + { + "messageName" : "SpawnPosition", + "description" : "Sets the spawn position of the client", + "data" : [ + "realLocationX", + "realLocationY", + "realLocationZ" + ] + }, + { + "messageName" : "RequestChunkData", + "description" : "Requests chunk data from the server", + "data" : [ + "worldX", + "worldY", + "worldZ" + ] + }, + { + "messageName" : "sendChunkData", + "description" : "Sends chunk data to the client", + "data" : [ + "worldX", + "worldY", + "worldZ", + "chunkData" + ] + }, + { + "messageName" : "RequestReducedChunkData", + "description" : "Requests reduced resolution chunk data from the server", + "data" : [ + "worldX", + "worldY", + "worldZ", + "chunkResolution" + ] + }, + { + "messageName" : "SendReducedChunkData", + "description" : "Sends chunk data to the client", + "data" : [ + "worldX", + "worldY", + "worldZ", + "chunkResolution", + "homogenousValue", + "chunkData" + ] + }, + { + "messageName" : "RequestFluidData", + "description" : "Requests a fluid data from the server", + "data" : [ + "worldX", + "worldY", + "worldZ" + ] + }, + { + "messageName" : "sendFluidData", + "description" : "Sends fluid data to the client", + "data" : [ + "worldX", + "worldY", + "worldZ", + "chunkData" + ] + }, + { + "messageName" : "updateFluidData", + "description" : "Updates fluid data on the client", + "data" : [ + "worldX", + "worldY", + "worldZ", + "chunkData" + ] + } + ] + } + ] } \ No newline at end of file diff --git a/template.json b/template.json index c1463157..e4739f54 100644 --- a/template.json +++ b/template.json @@ -6,15 +6,15 @@ ], "subfiles" : [ - "./net/entity.json", - "./net/lore.json", - "./net/player.json", - "./net/terrain.json", - "./net/server.json", - "./net/character.json", - "./net/inventory.json", - "./net/synchronization.json", - "./net/combat.json" + "./src/net/entity.json", + "./src/net/lore.json", + "./src/net/player.json", + "./src/net/terrain.json", + "./src/net/server.json", + "./src/net/character.json", + "./src/net/inventory.json", + "./src/net/synchronization.json", + "./src/net/combat.json" ] } \ No newline at end of file diff --git a/tools/jenkinsDockerfile b/tools/jenkinsDockerfile deleted file mode 100644 index 7ba2d2bc..00000000 --- a/tools/jenkinsDockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM jenkins/jenkins:lts-jdk17 -USER root - -# C Build Utils -RUN apt-get update && apt-get install -y build-essential - -# Python (cant find package atm) -# RUN apt-get update && apt-get install -y python - -# Doxygen -RUN apt-get update && apt-get install -y wget -RUN cd /tmp && \ - mkdir doxygen && \ - cd doxygen && \ - wget https://www.doxygen.nl/files/doxygen-1.11.0.linux.bin.tar.gz && \ - tar -xzvf ./doxygen-1.11.0.linux.bin.tar.gz && \ - cp ./doxygen-1.11.0/bin/* /usr/local/bin/ - -# xvfb for jenkins plugin + dependencies required to actually render lwjgl -RUN apt-get update && apt-get install -y xvfb mesa-utils libxrender1 libxext6 libxtst6 libxi6 - -USER jenkins