diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..8b662bc --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[registries.strafesnet] +index = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" \ No newline at end of file diff --git a/strafe-client/.gitignore b/strafe-client/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/strafe-client/.gitignore @@ -0,0 +1 @@ +/target diff --git a/strafe-client/CONTRIBUTING.md b/strafe-client/CONTRIBUTING.md new file mode 100644 index 0000000..fbf96cc --- /dev/null +++ b/strafe-client/CONTRIBUTING.md @@ -0,0 +1 @@ +By contributing code to the [StrafesNET project](https://git.itzana.me/StrafesNET/strafe-client), you agree to license your contribution under the [License](LICENSE). \ No newline at end of file diff --git a/strafe-client/Cargo.lock b/strafe-client/Cargo.lock new file mode 100644 index 0000000..07bfa78 --- /dev/null +++ b/strafe-client/Cargo.lock @@ -0,0 +1,3210 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph" +version = "0.2.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79faae4620f45232f599d9bc7b290f88247a0834162c4495ab2f02d60004adfb" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.6.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "beef" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1" + +[[package]] +name = "binrw" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f36b7cb3ab9ff6a2858650d8dc360e783a5d14dc29594db48c56a3c233cc265" +dependencies = [ + "array-init", + "binrw_derive", + "bytemuck", +] + +[[package]] +name = "binrw_derive" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ea7a8c5c8eeffffac6d54d172444e15beffac6f817fac714460a9a9aa88da3" +dependencies = [ + "either", + "owo-colors", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bit-set" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "blake3" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "bnum" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50202def95bf36cb7d1d7a7962cea1c36a3f8ad42425e5d2b71d7acb8041b5b8" + +[[package]] +name = "bstr" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", +] + +[[package]] +name = "bytemuck" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "byteorder" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.6.0", + "log", + "polling", + "rustix", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8d9e0b4957f635b8d3da819d0db5603620467ecf1f692d22a8c2717ce27e6d8" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx", + "num-traits", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "com" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "com_macros_support" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "configparser" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57e3272f0190c3f1584272d613719ba5fc7df7f4942fe542e63d949cf3a649b" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "d3d12" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdbd1f579714e3c809ebd822c81ef148b1ceaeb3d535352afc73fd0c4c6a0017" +dependencies = [ + "bitflags 2.6.0", + "libloading", + "winapi", +] + +[[package]] +name = "ddsfile" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479dfe1e6737aa9e96c6ac7b69689dc4c32da8383f2c12744739d76afa8b66c4" +dependencies = [ + "bitflags 2.6.0", + "byteorder 1.5.0", + "enum-primitive-derive", + "num-traits", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "enum-primitive-derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c375b9c5eadb68d0a6efee2999fef292f45854c3444c86f09d8ab086ba942b0e" +dependencies = [ + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "fixed_wide" +version = "0.1.1" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "d9c2cf115b3785ede870fada07e8b1aeba3378345b4ca86fe3c772ecabc05c0f" +dependencies = [ + "arrayvec", + "bnum", + "paste", + "ratio_ops", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28091a37a5d09b555cb6628fd954da299b536433834f5b8e59eba78e0cbbf8a" + +[[package]] +name = "glow" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e1951bbd9434a81aa496fe59ccc2235af3820d27b85f9314e279609211e2c" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.6.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd4240fc91d3433d5e5b0fc5b67672d771850dc19bbee03c1381e19322803d7" +dependencies = [ + "log", + "presser", + "thiserror", + "winapi", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c08c1f623a8d0b722b8b99f821eb0ba672a1618f0d3b16ddbee1cedd2dd8557" +dependencies = [ + "bitflags 2.6.0", + "gpu-descriptor-types", + "hashbrown 0.14.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "hassle-rs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +dependencies = [ + "bitflags 2.6.0", + "com", + "libc", + "libloading", + "thiserror", + "widestring", + "winapi", +] + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "id" +version = "0.1.0" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "2337e7a6c273082b672e377e159d7a168fb51438461b7c4033c79a515dd7a25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy-regex" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d8e41c97e6bc7ecb552016274b99fbb5d035e8de288c582d9b933af6677bfda" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e1d8b05d672c53cb9c7b920bbba8783845ae4f0b076e02a3db1d02c81b4163" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn 2.0.79", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.159" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" + +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linear_ops" +version = "0.1.0" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "b2e6977ac24f47086d8a7a2d4ae1c720e86dfdc8407cf5e34c18bfa01053c456" +dependencies = [ + "fixed_wide", + "paste", + "ratio_ops", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "logos" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6b6e02facda28ca5fb8dbe4b152496ba3b1bd5a4b40bb2b1b2d8ad74e0f39b" +dependencies = [ + "logos-derive", +] + +[[package]] +name = "logos-codegen" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32eb6b5f26efacd015b000bfc562186472cd9b34bdba3f6b264e2a052676d10" +dependencies = [ + "beef", + "fnv", + "lazy_static", + "proc-macro2", + "quote", + "regex-syntax", + "syn 2.0.79", +] + +[[package]] +name = "logos-derive" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5d0c5463c911ef55624739fc353238b4e310f0144be1f875dc42fec6bfd5ec" +dependencies = [ + "logos-codegen", +] + +[[package]] +name = "luau0-src" +version = "0.10.3+luau640" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f39d12b514a676c943990cfbe6200fedcb9c293c8c9219d29be512a6969be92" +dependencies = [ + "cc", +] + +[[package]] +name = "lz4" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d1febb2b4a79ddd1980eede06a8f7902197960aa0383ffcfdd62fe723036725" +dependencies = [ + "lz4-sys", +] + +[[package]] +name = "lz4-sys" +version = "1.11.1+lz4-1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "lzma" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "782ba3f542e8bc1349386c15e9dc3119ae6da96479f96b3863cc7a88bbdfd4e4" +dependencies = [ + "byteorder 0.5.3", +] + +[[package]] +name = "lzma-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297e814c836ae64db86b36cf2a557ba54368d03f6afcd7d947c266692f71115e" +dependencies = [ + "byteorder 1.5.0", + "crc", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.6.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "miette" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" +dependencies = [ + "cfg-if", + "miette-derive", + "thiserror", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "7.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "mlua" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d111deb18a9c9bd33e1541309f4742523bfab01d276bfa9a27519f6de9c11dc7" +dependencies = [ + "bstr", + "libloading", + "mlua-sys", + "num-traits", + "once_cell", + "rustc-hash 2.0.0", +] + +[[package]] +name = "mlua-sys" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe026d6bd1583a9cf9080e189030ddaea7e6f5f0deb366a8e26f8a26c4135b8" +dependencies = [ + "cc", + "cfg-if", + "luau0-src", + "pkg-config", +] + +[[package]] +name = "naga" +version = "22.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bd5a652b6faf21496f2cfd88fc49989c8db0825d1f6746b1a71a6ede24a63ad" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.6.0", + "cfg_aliases 0.1.1", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "rustc-hash 1.1.0", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490d3a563d3122bf7c911a59b0add9389e5ec0f5f0c3ac6b91ff235a0e6a7f90" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.7", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "parse-display" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" +dependencies = [ + "parse-display-derive", + "regex", + "regex-syntax", +] + +[[package]] +name = "parse-display-derive" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae7800a4c974efd12df917266338e79a7a74415173caf7e70aa0a0707345281" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "regex-syntax", + "structmeta", + "syn 2.0.79", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "polling" +version = "3.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.79", +] + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "range-alloc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" + +[[package]] +name = "ratio_ops" +version = "0.1.0" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "01239195d6afe0509e7e3511b716c0540251dfe7ece0a9a5a27116afb766c42c" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rbx_binary" +version = "0.7.4" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "18b401155b93f7151217bf51e36bdfa7bddcaf5f0d26b563c9ac3b08a3701c27" +dependencies = [ + "log", + "lz4", + "profiling", + "rbx_dom_weak", + "rbx_reflection", + "rbx_reflection_database", + "thiserror", +] + +[[package]] +name = "rbx_dom_weak" +version = "2.9.0" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "2a6b916687c98aaea36f9c03e80906bfafab057bebee248628c8c04def807f43" +dependencies = [ + "rbx_types", + "serde", +] + +[[package]] +name = "rbx_mesh" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864ead0e98afce28c960f653d6203483834890d07f87b60e2f01415530a2fe9d" +dependencies = [ + "binrw", + "lazy-regex", +] + +[[package]] +name = "rbx_reflection" +version = "4.7.0" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "c1b43fe592a4ce6fe54eb215fb82735efbb516d2cc045a94e3dc0234ff293620" +dependencies = [ + "rbx_types", + "serde", + "thiserror", +] + +[[package]] +name = "rbx_reflection_database" +version = "0.2.12+roblox-638" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "2e772bb9e1bc0ebe65d338f876d1bb1ea22e15a8f9a82e8245028010c2fea3c9" +dependencies = [ + "lazy_static", + "rbx_reflection", + "rmp-serde", + "serde", +] + +[[package]] +name = "rbx_types" +version = "1.10.0" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "d7a390c44034fa448c53bd0983dfc2d70d8d6b2f65be4f164d4bec8b6a2a2d09" +dependencies = [ + "base64", + "bitflags 1.3.2", + "blake3", + "lazy_static", + "rand", + "serde", + "thiserror", +] + +[[package]] +name = "rbx_xml" +version = "0.13.3" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "d6d1a15f58a1e4b4f578abe6eb5e1461cb16eea82fb4a147d5995c9b79f08d1f" +dependencies = [ + "base64", + "log", + "rbx_dom_weak", + "rbx_reflection", + "rbx_reflection_database", + "xml-rs", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder 1.5.0", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder 1.5.0", + "rmp", + "serde", +] + +[[package]] +name = "roblox_emulator" +version = "0.4.1" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "6935943e8d473c8d19b52623877bee18421743072e2675730886d13592008266" +dependencies = [ + "glam", + "mlua", + "rbx_dom_weak", + "rbx_reflection", + "rbx_reflection_database", + "rbx_types", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.6.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strafe-client" +version = "0.10.5" +dependencies = [ + "bytemuck", + "configparser", + "ddsfile", + "glam", + "id", + "parking_lot", + "pollster", + "strafesnet_bsp_loader", + "strafesnet_common", + "strafesnet_deferred_loader", + "strafesnet_rbx_loader", + "strafesnet_snf", + "wgpu", + "winit", +] + +[[package]] +name = "strafesnet_bsp_loader" +version = "0.2.2" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "34f944637bc3b3ed4c430819c672174b3a3edfd51f79b6b87f4931e3714a398e" +dependencies = [ + "glam", + "strafesnet_common", + "vbsp", + "vmdl", +] + +[[package]] +name = "strafesnet_common" +version = "0.5.2" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "91cc1f3699bd8248da18bf5d11273264396a257b5d47b8558acb2cb4e1761219" +dependencies = [ + "arrayvec", + "bitflags 2.6.0", + "fixed_wide", + "glam", + "id", + "linear_ops", + "ratio_ops", +] + +[[package]] +name = "strafesnet_deferred_loader" +version = "0.4.1" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "cb47034893e945c640063a6c0fb09c6186dcc9f0b221b8c41f5a22070fe430f4" +dependencies = [ + "strafesnet_common", + "url", + "vbsp", +] + +[[package]] +name = "strafesnet_rbx_loader" +version = "0.5.2" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "bb852ee329d26410daee50f1e583ea8286caf6a81a42ff887b78f21477c48731" +dependencies = [ + "bytemuck", + "glam", + "lazy-regex", + "rbx_binary", + "rbx_dom_weak", + "rbx_mesh", + "rbx_reflection_database", + "rbx_xml", + "roblox_emulator", + "strafesnet_common", +] + +[[package]] +name = "strafesnet_snf" +version = "0.2.0" +source = "sparse+https://git.itzana.me/api/packages/strafesnet/cargo/" +checksum = "c6e8856d79c29bd5687b08bc1653370f7e242c84d5c06afa8629bd3e00c433bf" +dependencies = [ + "binrw", + "id", + "strafesnet_common", +] + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "structmeta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive", + "syn 2.0.79", +] + +[[package]] +name = "structmeta-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "ttf-parser" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "vbsp" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f14a5685e0bb386aac9b9c6046a05152a46a0bc58d53afb3fbe577f1a1c2bb05" +dependencies = [ + "ahash", + "arrayvec", + "binrw", + "bitflags 2.6.0", + "bv", + "cgmath", + "itertools", + "lzma-rs", + "num_enum", + "serde", + "static_assertions", + "thiserror", + "vdf-reader", + "zip-lzma", +] + +[[package]] +name = "vdf-reader" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "543945fdc3d51b20e3e0f5fd845ddeca4a270e56522035cf152105bc144ffd65" +dependencies = [ + "logos", + "miette", + "parse-display", + "serde", + "thiserror", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vmdl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2f6b8c22da8937403a5da864e7ea390f30cd40b7a077079e40279aa6a4f553" +dependencies = [ + "arrayvec", + "bitflags 2.6.0", + "bytemuck", + "cgmath", + "half", + "itertools", + "num_enum", + "static_assertions", + "thiserror", + "tracing", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" + +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +dependencies = [ + "bitflags 2.6.0", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.6.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a94697e66e76c85923b0d28a0c251e8f0666f58fc47d316c0f4da6da75d37cb" +dependencies = [ + "rustix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0a41a6875e585172495f7a96dfa42ca7e0213868f4f15c313f7c33221a7eff" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad87b5fd1b1d3ca2f792df8f686a2a11e3fe1077b71096f7a175ab699f89109" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wgpu" +version = "22.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d1c4ba43f80542cf63a0a6ed3134629ae73e8ab51e4b765a67f3aa062eb433" +dependencies = [ + "arrayvec", + "cfg_aliases 0.1.1", + "document-features", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "22.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348c840d1051b8e86c3bcd31206080c5e71e5933dabd79be1ce732b0b2f089a" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.6.0", + "cfg_aliases 0.1.1", + "document-features", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6bbf4b4de8b2a83c0401d9e5ae0080a2792055f25859a02bf9be97952bbed4f" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.6.0", + "block", + "cfg_aliases 0.1.1", + "core-graphics-types", + "d3d12", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash 1.1.0", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "22.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9d91f0e2c4b51434dfa6db77846f2793149d8e73f800fa2e41f52b8eac3c5d" +dependencies = [ + "bitflags 2.6.0", + "js-sys", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7219d36b6eac893fa81e84ebe06485e7dcbb616177469b142df14f1f4deb1311" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.30.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.6.0", + "block2", + "bytemuck", + "calloop", + "cfg_aliases 0.2.1", + "concurrent-queue", + "core-foundation", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.6.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder 1.5.0", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "zip-lzma" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b480cb31fccfb2786565c0e0712865fd6f1ea0ea850c50316f643c3948196e63" +dependencies = [ + "byteorder 1.5.0", + "crc32fast", + "crossbeam-utils", + "lzma", +] diff --git a/strafe-client/Cargo.toml b/strafe-client/Cargo.toml new file mode 100644 index 0000000..3a3c79b --- /dev/null +++ b/strafe-client/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "strafe-client" +version = "0.10.5" +edition = "2021" +repository = "https://git.itzana.me/StrafesNET/strafe-client" +license = "Custom" +description = "StrafesNET game client for bhop and surf." +authors = ["Rhys Lloyd "] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +default = ["snf"] +snf = ["dep:strafesnet_snf"] +source = ["dep:strafesnet_deferred_loader", "dep:strafesnet_bsp_loader"] +roblox = ["dep:strafesnet_deferred_loader", "dep:strafesnet_rbx_loader"] + +[dependencies] +bytemuck = { version = "1.13.1", features = ["derive"] } +configparser = "3.0.2" +ddsfile = "0.5.1" +glam = "0.29.0" +id = { version = "0.1.0", registry = "strafesnet" } +parking_lot = "0.12.1" +pollster = "0.3.0" +strafesnet_bsp_loader = { version = "0.2.1", registry = "strafesnet", optional = true } +strafesnet_common = { version = "0.5.2", registry = "strafesnet" } +strafesnet_deferred_loader = { version = "0.4.0", features = ["legacy"], registry = "strafesnet", optional = true } +strafesnet_rbx_loader = { version = "0.5.1", registry = "strafesnet", optional = true } +strafesnet_snf = { version = "0.2.0", registry = "strafesnet", optional = true } +wgpu = "22.1.0" +winit = "0.30.5" + +[profile.release] +#lto = true +strip = true +codegen-units = 1 diff --git a/strafe-client/LICENSE b/strafe-client/LICENSE new file mode 100644 index 0000000..f6ff6bc --- /dev/null +++ b/strafe-client/LICENSE @@ -0,0 +1,8 @@ +/******************************************************* +* Copyright (C) 2023-2024 Rhys Lloyd +* +* This file is part of the StrafesNET bhop/surf client. +* +* StrafesNET can not be copied and/or distributed +* without the express permission of Rhys Lloyd +*******************************************************/ \ No newline at end of file diff --git a/strafe-client/README.md b/strafe-client/README.md new file mode 100644 index 0000000..d7c1688 --- /dev/null +++ b/strafe-client/README.md @@ -0,0 +1,10 @@ + + +# Strafe Client +In development client for jumping on squares (and riding on triangles) + +## How to build and run +1. Have rust and git installed +2. `git clone https://git.itzana.me/StrafesNET/strafe-client` +3. `cd strafe-client` +4. `cargo run --release` diff --git a/strafe-client/images/astc.dds b/strafe-client/images/astc.dds new file mode 100644 index 0000000..b1bee88 Binary files /dev/null and b/strafe-client/images/astc.dds differ diff --git a/strafe-client/images/bc1.dds b/strafe-client/images/bc1.dds new file mode 100644 index 0000000..4a9ec28 Binary files /dev/null and b/strafe-client/images/bc1.dds differ diff --git a/strafe-client/images/bgra.dds b/strafe-client/images/bgra.dds new file mode 100644 index 0000000..de3135c Binary files /dev/null and b/strafe-client/images/bgra.dds differ diff --git a/strafe-client/images/etc2.dds b/strafe-client/images/etc2.dds new file mode 100644 index 0000000..77a3fa0 Binary files /dev/null and b/strafe-client/images/etc2.dds differ diff --git a/strafe-client/images/squid.dds b/strafe-client/images/squid.dds new file mode 100644 index 0000000..bbb9661 Binary files /dev/null and b/strafe-client/images/squid.dds differ diff --git a/strafe-client/models/suzanne.obj b/strafe-client/models/suzanne.obj new file mode 100644 index 0000000..7d657dc --- /dev/null +++ b/strafe-client/models/suzanne.obj @@ -0,0 +1,2580 @@ +# Blender3D v249 OBJ File: suzanne.blend +# www.blender3d.org +v 0.437500 0.164063 0.765625 +v -0.437500 0.164063 0.765625 +v 0.500000 0.093750 0.687500 +v -0.500000 0.093750 0.687500 +v 0.546875 0.054688 0.578125 +v -0.546875 0.054688 0.578125 +v 0.351563 -0.023438 0.617188 +v -0.351563 -0.023438 0.617188 +v 0.351563 0.031250 0.718750 +v -0.351563 0.031250 0.718750 +v 0.351563 0.132813 0.781250 +v -0.351563 0.132813 0.781250 +v 0.273438 0.164063 0.796875 +v -0.273438 0.164063 0.796875 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.156250 0.054688 0.648438 +v -0.156250 0.054688 0.648438 +v 0.078125 0.242188 0.656250 +v -0.078125 0.242188 0.656250 +v 0.140625 0.242188 0.742188 +v -0.140625 0.242188 0.742188 +v 0.242188 0.242188 0.796875 +v -0.242188 0.242188 0.796875 +v 0.273438 0.328125 0.796875 +v -0.273438 0.328125 0.796875 +v 0.203125 0.390625 0.742188 +v -0.203125 0.390625 0.742188 +v 0.156250 0.437500 0.648438 +v -0.156250 0.437500 0.648438 +v 0.351563 0.515625 0.617188 +v -0.351563 0.515625 0.617188 +v 0.351563 0.453125 0.718750 +v -0.351563 0.453125 0.718750 +v 0.351563 0.359375 0.781250 +v -0.351563 0.359375 0.781250 +v 0.437500 0.328125 0.765625 +v -0.437500 0.328125 0.765625 +v 0.500000 0.390625 0.687500 +v -0.500000 0.390625 0.687500 +v 0.546875 0.437500 0.578125 +v -0.546875 0.437500 0.578125 +v 0.625000 0.242188 0.562500 +v -0.625000 0.242188 0.562500 +v 0.562500 0.242188 0.671875 +v -0.562500 0.242188 0.671875 +v 0.468750 0.242188 0.757813 +v -0.468750 0.242188 0.757813 +v 0.476563 0.242188 0.773438 +v -0.476563 0.242188 0.773438 +v 0.445313 0.335938 0.781250 +v -0.445313 0.335938 0.781250 +v 0.351563 0.375000 0.804688 +v -0.351563 0.375000 0.804688 +v 0.265625 0.335938 0.820313 +v -0.265625 0.335938 0.820313 +v 0.226563 0.242188 0.820313 +v -0.226563 0.242188 0.820313 +v 0.265625 0.156250 0.820313 +v -0.265625 0.156250 0.820313 +v 0.351563 0.242188 0.828125 +v -0.351563 0.242188 0.828125 +v 0.351563 0.117188 0.804688 +v -0.351563 0.117188 0.804688 +v 0.445313 0.156250 0.781250 +v -0.445313 0.156250 0.781250 +v 0.000000 0.429688 0.742188 +v 0.000000 0.351563 0.820313 +v 0.000000 -0.679688 0.734375 +v 0.000000 -0.320313 0.781250 +v 0.000000 -0.187500 0.796875 +v 0.000000 -0.773438 0.718750 +v 0.000000 0.406250 0.601563 +v 0.000000 0.570313 0.570313 +v 0.000000 0.898438 -0.546875 +v 0.000000 0.562500 -0.851563 +v 0.000000 0.070313 -0.828125 +v 0.000000 -0.382813 -0.351563 +v 0.203125 -0.187500 0.562500 +v -0.203125 -0.187500 0.562500 +v 0.312500 -0.437500 0.570313 +v -0.312500 -0.437500 0.570313 +v 0.351563 -0.695313 0.570313 +v -0.351563 -0.695313 0.570313 +v 0.367188 -0.890625 0.531250 +v -0.367188 -0.890625 0.531250 +v 0.328125 -0.945313 0.523438 +v -0.328125 -0.945313 0.523438 +v 0.179688 -0.968750 0.554688 +v -0.179688 -0.968750 0.554688 +v 0.000000 -0.984375 0.578125 +v 0.437500 -0.140625 0.531250 +v -0.437500 -0.140625 0.531250 +v 0.632813 -0.039063 0.539063 +v -0.632813 -0.039063 0.539063 +v 0.828125 0.148438 0.445313 +v -0.828125 0.148438 0.445313 +v 0.859375 0.429688 0.593750 +v -0.859375 0.429688 0.593750 +v 0.710938 0.484375 0.625000 +v -0.710938 0.484375 0.625000 +v 0.492188 0.601563 0.687500 +v -0.492188 0.601563 0.687500 +v 0.320313 0.757813 0.734375 +v -0.320313 0.757813 0.734375 +v 0.156250 0.718750 0.757813 +v -0.156250 0.718750 0.757813 +v 0.062500 0.492188 0.750000 +v -0.062500 0.492188 0.750000 +v 0.164063 0.414063 0.773438 +v -0.164063 0.414063 0.773438 +v 0.125000 0.304688 0.765625 +v -0.125000 0.304688 0.765625 +v 0.203125 0.093750 0.742188 +v -0.203125 0.093750 0.742188 +v 0.375000 0.015625 0.703125 +v -0.375000 0.015625 0.703125 +v 0.492188 0.062500 0.671875 +v -0.492188 0.062500 0.671875 +v 0.625000 0.187500 0.648438 +v -0.625000 0.187500 0.648438 +v 0.640625 0.296875 0.648438 +v -0.640625 0.296875 0.648438 +v 0.601563 0.375000 0.664063 +v -0.601563 0.375000 0.664063 +v 0.429688 0.437500 0.718750 +v -0.429688 0.437500 0.718750 +v 0.250000 0.468750 0.757813 +v -0.250000 0.468750 0.757813 +v 0.000000 -0.765625 0.734375 +v 0.109375 -0.718750 0.734375 +v -0.109375 -0.718750 0.734375 +v 0.117188 -0.835938 0.710938 +v -0.117188 -0.835938 0.710938 +v 0.062500 -0.882813 0.695313 +v -0.062500 -0.882813 0.695313 +v 0.000000 -0.890625 0.687500 +v 0.000000 -0.195313 0.750000 +v 0.000000 -0.140625 0.742188 +v 0.101563 -0.148438 0.742188 +v -0.101563 -0.148438 0.742188 +v 0.125000 -0.226563 0.750000 +v -0.125000 -0.226563 0.750000 +v 0.085938 -0.289063 0.742188 +v -0.085938 -0.289063 0.742188 +v 0.398438 -0.046875 0.671875 +v -0.398438 -0.046875 0.671875 +v 0.617188 0.054688 0.625000 +v -0.617188 0.054688 0.625000 +v 0.726563 0.203125 0.601563 +v -0.726563 0.203125 0.601563 +v 0.742188 0.375000 0.656250 +v -0.742188 0.375000 0.656250 +v 0.687500 0.414063 0.726563 +v -0.687500 0.414063 0.726563 +v 0.437500 0.546875 0.796875 +v -0.437500 0.546875 0.796875 +v 0.312500 0.640625 0.835938 +v -0.312500 0.640625 0.835938 +v 0.203125 0.617188 0.851563 +v -0.203125 0.617188 0.851563 +v 0.101563 0.429688 0.843750 +v -0.101563 0.429688 0.843750 +v 0.125000 -0.101563 0.812500 +v -0.125000 -0.101563 0.812500 +v 0.210938 -0.445313 0.710938 +v -0.210938 -0.445313 0.710938 +v 0.250000 -0.703125 0.687500 +v -0.250000 -0.703125 0.687500 +v 0.265625 -0.820313 0.664063 +v -0.265625 -0.820313 0.664063 +v 0.234375 -0.914063 0.632813 +v -0.234375 -0.914063 0.632813 +v 0.164063 -0.929688 0.632813 +v -0.164063 -0.929688 0.632813 +v 0.000000 -0.945313 0.640625 +v 0.000000 0.046875 0.726563 +v 0.000000 0.210938 0.765625 +v 0.328125 0.476563 0.742188 +v -0.328125 0.476563 0.742188 +v 0.164063 0.140625 0.750000 +v -0.164063 0.140625 0.750000 +v 0.132813 0.210938 0.757813 +v -0.132813 0.210938 0.757813 +v 0.117188 -0.687500 0.734375 +v -0.117188 -0.687500 0.734375 +v 0.078125 -0.445313 0.750000 +v -0.078125 -0.445313 0.750000 +v 0.000000 -0.445313 0.750000 +v 0.000000 -0.328125 0.742188 +v 0.093750 -0.273438 0.781250 +v -0.093750 -0.273438 0.781250 +v 0.132813 -0.226563 0.796875 +v -0.132813 -0.226563 0.796875 +v 0.109375 -0.132813 0.781250 +v -0.109375 -0.132813 0.781250 +v 0.039063 -0.125000 0.781250 +v -0.039063 -0.125000 0.781250 +v 0.000000 -0.203125 0.828125 +v 0.046875 -0.148438 0.812500 +v -0.046875 -0.148438 0.812500 +v 0.093750 -0.156250 0.812500 +v -0.093750 -0.156250 0.812500 +v 0.109375 -0.226563 0.828125 +v -0.109375 -0.226563 0.828125 +v 0.078125 -0.250000 0.804688 +v -0.078125 -0.250000 0.804688 +v 0.000000 -0.289063 0.804688 +v 0.257813 -0.312500 0.554688 +v -0.257813 -0.312500 0.554688 +v 0.164063 -0.242188 0.710938 +v -0.164063 -0.242188 0.710938 +v 0.179688 -0.312500 0.710938 +v -0.179688 -0.312500 0.710938 +v 0.234375 -0.250000 0.554688 +v -0.234375 -0.250000 0.554688 +v 0.000000 -0.875000 0.687500 +v 0.046875 -0.867188 0.687500 +v -0.046875 -0.867188 0.687500 +v 0.093750 -0.820313 0.710938 +v -0.093750 -0.820313 0.710938 +v 0.093750 -0.742188 0.726563 +v -0.093750 -0.742188 0.726563 +v 0.000000 -0.781250 0.656250 +v 0.093750 -0.750000 0.664063 +v -0.093750 -0.750000 0.664063 +v 0.093750 -0.812500 0.640625 +v -0.093750 -0.812500 0.640625 +v 0.046875 -0.851563 0.632813 +v -0.046875 -0.851563 0.632813 +v 0.000000 -0.859375 0.632813 +v 0.171875 0.218750 0.781250 +v -0.171875 0.218750 0.781250 +v 0.187500 0.156250 0.773438 +v -0.187500 0.156250 0.773438 +v 0.335938 0.429688 0.757813 +v -0.335938 0.429688 0.757813 +v 0.273438 0.421875 0.773438 +v -0.273438 0.421875 0.773438 +v 0.421875 0.398438 0.773438 +v -0.421875 0.398438 0.773438 +v 0.562500 0.351563 0.695313 +v -0.562500 0.351563 0.695313 +v 0.585938 0.289063 0.687500 +v -0.585938 0.289063 0.687500 +v 0.578125 0.195313 0.679688 +v -0.578125 0.195313 0.679688 +v 0.476563 0.101563 0.718750 +v -0.476563 0.101563 0.718750 +v 0.375000 0.062500 0.742188 +v -0.375000 0.062500 0.742188 +v 0.226563 0.109375 0.781250 +v -0.226563 0.109375 0.781250 +v 0.179688 0.296875 0.781250 +v -0.179688 0.296875 0.781250 +v 0.210938 0.375000 0.781250 +v -0.210938 0.375000 0.781250 +v 0.234375 0.359375 0.757813 +v -0.234375 0.359375 0.757813 +v 0.195313 0.296875 0.757813 +v -0.195313 0.296875 0.757813 +v 0.242188 0.125000 0.757813 +v -0.242188 0.125000 0.757813 +v 0.375000 0.085938 0.726563 +v -0.375000 0.085938 0.726563 +v 0.460938 0.117188 0.703125 +v -0.460938 0.117188 0.703125 +v 0.546875 0.210938 0.671875 +v -0.546875 0.210938 0.671875 +v 0.554688 0.281250 0.671875 +v -0.554688 0.281250 0.671875 +v 0.531250 0.335938 0.679688 +v -0.531250 0.335938 0.679688 +v 0.414063 0.390625 0.750000 +v -0.414063 0.390625 0.750000 +v 0.281250 0.398438 0.765625 +v -0.281250 0.398438 0.765625 +v 0.335938 0.406250 0.750000 +v -0.335938 0.406250 0.750000 +v 0.203125 0.171875 0.750000 +v -0.203125 0.171875 0.750000 +v 0.195313 0.226563 0.750000 +v -0.195313 0.226563 0.750000 +v 0.109375 0.460938 0.609375 +v -0.109375 0.460938 0.609375 +v 0.195313 0.664063 0.617188 +v -0.195313 0.664063 0.617188 +v 0.335938 0.687500 0.593750 +v -0.335938 0.687500 0.593750 +v 0.484375 0.554688 0.554688 +v -0.484375 0.554688 0.554688 +v 0.679688 0.453125 0.492188 +v -0.679688 0.453125 0.492188 +v 0.796875 0.406250 0.460938 +v -0.796875 0.406250 0.460938 +v 0.773438 0.164063 0.375000 +v -0.773438 0.164063 0.375000 +v 0.601563 0.000000 0.414063 +v -0.601563 0.000000 0.414063 +v 0.437500 -0.093750 0.468750 +v -0.437500 -0.093750 0.468750 +v 0.000000 0.898438 0.289063 +v 0.000000 0.984375 -0.078125 +v 0.000000 -0.195313 -0.671875 +v 0.000000 -0.460938 0.187500 +v 0.000000 -0.976563 0.460938 +v 0.000000 -0.804688 0.343750 +v 0.000000 -0.570313 0.320313 +v 0.000000 -0.484375 0.281250 +v 0.851563 0.234375 0.054688 +v -0.851563 0.234375 0.054688 +v 0.859375 0.320313 -0.046875 +v -0.859375 0.320313 -0.046875 +v 0.773438 0.265625 -0.437500 +v -0.773438 0.265625 -0.437500 +v 0.460938 0.437500 -0.703125 +v -0.460938 0.437500 -0.703125 +v 0.734375 -0.046875 0.070313 +v -0.734375 -0.046875 0.070313 +v 0.593750 -0.125000 -0.164063 +v -0.593750 -0.125000 -0.164063 +v 0.640625 -0.007813 -0.429688 +v -0.640625 -0.007813 -0.429688 +v 0.335938 0.054688 -0.664063 +v -0.335938 0.054688 -0.664063 +v 0.234375 -0.351563 0.406250 +v -0.234375 -0.351563 0.406250 +v 0.179688 -0.414063 0.257813 +v -0.179688 -0.414063 0.257813 +v 0.289063 -0.710938 0.382813 +v -0.289063 -0.710938 0.382813 +v 0.250000 -0.500000 0.390625 +v -0.250000 -0.500000 0.390625 +v 0.328125 -0.914063 0.398438 +v -0.328125 -0.914063 0.398438 +v 0.140625 -0.757813 0.367188 +v -0.140625 -0.757813 0.367188 +v 0.125000 -0.539063 0.359375 +v -0.125000 -0.539063 0.359375 +v 0.164063 -0.945313 0.437500 +v -0.164063 -0.945313 0.437500 +v 0.218750 -0.281250 0.429688 +v -0.218750 -0.281250 0.429688 +v 0.210938 -0.226563 0.468750 +v -0.210938 -0.226563 0.468750 +v 0.203125 -0.171875 0.500000 +v -0.203125 -0.171875 0.500000 +v 0.210938 -0.390625 0.164063 +v -0.210938 -0.390625 0.164063 +v 0.296875 -0.312500 -0.265625 +v -0.296875 -0.312500 -0.265625 +v 0.343750 -0.148438 -0.539063 +v -0.343750 -0.148438 -0.539063 +v 0.453125 0.867188 -0.382813 +v -0.453125 0.867188 -0.382813 +v 0.453125 0.929688 -0.070313 +v -0.453125 0.929688 -0.070313 +v 0.453125 0.851563 0.234375 +v -0.453125 0.851563 0.234375 +v 0.460938 0.523438 0.429688 +v -0.460938 0.523438 0.429688 +v 0.726563 0.406250 0.335938 +v -0.726563 0.406250 0.335938 +v 0.632813 0.453125 0.281250 +v -0.632813 0.453125 0.281250 +v 0.640625 0.703125 0.054688 +v -0.640625 0.703125 0.054688 +v 0.796875 0.562500 0.125000 +v -0.796875 0.562500 0.125000 +v 0.796875 0.617188 -0.117188 +v -0.796875 0.617188 -0.117188 +v 0.640625 0.750000 -0.195313 +v -0.640625 0.750000 -0.195313 +v 0.640625 0.679688 -0.445313 +v -0.640625 0.679688 -0.445313 +v 0.796875 0.539063 -0.359375 +v -0.796875 0.539063 -0.359375 +v 0.617188 0.328125 -0.585938 +v -0.617188 0.328125 -0.585938 +v 0.484375 0.023438 -0.546875 +v -0.484375 0.023438 -0.546875 +v 0.820313 0.328125 -0.203125 +v -0.820313 0.328125 -0.203125 +v 0.406250 -0.171875 0.148438 +v -0.406250 -0.171875 0.148438 +v 0.429688 -0.195313 -0.210938 +v -0.429688 -0.195313 -0.210938 +v 0.890625 0.406250 -0.234375 +v -0.890625 0.406250 -0.234375 +v 0.773438 -0.140625 -0.125000 +v -0.773438 -0.140625 -0.125000 +v 1.039063 -0.101563 -0.328125 +v -1.039063 -0.101563 -0.328125 +v 1.281250 0.054688 -0.429688 +v -1.281250 0.054688 -0.429688 +v 1.351563 0.320313 -0.421875 +v -1.351563 0.320313 -0.421875 +v 1.234375 0.507813 -0.421875 +v -1.234375 0.507813 -0.421875 +v 1.023438 0.476563 -0.312500 +v -1.023438 0.476563 -0.312500 +v 1.015625 0.414063 -0.289063 +v -1.015625 0.414063 -0.289063 +v 1.187500 0.437500 -0.390625 +v -1.187500 0.437500 -0.390625 +v 1.265625 0.289063 -0.406250 +v -1.265625 0.289063 -0.406250 +v 1.210938 0.078125 -0.406250 +v -1.210938 0.078125 -0.406250 +v 1.031250 -0.039063 -0.304688 +v -1.031250 -0.039063 -0.304688 +v 0.828125 -0.070313 -0.132813 +v -0.828125 -0.070313 -0.132813 +v 0.921875 0.359375 -0.218750 +v -0.921875 0.359375 -0.218750 +v 0.945313 0.304688 -0.289063 +v -0.945313 0.304688 -0.289063 +v 0.882813 -0.023438 -0.210938 +v -0.882813 -0.023438 -0.210938 +v 1.039063 0.000000 -0.367188 +v -1.039063 0.000000 -0.367188 +v 1.187500 0.093750 -0.445313 +v -1.187500 0.093750 -0.445313 +v 1.234375 0.250000 -0.445313 +v -1.234375 0.250000 -0.445313 +v 1.171875 0.359375 -0.437500 +v -1.171875 0.359375 -0.437500 +v 1.023438 0.343750 -0.359375 +v -1.023438 0.343750 -0.359375 +v 0.843750 0.289063 -0.210938 +v -0.843750 0.289063 -0.210938 +v 0.835938 0.171875 -0.273438 +v -0.835938 0.171875 -0.273438 +v 0.757813 0.093750 -0.273438 +v -0.757813 0.093750 -0.273438 +v 0.820313 0.085938 -0.273438 +v -0.820313 0.085938 -0.273438 +v 0.843750 0.015625 -0.273438 +v -0.843750 0.015625 -0.273438 +v 0.812500 -0.015625 -0.273438 +v -0.812500 -0.015625 -0.273438 +v 0.726563 0.000000 -0.070313 +v -0.726563 0.000000 -0.070313 +v 0.718750 -0.023438 -0.171875 +v -0.718750 -0.023438 -0.171875 +v 0.718750 0.039063 -0.187500 +v -0.718750 0.039063 -0.187500 +v 0.796875 0.203125 -0.210938 +v -0.796875 0.203125 -0.210938 +v 0.890625 0.242188 -0.265625 +v -0.890625 0.242188 -0.265625 +v 0.890625 0.234375 -0.320313 +v -0.890625 0.234375 -0.320313 +v 0.812500 -0.015625 -0.320313 +v -0.812500 -0.015625 -0.320313 +v 0.851563 0.015625 -0.320313 +v -0.851563 0.015625 -0.320313 +v 0.828125 0.078125 -0.320313 +v -0.828125 0.078125 -0.320313 +v 0.765625 0.093750 -0.320313 +v -0.765625 0.093750 -0.320313 +v 0.843750 0.171875 -0.320313 +v -0.843750 0.171875 -0.320313 +v 1.039063 0.328125 -0.414063 +v -1.039063 0.328125 -0.414063 +v 1.187500 0.343750 -0.484375 +v -1.187500 0.343750 -0.484375 +v 1.257813 0.242188 -0.492188 +v -1.257813 0.242188 -0.492188 +v 1.210938 0.085938 -0.484375 +v -1.210938 0.085938 -0.484375 +v 1.046875 0.000000 -0.421875 +v -1.046875 0.000000 -0.421875 +v 0.882813 -0.015625 -0.265625 +v -0.882813 -0.015625 -0.265625 +v 0.953125 0.289063 -0.343750 +v -0.953125 0.289063 -0.343750 +v 0.890625 0.109375 -0.328125 +v -0.890625 0.109375 -0.328125 +v 0.937500 0.062500 -0.335938 +v -0.937500 0.062500 -0.335938 +v 1.000000 0.125000 -0.367188 +v -1.000000 0.125000 -0.367188 +v 0.960938 0.171875 -0.351563 +v -0.960938 0.171875 -0.351563 +v 1.015625 0.234375 -0.375000 +v -1.015625 0.234375 -0.375000 +v 1.054688 0.187500 -0.382813 +v -1.054688 0.187500 -0.382813 +v 1.109375 0.210938 -0.390625 +v -1.109375 0.210938 -0.390625 +v 1.085938 0.273438 -0.390625 +v -1.085938 0.273438 -0.390625 +v 1.023438 0.437500 -0.484375 +v -1.023438 0.437500 -0.484375 +v 1.250000 0.468750 -0.546875 +v -1.250000 0.468750 -0.546875 +v 1.367188 0.296875 -0.500000 +v -1.367188 0.296875 -0.500000 +v 1.312500 0.054688 -0.531250 +v -1.312500 0.054688 -0.531250 +v 1.039063 -0.085938 -0.492188 +v -1.039063 -0.085938 -0.492188 +v 0.789063 -0.125000 -0.328125 +v -0.789063 -0.125000 -0.328125 +v 0.859375 0.382813 -0.382813 +v -0.859375 0.382813 -0.382813 +v -1.023438 0.476563 -0.312500 +v -1.234375 0.507813 -0.421875 +v -0.890625 0.406250 -0.234375 +v -0.820313 0.328125 -0.203125 +vt 0.315596 0.792535 +vt 0.331462 0.787091 +vt 0.331944 0.799704 +vt 0.049262 0.798007 +vt 0.050304 0.785428 +vt 0.065913 0.791570 +vt 0.321453 0.778649 +vt 0.060677 0.777438 +vt 0.310368 0.778802 +vt 0.071744 0.778083 +vt 0.302416 0.786560 +vt 0.079345 0.786186 +vt 0.301514 0.798474 +vt 0.079717 0.798128 +vt 0.308740 0.806873 +vt 0.072125 0.806199 +vt 0.321648 0.808687 +vt 0.059149 0.807438 +vt 0.048462 0.201858 +vt 0.040084 0.207259 +vt 0.043232 0.202821 +vt 0.043249 0.220655 +vt 0.040093 0.216224 +vt 0.048480 0.221607 +vt 0.563710 0.649220 +vt 0.540594 0.657349 +vt 0.547067 0.627433 +vt 0.974643 0.218739 +vt 0.968169 0.188824 +vt 0.991286 0.196952 +vt 0.166564 0.702856 +vt 0.160061 0.635503 +vt 0.218800 0.643864 +vt 0.646379 0.202310 +vt 0.587641 0.210669 +vt 0.594146 0.143318 +vt 0.231653 0.710981 +vt 0.181122 0.727399 +vt 0.174315 0.716236 +vt 0.601897 0.129938 +vt 0.608704 0.118775 +vt 0.659234 0.135195 +vt 0.266169 0.503056 +vt 0.270502 0.531304 +vt 0.237927 0.525958 +vt 0.665505 0.320215 +vt 0.698081 0.314870 +vt 0.693747 0.343118 +vt 0.392095 0.783569 +vt 0.421339 0.774990 +vt 0.422693 0.793271 +vt 0.628129 0.465996 +vt 0.613733 0.456434 +vt 0.634389 0.436387 +vt 0.501778 0.870396 +vt 0.507486 0.857499 +vt 0.528577 0.865850 +vt 0.643384 0.583025 +vt 0.644052 0.562152 +vt 0.656465 0.561923 +vt 0.766386 0.787223 +vt 0.745292 0.810963 +vt 0.708792 0.802136 +vt 0.769147 0.634951 +vt 0.732033 0.641034 +vt 0.711181 0.618495 +vt 0.849461 0.545148 +vt 0.823375 0.497849 +vt 0.897469 0.500666 +vt 0.902318 0.546395 +vt 0.572425 0.679855 +vt 0.643837 0.668801 +vt 0.623443 0.718088 +vt 0.572425 0.724426 +vt 0.726607 0.540494 +vt 0.753364 0.518460 +vt 0.715449 0.680462 +vt 0.749227 0.698466 +vt 0.695922 0.534580 +vt 0.693526 0.510498 +vt 0.772837 0.655221 +vt 0.784620 0.679820 +vt 0.718163 0.580185 +vt 0.809389 0.599417 +vt 0.761761 0.743313 +vt 0.667750 0.767676 +vt 0.693110 0.564191 +vt 0.797155 0.722534 +vt 0.682009 0.616616 +vt 0.795802 0.787304 +vt 0.719538 0.655221 +vt 0.756895 0.826983 +vt 0.782765 0.655221 +vt 0.695179 0.821970 +vt 0.843059 0.610497 +vt 0.635588 0.780626 +vt 0.634422 0.561399 +vt 0.628274 0.581967 +vt 0.511020 0.847430 +vt 0.533908 0.850607 +vt 0.633815 0.551490 +vt 0.613046 0.571327 +vt 0.530368 0.831407 +vt 0.501394 0.842435 +vt 0.626589 0.538875 +vt 0.604527 0.544684 +vt 0.508929 0.810914 +vt 0.492547 0.829318 +vt 0.618247 0.522587 +vt 0.602583 0.501781 +vt 0.480939 0.813120 +vt 0.469234 0.787943 +vt 0.616652 0.502716 +vt 0.613925 0.497595 +vt 0.459358 0.796431 +vt 0.462840 0.801566 +vt 0.644899 0.511966 +vt 0.630336 0.517087 +vt 0.628893 0.504351 +vt 0.635735 0.498392 +vt 0.458270 0.813966 +vt 0.469630 0.821874 +vt 0.457144 0.833207 +vt 0.449054 0.817297 +vt 0.637359 0.534149 +vt 0.654293 0.524569 +vt 0.464258 0.849211 +vt 0.482600 0.837505 +vt 0.644187 0.548520 +vt 0.659377 0.540935 +vt 0.478087 0.863369 +vt 0.493557 0.851414 +vt 0.597230 0.539263 +vt 0.595257 0.495349 +vt 0.466971 0.777596 +vt 0.507407 0.801398 +vt 0.605628 0.572478 +vt 0.534801 0.825096 +vt 0.627145 0.592333 +vt 0.544318 0.853620 +vt 0.651887 0.586528 +vt 0.528822 0.875551 +vt 0.665532 0.557472 +vt 0.492878 0.878439 +vt 0.669345 0.535984 +vt 0.467321 0.871200 +vt 0.612569 0.491986 +vt 0.454710 0.792385 +vt 0.619277 0.495381 +vt 0.454636 0.800448 +vt 0.628580 0.496763 +vt 0.451294 0.809743 +vt 0.636682 0.490206 +vt 0.440853 0.813605 +vt 0.652342 0.504728 +vt 0.446182 0.836397 +vt 0.664409 0.519225 +vt 0.453285 0.856119 +vt 0.666191 0.492411 +vt 0.717596 0.474672 +vt 0.382398 0.879324 +vt 0.427166 0.842398 +vt 0.681733 0.511408 +vt 0.427493 0.877628 +vt 0.435523 0.867805 +vt 0.685777 0.532869 +vt 0.453231 0.887054 +vt 0.588528 0.478377 +vt 0.454313 0.762782 +vt 0.446975 0.900429 +vt 0.713425 0.237886 +vt 0.709019 0.215724 +vt 0.755152 0.224403 +vt 0.762923 0.242445 +vt 0.327574 0.621771 +vt 0.281440 0.630451 +vt 0.285847 0.608289 +vt 0.335345 0.603729 +vt 0.576794 0.465515 +vt 0.583867 0.423087 +vt 0.405805 0.730353 +vt 0.448347 0.745304 +vt 0.686035 0.253032 +vt 0.258456 0.593142 +vt 0.683851 0.556229 +vt 0.482266 0.899349 +vt 0.670531 0.597684 +vt 0.532990 0.898426 +vt 0.630909 0.604157 +vt 0.553941 0.861896 +vt 0.596864 0.576275 +vt 0.542184 0.818594 +vt 0.585561 0.529242 +vt 0.503791 0.785451 +vt 0.572425 0.529736 +vt 0.510638 0.773572 +vt 0.587548 0.588270 +vt 0.557294 0.815416 +vt 0.629961 0.623919 +vt 0.572425 0.868524 +vt 0.548104 0.914571 +vt 0.488130 0.914571 +vt 0.658830 0.266292 +vt 0.631691 0.281488 +vt 0.204112 0.564686 +vt 0.231252 0.579881 +vt 0.706402 0.288928 +vt 0.278823 0.557246 +vt 0.743528 0.317934 +vt 0.752264 0.346660 +vt 0.324686 0.499513 +vt 0.315950 0.528240 +vt 0.743309 0.289810 +vt 0.315731 0.556363 +vt 0.700326 0.147967 +vt 0.272746 0.698208 +vt 0.795874 0.266472 +vt 0.775660 0.289442 +vt 0.757507 0.263314 +vt 0.348083 0.556732 +vt 0.329929 0.582860 +vt 0.368297 0.579702 +vt 0.804056 0.232825 +vt 0.376478 0.613349 +vt 0.810124 0.179100 +vt 0.382547 0.667075 +vt 0.753847 0.157090 +vt 0.811201 0.146834 +vt 0.383624 0.699341 +vt 0.326269 0.689085 +vt 0.879685 0.183943 +vt 0.888071 0.157228 +vt 0.460496 0.688946 +vt 0.452109 0.662231 +vt 0.925222 0.140531 +vt 0.947451 0.149372 +vt 0.519876 0.696801 +vt 0.497647 0.705643 +vt 0.876420 0.258223 +vt 0.946138 0.286262 +vt 0.518561 0.559910 +vt 0.448843 0.587951 +vt 0.829953 0.196170 +vt 0.837053 0.152275 +vt 0.409477 0.693900 +vt 0.402377 0.650004 +vt 0.829888 0.255993 +vt 0.402311 0.590181 +vt 0.852096 0.297194 +vt 0.813695 0.289418 +vt 0.424519 0.548979 +vt 0.386117 0.556756 +vt 0.820842 0.328587 +vt 0.789451 0.311961 +vt 0.393264 0.517587 +vt 0.361873 0.534212 +vt 0.840465 0.403536 +vt 0.762603 0.423087 +vt 0.412887 0.442637 +vt 0.335024 0.423087 +vt 0.909248 0.345901 +vt 0.481670 0.500271 +vt 0.676670 0.402805 +vt 0.249092 0.443369 +vt 0.573469 0.193539 +vt 0.579214 0.151927 +vt 0.151632 0.694246 +vt 0.145888 0.652633 +vt 0.546919 0.227092 +vt 0.536510 0.214419 +vt 0.119340 0.619080 +vt 0.108931 0.631753 +vt 0.588792 0.317539 +vt 0.161214 0.528634 +vt 0.630429 0.371564 +vt 0.202851 0.474609 +vt 0.657494 0.118541 +vt 0.164237 0.319427 +vt 0.169464 0.304721 +vt 0.210459 0.345510 +vt 0.169574 0.118572 +vt 0.164356 0.103821 +vt 0.210731 0.077759 +vt 0.229913 0.727634 +vt 0.589956 0.115821 +vt 0.153468 0.300432 +vt 0.153526 0.122857 +vt 0.162374 0.730353 +vt 0.578472 0.119429 +vt 0.553653 0.120209 +vt 0.126070 0.725964 +vt 0.150890 0.726744 +vt 0.546510 0.159800 +vt 0.509384 0.119033 +vt 0.081800 0.727137 +vt 0.118929 0.686371 +vt 0.534072 0.185482 +vt 0.106492 0.660689 +vt 0.462352 0.161885 +vt 0.478174 0.145123 +vt 0.493641 0.175543 +vt 0.505521 0.150780 +vt 0.077939 0.695390 +vt 0.050592 0.701044 +vt 0.066060 0.670626 +vt 0.034770 0.684282 +vt 0.476706 0.124129 +vt 0.049122 0.722039 +vt 0.465324 0.131169 +vt 0.037741 0.714998 +vt 0.446348 0.149671 +vt 0.018765 0.696495 +vt 0.445483 0.184898 +vt 0.427581 0.175095 +vt 0.000000 0.671069 +vt 0.017903 0.661268 +vt 0.480167 0.198327 +vt 0.052588 0.647841 +vt 0.521714 0.207472 +vt 0.094135 0.638699 +vt 0.701979 0.120236 +vt 0.274400 0.725940 +vt 0.757541 0.138176 +vt 0.329963 0.708000 +vt 0.817327 0.117813 +vt 0.389751 0.728363 +vt 0.844767 0.126748 +vt 0.417191 0.719428 +vt 0.893893 0.126476 +vt 0.466319 0.719698 +vt 0.936543 0.115821 +vt 0.508970 0.730353 +vt 0.965717 0.128368 +vt 0.538144 0.717805 +vt 0.989276 0.166159 +vt 0.561701 0.680013 +vt 1.000000 0.175243 +vt 0.572425 0.670929 +vt 0.289028 0.269037 +vt 0.283878 0.263049 +vt 0.299187 0.258321 +vt 0.300964 0.267357 +vt 0.299421 0.165436 +vt 0.284101 0.160633 +vt 0.289287 0.154655 +vt 0.301244 0.156393 +vt 0.317793 0.260767 +vt 0.316733 0.267304 +vt 0.318078 0.163079 +vt 0.317052 0.156521 +vt 0.335398 0.269583 +vt 0.330421 0.276220 +vt 0.335777 0.154335 +vt 0.330824 0.147649 +vt 0.278552 0.277080 +vt 0.273734 0.272912 +vt 0.273975 0.150706 +vt 0.278818 0.146548 +vt 0.271078 0.306358 +vt 0.264864 0.305818 +vt 0.265194 0.117691 +vt 0.271427 0.117166 +vt 0.278613 0.324240 +vt 0.274006 0.327477 +vt 0.274436 0.095993 +vt 0.279049 0.099253 +vt 0.298062 0.342565 +vt 0.294660 0.349561 +vt 0.295240 0.073895 +vt 0.298634 0.080932 +vt 0.312476 0.342961 +vt 0.315033 0.350198 +vt 0.315702 0.073322 +vt 0.313108 0.080584 +vt 0.323281 0.337709 +vt 0.328696 0.344302 +vt 0.329405 0.079293 +vt 0.323940 0.085897 +vt 0.335361 0.313857 +vt 0.339396 0.315576 +vt 0.340031 0.108187 +vt 0.335968 0.109893 +vt 0.339920 0.298303 +vt 0.345292 0.298556 +vt 0.345869 0.125306 +vt 0.340471 0.125531 +vt 0.339277 0.286081 +vt 0.344398 0.284332 +vt 0.344895 0.139582 +vt 0.339764 0.137799 +vt 0.345671 0.260159 +vt 0.355483 0.280619 +vt 0.356003 0.143373 +vt 0.346021 0.163854 +vt 0.356162 0.297750 +vt 0.356783 0.126174 +vt 0.349494 0.319809 +vt 0.350195 0.103982 +vt 0.333524 0.354692 +vt 0.334295 0.068869 +vt 0.317323 0.364551 +vt 0.318050 0.058911 +vt 0.293154 0.361782 +vt 0.293765 0.061619 +vt 0.263750 0.335417 +vt 0.264168 0.087998 +vt 0.251373 0.309082 +vt 0.251676 0.114380 +vt 0.264926 0.265507 +vt 0.265122 0.158092 +vt 0.278030 0.255522 +vt 0.278212 0.168150 +vt 0.320744 0.246538 +vt 0.320956 0.177355 +vt 0.296570 0.247318 +vt 0.296748 0.176443 +vt 0.038845 0.211743 +vt 0.047440 0.211734 +vt 0.055230 0.211728 +vt 0.057303 0.228458 +vt 0.057278 0.194991 +vt 0.041287 0.229096 +vt 0.041253 0.194380 +vt 0.032564 0.220061 +vt 0.032546 0.203437 +vt 0.030743 0.211752 +vt 0.029931 0.223131 +vt 0.028053 0.211756 +vt 0.029906 0.200372 +vt 0.038587 0.233067 +vt 0.038544 0.190412 +vt 0.061533 0.231825 +vt 0.061505 0.191616 +vt 0.057382 0.211726 +vt 0.168191 0.258703 +vt 0.213958 0.246887 +vt 0.214040 0.176591 +vt 0.168236 0.164676 +vt 0.148297 0.258447 +vt 0.138777 0.299079 +vt 0.138791 0.124216 +vt 0.148319 0.164919 +vt 0.115455 0.259296 +vt 0.109657 0.296761 +vt 0.109611 0.126556 +vt 0.115440 0.164070 +vt 0.119233 0.228698 +vt 0.156540 0.233552 +vt 0.156556 0.189842 +vt 0.119230 0.194690 +vt 0.173998 0.244074 +vt 0.174035 0.179329 +vt 0.195860 0.238258 +vt 0.195909 0.185188 +vt 0.203534 0.211734 +vt 0.252997 0.211802 +vt 0.171285 0.225095 +vt 0.164455 0.211704 +vt 0.180017 0.211713 +vt 0.177113 0.227468 +vt 0.171300 0.198319 +vt 0.177134 0.195952 +vt 0.185539 0.227013 +vt 0.187516 0.221322 +vt 0.187531 0.202116 +vt 0.185563 0.196419 +vt 0.176585 0.232500 +vt 0.165993 0.229894 +vt 0.176611 0.190916 +vt 0.166011 0.193512 +vt 0.189406 0.230672 +vt 0.189438 0.192766 +vt 0.193574 0.221791 +vt 0.193592 0.201656 +vt 0.186479 0.211718 +vt 0.156919 0.211701 +vt 0.148476 0.211699 +vt 0.427853 0.115821 +vt 0.427581 0.104121 +vt 0.441185 0.104121 +vt 0.427581 0.011703 +vt 0.427581 0.000000 +vt 0.441181 0.011386 +vt 0.067509 0.234045 +vt 0.071465 0.211716 +vt 0.067479 0.189385 +vt 0.119764 0.211696 +vt 0.060932 0.261035 +vt 0.038121 0.261699 +vt 0.038025 0.161756 +vt 0.060860 0.162382 +vt 0.019864 0.255578 +vt 0.019760 0.167921 +vt 0.016617 0.242679 +vt 0.016537 0.180842 +vt 0.014466 0.211775 +vt 0.297831 0.211892 +vt 0.340508 0.212027 +vt 0.356498 0.241635 +vt 0.356742 0.182510 +vt 0.236517 0.317748 +vt 0.236802 0.105655 +vt 0.264789 0.363401 +vt 0.265286 0.059917 +vt 0.296951 0.385966 +vt 0.297650 0.037339 +vt 0.337996 0.385300 +vt 0.338890 0.038126 +vt 0.349401 0.368365 +vt 0.350300 0.055183 +vt 0.377282 0.319664 +vt 0.378129 0.104260 +vt 0.394788 0.292204 +vt 0.395576 0.131978 +vt 0.391029 0.270263 +vt 0.391643 0.154015 +vt 0.368661 0.212151 +vt 0.379482 0.228055 +vt 0.379686 0.196331 +vt 0.420379 0.261837 +vt 0.421104 0.162716 +vt 0.426533 0.298960 +vt 0.427581 0.125377 +vt 0.396664 0.342212 +vt 0.397734 0.081667 +vt 0.365156 0.387054 +vt 0.366203 0.036443 +vt 0.346744 0.416452 +vt 0.347768 0.006839 +vt 0.278009 0.423087 +vt 0.278714 0.000000 +vt 0.241964 0.376122 +vt 0.242399 0.047096 +vt 0.055563 0.291878 +vt 0.055443 0.131506 +vt 0.014495 0.288026 +vt 0.014318 0.135436 +vt 0.003828 0.279132 +vt 0.003650 0.144368 +vt 0.000113 0.248111 +vt 0.000000 0.175447 +vt 0.000000 0.211799 +vt 0.046962 0.798865 +vt 0.047306 0.784561 +vt 0.334495 0.786358 +vt 0.334204 0.800664 +vt 0.058429 0.773633 +vt 0.323868 0.774947 +vt 0.072992 0.774071 +vt 0.309301 0.774739 +vt 0.084403 0.784016 +vt 0.297459 0.784168 +vt 0.083417 0.800146 +vt 0.297728 0.800325 +vt 0.073091 0.810538 +vt 0.307582 0.811166 +vt 0.057505 0.810093 +vt 0.323173 0.811412 +vt 0.024988 0.807478 +vt 0.047717 0.829014 +vt 0.332112 0.830749 +vt 0.355774 0.810244 +vt 0.000000 0.817350 +vt 0.033121 0.852785 +vt 0.345638 0.855146 +vt 0.380299 0.821215 +vt 0.083391 0.855019 +vt 0.078555 0.829097 +vt 0.301299 0.829463 +vt 0.295318 0.855146 +vt 0.100718 0.807888 +vt 0.280100 0.807291 +vt 0.123146 0.821929 +vt 0.257070 0.820323 +vt 0.127501 0.768220 +vt 0.103229 0.776171 +vt 0.279000 0.775494 +vt 0.255105 0.766472 +vt 0.079351 0.756089 +vt 0.303746 0.756492 +vt 0.089008 0.730353 +vt 0.295241 0.730353 +vt 0.049398 0.755271 +vt 0.035422 0.733227 +vt 0.333706 0.757005 +vt 0.348646 0.735604 +vt 0.026877 0.776230 +vt 0.355274 0.778943 +vt 0.000000 0.770061 +vt 0.382398 0.773973 +vn 0.189764 -0.003571 0.981811 +vn 0.646809 -0.758202 0.082095 +vn 0.999573 -0.014496 -0.024445 +vn -0.999573 -0.014496 -0.024445 +vn -0.646809 -0.758202 0.082095 +vn -0.189764 -0.003571 0.981811 +vn -0.085788 -0.982971 0.162389 +vn 0.085788 -0.982971 0.162389 +vn -0.744835 -0.623768 0.236824 +vn 0.744835 -0.623768 0.236824 +vn -0.870968 -0.014710 0.491104 +vn 0.870968 -0.014710 0.491104 +vn -0.758354 0.606128 0.239692 +vn 0.758354 0.606128 0.239692 +vn -0.085788 0.982513 0.165105 +vn 0.085788 0.982513 0.165105 +vn 0.655141 0.750633 0.085574 +vn -0.655141 0.750633 0.085574 +vn -0.349284 -0.719932 0.599719 +vn -0.173681 0.215735 0.960845 +vn -0.809839 0.388287 0.439741 +vn 0.809839 0.388287 0.439741 +vn 0.173681 0.215735 0.960845 +vn 0.349284 -0.719932 0.599719 +vn 0.000000 0.794183 0.607654 +vn -0.508652 0.858119 -0.069887 +vn 0.000000 0.487075 0.873348 +vn 0.508652 0.858119 -0.069887 +vn 0.981414 -0.186682 0.043947 +vn 0.569811 -0.821711 0.007813 +vn 0.563463 -0.814570 0.137669 +vn -0.563463 -0.814570 0.137669 +vn -0.569811 -0.821711 0.007813 +vn -0.981414 -0.186682 0.043947 +vn 0.475845 -0.876247 0.075381 +vn 0.850520 -0.525529 -0.020692 +vn 0.876949 -0.163823 0.451766 +vn -0.876949 -0.163823 0.451766 +vn -0.850520 -0.525529 -0.020692 +vn -0.475845 -0.876247 0.075381 +vn 0.448286 -0.367870 -0.814661 +vn 0.530534 -0.539445 -0.653829 +vn 0.513077 -0.674673 -0.530595 +vn -0.513077 -0.674673 -0.530595 +vn -0.530534 -0.539445 -0.653829 +vn -0.448286 -0.367870 -0.814661 +vn 0.888180 -0.439955 -0.132389 +vn 0.588519 0.226966 0.775933 +vn 0.911527 -0.115268 0.394665 +vn -0.911527 -0.115268 0.394665 +vn -0.588519 0.226966 0.775933 +vn -0.888180 -0.439955 -0.132389 +vn 0.468886 -0.304727 0.829005 +vn 0.251564 0.260781 0.932005 +vn -0.003082 -0.330882 0.943632 +vn 0.003082 -0.330882 0.943632 +vn -0.251564 0.260781 0.932005 +vn -0.468886 -0.304727 0.829005 +vn 0.473067 0.578997 -0.664022 +vn 0.992462 0.028626 -0.118900 +vn 0.459975 -0.380261 -0.802362 +vn -0.459975 -0.380261 -0.802362 +vn -0.992462 0.028626 -0.118900 +vn -0.473067 0.578997 -0.664022 +vn -0.059908 -0.804712 -0.590594 +vn -0.346141 -0.637287 -0.688498 +vn -0.330546 -0.943236 0.031281 +vn -0.073672 -0.594989 0.800317 +vn 0.330546 -0.943236 0.031281 +vn 0.346141 -0.637287 -0.688498 +vn 0.059908 -0.804712 -0.590594 +vn 0.073672 -0.594989 0.800317 +vn 0.593738 0.595264 -0.541368 +vn -0.626057 -0.002686 -0.779748 +vn 0.626057 -0.002686 -0.779748 +vn -0.593738 0.595264 -0.541368 +vn 0.127689 0.703757 0.698843 +vn -0.713828 0.382183 0.586810 +vn 0.713828 0.382183 0.586810 +vn -0.127689 0.703757 0.698843 +vn 0.378063 0.560045 -0.737144 +vn 0.036805 -0.708457 -0.704764 +vn -0.378063 0.560045 -0.737144 +vn -0.036805 -0.708457 -0.704764 +vn -0.031556 0.838710 0.543626 +vn 0.031556 0.838710 0.543626 +vn -0.361156 0.848689 0.386303 +vn 0.361156 0.848689 0.386303 +vn -0.716392 0.204474 0.667043 +vn 0.716392 0.204474 0.667043 +vn -0.662038 -0.413770 0.624866 +vn 0.662038 -0.413770 0.624866 +vn -0.530229 -0.655751 0.537370 +vn 0.530229 -0.655751 0.537370 +vn -0.437483 0.001221 0.899197 +vn 0.550981 -0.138096 0.822993 +vn 0.437483 0.001221 0.899197 +vn -0.550981 -0.138096 0.822993 +vn -0.315958 -0.102298 0.943205 +vn 0.608539 0.296121 0.736167 +vn -0.608539 0.296121 0.736167 +vn 0.315958 -0.102298 0.943205 +vn -0.445479 -0.088778 0.890866 +vn -0.257698 0.600024 0.757317 +vn 0.257698 0.600024 0.757317 +vn 0.445479 -0.088778 0.890866 +vn -0.327799 0.169927 0.929319 +vn 0.041780 0.927213 0.372112 +vn 0.327799 0.169927 0.929319 +vn -0.041780 0.927213 0.372112 +vn -0.277932 0.260201 0.924680 +vn -0.750725 0.111545 0.651112 +vn 0.750725 0.111545 0.651112 +vn 0.277932 0.260201 0.924680 +vn -0.437910 -0.293985 0.849574 +vn -0.183782 0.036836 0.982269 +vn -0.554216 0.387219 0.736808 +vn -0.814325 0.253426 0.522111 +vn 0.554216 0.387219 0.736808 +vn 0.183782 0.036836 0.982269 +vn 0.437910 -0.293985 0.849574 +vn 0.814325 0.253426 0.522111 +vn -0.326670 -0.001617 0.945128 +vn -0.704337 -0.526872 0.475692 +vn 0.704337 -0.526872 0.475692 +vn 0.326670 -0.001617 0.945128 +vn -0.308786 0.134617 0.941527 +vn -0.629170 -0.371441 0.682730 +vn 0.629170 -0.371441 0.682730 +vn 0.308786 0.134617 0.941527 +vn 0.146184 0.948637 0.280465 +vn -0.137516 0.905820 0.400708 +vn 0.137516 0.905820 0.400708 +vn -0.146184 0.948637 0.280465 +vn 0.723746 0.690023 -0.005219 +vn -0.723746 0.690023 -0.005219 +vn 0.994690 -0.078005 0.067019 +vn -0.994690 -0.078005 0.067019 +vn 0.200934 -0.758141 0.620350 +vn -0.200934 -0.758141 0.620350 +vn -0.541246 -0.672658 0.504501 +vn 0.541246 -0.672658 0.504501 +vn -0.690054 -0.553209 0.466628 +vn 0.690054 -0.553209 0.466628 +vn -0.464003 0.686666 0.559557 +vn 0.464003 0.686666 0.559557 +vn -0.827448 -0.135899 0.544786 +vn 0.827448 -0.135899 0.544786 +vn -0.466231 0.808863 0.358196 +vn 0.466231 0.808863 0.358196 +vn -0.743980 -0.022919 0.667776 +vn 0.743980 -0.022919 0.667776 +vn -0.711295 -0.638325 0.294137 +vn 0.711295 -0.638325 0.294137 +vn -0.709769 -0.501999 0.494125 +vn 0.709769 -0.501999 0.494125 +vn -0.818903 -0.425520 0.385113 +vn -0.992523 -0.071444 -0.098758 +vn 0.992523 -0.071444 -0.098758 +vn 0.818903 -0.425520 0.385113 +vn -0.439192 -0.273568 0.855708 +vn 0.439192 -0.273568 0.855708 +vn -0.414686 -0.059877 0.907956 +vn 0.414686 -0.059877 0.907956 +vn -0.341563 0.452132 0.823939 +vn 0.341563 0.452132 0.823939 +vn -0.724509 -0.684927 0.076632 +vn -0.987548 -0.123020 0.097995 +vn 0.987548 -0.123020 0.097995 +vn 0.724509 -0.684927 0.076632 +vn -0.572741 -0.088443 0.814936 +vn 0.572741 -0.088443 0.814936 +vn -0.291818 -0.152104 0.944273 +vn 0.291818 -0.152104 0.944273 +vn 0.239662 -0.128605 0.962279 +vn -0.239662 -0.128605 0.962279 +vn 0.187017 0.370678 0.909696 +vn -0.187017 0.370678 0.909696 +vn -0.455794 0.423170 0.783044 +vn 0.455794 0.423170 0.783044 +vn -0.543504 -0.813379 -0.207343 +vn -0.560045 -0.814417 -0.151738 +vn 0.560045 -0.814417 -0.151738 +vn 0.543504 -0.813379 -0.207343 +vn -0.615375 -0.087649 -0.783319 +vn -0.447310 0.229530 -0.864406 +vn 0.447310 0.229530 -0.864406 +vn 0.615375 -0.087649 -0.783319 +vn -0.547166 -0.832179 -0.089785 +vn 0.547166 -0.832179 -0.089785 +vn -0.873135 0.486984 -0.020264 +vn -0.865352 0.331217 -0.376049 +vn 0.865352 0.331217 -0.376049 +vn 0.873135 0.486984 -0.020264 +vn -0.748741 0.518387 0.413038 +vn 0.748741 0.518387 0.413038 +vn -0.766167 0.634816 0.099612 +vn 0.766167 0.634816 0.099612 +vn -0.953185 -0.248299 -0.172430 +vn -0.665639 0.602496 -0.440321 +vn 0.665639 0.602496 -0.440321 +vn 0.953185 -0.248299 -0.172430 +vn -0.322642 0.847713 0.421033 +vn -0.188574 0.788934 -0.584765 +vn 0.188574 0.788934 -0.584765 +vn 0.322642 0.847713 0.421033 +vn -0.239784 0.745262 -0.622120 +vn 0.494247 0.520585 -0.696158 +vn -0.494247 0.520585 -0.696158 +vn 0.239784 0.745262 -0.622120 +vn -0.480697 0.731223 0.483932 +vn 0.000000 0.758690 0.651418 +vn 0.480697 0.731223 0.483932 +vn -0.489242 0.762963 0.422498 +vn -0.363109 0.908567 -0.206458 +vn 0.363109 0.908567 -0.206458 +vn 0.489242 0.762963 0.422498 +vn -0.645039 0.694540 0.318613 +vn 0.645039 0.694540 0.318613 +vn -0.492843 0.869015 0.043062 +vn -0.679434 0.728965 -0.083468 +vn 0.492843 0.869015 0.043062 +vn 0.679434 0.728965 -0.083468 +vn -0.391736 0.826014 -0.405225 +vn -0.644398 0.527207 -0.553880 +vn 0.391736 0.826014 -0.405225 +vn 0.644398 0.527207 -0.553880 +vn 0.000000 0.800714 -0.599017 +vn 0.000000 0.330729 -0.943693 +vn 0.000000 0.999664 0.025636 +vn 0.000000 -0.271462 -0.962432 +vn -0.685293 -0.583148 -0.436232 +vn -0.907224 0.252602 -0.336253 +vn 0.907224 0.252602 -0.336253 +vn 0.685293 -0.583148 -0.436232 +vn 0.000000 -0.984344 -0.176214 +vn 0.000000 -0.736351 -0.676565 +vn 0.000000 -0.948759 -0.315928 +vn 0.000000 -0.648244 -0.761406 +vn -0.317362 -0.946959 -0.049959 +vn -0.838282 -0.408155 0.361461 +vn 0.838282 -0.408155 0.361461 +vn 0.317362 -0.946959 -0.049959 +vn -0.939360 0.325999 0.106113 +vn 0.939360 0.325999 0.106113 +vn -0.930631 0.340159 0.134770 +vn -0.960143 0.231361 0.156774 +vn 0.960143 0.231361 0.156774 +vn 0.930631 0.340159 0.134770 +vn -0.812555 -0.001068 -0.582842 +vn -0.979583 0.093387 0.177862 +vn 0.979583 0.093387 0.177862 +vn 0.812555 -0.001068 -0.582842 +vn -0.272530 -0.301157 -0.913785 +vn 0.272530 -0.301157 -0.913785 +vn -0.090915 -0.776330 -0.623707 +vn -0.506851 -0.488144 -0.710471 +vn -0.142521 -0.147282 -0.978759 +vn -0.637257 0.093326 -0.764946 +vn 0.637257 0.093326 -0.764946 +vn 0.506851 -0.488144 -0.710471 +vn 0.142521 -0.147282 -0.978759 +vn 0.090915 -0.776330 -0.623707 +vn -0.937284 -0.254250 0.238350 +vn 0.937284 -0.254250 0.238350 +vn -0.430525 -0.895260 0.114597 +vn 0.430525 -0.895260 0.114597 +vn -0.158391 -0.974822 0.156774 +vn 0.158391 -0.974822 0.156774 +vn 0.000000 -0.915860 -0.401440 +vn 0.000000 -0.946440 0.322855 +vn 0.000000 -0.336802 -0.941557 +vn 0.000000 -0.175726 -0.984436 +vn -0.599231 -0.773980 0.204566 +vn 0.599231 -0.773980 0.204566 +vn -0.890988 -0.423261 -0.164037 +vn 0.890988 -0.423261 -0.164037 +vn -0.851985 0.219275 0.475387 +vn 0.851985 0.219275 0.475387 +vn -0.509171 0.852229 0.119999 +vn 0.509171 0.852229 0.119999 +vn -0.610431 0.759148 0.225867 +vn 0.610431 0.759148 0.225867 +vn -0.182470 0.981780 0.052492 +vn 0.182470 0.981780 0.052492 +vn 0.520371 0.770348 0.368389 +vn -0.520371 0.770348 0.368389 +vn 0.852718 0.504257 0.136204 +vn -0.852718 0.504257 0.136204 +vn 0.000000 0.970214 0.242164 +vn -0.709647 0.261818 0.654042 +vn 0.067293 -0.064272 0.995636 +vn -0.246590 -0.034089 0.968505 +vn -0.809717 -0.010224 0.586688 +vn 0.246590 -0.034089 0.968505 +vn -0.067293 -0.064272 0.995636 +vn 0.709647 0.261818 0.654042 +vn 0.809717 -0.010224 0.586688 +vn -0.465835 -0.080325 0.881191 +vn -0.737114 -0.244179 0.630085 +vn 0.465835 -0.080325 0.881191 +vn 0.737114 -0.244179 0.630085 +vn -0.211951 -0.085971 0.973479 +vn -0.367504 -0.376476 0.850398 +vn 0.211951 -0.085971 0.973479 +vn 0.367504 -0.376476 0.850398 +vn -0.430280 0.556597 0.710624 +vn -0.020081 -0.072939 0.997131 +vn 0.020081 -0.072939 0.997131 +vn 0.430280 0.556597 0.710624 +vn -0.090976 0.597339 0.796777 +vn -0.187933 -0.091617 0.977874 +vn 0.187933 -0.091617 0.977874 +vn 0.090976 0.597339 0.796777 +vn 0.165929 0.609363 0.775292 +vn -0.203314 0.092532 0.974700 +vn 0.203314 0.092532 0.974700 +vn -0.165929 0.609363 0.775292 +vn 0.269295 0.241676 0.932218 +vn -0.314219 -0.132420 0.940062 +vn 0.314219 -0.132420 0.940062 +vn -0.269295 0.241676 0.932218 +vn 0.420057 -0.118992 0.899625 +vn -0.119755 -0.070925 0.990234 +vn 0.119755 -0.070925 0.990234 +vn -0.420057 -0.118992 0.899625 +vn 0.226142 -0.606586 0.762139 +vn -0.320841 0.040712 0.946226 +vn 0.320841 0.040712 0.946226 +vn -0.226142 -0.606586 0.762139 +vn 0.232612 -0.746055 0.623890 +vn -0.074557 -0.391644 0.917081 +vn 0.074557 -0.391644 0.917081 +vn -0.232612 -0.746055 0.623890 +vn -0.121250 -0.313883 0.941679 +vn -0.146702 -0.035707 0.988525 +vn 0.146702 -0.035707 0.988525 +vn 0.121250 -0.313883 0.941679 +vn -0.216834 -0.273721 0.937010 +vn -0.187445 0.001160 0.982269 +vn 0.187445 0.001160 0.982269 +vn 0.216834 -0.273721 0.937010 +vn -0.303018 -0.201941 0.931333 +vn -0.253090 -0.161809 0.953795 +vn 0.253090 -0.161809 0.953795 +vn 0.303018 -0.201941 0.931333 +vn -0.140110 -0.091189 0.985900 +vn 0.140110 -0.091189 0.985900 +vn -0.237983 0.050172 0.969939 +vn 0.237983 0.050172 0.969939 +vn -0.312662 -0.237922 0.919553 +vn 0.312662 -0.237922 0.919553 +vn -0.373791 -0.105197 0.921506 +vn 0.373791 -0.105197 0.921506 +vn -0.470595 -0.164647 0.866817 +vn 0.470595 -0.164647 0.866817 +vn -0.439222 -0.376141 0.815821 +vn 0.439222 -0.376141 0.815821 +vn -0.219611 -0.540635 0.812037 +vn 0.219611 -0.540635 0.812037 +vn 0.166967 -0.374828 0.911893 +vn -0.166967 -0.374828 0.911893 +vn 0.201849 -0.277596 0.939238 +vn -0.201849 -0.277596 0.939238 +vn 0.001160 -0.165563 0.986175 +vn -0.001160 -0.165563 0.986175 +vn 0.292917 -0.174108 0.940123 +vn -0.292917 -0.174108 0.940123 +vn 0.000000 0.732200 0.681051 +vn 0.000000 -0.603626 0.797266 +vn 0.000000 -0.971740 0.235908 +vn 0.131779 -0.608295 0.782678 +vn -0.131779 -0.608295 0.782678 +vn 0.759117 0.068392 0.647298 +vn -0.759117 0.068392 0.647298 +vn 0.405957 0.643605 0.648793 +vn -0.405957 0.643605 0.648793 +vn 0.000000 0.598346 0.801202 +vn 0.073855 -0.330546 0.940855 +vn 0.000000 -0.124516 0.992187 +vn -0.073855 -0.330546 0.940855 +vn -0.085116 -0.339244 0.936827 +vn 0.085116 -0.339244 0.936827 +vn -0.141881 -0.148350 0.978698 +vn 0.141881 -0.148350 0.978698 +vn 0.000000 -0.482803 0.875698 +vn -0.692984 -0.001343 0.720908 +vn -0.095523 -0.326090 0.940489 +vn 0.095523 -0.326090 0.940489 +vn 0.692984 -0.001343 0.720908 +vn -0.646687 0.162603 0.745201 +vn 0.646687 0.162603 0.745201 +vn -0.593463 0.121860 0.795556 +vn 0.593463 0.121860 0.795556 +vn -0.124363 0.009674 0.992187 +vn -0.509995 -0.457717 0.728233 +vn 0.509995 -0.457717 0.728233 +vn 0.124363 0.009674 0.992187 +vn -0.972137 -0.167882 0.163549 +vn 0.972137 -0.167882 0.163549 +vn -0.715995 0.572161 0.399945 +vn 0.715995 0.572161 0.399945 +vn 0.000000 0.430525 0.902554 +vn 0.000000 0.010865 0.999939 +vn -0.221839 -0.606037 0.763848 +vn 0.000000 -0.492935 0.870022 +vn 0.000000 0.010315 0.999939 +vn -0.294320 -0.184484 0.937712 +vn 0.221839 -0.606037 0.763848 +vn 0.294320 -0.184484 0.937712 +vn -0.396924 0.534989 0.745781 +vn 0.247780 0.568224 0.784661 +vn -0.247780 0.568224 0.784661 +vn 0.396924 0.534989 0.745781 +vn -0.868221 -0.261330 0.421735 +vn -0.555986 -0.690695 0.462355 +vn 0.868221 -0.261330 0.421735 +vn 0.555986 -0.690695 0.462355 +vn -0.753075 0.649892 0.102298 +vn 0.753075 0.649892 0.102298 +vn 0.194189 0.935697 0.294473 +vn -0.194189 0.935697 0.294473 +vn 0.000000 0.788965 0.614399 +vn 0.000000 -0.888638 0.458571 +vn 0.000000 -0.336772 0.941557 +vn 0.000000 -0.251991 0.967711 +vn -0.188360 -0.040132 0.981262 +vn 0.000000 -0.032899 0.999451 +vn 0.188360 -0.040132 0.981262 +vn 0.000000 0.000000 1.000000 +vn -0.572039 -0.018708 0.820002 +vn -0.536332 -0.212409 0.816828 +vn 0.536332 -0.212409 0.816828 +vn 0.572039 -0.018708 0.820002 +vn -0.357707 -0.638325 0.681570 +vn 0.357707 -0.638325 0.681570 +vn -0.154302 -0.754112 0.638325 +vn 0.154302 -0.754112 0.638325 +vn 0.000000 -0.743461 0.668752 +vn 0.000000 -0.189123 0.981933 +vn 0.000000 -0.114475 0.993408 +vn 0.001404 -0.055635 0.998444 +vn -0.001404 -0.055635 0.998444 +vn -0.336283 -0.512833 0.789850 +vn 0.336283 -0.512833 0.789850 +vn -0.454543 -0.337077 0.824458 +vn 0.454543 -0.337077 0.824458 +vn -0.543474 -0.308603 0.780602 +vn 0.543474 -0.308603 0.780602 +vn -0.387158 -0.187811 0.902646 +vn 0.387158 -0.187811 0.902646 +vn -0.430647 -0.144902 0.890805 +vn 0.430647 -0.144902 0.890805 +vn -0.234016 -0.120548 0.964721 +vn 0.234016 -0.120548 0.964721 +vn -0.263833 0.168798 0.949675 +vn 0.263833 0.168798 0.949675 +vn 0.196722 0.141881 0.970122 +vn -0.196722 0.141881 0.970122 +vn -0.906766 -0.008332 0.421522 +vn -0.744133 -0.640919 0.188269 +vn 0.744133 -0.640919 0.188269 +vn 0.906766 -0.008332 0.421522 +vn -0.044191 -0.974395 0.220313 +vn 0.044191 -0.974395 0.220313 +vn 0.639943 -0.761498 0.102786 +vn -0.639943 -0.761498 0.102786 +vn 0.955504 -0.011444 0.294717 +vn -0.955504 -0.011444 0.294717 +vn 0.649678 0.754387 0.093570 +vn -0.649678 0.754387 0.093570 +vn -0.037049 0.978881 0.200903 +vn 0.037049 0.978881 0.200903 +vn -0.752342 0.635395 0.173742 +vn 0.752342 0.635395 0.173742 +vn -0.811792 -0.002777 0.583880 +vn -0.596942 0.486770 0.637684 +vn 0.596942 0.486770 0.637684 +vn 0.811792 -0.002777 0.583880 +vn -0.868221 -0.005829 0.496109 +vn -0.719504 0.473006 0.508469 +vn 0.719504 0.473006 0.508469 +vn 0.868221 -0.005829 0.496109 +vn -0.204260 0.828761 0.520951 +vn -0.095767 0.717277 0.690146 +vn 0.095767 0.717277 0.690146 +vn 0.204260 0.828761 0.520951 +vn 0.451704 0.459883 0.764458 +vn -0.451704 0.459883 0.764458 +vn 0.450362 0.693899 0.561815 +vn -0.450362 0.693899 0.561815 +vn 0.805536 0.109409 0.582324 +vn 0.691488 -0.074099 0.718558 +vn -0.691488 -0.074099 0.718558 +vn -0.805536 0.109409 0.582324 +vn 0.386212 -0.474685 0.790857 +vn -0.386212 -0.474685 0.790857 +vn 0.557756 -0.629109 0.541368 +vn -0.557756 -0.629109 0.541368 +vn -0.091159 -0.723716 0.684011 +vn -0.199744 -0.858058 0.473067 +vn 0.091159 -0.723716 0.684011 +vn 0.199744 -0.858058 0.473067 +vn -0.597949 -0.496475 0.629231 +vn 0.597949 -0.496475 0.629231 +vn -0.723197 -0.488907 0.487747 +vn 0.723197 -0.488907 0.487747 +usemtl Material_ray.png +s 1 +f 61/1/1 65/2/2 49/3/3 +f 50/4/4 66/5/5 62/6/6 +f 63/7/7 65/2/2 61/1/1 +f 62/6/6 66/5/5 64/8/8 +f 61/1/1 59/9/9 63/7/7 +f 64/8/8 60/10/10 62/6/6 +f 61/1/1 57/11/11 59/9/9 +f 60/10/10 58/12/12 62/6/6 +f 61/1/1 55/13/13 57/11/11 +f 58/12/12 56/14/14 62/6/6 +f 61/1/1 53/15/15 55/13/13 +f 56/14/14 54/16/16 62/6/6 +f 61/1/1 51/17/17 53/15/15 +f 54/16/16 52/18/18 62/6/6 +f 61/1/1 49/3/3 51/17/17 +f 52/18/18 50/4/4 62/6/6 +f 225/19/19 229/20/20 227/21/21 +f 228/22/22 230/23/23 226/24/24 +f 73/25/25 284/26/26 74/27/27 +f 74/28/27 285/29/28 73/30/25 +f 342/31/29 348/32/30 384/33/31 +f 385/34/32 349/35/33 343/36/34 +f 300/37/35 346/38/36 344/39/37 +f 345/40/38 347/41/39 301/42/40 +f 324/43/41 380/44/42 352/45/43 +f 353/46/44 381/47/45 325/48/46 +f 442/49/47 444/50/48 446/51/49 +f 447/52/50 445/53/51 443/54/52 +f 464/55/53 492/56/54 466/57/55 +f 467/58/56 493/59/57 465/60/58 +f 496/61/59 498/62/60 500/63/61 +f 501/64/62 499/65/63 497/66/64 +f 505/67/65 323/68/66 321/69/67 +f 505/67/65 321/69/67 391/70/68 +f 320/71/69 322/72/70 504/73/71 +f 320/71/69 504/73/71 390/74/72 +f 505/67/65 507/75/73 315/76/74 +f 505/67/65 315/76/74 323/68/66 +f 314/77/75 506/78/76 504/73/71 +f 314/77/75 504/73/71 322/72/70 +f 389/79/77 383/80/78 507/75/73 +f 383/80/78 315/76/74 507/75/73 +f 314/77/75 382/81/79 506/78/76 +f 382/81/79 388/82/80 506/78/76 +f 501/64/62 497/66/64 495/83/81 +f 501/64/62 495/83/81 503/84/82 +f 494/85/83 496/61/59 500/63/61 +f 494/85/83 500/63/61 502/86/84 +f 505/67/65 503/84/82 507/75/73 +f 503/84/82 495/83/81 507/75/73 +f 494/85/83 502/86/84 506/78/76 +f 502/86/84 504/73/71 506/78/76 +f 495/83/81 401/87/85 507/75/73 +f 401/87/85 389/79/77 507/75/73 +f 388/82/80 400/88/86 506/78/76 +f 400/88/86 494/85/83 506/78/76 +f 497/66/64 399/89/87 495/83/81 +f 399/89/87 401/87/85 495/83/81 +f 400/88/86 398/90/88 494/85/83 +f 398/90/88 496/61/59 494/85/83 +f 499/65/63 397/91/89 497/66/64 +f 397/91/89 399/89/87 497/66/64 +f 398/90/88 396/92/90 496/61/59 +f 396/92/90 498/62/60 496/61/59 +f 501/64/62 395/93/91 499/65/63 +f 395/93/91 397/91/89 499/65/63 +f 396/92/90 394/94/92 498/62/60 +f 394/94/92 500/63/61 498/62/60 +f 503/84/82 393/95/93 395/93/91 +f 503/84/82 395/93/91 501/64/62 +f 394/94/92 392/96/94 502/86/84 +f 394/94/92 502/86/84 500/63/61 +f 505/67/65 391/70/68 393/95/93 +f 505/67/65 393/95/93 503/84/82 +f 392/96/94 390/74/72 504/73/71 +f 392/96/94 504/73/71 502/86/84 +f 491/97/95 493/59/57 467/58/56 +f 491/97/95 467/58/56 469/98/96 +f 466/57/55 492/56/54 490/99/97 +f 466/57/55 490/99/97 468/100/98 +f 489/101/99 491/97/95 471/102/100 +f 491/97/95 469/98/96 471/102/100 +f 468/100/98 490/99/97 470/103/101 +f 490/99/97 488/104/102 470/103/101 +f 483/105/103 489/101/99 473/106/104 +f 489/101/99 471/102/100 473/106/104 +f 470/103/101 488/104/102 472/107/105 +f 488/104/102 482/108/106 472/107/105 +f 481/109/107 483/105/103 473/106/104 +f 481/109/107 473/106/104 475/110/108 +f 472/107/105 482/108/106 480/111/109 +f 472/107/105 480/111/109 474/112/110 +f 481/109/107 475/110/108 457/113/111 +f 475/110/108 455/114/112 457/113/111 +f 454/115/113 474/112/110 456/116/114 +f 474/112/110 480/111/109 456/116/114 +f 463/117/115 479/118/116 459/119/117 +f 463/117/115 459/119/117 461/120/118 +f 458/121/119 478/122/120 462/123/121 +f 458/121/119 462/123/121 460/124/122 +f 479/118/116 463/117/115 485/125/123 +f 463/117/115 453/126/124 485/125/123 +f 452/127/125 462/123/121 484/128/126 +f 462/123/121 478/122/120 484/128/126 +f 487/129/127 485/125/123 477/130/128 +f 485/125/123 453/126/124 477/130/128 +f 452/127/125 484/128/126 476/131/129 +f 484/128/126 486/132/130 476/131/129 +f 487/129/127 477/130/128 465/60/58 +f 487/129/127 465/60/58 493/59/57 +f 464/55/53 476/131/129 486/132/130 +f 464/55/53 486/132/130 492/56/54 +f 491/97/95 489/101/99 493/59/57 +f 489/101/99 487/129/127 493/59/57 +f 486/132/130 488/104/102 492/56/54 +f 488/104/102 490/99/97 492/56/54 +f 489/101/99 483/105/103 485/125/123 +f 489/101/99 485/125/123 487/129/127 +f 484/128/126 482/108/106 488/104/102 +f 484/128/126 488/104/102 486/132/130 +f 483/105/103 481/109/107 485/125/123 +f 481/109/107 479/118/116 485/125/123 +f 478/122/120 480/111/109 484/128/126 +f 480/111/109 482/108/106 484/128/126 +f 481/109/107 457/113/111 479/118/116 +f 457/113/111 459/119/117 479/118/116 +f 458/121/119 456/116/114 478/122/120 +f 456/116/114 480/111/109 478/122/120 +f 473/106/104 421/133/131 475/110/108 +f 421/133/131 419/134/132 475/110/108 +f 418/135/133 420/136/134 474/112/110 +f 420/136/134 472/107/105 474/112/110 +f 471/102/100 423/137/135 473/106/104 +f 423/137/135 421/133/131 473/106/104 +f 420/136/134 422/138/136 472/107/105 +f 422/138/136 470/103/101 472/107/105 +f 469/98/96 425/139/137 471/102/100 +f 425/139/137 423/137/135 471/102/100 +f 422/138/136 424/140/138 470/103/101 +f 424/140/138 468/100/98 470/103/101 +f 467/58/56 427/141/139 425/139/137 +f 467/58/56 425/139/137 469/98/96 +f 424/140/138 426/142/140 466/57/55 +f 424/140/138 466/57/55 468/100/98 +f 465/60/58 429/143/141 427/141/139 +f 465/60/58 427/141/139 467/58/56 +f 426/142/140 428/144/142 464/55/53 +f 426/142/140 464/55/53 466/57/55 +f 477/130/128 417/145/143 429/143/141 +f 477/130/128 429/143/141 465/60/58 +f 428/144/142 416/146/144 476/131/129 +f 428/144/142 476/131/129 464/55/53 +f 475/110/108 419/134/132 441/147/145 +f 475/110/108 441/147/145 455/114/112 +f 440/148/146 418/135/133 474/112/110 +f 440/148/146 474/112/110 454/115/113 +f 455/114/112 441/147/145 439/149/147 +f 455/114/112 439/149/147 457/113/111 +f 438/150/148 440/148/146 454/115/113 +f 438/150/148 454/115/113 456/116/114 +f 457/113/111 439/149/147 459/119/117 +f 439/149/147 437/151/149 459/119/117 +f 436/152/150 438/150/148 458/121/119 +f 438/150/148 456/116/114 458/121/119 +f 459/119/117 437/151/149 461/120/118 +f 437/151/149 435/153/151 461/120/118 +f 434/154/152 436/152/150 460/124/122 +f 436/152/150 458/121/119 460/124/122 +f 461/120/118 435/153/151 433/155/153 +f 461/120/118 433/155/153 463/117/115 +f 432/156/154 434/154/152 460/124/122 +f 432/156/154 460/124/122 462/123/121 +f 463/117/115 433/155/153 453/126/124 +f 433/155/153 451/157/155 453/126/124 +f 450/158/156 432/156/154 452/127/125 +f 432/156/154 462/123/121 452/127/125 +f 453/126/124 451/157/155 417/145/143 +f 453/126/124 417/145/143 477/130/128 +f 416/146/144 450/158/156 452/127/125 +f 416/146/144 452/127/125 476/131/129 +f 447/52/50 443/54/52 449/159/157 +f 443/54/52 313/160/158 449/159/157 +f 312/161/159 442/49/47 448/162/160 +f 442/49/47 446/51/49 448/162/160 +f 431/163/161 449/159/157 383/80/78 +f 449/159/157 313/160/158 383/80/78 +f 312/161/159 448/162/160 382/164/79 +f 448/162/160 430/165/162 382/164/79 +f 451/157/155 431/163/161 417/145/143 +f 431/163/161 415/166/163 417/145/143 +f 414/167/164 430/165/162 416/146/144 +f 430/165/162 450/158/156 416/146/144 +f 433/155/153 449/159/157 451/157/155 +f 449/159/157 431/163/161 451/157/155 +f 430/165/162 448/162/160 450/158/156 +f 448/162/160 432/156/154 450/158/156 +f 447/52/50 449/159/157 435/153/151 +f 449/159/157 433/155/153 435/153/151 +f 432/156/154 448/162/160 434/154/152 +f 448/162/160 446/51/49 434/154/152 +f 439/149/147 447/52/50 435/153/151 +f 439/149/147 435/153/151 437/151/149 +f 434/154/152 446/51/49 438/150/148 +f 434/154/152 438/150/148 436/152/150 +f 445/53/51 447/52/50 441/147/145 +f 447/52/50 439/149/147 441/147/145 +f 438/150/148 446/51/49 440/148/146 +f 446/51/49 444/50/48 440/148/146 +f 441/147/145 419/134/132 413/168/165 +f 441/147/145 413/168/165 445/53/51 +f 412/169/166 418/135/133 440/148/146 +f 412/169/166 440/148/146 444/50/48 +f 415/166/163 431/163/161 383/80/78 +f 415/166/163 383/80/78 389/79/77 +f 382/164/79 430/165/162 414/167/164 +f 382/164/79 414/167/164 388/170/80 +f 443/171/52 319/172/167 311/173/168 +f 443/171/52 311/173/168 313/174/158 +f 310/175/169 318/176/170 442/177/47 +f 310/175/169 442/177/47 312/178/159 +f 413/168/165 391/179/68 445/53/51 +f 391/179/68 321/180/67 445/53/51 +f 320/181/69 390/182/72 444/50/48 +f 390/182/72 412/169/166 444/50/48 +f 445/53/51 321/180/67 443/54/52 +f 321/183/67 319/172/167 443/171/52 +f 318/176/170 320/184/69 442/177/47 +f 320/181/69 444/50/48 442/49/47 +f 417/145/143 415/166/163 403/185/171 +f 417/145/143 403/185/171 429/143/141 +f 402/186/172 414/167/164 416/146/144 +f 402/186/172 416/146/144 428/144/142 +f 427/141/139 429/143/141 405/187/173 +f 429/143/141 403/185/171 405/187/173 +f 402/186/172 428/144/142 404/188/174 +f 428/144/142 426/142/140 404/188/174 +f 425/139/137 427/141/139 407/189/175 +f 427/141/139 405/187/173 407/189/175 +f 404/188/174 426/142/140 406/190/176 +f 426/142/140 424/140/138 406/190/176 +f 423/137/135 425/139/137 409/191/177 +f 425/139/137 407/189/175 409/191/177 +f 406/190/176 424/140/138 408/192/178 +f 424/140/138 422/138/136 408/192/178 +f 421/133/131 423/137/135 409/191/177 +f 421/133/131 409/191/177 411/193/179 +f 408/192/178 422/138/136 420/136/134 +f 408/192/178 420/136/134 410/194/180 +f 419/134/132 421/133/131 411/193/179 +f 419/134/132 411/193/179 413/168/165 +f 410/194/180 420/136/134 418/135/133 +f 410/194/180 418/135/133 412/169/166 +f 413/168/165 411/193/179 393/195/93 +f 413/168/165 393/195/93 391/179/68 +f 392/196/94 410/194/180 412/169/166 +f 392/196/94 412/169/166 390/182/72 +f 411/193/179 409/191/177 393/195/93 +f 409/191/177 395/197/91 393/195/93 +f 394/198/92 408/192/178 392/196/94 +f 408/192/178 410/194/180 392/196/94 +f 409/191/177 407/189/175 395/197/91 +f 407/189/175 397/199/89 395/197/91 +f 396/200/90 406/190/176 394/198/92 +f 406/190/176 408/192/178 394/198/92 +f 407/189/175 405/187/173 397/199/89 +f 405/187/173 399/89/87 397/199/89 +f 398/201/88 404/188/174 396/200/90 +f 404/188/174 406/190/176 396/200/90 +f 405/187/173 403/185/171 401/87/85 +f 405/187/173 401/87/85 399/89/87 +f 400/202/86 402/186/172 404/188/174 +f 400/202/86 404/188/174 398/201/88 +f 415/166/163 389/79/77 403/185/171 +f 389/79/77 401/87/85 403/185/171 +f 400/202/86 388/170/80 402/186/172 +f 388/170/80 414/167/164 402/186/172 +f 381/47/45 353/46/44 387/203/181 +f 353/46/44 351/204/182 387/203/181 +f 350/205/183 352/45/43 386/206/184 +f 352/45/43 380/44/42 386/206/184 +f 381/47/45 387/203/181 323/207/66 +f 387/203/181 321/183/67 323/207/66 +f 320/184/69 386/206/184 322/208/70 +f 386/206/184 380/44/42 322/208/70 +f 381/47/45 379/209/185 325/48/46 +f 379/209/185 317/210/186 325/48/46 +f 316/211/187 378/212/188 324/43/41 +f 378/212/188 380/44/42 324/43/41 +f 381/47/45 323/207/66 379/209/185 +f 323/207/66 315/213/74 379/209/185 +f 314/214/75 322/208/70 378/212/188 +f 322/208/70 380/44/42 378/212/188 +f 343/36/34 345/40/38 301/42/40 +f 343/36/34 301/42/40 385/34/32 +f 300/37/35 344/39/37 342/31/29 +f 300/37/35 342/31/29 384/33/31 +f 385/34/32 301/42/40 299/215/189 +f 385/34/32 299/215/189 319/172/167 +f 298/216/190 300/37/35 384/33/31 +f 298/216/190 384/33/31 318/176/170 +f 387/203/181 385/34/32 321/183/67 +f 385/34/32 319/172/167 321/183/67 +f 318/176/170 384/33/31 320/184/69 +f 384/33/31 386/206/184 320/184/69 +f 387/203/181 351/204/182 385/34/32 +f 351/204/182 349/35/33 385/34/32 +f 348/32/30 350/205/183 384/33/31 +f 350/205/183 386/206/184 384/33/31 +f 371/217/191 377/218/192 383/219/78 +f 377/218/192 315/213/74 383/219/78 +f 314/214/75 376/220/193 382/221/79 +f 376/220/193 370/222/194 382/221/79 +f 371/217/191 383/219/78 313/174/158 +f 371/217/191 313/174/158 369/223/195 +f 312/178/159 382/221/79 370/222/194 +f 312/178/159 370/222/194 368/224/196 +f 369/223/195 313/174/158 311/173/168 +f 369/223/195 311/173/168 363/225/197 +f 310/175/169 312/178/159 368/224/196 +f 310/175/169 368/224/196 362/226/198 +f 311/173/168 297/227/199 363/225/197 +f 297/227/199 295/228/200 363/225/197 +f 294/229/201 296/230/202 362/226/198 +f 296/230/202 310/175/169 362/226/198 +f 361/231/203 291/232/204 285/29/28 +f 361/231/203 285/29/28 74/28/27 +f 284/26/26 290/233/205 360/234/206 +f 284/26/26 360/234/206 74/27/27 +f 289/235/207 287/236/208 291/232/204 +f 287/236/208 285/29/28 291/232/204 +f 284/26/26 286/237/209 290/233/205 +f 286/237/209 288/238/210 290/233/205 +f 359/239/211 361/231/203 302/240/212 +f 361/231/203 74/28/27 302/240/212 +f 74/27/27 360/234/206 302/241/212 +f 360/234/206 358/242/213 302/241/212 +f 365/243/214 293/244/215 361/231/203 +f 293/244/215 291/232/204 361/231/203 +f 290/233/205 292/245/216 360/234/206 +f 292/245/216 364/246/217 360/234/206 +f 365/243/214 361/231/203 359/239/211 +f 365/243/214 359/239/211 367/247/218 +f 358/242/213 360/234/206 364/246/217 +f 358/242/213 364/246/217 366/248/219 +f 367/247/218 359/239/211 357/249/220 +f 367/247/218 357/249/220 373/250/221 +f 356/251/222 358/242/213 366/248/219 +f 356/251/222 366/248/219 372/252/223 +f 373/250/221 357/249/220 355/253/224 +f 373/250/221 355/253/224 375/254/225 +f 354/255/226 356/251/222 372/252/223 +f 354/255/226 372/252/223 374/256/227 +f 375/254/225 355/253/224 317/210/186 +f 375/254/225 317/210/186 379/209/185 +f 316/211/187 354/255/226 374/256/227 +f 316/211/187 374/256/227 378/212/188 +f 375/254/225 379/209/185 377/218/192 +f 379/209/185 315/213/74 377/218/192 +f 314/214/75 378/212/188 376/220/193 +f 378/212/188 374/256/227 376/220/193 +f 377/218/192 371/217/191 373/250/221 +f 377/218/192 373/250/221 375/254/225 +f 372/252/223 370/222/194 376/220/193 +f 372/252/223 376/220/193 374/256/227 +f 371/217/191 369/223/195 367/247/218 +f 371/217/191 367/247/218 373/250/221 +f 366/248/219 368/224/196 370/222/194 +f 366/248/219 370/222/194 372/252/223 +f 369/223/195 363/225/197 365/243/214 +f 369/223/195 365/243/214 367/247/218 +f 364/246/217 362/226/198 368/224/196 +f 364/246/217 368/224/196 366/248/219 +f 363/225/197 295/228/200 293/244/215 +f 363/225/197 293/244/215 365/243/214 +f 292/245/216 294/229/201 362/226/198 +f 292/245/216 362/226/198 364/246/217 +f 317/210/186 355/253/224 75/257/228 +f 317/210/186 75/257/228 76/258/229 +f 75/259/228 354/255/226 316/211/187 +f 75/259/228 316/211/187 76/260/229 +f 355/253/224 357/249/220 303/261/230 +f 355/253/224 303/261/230 75/257/228 +f 303/262/230 356/251/222 354/255/226 +f 303/262/230 354/255/226 75/259/228 +f 357/249/220 359/239/211 303/261/230 +f 359/239/211 302/240/212 303/261/230 +f 302/241/212 358/242/213 303/262/230 +f 358/242/213 356/251/222 303/262/230 +f 325/48/46 317/210/186 77/263/231 +f 317/210/186 76/258/229 77/263/231 +f 76/260/229 316/211/187 77/264/231 +f 316/211/187 324/43/41 77/264/231 +f 319/172/167 299/215/189 297/227/199 +f 319/172/167 297/227/199 311/173/168 +f 296/230/202 298/216/190 318/176/170 +f 296/230/202 318/176/170 310/175/169 +f 349/35/33 329/265/232 343/36/34 +f 329/265/232 327/266/233 343/36/34 +f 326/267/234 328/268/235 342/31/29 +f 328/268/235 348/32/30 342/31/29 +f 329/265/232 349/35/33 305/269/236 +f 329/265/232 305/269/236 309/270/237 +f 305/271/236 348/32/30 328/268/235 +f 305/271/236 328/268/235 309/272/237 +f 349/35/33 351/204/182 78/273/238 +f 349/35/33 78/273/238 305/269/236 +f 78/274/238 350/205/183 348/32/30 +f 78/274/238 348/32/30 305/271/236 +f 351/204/182 353/46/44 78/273/238 +f 353/46/44 304/275/239 78/273/238 +f 304/276/239 352/45/43 78/274/238 +f 352/45/43 350/205/183 78/274/238 +f 353/46/44 325/48/46 304/275/239 +f 325/48/46 77/263/231 304/275/239 +f 77/264/231 324/43/41 304/276/239 +f 324/43/41 352/45/43 304/276/239 +f 301/42/40 347/41/39 93/277/240 +f 347/278/39 80/279/241 93/280/240 +f 79/281/242 346/282/36 92/283/243 +f 346/38/36 300/37/35 92/284/243 +f 345/40/38 216/285/244 347/41/39 +f 216/286/244 80/279/241 347/278/39 +f 79/281/242 215/287/245 346/282/36 +f 215/288/245 344/39/37 346/38/36 +f 343/36/34 327/266/233 210/289/246 +f 327/266/233 82/290/247 210/289/246 +f 81/291/248 326/267/234 209/292/249 +f 326/267/234 342/31/29 209/292/249 +f 345/40/38 343/36/34 216/285/244 +f 343/36/34 210/289/246 216/285/244 +f 209/292/249 342/31/29 215/288/245 +f 342/31/29 344/39/37 215/288/245 +f 333/293/250 84/294/251 82/290/247 +f 333/293/250 82/290/247 327/266/233 +f 81/291/248 83/295/252 332/296/253 +f 81/291/248 332/296/253 326/267/234 +f 339/297/254 333/293/250 329/265/232 +f 333/293/250 327/266/233 329/265/232 +f 326/267/234 332/296/253 328/268/235 +f 332/296/253 338/298/255 328/268/235 +f 341/299/256 335/300/257 337/301/258 +f 335/300/257 331/302/259 337/301/258 +f 330/303/260 334/304/261 336/305/262 +f 334/304/261 340/306/263 336/305/262 +f 339/297/254 337/301/258 331/302/259 +f 339/297/254 331/302/259 333/293/250 +f 330/303/260 336/305/262 338/298/255 +f 330/303/260 338/298/255 332/296/253 +f 331/302/259 86/307/264 84/294/251 +f 331/302/259 84/294/251 333/293/250 +f 83/295/252 85/308/265 330/303/260 +f 83/295/252 330/303/260 332/296/253 +f 335/300/257 88/309/266 86/307/264 +f 335/300/257 86/307/264 331/302/259 +f 85/308/265 87/310/267 334/304/261 +f 85/308/265 334/304/261 330/303/260 +f 341/299/256 90/311/268 88/309/266 +f 341/299/256 88/309/266 335/300/257 +f 87/310/267 89/312/269 340/306/263 +f 87/310/267 340/306/263 334/304/261 +f 306/313/270 91/314/271 90/311/268 +f 306/313/270 90/311/268 341/299/256 +f 89/312/269 91/315/271 306/316/270 +f 89/312/269 306/316/270 340/306/263 +f 337/301/258 307/317/272 341/299/256 +f 307/317/272 306/313/270 341/299/256 +f 306/316/270 307/318/272 340/306/263 +f 307/318/272 336/305/262 340/306/263 +f 339/297/254 308/319/273 337/301/258 +f 308/319/273 307/317/272 337/301/258 +f 307/318/272 308/320/273 336/305/262 +f 308/320/273 338/298/255 336/305/262 +f 329/265/232 309/270/237 339/297/254 +f 309/270/237 308/319/273 339/297/254 +f 308/320/273 309/272/237 338/298/255 +f 309/272/237 328/268/235 338/298/255 +f 301/42/40 93/277/240 95/321/274 +f 301/42/40 95/321/274 299/215/189 +f 94/322/275 92/284/243 300/37/35 +f 94/322/275 300/37/35 298/216/190 +f 299/215/189 95/321/274 97/323/276 +f 299/215/189 97/323/276 297/227/199 +f 96/324/277 94/322/275 298/216/190 +f 96/324/277 298/216/190 296/230/202 +f 297/227/199 97/323/276 295/228/200 +f 97/323/276 99/325/278 295/228/200 +f 98/326/279 96/324/277 294/229/201 +f 96/324/277 296/230/202 294/229/201 +f 295/228/200 99/325/278 101/327/280 +f 295/228/200 101/327/280 293/244/215 +f 100/328/281 98/326/279 294/229/201 +f 100/328/281 294/229/201 292/245/216 +f 293/244/215 101/327/280 291/232/204 +f 101/327/280 103/329/282 291/232/204 +f 102/330/283 100/328/281 290/233/205 +f 100/328/281 292/245/216 290/233/205 +f 291/232/204 103/329/282 289/235/207 +f 103/329/282 105/331/284 289/235/207 +f 104/332/285 102/330/283 288/238/210 +f 102/330/283 290/233/205 288/238/210 +f 289/235/207 105/331/284 287/236/208 +f 105/331/284 107/333/286 287/236/208 +f 106/334/287 104/332/285 286/237/209 +f 104/332/285 288/238/210 286/237/209 +f 287/236/208 107/333/286 109/335/288 +f 287/236/208 109/335/288 285/29/28 +f 108/336/289 106/334/287 286/237/209 +f 108/336/289 286/237/209 284/26/26 +f 285/29/28 109/335/288 67/337/290 +f 285/29/28 67/337/290 73/30/25 +f 67/338/290 108/336/289 284/26/26 +f 67/338/290 284/26/26 73/25/25 +f 281/339/291 235/340/292 233/341/293 +f 281/339/291 233/341/293 283/342/294 +f 232/343/295 234/344/296 280/345/297 +f 232/343/295 280/345/297 282/346/298 +f 283/342/294 233/341/293 255/347/299 +f 283/342/294 255/347/299 261/348/300 +f 254/349/301 232/343/295 282/346/298 +f 254/349/301 282/346/298 260/350/302 +f 261/348/300 255/347/299 257/351/303 +f 261/348/300 257/351/303 259/352/304 +f 256/353/305 254/349/301 260/350/302 +f 256/353/305 260/350/302 258/354/306 +f 263/355/307 253/356/308 235/340/292 +f 263/355/307 235/340/292 281/339/291 +f 234/344/296 252/357/309 262/358/310 +f 234/344/296 262/358/310 280/345/297 +f 265/359/311 251/360/312 263/355/307 +f 251/360/312 253/356/308 263/355/307 +f 252/357/309 250/361/313 262/358/310 +f 250/361/313 264/362/314 262/358/310 +f 267/363/315 249/364/316 265/359/311 +f 249/364/316 251/360/312 265/359/311 +f 250/361/313 248/365/317 264/362/314 +f 248/365/317 266/366/318 264/362/314 +f 269/367/319 247/368/320 249/364/316 +f 269/367/319 249/364/316 267/363/315 +f 248/365/317 246/369/321 268/370/322 +f 248/365/317 268/370/322 266/366/318 +f 271/371/323 245/372/324 269/367/319 +f 245/372/324 247/368/320 269/367/319 +f 246/369/321 244/373/325 268/370/322 +f 244/373/325 270/374/326 268/370/322 +f 273/375/327 243/376/328 245/372/324 +f 273/375/327 245/372/324 271/371/323 +f 244/373/325 242/377/329 272/378/330 +f 244/373/325 272/378/330 270/374/326 +f 275/379/331 241/380/332 273/375/327 +f 241/380/332 243/376/328 273/375/327 +f 242/377/329 240/381/333 272/378/330 +f 240/381/333 274/382/334 272/378/330 +f 279/383/335 237/384/336 275/379/331 +f 237/384/336 241/380/332 275/379/331 +f 240/381/333 236/385/337 274/382/334 +f 236/385/337 278/386/338 274/382/334 +f 277/387/339 239/388/340 237/384/336 +f 277/387/339 237/384/336 279/383/335 +f 236/385/337 238/389/341 276/390/342 +f 236/385/337 276/390/342 278/386/338 +f 259/352/304 257/351/303 239/388/340 +f 259/352/304 239/388/340 277/387/339 +f 238/389/341 256/353/305 258/354/306 +f 238/389/341 258/354/306 276/390/342 +f 257/351/303 111/391/343 129/392/344 +f 257/351/303 129/392/344 239/388/340 +f 128/393/345 110/394/346 256/353/305 +f 128/393/345 256/353/305 238/389/341 +f 239/388/340 129/392/344 180/395/347 +f 239/388/340 180/395/347 237/384/336 +f 179/396/348 128/393/345 238/389/341 +f 179/396/348 238/389/341 236/385/337 +f 237/384/336 180/395/347 127/397/349 +f 237/384/336 127/397/349 241/380/332 +f 126/398/350 179/396/348 236/385/337 +f 126/398/350 236/385/337 240/381/333 +f 241/380/332 127/397/349 243/376/328 +f 127/397/349 125/399/351 243/376/328 +f 124/400/352 126/398/350 242/377/329 +f 126/398/350 240/381/333 242/377/329 +f 243/376/328 125/399/351 245/372/324 +f 125/399/351 123/401/353 245/372/324 +f 122/402/354 124/400/352 244/373/325 +f 124/400/352 242/377/329 244/373/325 +f 245/372/324 123/401/353 121/403/355 +f 245/372/324 121/403/355 247/368/320 +f 120/404/356 122/402/354 244/373/325 +f 120/404/356 244/373/325 246/369/321 +f 247/368/320 121/403/355 119/405/357 +f 247/368/320 119/405/357 249/364/316 +f 118/406/358 120/404/356 246/369/321 +f 118/406/358 246/369/321 248/365/317 +f 249/364/316 119/405/357 117/407/359 +f 249/364/316 117/407/359 251/360/312 +f 116/408/360 118/406/358 248/365/317 +f 116/408/360 248/365/317 250/361/313 +f 251/360/312 117/407/359 115/409/361 +f 251/360/312 115/409/361 253/356/308 +f 114/410/362 116/408/360 250/361/313 +f 114/410/362 250/361/313 252/357/309 +f 253/356/308 115/409/361 235/340/292 +f 115/409/361 182/411/363 235/340/292 +f 181/412/364 114/410/362 234/344/296 +f 114/410/362 252/357/309 234/344/296 +f 255/347/299 113/413/365 257/351/303 +f 113/413/365 111/391/343 257/351/303 +f 110/394/346 112/414/366 256/353/305 +f 112/414/366 254/349/301 256/353/305 +f 233/341/293 184/415/367 113/413/365 +f 233/341/293 113/413/365 255/347/299 +f 112/414/366 183/416/368 232/343/295 +f 112/414/366 232/343/295 254/349/301 +f 235/340/292 182/411/363 184/415/367 +f 235/340/292 184/415/367 233/341/293 +f 183/416/368 181/412/364 234/344/296 +f 183/416/368 234/344/296 232/343/295 +f 230/23/23 231/417/369 224/418/370 +f 230/23/23 224/418/370 226/24/24 +f 224/418/370 231/417/369 229/20/20 +f 224/418/370 229/20/20 225/19/19 +f 224/418/370 72/419/371 226/24/24 +f 72/419/371 223/420/372 226/24/24 +f 222/421/373 72/419/371 225/19/19 +f 72/419/371 224/418/370 225/19/19 +f 226/24/24 223/420/372 221/422/374 +f 226/24/24 221/422/374 228/22/22 +f 220/423/375 222/421/373 225/19/19 +f 220/423/375 225/19/19 227/21/21 +f 228/22/22 221/422/374 219/424/376 +f 228/22/22 219/424/376 230/23/23 +f 218/425/377 220/423/375 227/21/21 +f 218/425/377 227/21/21 229/20/20 +f 230/23/23 219/424/376 231/417/369 +f 219/424/376 217/426/378 231/417/369 +f 217/426/378 218/425/377 231/417/369 +f 218/425/377 229/20/20 231/417/369 +f 219/424/376 136/427/379 137/428/380 +f 219/424/376 137/428/380 217/426/378 +f 137/428/380 135/429/381 218/425/377 +f 137/428/380 218/425/377 217/426/378 +f 221/422/374 134/430/382 136/427/379 +f 221/422/374 136/427/379 219/424/376 +f 135/429/381 133/431/383 220/423/375 +f 135/429/381 220/423/375 218/425/377 +f 223/420/372 132/432/384 134/430/382 +f 223/420/372 134/430/382 221/422/374 +f 133/431/383 131/433/385 222/421/373 +f 133/431/383 222/421/373 220/423/375 +f 72/419/371 130/434/386 223/420/372 +f 130/434/386 132/432/384 223/420/372 +f 131/433/385 130/434/386 222/421/373 +f 130/434/386 72/419/371 222/421/373 +f 212/435/387 165/436/388 80/279/241 +f 212/435/387 80/279/241 216/286/244 +f 79/281/242 164/437/389 211/438/390 +f 79/281/242 211/438/390 215/287/245 +f 212/435/387 216/286/244 214/439/391 +f 216/286/244 210/440/246 214/439/391 +f 209/441/249 215/287/245 213/442/392 +f 215/287/245 211/438/390 213/442/392 +f 214/439/391 210/440/246 167/443/393 +f 210/440/246 82/444/247 167/443/393 +f 81/445/248 209/441/249 166/446/394 +f 209/441/249 213/442/392 166/446/394 +f 167/443/393 188/447/395 214/439/391 +f 188/447/395 145/448/396 214/439/391 +f 144/449/397 187/450/398 213/442/392 +f 187/450/398 166/446/394 213/442/392 +f 214/439/391 145/448/396 212/435/387 +f 145/448/396 143/451/399 212/435/387 +f 142/452/400 144/449/397 211/438/390 +f 144/449/397 213/442/392 211/438/390 +f 212/435/387 143/451/399 141/453/401 +f 212/435/387 141/453/401 165/436/388 +f 140/454/402 142/452/400 211/438/390 +f 140/454/402 211/438/390 164/437/389 +f 165/436/388 141/453/401 139/455/403 +f 165/436/388 139/455/403 177/456/404 +f 139/455/403 140/454/402 164/437/389 +f 139/455/403 164/437/389 177/456/404 +f 207/457/405 208/458/406 199/459/407 +f 207/457/405 199/459/407 205/460/408 +f 199/459/407 208/458/406 206/461/409 +f 199/459/407 206/461/409 204/462/410 +f 203/463/411 205/460/408 201/464/412 +f 205/460/408 199/459/407 201/464/412 +f 199/459/407 204/462/410 200/465/413 +f 204/462/410 202/466/414 200/465/413 +f 207/457/405 205/460/408 194/467/415 +f 207/457/405 194/467/415 192/468/416 +f 193/469/417 204/462/410 206/461/409 +f 193/469/417 206/461/409 191/470/418 +f 205/460/408 203/463/411 194/467/415 +f 203/463/411 196/471/419 194/467/415 +f 195/472/420 202/466/414 193/469/417 +f 202/466/414 204/462/410 193/469/417 +f 203/463/411 201/464/412 198/473/421 +f 203/463/411 198/473/421 196/471/419 +f 197/474/422 200/465/413 202/466/414 +f 197/474/422 202/466/414 195/472/420 +f 201/464/412 199/459/407 71/475/423 +f 201/464/412 71/475/423 198/473/421 +f 71/475/423 199/459/407 200/465/413 +f 71/475/423 200/465/413 197/474/422 +f 207/457/405 192/468/416 208/458/406 +f 192/468/416 70/476/424 208/458/406 +f 70/476/424 191/470/418 208/458/406 +f 191/470/418 206/461/409 208/458/406 +f 192/468/416 145/448/396 70/476/424 +f 145/448/396 190/477/425 70/476/424 +f 190/477/425 144/449/397 70/476/424 +f 144/449/397 191/470/418 70/476/424 +f 198/473/421 71/475/423 139/455/403 +f 71/478/423 138/479/426 139/480/403 +f 138/481/426 71/482/423 139/483/403 +f 71/475/423 197/474/422 139/455/403 +f 196/471/419 198/473/421 141/453/401 +f 198/473/421 139/455/403 141/453/401 +f 139/455/403 197/474/422 140/454/402 +f 197/474/422 195/472/420 140/454/402 +f 194/467/415 196/471/419 143/451/399 +f 196/471/419 141/453/401 143/451/399 +f 140/454/402 195/472/420 142/452/400 +f 195/472/420 193/469/417 142/452/400 +f 192/468/416 194/467/415 143/451/399 +f 192/468/416 143/451/399 145/448/396 +f 142/452/400 193/469/417 191/470/418 +f 142/452/400 191/470/418 144/449/397 +f 186/484/427 132/432/384 69/485/428 +f 132/432/384 130/434/386 69/485/428 +f 130/434/386 131/433/385 69/485/428 +f 131/433/385 185/486/429 69/485/428 +f 189/487/430 188/447/395 69/485/428 +f 188/447/395 186/484/427 69/485/428 +f 185/486/429 187/450/398 69/485/428 +f 187/450/398 189/487/430 69/485/428 +f 189/487/430 190/477/425 188/447/395 +f 190/477/425 145/448/396 188/447/395 +f 144/449/397 190/477/425 187/450/398 +f 190/477/425 189/487/430 187/450/398 +f 169/488/431 171/489/432 132/432/384 +f 169/488/431 132/432/384 186/484/427 +f 131/433/385 170/490/433 168/491/434 +f 131/433/385 168/491/434 185/486/429 +f 186/484/427 188/447/395 167/443/393 +f 186/484/427 167/443/393 169/488/431 +f 166/446/394 187/450/398 185/486/429 +f 166/446/394 185/486/429 168/491/434 +f 173/492/435 134/430/382 171/489/432 +f 134/430/382 132/432/384 171/489/432 +f 131/433/385 133/431/383 170/490/433 +f 133/431/383 172/493/436 170/490/433 +f 175/494/437 136/427/379 134/430/382 +f 175/494/437 134/430/382 173/492/435 +f 133/431/383 135/429/381 174/495/438 +f 133/431/383 174/495/438 172/493/436 +f 176/496/439 137/428/380 136/427/379 +f 176/496/439 136/427/379 175/494/437 +f 135/429/381 137/428/380 176/496/439 +f 135/429/381 176/496/439 174/495/438 +f 184/415/367 182/411/363 178/497/440 +f 182/411/363 177/456/404 178/497/440 +f 177/456/404 181/412/364 178/497/440 +f 181/412/364 183/416/368 178/497/440 +f 178/497/440 68/498/441 113/413/365 +f 178/497/440 113/413/365 184/415/367 +f 112/414/366 68/498/441 178/497/440 +f 112/414/366 178/497/440 183/416/368 +f 68/498/441 163/499/442 113/413/365 +f 163/499/442 111/391/343 113/413/365 +f 110/394/346 162/500/443 112/414/366 +f 162/500/443 68/498/441 112/414/366 +f 177/456/404 182/411/363 115/409/361 +f 177/456/404 115/409/361 165/436/388 +f 114/410/362 181/412/364 177/456/404 +f 114/410/362 177/456/404 164/437/389 +f 147/501/444 165/436/388 115/409/361 +f 147/501/444 115/409/361 117/407/359 +f 114/410/362 164/437/389 146/502/445 +f 114/410/362 146/502/445 116/408/360 +f 149/503/446 147/501/444 119/405/357 +f 147/501/444 117/407/359 119/405/357 +f 116/408/360 146/502/445 118/406/358 +f 146/502/445 148/504/447 118/406/358 +f 151/505/448 149/503/446 121/403/355 +f 149/503/446 119/405/357 121/403/355 +f 118/406/358 148/504/447 120/404/356 +f 148/504/447 150/506/449 120/404/356 +f 153/507/450 151/505/448 123/401/353 +f 151/505/448 121/403/355 123/401/353 +f 120/404/356 150/506/449 122/402/354 +f 150/506/449 152/508/451 122/402/354 +f 155/509/452 153/507/450 125/399/351 +f 153/507/450 123/401/353 125/399/351 +f 122/402/354 152/508/451 124/400/352 +f 152/508/451 154/510/453 124/400/352 +f 157/511/454 155/509/452 127/397/349 +f 155/509/452 125/399/351 127/397/349 +f 124/400/352 154/510/453 126/398/350 +f 154/510/453 156/512/455 126/398/350 +f 159/513/456 157/511/454 180/395/347 +f 157/511/454 127/397/349 180/395/347 +f 126/398/350 156/512/455 179/396/348 +f 156/512/455 158/514/457 179/396/348 +f 159/513/456 180/395/347 129/392/344 +f 159/513/456 129/392/344 161/515/458 +f 128/393/345 179/396/348 158/514/457 +f 128/393/345 158/514/457 160/516/459 +f 161/515/458 129/392/344 163/499/442 +f 129/392/344 111/391/343 163/499/442 +f 110/394/346 128/393/345 162/500/443 +f 128/393/345 160/516/459 162/500/443 +f 68/498/441 67/517/290 163/499/442 +f 67/517/290 109/518/288 163/499/442 +f 108/519/289 67/517/290 162/500/443 +f 67/517/290 68/498/441 162/500/443 +f 163/499/442 109/518/288 161/515/458 +f 109/518/288 107/520/286 161/515/458 +f 106/521/287 108/519/289 160/516/459 +f 108/519/289 162/500/443 160/516/459 +f 161/515/458 107/520/286 159/513/456 +f 107/520/286 105/522/284 159/513/456 +f 104/523/285 106/521/287 158/514/457 +f 106/521/287 160/516/459 158/514/457 +f 159/513/456 105/522/284 103/524/282 +f 159/513/456 103/524/282 157/511/454 +f 102/525/283 104/523/285 158/514/457 +f 102/525/283 158/514/457 156/512/455 +f 157/511/454 103/524/282 155/509/452 +f 103/524/282 101/526/280 155/509/452 +f 100/527/281 102/525/283 154/510/453 +f 102/525/283 156/512/455 154/510/453 +f 155/509/452 101/526/280 153/507/450 +f 101/526/280 99/528/278 153/507/450 +f 98/529/279 100/527/281 152/508/451 +f 100/527/281 154/510/453 152/508/451 +f 153/507/450 99/528/278 151/505/448 +f 99/528/278 97/530/276 151/505/448 +f 96/531/277 98/529/279 150/506/449 +f 98/529/279 152/508/451 150/506/449 +f 151/505/448 97/530/276 95/532/274 +f 151/505/448 95/532/274 149/503/446 +f 94/533/275 96/531/277 150/506/449 +f 94/533/275 150/506/449 148/504/447 +f 149/503/446 95/532/274 147/501/444 +f 95/532/274 93/280/240 147/501/444 +f 92/283/243 94/533/275 146/502/445 +f 94/533/275 148/504/447 146/502/445 +f 147/501/444 93/280/240 80/279/241 +f 147/501/444 80/279/241 165/436/388 +f 79/281/242 92/283/243 146/502/445 +f 79/281/242 146/502/445 164/437/389 +f 169/488/431 167/443/393 82/444/247 +f 169/488/431 82/444/247 84/534/251 +f 81/445/248 166/446/394 168/491/434 +f 81/445/248 168/491/434 83/535/252 +f 171/489/432 169/488/431 84/534/251 +f 171/489/432 84/534/251 86/536/264 +f 83/535/252 168/491/434 170/490/433 +f 83/535/252 170/490/433 85/537/265 +f 173/492/435 171/489/432 86/536/264 +f 173/492/435 86/536/264 88/538/266 +f 85/537/265 170/490/433 172/493/436 +f 85/537/265 172/493/436 87/539/267 +f 175/494/437 173/492/435 90/540/268 +f 173/492/435 88/538/266 90/540/268 +f 87/539/267 172/493/436 89/541/269 +f 172/493/436 174/495/438 89/541/269 +f 176/496/439 175/494/437 91/542/271 +f 175/494/437 90/540/268 91/542/271 +f 89/541/269 174/495/438 91/542/271 +f 174/495/438 176/496/439 91/542/271 +f 50/4/4 48/543/460 2/544/461 +f 50/4/4 2/544/461 66/5/5 +f 1/545/462 47/546/463 49/3/3 +f 1/545/462 49/3/3 65/2/2 +f 66/5/5 2/544/461 12/547/464 +f 66/5/5 12/547/464 64/8/8 +f 11/548/465 1/545/462 65/2/2 +f 11/548/465 65/2/2 63/7/7 +f 64/8/8 12/547/464 14/549/466 +f 64/8/8 14/549/466 60/10/10 +f 13/550/467 11/548/465 63/7/7 +f 13/550/467 63/7/7 59/9/9 +f 60/10/10 14/549/466 24/551/468 +f 60/10/10 24/551/468 58/12/12 +f 23/552/469 13/550/467 59/9/9 +f 23/552/469 59/9/9 57/11/11 +f 58/12/12 24/551/468 56/14/14 +f 24/551/468 26/553/470 56/14/14 +f 25/554/471 23/552/469 55/13/13 +f 23/552/469 57/11/11 55/13/13 +f 56/14/14 26/553/470 54/16/16 +f 26/553/470 36/555/472 54/16/16 +f 35/556/473 25/554/471 53/15/15 +f 25/554/471 55/13/13 53/15/15 +f 54/16/16 36/555/472 52/18/18 +f 36/555/472 38/557/474 52/18/18 +f 37/558/475 35/556/473 51/17/17 +f 35/556/473 53/15/15 51/17/17 +f 52/18/18 38/557/474 50/4/4 +f 38/557/474 48/543/460 50/4/4 +f 47/546/463 37/558/475 49/3/3 +f 37/558/475 51/17/17 49/3/3 +f 46/559/476 48/543/460 40/560/477 +f 48/543/460 38/557/474 40/560/477 +f 37/558/475 47/546/463 39/561/478 +f 47/546/463 45/562/479 39/561/478 +f 44/563/480 46/559/476 42/564/481 +f 46/559/476 40/560/477 42/564/481 +f 39/561/478 45/562/479 41/565/482 +f 45/562/479 43/566/483 41/565/482 +f 42/564/481 40/560/477 32/567/484 +f 40/560/477 34/568/485 32/567/484 +f 33/569/486 39/561/478 31/570/487 +f 39/561/478 41/565/482 31/570/487 +f 40/560/477 38/557/474 34/568/485 +f 38/557/474 36/555/472 34/568/485 +f 35/556/473 37/558/475 33/569/486 +f 37/558/475 39/561/478 33/569/486 +f 34/568/485 36/555/472 28/571/488 +f 36/555/472 26/553/470 28/571/488 +f 25/554/471 35/556/473 27/572/489 +f 35/556/473 33/569/486 27/572/489 +f 32/567/484 34/568/485 30/573/490 +f 34/568/485 28/571/488 30/573/490 +f 27/572/489 33/569/486 29/574/491 +f 33/569/486 31/570/487 29/574/491 +f 30/573/490 28/571/488 20/575/492 +f 28/571/488 22/576/493 20/575/492 +f 21/577/494 27/572/489 19/578/495 +f 27/572/489 29/574/491 19/578/495 +f 28/571/488 26/553/470 24/551/468 +f 28/571/488 24/551/468 22/576/493 +f 23/552/469 25/554/471 27/572/489 +f 23/552/469 27/572/489 21/577/494 +f 22/576/493 24/551/468 16/579/496 +f 24/551/468 14/549/466 16/579/496 +f 13/550/467 23/552/469 15/580/497 +f 23/552/469 21/577/494 15/580/497 +f 20/575/492 22/576/493 18/581/498 +f 22/576/493 16/579/496 18/581/498 +f 15/580/497 21/577/494 17/582/499 +f 21/577/494 19/578/495 17/582/499 +f 18/581/498 16/579/496 10/583/500 +f 18/581/498 10/583/500 8/584/501 +f 9/585/502 15/580/497 17/582/499 +f 9/585/502 17/582/499 7/586/503 +f 16/579/496 14/549/466 12/547/464 +f 16/579/496 12/547/464 10/583/500 +f 11/548/465 13/550/467 15/580/497 +f 11/548/465 15/580/497 9/585/502 +f 10/583/500 12/547/464 2/544/461 +f 10/583/500 2/544/461 4/587/504 +f 1/545/462 11/548/465 9/585/502 +f 1/545/462 9/585/502 3/588/505 +f 8/584/501 10/583/500 4/587/504 +f 8/584/501 4/587/504 6/589/506 +f 3/588/505 9/585/502 7/586/503 +f 3/588/505 7/586/503 5/590/507 +f 6/589/506 4/587/504 46/559/476 +f 6/589/506 46/559/476 44/563/480 +f 45/562/479 3/588/505 5/590/507 +f 45/562/479 5/590/507 43/566/483 +f 4/587/504 2/544/461 48/543/460 +f 4/587/504 48/543/460 46/559/476 +f 47/546/463 1/545/462 3/588/505 +f 47/546/463 3/588/505 45/562/479 diff --git a/strafe-client/models/teapot.obj b/strafe-client/models/teapot.obj new file mode 100644 index 0000000..b6c6810 --- /dev/null +++ b/strafe-client/models/teapot.obj @@ -0,0 +1,2866 @@ +# Max2Obj Version 4.0 Mar 10th, 2001 +# +# object Teapot01 to come ... +# +v 5.929688 4.125000 0.000000 +v 5.832031 4.494141 0.000000 +v 5.945313 4.617188 0.000000 +v 6.175781 4.494141 0.000000 +v 6.429688 4.125000 0.000000 +v 5.387188 4.125000 2.747500 +v 5.297100 4.494141 2.709170 +v 5.401602 4.617188 2.753633 +v 5.614209 4.494141 2.844092 +v 5.848437 4.125000 2.943750 +v 3.899688 4.125000 4.970000 +v 3.830352 4.494141 4.900664 +v 3.910782 4.617188 4.981094 +v 4.074414 4.494141 5.144727 +v 4.254687 4.125000 5.325000 +v 1.677188 4.125000 6.457500 +v 1.638858 4.494141 6.367412 +v 1.683320 4.617188 6.471914 +v 1.773780 4.494141 6.684522 +v 1.873438 4.125000 6.918750 +v -1.070312 4.125000 7.000000 +v -1.070312 4.494141 6.902344 +v -1.070312 4.617188 7.015625 +v -1.070312 4.494141 7.246094 +v -1.070312 4.125000 7.500000 +v -4.007656 4.125000 6.457500 +v -3.859572 4.494141 6.367412 +v -3.847676 4.617188 6.471914 +v -3.917371 4.494141 6.684522 +v -4.014062 4.125000 6.918750 +v -6.209063 4.125000 4.970000 +v -6.042168 4.494141 4.900664 +v -6.072500 4.617188 4.981094 +v -6.217675 4.494141 5.144727 +v -6.395312 4.125000 5.325000 +v -7.591093 4.125000 2.747500 +v -7.464421 4.494141 2.709170 +v -7.550137 4.617188 2.753633 +v -7.755822 4.494141 2.844092 +v -7.989062 4.125000 2.943750 +v -8.070313 4.125000 0.000000 +v -7.972656 4.494141 0.000000 +v -8.085938 4.617188 0.000000 +v -8.316406 4.494141 0.000000 +v -8.570313 4.125000 0.000000 +v -7.527812 4.125000 -2.747500 +v -7.437724 4.494141 -2.709170 +v -7.542227 4.617188 -2.753633 +v -7.754834 4.494141 -2.844092 +v -7.989062 4.125000 -2.943750 +v -6.040312 4.125000 -4.970000 +v -5.970977 4.494141 -4.900664 +v -6.051406 4.617188 -4.981094 +v -6.215039 4.494141 -5.144727 +v -6.395312 4.125000 -5.325000 +v -3.817812 4.125000 -6.457500 +v -3.779482 4.494141 -6.367412 +v -3.823945 4.617188 -6.471914 +v -3.914404 4.494141 -6.684522 +v -4.014062 4.125000 -6.918750 +v -1.070312 4.125000 -7.000000 +v -1.070312 4.494141 -6.902344 +v -1.070312 4.617188 -7.015625 +v -1.070312 4.494141 -7.246094 +v -1.070312 4.125000 -7.500000 +v 1.677188 4.125000 -6.457500 +v 1.638858 4.494141 -6.367412 +v 1.683320 4.617188 -6.471914 +v 1.773780 4.494141 -6.684522 +v 1.873438 4.125000 -6.918750 +v 3.899688 4.125000 -4.970000 +v 3.830352 4.494141 -4.900664 +v 3.910782 4.617188 -4.981094 +v 4.074414 4.494141 -5.144727 +v 4.254687 4.125000 -5.325000 +v 5.387188 4.125000 -2.747500 +v 5.297100 4.494141 -2.709170 +v 5.401602 4.617188 -2.753633 +v 5.614209 4.494141 -2.844092 +v 5.848437 4.125000 -2.943750 +v 7.347656 2.162109 0.000000 +v 8.148438 0.234375 0.000000 +v 8.714844 -1.623047 0.000000 +v 8.929688 -3.375000 0.000000 +v 6.695264 2.162109 3.304053 +v 7.433985 0.234375 3.618360 +v 7.956494 -1.623047 3.840674 +v 8.154688 -3.375000 3.925000 +v 4.906446 2.162109 5.976758 +v 5.475000 0.234375 6.545312 +v 5.877149 -1.623047 6.947461 +v 6.029688 -3.375000 7.100000 +v 2.233740 2.162109 7.765576 +v 2.548047 0.234375 8.504297 +v 2.770362 -1.623047 9.026807 +v 2.854688 -3.375000 9.225000 +v -1.070312 2.162109 8.417969 +v -1.070312 0.234375 9.218750 +v -1.070312 -1.623047 9.785156 +v -1.070312 -3.375000 10.000000 +v -4.374365 2.162109 7.765576 +v -4.688672 0.234375 8.504297 +v -4.910986 -1.623047 9.026807 +v -4.995313 -3.375000 9.225000 +v -7.047071 2.162109 5.976758 +v -7.615624 0.234375 6.545312 +v -8.017773 -1.623047 6.947461 +v -8.170312 -3.375000 7.100000 +v -8.835889 2.162109 3.304053 +v -9.574610 0.234375 3.618360 +v -10.097119 -1.623047 3.840674 +v -10.295313 -3.375000 3.925000 +v -9.488281 2.162109 0.000000 +v -10.289063 0.234375 0.000000 +v -10.855469 -1.623047 0.000000 +v -11.070313 -3.375000 0.000000 +v -8.835889 2.162109 -3.304053 +v -9.574610 0.234375 -3.618360 +v -10.097119 -1.623047 -3.840674 +v -10.295313 -3.375000 -3.925000 +v -7.047071 2.162109 -5.976758 +v -7.615624 0.234375 -6.545312 +v -8.017773 -1.623047 -6.947461 +v -8.170312 -3.375000 -7.100000 +v -4.374365 2.162109 -7.765576 +v -4.688672 0.234375 -8.504297 +v -4.910986 -1.623047 -9.026807 +v -4.995313 -3.375000 -9.225000 +v -1.070312 2.162109 -8.417969 +v -1.070312 0.234375 -9.218750 +v -1.070312 -1.623047 -9.785156 +v -1.070312 -3.375000 -10.000000 +v 2.233740 2.162109 -7.765576 +v 2.548047 0.234375 -8.504297 +v 2.770362 -1.623047 -9.026807 +v 2.854688 -3.375000 -9.225000 +v 4.906446 2.162109 -5.976758 +v 5.475000 0.234375 -6.545312 +v 5.877149 -1.623047 -6.947461 +v 6.029688 -3.375000 -7.100000 +v 6.695264 2.162109 -3.304053 +v 7.433985 0.234375 -3.618360 +v 7.956494 -1.623047 -3.840674 +v 8.154688 -3.375000 -3.925000 +v 8.539063 -4.857422 0.000000 +v 7.679688 -5.953125 0.000000 +v 6.820313 -6.697266 0.000000 +v 6.429688 -7.125000 0.000000 +v 7.794336 -4.857422 3.771680 +v 7.001562 -5.953125 3.434375 +v 6.208789 -6.697266 3.097070 +v 5.848437 -7.125000 2.943750 +v 5.752343 -4.857422 6.822656 +v 5.142187 -5.953125 6.212500 +v 4.532031 -6.697266 5.602344 +v 4.254687 -7.125000 5.325000 +v 2.701367 -4.857422 8.864649 +v 2.364063 -5.953125 8.071875 +v 2.026758 -6.697266 7.279101 +v 1.873438 -7.125000 6.918750 +v -1.070312 -4.857422 9.609375 +v -1.070312 -5.953125 8.750000 +v -1.070312 -6.697266 7.890625 +v -1.070312 -7.125000 7.500000 +v -4.841992 -4.857422 8.864649 +v -4.504687 -5.953125 8.071875 +v -4.167383 -6.697266 7.279101 +v -4.014062 -7.125000 6.918750 +v -7.892968 -4.857422 6.822656 +v -7.282812 -5.953125 6.212500 +v -6.672656 -6.697266 5.602344 +v -6.395312 -7.125000 5.325000 +v -9.934961 -4.857422 3.771680 +v -9.142187 -5.953125 3.434375 +v -8.349414 -6.697266 3.097070 +v -7.989062 -7.125000 2.943750 +v -10.679688 -4.857422 0.000000 +v -9.820313 -5.953125 0.000000 +v -8.960938 -6.697266 0.000000 +v -8.570313 -7.125000 0.000000 +v -9.934961 -4.857422 -3.771680 +v -9.142187 -5.953125 -3.434375 +v -8.349414 -6.697266 -3.097070 +v -7.989062 -7.125000 -2.943750 +v -7.892968 -4.857422 -6.822656 +v -7.282812 -5.953125 -6.212500 +v -6.672656 -6.697266 -5.602344 +v -6.395312 -7.125000 -5.325000 +v -4.841992 -4.857422 -8.864649 +v -4.504687 -5.953125 -8.071875 +v -4.167383 -6.697266 -7.279101 +v -4.014062 -7.125000 -6.918750 +v -1.070312 -4.857422 -9.609375 +v -1.070312 -5.953125 -8.750000 +v -1.070312 -6.697266 -7.890625 +v -1.070312 -7.125000 -7.500000 +v 2.701367 -4.857422 -8.864649 +v 2.364063 -5.953125 -8.071875 +v 2.026758 -6.697266 -7.279101 +v 1.873438 -7.125000 -6.918750 +v 5.752343 -4.857422 -6.822656 +v 5.142187 -5.953125 -6.212500 +v 4.532031 -6.697266 -5.602344 +v 4.254687 -7.125000 -5.325000 +v 7.794336 -4.857422 -3.771680 +v 7.001562 -5.953125 -3.434375 +v 6.208789 -6.697266 -3.097070 +v 5.848437 -7.125000 -2.943750 +v 6.259766 -7.400391 0.000000 +v 5.351563 -7.640625 0.000000 +v 3.107422 -7.810547 0.000000 +v -1.070312 -7.875000 0.000000 +v 5.691685 -7.400391 2.877056 +v 4.853868 -7.640625 2.520586 +v 2.783648 -7.810547 1.639761 +v 4.134043 -7.400391 5.204355 +v 3.489219 -7.640625 4.559531 +v 1.895879 -7.810547 2.966191 +v 1.806743 -7.400391 6.761997 +v 1.450274 -7.640625 5.924180 +v 0.569448 -7.810547 3.853960 +v -1.070312 -7.400391 7.330078 +v -1.070312 -7.640625 6.421875 +v -1.070312 -7.810547 4.177734 +v -3.947368 -7.400391 6.761997 +v -3.590898 -7.640625 5.924180 +v -2.710073 -7.810547 3.853960 +v -6.274668 -7.400391 5.204355 +v -5.629844 -7.640625 4.559531 +v -4.036504 -7.810547 2.966191 +v -7.832309 -7.400391 2.877056 +v -6.994492 -7.640625 2.520586 +v -4.924272 -7.810547 1.639761 +v -8.400391 -7.400391 0.000000 +v -7.492188 -7.640625 0.000000 +v -5.248047 -7.810547 0.000000 +v -7.832309 -7.400391 -2.877056 +v -6.994492 -7.640625 -2.520586 +v -4.924272 -7.810547 -1.639761 +v -6.274668 -7.400391 -5.204355 +v -5.629844 -7.640625 -4.559531 +v -4.036504 -7.810547 -2.966191 +v -3.947368 -7.400391 -6.761997 +v -3.590898 -7.640625 -5.924180 +v -2.710073 -7.810547 -3.853960 +v -1.070312 -7.400391 -7.330078 +v -1.070312 -7.640625 -6.421875 +v -1.070312 -7.810547 -4.177734 +v 1.806743 -7.400391 -6.761997 +v 1.450274 -7.640625 -5.924180 +v 0.569448 -7.810547 -3.853960 +v 4.134043 -7.400391 -5.204355 +v 3.489219 -7.640625 -4.559531 +v 1.895879 -7.810547 -2.966191 +v 5.691685 -7.400391 -2.877056 +v 4.853868 -7.640625 -2.520586 +v 2.783648 -7.810547 -1.639761 +v -9.070313 2.250000 0.000000 +v -11.406250 2.232422 0.000000 +v -13.132813 2.109375 0.000000 +v -14.203125 1.775391 0.000000 +v -14.570313 1.125000 0.000000 +v -8.992188 2.425781 0.843750 +v -11.475830 2.405457 0.843750 +v -13.298828 2.263184 0.843750 +v -14.421631 1.877014 0.843750 +v -14.804688 1.125000 0.843750 +v -8.820313 2.812500 1.125000 +v -11.628906 2.786134 1.125000 +v -13.664063 2.601563 1.125000 +v -14.902344 2.100586 1.125000 +v -15.320313 1.125000 1.125000 +v -8.648438 3.199219 0.843750 +v -11.781982 3.166809 0.843750 +v -14.029297 2.939941 0.843750 +v -15.383057 2.324158 0.843750 +v -15.835938 1.125000 0.843750 +v -8.570313 3.375000 0.000000 +v -11.851563 3.339844 0.000000 +v -14.195313 3.093750 0.000000 +v -15.601563 2.425781 0.000000 +v -16.070313 1.125000 0.000000 +v -8.648438 3.199219 -0.843750 +v -11.781982 3.166809 -0.843750 +v -14.029297 2.939941 -0.843750 +v -15.383057 2.324158 -0.843750 +v -15.835938 1.125000 -0.843750 +v -8.820313 2.812500 -1.125000 +v -11.628906 2.786134 -1.125000 +v -13.664063 2.601563 -1.125000 +v -14.902344 2.100586 -1.125000 +v -15.320313 1.125000 -1.125000 +v -8.992188 2.425781 -0.843750 +v -11.475830 2.405457 -0.843750 +v -13.298828 2.263184 -0.843750 +v -14.421631 1.877014 -0.843750 +v -14.804688 1.125000 -0.843750 +v -14.375000 0.105469 0.000000 +v -13.757813 -1.125000 0.000000 +v -12.671875 -2.355469 0.000000 +v -11.070313 -3.375000 0.000000 +v -14.588013 0.007050 0.843750 +v -13.909180 -1.275146 0.843750 +v -12.724976 -2.540863 0.843750 +v -10.992188 -3.609375 0.843750 +v -15.056641 -0.209473 1.125000 +v -14.242188 -1.605469 1.125000 +v -12.841797 -2.948730 1.125000 +v -10.820313 -4.125000 1.125000 +v -15.525269 -0.425995 0.843750 +v -14.575195 -1.935791 0.843750 +v -12.958618 -3.356598 0.843750 +v -10.648438 -4.640625 0.843750 +v -15.738281 -0.524414 0.000000 +v -14.726563 -2.085938 0.000000 +v -13.011719 -3.541992 0.000000 +v -10.570313 -4.875000 0.000000 +v -15.525269 -0.425995 -0.843750 +v -14.575195 -1.935791 -0.843750 +v -12.958618 -3.356598 -0.843750 +v -10.648438 -4.640625 -0.843750 +v -15.056641 -0.209473 -1.125000 +v -14.242188 -1.605469 -1.125000 +v -12.841797 -2.948730 -1.125000 +v -10.820313 -4.125000 -1.125000 +v -14.588013 0.007050 -0.843750 +v -13.909180 -1.275146 -0.843750 +v -12.724976 -2.540863 -0.843750 +v -10.992188 -3.609375 -0.843750 +v 7.429688 -0.750000 0.000000 +v 9.828125 -0.199219 0.000000 +v 10.867188 1.125000 0.000000 +v 11.437500 2.730469 0.000000 +v 12.429688 4.125000 0.000000 +v 7.429688 -1.394531 1.856250 +v 10.011230 -0.677124 1.676074 +v 11.101563 0.846680 1.279688 +v 11.723145 2.629761 0.883301 +v 12.898438 4.125000 0.703125 +v 7.429688 -2.812500 2.475000 +v 10.414063 -1.728516 2.234766 +v 11.617188 0.234375 1.706250 +v 12.351563 2.408203 1.177734 +v 13.929688 4.125000 0.937500 +v 7.429688 -4.230469 1.856250 +v 10.816895 -2.779907 1.676074 +v 12.132813 -0.377930 1.279688 +v 12.979980 2.186646 0.883301 +v 14.960938 4.125000 0.703125 +v 7.429688 -4.875000 0.000000 +v 11.000000 -3.257813 0.000000 +v 12.367188 -0.656250 0.000000 +v 13.265625 2.085938 0.000000 +v 15.429688 4.125000 0.000000 +v 7.429688 -4.230469 -1.856250 +v 10.816895 -2.779907 -1.676074 +v 12.132813 -0.377930 -1.279688 +v 12.979980 2.186646 -0.883301 +v 14.960938 4.125000 -0.703125 +v 7.429688 -2.812500 -2.475000 +v 10.414063 -1.728516 -2.234766 +v 11.617188 0.234375 -1.706250 +v 12.351563 2.408203 -1.177734 +v 13.929688 4.125000 -0.937500 +v 7.429688 -1.394531 -1.856250 +v 10.011230 -0.677124 -1.676074 +v 11.101563 0.846680 -1.279688 +v 11.723145 2.629761 -0.883301 +v 12.898438 4.125000 -0.703125 +v 12.789063 4.335938 0.000000 +v 13.054688 4.406250 0.000000 +v 13.132813 4.335938 0.000000 +v 12.929688 4.125000 0.000000 +v 13.291077 4.346237 0.659180 +v 13.525879 4.422729 0.562500 +v 13.532898 4.350357 0.465820 +v 13.242188 4.125000 0.421875 +v 14.395508 4.368896 0.878906 +v 14.562500 4.458984 0.750000 +v 14.413086 4.382080 0.621094 +v 13.929688 4.125000 0.562500 +v 15.499939 4.391556 0.659180 +v 15.599121 4.495239 0.562500 +v 15.293274 4.413804 0.465820 +v 14.617188 4.125000 0.421875 +v 16.001953 4.401855 0.000000 +v 16.070313 4.511719 0.000000 +v 15.693359 4.428224 0.000000 +v 14.929688 4.125000 0.000000 +v 15.499939 4.391556 -0.659180 +v 15.599121 4.495239 -0.562500 +v 15.293274 4.413804 -0.465820 +v 14.617188 4.125000 -0.421875 +v 14.395508 4.368896 -0.878906 +v 14.562500 4.458984 -0.750000 +v 14.413086 4.382080 -0.621094 +v 13.929688 4.125000 -0.562500 +v 13.291077 4.346237 -0.659180 +v 13.525879 4.422729 -0.562500 +v 13.532898 4.350357 -0.465820 +v 13.242188 4.125000 -0.421875 +v -1.070312 7.875000 0.000000 +v 0.632813 7.628906 0.000000 +v 0.554688 7.031250 0.000000 +v -0.085937 6.292969 0.000000 +v -0.070312 5.625000 0.000000 +v 0.501414 7.628906 0.670256 +v 0.429278 7.031250 0.639395 +v -0.162029 6.292969 0.386960 +v -0.147812 5.625000 0.392500 +v 0.140489 7.628906 1.210801 +v 0.084844 7.031250 1.155156 +v -0.370879 6.292969 0.699434 +v -0.360312 5.625000 0.710000 +v -0.400056 7.628906 1.571726 +v -0.430918 7.031250 1.499590 +v -0.683352 6.292969 0.908284 +v -0.677812 5.625000 0.922500 +v -1.070312 7.628906 1.703125 +v -1.070312 7.031250 1.625000 +v -1.070312 6.292969 0.984375 +v -1.070312 5.625000 1.000000 +v -1.740569 7.628906 1.571726 +v -1.709707 7.031250 1.499590 +v -1.457273 6.292969 0.908284 +v -1.462812 5.625000 0.922500 +v -2.281113 7.628906 1.210801 +v -2.225469 7.031250 1.155156 +v -1.769746 6.292969 0.699434 +v -1.780312 5.625000 0.710000 +v -2.642038 7.628906 0.670256 +v -2.569902 7.031250 0.639395 +v -1.978596 6.292969 0.386960 +v -1.992812 5.625000 0.392500 +v -2.773438 7.628906 0.000000 +v -2.695313 7.031250 0.000000 +v -2.054687 6.292969 0.000000 +v -2.070312 5.625000 0.000000 +v -2.642038 7.628906 -0.670256 +v -2.569902 7.031250 -0.639395 +v -1.978596 6.292969 -0.386960 +v -1.992812 5.625000 -0.392500 +v -2.281113 7.628906 -1.210801 +v -2.225469 7.031250 -1.155156 +v -1.769746 6.292969 -0.699434 +v -1.780312 5.625000 -0.710000 +v -1.740569 7.628906 -1.571726 +v -1.709707 7.031250 -1.499590 +v -1.457273 6.292969 -0.908284 +v -1.462812 5.625000 -0.922500 +v -1.070312 7.628906 -1.703125 +v -1.070312 7.031250 -1.625000 +v -1.070312 6.292969 -0.984375 +v -1.070312 5.625000 -1.000000 +v -0.400056 7.628906 -1.571726 +v -0.430918 7.031250 -1.499590 +v -0.683352 6.292969 -0.908284 +v -0.677812 5.625000 -0.922500 +v 0.140489 7.628906 -1.210801 +v 0.084844 7.031250 -1.155156 +v -0.370879 6.292969 -0.699434 +v -0.360312 5.625000 -0.710000 +v 0.501414 7.628906 -0.670256 +v 0.429278 7.031250 -0.639395 +v -0.162029 6.292969 -0.386960 +v -0.147812 5.625000 -0.392500 +v 1.210938 5.179688 0.000000 +v 3.054688 4.875000 0.000000 +v 4.710938 4.570313 0.000000 +v 5.429688 4.125000 0.000000 +v 1.034141 5.179688 0.895391 +v 2.735000 4.875000 1.619062 +v 4.262891 4.570313 2.269140 +v 4.925938 4.125000 2.551250 +v 0.549375 5.179688 1.619688 +v 1.858438 4.875000 2.928750 +v 3.034375 4.570313 4.104687 +v 3.544688 4.125000 4.615000 +v -0.174922 5.179688 2.104453 +v 0.548750 4.875000 3.805313 +v 1.198828 4.570313 5.333203 +v 1.480938 4.125000 5.996250 +v -1.070312 5.179688 2.281250 +v -1.070312 4.875000 4.125000 +v -1.070312 4.570313 5.781250 +v -1.070312 4.125000 6.500000 +v -1.965703 5.179688 2.104453 +v -2.689375 4.875000 3.805313 +v -3.339453 4.570313 5.333203 +v -3.621562 4.125000 5.996250 +v -2.690000 5.179688 1.619688 +v -3.999062 4.875000 2.928750 +v -5.174999 4.570313 4.104687 +v -5.685312 4.125000 4.615000 +v -3.174765 5.179688 0.895391 +v -4.875625 4.875000 1.619062 +v -6.403516 4.570313 2.269140 +v -7.066563 4.125000 2.551250 +v -3.351562 5.179688 0.000000 +v -5.195313 4.875000 0.000000 +v -6.851563 4.570313 0.000000 +v -7.570313 4.125000 0.000000 +v -3.174765 5.179688 -0.895391 +v -4.875625 4.875000 -1.619062 +v -6.403516 4.570313 -2.269140 +v -7.066563 4.125000 -2.551250 +v -2.690000 5.179688 -1.619688 +v -3.999062 4.875000 -2.928750 +v -5.174999 4.570313 -4.104687 +v -5.685312 4.125000 -4.615000 +v -1.965703 5.179688 -2.104453 +v -2.689375 4.875000 -3.805313 +v -3.339453 4.570313 -5.333203 +v -3.621562 4.125000 -5.996250 +v -1.070312 5.179688 -2.281250 +v -1.070312 4.875000 -4.125000 +v -1.070312 4.570313 -5.781250 +v -1.070312 4.125000 -6.500000 +v -0.174922 5.179688 -2.104453 +v 0.548750 4.875000 -3.805313 +v 1.198828 4.570313 -5.333203 +v 1.480938 4.125000 -5.996250 +v 0.549375 5.179688 -1.619688 +v 1.858438 4.875000 -2.928750 +v 3.034375 4.570313 -4.104687 +v 3.544688 4.125000 -4.615000 +v 1.034141 5.179688 -0.895391 +v 2.735000 4.875000 -1.619062 +v 4.262891 4.570313 -2.269140 +v 4.925938 4.125000 -2.551250 +# 530 vertices + +vt 2.000000 2.000000 0.000000 +vt 2.000000 1.975000 0.000000 +vt 2.000000 1.950000 0.000000 +vt 2.000000 1.925000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 1.750000 2.000000 0.000000 +vt 1.750000 1.975000 0.000000 +vt 1.750000 1.950000 0.000000 +vt 1.750000 1.925000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.500000 2.000000 0.000000 +vt 1.500000 1.975000 0.000000 +vt 1.500000 1.950000 0.000000 +vt 1.500000 1.925000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.250000 2.000000 0.000000 +vt 1.250000 1.975000 0.000000 +vt 1.250000 1.950000 0.000000 +vt 1.250000 1.925000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 0.750000 2.000000 0.000000 +vt 0.750000 1.975000 0.000000 +vt 0.750000 1.950000 0.000000 +vt 0.750000 1.925000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.500000 2.000000 0.000000 +vt 0.500000 1.975000 0.000000 +vt 0.500000 1.950000 0.000000 +vt 0.500000 1.925000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.250000 2.000000 0.000000 +vt 0.250000 1.975000 0.000000 +vt 0.250000 1.950000 0.000000 +vt 0.250000 1.925000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.000000 2.000000 0.000000 +vt 0.000000 1.975000 0.000000 +vt 0.000000 1.950000 0.000000 +vt 0.000000 1.925000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 2.000000 2.000000 0.000000 +vt 2.000000 1.975000 0.000000 +vt 2.000000 1.950000 0.000000 +vt 2.000000 1.925000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 1.750000 2.000000 0.000000 +vt 1.750000 1.975000 0.000000 +vt 1.750000 1.950000 0.000000 +vt 1.750000 1.925000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.500000 2.000000 0.000000 +vt 1.500000 1.975000 0.000000 +vt 1.500000 1.950000 0.000000 +vt 1.500000 1.925000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.250000 2.000000 0.000000 +vt 1.250000 1.975000 0.000000 +vt 1.250000 1.950000 0.000000 +vt 1.250000 1.925000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 2.000000 0.000000 +vt 1.000000 1.975000 0.000000 +vt 1.000000 1.950000 0.000000 +vt 1.000000 1.925000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 0.750000 2.000000 0.000000 +vt 0.750000 1.975000 0.000000 +vt 0.750000 1.950000 0.000000 +vt 0.750000 1.925000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.500000 2.000000 0.000000 +vt 0.500000 1.975000 0.000000 +vt 0.500000 1.950000 0.000000 +vt 0.500000 1.925000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.250000 2.000000 0.000000 +vt 0.250000 1.975000 0.000000 +vt 0.250000 1.950000 0.000000 +vt 0.250000 1.925000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.000000 2.000000 0.000000 +vt 0.000000 1.975000 0.000000 +vt 0.000000 1.950000 0.000000 +vt 0.000000 1.925000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 2.000000 1.675000 0.000000 +vt 2.000000 1.450000 0.000000 +vt 2.000000 1.225000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.750000 1.675000 0.000000 +vt 1.750000 1.450000 0.000000 +vt 1.750000 1.225000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.500000 1.675000 0.000000 +vt 1.500000 1.450000 0.000000 +vt 1.500000 1.225000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.250000 1.675000 0.000000 +vt 1.250000 1.450000 0.000000 +vt 1.250000 1.225000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.750000 1.675000 0.000000 +vt 0.750000 1.450000 0.000000 +vt 0.750000 1.225000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.500000 1.675000 0.000000 +vt 0.500000 1.450000 0.000000 +vt 0.500000 1.225000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.250000 1.675000 0.000000 +vt 0.250000 1.450000 0.000000 +vt 0.250000 1.225000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 0.000000 1.675000 0.000000 +vt 0.000000 1.450000 0.000000 +vt 0.000000 1.225000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 2.000000 1.900000 0.000000 +vt 2.000000 1.675000 0.000000 +vt 2.000000 1.450000 0.000000 +vt 2.000000 1.225000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 1.750000 1.900000 0.000000 +vt 1.750000 1.675000 0.000000 +vt 1.750000 1.450000 0.000000 +vt 1.750000 1.225000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.500000 1.900000 0.000000 +vt 1.500000 1.675000 0.000000 +vt 1.500000 1.450000 0.000000 +vt 1.500000 1.225000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.250000 1.900000 0.000000 +vt 1.250000 1.675000 0.000000 +vt 1.250000 1.450000 0.000000 +vt 1.250000 1.225000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 1.900000 0.000000 +vt 1.000000 1.675000 0.000000 +vt 1.000000 1.450000 0.000000 +vt 1.000000 1.225000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.750000 1.900000 0.000000 +vt 0.750000 1.675000 0.000000 +vt 0.750000 1.450000 0.000000 +vt 0.750000 1.225000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.500000 1.900000 0.000000 +vt 0.500000 1.675000 0.000000 +vt 0.500000 1.450000 0.000000 +vt 0.500000 1.225000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.250000 1.900000 0.000000 +vt 0.250000 1.675000 0.000000 +vt 0.250000 1.450000 0.000000 +vt 0.250000 1.225000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.000000 1.900000 0.000000 +vt 0.000000 1.675000 0.000000 +vt 0.000000 1.450000 0.000000 +vt 0.000000 1.225000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 2.000000 0.850000 0.000000 +vt 2.000000 0.700000 0.000000 +vt 2.000000 0.550000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.750000 0.850000 0.000000 +vt 1.750000 0.700000 0.000000 +vt 1.750000 0.550000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.500000 0.850000 0.000000 +vt 1.500000 0.700000 0.000000 +vt 1.500000 0.550000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.250000 0.850000 0.000000 +vt 1.250000 0.700000 0.000000 +vt 1.250000 0.550000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.850000 0.000000 +vt 0.750000 0.700000 0.000000 +vt 0.750000 0.550000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.850000 0.000000 +vt 0.500000 0.700000 0.000000 +vt 0.500000 0.550000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.850000 0.000000 +vt 0.250000 0.700000 0.000000 +vt 0.250000 0.550000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.850000 0.000000 +vt 0.000000 0.700000 0.000000 +vt 0.000000 0.550000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 2.000000 1.000000 0.000000 +vt 2.000000 0.850000 0.000000 +vt 2.000000 0.700000 0.000000 +vt 2.000000 0.550000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 1.750000 1.000000 0.000000 +vt 1.750000 0.850000 0.000000 +vt 1.750000 0.700000 0.000000 +vt 1.750000 0.550000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.500000 1.000000 0.000000 +vt 1.500000 0.850000 0.000000 +vt 1.500000 0.700000 0.000000 +vt 1.500000 0.550000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.250000 1.000000 0.000000 +vt 1.250000 0.850000 0.000000 +vt 1.250000 0.700000 0.000000 +vt 1.250000 0.550000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.850000 0.000000 +vt 1.000000 0.700000 0.000000 +vt 1.000000 0.550000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.850000 0.000000 +vt 0.750000 0.700000 0.000000 +vt 0.750000 0.550000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.850000 0.000000 +vt 0.500000 0.700000 0.000000 +vt 0.500000 0.550000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.850000 0.000000 +vt 0.250000 0.700000 0.000000 +vt 0.250000 0.550000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.850000 0.000000 +vt 0.000000 0.700000 0.000000 +vt 0.000000 0.550000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 2.000000 0.300000 0.000000 +vt 2.000000 0.200000 0.000000 +vt 2.000000 0.100000 0.000000 +vt 2.000000 0.000000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.750000 0.300000 0.000000 +vt 1.750000 0.200000 0.000000 +vt 1.750000 0.100000 0.000000 +vt 1.750000 0.000000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.500000 0.300000 0.000000 +vt 1.500000 0.200000 0.000000 +vt 1.500000 0.100000 0.000000 +vt 1.500000 0.000000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.250000 0.300000 0.000000 +vt 1.250000 0.200000 0.000000 +vt 1.250000 0.100000 0.000000 +vt 1.250000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.750000 0.300000 0.000000 +vt 0.750000 0.200000 0.000000 +vt 0.750000 0.100000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.500000 0.300000 0.000000 +vt 0.500000 0.200000 0.000000 +vt 0.500000 0.100000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.250000 0.300000 0.000000 +vt 0.250000 0.200000 0.000000 +vt 0.250000 0.100000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 0.000000 0.300000 0.000000 +vt 0.000000 0.200000 0.000000 +vt 0.000000 0.100000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 2.000000 0.400000 0.000000 +vt 2.000000 0.300000 0.000000 +vt 2.000000 0.200000 0.000000 +vt 2.000000 0.100000 0.000000 +vt 2.000000 0.000000 0.000000 +vt 1.750000 0.400000 0.000000 +vt 1.750000 0.300000 0.000000 +vt 1.750000 0.200000 0.000000 +vt 1.750000 0.100000 0.000000 +vt 1.750000 0.000000 0.000000 +vt 1.500000 0.400000 0.000000 +vt 1.500000 0.300000 0.000000 +vt 1.500000 0.200000 0.000000 +vt 1.500000 0.100000 0.000000 +vt 1.500000 0.000000 0.000000 +vt 1.250000 0.400000 0.000000 +vt 1.250000 0.300000 0.000000 +vt 1.250000 0.200000 0.000000 +vt 1.250000 0.100000 0.000000 +vt 1.250000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.400000 0.000000 +vt 1.000000 0.300000 0.000000 +vt 1.000000 0.200000 0.000000 +vt 1.000000 0.100000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.750000 0.400000 0.000000 +vt 0.750000 0.300000 0.000000 +vt 0.750000 0.200000 0.000000 +vt 0.750000 0.100000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.500000 0.400000 0.000000 +vt 0.500000 0.300000 0.000000 +vt 0.500000 0.200000 0.000000 +vt 0.500000 0.100000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.250000 0.400000 0.000000 +vt 0.250000 0.300000 0.000000 +vt 0.250000 0.200000 0.000000 +vt 0.250000 0.100000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.000000 0.400000 0.000000 +vt 0.000000 0.300000 0.000000 +vt 0.000000 0.200000 0.000000 +vt 0.000000 0.100000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.875000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.625000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.875000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.625000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.875000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.625000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.875000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.625000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.875000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.625000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.875000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.625000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.875000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.625000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.875000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.625000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.875000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.625000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.375000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.125000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.375000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.125000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.375000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.125000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.375000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.125000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.375000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.125000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.375000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.125000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.375000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.125000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.375000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.125000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.375000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.125000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.225000 0.000000 +vt 0.500000 0.450000 0.000000 +vt 0.500000 0.675000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.625000 0.225000 0.000000 +vt 0.625000 0.450000 0.000000 +vt 0.625000 0.675000 0.000000 +vt 0.625000 0.900000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.750000 0.225000 0.000000 +vt 0.750000 0.450000 0.000000 +vt 0.750000 0.675000 0.000000 +vt 0.750000 0.900000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.875000 0.225000 0.000000 +vt 0.875000 0.450000 0.000000 +vt 0.875000 0.675000 0.000000 +vt 0.875000 0.900000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 1.000000 0.225000 0.000000 +vt 1.000000 0.450000 0.000000 +vt 1.000000 0.675000 0.000000 +vt 1.000000 0.900000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 0.000000 0.225000 0.000000 +vt 0.000000 0.450000 0.000000 +vt 0.000000 0.675000 0.000000 +vt 0.000000 0.900000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.125000 0.225000 0.000000 +vt 0.125000 0.450000 0.000000 +vt 0.125000 0.675000 0.000000 +vt 0.125000 0.900000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.250000 0.225000 0.000000 +vt 0.250000 0.450000 0.000000 +vt 0.250000 0.675000 0.000000 +vt 0.250000 0.900000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.375000 0.225000 0.000000 +vt 0.375000 0.450000 0.000000 +vt 0.375000 0.675000 0.000000 +vt 0.375000 0.900000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 0.225000 0.000000 +vt 0.500000 0.450000 0.000000 +vt 0.500000 0.675000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.925000 0.000000 +vt 0.500000 0.950000 0.000000 +vt 0.500000 0.975000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.625000 0.900000 0.000000 +vt 0.625000 0.925000 0.000000 +vt 0.625000 0.950000 0.000000 +vt 0.625000 0.975000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.750000 0.900000 0.000000 +vt 0.750000 0.925000 0.000000 +vt 0.750000 0.950000 0.000000 +vt 0.750000 0.975000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.875000 0.900000 0.000000 +vt 0.875000 0.925000 0.000000 +vt 0.875000 0.950000 0.000000 +vt 0.875000 0.975000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 1.000000 0.900000 0.000000 +vt 1.000000 0.925000 0.000000 +vt 1.000000 0.950000 0.000000 +vt 1.000000 0.975000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 0.900000 0.000000 +vt 0.000000 0.925000 0.000000 +vt 0.000000 0.950000 0.000000 +vt 0.000000 0.975000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.125000 0.900000 0.000000 +vt 0.125000 0.925000 0.000000 +vt 0.125000 0.950000 0.000000 +vt 0.125000 0.975000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.250000 0.900000 0.000000 +vt 0.250000 0.925000 0.000000 +vt 0.250000 0.950000 0.000000 +vt 0.250000 0.975000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.375000 0.900000 0.000000 +vt 0.375000 0.925000 0.000000 +vt 0.375000 0.950000 0.000000 +vt 0.375000 0.975000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.500000 0.900000 0.000000 +vt 0.500000 0.925000 0.000000 +vt 0.500000 0.950000 0.000000 +vt 0.500000 0.975000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 1.000000 0.750000 0.000000 +vt 1.000000 0.500000 0.000000 +vt 1.000000 0.250000 0.000000 +vt 1.000000 0.000000 0.000000 +vt 0.875000 1.000000 0.000000 +vt 0.875000 0.750000 0.000000 +vt 0.875000 0.500000 0.000000 +vt 0.875000 0.250000 0.000000 +vt 0.875000 0.000000 0.000000 +vt 0.750000 1.000000 0.000000 +vt 0.750000 0.750000 0.000000 +vt 0.750000 0.500000 0.000000 +vt 0.750000 0.250000 0.000000 +vt 0.750000 0.000000 0.000000 +vt 0.625000 1.000000 0.000000 +vt 0.625000 0.750000 0.000000 +vt 0.625000 0.500000 0.000000 +vt 0.625000 0.250000 0.000000 +vt 0.625000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.500000 1.000000 0.000000 +vt 0.500000 0.750000 0.000000 +vt 0.500000 0.500000 0.000000 +vt 0.500000 0.250000 0.000000 +vt 0.500000 0.000000 0.000000 +vt 0.375000 1.000000 0.000000 +vt 0.375000 0.750000 0.000000 +vt 0.375000 0.500000 0.000000 +vt 0.375000 0.250000 0.000000 +vt 0.375000 0.000000 0.000000 +vt 0.250000 1.000000 0.000000 +vt 0.250000 0.750000 0.000000 +vt 0.250000 0.500000 0.000000 +vt 0.250000 0.250000 0.000000 +vt 0.250000 0.000000 0.000000 +vt 0.125000 1.000000 0.000000 +vt 0.125000 0.750000 0.000000 +vt 0.125000 0.500000 0.000000 +vt 0.125000 0.250000 0.000000 +vt 0.125000 0.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.750000 0.000000 +vt 0.000000 0.500000 0.000000 +vt 0.000000 0.250000 0.000000 +vt 0.000000 0.000000 0.000000 +# 800 texture vertices + +vn -0.966742 -0.255752 0.000000 +vn -0.966824 0.255443 0.000000 +vn -0.092052 0.995754 0.000000 +vn 0.682050 0.731305 0.000000 +vn 0.870301 0.492521 0.000000 +vn -0.893014 -0.256345 -0.369882 +vn -0.893437 0.255996 -0.369102 +vn -0.083877 0.995843 -0.035507 +vn 0.629724 0.731860 0.260439 +vn 0.803725 0.493370 0.332584 +vn -0.683407 -0.256728 -0.683407 +vn -0.683531 0.256068 -0.683531 +vn -0.064925 0.995776 -0.064925 +vn 0.481399 0.732469 0.481399 +vn 0.614804 0.493997 0.614804 +vn -0.369882 -0.256345 -0.893014 +vn -0.369102 0.255996 -0.893437 +vn -0.035507 0.995843 -0.083877 +vn 0.260439 0.731860 0.629724 +vn 0.332584 0.493369 0.803725 +vn -0.002848 -0.257863 -0.966177 +vn -0.001923 0.254736 -0.967009 +vn -0.000266 0.995734 -0.092270 +vn 0.000024 0.731295 0.682061 +vn -0.000000 0.492521 0.870301 +vn 0.379058 -0.359300 -0.852771 +vn 0.377110 0.149085 -0.914091 +vn 0.027502 0.992081 -0.122552 +vn -0.261010 0.726762 0.635367 +vn -0.332485 0.492546 0.804271 +vn 0.663548 -0.410790 -0.625264 +vn 0.712664 0.073722 -0.697621 +vn 0.099726 0.987509 -0.121983 +vn -0.487320 0.723754 0.488569 +vn -0.615242 0.492602 0.615484 +vn 0.880028 -0.332906 -0.338709 +vn 0.917276 0.167113 -0.361493 +vn 0.113584 0.992365 -0.048070 +vn -0.634150 0.727508 0.261889 +vn -0.804126 0.492634 0.332705 +vn 0.966690 -0.255738 0.010454 +vn 0.967442 0.252962 0.008103 +vn 0.093436 0.995624 0.001281 +vn -0.682167 0.731196 -0.000343 +vn -0.870322 0.492483 -0.000054 +vn 0.893014 -0.256345 0.369882 +vn 0.893437 0.255996 0.369102 +vn 0.083877 0.995843 0.035507 +vn -0.629724 0.731860 -0.260439 +vn -0.803725 0.493370 -0.332584 +vn 0.683407 -0.256728 0.683407 +vn 0.683531 0.256068 0.683531 +vn 0.064925 0.995776 0.064925 +vn -0.481399 0.732469 -0.481399 +vn -0.614804 0.493997 -0.614804 +vn 0.369882 -0.256345 0.893014 +vn 0.369102 0.255996 0.893437 +vn 0.035507 0.995843 0.083877 +vn -0.260439 0.731860 -0.629724 +vn -0.332584 0.493369 -0.803725 +vn 0.000000 -0.255752 0.966742 +vn 0.000000 0.255443 0.966824 +vn 0.000000 0.995754 0.092052 +vn 0.000000 0.731305 -0.682050 +vn 0.000000 0.492521 -0.870301 +vn -0.369882 -0.256345 0.893014 +vn -0.369102 0.255996 0.893437 +vn -0.035507 0.995843 0.083877 +vn 0.260439 0.731860 -0.629724 +vn 0.332584 0.493370 -0.803725 +vn -0.683407 -0.256728 0.683407 +vn -0.683531 0.256068 0.683531 +vn -0.064925 0.995776 0.064925 +vn 0.481399 0.732469 -0.481399 +vn 0.614804 0.493997 -0.614804 +vn -0.893014 -0.256345 0.369882 +vn -0.893437 0.255996 0.369102 +vn -0.083877 0.995843 0.035507 +vn 0.629724 0.731860 -0.260439 +vn 0.803725 0.493369 -0.332584 +vn 0.915321 0.402725 -0.000000 +vn 0.941808 0.336151 0.000000 +vn 0.978690 0.205342 0.000000 +vn 0.997804 -0.066240 -0.000000 +vn 0.845438 0.403546 0.349835 +vn 0.869996 0.336859 0.360047 +vn 0.904193 0.205791 0.374280 +vn 0.921879 -0.066370 0.381752 +vn 0.646802 0.404096 0.646802 +vn 0.665655 0.337351 0.665655 +vn 0.691923 0.206120 0.691923 +vn 0.705543 -0.066480 0.705542 +vn 0.349835 0.403546 0.845438 +vn 0.360047 0.336859 0.869996 +vn 0.374280 0.205791 0.904193 +vn 0.381752 -0.066369 0.921879 +vn 0.000000 0.402725 0.915321 +vn -0.000000 0.336151 0.941808 +vn 0.000000 0.205342 0.978690 +vn 0.000000 -0.066240 0.997804 +vn -0.349835 0.403546 0.845438 +vn -0.360047 0.336859 0.869996 +vn -0.374280 0.205791 0.904193 +vn -0.381752 -0.066370 0.921879 +vn -0.646802 0.404096 0.646802 +vn -0.665655 0.337351 0.665655 +vn -0.691923 0.206120 0.691923 +vn -0.705542 -0.066480 0.705543 +vn -0.845438 0.403546 0.349835 +vn -0.869996 0.336859 0.360047 +vn -0.904193 0.205791 0.374280 +vn -0.921879 -0.066369 0.381752 +vn -0.915321 0.402725 0.000000 +vn -0.941808 0.336151 -0.000000 +vn -0.978690 0.205342 0.000000 +vn -0.997804 -0.066240 0.000000 +vn -0.845438 0.403546 -0.349835 +vn -0.869996 0.336859 -0.360047 +vn -0.904193 0.205791 -0.374280 +vn -0.921879 -0.066370 -0.381752 +vn -0.646802 0.404096 -0.646802 +vn -0.665655 0.337351 -0.665655 +vn -0.691923 0.206120 -0.691923 +vn -0.705543 -0.066480 -0.705542 +vn -0.349835 0.403546 -0.845438 +vn -0.360047 0.336859 -0.869996 +vn -0.374280 0.205791 -0.904193 +vn -0.381752 -0.066369 -0.921879 +vn -0.000000 0.402725 -0.915321 +vn 0.000000 0.336151 -0.941808 +vn -0.000000 0.205342 -0.978690 +vn -0.000000 -0.066240 -0.997804 +vn 0.349835 0.403546 -0.845438 +vn 0.360047 0.336859 -0.869996 +vn 0.374280 0.205791 -0.904193 +vn 0.381752 -0.066370 -0.921879 +vn 0.646802 0.404096 -0.646802 +vn 0.665655 0.337351 -0.665655 +vn 0.691923 0.206120 -0.691923 +vn 0.705542 -0.066480 -0.705543 +vn 0.845438 0.403546 -0.349835 +vn 0.869996 0.336859 -0.360047 +vn 0.904193 0.205791 -0.374280 +vn 0.921879 -0.066369 -0.381752 +vn 0.900182 -0.435513 0.000000 +vn 0.729611 -0.683863 0.000000 +vn 0.693951 -0.720022 -0.000000 +vn 0.793950 -0.607983 0.000000 +vn 0.831437 -0.436180 0.344179 +vn 0.673512 -0.684666 0.278594 +vn 0.640399 -0.720924 0.264874 +vn 0.732949 -0.608995 0.303167 +vn 0.636092 -0.436778 0.636092 +vn 0.514965 -0.685290 0.514965 +vn 0.489651 -0.721446 0.489651 +vn 0.560555 -0.609554 0.560555 +vn 0.344179 -0.436180 0.831437 +vn 0.278595 -0.684666 0.673512 +vn 0.264874 -0.720924 0.640399 +vn 0.303167 -0.608995 0.732949 +vn -0.000000 -0.435513 0.900182 +vn -0.000000 -0.683863 0.729611 +vn 0.000000 -0.720022 0.693951 +vn -0.000000 -0.607983 0.793950 +vn -0.344179 -0.436180 0.831437 +vn -0.278594 -0.684666 0.673512 +vn -0.264874 -0.720924 0.640399 +vn -0.303167 -0.608995 0.732949 +vn -0.636092 -0.436778 0.636092 +vn -0.514965 -0.685290 0.514965 +vn -0.489651 -0.721446 0.489651 +vn -0.560555 -0.609554 0.560555 +vn -0.831437 -0.436180 0.344179 +vn -0.673512 -0.684666 0.278595 +vn -0.640399 -0.720924 0.264874 +vn -0.732949 -0.608995 0.303167 +vn -0.900182 -0.435513 -0.000000 +vn -0.729611 -0.683863 -0.000000 +vn -0.693951 -0.720022 0.000000 +vn -0.793950 -0.607983 -0.000000 +vn -0.831437 -0.436180 -0.344179 +vn -0.673512 -0.684666 -0.278594 +vn -0.640399 -0.720924 -0.264874 +vn -0.732949 -0.608995 -0.303167 +vn -0.636092 -0.436778 -0.636092 +vn -0.514965 -0.685290 -0.514965 +vn -0.489651 -0.721446 -0.489651 +vn -0.560555 -0.609554 -0.560555 +vn -0.344179 -0.436180 -0.831437 +vn -0.278595 -0.684666 -0.673512 +vn -0.264874 -0.720924 -0.640399 +vn -0.303167 -0.608995 -0.732949 +vn 0.000000 -0.435513 -0.900182 +vn 0.000000 -0.683863 -0.729611 +vn -0.000000 -0.720022 -0.693951 +vn 0.000000 -0.607983 -0.793950 +vn 0.344179 -0.436180 -0.831437 +vn 0.278594 -0.684666 -0.673512 +vn 0.264874 -0.720924 -0.640399 +vn 0.303167 -0.608995 -0.732949 +vn 0.636092 -0.436778 -0.636092 +vn 0.514965 -0.685290 -0.514965 +vn 0.489651 -0.721446 -0.489651 +vn 0.560555 -0.609554 -0.560555 +vn 0.831437 -0.436180 -0.344179 +vn 0.673512 -0.684666 -0.278595 +vn 0.640399 -0.720924 -0.264874 +vn 0.732949 -0.608995 -0.303167 +vn 0.623860 -0.781536 0.000000 +vn 0.177291 -0.984159 -0.000000 +vn 0.049207 -0.998789 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.576230 -0.781801 0.238217 +vn 0.163628 -0.984208 0.067527 +vn 0.045422 -0.998792 0.018736 +vn 0.440416 -0.782348 0.440416 +vn 0.124903 -0.984276 0.124903 +vn 0.034662 -0.998798 0.034662 +vn 0.238217 -0.781801 0.576230 +vn 0.067527 -0.984208 0.163628 +vn 0.018736 -0.998792 0.045422 +vn -0.000000 -0.781536 0.623860 +vn 0.000000 -0.984159 0.177291 +vn -0.000000 -0.998789 0.049207 +vn -0.238217 -0.781801 0.576230 +vn -0.067527 -0.984208 0.163628 +vn -0.018736 -0.998792 0.045422 +vn -0.440416 -0.782348 0.440416 +vn -0.124903 -0.984276 0.124903 +vn -0.034662 -0.998798 0.034662 +vn -0.576230 -0.781801 0.238217 +vn -0.163628 -0.984208 0.067527 +vn -0.045422 -0.998792 0.018736 +vn -0.623860 -0.781536 -0.000000 +vn -0.177291 -0.984159 0.000000 +vn -0.049207 -0.998789 -0.000000 +vn -0.576230 -0.781801 -0.238217 +vn -0.163628 -0.984208 -0.067527 +vn -0.045422 -0.998792 -0.018736 +vn -0.440416 -0.782348 -0.440416 +vn -0.124903 -0.984276 -0.124903 +vn -0.034662 -0.998798 -0.034662 +vn -0.238217 -0.781801 -0.576230 +vn -0.067527 -0.984208 -0.163628 +vn -0.018736 -0.998792 -0.045422 +vn 0.000000 -0.781536 -0.623860 +vn -0.000000 -0.984159 -0.177291 +vn 0.000000 -0.998789 -0.049207 +vn 0.238217 -0.781801 -0.576230 +vn 0.067527 -0.984208 -0.163628 +vn 0.018736 -0.998792 -0.045422 +vn 0.440416 -0.782348 -0.440416 +vn 0.124903 -0.984276 -0.124903 +vn 0.034662 -0.998798 -0.034662 +vn 0.576230 -0.781801 -0.238217 +vn 0.163628 -0.984208 -0.067527 +vn 0.045422 -0.998792 -0.018736 +vn 0.007786 -0.999970 -0.000216 +vn 0.039138 -0.999233 -0.000989 +vn 0.179512 -0.983746 -0.004369 +vn 0.612299 -0.790557 -0.010460 +vn 0.986152 -0.165708 -0.006670 +vn 0.007039 -0.812495 0.582926 +vn 0.036127 -0.837257 0.545614 +vn 0.161846 -0.810421 0.563048 +vn 0.482365 -0.595148 0.642746 +vn 0.738720 -0.114594 0.664199 +vn -0.001909 0.162121 0.986769 +vn 0.002762 0.017107 0.999850 +vn 0.010533 0.073398 0.997247 +vn -0.066041 0.130070 0.989303 +vn -0.094427 0.016594 0.995393 +vn -0.009203 0.871509 0.490293 +vn -0.048606 0.840609 0.539457 +vn -0.223298 0.802880 0.552739 +vn -0.596365 0.559971 0.575135 +vn -0.803337 0.068236 0.591603 +vn -0.010561 0.999944 0.000103 +vn -0.058798 0.998270 0.000710 +vn -0.280710 0.959787 0.003269 +vn -0.749723 0.661738 0.004268 +vn -0.997351 0.072714 0.002059 +vn -0.008792 0.871493 -0.490330 +vn -0.046494 0.841178 -0.538756 +vn -0.217909 0.806807 -0.549161 +vn -0.597291 0.560026 -0.574121 +vn -0.804000 0.062913 -0.591292 +vn -0.001806 0.161691 -0.986840 +vn 0.002031 0.014555 -0.999892 +vn 0.009215 0.060069 -0.998152 +vn -0.059334 0.113865 -0.991723 +vn -0.086899 0.012290 -0.996141 +vn 0.006418 -0.812379 -0.583095 +vn 0.033783 -0.837512 -0.545373 +vn 0.157113 -0.811947 -0.562190 +vn 0.484406 -0.589366 -0.646528 +vn 0.738870 -0.101320 -0.666187 +vn 0.946512 0.322650 -0.003357 +vn 0.825830 0.563870 -0.007452 +vn 0.650011 0.759893 -0.006937 +vn 0.532429 0.846459 -0.005245 +vn 0.725608 0.259351 0.637361 +vn 0.645945 0.461988 0.607719 +vn 0.531615 0.636660 0.558614 +vn 0.424964 0.681717 0.595540 +vn -0.049562 -0.019755 0.998576 +vn -0.037816 -0.035624 0.998650 +vn -0.037914 -0.036512 0.998614 +vn -0.168854 -0.297945 0.939530 +vn -0.742342 -0.299166 0.599523 +vn -0.619602 -0.529406 0.579502 +vn -0.483708 -0.685760 0.543837 +vn -0.445293 -0.794355 0.413177 +vn -0.926513 -0.376258 0.001996 +vn -0.753920 -0.656952 0.004317 +vn -0.566224 -0.824244 0.003461 +vn -0.481804 -0.876277 0.001850 +vn -0.744675 -0.294425 -0.598977 +vn -0.621949 -0.528114 -0.578165 +vn -0.481171 -0.688340 -0.542828 +vn -0.438055 -0.797035 -0.415744 +vn -0.044337 -0.017056 -0.998871 +vn -0.026176 -0.028166 -0.999260 +vn -0.025294 -0.028332 -0.999278 +vn -0.157482 -0.289392 -0.944167 +vn 0.728244 0.252410 -0.637142 +vn 0.647055 0.459725 -0.608254 +vn 0.522994 0.640657 -0.562170 +vn 0.409978 0.682857 -0.604669 +vn -0.230787 0.972982 -0.006523 +vn -0.548936 0.835863 -0.001511 +vn -0.875671 0.482806 0.009893 +vn -0.877554 0.479097 0.019092 +vn -0.696190 0.717439 0.024497 +vn -0.152877 0.687211 0.710190 +vn -0.316721 0.637750 0.702113 +vn -0.601067 0.471452 0.645330 +vn -0.635889 0.446090 0.629801 +vn -0.435746 0.601008 0.670011 +vn 0.111113 -0.085070 0.990160 +vn 0.223310 0.006540 0.974726 +vn 0.190097 0.154964 0.969458 +vn 0.005271 0.189482 0.981870 +vn -0.011752 0.246688 0.969024 +vn 0.343906 -0.722796 0.599412 +vn 0.572489 -0.567656 0.591627 +vn 0.787436 -0.256459 0.560512 +vn 0.647097 -0.306374 0.698141 +vn 0.427528 -0.499343 0.753576 +vn 0.410926 -0.911668 0.001284 +vn 0.671520 -0.740986 -0.000899 +vn 0.922026 -0.387060 -0.007253 +vn 0.846910 -0.531556 -0.013854 +vn 0.535924 -0.844201 -0.010505 +vn 0.341188 -0.722823 -0.600931 +vn 0.578664 -0.561139 -0.591838 +vn 0.784869 -0.251020 -0.566542 +vn 0.642681 -0.302257 -0.703990 +vn 0.418589 -0.500042 -0.758117 +vn 0.115806 -0.079139 -0.990114 +vn 0.232811 0.012565 -0.972441 +vn 0.206662 0.153601 -0.966280 +vn 0.024500 0.161443 -0.986578 +vn 0.003382 0.211115 -0.977455 +vn -0.134912 0.687491 -0.713551 +vn -0.319540 0.633073 -0.705063 +vn -0.603902 0.461442 -0.649903 +vn -0.631815 0.437169 -0.640072 +vn -0.424306 0.612706 -0.666750 +vn -0.425801 0.904753 0.010805 +vn 0.022046 0.999756 0.001623 +vn 0.999598 0.025875 0.011556 +vn 0.709587 -0.704552 0.009672 +vn -0.259858 0.791937 0.552548 +vn 0.009539 0.999720 -0.021674 +vn 0.410157 0.332912 -0.849082 +vn 0.541523 -0.548619 -0.637001 +vn 0.046311 0.455223 0.889172 +vn -0.010688 0.988794 0.148900 +vn -0.044376 0.682946 -0.729120 +vn 0.122824 0.009233 -0.992385 +vn 0.481839 -0.180440 0.857480 +vn 0.455272 0.736752 0.499925 +vn -0.220542 0.907193 -0.358277 +vn -0.235919 0.657250 -0.715797 +vn 0.728094 -0.685300 -0.015585 +vn 0.888738 0.458112 -0.016679 +vn -0.260098 0.965582 0.000800 +vn -0.371611 0.928378 -0.004418 +vn 0.480165 -0.178362 -0.858853 +vn 0.488102 0.716802 -0.497947 +vn -0.222004 0.905399 0.361892 +vn -0.235405 0.663180 0.710477 +vn 0.058720 0.437702 -0.897200 +vn 0.001326 0.986459 -0.164002 +vn -0.044190 0.681675 0.730319 +vn 0.138801 -0.034188 0.989730 +vn -0.258890 0.797206 -0.545380 +vn 0.012270 0.999739 0.019287 +vn 0.398632 0.354890 0.845663 +vn 0.537564 -0.581398 0.610738 +vn 0.000000 1.000000 0.000000 +vn 0.824540 0.565804 0.000017 +vn 0.917701 -0.397272 0.000034 +vn 0.935269 -0.353939 0.000113 +vn 0.780712 0.624890 0.000075 +vn 0.762640 0.565035 0.314825 +vn 0.847982 -0.397998 0.350034 +vn 0.864141 -0.355261 0.356441 +vn 0.720992 0.625625 0.297933 +vn 0.583357 0.565165 0.583338 +vn 0.648485 -0.398726 0.648448 +vn 0.660872 -0.355894 0.660748 +vn 0.551862 0.625290 0.551780 +vn 0.314824 0.565051 0.762629 +vn 0.350045 -0.397976 0.847988 +vn 0.356474 -0.355199 0.864153 +vn 0.297983 0.625515 0.721067 +vn -0.000017 0.565804 0.824540 +vn -0.000034 -0.397272 0.917701 +vn -0.000113 -0.353939 0.935269 +vn -0.000075 0.624890 0.780712 +vn -0.314825 0.565035 0.762640 +vn -0.350034 -0.397998 0.847982 +vn -0.356441 -0.355261 0.864141 +vn -0.297933 0.625625 0.720992 +vn -0.583338 0.565165 0.583357 +vn -0.648448 -0.398726 0.648485 +vn -0.660748 -0.355894 0.660872 +vn -0.551780 0.625290 0.551862 +vn -0.762629 0.565051 0.314824 +vn -0.847988 -0.397976 0.350045 +vn -0.864153 -0.355199 0.356474 +vn -0.721067 0.625515 0.297983 +vn -0.824540 0.565804 -0.000017 +vn -0.917701 -0.397272 -0.000034 +vn -0.935269 -0.353939 -0.000113 +vn -0.780712 0.624890 -0.000075 +vn -0.762640 0.565035 -0.314825 +vn -0.847982 -0.397998 -0.350034 +vn -0.864141 -0.355261 -0.356441 +vn -0.720992 0.625625 -0.297933 +vn -0.583357 0.565165 -0.583338 +vn -0.648485 -0.398726 -0.648448 +vn -0.660872 -0.355894 -0.660748 +vn -0.551862 0.625290 -0.551780 +vn -0.314824 0.565051 -0.762629 +vn -0.350045 -0.397976 -0.847988 +vn -0.356474 -0.355199 -0.864153 +vn -0.297983 0.625515 -0.721067 +vn 0.000017 0.565804 -0.824540 +vn 0.000034 -0.397272 -0.917701 +vn 0.000113 -0.353939 -0.935269 +vn 0.000075 0.624890 -0.780712 +vn 0.314825 0.565035 -0.762640 +vn 0.350034 -0.397998 -0.847982 +vn 0.356441 -0.355261 -0.864141 +vn 0.297933 0.625625 -0.720992 +vn 0.583338 0.565165 -0.583357 +vn 0.648448 -0.398726 -0.648485 +vn 0.660748 -0.355894 -0.660872 +vn 0.551780 0.625290 -0.551862 +vn 0.762629 0.565051 -0.314824 +vn 0.847988 -0.397976 -0.350045 +vn 0.864153 -0.355199 -0.356474 +vn 0.721067 0.625515 -0.297983 +vn 0.236583 0.971611 -0.000000 +vn 0.173084 0.984907 -0.000000 +vn 0.379703 0.925108 -0.000000 +vn 0.526673 0.850068 0.000000 +vn 0.217978 0.971775 0.090216 +vn 0.159589 0.984977 0.065961 +vn 0.350498 0.925311 0.144740 +vn 0.485590 0.850653 0.201474 +vn 0.166631 0.971838 0.166631 +vn 0.121908 0.985026 0.121908 +vn 0.267668 0.925585 0.267668 +vn 0.371315 0.851029 0.371315 +vn 0.090216 0.971775 0.217978 +vn 0.065961 0.984977 0.159589 +vn 0.144740 0.925311 0.350498 +vn 0.201475 0.850653 0.485590 +vn 0.000000 0.971611 0.236583 +vn 0.000000 0.984907 0.173084 +vn 0.000000 0.925108 0.379703 +vn -0.000000 0.850068 0.526673 +vn -0.090216 0.971775 0.217978 +vn -0.065961 0.984977 0.159589 +vn -0.144740 0.925311 0.350498 +vn -0.201474 0.850653 0.485590 +vn -0.166631 0.971838 0.166631 +vn -0.121908 0.985026 0.121908 +vn -0.267668 0.925585 0.267668 +vn -0.371315 0.851029 0.371315 +vn -0.217978 0.971775 0.090216 +vn -0.159589 0.984977 0.065961 +vn -0.350498 0.925311 0.144740 +vn -0.485590 0.850653 0.201475 +vn -0.236583 0.971611 0.000000 +vn -0.173084 0.984907 0.000000 +vn -0.379703 0.925108 0.000000 +vn -0.526673 0.850068 -0.000000 +vn -0.217978 0.971775 -0.090216 +vn -0.159589 0.984977 -0.065961 +vn -0.350498 0.925311 -0.144740 +vn -0.485590 0.850653 -0.201474 +vn -0.166631 0.971838 -0.166631 +vn -0.121908 0.985026 -0.121908 +vn -0.267668 0.925585 -0.267668 +vn -0.371315 0.851029 -0.371315 +vn -0.090216 0.971775 -0.217978 +vn -0.065961 0.984977 -0.159589 +vn -0.144740 0.925311 -0.350498 +vn -0.201475 0.850653 -0.485590 +vn -0.000000 0.971611 -0.236583 +vn -0.000000 0.984907 -0.173084 +vn -0.000000 0.925108 -0.379703 +vn 0.000000 0.850068 -0.526673 +vn 0.090216 0.971775 -0.217978 +vn 0.065961 0.984977 -0.159589 +vn 0.144740 0.925311 -0.350498 +vn 0.201474 0.850653 -0.485590 +vn 0.166631 0.971838 -0.166631 +vn 0.121908 0.985026 -0.121908 +vn 0.267668 0.925585 -0.267668 +vn 0.371315 0.851029 -0.371315 +vn 0.217978 0.971775 -0.090216 +vn 0.159589 0.984977 -0.065961 +vn 0.350498 0.925311 -0.144740 +vn 0.485590 0.850653 -0.201475 +# 530 vertex normals + +g Teapot01 +f 1/1/1 6/6/6 7/7/7 +f 7/7/7 2/2/2 1/1/1 +f 2/2/2 7/7/7 8/8/8 +f 8/8/8 3/3/3 2/2/2 +f 3/3/3 8/8/8 9/9/9 +f 9/9/9 4/4/4 3/3/3 +f 4/4/4 9/9/9 10/10/10 +f 10/10/10 5/5/5 4/4/4 +f 6/6/6 11/11/11 12/12/12 +f 12/12/12 7/7/7 6/6/6 +f 7/7/7 12/12/12 13/13/13 +f 13/13/13 8/8/8 7/7/7 +f 8/8/8 13/13/13 14/14/14 +f 14/14/14 9/9/9 8/8/8 +f 9/9/9 14/14/14 15/15/15 +f 15/15/15 10/10/10 9/9/9 +f 11/11/11 16/16/16 17/17/17 +f 17/17/17 12/12/12 11/11/11 +f 12/12/12 17/17/17 18/18/18 +f 18/18/18 13/13/13 12/12/12 +f 13/13/13 18/18/18 19/19/19 +f 19/19/19 14/14/14 13/13/13 +f 14/14/14 19/19/19 20/20/20 +f 20/20/20 15/15/15 14/14/14 +f 16/16/16 21/21/21 22/22/22 +f 22/22/22 17/17/17 16/16/16 +f 17/17/17 22/22/22 23/23/23 +f 23/23/23 18/18/18 17/17/17 +f 18/18/18 23/23/23 24/24/24 +f 24/24/24 19/19/19 18/18/18 +f 19/19/19 24/24/24 25/25/25 +f 25/25/25 20/20/20 19/19/19 +f 21/26/21 26/31/26 27/32/27 +f 27/32/27 22/27/22 21/26/21 +f 22/27/22 27/32/27 28/33/28 +f 28/33/28 23/28/23 22/27/22 +f 23/28/23 28/33/28 29/34/29 +f 29/34/29 24/29/24 23/28/23 +f 24/29/24 29/34/29 30/35/30 +f 30/35/30 25/30/25 24/29/24 +f 26/31/26 31/36/31 32/37/32 +f 32/37/32 27/32/27 26/31/26 +f 27/32/27 32/37/32 33/38/33 +f 33/38/33 28/33/28 27/32/27 +f 28/33/28 33/38/33 34/39/34 +f 34/39/34 29/34/29 28/33/28 +f 29/34/29 34/39/34 35/40/35 +f 35/40/35 30/35/30 29/34/29 +f 31/36/31 36/41/36 37/42/37 +f 37/42/37 32/37/32 31/36/31 +f 32/37/32 37/42/37 38/43/38 +f 38/43/38 33/38/33 32/37/32 +f 33/38/33 38/43/38 39/44/39 +f 39/44/39 34/39/34 33/38/33 +f 34/39/34 39/44/39 40/45/40 +f 40/45/40 35/40/35 34/39/34 +f 36/41/36 41/46/41 42/47/42 +f 42/47/42 37/42/37 36/41/36 +f 37/42/37 42/47/42 43/48/43 +f 43/48/43 38/43/38 37/42/37 +f 38/43/38 43/48/43 44/49/44 +f 44/49/44 39/44/39 38/43/38 +f 39/44/39 44/49/44 45/50/45 +f 45/50/45 40/45/40 39/44/39 +f 41/51/41 46/56/46 47/57/47 +f 47/57/47 42/52/42 41/51/41 +f 42/52/42 47/57/47 48/58/48 +f 48/58/48 43/53/43 42/52/42 +f 43/53/43 48/58/48 49/59/49 +f 49/59/49 44/54/44 43/53/43 +f 44/54/44 49/59/49 50/60/50 +f 50/60/50 45/55/45 44/54/44 +f 46/56/46 51/61/51 52/62/52 +f 52/62/52 47/57/47 46/56/46 +f 47/57/47 52/62/52 53/63/53 +f 53/63/53 48/58/48 47/57/47 +f 48/58/48 53/63/53 54/64/54 +f 54/64/54 49/59/49 48/58/48 +f 49/59/49 54/64/54 55/65/55 +f 55/65/55 50/60/50 49/59/49 +f 51/61/51 56/66/56 57/67/57 +f 57/67/57 52/62/52 51/61/51 +f 52/62/52 57/67/57 58/68/58 +f 58/68/58 53/63/53 52/62/52 +f 53/63/53 58/68/58 59/69/59 +f 59/69/59 54/64/54 53/63/53 +f 54/64/54 59/69/59 60/70/60 +f 60/70/60 55/65/55 54/64/54 +f 56/66/56 61/71/61 62/72/62 +f 62/72/62 57/67/57 56/66/56 +f 57/67/57 62/72/62 63/73/63 +f 63/73/63 58/68/58 57/67/57 +f 58/68/58 63/73/63 64/74/64 +f 64/74/64 59/69/59 58/68/58 +f 59/69/59 64/74/64 65/75/65 +f 65/75/65 60/70/60 59/69/59 +f 61/76/61 66/81/66 67/82/67 +f 67/82/67 62/77/62 61/76/61 +f 62/77/62 67/82/67 68/83/68 +f 68/83/68 63/78/63 62/77/62 +f 63/78/63 68/83/68 69/84/69 +f 69/84/69 64/79/64 63/78/63 +f 64/79/64 69/84/69 70/85/70 +f 70/85/70 65/80/65 64/79/64 +f 66/81/66 71/86/71 72/87/72 +f 72/87/72 67/82/67 66/81/66 +f 67/82/67 72/87/72 73/88/73 +f 73/88/73 68/83/68 67/82/67 +f 68/83/68 73/88/73 74/89/74 +f 74/89/74 69/84/69 68/83/68 +f 69/84/69 74/89/74 75/90/75 +f 75/90/75 70/85/70 69/84/69 +f 71/86/71 76/91/76 77/92/77 +f 77/92/77 72/87/72 71/86/71 +f 72/87/72 77/92/77 78/93/78 +f 78/93/78 73/88/73 72/87/72 +f 73/88/73 78/93/78 79/94/79 +f 79/94/79 74/89/74 73/88/73 +f 74/89/74 79/94/79 80/95/80 +f 80/95/80 75/90/75 74/89/74 +f 76/91/76 1/96/1 2/97/2 +f 2/97/2 77/92/77 76/91/76 +f 77/92/77 2/97/2 3/98/3 +f 3/98/3 78/93/78 77/92/77 +f 78/93/78 3/98/3 4/99/4 +f 4/99/4 79/94/79 78/93/78 +f 79/94/79 4/99/4 5/100/5 +f 5/100/5 80/95/80 79/94/79 +f 5/101/5 10/106/10 85/107/85 +f 85/107/85 81/102/81 5/101/5 +f 81/102/81 85/107/85 86/108/86 +f 86/108/86 82/103/82 81/102/81 +f 82/103/82 86/108/86 87/109/87 +f 87/109/87 83/104/83 82/103/82 +f 83/104/83 87/109/87 88/110/88 +f 88/110/88 84/105/84 83/104/83 +f 10/106/10 15/111/15 89/112/89 +f 89/112/89 85/107/85 10/106/10 +f 85/107/85 89/112/89 90/113/90 +f 90/113/90 86/108/86 85/107/85 +f 86/108/86 90/113/90 91/114/91 +f 91/114/91 87/109/87 86/108/86 +f 87/109/87 91/114/91 92/115/92 +f 92/115/92 88/110/88 87/109/87 +f 15/111/15 20/116/20 93/117/93 +f 93/117/93 89/112/89 15/111/15 +f 89/112/89 93/117/93 94/118/94 +f 94/118/94 90/113/90 89/112/89 +f 90/113/90 94/118/94 95/119/95 +f 95/119/95 91/114/91 90/113/90 +f 91/114/91 95/119/95 96/120/96 +f 96/120/96 92/115/92 91/114/91 +f 20/116/20 25/121/25 97/122/97 +f 97/122/97 93/117/93 20/116/20 +f 93/117/93 97/122/97 98/123/98 +f 98/123/98 94/118/94 93/117/93 +f 94/118/94 98/123/98 99/124/99 +f 99/124/99 95/119/95 94/118/94 +f 95/119/95 99/124/99 100/125/100 +f 100/125/100 96/120/96 95/119/95 +f 25/126/25 30/131/30 101/132/101 +f 101/132/101 97/127/97 25/126/25 +f 97/127/97 101/132/101 102/133/102 +f 102/133/102 98/128/98 97/127/97 +f 98/128/98 102/133/102 103/134/103 +f 103/134/103 99/129/99 98/128/98 +f 99/129/99 103/134/103 104/135/104 +f 104/135/104 100/130/100 99/129/99 +f 30/131/30 35/136/35 105/137/105 +f 105/137/105 101/132/101 30/131/30 +f 101/132/101 105/137/105 106/138/106 +f 106/138/106 102/133/102 101/132/101 +f 102/133/102 106/138/106 107/139/107 +f 107/139/107 103/134/103 102/133/102 +f 103/134/103 107/139/107 108/140/108 +f 108/140/108 104/135/104 103/134/103 +f 35/136/35 40/141/40 109/142/109 +f 109/142/109 105/137/105 35/136/35 +f 105/137/105 109/142/109 110/143/110 +f 110/143/110 106/138/106 105/137/105 +f 106/138/106 110/143/110 111/144/111 +f 111/144/111 107/139/107 106/138/106 +f 107/139/107 111/144/111 112/145/112 +f 112/145/112 108/140/108 107/139/107 +f 40/141/40 45/146/45 113/147/113 +f 113/147/113 109/142/109 40/141/40 +f 109/142/109 113/147/113 114/148/114 +f 114/148/114 110/143/110 109/142/109 +f 110/143/110 114/148/114 115/149/115 +f 115/149/115 111/144/111 110/143/110 +f 111/144/111 115/149/115 116/150/116 +f 116/150/116 112/145/112 111/144/111 +f 45/151/45 50/156/50 117/157/117 +f 117/157/117 113/152/113 45/151/45 +f 113/152/113 117/157/117 118/158/118 +f 118/158/118 114/153/114 113/152/113 +f 114/153/114 118/158/118 119/159/119 +f 119/159/119 115/154/115 114/153/114 +f 115/154/115 119/159/119 120/160/120 +f 120/160/120 116/155/116 115/154/115 +f 50/156/50 55/161/55 121/162/121 +f 121/162/121 117/157/117 50/156/50 +f 117/157/117 121/162/121 122/163/122 +f 122/163/122 118/158/118 117/157/117 +f 118/158/118 122/163/122 123/164/123 +f 123/164/123 119/159/119 118/158/118 +f 119/159/119 123/164/123 124/165/124 +f 124/165/124 120/160/120 119/159/119 +f 55/161/55 60/166/60 125/167/125 +f 125/167/125 121/162/121 55/161/55 +f 121/162/121 125/167/125 126/168/126 +f 126/168/126 122/163/122 121/162/121 +f 122/163/122 126/168/126 127/169/127 +f 127/169/127 123/164/123 122/163/122 +f 123/164/123 127/169/127 128/170/128 +f 128/170/128 124/165/124 123/164/123 +f 60/166/60 65/171/65 129/172/129 +f 129/172/129 125/167/125 60/166/60 +f 125/167/125 129/172/129 130/173/130 +f 130/173/130 126/168/126 125/167/125 +f 126/168/126 130/173/130 131/174/131 +f 131/174/131 127/169/127 126/168/126 +f 127/169/127 131/174/131 132/175/132 +f 132/175/132 128/170/128 127/169/127 +f 65/176/65 70/181/70 133/182/133 +f 133/182/133 129/177/129 65/176/65 +f 129/177/129 133/182/133 134/183/134 +f 134/183/134 130/178/130 129/177/129 +f 130/178/130 134/183/134 135/184/135 +f 135/184/135 131/179/131 130/178/130 +f 131/179/131 135/184/135 136/185/136 +f 136/185/136 132/180/132 131/179/131 +f 70/181/70 75/186/75 137/187/137 +f 137/187/137 133/182/133 70/181/70 +f 133/182/133 137/187/137 138/188/138 +f 138/188/138 134/183/134 133/182/133 +f 134/183/134 138/188/138 139/189/139 +f 139/189/139 135/184/135 134/183/134 +f 135/184/135 139/189/139 140/190/140 +f 140/190/140 136/185/136 135/184/135 +f 75/186/75 80/191/80 141/192/141 +f 141/192/141 137/187/137 75/186/75 +f 137/187/137 141/192/141 142/193/142 +f 142/193/142 138/188/138 137/187/137 +f 138/188/138 142/193/142 143/194/143 +f 143/194/143 139/189/139 138/188/138 +f 139/189/139 143/194/143 144/195/144 +f 144/195/144 140/190/140 139/189/139 +f 80/191/80 5/196/5 81/197/81 +f 81/197/81 141/192/141 80/191/80 +f 141/192/141 81/197/81 82/198/82 +f 82/198/82 142/193/142 141/192/141 +f 142/193/142 82/198/82 83/199/83 +f 83/199/83 143/194/143 142/193/142 +f 143/194/143 83/199/83 84/200/84 +f 84/200/84 144/195/144 143/194/143 +f 84/201/84 88/206/88 149/207/149 +f 149/207/149 145/202/145 84/201/84 +f 145/202/145 149/207/149 150/208/150 +f 150/208/150 146/203/146 145/202/145 +f 146/203/146 150/208/150 151/209/151 +f 151/209/151 147/204/147 146/203/146 +f 147/204/147 151/209/151 152/210/152 +f 152/210/152 148/205/148 147/204/147 +f 88/206/88 92/211/92 153/212/153 +f 153/212/153 149/207/149 88/206/88 +f 149/207/149 153/212/153 154/213/154 +f 154/213/154 150/208/150 149/207/149 +f 150/208/150 154/213/154 155/214/155 +f 155/214/155 151/209/151 150/208/150 +f 151/209/151 155/214/155 156/215/156 +f 156/215/156 152/210/152 151/209/151 +f 92/211/92 96/216/96 157/217/157 +f 157/217/157 153/212/153 92/211/92 +f 153/212/153 157/217/157 158/218/158 +f 158/218/158 154/213/154 153/212/153 +f 154/213/154 158/218/158 159/219/159 +f 159/219/159 155/214/155 154/213/154 +f 155/214/155 159/219/159 160/220/160 +f 160/220/160 156/215/156 155/214/155 +f 96/216/96 100/221/100 161/222/161 +f 161/222/161 157/217/157 96/216/96 +f 157/217/157 161/222/161 162/223/162 +f 162/223/162 158/218/158 157/217/157 +f 158/218/158 162/223/162 163/224/163 +f 163/224/163 159/219/159 158/218/158 +f 159/219/159 163/224/163 164/225/164 +f 164/225/164 160/220/160 159/219/159 +f 100/226/100 104/231/104 165/232/165 +f 165/232/165 161/227/161 100/226/100 +f 161/227/161 165/232/165 166/233/166 +f 166/233/166 162/228/162 161/227/161 +f 162/228/162 166/233/166 167/234/167 +f 167/234/167 163/229/163 162/228/162 +f 163/229/163 167/234/167 168/235/168 +f 168/235/168 164/230/164 163/229/163 +f 104/231/104 108/236/108 169/237/169 +f 169/237/169 165/232/165 104/231/104 +f 165/232/165 169/237/169 170/238/170 +f 170/238/170 166/233/166 165/232/165 +f 166/233/166 170/238/170 171/239/171 +f 171/239/171 167/234/167 166/233/166 +f 167/234/167 171/239/171 172/240/172 +f 172/240/172 168/235/168 167/234/167 +f 108/236/108 112/241/112 173/242/173 +f 173/242/173 169/237/169 108/236/108 +f 169/237/169 173/242/173 174/243/174 +f 174/243/174 170/238/170 169/237/169 +f 170/238/170 174/243/174 175/244/175 +f 175/244/175 171/239/171 170/238/170 +f 171/239/171 175/244/175 176/245/176 +f 176/245/176 172/240/172 171/239/171 +f 112/241/112 116/246/116 177/247/177 +f 177/247/177 173/242/173 112/241/112 +f 173/242/173 177/247/177 178/248/178 +f 178/248/178 174/243/174 173/242/173 +f 174/243/174 178/248/178 179/249/179 +f 179/249/179 175/244/175 174/243/174 +f 175/244/175 179/249/179 180/250/180 +f 180/250/180 176/245/176 175/244/175 +f 116/251/116 120/256/120 181/257/181 +f 181/257/181 177/252/177 116/251/116 +f 177/252/177 181/257/181 182/258/182 +f 182/258/182 178/253/178 177/252/177 +f 178/253/178 182/258/182 183/259/183 +f 183/259/183 179/254/179 178/253/178 +f 179/254/179 183/259/183 184/260/184 +f 184/260/184 180/255/180 179/254/179 +f 120/256/120 124/261/124 185/262/185 +f 185/262/185 181/257/181 120/256/120 +f 181/257/181 185/262/185 186/263/186 +f 186/263/186 182/258/182 181/257/181 +f 182/258/182 186/263/186 187/264/187 +f 187/264/187 183/259/183 182/258/182 +f 183/259/183 187/264/187 188/265/188 +f 188/265/188 184/260/184 183/259/183 +f 124/261/124 128/266/128 189/267/189 +f 189/267/189 185/262/185 124/261/124 +f 185/262/185 189/267/189 190/268/190 +f 190/268/190 186/263/186 185/262/185 +f 186/263/186 190/268/190 191/269/191 +f 191/269/191 187/264/187 186/263/186 +f 187/264/187 191/269/191 192/270/192 +f 192/270/192 188/265/188 187/264/187 +f 128/266/128 132/271/132 193/272/193 +f 193/272/193 189/267/189 128/266/128 +f 189/267/189 193/272/193 194/273/194 +f 194/273/194 190/268/190 189/267/189 +f 190/268/190 194/273/194 195/274/195 +f 195/274/195 191/269/191 190/268/190 +f 191/269/191 195/274/195 196/275/196 +f 196/275/196 192/270/192 191/269/191 +f 132/276/132 136/281/136 197/282/197 +f 197/282/197 193/277/193 132/276/132 +f 193/277/193 197/282/197 198/283/198 +f 198/283/198 194/278/194 193/277/193 +f 194/278/194 198/283/198 199/284/199 +f 199/284/199 195/279/195 194/278/194 +f 195/279/195 199/284/199 200/285/200 +f 200/285/200 196/280/196 195/279/195 +f 136/281/136 140/286/140 201/287/201 +f 201/287/201 197/282/197 136/281/136 +f 197/282/197 201/287/201 202/288/202 +f 202/288/202 198/283/198 197/282/197 +f 198/283/198 202/288/202 203/289/203 +f 203/289/203 199/284/199 198/283/198 +f 199/284/199 203/289/203 204/290/204 +f 204/290/204 200/285/200 199/284/199 +f 140/286/140 144/291/144 205/292/205 +f 205/292/205 201/287/201 140/286/140 +f 201/287/201 205/292/205 206/293/206 +f 206/293/206 202/288/202 201/287/201 +f 202/288/202 206/293/206 207/294/207 +f 207/294/207 203/289/203 202/288/202 +f 203/289/203 207/294/207 208/295/208 +f 208/295/208 204/290/204 203/289/203 +f 144/291/144 84/296/84 145/297/145 +f 145/297/145 205/292/205 144/291/144 +f 205/292/205 145/297/145 146/298/146 +f 146/298/146 206/293/206 205/292/205 +f 206/293/206 146/298/146 147/299/147 +f 147/299/147 207/294/207 206/293/206 +f 207/294/207 147/299/147 148/300/148 +f 148/300/148 208/295/208 207/294/207 +f 148/301/148 152/306/152 213/307/213 +f 213/307/213 209/302/209 148/301/148 +f 209/302/209 213/307/213 214/308/214 +f 214/308/214 210/303/210 209/302/209 +f 210/303/210 214/308/214 215/309/215 +f 215/309/215 211/304/211 210/303/210 +f 211/304/211 215/309/215 212/310/212 +f 152/306/152 156/311/156 216/312/216 +f 216/312/216 213/307/213 152/306/152 +f 213/307/213 216/312/216 217/313/217 +f 217/313/217 214/308/214 213/307/213 +f 214/308/214 217/313/217 218/314/218 +f 218/314/218 215/309/215 214/308/214 +f 215/309/215 218/314/218 212/315/212 +f 156/311/156 160/316/160 219/317/219 +f 219/317/219 216/312/216 156/311/156 +f 216/312/216 219/317/219 220/318/220 +f 220/318/220 217/313/217 216/312/216 +f 217/313/217 220/318/220 221/319/221 +f 221/319/221 218/314/218 217/313/217 +f 218/314/218 221/319/221 212/320/212 +f 160/316/160 164/321/164 222/322/222 +f 222/322/222 219/317/219 160/316/160 +f 219/317/219 222/322/222 223/323/223 +f 223/323/223 220/318/220 219/317/219 +f 220/318/220 223/323/223 224/324/224 +f 224/324/224 221/319/221 220/318/220 +f 221/319/221 224/324/224 212/325/212 +f 164/326/164 168/331/168 225/332/225 +f 225/332/225 222/327/222 164/326/164 +f 222/327/222 225/332/225 226/333/226 +f 226/333/226 223/328/223 222/327/222 +f 223/328/223 226/333/226 227/334/227 +f 227/334/227 224/329/224 223/328/223 +f 224/329/224 227/334/227 212/335/212 +f 168/331/168 172/336/172 228/337/228 +f 228/337/228 225/332/225 168/331/168 +f 225/332/225 228/337/228 229/338/229 +f 229/338/229 226/333/226 225/332/225 +f 226/333/226 229/338/229 230/339/230 +f 230/339/230 227/334/227 226/333/226 +f 227/334/227 230/339/230 212/340/212 +f 172/336/172 176/341/176 231/342/231 +f 231/342/231 228/337/228 172/336/172 +f 228/337/228 231/342/231 232/343/232 +f 232/343/232 229/338/229 228/337/228 +f 229/338/229 232/343/232 233/344/233 +f 233/344/233 230/339/230 229/338/229 +f 230/339/230 233/344/233 212/345/212 +f 176/341/176 180/346/180 234/347/234 +f 234/347/234 231/342/231 176/341/176 +f 231/342/231 234/347/234 235/348/235 +f 235/348/235 232/343/232 231/342/231 +f 232/343/232 235/348/235 236/349/236 +f 236/349/236 233/344/233 232/343/232 +f 233/344/233 236/349/236 212/350/212 +f 180/351/180 184/356/184 237/357/237 +f 237/357/237 234/352/234 180/351/180 +f 234/352/234 237/357/237 238/358/238 +f 238/358/238 235/353/235 234/352/234 +f 235/353/235 238/358/238 239/359/239 +f 239/359/239 236/354/236 235/353/235 +f 236/354/236 239/359/239 212/360/212 +f 184/356/184 188/361/188 240/362/240 +f 240/362/240 237/357/237 184/356/184 +f 237/357/237 240/362/240 241/363/241 +f 241/363/241 238/358/238 237/357/237 +f 238/358/238 241/363/241 242/364/242 +f 242/364/242 239/359/239 238/358/238 +f 239/359/239 242/364/242 212/365/212 +f 188/361/188 192/366/192 243/367/243 +f 243/367/243 240/362/240 188/361/188 +f 240/362/240 243/367/243 244/368/244 +f 244/368/244 241/363/241 240/362/240 +f 241/363/241 244/368/244 245/369/245 +f 245/369/245 242/364/242 241/363/241 +f 242/364/242 245/369/245 212/370/212 +f 192/366/192 196/371/196 246/372/246 +f 246/372/246 243/367/243 192/366/192 +f 243/367/243 246/372/246 247/373/247 +f 247/373/247 244/368/244 243/367/243 +f 244/368/244 247/373/247 248/374/248 +f 248/374/248 245/369/245 244/368/244 +f 245/369/245 248/374/248 212/375/212 +f 196/376/196 200/381/200 249/382/249 +f 249/382/249 246/377/246 196/376/196 +f 246/377/246 249/382/249 250/383/250 +f 250/383/250 247/378/247 246/377/246 +f 247/378/247 250/383/250 251/384/251 +f 251/384/251 248/379/248 247/378/247 +f 248/379/248 251/384/251 212/385/212 +f 200/381/200 204/386/204 252/387/252 +f 252/387/252 249/382/249 200/381/200 +f 249/382/249 252/387/252 253/388/253 +f 253/388/253 250/383/250 249/382/249 +f 250/383/250 253/388/253 254/389/254 +f 254/389/254 251/384/251 250/383/250 +f 251/384/251 254/389/254 212/390/212 +f 204/386/204 208/391/208 255/392/255 +f 255/392/255 252/387/252 204/386/204 +f 252/387/252 255/392/255 256/393/256 +f 256/393/256 253/388/253 252/387/252 +f 253/388/253 256/393/256 257/394/257 +f 257/394/257 254/389/254 253/388/253 +f 254/389/254 257/394/257 212/395/212 +f 208/391/208 148/396/148 209/397/209 +f 209/397/209 255/392/255 208/391/208 +f 255/392/255 209/397/209 210/398/210 +f 210/398/210 256/393/256 255/392/255 +f 256/393/256 210/398/210 211/399/211 +f 211/399/211 257/394/257 256/393/256 +f 257/394/257 211/399/211 212/400/212 +f 258/401/258 263/406/263 264/407/264 +f 264/407/264 259/402/259 258/401/258 +f 259/402/259 264/407/264 265/408/265 +f 265/408/265 260/403/260 259/402/259 +f 260/403/260 265/408/265 266/409/266 +f 266/409/266 261/404/261 260/403/260 +f 261/404/261 266/409/266 267/410/267 +f 267/410/267 262/405/262 261/404/261 +f 263/406/263 268/411/268 269/412/269 +f 269/412/269 264/407/264 263/406/263 +f 264/407/264 269/412/269 270/413/270 +f 270/413/270 265/408/265 264/407/264 +f 265/408/265 270/413/270 271/414/271 +f 271/414/271 266/409/266 265/408/265 +f 266/409/266 271/414/271 272/415/272 +f 272/415/272 267/410/267 266/409/266 +f 268/411/268 273/416/273 274/417/274 +f 274/417/274 269/412/269 268/411/268 +f 269/412/269 274/417/274 275/418/275 +f 275/418/275 270/413/270 269/412/269 +f 270/413/270 275/418/275 276/419/276 +f 276/419/276 271/414/271 270/413/270 +f 271/414/271 276/419/276 277/420/277 +f 277/420/277 272/415/272 271/414/271 +f 273/416/273 278/421/278 279/422/279 +f 279/422/279 274/417/274 273/416/273 +f 274/417/274 279/422/279 280/423/280 +f 280/423/280 275/418/275 274/417/274 +f 275/418/275 280/423/280 281/424/281 +f 281/424/281 276/419/276 275/418/275 +f 276/419/276 281/424/281 282/425/282 +f 282/425/282 277/420/277 276/419/276 +f 278/426/278 283/431/283 284/432/284 +f 284/432/284 279/427/279 278/426/278 +f 279/427/279 284/432/284 285/433/285 +f 285/433/285 280/428/280 279/427/279 +f 280/428/280 285/433/285 286/434/286 +f 286/434/286 281/429/281 280/428/280 +f 281/429/281 286/434/286 287/435/287 +f 287/435/287 282/430/282 281/429/281 +f 283/431/283 288/436/288 289/437/289 +f 289/437/289 284/432/284 283/431/283 +f 284/432/284 289/437/289 290/438/290 +f 290/438/290 285/433/285 284/432/284 +f 285/433/285 290/438/290 291/439/291 +f 291/439/291 286/434/286 285/433/285 +f 286/434/286 291/439/291 292/440/292 +f 292/440/292 287/435/287 286/434/286 +f 288/436/288 293/441/293 294/442/294 +f 294/442/294 289/437/289 288/436/288 +f 289/437/289 294/442/294 295/443/295 +f 295/443/295 290/438/290 289/437/289 +f 290/438/290 295/443/295 296/444/296 +f 296/444/296 291/439/291 290/438/290 +f 291/439/291 296/444/296 297/445/297 +f 297/445/297 292/440/292 291/439/291 +f 293/441/293 258/446/258 259/447/259 +f 259/447/259 294/442/294 293/441/293 +f 294/442/294 259/447/259 260/448/260 +f 260/448/260 295/443/295 294/442/294 +f 295/443/295 260/448/260 261/449/261 +f 261/449/261 296/444/296 295/443/295 +f 296/444/296 261/449/261 262/450/262 +f 262/450/262 297/445/297 296/444/296 +f 262/451/262 267/456/267 302/457/302 +f 302/457/302 298/452/298 262/451/262 +f 298/452/298 302/457/302 303/458/303 +f 303/458/303 299/453/299 298/452/298 +f 299/453/299 303/458/303 304/459/304 +f 304/459/304 300/454/300 299/453/299 +f 300/454/300 304/459/304 305/460/305 +f 305/460/305 301/455/301 300/454/300 +f 267/456/267 272/461/272 306/462/306 +f 306/462/306 302/457/302 267/456/267 +f 302/457/302 306/462/306 307/463/307 +f 307/463/307 303/458/303 302/457/302 +f 303/458/303 307/463/307 308/464/308 +f 308/464/308 304/459/304 303/458/303 +f 304/459/304 308/464/308 309/465/309 +f 309/465/309 305/460/305 304/459/304 +f 272/461/272 277/466/277 310/467/310 +f 310/467/310 306/462/306 272/461/272 +f 306/462/306 310/467/310 311/468/311 +f 311/468/311 307/463/307 306/462/306 +f 307/463/307 311/468/311 312/469/312 +f 312/469/312 308/464/308 307/463/307 +f 308/464/308 312/469/312 313/470/313 +f 313/470/313 309/465/309 308/464/308 +f 277/466/277 282/471/282 314/472/314 +f 314/472/314 310/467/310 277/466/277 +f 310/467/310 314/472/314 315/473/315 +f 315/473/315 311/468/311 310/467/310 +f 311/468/311 315/473/315 316/474/316 +f 316/474/316 312/469/312 311/468/311 +f 312/469/312 316/474/316 317/475/317 +f 317/475/317 313/470/313 312/469/312 +f 282/476/282 287/481/287 318/482/318 +f 318/482/318 314/477/314 282/476/282 +f 314/477/314 318/482/318 319/483/319 +f 319/483/319 315/478/315 314/477/314 +f 315/478/315 319/483/319 320/484/320 +f 320/484/320 316/479/316 315/478/315 +f 316/479/316 320/484/320 321/485/321 +f 321/485/321 317/480/317 316/479/316 +f 287/481/287 292/486/292 322/487/322 +f 322/487/322 318/482/318 287/481/287 +f 318/482/318 322/487/322 323/488/323 +f 323/488/323 319/483/319 318/482/318 +f 319/483/319 323/488/323 324/489/324 +f 324/489/324 320/484/320 319/483/319 +f 320/484/320 324/489/324 325/490/325 +f 325/490/325 321/485/321 320/484/320 +f 292/486/292 297/491/297 326/492/326 +f 326/492/326 322/487/322 292/486/292 +f 322/487/322 326/492/326 327/493/327 +f 327/493/327 323/488/323 322/487/322 +f 323/488/323 327/493/327 328/494/328 +f 328/494/328 324/489/324 323/488/323 +f 324/489/324 328/494/328 329/495/329 +f 329/495/329 325/490/325 324/489/324 +f 297/491/297 262/496/262 298/497/298 +f 298/497/298 326/492/326 297/491/297 +f 326/492/326 298/497/298 299/498/299 +f 299/498/299 327/493/327 326/492/326 +f 327/493/327 299/498/299 300/499/300 +f 300/499/300 328/494/328 327/493/327 +f 328/494/328 300/499/300 301/500/301 +f 301/500/301 329/495/329 328/494/328 +f 330/501/330 335/506/335 336/507/336 +f 336/507/336 331/502/331 330/501/330 +f 331/502/331 336/507/336 337/508/337 +f 337/508/337 332/503/332 331/502/331 +f 332/503/332 337/508/337 338/509/338 +f 338/509/338 333/504/333 332/503/332 +f 333/504/333 338/509/338 339/510/339 +f 339/510/339 334/505/334 333/504/333 +f 335/506/335 340/511/340 341/512/341 +f 341/512/341 336/507/336 335/506/335 +f 336/507/336 341/512/341 342/513/342 +f 342/513/342 337/508/337 336/507/336 +f 337/508/337 342/513/342 343/514/343 +f 343/514/343 338/509/338 337/508/337 +f 338/509/338 343/514/343 344/515/344 +f 344/515/344 339/510/339 338/509/338 +f 340/511/340 345/516/345 346/517/346 +f 346/517/346 341/512/341 340/511/340 +f 341/512/341 346/517/346 347/518/347 +f 347/518/347 342/513/342 341/512/341 +f 342/513/342 347/518/347 348/519/348 +f 348/519/348 343/514/343 342/513/342 +f 343/514/343 348/519/348 349/520/349 +f 349/520/349 344/515/344 343/514/343 +f 345/516/345 350/521/350 351/522/351 +f 351/522/351 346/517/346 345/516/345 +f 346/517/346 351/522/351 352/523/352 +f 352/523/352 347/518/347 346/517/346 +f 347/518/347 352/523/352 353/524/353 +f 353/524/353 348/519/348 347/518/347 +f 348/519/348 353/524/353 354/525/354 +f 354/525/354 349/520/349 348/519/348 +f 350/526/350 355/531/355 356/532/356 +f 356/532/356 351/527/351 350/526/350 +f 351/527/351 356/532/356 357/533/357 +f 357/533/357 352/528/352 351/527/351 +f 352/528/352 357/533/357 358/534/358 +f 358/534/358 353/529/353 352/528/352 +f 353/529/353 358/534/358 359/535/359 +f 359/535/359 354/530/354 353/529/353 +f 355/531/355 360/536/360 361/537/361 +f 361/537/361 356/532/356 355/531/355 +f 356/532/356 361/537/361 362/538/362 +f 362/538/362 357/533/357 356/532/356 +f 357/533/357 362/538/362 363/539/363 +f 363/539/363 358/534/358 357/533/357 +f 358/534/358 363/539/363 364/540/364 +f 364/540/364 359/535/359 358/534/358 +f 360/536/360 365/541/365 366/542/366 +f 366/542/366 361/537/361 360/536/360 +f 361/537/361 366/542/366 367/543/367 +f 367/543/367 362/538/362 361/537/361 +f 362/538/362 367/543/367 368/544/368 +f 368/544/368 363/539/363 362/538/362 +f 363/539/363 368/544/368 369/545/369 +f 369/545/369 364/540/364 363/539/363 +f 365/541/365 330/546/330 331/547/331 +f 331/547/331 366/542/366 365/541/365 +f 366/542/366 331/547/331 332/548/332 +f 332/548/332 367/543/367 366/542/366 +f 367/543/367 332/548/332 333/549/333 +f 333/549/333 368/544/368 367/543/367 +f 368/544/368 333/549/333 334/550/334 +f 334/550/334 369/545/369 368/544/368 +f 334/551/334 339/556/339 374/557/374 +f 374/557/374 370/552/370 334/551/334 +f 370/552/370 374/557/374 375/558/375 +f 375/558/375 371/553/371 370/552/370 +f 371/553/371 375/558/375 376/559/376 +f 376/559/376 372/554/372 371/553/371 +f 372/554/372 376/559/376 377/560/377 +f 377/560/377 373/555/373 372/554/372 +f 339/556/339 344/561/344 378/562/378 +f 378/562/378 374/557/374 339/556/339 +f 374/557/374 378/562/378 379/563/379 +f 379/563/379 375/558/375 374/557/374 +f 375/558/375 379/563/379 380/564/380 +f 380/564/380 376/559/376 375/558/375 +f 376/559/376 380/564/380 381/565/381 +f 381/565/381 377/560/377 376/559/376 +f 344/561/344 349/566/349 382/567/382 +f 382/567/382 378/562/378 344/561/344 +f 378/562/378 382/567/382 383/568/383 +f 383/568/383 379/563/379 378/562/378 +f 379/563/379 383/568/383 384/569/384 +f 384/569/384 380/564/380 379/563/379 +f 380/564/380 384/569/384 385/570/385 +f 385/570/385 381/565/381 380/564/380 +f 349/566/349 354/571/354 386/572/386 +f 386/572/386 382/567/382 349/566/349 +f 382/567/382 386/572/386 387/573/387 +f 387/573/387 383/568/383 382/567/382 +f 383/568/383 387/573/387 388/574/388 +f 388/574/388 384/569/384 383/568/383 +f 384/569/384 388/574/388 389/575/389 +f 389/575/389 385/570/385 384/569/384 +f 354/576/354 359/581/359 390/582/390 +f 390/582/390 386/577/386 354/576/354 +f 386/577/386 390/582/390 391/583/391 +f 391/583/391 387/578/387 386/577/386 +f 387/578/387 391/583/391 392/584/392 +f 392/584/392 388/579/388 387/578/387 +f 388/579/388 392/584/392 393/585/393 +f 393/585/393 389/580/389 388/579/388 +f 359/581/359 364/586/364 394/587/394 +f 394/587/394 390/582/390 359/581/359 +f 390/582/390 394/587/394 395/588/395 +f 395/588/395 391/583/391 390/582/390 +f 391/583/391 395/588/395 396/589/396 +f 396/589/396 392/584/392 391/583/391 +f 392/584/392 396/589/396 397/590/397 +f 397/590/397 393/585/393 392/584/392 +f 364/586/364 369/591/369 398/592/398 +f 398/592/398 394/587/394 364/586/364 +f 394/587/394 398/592/398 399/593/399 +f 399/593/399 395/588/395 394/587/394 +f 395/588/395 399/593/399 400/594/400 +f 400/594/400 396/589/396 395/588/395 +f 396/589/396 400/594/400 401/595/401 +f 401/595/401 397/590/397 396/589/396 +f 369/591/369 334/596/334 370/597/370 +f 370/597/370 398/592/398 369/591/369 +f 398/592/398 370/597/370 371/598/371 +f 371/598/371 399/593/399 398/592/398 +f 399/593/399 371/598/371 372/599/372 +f 372/599/372 400/594/400 399/593/399 +f 400/594/400 372/599/372 373/600/373 +f 373/600/373 401/595/401 400/594/400 +f 407/607/407 403/602/403 402/601/402 +f 403/602/403 407/607/407 408/608/408 +f 408/608/408 404/603/404 403/602/403 +f 404/603/404 408/608/408 409/609/409 +f 409/609/409 405/604/405 404/603/404 +f 405/604/405 409/609/409 410/610/410 +f 410/610/410 406/605/406 405/604/405 +f 411/612/411 407/607/407 402/606/402 +f 407/607/407 411/612/411 412/613/412 +f 412/613/412 408/608/408 407/607/407 +f 408/608/408 412/613/412 413/614/413 +f 413/614/413 409/609/409 408/608/408 +f 409/609/409 413/614/413 414/615/414 +f 414/615/414 410/610/410 409/609/409 +f 415/617/415 411/612/411 402/611/402 +f 411/612/411 415/617/415 416/618/416 +f 416/618/416 412/613/412 411/612/411 +f 412/613/412 416/618/416 417/619/417 +f 417/619/417 413/614/413 412/613/412 +f 413/614/413 417/619/417 418/620/418 +f 418/620/418 414/615/414 413/614/413 +f 419/622/419 415/617/415 402/616/402 +f 415/617/415 419/622/419 420/623/420 +f 420/623/420 416/618/416 415/617/415 +f 416/618/416 420/623/420 421/624/421 +f 421/624/421 417/619/417 416/618/416 +f 417/619/417 421/624/421 422/625/422 +f 422/625/422 418/620/418 417/619/417 +f 423/632/423 419/627/419 402/626/402 +f 419/627/419 423/632/423 424/633/424 +f 424/633/424 420/628/420 419/627/419 +f 420/628/420 424/633/424 425/634/425 +f 425/634/425 421/629/421 420/628/420 +f 421/629/421 425/634/425 426/635/426 +f 426/635/426 422/630/422 421/629/421 +f 427/637/427 423/632/423 402/631/402 +f 423/632/423 427/637/427 428/638/428 +f 428/638/428 424/633/424 423/632/423 +f 424/633/424 428/638/428 429/639/429 +f 429/639/429 425/634/425 424/633/424 +f 425/634/425 429/639/429 430/640/430 +f 430/640/430 426/635/426 425/634/425 +f 431/642/431 427/637/427 402/636/402 +f 427/637/427 431/642/431 432/643/432 +f 432/643/432 428/638/428 427/637/427 +f 428/638/428 432/643/432 433/644/433 +f 433/644/433 429/639/429 428/638/428 +f 429/639/429 433/644/433 434/645/434 +f 434/645/434 430/640/430 429/639/429 +f 435/647/435 431/642/431 402/641/402 +f 431/642/431 435/647/435 436/648/436 +f 436/648/436 432/643/432 431/642/431 +f 432/643/432 436/648/436 437/649/437 +f 437/649/437 433/644/433 432/643/432 +f 433/644/433 437/649/437 438/650/438 +f 438/650/438 434/645/434 433/644/433 +f 439/657/439 435/652/435 402/651/402 +f 435/652/435 439/657/439 440/658/440 +f 440/658/440 436/653/436 435/652/435 +f 436/653/436 440/658/440 441/659/441 +f 441/659/441 437/654/437 436/653/436 +f 437/654/437 441/659/441 442/660/442 +f 442/660/442 438/655/438 437/654/437 +f 443/662/443 439/657/439 402/656/402 +f 439/657/439 443/662/443 444/663/444 +f 444/663/444 440/658/440 439/657/439 +f 440/658/440 444/663/444 445/664/445 +f 445/664/445 441/659/441 440/658/440 +f 441/659/441 445/664/445 446/665/446 +f 446/665/446 442/660/442 441/659/441 +f 447/667/447 443/662/443 402/661/402 +f 443/662/443 447/667/447 448/668/448 +f 448/668/448 444/663/444 443/662/443 +f 444/663/444 448/668/448 449/669/449 +f 449/669/449 445/664/445 444/663/444 +f 445/664/445 449/669/449 450/670/450 +f 450/670/450 446/665/446 445/664/445 +f 451/672/451 447/667/447 402/666/402 +f 447/667/447 451/672/451 452/673/452 +f 452/673/452 448/668/448 447/667/447 +f 448/668/448 452/673/452 453/674/453 +f 453/674/453 449/669/449 448/668/448 +f 449/669/449 453/674/453 454/675/454 +f 454/675/454 450/670/450 449/669/449 +f 455/682/455 451/677/451 402/676/402 +f 451/677/451 455/682/455 456/683/456 +f 456/683/456 452/678/452 451/677/451 +f 452/678/452 456/683/456 457/684/457 +f 457/684/457 453/679/453 452/678/452 +f 453/679/453 457/684/457 458/685/458 +f 458/685/458 454/680/454 453/679/453 +f 459/687/459 455/682/455 402/681/402 +f 455/682/455 459/687/459 460/688/460 +f 460/688/460 456/683/456 455/682/455 +f 456/683/456 460/688/460 461/689/461 +f 461/689/461 457/684/457 456/683/456 +f 457/684/457 461/689/461 462/690/462 +f 462/690/462 458/685/458 457/684/457 +f 463/692/463 459/687/459 402/686/402 +f 459/687/459 463/692/463 464/693/464 +f 464/693/464 460/688/460 459/687/459 +f 460/688/460 464/693/464 465/694/465 +f 465/694/465 461/689/461 460/688/460 +f 461/689/461 465/694/465 466/695/466 +f 466/695/466 462/690/462 461/689/461 +f 403/697/403 463/692/463 402/691/402 +f 463/692/463 403/697/403 404/698/404 +f 404/698/404 464/693/464 463/692/463 +f 464/693/464 404/698/404 405/699/405 +f 405/699/405 465/694/465 464/693/464 +f 465/694/465 405/699/405 406/700/406 +f 406/700/406 466/695/466 465/694/465 +f 406/701/406 410/706/410 471/707/471 +f 471/707/471 467/702/467 406/701/406 +f 467/702/467 471/707/471 472/708/472 +f 472/708/472 468/703/468 467/702/467 +f 468/703/468 472/708/472 473/709/473 +f 473/709/473 469/704/469 468/703/468 +f 469/704/469 473/709/473 474/710/474 +f 474/710/474 470/705/470 469/704/469 +f 410/706/410 414/711/414 475/712/475 +f 475/712/475 471/707/471 410/706/410 +f 471/707/471 475/712/475 476/713/476 +f 476/713/476 472/708/472 471/707/471 +f 472/708/472 476/713/476 477/714/477 +f 477/714/477 473/709/473 472/708/472 +f 473/709/473 477/714/477 478/715/478 +f 478/715/478 474/710/474 473/709/473 +f 414/711/414 418/716/418 479/717/479 +f 479/717/479 475/712/475 414/711/414 +f 475/712/475 479/717/479 480/718/480 +f 480/718/480 476/713/476 475/712/475 +f 476/713/476 480/718/480 481/719/481 +f 481/719/481 477/714/477 476/713/476 +f 477/714/477 481/719/481 482/720/482 +f 482/720/482 478/715/478 477/714/477 +f 418/716/418 422/721/422 483/722/483 +f 483/722/483 479/717/479 418/716/418 +f 479/717/479 483/722/483 484/723/484 +f 484/723/484 480/718/480 479/717/479 +f 480/718/480 484/723/484 485/724/485 +f 485/724/485 481/719/481 480/718/480 +f 481/719/481 485/724/485 486/725/486 +f 486/725/486 482/720/482 481/719/481 +f 422/726/422 426/731/426 487/732/487 +f 487/732/487 483/727/483 422/726/422 +f 483/727/483 487/732/487 488/733/488 +f 488/733/488 484/728/484 483/727/483 +f 484/728/484 488/733/488 489/734/489 +f 489/734/489 485/729/485 484/728/484 +f 485/729/485 489/734/489 490/735/490 +f 490/735/490 486/730/486 485/729/485 +f 426/731/426 430/736/430 491/737/491 +f 491/737/491 487/732/487 426/731/426 +f 487/732/487 491/737/491 492/738/492 +f 492/738/492 488/733/488 487/732/487 +f 488/733/488 492/738/492 493/739/493 +f 493/739/493 489/734/489 488/733/488 +f 489/734/489 493/739/493 494/740/494 +f 494/740/494 490/735/490 489/734/489 +f 430/736/430 434/741/434 495/742/495 +f 495/742/495 491/737/491 430/736/430 +f 491/737/491 495/742/495 496/743/496 +f 496/743/496 492/738/492 491/737/491 +f 492/738/492 496/743/496 497/744/497 +f 497/744/497 493/739/493 492/738/492 +f 493/739/493 497/744/497 498/745/498 +f 498/745/498 494/740/494 493/739/493 +f 434/741/434 438/746/438 499/747/499 +f 499/747/499 495/742/495 434/741/434 +f 495/742/495 499/747/499 500/748/500 +f 500/748/500 496/743/496 495/742/495 +f 496/743/496 500/748/500 501/749/501 +f 501/749/501 497/744/497 496/743/496 +f 497/744/497 501/749/501 502/750/502 +f 502/750/502 498/745/498 497/744/497 +f 438/751/438 442/756/442 503/757/503 +f 503/757/503 499/752/499 438/751/438 +f 499/752/499 503/757/503 504/758/504 +f 504/758/504 500/753/500 499/752/499 +f 500/753/500 504/758/504 505/759/505 +f 505/759/505 501/754/501 500/753/500 +f 501/754/501 505/759/505 506/760/506 +f 506/760/506 502/755/502 501/754/501 +f 442/756/442 446/761/446 507/762/507 +f 507/762/507 503/757/503 442/756/442 +f 503/757/503 507/762/507 508/763/508 +f 508/763/508 504/758/504 503/757/503 +f 504/758/504 508/763/508 509/764/509 +f 509/764/509 505/759/505 504/758/504 +f 505/759/505 509/764/509 510/765/510 +f 510/765/510 506/760/506 505/759/505 +f 446/761/446 450/766/450 511/767/511 +f 511/767/511 507/762/507 446/761/446 +f 507/762/507 511/767/511 512/768/512 +f 512/768/512 508/763/508 507/762/507 +f 508/763/508 512/768/512 513/769/513 +f 513/769/513 509/764/509 508/763/508 +f 509/764/509 513/769/513 514/770/514 +f 514/770/514 510/765/510 509/764/509 +f 450/766/450 454/771/454 515/772/515 +f 515/772/515 511/767/511 450/766/450 +f 511/767/511 515/772/515 516/773/516 +f 516/773/516 512/768/512 511/767/511 +f 512/768/512 516/773/516 517/774/517 +f 517/774/517 513/769/513 512/768/512 +f 513/769/513 517/774/517 518/775/518 +f 518/775/518 514/770/514 513/769/513 +f 454/776/454 458/781/458 519/782/519 +f 519/782/519 515/777/515 454/776/454 +f 515/777/515 519/782/519 520/783/520 +f 520/783/520 516/778/516 515/777/515 +f 516/778/516 520/783/520 521/784/521 +f 521/784/521 517/779/517 516/778/516 +f 517/779/517 521/784/521 522/785/522 +f 522/785/522 518/780/518 517/779/517 +f 458/781/458 462/786/462 523/787/523 +f 523/787/523 519/782/519 458/781/458 +f 519/782/519 523/787/523 524/788/524 +f 524/788/524 520/783/520 519/782/519 +f 520/783/520 524/788/524 525/789/525 +f 525/789/525 521/784/521 520/783/520 +f 521/784/521 525/789/525 526/790/526 +f 526/790/526 522/785/522 521/784/521 +f 462/786/462 466/791/466 527/792/527 +f 527/792/527 523/787/523 462/786/462 +f 523/787/523 527/792/527 528/793/528 +f 528/793/528 524/788/524 523/787/523 +f 524/788/524 528/793/528 529/794/529 +f 529/794/529 525/789/525 524/788/524 +f 525/789/525 529/794/529 530/795/530 +f 530/795/530 526/790/526 525/789/525 +f 466/791/466 406/796/406 467/797/467 +f 467/797/467 527/792/527 466/791/466 +f 527/792/527 467/797/467 468/798/468 +f 468/798/468 528/793/528 527/792/527 +f 528/793/528 468/798/468 469/799/469 +f 469/799/469 529/794/529 528/793/528 +f 529/794/529 469/799/469 470/800/470 +f 470/800/470 530/795/530 529/794/529 +# 992 faces + +g diff --git a/strafe-client/models/teslacyberv3.0.mtl b/strafe-client/models/teslacyberv3.0.mtl new file mode 100644 index 0000000..1ac9711 --- /dev/null +++ b/strafe-client/models/teslacyberv3.0.mtl @@ -0,0 +1,62 @@ +# Blender MTL File: 'teslacyberv3.0.blend' +# Material Count: 6 + +newmtl Material +Ns 65.476285 +Ka 1.000000 1.000000 1.000000 +Kd 0.411568 0.411568 0.411568 +Ks 0.614679 0.614679 0.614679 +Ke 0.000000 0.000000 0.000000 +Ni 36.750000 +d 1.000000 +illum 3 + +newmtl Материал +Ns 323.999994 +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.000000 +d 1.000000 +illum 2 + +newmtl Материал.001 +Ns 900.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.026240 0.026240 0.026240 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 + +newmtl Материал.002 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.031837 0.032429 0.029425 +Ks 0.169725 0.169725 0.169725 +Ke 0.000000 0.000000 0.000000 +Ni 0.000000 +d 1.000000 +illum 2 + +newmtl Материал.003 +Ns 900.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.023585 0.083235 0.095923 +Ks 1.000000 1.000000 1.000000 +Ke 0.000000 0.000000 0.000000 +Ni 45.049999 +d 1.000000 +illum 3 + +newmtl Материал.004 +Ns 323.999994 +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.000000 +d 1.000000 +illum 2 diff --git a/strafe-client/models/teslacyberv3.0.obj b/strafe-client/models/teslacyberv3.0.obj new file mode 100644 index 0000000..337fe85 --- /dev/null +++ b/strafe-client/models/teslacyberv3.0.obj @@ -0,0 +1,6617 @@ +# Blender v2.91.2 OBJ File: 'teslacyberv3.0.blend' +# www.blender.org +mtllib teslacyberv3.0.mtl +o Cube +v 1.000000 1.919617 4.732432 +v 1.000000 0.974478 4.635892 +v 1.000000 3.273532 0.658841 +v 1.000000 0.655211 2.310734 +v 0.877517 2.564093 2.887154 +v 1.000000 0.882397 4.314609 +v 1.000000 3.067818 -1.579714 +v 1.000000 0.667890 -2.227377 +v 1.000000 0.785508 -4.214180 +v 1.000000 2.638943 -4.453823 +v 1.000000 0.874439 4.244418 +v 1.000000 0.655517 2.313426 +v 1.000000 1.111976 2.351255 +v 1.000000 1.866242 2.835600 +v 1.000000 1.833448 3.907717 +v 1.000000 1.258289 4.260885 +v 1.000000 0.668172 -2.232137 +v 1.000000 1.196988 -2.260916 +v 1.000000 1.854486 -2.740417 +v 1.000000 1.879915 -3.782969 +v 1.000000 1.335027 -4.186186 +v 1.750241 2.525397 -5.238923 +v 1.750241 1.086208 -5.076335 +v 1.284501 1.919617 4.732432 +v 1.327607 0.971679 4.653199 +v 1.531155 2.563108 2.886828 +v 1.531797 3.067818 -1.579714 +v 1.358472 3.272686 0.658562 +v 1.466385 2.830804 2.109343 +v 1.750241 0.655211 2.182597 +v 1.750241 0.882397 4.314609 +v 1.750241 0.667890 -2.227377 +v 1.697931 2.638943 -4.453823 +v 1.750241 2.485732 -4.434013 +v 1.750241 2.160423 2.167351 +v 1.750241 2.354560 -1.772200 +v 1.818752 0.655211 2.182857 +v 1.819952 0.655517 2.313426 +v 1.819952 0.874439 4.244418 +v 1.750241 0.882397 4.314609 +v 1.750241 1.128912 2.225720 +v 1.819952 1.111976 2.351255 +v 1.750241 1.985622 2.765436 +v 1.819952 1.866242 2.835600 +v 1.750241 1.936693 3.953938 +v 1.819952 1.833448 3.907717 +v 1.750241 1.341437 4.333489 +v 1.819952 1.258289 4.260885 +v 1.750241 0.883422 2.180506 +v 1.750241 1.591581 -4.318402 +v 1.750224 0.785508 -4.214180 +v 1.750241 0.833292 -4.351184 +v 1.820337 0.668172 -2.232137 +v 1.750241 0.667890 -2.048774 +v 1.820337 1.196988 -2.260916 +v 1.793278 1.210958 -2.101550 +v 1.820337 1.854486 -2.740417 +v 1.750241 1.987285 -2.642222 +v 1.820337 1.879915 -3.782969 +v 1.750241 2.014194 -3.854774 +v 1.820337 1.335027 -4.186186 +v 1.750241 1.350402 -4.282620 +v 1.712797 0.888017 2.180506 +v 1.819131 0.883519 2.180886 +v 1.720162 0.917570 -2.072449 +v 1.717040 0.905044 -0.269841 +v 1.750241 0.900970 -0.269841 +v 1.818854 0.655211 2.182597 +v 1.818854 0.667890 -2.048774 +v 1.818854 0.655211 2.182857 +v 1.818854 0.883422 2.180506 +v 1.818854 0.913878 -2.072449 +v 1.818854 0.900970 -0.269841 +v 1.750241 2.253663 0.275267 +v 1.772394 1.127157 2.177967 +v 1.750241 1.213567 -4.300763 +v 1.750241 1.289006 -5.099246 +v 1.750181 1.335027 -4.186186 +v 1.819927 1.289006 -5.099246 +v 1.819927 1.086208 -5.076335 +v 1.819927 0.833292 -4.351184 +v 1.819927 1.213567 -4.300763 +v 1.750215 1.204111 -4.203537 +v 1.750241 0.833292 -4.351184 +v 1.750241 1.213567 -4.300763 +v 1.819927 0.833292 -4.351184 +v 1.819927 1.213567 -4.300763 +v 1.750241 0.784857 -4.213239 +v 1.750241 1.204197 -4.203453 +v 1.819927 0.784857 -4.213239 +v 1.819927 1.204197 -4.203453 +v 1.750241 1.289002 -5.099215 +v 1.750241 1.266550 -4.861531 +v 1.750241 1.372882 -4.864861 +v 1.750241 1.389482 -5.059558 +v 1.704873 1.213566 -4.300773 +v 1.704873 1.350401 -4.282630 +v 1.704814 1.335025 -4.186196 +v 1.704847 1.204110 -4.203547 +v 1.704873 1.289004 -5.099256 +v 1.704873 1.372881 -4.864871 +v 1.704873 1.266549 -4.861541 +v 1.000000 1.335027 -4.186186 +v 1.750181 1.335027 -4.186186 +v 1.704813 1.335027 -4.186186 +v 0.999869 0.785508 -4.214180 +v 1.704605 1.335027 -4.186186 +v 1.781390 1.163258 0.334393 +v 1.715989 0.900825 0.337296 +v 1.597979 2.686126 2.117274 +v 1.695288 2.350152 2.149278 +v 1.568109 2.947990 -1.569140 +v 1.682906 2.571904 -1.628006 +v 1.470975 3.199804 0.572917 +v 1.497593 3.130800 -0.014067 +v 1.688418 2.473200 0.053302 +v 1.689320 2.457031 0.328725 +v 1.488895 3.153348 0.177737 +v 1.562110 2.963541 -1.436855 +v 1.683560 2.560198 -1.428613 +v 1.570283 2.798146 1.780491 +v 1.694388 2.366281 1.874541 +v 1.586019 2.734497 1.971851 +v 1.695039 2.354623 2.073121 +v 1.703611 2.262414 3.349329 +v 1.671976 2.347888 2.072812 +v 1.672225 2.343417 2.148969 +v 1.547219 2.791411 1.780182 +v 1.447912 3.193069 0.572608 +v 1.660496 2.553463 -1.428922 +v 1.665354 2.466465 0.052993 +v 1.474530 3.124065 -0.014376 +v 1.465832 3.146613 0.177428 +v 1.666257 2.450296 0.328416 +v 1.539047 2.956806 -1.437164 +v 1.671325 2.359546 1.874232 +v 1.574915 2.679392 2.116965 +v 1.562956 2.727762 1.971541 +v 1.680548 2.255679 3.349020 +v 1.555592 2.944302 -1.569304 +v 1.670389 2.568216 -1.628170 +v 1.549594 2.959853 -1.437019 +v 1.476379 3.149660 0.177573 +v 1.485076 3.127112 -0.014231 +v 1.675901 2.469512 0.053138 +v 1.676804 2.453343 0.328561 +v 1.671043 2.556510 -1.428777 +v 1.573503 2.730809 1.971686 +v 1.557766 2.794458 1.780327 +v 1.681871 2.362593 1.874377 +v 1.682522 2.350935 2.072957 +v 1.750241 1.263441 4.331896 +v 1.327607 1.287596 4.716530 +v 1.284501 1.284919 4.656356 +v 1.393376 1.287596 4.679573 +v 1.393376 0.971679 4.616242 +v 1.816010 0.882397 4.314609 +v 1.816010 1.263441 4.331896 +v 1.754250 1.258442 4.260794 +v 1.754033 0.874437 4.244418 +v 1.820019 1.258442 4.260794 +v 1.819803 0.874437 4.244418 +v 1.846744 0.800318 3.491142 +v 1.846744 0.720480 3.445081 +v 1.846744 0.706713 3.353942 +v 1.846744 0.769385 3.286355 +v 1.846744 0.861302 3.293214 +v 1.846744 0.913249 3.369355 +v 1.846744 0.886108 3.457441 +v 1.882362 0.798209 3.519400 +v 1.882362 0.697072 3.461051 +v 1.882362 0.679633 3.345598 +v 1.882362 0.759025 3.259980 +v 1.882362 0.875463 3.268670 +v 1.882362 0.941268 3.365122 +v 1.882362 0.906887 3.476708 +v 1.846744 0.792024 3.602285 +v 1.846744 0.628413 3.507893 +v 1.846744 0.600203 3.321125 +v 1.846744 0.728635 3.182619 +v 1.846744 0.916998 3.196676 +v 1.846744 1.023451 3.352709 +v 1.846744 0.967832 3.533221 +v 1.846744 0.658244 3.340309 +v 1.846744 0.677849 3.463600 +v 1.846744 0.683943 3.472385 +v 1.846744 0.792559 3.533928 +v 1.846744 0.553669 3.971039 +v 1.846744 0.431761 3.901965 +v 1.846744 0.780979 2.736408 +v 1.846744 0.920785 2.745747 +v 1.846744 0.879964 3.242204 +v 1.846744 0.755402 3.233883 +v 1.846744 0.745481 3.237870 +v 1.846744 0.661312 3.330068 +v 1.846744 0.288318 2.999900 +v 1.846744 0.382787 2.896419 +v 1.846744 0.783949 2.806544 +v 1.846744 0.908512 2.814866 +v 1.846744 1.241172 3.003353 +v 1.846744 1.312330 3.105928 +v 1.846744 1.372374 3.483531 +v 1.846744 1.336544 3.603119 +v 1.846744 1.078759 3.885496 +v 1.846744 0.962922 3.932045 +v 1.846744 0.581424 3.906559 +v 1.846744 0.472808 3.845017 +v 1.846744 0.254873 3.530860 +v 1.846744 0.235268 3.407569 +v 1.846744 0.345005 3.041307 +v 1.846744 0.429174 2.949109 +v 1.846744 0.879964 3.242204 +v 1.846744 0.755402 3.233883 +v 1.846744 0.960424 3.350050 +v 1.846744 0.889266 3.247475 +v 1.846744 0.926273 3.480196 +v 1.846744 0.962103 3.360608 +v 1.846744 0.803227 3.534641 +v 1.846744 0.919064 3.488092 +v 1.846744 0.683943 3.472385 +v 1.846744 0.792559 3.533928 +v 1.846744 0.658244 3.340309 +v 1.846744 0.677849 3.463600 +v 1.846744 0.745481 3.237870 +v 1.846744 0.661312 3.330068 +v 1.846744 0.165151 3.410984 +v 1.846744 0.187155 3.549363 +v 1.846744 1.401199 3.630465 +v 1.846744 1.441414 3.496242 +v 1.846744 0.962103 3.360608 +v 1.846744 0.926273 3.480196 +v 1.846744 0.919064 3.488092 +v 1.846744 0.803227 3.534641 +v 1.846744 0.981853 3.999644 +v 1.846744 1.111866 3.947399 +v 1.846744 0.889266 3.247475 +v 1.846744 0.960424 3.350050 +v 1.846744 1.374021 3.072428 +v 1.846744 1.294155 2.957301 +v 1.865511 0.904784 3.474123 +v 1.865511 0.803871 3.514674 +v 1.865511 1.359836 3.481223 +v 1.865511 0.942278 3.363063 +v 1.865511 0.267171 3.527500 +v 1.865511 0.694646 3.452786 +v 1.865511 0.677567 3.345380 +v 1.865511 0.248002 3.406949 +v 1.865511 0.699955 3.460439 +v 1.865511 0.480262 3.834674 +v 1.865511 0.586465 3.894849 +v 1.865511 0.794577 3.514053 +v 1.865511 0.911063 3.467244 +v 1.865511 1.324802 3.598153 +v 1.865511 0.906283 2.827418 +v 1.865511 0.784489 2.819282 +v 1.865511 0.762207 3.252665 +v 1.865511 0.870721 3.259914 +v 1.865511 0.753565 3.256138 +v 1.865511 0.437599 2.958678 +v 1.865511 0.680240 3.336458 +v 1.865511 0.355300 3.048827 +v 1.865511 0.959483 3.919768 +v 1.865511 1.072746 3.874254 +v 1.865511 0.878825 3.264505 +v 1.865511 0.940815 3.353865 +v 1.865511 1.301126 3.112011 +v 1.865511 1.231549 3.011716 +v 1.846743 0.808222 2.561027 +v 1.846743 0.967930 2.576757 +v 1.846743 1.121501 2.623343 +v 1.846743 1.263033 2.698993 +v 1.846743 1.387086 2.800801 +v 1.846743 1.488894 2.924854 +v 1.846743 1.564544 3.066386 +v 1.846743 1.611130 3.219956 +v 1.846743 1.626859 3.379664 +v 1.846743 1.611130 3.539372 +v 1.846743 1.564544 3.692943 +v 1.846743 1.488894 3.834475 +v 1.846743 1.387086 3.958528 +v 1.846743 1.263033 4.060336 +v 1.846743 1.121501 4.135986 +v 1.846743 0.967930 4.182571 +v 1.846743 0.808222 4.198301 +v 1.846743 0.648514 4.182571 +v 1.846743 0.494943 4.135986 +v 1.846743 0.353412 4.060336 +v 1.846743 0.229358 3.958528 +v 1.846743 0.127550 3.834475 +v 1.846743 0.051900 3.692943 +v 1.846743 0.005315 3.539372 +v 1.846743 -0.010415 3.379664 +v 1.846743 0.005316 3.219955 +v 1.846743 0.051901 3.066385 +v 1.846743 0.127551 2.924853 +v 1.846743 0.229359 2.800800 +v 1.846743 0.353413 2.698992 +v 1.846743 0.494945 2.623342 +v 1.846743 0.648515 2.576757 +v 1.888794 0.808222 2.638682 +v 1.888794 0.952781 2.652920 +v 1.888794 1.091784 2.695086 +v 1.888794 1.219890 2.763560 +v 1.888794 1.332176 2.855711 +v 1.888794 1.424327 2.967997 +v 1.888794 1.492801 3.096102 +v 1.888794 1.534967 3.235106 +v 1.888794 1.549205 3.379664 +v 1.888794 1.534967 3.524223 +v 1.888794 1.492801 3.663226 +v 1.888794 1.424327 3.791332 +v 1.888794 1.332176 3.903618 +v 1.888794 1.219890 3.995769 +v 1.888794 1.091784 4.064243 +v 1.888794 0.952781 4.106409 +v 1.888794 0.808222 4.120646 +v 1.888794 0.663664 4.106409 +v 1.888794 0.524660 4.064243 +v 1.888794 0.396554 3.995769 +v 1.888794 0.284268 3.903618 +v 1.888794 0.192118 3.791332 +v 1.888794 0.123644 3.663225 +v 1.888794 0.081477 3.524222 +v 1.888794 0.067240 3.379664 +v 1.888794 0.081478 3.235105 +v 1.888794 0.123644 3.096102 +v 1.888794 0.192118 2.967996 +v 1.888794 0.284269 2.855710 +v 1.888794 0.396555 2.763560 +v 1.888794 0.524662 2.695086 +v 1.888794 0.663665 2.652919 +v 1.855595 0.808222 2.738160 +v 1.855595 0.933374 2.750486 +v 1.855595 1.053715 2.786992 +v 1.855595 1.164623 2.846273 +v 1.855595 1.261834 2.926052 +v 1.855595 1.341614 3.023264 +v 1.855595 1.400895 3.134171 +v 1.855595 1.437400 3.254513 +v 1.855595 1.449726 3.379664 +v 1.855595 1.437400 3.504816 +v 1.855595 1.400895 3.625157 +v 1.855595 1.341614 3.736065 +v 1.855595 1.261834 3.833276 +v 1.855595 1.164623 3.913055 +v 1.855595 1.053715 3.972337 +v 1.855595 0.933373 4.008842 +v 1.855595 0.808222 4.021168 +v 1.855595 0.683071 4.008842 +v 1.855595 0.562729 3.972337 +v 1.855595 0.451821 3.913055 +v 1.855595 0.354610 3.833276 +v 1.855595 0.274831 3.736065 +v 1.855595 0.215550 3.625157 +v 1.855595 0.179044 3.504815 +v 1.855595 0.166718 3.379664 +v 1.855595 0.179045 3.254513 +v 1.855595 0.215550 3.134171 +v 1.855595 0.274832 3.023263 +v 1.855595 0.354611 2.926052 +v 1.855595 0.451823 2.846273 +v 1.855595 0.562730 2.786992 +v 1.855595 0.683072 2.750486 +v 1.840194 0.808222 2.876457 +v 1.840194 0.906393 2.886126 +v 1.840194 1.000792 2.914761 +v 1.840194 1.087790 2.961263 +v 1.840194 1.164044 3.023843 +v 1.840194 1.226624 3.100097 +v 1.840194 1.273126 3.187095 +v 1.840194 1.301761 3.281493 +v 1.840194 1.311430 3.379664 +v 1.840194 1.301761 3.477835 +v 1.840194 1.273126 3.572234 +v 1.840194 1.226624 3.659232 +v 1.840194 1.164044 3.735486 +v 1.840194 1.087790 3.798066 +v 1.840194 1.000792 3.844568 +v 1.840194 0.906393 3.873203 +v 1.840194 0.808222 3.882872 +v 1.840194 0.710051 3.873203 +v 1.840194 0.615653 3.844568 +v 1.840194 0.528655 3.798066 +v 1.840194 0.452401 3.735486 +v 1.840194 0.389820 3.659231 +v 1.840194 0.343319 3.572233 +v 1.840194 0.314684 3.477835 +v 1.840194 0.305014 3.379664 +v 1.840194 0.314684 3.281493 +v 1.840194 0.343320 3.187095 +v 1.840194 0.389821 3.100096 +v 1.840194 0.452401 3.023843 +v 1.840194 0.528656 2.961262 +v 1.840194 0.615654 2.914761 +v 1.840194 0.710052 2.886125 +v 1.353033 0.808222 2.561027 +v 1.353033 0.967930 2.576757 +v 1.353033 1.121501 2.623343 +v 1.353033 1.263033 2.698993 +v 1.353033 1.387086 2.800801 +v 1.353033 1.488894 2.924854 +v 1.353033 1.564544 3.066386 +v 1.353033 1.611130 3.219956 +v 1.353033 1.626859 3.379664 +v 1.353033 1.611130 3.539372 +v 1.353033 1.564544 3.692943 +v 1.353033 1.488894 3.834475 +v 1.353033 1.387086 3.958528 +v 1.353033 1.263033 4.060336 +v 1.353033 1.121501 4.135986 +v 1.353033 0.967930 4.182571 +v 1.353033 0.808222 4.198301 +v 1.353033 0.648514 4.182571 +v 1.353033 0.494943 4.135986 +v 1.353033 0.353412 4.060336 +v 1.353033 0.229358 3.958528 +v 1.353033 0.127550 3.834475 +v 1.353033 0.051900 3.692943 +v 1.353033 0.005315 3.539372 +v 1.353033 -0.010415 3.379664 +v 1.353033 0.005316 3.219955 +v 1.353033 0.051901 3.066385 +v 1.353033 0.127551 2.924853 +v 1.353033 0.229359 2.800800 +v 1.353033 0.353413 2.698992 +v 1.353033 0.494945 2.623342 +v 1.353033 0.648515 2.576757 +v 1.846744 0.800318 -3.128476 +v 1.846744 0.720480 -3.174537 +v 1.846744 0.706713 -3.265676 +v 1.846744 0.769385 -3.333263 +v 1.846744 0.861302 -3.326404 +v 1.846744 0.913249 -3.250263 +v 1.846744 0.886108 -3.162177 +v 1.882362 0.798209 -3.100218 +v 1.882362 0.697072 -3.158567 +v 1.882362 0.679633 -3.274020 +v 1.882362 0.759025 -3.359638 +v 1.882362 0.875463 -3.350948 +v 1.882362 0.941268 -3.254496 +v 1.882362 0.906887 -3.142910 +v 1.846744 0.792024 -3.017333 +v 1.846744 0.628413 -3.111725 +v 1.846744 0.600203 -3.298493 +v 1.846744 0.728635 -3.436999 +v 1.846744 0.916998 -3.422941 +v 1.846744 1.023451 -3.266909 +v 1.846744 0.967832 -3.086397 +v 1.846744 0.658244 -3.279309 +v 1.846744 0.677849 -3.156018 +v 1.846744 0.683943 -3.147233 +v 1.846744 0.792559 -3.085690 +v 1.846744 0.553669 -2.648579 +v 1.846744 0.431761 -2.717653 +v 1.846744 0.780979 -3.883210 +v 1.846744 0.920785 -3.873871 +v 1.846744 0.879964 -3.377414 +v 1.846744 0.755402 -3.385735 +v 1.846744 0.745481 -3.381748 +v 1.846744 0.661312 -3.289550 +v 1.846744 0.288318 -3.619718 +v 1.846744 0.382787 -3.723199 +v 1.846744 0.783949 -3.813074 +v 1.846744 0.908512 -3.804752 +v 1.846744 1.241172 -3.616265 +v 1.846744 1.312330 -3.513690 +v 1.846744 1.372374 -3.136086 +v 1.846744 1.336544 -3.016499 +v 1.846744 1.078759 -2.734122 +v 1.846744 0.962922 -2.687573 +v 1.846744 0.581424 -2.713058 +v 1.846744 0.472808 -2.774601 +v 1.846744 0.254873 -3.088758 +v 1.846744 0.235268 -3.212049 +v 1.846744 0.345005 -3.578310 +v 1.846744 0.429174 -3.670509 +v 1.846744 0.879964 -3.377414 +v 1.846744 0.755402 -3.385735 +v 1.846744 0.960424 -3.269568 +v 1.846744 0.889266 -3.372143 +v 1.846744 0.926273 -3.139422 +v 1.846744 0.962103 -3.259010 +v 1.846744 0.803227 -3.084977 +v 1.846744 0.919064 -3.131526 +v 1.846744 0.683943 -3.147233 +v 1.846744 0.792559 -3.085690 +v 1.846744 0.658244 -3.279309 +v 1.846744 0.677849 -3.156018 +v 1.846744 0.745481 -3.381748 +v 1.846744 0.661312 -3.289550 +v 1.846744 0.165151 -3.208634 +v 1.846744 0.187155 -3.070255 +v 1.846744 1.401199 -2.989153 +v 1.846744 1.441414 -3.123376 +v 1.846744 0.962103 -3.259010 +v 1.846744 0.926273 -3.139422 +v 1.846744 0.919064 -3.131526 +v 1.846744 0.803227 -3.084977 +v 1.846744 0.981853 -2.619974 +v 1.846744 1.111866 -2.672219 +v 1.846744 0.889266 -3.372143 +v 1.846744 0.960424 -3.269568 +v 1.846744 1.374021 -3.547190 +v 1.846744 1.294155 -3.662317 +v 1.865511 0.904784 -3.145495 +v 1.865511 0.803871 -3.104944 +v 1.865511 1.359836 -3.138395 +v 1.865511 0.942278 -3.256555 +v 1.865511 0.267171 -3.092118 +v 1.865511 0.694646 -3.166831 +v 1.865511 0.677567 -3.274238 +v 1.865511 0.248002 -3.212669 +v 1.865511 0.699955 -3.159178 +v 1.865511 0.480262 -2.784944 +v 1.865511 0.586465 -2.724769 +v 1.865511 0.794577 -3.105565 +v 1.865511 0.911063 -3.152374 +v 1.865511 1.324802 -3.021465 +v 1.865511 0.906283 -3.792200 +v 1.865511 0.784489 -3.800336 +v 1.865511 0.762207 -3.366953 +v 1.865511 0.870721 -3.359704 +v 1.865511 0.753565 -3.363480 +v 1.865511 0.437599 -3.660940 +v 1.865511 0.680240 -3.283160 +v 1.865511 0.355300 -3.570791 +v 1.865511 0.959483 -2.699850 +v 1.865511 1.072746 -2.745364 +v 1.865511 0.878825 -3.355113 +v 1.865511 0.940815 -3.265753 +v 1.865511 1.301126 -3.507607 +v 1.865511 1.231549 -3.607902 +v 1.846743 0.808222 -4.058591 +v 1.846743 0.967930 -4.042861 +v 1.846743 1.121501 -3.996275 +v 1.846743 1.263033 -3.920625 +v 1.846743 1.387086 -3.818817 +v 1.846743 1.488894 -3.694764 +v 1.846743 1.564544 -3.553232 +v 1.846743 1.611130 -3.399662 +v 1.846743 1.626859 -3.239954 +v 1.846743 1.611130 -3.080245 +v 1.846743 1.564544 -2.926675 +v 1.846743 1.488894 -2.785143 +v 1.846743 1.387086 -2.661090 +v 1.846743 1.263033 -2.559282 +v 1.846743 1.121501 -2.483632 +v 1.846743 0.967930 -2.437047 +v 1.846743 0.808222 -2.421317 +v 1.846743 0.648514 -2.437047 +v 1.846743 0.494943 -2.483632 +v 1.846743 0.353412 -2.559282 +v 1.846743 0.229358 -2.661090 +v 1.846743 0.127550 -2.785143 +v 1.846743 0.051900 -2.926675 +v 1.846743 0.005315 -3.080246 +v 1.846743 -0.010415 -3.239954 +v 1.846743 0.005316 -3.399662 +v 1.846743 0.051901 -3.553233 +v 1.846743 0.127551 -3.694765 +v 1.846743 0.229359 -3.818818 +v 1.846743 0.353413 -3.920626 +v 1.846743 0.494945 -3.996276 +v 1.846743 0.648515 -4.042861 +v 1.888794 0.808222 -3.980936 +v 1.888794 0.952781 -3.966698 +v 1.888794 1.091784 -3.924532 +v 1.888794 1.219890 -3.856058 +v 1.888794 1.332176 -3.763907 +v 1.888794 1.424327 -3.651621 +v 1.888794 1.492801 -3.523515 +v 1.888794 1.534967 -3.384512 +v 1.888794 1.549205 -3.239954 +v 1.888794 1.534967 -3.095395 +v 1.888794 1.492801 -2.956392 +v 1.888794 1.424327 -2.828286 +v 1.888794 1.332176 -2.716000 +v 1.888794 1.219890 -2.623849 +v 1.888794 1.091784 -2.555375 +v 1.888794 0.952781 -2.513209 +v 1.888794 0.808222 -2.498971 +v 1.888794 0.663664 -2.513209 +v 1.888794 0.524660 -2.555375 +v 1.888794 0.396554 -2.623849 +v 1.888794 0.284268 -2.716000 +v 1.888794 0.192118 -2.828286 +v 1.888794 0.123644 -2.956393 +v 1.888794 0.081477 -3.095396 +v 1.888794 0.067240 -3.239954 +v 1.888794 0.081478 -3.384513 +v 1.888794 0.123644 -3.523516 +v 1.888794 0.192118 -3.651622 +v 1.888794 0.284269 -3.763908 +v 1.888794 0.396555 -3.856058 +v 1.888794 0.524662 -3.924532 +v 1.888794 0.663665 -3.966699 +v 1.855595 0.808222 -3.881458 +v 1.855595 0.933374 -3.869132 +v 1.855595 1.053715 -3.832626 +v 1.855595 1.164623 -3.773345 +v 1.855595 1.261834 -3.693566 +v 1.855595 1.341614 -3.596354 +v 1.855595 1.400895 -3.485447 +v 1.855595 1.437400 -3.365105 +v 1.855595 1.449726 -3.239954 +v 1.855595 1.437400 -3.114802 +v 1.855595 1.400895 -2.994461 +v 1.855595 1.341614 -2.883553 +v 1.855595 1.261834 -2.786342 +v 1.855595 1.164623 -2.706563 +v 1.855595 1.053715 -2.647281 +v 1.855595 0.933373 -2.610775 +v 1.855595 0.808222 -2.598450 +v 1.855595 0.683071 -2.610775 +v 1.855595 0.562729 -2.647281 +v 1.855595 0.451821 -2.706563 +v 1.855595 0.354610 -2.786342 +v 1.855595 0.274831 -2.883553 +v 1.855595 0.215550 -2.994461 +v 1.855595 0.179044 -3.114803 +v 1.855595 0.166718 -3.239954 +v 1.855595 0.179045 -3.365105 +v 1.855595 0.215550 -3.485447 +v 1.855595 0.274832 -3.596355 +v 1.855595 0.354611 -3.693566 +v 1.855595 0.451823 -3.773345 +v 1.855595 0.562730 -3.832626 +v 1.855595 0.683072 -3.869132 +v 1.840194 0.808222 -3.743161 +v 1.840194 0.906393 -3.733492 +v 1.840194 1.000792 -3.704857 +v 1.840194 1.087790 -3.658355 +v 1.840194 1.164044 -3.595775 +v 1.840194 1.226624 -3.519521 +v 1.840194 1.273126 -3.432523 +v 1.840194 1.301761 -3.338125 +v 1.840194 1.311430 -3.239954 +v 1.840194 1.301761 -3.141783 +v 1.840194 1.273126 -3.047384 +v 1.840194 1.226624 -2.960386 +v 1.840194 1.164044 -2.884132 +v 1.840194 1.087790 -2.821552 +v 1.840194 1.000792 -2.775050 +v 1.840194 0.906393 -2.746415 +v 1.840194 0.808222 -2.736746 +v 1.840194 0.710051 -2.746415 +v 1.840194 0.615653 -2.775050 +v 1.840194 0.528655 -2.821552 +v 1.840194 0.452401 -2.884132 +v 1.840194 0.389820 -2.960387 +v 1.840194 0.343319 -3.047385 +v 1.840194 0.314684 -3.141783 +v 1.840194 0.305014 -3.239954 +v 1.840194 0.314684 -3.338125 +v 1.840194 0.343320 -3.432523 +v 1.840194 0.389821 -3.519521 +v 1.840194 0.452401 -3.595775 +v 1.840194 0.528656 -3.658356 +v 1.840194 0.615654 -3.704857 +v 1.840194 0.710052 -3.733493 +v 1.353033 0.808222 -4.058591 +v 1.353033 0.967930 -4.042861 +v 1.353033 1.121501 -3.996275 +v 1.353033 1.263033 -3.920625 +v 1.353033 1.387086 -3.818817 +v 1.353033 1.488894 -3.694764 +v 1.353033 1.564544 -3.553232 +v 1.353033 1.611130 -3.399662 +v 1.353033 1.626859 -3.239954 +v 1.353033 1.611130 -3.080245 +v 1.353033 1.564544 -2.926675 +v 1.353033 1.488894 -2.785143 +v 1.353033 1.387086 -2.661090 +v 1.353033 1.263033 -2.559282 +v 1.353033 1.121501 -2.483632 +v 1.353033 0.967930 -2.437047 +v 1.353033 0.808222 -2.421317 +v 1.353033 0.648514 -2.437047 +v 1.353033 0.494943 -2.483632 +v 1.353033 0.353412 -2.559282 +v 1.353033 0.229358 -2.661090 +v 1.353033 0.127550 -2.785143 +v 1.353033 0.051900 -2.926675 +v 1.353033 0.005315 -3.080246 +v 1.353033 -0.010415 -3.239954 +v 1.353033 0.005316 -3.399662 +v 1.353033 0.051901 -3.553233 +v 1.353033 0.127551 -3.694765 +v 1.353033 0.229359 -3.818818 +v 1.353033 0.353413 -3.920626 +v 1.353033 0.494945 -3.996276 +v 1.353033 0.648515 -4.042861 +v 1.750241 2.023547 4.365501 +v 1.284501 1.900495 4.727822 +v 1.750241 1.928161 4.357363 +v 1.284501 1.840112 4.710514 +v 1.269853 1.906111 4.686014 +v 1.735593 2.029163 4.323693 +v 1.735593 1.933777 4.315555 +v 1.269853 1.845728 4.668705 +v -0.014648 1.905965 4.688289 +v -0.014648 1.845915 4.670260 +v 1.301011 0.808222 2.697971 +v 1.301011 0.941214 2.711070 +v 1.301011 1.069095 2.749862 +v 1.301011 1.186951 2.812857 +v 1.301011 1.290252 2.897634 +v 1.301011 1.375030 3.000936 +v 1.301011 1.438025 3.118792 +v 1.301011 1.476817 3.246672 +v 1.301011 1.489915 3.379664 +v 1.301011 1.476817 3.512656 +v 1.301011 1.438025 3.640537 +v 1.301011 1.375030 3.758393 +v 1.301011 1.290252 3.861694 +v 1.301011 1.186951 3.946471 +v 1.301011 1.069095 4.009467 +v 1.301011 0.941214 4.048259 +v 1.301011 0.808222 4.061357 +v 1.301011 0.675230 4.048259 +v 1.301011 0.547349 4.009467 +v 1.301011 0.429494 3.946471 +v 1.301011 0.326192 3.861694 +v 1.301011 0.241415 3.758393 +v 1.301011 0.178420 3.640537 +v 1.301011 0.139627 3.512655 +v 1.301011 0.126529 3.379664 +v 1.301011 0.139628 3.246672 +v 1.301011 0.178420 3.118791 +v 1.301011 0.241416 3.000935 +v 1.301011 0.326193 2.897634 +v 1.301011 0.429495 2.812857 +v 1.301011 0.547351 2.749862 +v 1.301011 0.675231 2.711069 +v 1.591977 0.808222 3.304218 +v -0.159445 0.808222 3.304218 +v -0.159445 0.808222 3.304218 +v 1.591977 0.808222 3.304218 +v -0.159445 0.793497 3.305668 +v 1.591977 0.793497 3.305668 +v -0.159445 0.779338 3.309963 +v 1.591977 0.779338 3.309963 +v -0.159445 0.766289 3.316938 +v 1.591977 0.766289 3.316938 +v -0.159445 0.754852 3.326325 +v 1.591977 0.754852 3.326325 +v -0.159445 0.745465 3.337763 +v 1.591977 0.745465 3.337763 +v -0.159445 0.738490 3.350811 +v 1.591977 0.738490 3.350811 +v -0.159445 0.734195 3.364970 +v 1.591977 0.734195 3.364970 +v -0.159445 0.732745 3.379695 +v 1.591977 0.732745 3.379695 +v -0.159445 0.734195 3.394420 +v 1.591977 0.734195 3.394420 +v -0.159445 0.738490 3.408579 +v 1.591977 0.738490 3.408579 +v -0.159445 0.745465 3.421628 +v 1.591977 0.745465 3.421628 +v -0.159445 0.754852 3.433066 +v 1.591977 0.754852 3.433066 +v -0.159445 0.766289 3.442452 +v 1.591977 0.766289 3.442452 +v -0.159445 0.779338 3.449427 +v 1.591977 0.779338 3.449427 +v -0.159445 0.793497 3.453722 +v 1.591977 0.793497 3.453722 +v -0.159445 0.808222 3.455173 +v 1.591977 0.808222 3.455173 +v -0.159445 0.822947 3.453722 +v 1.591977 0.822947 3.453722 +v -0.159445 0.837106 3.449427 +v 1.591977 0.837106 3.449427 +v -0.159445 0.850155 3.442452 +v 1.591977 0.850155 3.442452 +v -0.159445 0.861593 3.433066 +v 1.591977 0.861593 3.433066 +v -0.159445 0.870979 3.421628 +v 1.591977 0.870979 3.421628 +v -0.159445 0.877954 3.408579 +v 1.591977 0.877954 3.408579 +v -0.159445 0.882249 3.394420 +v 1.591977 0.882249 3.394420 +v -0.159445 0.883700 3.379695 +v 1.591977 0.883700 3.379695 +v -0.159445 0.882249 3.364970 +v 1.591977 0.882249 3.364970 +v -0.159445 0.877954 3.350811 +v 1.591977 0.877954 3.350811 +v -0.159445 0.870979 3.337762 +v 1.591977 0.870979 3.337762 +v -0.159445 0.861593 3.326325 +v 1.591977 0.861593 3.326325 +v -0.159445 0.850155 3.316938 +v 1.591977 0.850155 3.316938 +v -0.159445 0.837106 3.309963 +v 1.591977 0.837106 3.309963 +v -0.159445 0.822947 3.305668 +v 1.591977 0.822947 3.305668 +v -0.159445 0.793497 3.305668 +v 1.591977 0.793497 3.305668 +v -0.159445 0.779338 3.309963 +v 1.591977 0.779338 3.309963 +v -0.159445 0.766289 3.316938 +v 1.591977 0.766289 3.316938 +v -0.159445 0.754852 3.326325 +v 1.591977 0.754852 3.326325 +v -0.159445 0.745465 3.337763 +v 1.591977 0.745465 3.337763 +v -0.159445 0.738490 3.350811 +v 1.591977 0.738490 3.350811 +v -0.159445 0.734195 3.364970 +v 1.591977 0.734195 3.364970 +v -0.159445 0.732745 3.379695 +v 1.591977 0.732745 3.379695 +v -0.159445 0.734195 3.394420 +v 1.591977 0.734195 3.394420 +v -0.159445 0.738490 3.408579 +v 1.591977 0.738490 3.408579 +v -0.159445 0.745465 3.421628 +v 1.591977 0.745465 3.421628 +v -0.159445 0.754852 3.433066 +v 1.591977 0.754852 3.433066 +v -0.159445 0.766289 3.442452 +v 1.591977 0.766289 3.442452 +v -0.159445 0.779338 3.449427 +v 1.591977 0.779338 3.449427 +v -0.159445 0.793497 3.453722 +v 1.591977 0.793497 3.453722 +v -0.159445 0.808222 3.455173 +v 1.591977 0.808222 3.455173 +v -0.159445 0.822947 3.453722 +v 1.591977 0.822947 3.453722 +v -0.159445 0.837106 3.449427 +v 1.591977 0.837106 3.449427 +v -0.159445 0.850155 3.442452 +v 1.591977 0.850155 3.442452 +v -0.159445 0.861593 3.433066 +v 1.591977 0.861593 3.433066 +v -0.159445 0.870979 3.421628 +v 1.591977 0.870979 3.421628 +v -0.159445 0.877954 3.408579 +v 1.591977 0.877954 3.408579 +v -0.159445 0.882249 3.394420 +v 1.591977 0.882249 3.394420 +v -0.159445 0.883700 3.379695 +v 1.591977 0.883700 3.379695 +v -0.159445 0.882249 3.364970 +v 1.591977 0.882249 3.364970 +v -0.159445 0.877954 3.350811 +v 1.591977 0.877954 3.350811 +v -0.159445 0.870979 3.337762 +v 1.591977 0.870979 3.337762 +v -0.159445 0.861593 3.326325 +v 1.591977 0.861593 3.326325 +v -0.159445 0.850155 3.316938 +v 1.591977 0.850155 3.316938 +v -0.159445 0.837106 3.309963 +v 1.591977 0.837106 3.309963 +v -0.159445 0.822947 3.305668 +v 1.591977 0.822947 3.305668 +v 1.591977 0.808222 -3.306741 +v -0.159445 0.808222 -3.306741 +v -0.159445 0.793497 -3.305290 +v 1.591977 0.793497 -3.305290 +v -0.159445 0.779338 -3.300995 +v 1.591977 0.779338 -3.300995 +v -0.159445 0.766289 -3.294020 +v 1.591977 0.766289 -3.294020 +v -0.159445 0.754852 -3.284634 +v 1.591977 0.754852 -3.284634 +v -0.159445 0.745465 -3.273196 +v 1.591977 0.745465 -3.273196 +v -0.159445 0.738490 -3.260147 +v 1.591977 0.738490 -3.260147 +v -0.159445 0.734195 -3.245988 +v 1.591977 0.734195 -3.245988 +v -0.159445 0.732745 -3.231263 +v 1.591977 0.732745 -3.231263 +v -0.159445 0.734195 -3.216538 +v 1.591977 0.734195 -3.216538 +v -0.159445 0.738490 -3.202379 +v 1.591977 0.738490 -3.202379 +v -0.159445 0.745465 -3.189330 +v 1.591977 0.745465 -3.189330 +v -0.159445 0.754852 -3.177893 +v 1.591977 0.754852 -3.177893 +v -0.159445 0.766289 -3.168506 +v 1.591977 0.766289 -3.168506 +v -0.159445 0.779338 -3.161531 +v 1.591977 0.779338 -3.161531 +v -0.159445 0.793497 -3.157236 +v 1.591977 0.793497 -3.157236 +v -0.159445 0.808222 -3.155786 +v 1.591977 0.808222 -3.155786 +v -0.159445 0.822947 -3.157236 +v 1.591977 0.822947 -3.157236 +v -0.159445 0.837106 -3.161531 +v 1.591977 0.837106 -3.161531 +v -0.159445 0.850155 -3.168506 +v 1.591977 0.850155 -3.168506 +v -0.159445 0.861593 -3.177893 +v 1.591977 0.861593 -3.177893 +v -0.159445 0.870979 -3.189330 +v 1.591977 0.870979 -3.189330 +v -0.159445 0.877954 -3.202379 +v 1.591977 0.877954 -3.202379 +v -0.159445 0.882249 -3.216538 +v 1.591977 0.882249 -3.216538 +v -0.159445 0.883700 -3.231263 +v 1.591977 0.883700 -3.231263 +v -0.159445 0.882249 -3.245988 +v 1.591977 0.882249 -3.245988 +v -0.159445 0.877954 -3.260147 +v 1.591977 0.877954 -3.260147 +v -0.159445 0.870979 -3.273196 +v 1.591977 0.870979 -3.273196 +v -0.159445 0.861593 -3.284634 +v 1.591977 0.861593 -3.284634 +v -0.159445 0.850155 -3.294020 +v 1.591977 0.850155 -3.294020 +v -0.159445 0.837106 -3.300995 +v 1.591977 0.837106 -3.300995 +v -0.159445 0.822947 -3.305290 +v 1.591977 0.822947 -3.305290 +v 1.000000 3.301469 0.574261 +v 1.000000 2.051993 4.367670 +v -0.033414 2.565001 2.887454 +v 1.441406 3.301469 0.574261 +v 1.555197 2.833836 2.103204 +v 1.750241 2.051993 4.367670 +v -0.033336 2.550689 2.882889 +v 1.000079 3.259221 0.654277 +v 0.877596 2.549781 2.882589 +v 1.358550 3.258375 0.653997 +v 1.466463 2.816492 2.104779 +v 1.531234 2.548796 2.882264 +v 1.736886 2.482217 -5.209983 +v 1.750241 2.478743 -5.231385 +v 1.750241 2.374938 -5.214535 +v 1.736886 2.378413 -5.193133 +v -0.013355 2.482217 -5.209983 +v -0.013355 2.378412 -5.193133 +v 1.732752 2.482217 -5.209983 +v 1.732752 2.378413 -5.193133 +v 1.732752 2.478743 -5.231385 +v 1.732752 2.374938 -5.214535 +v 1.300982 0.808222 -3.921466 +v 1.300982 0.941178 -3.908370 +v 1.300982 1.069026 -3.869588 +v 1.300982 1.186850 -3.806610 +v 1.300982 1.290124 -3.721855 +v 1.300982 1.374879 -3.618581 +v 1.300982 1.437857 -3.500757 +v 1.300982 1.476639 -3.372910 +v 1.300982 1.489734 -3.239954 +v 1.300982 1.476639 -3.106997 +v 1.300982 1.437857 -2.979151 +v 1.300982 1.374879 -2.861326 +v 1.300982 1.290124 -2.758052 +v 1.300982 1.186850 -2.673297 +v 1.300982 1.069025 -2.610319 +v 1.300982 0.941178 -2.571537 +v 1.300982 0.808222 -2.558442 +v 1.300982 0.675266 -2.571537 +v 1.300982 0.547419 -2.610319 +v 1.300982 0.429594 -2.673297 +v 1.300982 0.326320 -2.758052 +v 1.300982 0.241566 -2.861326 +v 1.300982 0.178587 -2.979151 +v 1.300982 0.139805 -3.106998 +v 1.300982 0.126710 -3.239954 +v 1.300982 0.139806 -3.372911 +v 1.300982 0.178588 -3.500757 +v 1.300982 0.241566 -3.618582 +v 1.300982 0.326321 -3.721856 +v 1.300982 0.429595 -3.806610 +v 1.300982 0.547420 -3.869589 +v 1.300982 0.675267 -3.908370 +v -1.000000 1.919617 4.732432 +v -1.000000 0.974478 4.635892 +v 0.000000 3.301469 0.574261 +v -1.000000 3.273532 0.658841 +v 0.000000 1.086208 -5.076335 +v 0.000000 1.919617 4.732432 +v 0.000000 0.971679 4.663217 +v 0.000000 2.525397 -5.238923 +v -1.000000 0.655211 2.310734 +v 0.000000 0.655211 2.310734 +v -0.877517 2.564093 2.887154 +v 0.000000 2.051993 4.367670 +v 0.000000 0.882397 4.314609 +v -1.000000 0.882397 4.314609 +v 0.000000 3.067818 -1.579714 +v -1.000000 3.067818 -1.579714 +v -1.000000 0.667890 -2.227377 +v 0.000000 0.667890 -2.227377 +v -1.000000 0.785508 -4.214180 +v 0.000000 0.785508 -4.214180 +v 0.000000 2.638943 -4.453823 +v -1.000000 2.638943 -4.453823 +v -1.000000 0.874439 4.244418 +v -1.000000 0.655517 2.313426 +v -1.000000 1.111976 2.351255 +v -1.000000 1.866242 2.835600 +v -1.000000 1.833448 3.907717 +v -1.000000 1.258289 4.260885 +v -1.000000 0.668172 -2.232137 +v -1.000000 1.196988 -2.260916 +v -1.000000 1.854486 -2.740417 +v -1.000000 1.879915 -3.782969 +v -1.000000 1.335027 -4.186186 +v -1.750241 2.525397 -5.238923 +v -1.750241 1.086208 -5.076335 +v -1.284501 1.919617 4.732432 +v -1.327607 0.971679 4.653199 +v -1.531155 2.563108 2.886828 +v -1.531797 3.067818 -1.579714 +v -1.358472 3.272686 0.658562 +v -1.466385 2.830804 2.109343 +v -1.750241 0.655211 2.182597 +v -1.750241 0.882397 4.314609 +v -1.750241 0.667890 -2.227377 +v -1.697931 2.638943 -4.453823 +v -1.750241 2.485732 -4.434013 +v -1.750241 2.160423 2.167351 +v -1.750241 2.354560 -1.772200 +v -1.818752 0.655211 2.182857 +v -1.819952 0.655517 2.313426 +v -1.819952 0.874439 4.244418 +v -1.750241 0.882397 4.314609 +v -1.750241 1.128912 2.225720 +v -1.819952 1.111976 2.351255 +v -1.750241 1.985622 2.765436 +v -1.819952 1.866242 2.835600 +v -1.750241 1.936693 3.953938 +v -1.819952 1.833448 3.907717 +v -1.750241 1.341437 4.333489 +v -1.819952 1.258289 4.260885 +v -1.750241 0.883422 2.180506 +v -1.750241 1.591581 -4.318402 +v -1.750224 0.785508 -4.214180 +v -1.750241 0.833292 -4.351184 +v -1.820337 0.668172 -2.232137 +v -1.750241 0.667890 -2.048774 +v -1.820337 1.196988 -2.260916 +v -1.793278 1.210958 -2.101550 +v -1.820337 1.854486 -2.740417 +v -1.750241 1.987285 -2.642222 +v -1.820337 1.879915 -3.782969 +v -1.750241 2.014194 -3.854774 +v -1.820337 1.335027 -4.186186 +v -1.750241 1.350402 -4.282620 +v -1.712797 0.888017 2.180506 +v -1.819131 0.883519 2.180886 +v -1.720162 0.917570 -2.072449 +v -1.717040 0.905044 -0.269841 +v -1.750241 0.900970 -0.269841 +v -1.818854 0.655211 2.182597 +v -1.818854 0.667890 -2.048774 +v -1.818854 0.655211 2.182857 +v -1.818854 0.883422 2.180506 +v -1.818854 0.913878 -2.072449 +v -1.818854 0.900970 -0.269841 +v -1.750241 2.253663 0.275267 +v -1.772394 1.127157 2.177967 +v -1.750241 1.213567 -4.300763 +v -1.750241 1.289006 -5.099246 +v -1.750181 1.335027 -4.186186 +v -1.819927 1.289006 -5.099246 +v -1.819927 1.086208 -5.076335 +v -1.819927 0.833292 -4.351184 +v -1.819927 1.213567 -4.300763 +v -1.750215 1.204111 -4.203537 +v -1.750241 0.833292 -4.351184 +v -1.750241 1.213567 -4.300763 +v -1.819927 0.833292 -4.351184 +v -1.819927 1.213567 -4.300763 +v -1.750241 0.784857 -4.213239 +v -1.750241 1.204197 -4.203453 +v -1.819927 0.784857 -4.213239 +v -1.819927 1.204197 -4.203453 +v 0.000000 1.288997 -5.099216 +v -1.750241 1.289002 -5.099215 +v 0.000000 1.266547 -4.861532 +v -1.750241 1.266550 -4.861531 +v 0.000000 1.372881 -4.864861 +v -1.750241 1.372882 -4.864861 +v 0.000000 1.389481 -5.059558 +v -1.750241 1.389482 -5.059558 +v -1.704873 1.213566 -4.300773 +v -1.704873 1.350401 -4.282630 +v -1.704814 1.335025 -4.186196 +v -1.704847 1.204110 -4.203547 +v -1.704873 1.289004 -5.099256 +v -1.704873 1.372881 -4.864871 +v -1.704873 1.266549 -4.861541 +v -1.000000 1.335027 -4.186186 +v -1.750181 1.335027 -4.186186 +v -1.704813 1.335027 -4.186186 +v -0.999869 0.785508 -4.214180 +v -1.704605 1.335027 -4.186186 +v -1.781390 1.163258 0.334393 +v -1.715989 0.900825 0.337296 +v -1.597979 2.686126 2.117274 +v -1.695288 2.350152 2.149278 +v -1.568109 2.947990 -1.569140 +v -1.682906 2.571904 -1.628006 +v -1.470975 3.199804 0.572917 +v -1.497593 3.130800 -0.014067 +v -1.688418 2.473200 0.053302 +v -1.689320 2.457031 0.328725 +v -1.488895 3.153348 0.177737 +v -1.562110 2.963541 -1.436855 +v -1.683560 2.560198 -1.428613 +v -1.570283 2.798146 1.780491 +v -1.694388 2.366281 1.874541 +v -1.586019 2.734497 1.971851 +v -1.695039 2.354623 2.073121 +v -1.703611 2.262414 3.349329 +v -1.671976 2.347888 2.072812 +v -1.672225 2.343417 2.148969 +v -1.547219 2.791411 1.780182 +v -1.447912 3.193069 0.572608 +v -1.660496 2.553463 -1.428922 +v -1.665354 2.466465 0.052993 +v -1.474530 3.124065 -0.014376 +v -1.465832 3.146613 0.177428 +v -1.666257 2.450296 0.328416 +v -1.539047 2.956806 -1.437164 +v -1.671325 2.359546 1.874232 +v -1.574915 2.679392 2.116965 +v -1.562956 2.727762 1.971541 +v -1.680548 2.255679 3.349020 +v -1.555592 2.944302 -1.569304 +v -1.670389 2.568216 -1.628170 +v -1.549594 2.959853 -1.437019 +v -1.476379 3.149660 0.177573 +v -1.485076 3.127112 -0.014231 +v -1.675901 2.469512 0.053138 +v -1.676804 2.453343 0.328561 +v -1.671043 2.556510 -1.428777 +v -1.573503 2.730809 1.971686 +v -1.557766 2.794458 1.780327 +v -1.681871 2.362593 1.874377 +v -1.682522 2.350935 2.072957 +v -1.750241 1.263441 4.331896 +v -1.327607 1.287596 4.716530 +v 0.000000 1.287597 4.726548 +v -1.284501 1.284919 4.656356 +v 0.000000 1.291921 4.656356 +v -1.393376 1.287596 4.679573 +v -1.393376 0.971679 4.616242 +v -1.816010 0.882397 4.314609 +v -1.816010 1.263441 4.331896 +v -1.754250 1.258442 4.260794 +v -1.754033 0.874437 4.244418 +v -1.820019 1.258442 4.260794 +v -1.819803 0.874437 4.244418 +v -1.846744 0.800318 3.491142 +v -1.846744 0.720480 3.445081 +v -1.846744 0.706713 3.353942 +v -1.846744 0.769385 3.286355 +v -1.846744 0.861302 3.293214 +v -1.846744 0.913249 3.369355 +v -1.846744 0.886108 3.457441 +v -1.882362 0.798209 3.519400 +v -1.882362 0.697072 3.461051 +v -1.882362 0.679633 3.345598 +v -1.882362 0.759025 3.259980 +v -1.882362 0.875463 3.268670 +v -1.882362 0.941268 3.365122 +v -1.882362 0.906887 3.476708 +v -1.846744 0.792024 3.602285 +v -1.846744 0.628413 3.507893 +v -1.846744 0.600203 3.321125 +v -1.846744 0.728635 3.182619 +v -1.846744 0.916998 3.196676 +v -1.846744 1.023451 3.352709 +v -1.846744 0.967832 3.533221 +v -1.846744 0.658244 3.340309 +v -1.846744 0.677849 3.463600 +v -1.846744 0.683943 3.472385 +v -1.846744 0.792559 3.533928 +v -1.846744 0.553669 3.971039 +v -1.846744 0.431761 3.901965 +v -1.846744 0.780979 2.736408 +v -1.846744 0.920785 2.745747 +v -1.846744 0.879964 3.242204 +v -1.846744 0.755402 3.233883 +v -1.846744 0.745481 3.237870 +v -1.846744 0.661312 3.330068 +v -1.846744 0.288318 2.999900 +v -1.846744 0.382787 2.896419 +v -1.846744 0.783949 2.806544 +v -1.846744 0.908512 2.814866 +v -1.846744 1.241172 3.003353 +v -1.846744 1.312330 3.105928 +v -1.846744 1.372374 3.483531 +v -1.846744 1.336544 3.603119 +v -1.846744 1.078759 3.885496 +v -1.846744 0.962922 3.932045 +v -1.846744 0.581424 3.906559 +v -1.846744 0.472808 3.845017 +v -1.846744 0.254873 3.530860 +v -1.846744 0.235268 3.407569 +v -1.846744 0.345005 3.041307 +v -1.846744 0.429174 2.949109 +v -1.846744 0.879964 3.242204 +v -1.846744 0.755402 3.233883 +v -1.846744 0.960424 3.350050 +v -1.846744 0.889266 3.247475 +v -1.846744 0.926273 3.480196 +v -1.846744 0.962103 3.360608 +v -1.846744 0.803227 3.534641 +v -1.846744 0.919064 3.488092 +v -1.846744 0.683943 3.472385 +v -1.846744 0.792559 3.533928 +v -1.846744 0.658244 3.340309 +v -1.846744 0.677849 3.463600 +v -1.846744 0.745481 3.237870 +v -1.846744 0.661312 3.330068 +v -1.846744 0.165151 3.410984 +v -1.846744 0.187155 3.549363 +v -1.846744 1.401199 3.630465 +v -1.846744 1.441414 3.496242 +v -1.846744 0.962103 3.360608 +v -1.846744 0.926273 3.480196 +v -1.846744 0.919064 3.488092 +v -1.846744 0.803227 3.534641 +v -1.846744 0.981853 3.999644 +v -1.846744 1.111866 3.947399 +v -1.846744 0.889266 3.247475 +v -1.846744 0.960424 3.350050 +v -1.846744 1.374021 3.072428 +v -1.846744 1.294155 2.957301 +v -1.865511 0.904784 3.474123 +v -1.865511 0.803871 3.514674 +v -1.865511 1.359836 3.481223 +v -1.865511 0.942278 3.363063 +v -1.865511 0.267171 3.527500 +v -1.865511 0.694646 3.452786 +v -1.865511 0.677567 3.345380 +v -1.865511 0.248002 3.406949 +v -1.865511 0.699955 3.460439 +v -1.865511 0.480262 3.834674 +v -1.865511 0.586465 3.894849 +v -1.865511 0.794577 3.514053 +v -1.865511 0.911063 3.467244 +v -1.865511 1.324802 3.598153 +v -1.865511 0.906283 2.827418 +v -1.865511 0.784489 2.819282 +v -1.865511 0.762207 3.252665 +v -1.865511 0.870721 3.259914 +v -1.865511 0.753565 3.256138 +v -1.865511 0.437599 2.958678 +v -1.865511 0.680240 3.336458 +v -1.865511 0.355300 3.048827 +v -1.865511 0.959483 3.919768 +v -1.865511 1.072746 3.874254 +v -1.865511 0.878825 3.264505 +v -1.865511 0.940815 3.353865 +v -1.865511 1.301126 3.112011 +v -1.865511 1.231549 3.011716 +v -1.846743 0.808222 2.561027 +v -1.846743 0.967930 2.576757 +v -1.846743 1.121501 2.623343 +v -1.846743 1.263033 2.698993 +v -1.846743 1.387086 2.800801 +v -1.846743 1.488894 2.924854 +v -1.846743 1.564544 3.066386 +v -1.846743 1.611130 3.219956 +v -1.846743 1.626859 3.379664 +v -1.846743 1.611130 3.539372 +v -1.846743 1.564544 3.692943 +v -1.846743 1.488894 3.834475 +v -1.846743 1.387086 3.958528 +v -1.846743 1.263033 4.060336 +v -1.846743 1.121501 4.135986 +v -1.846743 0.967930 4.182571 +v -1.846743 0.808222 4.198301 +v -1.846743 0.648514 4.182571 +v -1.846743 0.494943 4.135986 +v -1.846743 0.353412 4.060336 +v -1.846743 0.229358 3.958528 +v -1.846743 0.127550 3.834475 +v -1.846743 0.051900 3.692943 +v -1.846743 0.005315 3.539372 +v -1.846743 -0.010415 3.379664 +v -1.846743 0.005316 3.219955 +v -1.846743 0.051901 3.066385 +v -1.846743 0.127551 2.924853 +v -1.846743 0.229359 2.800800 +v -1.846743 0.353413 2.698992 +v -1.846743 0.494945 2.623342 +v -1.846743 0.648515 2.576757 +v -1.888794 0.808222 2.638682 +v -1.888794 0.952781 2.652920 +v -1.888794 1.091784 2.695086 +v -1.888794 1.219890 2.763560 +v -1.888794 1.332176 2.855711 +v -1.888794 1.424327 2.967997 +v -1.888794 1.492801 3.096102 +v -1.888794 1.534967 3.235106 +v -1.888794 1.549205 3.379664 +v -1.888794 1.534967 3.524223 +v -1.888794 1.492801 3.663226 +v -1.888794 1.424327 3.791332 +v -1.888794 1.332176 3.903618 +v -1.888794 1.219890 3.995769 +v -1.888794 1.091784 4.064243 +v -1.888794 0.952781 4.106409 +v -1.888794 0.808222 4.120646 +v -1.888794 0.663664 4.106409 +v -1.888794 0.524660 4.064243 +v -1.888794 0.396554 3.995769 +v -1.888794 0.284268 3.903618 +v -1.888794 0.192118 3.791332 +v -1.888794 0.123644 3.663225 +v -1.888794 0.081477 3.524222 +v -1.888794 0.067240 3.379664 +v -1.888794 0.081478 3.235105 +v -1.888794 0.123644 3.096102 +v -1.888794 0.192118 2.967996 +v -1.888794 0.284269 2.855710 +v -1.888794 0.396555 2.763560 +v -1.888794 0.524662 2.695086 +v -1.888794 0.663665 2.652919 +v -1.855595 0.808222 2.738160 +v -1.855595 0.933374 2.750486 +v -1.855595 1.053715 2.786992 +v -1.855595 1.164623 2.846273 +v -1.855595 1.261834 2.926052 +v -1.855595 1.341614 3.023264 +v -1.855595 1.400895 3.134171 +v -1.855595 1.437400 3.254513 +v -1.855595 1.449726 3.379664 +v -1.855595 1.437400 3.504816 +v -1.855595 1.400895 3.625157 +v -1.855595 1.341614 3.736065 +v -1.855595 1.261834 3.833276 +v -1.855595 1.164623 3.913055 +v -1.855595 1.053715 3.972337 +v -1.855595 0.933373 4.008842 +v -1.855595 0.808222 4.021168 +v -1.855595 0.683071 4.008842 +v -1.855595 0.562729 3.972337 +v -1.855595 0.451821 3.913055 +v -1.855595 0.354610 3.833276 +v -1.855595 0.274831 3.736065 +v -1.855595 0.215550 3.625157 +v -1.855595 0.179044 3.504815 +v -1.855595 0.166718 3.379664 +v -1.855595 0.179045 3.254513 +v -1.855595 0.215550 3.134171 +v -1.855595 0.274832 3.023263 +v -1.855595 0.354611 2.926052 +v -1.855595 0.451823 2.846273 +v -1.855595 0.562730 2.786992 +v -1.855595 0.683072 2.750486 +v -1.840194 0.808222 2.876457 +v -1.840194 0.906393 2.886126 +v -1.840194 1.000792 2.914761 +v -1.840194 1.087790 2.961263 +v -1.840194 1.164044 3.023843 +v -1.840194 1.226624 3.100097 +v -1.840194 1.273126 3.187095 +v -1.840194 1.301761 3.281493 +v -1.840194 1.311430 3.379664 +v -1.840194 1.301761 3.477835 +v -1.840194 1.273126 3.572234 +v -1.840194 1.226624 3.659232 +v -1.840194 1.164044 3.735486 +v -1.840194 1.087790 3.798066 +v -1.840194 1.000792 3.844568 +v -1.840194 0.906393 3.873203 +v -1.840194 0.808222 3.882872 +v -1.840194 0.710051 3.873203 +v -1.840194 0.615653 3.844568 +v -1.840194 0.528655 3.798066 +v -1.840194 0.452401 3.735486 +v -1.840194 0.389820 3.659231 +v -1.840194 0.343319 3.572233 +v -1.840194 0.314684 3.477835 +v -1.840194 0.305014 3.379664 +v -1.840194 0.314684 3.281493 +v -1.840194 0.343320 3.187095 +v -1.840194 0.389821 3.100096 +v -1.840194 0.452401 3.023843 +v -1.840194 0.528656 2.961262 +v -1.840194 0.615654 2.914761 +v -1.840194 0.710052 2.886125 +v -1.353033 0.808222 2.561027 +v -1.353033 0.967930 2.576757 +v -1.353033 1.121501 2.623343 +v -1.353033 1.263033 2.698993 +v -1.353033 1.387086 2.800801 +v -1.353033 1.488894 2.924854 +v -1.353033 1.564544 3.066386 +v -1.353033 1.611130 3.219956 +v -1.353033 1.626859 3.379664 +v -1.353033 1.611130 3.539372 +v -1.353033 1.564544 3.692943 +v -1.353033 1.488894 3.834475 +v -1.353033 1.387086 3.958528 +v -1.353033 1.263033 4.060336 +v -1.353033 1.121501 4.135986 +v -1.353033 0.967930 4.182571 +v -1.353033 0.808222 4.198301 +v -1.353033 0.648514 4.182571 +v -1.353033 0.494943 4.135986 +v -1.353033 0.353412 4.060336 +v -1.353033 0.229358 3.958528 +v -1.353033 0.127550 3.834475 +v -1.353033 0.051900 3.692943 +v -1.353033 0.005315 3.539372 +v -1.353033 -0.010415 3.379664 +v -1.353033 0.005316 3.219955 +v -1.353033 0.051901 3.066385 +v -1.353033 0.127551 2.924853 +v -1.353033 0.229359 2.800800 +v -1.353033 0.353413 2.698992 +v -1.353033 0.494945 2.623342 +v -1.353033 0.648515 2.576757 +v -1.846744 0.800318 -3.128476 +v -1.846744 0.720480 -3.174537 +v -1.846744 0.706713 -3.265676 +v -1.846744 0.769385 -3.333263 +v -1.846744 0.861302 -3.326404 +v -1.846744 0.913249 -3.250263 +v -1.846744 0.886108 -3.162177 +v -1.882362 0.798209 -3.100218 +v -1.882362 0.697072 -3.158567 +v -1.882362 0.679633 -3.274020 +v -1.882362 0.759025 -3.359638 +v -1.882362 0.875463 -3.350948 +v -1.882362 0.941268 -3.254496 +v -1.882362 0.906887 -3.142910 +v -1.846744 0.792024 -3.017333 +v -1.846744 0.628413 -3.111725 +v -1.846744 0.600203 -3.298493 +v -1.846744 0.728635 -3.436999 +v -1.846744 0.916998 -3.422941 +v -1.846744 1.023451 -3.266909 +v -1.846744 0.967832 -3.086397 +v -1.846744 0.658244 -3.279309 +v -1.846744 0.677849 -3.156018 +v -1.846744 0.683943 -3.147233 +v -1.846744 0.792559 -3.085690 +v -1.846744 0.553669 -2.648579 +v -1.846744 0.431761 -2.717653 +v -1.846744 0.780979 -3.883210 +v -1.846744 0.920785 -3.873871 +v -1.846744 0.879964 -3.377414 +v -1.846744 0.755402 -3.385735 +v -1.846744 0.745481 -3.381748 +v -1.846744 0.661312 -3.289550 +v -1.846744 0.288318 -3.619718 +v -1.846744 0.382787 -3.723199 +v -1.846744 0.783949 -3.813074 +v -1.846744 0.908512 -3.804752 +v -1.846744 1.241172 -3.616265 +v -1.846744 1.312330 -3.513690 +v -1.846744 1.372374 -3.136086 +v -1.846744 1.336544 -3.016499 +v -1.846744 1.078759 -2.734122 +v -1.846744 0.962922 -2.687573 +v -1.846744 0.581424 -2.713058 +v -1.846744 0.472808 -2.774601 +v -1.846744 0.254873 -3.088758 +v -1.846744 0.235268 -3.212049 +v -1.846744 0.345005 -3.578310 +v -1.846744 0.429174 -3.670509 +v -1.846744 0.879964 -3.377414 +v -1.846744 0.755402 -3.385735 +v -1.846744 0.960424 -3.269568 +v -1.846744 0.889266 -3.372143 +v -1.846744 0.926273 -3.139422 +v -1.846744 0.962103 -3.259010 +v -1.846744 0.803227 -3.084977 +v -1.846744 0.919064 -3.131526 +v -1.846744 0.683943 -3.147233 +v -1.846744 0.792559 -3.085690 +v -1.846744 0.658244 -3.279309 +v -1.846744 0.677849 -3.156018 +v -1.846744 0.745481 -3.381748 +v -1.846744 0.661312 -3.289550 +v -1.846744 0.165151 -3.208634 +v -1.846744 0.187155 -3.070255 +v -1.846744 1.401199 -2.989153 +v -1.846744 1.441414 -3.123376 +v -1.846744 0.962103 -3.259010 +v -1.846744 0.926273 -3.139422 +v -1.846744 0.919064 -3.131526 +v -1.846744 0.803227 -3.084977 +v -1.846744 0.981853 -2.619974 +v -1.846744 1.111866 -2.672219 +v -1.846744 0.889266 -3.372143 +v -1.846744 0.960424 -3.269568 +v -1.846744 1.374021 -3.547190 +v -1.846744 1.294155 -3.662317 +v -1.865511 0.904784 -3.145495 +v -1.865511 0.803871 -3.104944 +v -1.865511 1.359836 -3.138395 +v -1.865511 0.942278 -3.256555 +v -1.865511 0.267171 -3.092118 +v -1.865511 0.694646 -3.166831 +v -1.865511 0.677567 -3.274238 +v -1.865511 0.248002 -3.212669 +v -1.865511 0.699955 -3.159178 +v -1.865511 0.480262 -2.784944 +v -1.865511 0.586465 -2.724769 +v -1.865511 0.794577 -3.105565 +v -1.865511 0.911063 -3.152374 +v -1.865511 1.324802 -3.021465 +v -1.865511 0.906283 -3.792200 +v -1.865511 0.784489 -3.800336 +v -1.865511 0.762207 -3.366953 +v -1.865511 0.870721 -3.359704 +v -1.865511 0.753565 -3.363480 +v -1.865511 0.437599 -3.660940 +v -1.865511 0.680240 -3.283160 +v -1.865511 0.355300 -3.570791 +v -1.865511 0.959483 -2.699850 +v -1.865511 1.072746 -2.745364 +v -1.865511 0.878825 -3.355113 +v -1.865511 0.940815 -3.265753 +v -1.865511 1.301126 -3.507607 +v -1.865511 1.231549 -3.607902 +v -1.846743 0.808222 -4.058591 +v -1.846743 0.967930 -4.042861 +v -1.846743 1.121501 -3.996275 +v -1.846743 1.263033 -3.920625 +v -1.846743 1.387086 -3.818817 +v -1.846743 1.488894 -3.694764 +v -1.846743 1.564544 -3.553232 +v -1.846743 1.611130 -3.399662 +v -1.846743 1.626859 -3.239954 +v -1.846743 1.611130 -3.080245 +v -1.846743 1.564544 -2.926675 +v -1.846743 1.488894 -2.785143 +v -1.846743 1.387086 -2.661090 +v -1.846743 1.263033 -2.559282 +v -1.846743 1.121501 -2.483632 +v -1.846743 0.967930 -2.437047 +v -1.846743 0.808222 -2.421317 +v -1.846743 0.648514 -2.437047 +v -1.846743 0.494943 -2.483632 +v -1.846743 0.353412 -2.559282 +v -1.846743 0.229358 -2.661090 +v -1.846743 0.127550 -2.785143 +v -1.846743 0.051900 -2.926675 +v -1.846743 0.005315 -3.080246 +v -1.846743 -0.010415 -3.239954 +v -1.846743 0.005316 -3.399662 +v -1.846743 0.051901 -3.553233 +v -1.846743 0.127551 -3.694765 +v -1.846743 0.229359 -3.818818 +v -1.846743 0.353413 -3.920626 +v -1.846743 0.494945 -3.996276 +v -1.846743 0.648515 -4.042861 +v -1.888794 0.808222 -3.980936 +v -1.888794 0.952781 -3.966698 +v -1.888794 1.091784 -3.924532 +v -1.888794 1.219890 -3.856058 +v -1.888794 1.332176 -3.763907 +v -1.888794 1.424327 -3.651621 +v -1.888794 1.492801 -3.523515 +v -1.888794 1.534967 -3.384512 +v -1.888794 1.549205 -3.239954 +v -1.888794 1.534967 -3.095395 +v -1.888794 1.492801 -2.956392 +v -1.888794 1.424327 -2.828286 +v -1.888794 1.332176 -2.716000 +v -1.888794 1.219890 -2.623849 +v -1.888794 1.091784 -2.555375 +v -1.888794 0.952781 -2.513209 +v -1.888794 0.808222 -2.498971 +v -1.888794 0.663664 -2.513209 +v -1.888794 0.524660 -2.555375 +v -1.888794 0.396554 -2.623849 +v -1.888794 0.284268 -2.716000 +v -1.888794 0.192118 -2.828286 +v -1.888794 0.123644 -2.956393 +v -1.888794 0.081477 -3.095396 +v -1.888794 0.067240 -3.239954 +v -1.888794 0.081478 -3.384513 +v -1.888794 0.123644 -3.523516 +v -1.888794 0.192118 -3.651622 +v -1.888794 0.284269 -3.763908 +v -1.888794 0.396555 -3.856058 +v -1.888794 0.524662 -3.924532 +v -1.888794 0.663665 -3.966699 +v -1.855595 0.808222 -3.881458 +v -1.855595 0.933374 -3.869132 +v -1.855595 1.053715 -3.832626 +v -1.855595 1.164623 -3.773345 +v -1.855595 1.261834 -3.693566 +v -1.855595 1.341614 -3.596354 +v -1.855595 1.400895 -3.485447 +v -1.855595 1.437400 -3.365105 +v -1.855595 1.449726 -3.239954 +v -1.855595 1.437400 -3.114802 +v -1.855595 1.400895 -2.994461 +v -1.855595 1.341614 -2.883553 +v -1.855595 1.261834 -2.786342 +v -1.855595 1.164623 -2.706563 +v -1.855595 1.053715 -2.647281 +v -1.855595 0.933373 -2.610775 +v -1.855595 0.808222 -2.598450 +v -1.855595 0.683071 -2.610775 +v -1.855595 0.562729 -2.647281 +v -1.855595 0.451821 -2.706563 +v -1.855595 0.354610 -2.786342 +v -1.855595 0.274831 -2.883553 +v -1.855595 0.215550 -2.994461 +v -1.855595 0.179044 -3.114803 +v -1.855595 0.166718 -3.239954 +v -1.855595 0.179045 -3.365105 +v -1.855595 0.215550 -3.485447 +v -1.855595 0.274832 -3.596355 +v -1.855595 0.354611 -3.693566 +v -1.855595 0.451823 -3.773345 +v -1.855595 0.562730 -3.832626 +v -1.855595 0.683072 -3.869132 +v -1.840194 0.808222 -3.743161 +v -1.840194 0.906393 -3.733492 +v -1.840194 1.000792 -3.704857 +v -1.840194 1.087790 -3.658355 +v -1.840194 1.164044 -3.595775 +v -1.840194 1.226624 -3.519521 +v -1.840194 1.273126 -3.432523 +v -1.840194 1.301761 -3.338125 +v -1.840194 1.311430 -3.239954 +v -1.840194 1.301761 -3.141783 +v -1.840194 1.273126 -3.047384 +v -1.840194 1.226624 -2.960386 +v -1.840194 1.164044 -2.884132 +v -1.840194 1.087790 -2.821552 +v -1.840194 1.000792 -2.775050 +v -1.840194 0.906393 -2.746415 +v -1.840194 0.808222 -2.736746 +v -1.840194 0.710051 -2.746415 +v -1.840194 0.615653 -2.775050 +v -1.840194 0.528655 -2.821552 +v -1.840194 0.452401 -2.884132 +v -1.840194 0.389820 -2.960387 +v -1.840194 0.343319 -3.047385 +v -1.840194 0.314684 -3.141783 +v -1.840194 0.305014 -3.239954 +v -1.840194 0.314684 -3.338125 +v -1.840194 0.343320 -3.432523 +v -1.840194 0.389821 -3.519521 +v -1.840194 0.452401 -3.595775 +v -1.840194 0.528656 -3.658356 +v -1.840194 0.615654 -3.704857 +v -1.840194 0.710052 -3.733493 +v -1.353033 0.808222 -4.058591 +v -1.353033 0.967930 -4.042861 +v -1.353033 1.121501 -3.996275 +v -1.353033 1.263033 -3.920625 +v -1.353033 1.387086 -3.818817 +v -1.353033 1.488894 -3.694764 +v -1.353033 1.564544 -3.553232 +v -1.353033 1.611130 -3.399662 +v -1.353033 1.626859 -3.239954 +v -1.353033 1.611130 -3.080245 +v -1.353033 1.564544 -2.926675 +v -1.353033 1.488894 -2.785143 +v -1.353033 1.387086 -2.661090 +v -1.353033 1.263033 -2.559282 +v -1.353033 1.121501 -2.483632 +v -1.353033 0.967930 -2.437047 +v -1.353033 0.808222 -2.421317 +v -1.353033 0.648514 -2.437047 +v -1.353033 0.494943 -2.483632 +v -1.353033 0.353412 -2.559282 +v -1.353033 0.229358 -2.661090 +v -1.353033 0.127550 -2.785143 +v -1.353033 0.051900 -2.926675 +v -1.353033 0.005315 -3.080246 +v -1.353033 -0.010415 -3.239954 +v -1.353033 0.005316 -3.399662 +v -1.353033 0.051901 -3.553233 +v -1.353033 0.127551 -3.694765 +v -1.353033 0.229359 -3.818818 +v -1.353033 0.353413 -3.920626 +v -1.353033 0.494945 -3.996276 +v -1.353033 0.648515 -4.042861 +v -1.750241 2.023547 4.365501 +v -1.284501 1.900495 4.727822 +v -1.750241 1.928161 4.357363 +v -1.284501 1.840112 4.710514 +v 0.000000 1.840300 4.712069 +v 0.000000 1.900349 4.730097 +v -1.269853 1.906111 4.686014 +v -1.735593 2.029163 4.323693 +v -1.735593 1.933777 4.315555 +v -1.269853 1.845728 4.668705 +v 0.014648 1.905965 4.688289 +v 0.014648 1.845915 4.670260 +v -1.301011 0.808222 2.697971 +v -1.301011 0.941214 2.711070 +v -1.301011 1.069095 2.749862 +v -1.301011 1.186951 2.812857 +v -1.301011 1.290252 2.897634 +v -1.301011 1.375030 3.000936 +v -1.301011 1.438025 3.118792 +v -1.301011 1.476817 3.246672 +v -1.301011 1.489915 3.379664 +v -1.301011 1.476817 3.512656 +v -1.301011 1.438025 3.640537 +v -1.301011 1.375030 3.758393 +v -1.301011 1.290252 3.861694 +v -1.301011 1.186951 3.946471 +v -1.301011 1.069095 4.009467 +v -1.301011 0.941214 4.048259 +v -1.301011 0.808222 4.061357 +v -1.301011 0.675230 4.048259 +v -1.301011 0.547349 4.009467 +v -1.301011 0.429494 3.946471 +v -1.301011 0.326192 3.861694 +v -1.301011 0.241415 3.758393 +v -1.301011 0.178420 3.640537 +v -1.301011 0.139627 3.512655 +v -1.301011 0.126529 3.379664 +v -1.301011 0.139628 3.246672 +v -1.301011 0.178420 3.118791 +v -1.301011 0.241416 3.000935 +v -1.301011 0.326193 2.897634 +v -1.301011 0.429495 2.812857 +v -1.301011 0.547351 2.749862 +v -1.301011 0.675231 2.711069 +v -1.591977 0.808222 3.304218 +v 0.159445 0.808222 3.304218 +v 0.159445 0.808222 3.304218 +v -1.591977 0.808222 3.304218 +v 0.159445 0.793497 3.305668 +v -1.591977 0.793497 3.305668 +v 0.159445 0.779338 3.309963 +v -1.591977 0.779338 3.309963 +v 0.159445 0.766289 3.316938 +v -1.591977 0.766289 3.316938 +v 0.159445 0.754852 3.326325 +v -1.591977 0.754852 3.326325 +v 0.159445 0.745465 3.337763 +v -1.591977 0.745465 3.337763 +v 0.159445 0.738490 3.350811 +v -1.591977 0.738490 3.350811 +v 0.159445 0.734195 3.364970 +v -1.591977 0.734195 3.364970 +v 0.159445 0.732745 3.379695 +v -1.591977 0.732745 3.379695 +v 0.159445 0.734195 3.394420 +v -1.591977 0.734195 3.394420 +v 0.159445 0.738490 3.408579 +v -1.591977 0.738490 3.408579 +v 0.159445 0.745465 3.421628 +v -1.591977 0.745465 3.421628 +v 0.159445 0.754852 3.433066 +v -1.591977 0.754852 3.433066 +v 0.159445 0.766289 3.442452 +v -1.591977 0.766289 3.442452 +v 0.159445 0.779338 3.449427 +v -1.591977 0.779338 3.449427 +v 0.159445 0.793497 3.453722 +v -1.591977 0.793497 3.453722 +v 0.159445 0.808222 3.455173 +v -1.591977 0.808222 3.455173 +v 0.159445 0.822947 3.453722 +v -1.591977 0.822947 3.453722 +v 0.159445 0.837106 3.449427 +v -1.591977 0.837106 3.449427 +v 0.159445 0.850155 3.442452 +v -1.591977 0.850155 3.442452 +v 0.159445 0.861593 3.433066 +v -1.591977 0.861593 3.433066 +v 0.159445 0.870979 3.421628 +v -1.591977 0.870979 3.421628 +v 0.159445 0.877954 3.408579 +v -1.591977 0.877954 3.408579 +v 0.159445 0.882249 3.394420 +v -1.591977 0.882249 3.394420 +v 0.159445 0.883700 3.379695 +v -1.591977 0.883700 3.379695 +v 0.159445 0.882249 3.364970 +v -1.591977 0.882249 3.364970 +v 0.159445 0.877954 3.350811 +v -1.591977 0.877954 3.350811 +v 0.159445 0.870979 3.337762 +v -1.591977 0.870979 3.337762 +v 0.159445 0.861593 3.326325 +v -1.591977 0.861593 3.326325 +v 0.159445 0.850155 3.316938 +v -1.591977 0.850155 3.316938 +v 0.159445 0.837106 3.309963 +v -1.591977 0.837106 3.309963 +v 0.159445 0.822947 3.305668 +v -1.591977 0.822947 3.305668 +v 0.159445 0.793497 3.305668 +v -1.591977 0.793497 3.305668 +v 0.159445 0.779338 3.309963 +v -1.591977 0.779338 3.309963 +v 0.159445 0.766289 3.316938 +v -1.591977 0.766289 3.316938 +v 0.159445 0.754852 3.326325 +v -1.591977 0.754852 3.326325 +v 0.159445 0.745465 3.337763 +v -1.591977 0.745465 3.337763 +v 0.159445 0.738490 3.350811 +v -1.591977 0.738490 3.350811 +v 0.159445 0.734195 3.364970 +v -1.591977 0.734195 3.364970 +v 0.159445 0.732745 3.379695 +v -1.591977 0.732745 3.379695 +v 0.159445 0.734195 3.394420 +v -1.591977 0.734195 3.394420 +v 0.159445 0.738490 3.408579 +v -1.591977 0.738490 3.408579 +v 0.159445 0.745465 3.421628 +v -1.591977 0.745465 3.421628 +v 0.159445 0.754852 3.433066 +v -1.591977 0.754852 3.433066 +v 0.159445 0.766289 3.442452 +v -1.591977 0.766289 3.442452 +v 0.159445 0.779338 3.449427 +v -1.591977 0.779338 3.449427 +v 0.159445 0.793497 3.453722 +v -1.591977 0.793497 3.453722 +v 0.159445 0.808222 3.455173 +v -1.591977 0.808222 3.455173 +v 0.159445 0.822947 3.453722 +v -1.591977 0.822947 3.453722 +v 0.159445 0.837106 3.449427 +v -1.591977 0.837106 3.449427 +v 0.159445 0.850155 3.442452 +v -1.591977 0.850155 3.442452 +v 0.159445 0.861593 3.433066 +v -1.591977 0.861593 3.433066 +v 0.159445 0.870979 3.421628 +v -1.591977 0.870979 3.421628 +v 0.159445 0.877954 3.408579 +v -1.591977 0.877954 3.408579 +v 0.159445 0.882249 3.394420 +v -1.591977 0.882249 3.394420 +v 0.159445 0.883700 3.379695 +v -1.591977 0.883700 3.379695 +v 0.159445 0.882249 3.364970 +v -1.591977 0.882249 3.364970 +v 0.159445 0.877954 3.350811 +v -1.591977 0.877954 3.350811 +v 0.159445 0.870979 3.337762 +v -1.591977 0.870979 3.337762 +v 0.159445 0.861593 3.326325 +v -1.591977 0.861593 3.326325 +v 0.159445 0.850155 3.316938 +v -1.591977 0.850155 3.316938 +v 0.159445 0.837106 3.309963 +v -1.591977 0.837106 3.309963 +v 0.159445 0.822947 3.305668 +v -1.591977 0.822947 3.305668 +v -1.591977 0.808222 -3.306741 +v 0.159445 0.808222 -3.306741 +v 0.159445 0.793497 -3.305290 +v -1.591977 0.793497 -3.305290 +v 0.159445 0.779338 -3.300995 +v -1.591977 0.779338 -3.300995 +v 0.159445 0.766289 -3.294020 +v -1.591977 0.766289 -3.294020 +v 0.159445 0.754852 -3.284634 +v -1.591977 0.754852 -3.284634 +v 0.159445 0.745465 -3.273196 +v -1.591977 0.745465 -3.273196 +v 0.159445 0.738490 -3.260147 +v -1.591977 0.738490 -3.260147 +v 0.159445 0.734195 -3.245988 +v -1.591977 0.734195 -3.245988 +v 0.159445 0.732745 -3.231263 +v -1.591977 0.732745 -3.231263 +v 0.159445 0.734195 -3.216538 +v -1.591977 0.734195 -3.216538 +v 0.159445 0.738490 -3.202379 +v -1.591977 0.738490 -3.202379 +v 0.159445 0.745465 -3.189330 +v -1.591977 0.745465 -3.189330 +v 0.159445 0.754852 -3.177893 +v -1.591977 0.754852 -3.177893 +v 0.159445 0.766289 -3.168506 +v -1.591977 0.766289 -3.168506 +v 0.159445 0.779338 -3.161531 +v -1.591977 0.779338 -3.161531 +v 0.159445 0.793497 -3.157236 +v -1.591977 0.793497 -3.157236 +v 0.159445 0.808222 -3.155786 +v -1.591977 0.808222 -3.155786 +v 0.159445 0.822947 -3.157236 +v -1.591977 0.822947 -3.157236 +v 0.159445 0.837106 -3.161531 +v -1.591977 0.837106 -3.161531 +v 0.159445 0.850155 -3.168506 +v -1.591977 0.850155 -3.168506 +v 0.159445 0.861593 -3.177893 +v -1.591977 0.861593 -3.177893 +v 0.159445 0.870979 -3.189330 +v -1.591977 0.870979 -3.189330 +v 0.159445 0.877954 -3.202379 +v -1.591977 0.877954 -3.202379 +v 0.159445 0.882249 -3.216538 +v -1.591977 0.882249 -3.216538 +v 0.159445 0.883700 -3.231263 +v -1.591977 0.883700 -3.231263 +v 0.159445 0.882249 -3.245988 +v -1.591977 0.882249 -3.245988 +v 0.159445 0.877954 -3.260147 +v -1.591977 0.877954 -3.260147 +v 0.159445 0.870979 -3.273196 +v -1.591977 0.870979 -3.273196 +v 0.159445 0.861593 -3.284634 +v -1.591977 0.861593 -3.284634 +v 0.159445 0.850155 -3.294020 +v -1.591977 0.850155 -3.294020 +v 0.159445 0.837106 -3.300995 +v -1.591977 0.837106 -3.300995 +v 0.159445 0.822947 -3.305290 +v -1.591977 0.822947 -3.305290 +v -1.000000 3.301469 0.574261 +v 0.000000 3.274440 0.659141 +v -1.000000 2.051993 4.367670 +v 0.033414 2.565001 2.887454 +v -1.441406 3.301469 0.574261 +v -1.555197 2.833836 2.103204 +v -1.750241 2.051993 4.367670 +v 0.000000 3.260128 0.654576 +v 0.033336 2.550689 2.882889 +v -1.000079 3.259221 0.654277 +v -0.877596 2.549781 2.882589 +v -1.358550 3.258375 0.653997 +v -1.466463 2.816492 2.104779 +v -1.531234 2.548796 2.882264 +v -1.736886 2.482217 -5.209983 +v 0.000000 2.478743 -5.231385 +v -1.750241 2.478743 -5.231385 +v -1.750241 2.374938 -5.214535 +v 0.000000 2.374938 -5.214535 +v -1.736886 2.378413 -5.193133 +v 0.013355 2.482217 -5.209983 +v 0.013355 2.378412 -5.193133 +v -1.732752 2.482217 -5.209983 +v -1.732752 2.378413 -5.193133 +v -1.732752 2.478743 -5.231385 +v -1.732752 2.374938 -5.214535 +v -1.300982 0.808222 -3.921466 +v -1.300982 0.941178 -3.908370 +v -1.300982 1.069026 -3.869588 +v -1.300982 1.186850 -3.806610 +v -1.300982 1.290124 -3.721855 +v -1.300982 1.374879 -3.618581 +v -1.300982 1.437857 -3.500757 +v -1.300982 1.476639 -3.372910 +v -1.300982 1.489734 -3.239954 +v -1.300982 1.476639 -3.106997 +v -1.300982 1.437857 -2.979151 +v -1.300982 1.374879 -2.861326 +v -1.300982 1.290124 -2.758052 +v -1.300982 1.186850 -2.673297 +v -1.300982 1.069025 -2.610319 +v -1.300982 0.941178 -2.571537 +v -1.300982 0.808222 -2.558442 +v -1.300982 0.675266 -2.571537 +v -1.300982 0.547419 -2.610319 +v -1.300982 0.429594 -2.673297 +v -1.300982 0.326320 -2.758052 +v -1.300982 0.241566 -2.861326 +v -1.300982 0.178587 -2.979151 +v -1.300982 0.139805 -3.106998 +v -1.300982 0.126710 -3.239954 +v -1.300982 0.139806 -3.372911 +v -1.300982 0.178588 -3.500757 +v -1.300982 0.241566 -3.618582 +v -1.300982 0.326321 -3.721856 +v -1.300982 0.429595 -3.806610 +v -1.300982 0.547420 -3.869589 +v -1.300982 0.675267 -3.908370 +vt 0.625000 0.562500 +vt 0.750000 0.562500 +vt 0.750000 0.625000 +vt 0.625000 0.625000 +vt 0.625000 0.718750 +vt 0.750000 0.718750 +vt 0.750000 0.750000 +vt 0.625000 0.750000 +vt 0.634972 0.717058 +vt 0.627025 0.717322 +vt 0.627025 0.717322 +vt 0.634972 0.717058 +vt 0.625000 0.531250 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.531250 +vt 0.625000 0.562500 +vt 0.401187 0.631547 +vt 0.400179 0.599791 +vt 0.399847 0.589331 +vt 0.399847 0.589331 +vt 0.401187 0.631547 +vt 0.625000 0.625000 +vt 0.625000 0.687500 +vt 0.608050 0.683263 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.619267 0.625660 +vt 0.618006 0.614232 +vt 0.617393 0.608686 +vt 0.612853 0.567544 +vt 0.612431 0.563719 +vt 0.573364 0.564889 +vt 0.573160 0.570629 +vt 0.571643 0.613288 +vt 0.571361 0.621217 +vt 0.569778 0.665715 +vt 0.569575 0.671432 +vt 0.569497 0.673624 +vt 0.547725 0.668181 +vt 0.549154 0.617425 +vt 0.550700 0.562500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.573335 0.487335 +vt 0.625000 0.875000 +vt 0.623082 0.875000 +vt 0.619949 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.562500 +vt 0.392651 0.552724 +vt 0.392651 0.552724 +vt 0.375000 0.562500 +vt 0.625000 0.718750 +vt 0.608249 0.700317 +vt 0.375000 0.687500 +vt 0.464470 0.693253 +vt 0.585945 0.708658 +vt 0.547815 0.678340 +vt 0.431207 0.638537 +vt 0.429468 0.638617 +vt 0.614785 0.717473 +vt 0.576437 0.712680 +vt 0.456448 0.697681 +vt 0.422954 0.596439 +vt 0.402059 0.631517 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.401187 0.631547 +vt 0.414347 0.540708 +vt 0.431813 0.469918 +vt 0.292083 0.307140 +vt -0.082886 -0.098011 +vt 0.000000 0.000000 +vt 0.598153 0.500000 +vt 0.611577 0.500000 +vt 0.614933 0.500000 +vt 0.618288 0.500000 +vt 0.439201 0.526572 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.399410 0.529471 +vt 0.375000 0.531250 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.734375 0.500000 +vt 0.618288 0.500000 +vt 0.734375 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.718750 0.500000 +vt 0.000000 0.000000 +vt -0.082886 -0.098011 +vt 0.598153 0.500000 +vt 0.573160 0.570629 +vt 0.571643 0.613288 +vt 0.608249 0.700317 +vt 0.608050 0.683263 +vt 0.569497 0.673624 +vt 0.571361 0.621217 +vt 0.569778 0.665715 +vt 0.619267 0.625660 +vt 0.618006 0.614232 +vt 0.569575 0.671432 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.617393 0.608686 +vt 0.612853 0.567544 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.612853 0.567544 +vt 0.612431 0.563719 +vt 0.569778 0.665715 +vt 0.569575 0.671432 +vt 0.571643 0.613288 +vt 0.571361 0.621217 +vt 0.618006 0.614232 +vt 0.617393 0.608686 +vt 0.573364 0.564889 +vt 0.573160 0.570629 +vt 0.541659 0.750000 +vt 0.562500 0.875000 +vt 0.500000 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.750000 +vt 0.375000 0.750000 +vt 0.458317 0.750000 +vt 0.456448 0.697681 +vt 0.375000 0.687500 +vt 0.600988 0.750000 +vt 0.000000 0.000000 +vt 0.444928 0.511667 +vt 0.587121 0.675189 +vt 0.608270 0.875000 +vt 0.600988 0.750000 +vt 0.608270 0.875000 +vt 0.623082 0.875000 +vt 0.619949 0.750000 +vt 0.444928 0.511667 +vt 0.614785 0.717473 +vt 0.576437 0.712680 +vt 0.587121 0.675189 +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.203179 0.485389 +vt 0.158156 0.471731 +vt 0.116663 0.449553 +vt 0.080295 0.419706 +vt 0.050447 0.383337 +vt 0.028269 0.341844 +vt 0.014612 0.296822 +vt 0.010000 0.250000 +vt 0.014611 0.203179 +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.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.740064 0.627288 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.627717 0.628001 +vt 0.631519 0.684809 +vt 0.627717 0.628001 +vt 0.631519 0.684809 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.740064 0.627288 +vt 0.726562 0.500000 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.726562 0.500000 +vt 0.618288 0.500000 +vt 0.618288 0.500000 +vt 0.625000 0.562500 +vt 0.625000 0.625000 +vt 0.625000 0.718750 +vt 0.625000 0.750000 +vt 0.634972 0.717058 +vt 0.634972 0.717058 +vt 0.627025 0.717322 +vt 0.627025 0.717322 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.625000 0.531250 +vt 0.625000 0.562500 +vt 0.401187 0.631547 +vt 0.401187 0.631547 +vt 0.399847 0.589331 +vt 0.399847 0.589331 +vt 0.400179 0.599791 +vt 0.550700 0.562500 +vt 0.549154 0.617425 +vt 0.547725 0.668181 +vt 0.569497 0.673624 +vt 0.569575 0.671432 +vt 0.569778 0.665715 +vt 0.571361 0.621217 +vt 0.571643 0.613288 +vt 0.573160 0.570629 +vt 0.573364 0.564889 +vt 0.612431 0.563719 +vt 0.612853 0.567544 +vt 0.617393 0.608686 +vt 0.618006 0.614232 +vt 0.619267 0.625660 +vt 0.610496 0.670701 +vt 0.609106 0.677838 +vt 0.608050 0.683263 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.573335 0.487335 +vt 0.625000 0.750000 +vt 0.619949 0.750000 +vt 0.375000 0.562500 +vt 0.375000 0.562500 +vt 0.392651 0.552724 +vt 0.392651 0.552724 +vt 0.625000 0.718750 +vt 0.608249 0.700317 +vt 0.375000 0.687500 +vt 0.456448 0.697681 +vt 0.576437 0.712680 +vt 0.614785 0.717473 +vt 0.429468 0.638617 +vt 0.431207 0.638537 +vt 0.547815 0.678340 +vt 0.585945 0.708658 +vt 0.464470 0.693253 +vt 0.422954 0.596439 +vt 0.375000 0.625000 +vt 0.402059 0.631517 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.625000 +vt 0.401187 0.631547 +vt 0.000000 0.000000 +vt -0.082886 -0.098011 +vt 0.292083 0.307140 +vt 0.431813 0.469918 +vt 0.414347 0.540708 +vt 0.618288 0.500000 +vt 0.614933 0.500000 +vt 0.611577 0.500000 +vt 0.598153 0.500000 +vt 0.000000 0.000000 +vt 0.439201 0.526572 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.399410 0.529471 +vt 0.375000 0.531250 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt -0.060953 -0.072076 +vt 0.000000 0.000000 +vt 0.734375 0.500000 +vt 0.618288 0.500000 +vt 0.000000 0.000000 +vt -0.082886 -0.098011 +vt 0.000000 0.000000 +vt 0.598153 0.500000 +vt 0.571643 0.613288 +vt 0.573160 0.570629 +vt 0.608050 0.683263 +vt 0.608249 0.700317 +vt 0.569497 0.673624 +vt 0.569778 0.665715 +vt 0.571361 0.621217 +vt 0.618006 0.614232 +vt 0.619267 0.625660 +vt 0.569575 0.671432 +vt 0.609106 0.677838 +vt 0.610496 0.670701 +vt 0.612853 0.567544 +vt 0.617393 0.608686 +vt 0.610496 0.670701 +vt 0.609106 0.677838 +vt 0.612431 0.563719 +vt 0.612853 0.567544 +vt 0.569575 0.671432 +vt 0.569778 0.665715 +vt 0.571361 0.621217 +vt 0.571643 0.613288 +vt 0.617393 0.608686 +vt 0.618006 0.614232 +vt 0.573160 0.570629 +vt 0.573364 0.564889 +vt 0.541659 0.750000 +vt 0.458317 0.750000 +vt 0.375000 0.750000 +vt 0.375000 0.750000 +vt 0.375000 0.687500 +vt 0.456448 0.697681 +vt 0.600988 0.750000 +vt 0.444928 0.511667 +vt 0.000000 0.000000 +vt 0.587121 0.675189 +vt 0.608270 0.875000 +vt 0.600988 0.750000 +vt 0.619949 0.750000 +vt 0.623082 0.875000 +vt 0.444928 0.511667 +vt 0.576437 0.712680 +vt 0.614785 0.717473 +vt 0.587121 0.675189 +vt 1.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.296822 0.485388 +vt 0.341844 0.471731 +vt 0.383337 0.449553 +vt 0.419706 0.419706 +vt 0.449553 0.383337 +vt 0.471731 0.341844 +vt 0.485388 0.296822 +vt 0.490000 0.250000 +vt 0.485388 0.203178 +vt 0.471731 0.158156 +vt 0.449553 0.116663 +vt 0.419706 0.080294 +vt 0.383337 0.050447 +vt 0.341844 0.028269 +vt 0.296822 0.014612 +vt 0.250000 0.010000 +vt 0.203178 0.014612 +vt 0.158156 0.028269 +vt 0.116663 0.050447 +vt 0.080294 0.080294 +vt 0.050447 0.116663 +vt 0.028269 0.158156 +vt 0.014611 0.203179 +vt 0.010000 0.250000 +vt 0.014612 0.296822 +vt 0.028269 0.341844 +vt 0.050447 0.383337 +vt 0.080295 0.419706 +vt 0.116663 0.449553 +vt 0.158156 0.471731 +vt 0.203179 0.485389 +vt 0.250000 0.490000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.627717 0.628001 +vt 0.631519 0.684809 +vt 0.631519 0.684809 +vt 0.627717 0.628001 +vt 0.634667 0.627655 +vt 0.740255 0.716823 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.614933 0.500000 +vt 0.726562 0.500000 +vt 0.618288 0.500000 +vt 0.618288 0.500000 +vt 0.250000 0.687500 +vt 0.375000 0.687500 +vt 0.250000 0.750000 +vt 0.375000 0.625084 +vt 0.428363 0.640586 +vt 0.528979 0.677861 +vt 0.559197 0.708128 +vt 0.450382 0.715365 +vt 0.375000 0.685311 +vt 0.375000 0.531250 +vt 0.439201 0.526572 +vt 0.513412 0.534872 +vt 0.506006 0.552334 +vt 0.431812 0.561420 +vt 0.375000 0.562425 +vt 0.428363 0.640586 +vt 0.528979 0.677861 +vt 0.375000 0.625084 +vt 0.456448 0.697681 +vt 0.456448 0.697681 +vt 0.431812 0.561420 +vt 0.375000 0.562425 +vt 0.450382 0.715365 +vt 0.375000 0.685311 +vt 0.506006 0.552334 +vt 0.513412 0.534872 +vt 0.375000 0.687500 +vt 0.559197 0.708128 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.562500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.399847 0.589331 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.410228 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.250000 0.500000 +vt 0.375000 0.531250 +vt 0.250000 0.531250 +vt 0.500000 0.500000 +vt 0.517614 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.571307 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.399410 0.529471 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.375000 0.750000 +vt 0.375000 0.687500 +vt 0.458317 0.750000 +vt 0.375000 0.687500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.375000 0.687500 +vt 0.375000 0.625084 +vt 0.375000 0.685311 +vt 0.450382 0.715365 +vt 0.559197 0.708128 +vt 0.528979 0.677861 +vt 0.428363 0.640586 +vt 0.375000 0.531250 +vt 0.375000 0.562425 +vt 0.431812 0.561420 +vt 0.506006 0.552334 +vt 0.513412 0.534872 +vt 0.439201 0.526572 +vt 0.528979 0.677861 +vt 0.428363 0.640586 +vt 0.375000 0.625084 +vt 0.456448 0.697681 +vt 0.456448 0.697681 +vt 0.375000 0.562425 +vt 0.431812 0.561420 +vt 0.375000 0.685311 +vt 0.450382 0.715365 +vt 0.506006 0.552334 +vt 0.513412 0.534872 +vt 0.375000 0.687500 +vt 0.559197 0.708128 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.562500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.399847 0.589331 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.410228 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.500000 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.375000 0.531250 +vt 0.517614 0.500000 +vt 0.000000 0.000000 +vt 0.571307 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt -0.060953 -0.072076 +vt 0.399410 0.529471 +vt 0.410228 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.375000 0.750000 +vt 0.458317 0.750000 +vt 0.375000 0.687500 +vt 0.375000 0.687500 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.250000 0.562500 +vt 0.250000 0.625000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.500000 +vt 0.296822 0.485388 +vt 0.250000 0.490000 +vt 0.203179 0.485389 +vt 0.158156 0.471731 +vt 0.116663 0.449553 +vt 0.080295 0.419706 +vt 0.050447 0.383337 +vt 0.028269 0.341844 +vt 0.014612 0.296822 +vt 0.010000 0.250000 +vt 0.014611 0.203179 +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.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.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.500000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.812500 1.000000 +vt 0.812500 0.500000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.781250 1.000000 +vt 0.781250 0.500000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.718750 1.000000 +vt 0.718750 0.500000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.500000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.656250 1.000000 +vt 0.656250 0.500000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.593750 1.000000 +vt 0.593750 0.500000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.562500 1.000000 +vt 0.562500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.531250 1.000000 +vt 0.531250 0.500000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.468750 1.000000 +vt 0.468750 0.500000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.406250 1.000000 +vt 0.406250 0.500000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.500000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.343750 1.000000 +vt 0.343750 0.500000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.500000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.281250 1.000000 +vt 0.281250 0.500000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.218750 1.000000 +vt 0.218750 0.500000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.187500 1.000000 +vt 0.187500 0.500000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.156250 1.000000 +vt 0.156250 0.500000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.093750 1.000000 +vt 0.093750 0.500000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.062500 1.000000 +vt 0.062500 0.500000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.296822 0.485388 +vt 0.250000 0.490000 +vt 0.203179 0.485389 +vt 0.158156 0.471731 +vt 0.116663 0.449553 +vt 0.080295 0.419706 +vt 0.050447 0.383337 +vt 0.028269 0.341844 +vt 0.014612 0.296822 +vt 0.010000 0.250000 +vt 0.014611 0.203179 +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.906250 0.500000 +vt 0.906250 1.000000 +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.514611 0.203179 +vt 0.510000 0.250000 +vt 0.514612 0.296822 +vt 0.528269 0.341844 +vt 0.550447 0.383337 +vt 0.580295 0.419706 +vt 0.616663 0.449553 +vt 0.658156 0.471731 +vt 0.703179 0.485389 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.031250 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.906250 0.500000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.906250 1.000000 +vt 0.296822 0.485388 +vt 0.341844 0.471731 +vt 0.383337 0.449553 +vt 0.419706 0.419706 +vt 0.449553 0.383337 +vt 0.471731 0.341844 +vt 0.485388 0.296822 +vt 0.490000 0.250000 +vt 0.485388 0.203178 +vt 0.471731 0.158156 +vt 0.449553 0.116663 +vt 0.419706 0.080294 +vt 0.383337 0.050447 +vt 0.341844 0.028269 +vt 0.296822 0.014612 +vt 0.250000 0.010000 +vt 0.203178 0.014612 +vt 0.158156 0.028269 +vt 0.116663 0.050447 +vt 0.080294 0.080294 +vt 0.050447 0.116663 +vt 0.028269 0.158156 +vt 0.014611 0.203179 +vt 0.010000 0.250000 +vt 0.014612 0.296822 +vt 0.028269 0.341844 +vt 0.050447 0.383337 +vt 0.080295 0.419706 +vt 0.116663 0.449553 +vt 0.158156 0.471731 +vt 0.203179 0.485389 +vt 0.250000 0.490000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.093750 0.500000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.093750 1.000000 +vt 0.843750 0.500000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.843750 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.468750 0.500000 +vt 0.468750 1.000000 +vt 0.437500 0.500000 +vt 0.437500 1.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.406250 0.500000 +vt 0.406250 1.000000 +vt 0.531250 0.500000 +vt 0.531250 1.000000 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.562500 0.500000 +vt 0.562500 1.000000 +vt 0.343750 0.500000 +vt 0.343750 1.000000 +vt 0.593750 0.500000 +vt 0.593750 1.000000 +vt 0.312500 0.500000 +vt 0.312500 1.000000 +vt 0.625000 0.500000 +vt 0.625000 1.000000 +vt 0.281250 0.500000 +vt 0.281250 1.000000 +vt 0.656250 0.500000 +vt 0.656250 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.687500 0.500000 +vt 0.687500 1.000000 +vt 0.218750 0.500000 +vt 0.218750 1.000000 +vt 0.718750 0.500000 +vt 0.718750 1.000000 +vt 0.187500 0.500000 +vt 0.187500 1.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.156250 0.500000 +vt 0.156250 1.000000 +vt 0.781250 0.500000 +vt 0.781250 1.000000 +vt 0.125000 0.500000 +vt 0.125000 1.000000 +vt 0.812500 0.500000 +vt 0.812500 1.000000 +vt 0.093750 0.500000 +vt 0.093750 1.000000 +vt 0.843750 0.500000 +vt 0.843750 1.000000 +vt 0.062500 0.500000 +vt 0.062500 1.000000 +vt 0.875000 0.500000 +vt 0.875000 1.000000 +vt 0.296822 0.485388 +vt 0.341844 0.471731 +vt 0.383337 0.449553 +vt 0.419706 0.419706 +vt 0.449553 0.383337 +vt 0.471731 0.341844 +vt 0.485388 0.296822 +vt 0.490000 0.250000 +vt 0.485388 0.203178 +vt 0.471731 0.158156 +vt 0.449553 0.116663 +vt 0.419706 0.080294 +vt 0.383337 0.050447 +vt 0.341844 0.028269 +vt 0.296822 0.014612 +vt 0.250000 0.010000 +vt 0.203178 0.014612 +vt 0.158156 0.028269 +vt 0.116663 0.050447 +vt 0.080294 0.080294 +vt 0.050447 0.116663 +vt 0.028269 0.158156 +vt 0.014611 0.203179 +vt 0.010000 0.250000 +vt 0.014612 0.296822 +vt 0.028269 0.341844 +vt 0.050447 0.383337 +vt 0.080295 0.419706 +vt 0.116663 0.449553 +vt 0.158156 0.471731 +vt 0.203179 0.485389 +vt 0.250000 0.490000 +vt 0.906250 0.500000 +vt 0.906250 1.000000 +vt 0.750000 0.490000 +vt 0.703179 0.485389 +vt 0.658156 0.471731 +vt 0.616663 0.449553 +vt 0.580295 0.419706 +vt 0.550447 0.383337 +vt 0.528269 0.341844 +vt 0.514612 0.296822 +vt 0.510000 0.250000 +vt 0.514611 0.203179 +vt 0.528269 0.158156 +vt 0.550447 0.116663 +vt 0.580294 0.080294 +vt 0.616663 0.050447 +vt 0.658156 0.028269 +vt 0.703178 0.014612 +vt 0.750000 0.010000 +vt 0.796822 0.014612 +vt 0.841844 0.028269 +vt 0.883337 0.050447 +vt 0.919706 0.080294 +vt 0.949553 0.116663 +vt 0.971731 0.158156 +vt 0.985388 0.203178 +vt 0.990000 0.250000 +vt 0.985388 0.296822 +vt 0.971731 0.341844 +vt 0.949553 0.383337 +vt 0.919706 0.419706 +vt 0.883337 0.449553 +vt 0.841844 0.471731 +vt 0.796822 0.485388 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.031250 1.000000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.937500 0.500000 +vt 0.937500 1.000000 +vt 0.031250 0.500000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.031250 1.000000 +vt 0.968750 0.500000 +vt 0.968750 1.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vn 0.0000 0.9942 -0.1078 +vn 0.0000 0.9400 0.3411 +vn -0.0000 0.3039 -0.9527 +vn 0.0000 0.9897 -0.1431 +vn 0.0000 0.9890 -0.1476 +vn -0.1218 -0.9925 -0.0071 +vn 0.9589 0.2836 0.0128 +vn 0.9551 0.2959 0.0128 +vn 0.9456 0.3249 0.0160 +vn 0.0009 -0.1780 0.9840 +vn -0.0021 -0.0952 -0.9955 +vn 0.9601 0.2794 0.0138 +vn 0.9999 0.0009 0.0161 +vn 0.9997 0.0252 0.0033 +vn 0.0032 -0.0086 -1.0000 +vn 0.9703 -0.2418 -0.0000 +vn 0.0000 -1.0000 0.0004 +vn 0.0004 0.0103 0.9999 +vn 0.4967 0.0849 -0.8638 +vn 0.9997 0.0248 0.0004 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.9875 -0.1575 +vn 0.0000 0.0000 1.0000 +vn 1.0000 -0.0000 0.0002 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 -0.9871 0.1602 +vn -0.0000 -0.9964 -0.0850 +vn 0.0001 -0.9875 -0.1575 +vn 0.0000 -0.9993 -0.0386 +vn -0.2806 0.9581 0.0572 +vn 0.2683 -0.9037 -0.3338 +vn -0.2805 0.9572 0.0719 +vn 0.2766 -0.9529 0.1246 +vn 0.2692 -0.9070 -0.3238 +vn 0.2713 -0.9064 -0.3238 +vn 0.2789 -0.9522 0.1246 +vn -0.2828 0.9575 0.0571 +vn 0.0081 -0.0286 0.9996 +vn -0.9985 0.0027 -0.0554 +vn 0.5899 -0.0526 0.8058 +vn 0.6301 -0.1095 0.7687 +vn 0.0003 0.9911 0.1330 +vn 0.0003 -0.0991 0.9951 +vn -0.0001 -0.9911 -0.1331 +vn -0.0679 0.9854 0.1561 +vn -0.9446 -0.0279 0.3272 +vn 0.1226 -0.9770 -0.1742 +vn 0.0000 -0.0980 -0.9952 +vn 0.0000 -0.2903 -0.9569 +vn 0.0000 -0.4714 -0.8819 +vn 0.0000 -0.6344 -0.7730 +vn 0.0000 -0.7730 -0.6344 +vn 0.0000 -0.8819 -0.4714 +vn 0.0000 -0.9569 -0.2903 +vn 0.0000 -0.9952 -0.0980 +vn 0.0000 -0.9952 0.0980 +vn 0.0000 -0.9569 0.2903 +vn 0.0000 -0.8819 0.4714 +vn 0.0000 -0.7730 0.6344 +vn 0.0000 -0.6344 0.7730 +vn 0.0000 -0.4714 0.8819 +vn 0.0000 -0.2903 0.9569 +vn 0.0000 -0.0980 0.9952 +vn -0.0000 0.0980 0.9952 +vn 0.0000 0.2903 0.9569 +vn 0.0000 0.4714 0.8819 +vn 0.0000 0.6344 0.7730 +vn 0.0000 0.7730 0.6344 +vn 0.0000 0.8819 0.4714 +vn 0.0000 0.9569 0.2903 +vn 0.0000 0.9952 0.0980 +vn 0.0000 0.9952 -0.0980 +vn 0.0000 0.9569 -0.2903 +vn 0.0000 0.8819 -0.4714 +vn -0.0000 0.7730 -0.6344 +vn -0.0000 0.6344 -0.7730 +vn 0.0000 0.4714 -0.8819 +vn 0.0000 0.2903 -0.9569 +vn 0.0000 0.0980 -0.9952 +vn 0.0005 0.9512 0.3085 +vn 0.0005 0.9450 0.3272 +vn -0.0225 0.9557 0.2934 +vn -0.0037 0.9452 0.3264 +vn 0.0007 0.9452 0.3265 +vn 0.0011 0.9478 0.3189 +vn -0.9975 -0.0266 0.0661 +vn 0.0000 -0.3039 0.9527 +vn -0.9969 -0.0288 0.0731 +vn 0.0000 -0.1554 -0.9879 +vn -0.0000 -0.1595 -0.9872 +vn -0.0000 0.9871 -0.1602 +vn 0.0000 -0.1602 -0.9871 +vn 0.0000 0.1602 0.9871 +vn 0.1218 -0.9925 -0.0071 +vn -0.9589 0.2836 0.0128 +vn -0.9551 0.2959 0.0128 +vn -0.9456 0.3249 0.0160 +vn -0.0009 -0.1780 0.9840 +vn 0.0021 -0.0952 -0.9955 +vn -0.9601 0.2794 0.0138 +vn -0.9999 0.0009 0.0161 +vn -0.9997 0.0252 0.0033 +vn -0.0032 -0.0086 -1.0000 +vn -0.9703 -0.2418 -0.0000 +vn -0.0004 0.0103 0.9999 +vn -0.4967 0.0849 -0.8638 +vn -0.9997 0.0248 0.0004 +vn -1.0000 -0.0000 0.0002 +vn -0.0001 -0.9875 -0.1575 +vn 0.2806 0.9581 0.0572 +vn -0.2683 -0.9037 -0.3338 +vn 0.2805 0.9572 0.0719 +vn -0.2766 -0.9529 0.1246 +vn -0.2692 -0.9070 -0.3238 +vn -0.2713 -0.9064 -0.3238 +vn -0.2789 -0.9522 0.1246 +vn 0.2829 0.9575 0.0571 +vn 0.2828 0.9575 0.0571 +vn -0.0081 -0.0286 0.9996 +vn 0.9985 0.0027 -0.0554 +vn -0.5899 -0.0526 0.8058 +vn -0.6301 -0.1096 0.7687 +vn -0.0003 0.9911 0.1330 +vn -0.0003 -0.0991 0.9951 +vn 0.0001 -0.9911 -0.1331 +vn 0.0679 0.9854 0.1561 +vn 0.9446 -0.0279 0.3272 +vn -0.1226 -0.9770 -0.1742 +vn -0.0005 0.9512 0.3085 +vn -0.0005 0.9450 0.3272 +vn 0.0225 0.9557 0.2934 +vn 0.0037 0.9452 0.3264 +vn -0.0007 0.9452 0.3265 +vn -0.0011 0.9478 0.3189 +vn 0.9975 -0.0266 0.0661 +vn 0.9969 -0.0288 0.0731 +vn 0.6221 -0.1262 0.7727 +vn 0.0014 -0.2815 0.9595 +vn -0.6221 -0.1262 0.7727 +vn -0.0014 -0.2815 0.9595 +vn 0.0049 -0.9652 0.2613 +vn 0.0000 -0.5403 0.8415 +vn 0.0000 -0.0826 0.9966 +vn 0.0000 0.9975 -0.0701 +vn 0.0000 -0.0543 -0.9985 +vn 0.0000 0.0429 -0.9991 +vn 0.0000 -0.5892 -0.8080 +vn 0.0000 -0.9997 -0.0244 +vn 0.0000 -0.9936 0.1127 +vn 0.0000 -0.9995 -0.0306 +vn -0.0067 -0.9653 0.2610 +vn 0.0000 -0.5233 -0.8522 +vn 0.9881 0.0890 -0.1256 +vn 0.8631 0.2709 -0.4262 +vn 0.8464 0.5322 0.0192 +vn 0.8198 0.3038 0.4853 +vn 0.7057 -0.0297 0.7079 +vn 0.0003 -1.0000 0.0042 +vn 0.0025 -0.9998 -0.0221 +vn 0.7855 0.1270 0.6057 +vn 0.9488 0.2015 0.2431 +vn 0.8858 0.4639 0.0108 +vn 0.8470 0.3011 -0.4380 +vn 0.0387 0.9992 0.0071 +vn 0.0417 0.9991 0.0071 +vn 0.0000 -1.0000 -0.0030 +vn 1.0000 0.0006 0.0084 +vn 0.0000 -1.0000 -0.0015 +vn 0.0000 -0.1123 -0.9937 +vn 0.0000 -0.9442 -0.3293 +vn 0.0000 0.9956 0.0941 +vn 0.0000 -0.9435 -0.3313 +vn 0.0000 -0.0233 0.9997 +vn 0.0000 0.9954 0.0958 +vn -0.0000 -0.1121 -0.9937 +vn -0.0000 0.9956 0.0940 +vn -0.0000 -0.0313 -0.9995 +vn 0.0001 -0.9956 -0.0940 +vn 1.0000 0.0001 0.0004 +vn -0.0001 0.9956 0.0941 +vn -0.0001 0.9953 0.0968 +vn -0.0020 -0.0231 0.9997 +vn 0.0000 -0.5948 0.8038 +vn 0.0000 -0.1315 0.9913 +vn 0.0084 -0.0395 0.9992 +vn 0.0693 -0.1932 -0.9787 +vn -0.0181 0.0150 0.9997 +vn -0.0812 0.2349 0.9686 +vn -0.0690 0.1924 0.9789 +vn 0.9601 0.2794 0.0122 +vn 0.9572 0.2893 0.0121 +vn 0.9602 0.2790 0.0135 +vn 0.0398 -0.0904 -0.9951 +vn 0.0299 -0.1456 0.9889 +vn 0.0101 0.9986 -0.0516 +vn 0.5988 -0.0920 0.7956 +vn 0.4826 -0.1722 0.8588 +vn 0.1131 -0.9083 0.4027 +vn -0.0273 0.9949 -0.0971 +vn 0.0000 0.0426 -0.9991 +vn 0.9985 -0.0027 0.0554 +vn -0.0027 -0.9999 -0.0117 +vn -0.0073 0.2267 -0.9739 +vn 0.5826 -0.2972 -0.7565 +vn 0.5826 -0.6714 0.4581 +vn 0.5826 0.5960 0.5526 +vn 0.5826 0.4062 -0.7040 +vn 0.5826 -0.7767 -0.2393 +vn 0.5826 -0.0605 0.8105 +vn 0.5826 0.8037 -0.1214 +vn 0.9031 0.0320 -0.4283 +vn 0.9031 -0.4247 0.0642 +vn 0.9031 0.1571 0.3998 +vn 0.9031 0.3548 -0.2421 +vn 0.9031 -0.3150 -0.2921 +vn 0.9031 -0.2146 0.3721 +vn 0.9031 0.4105 0.1265 +vn -0.3821 0.1311 0.9148 +vn 0.6979 -0.3531 0.6231 +vn -0.3821 -0.1591 -0.9103 +vn -0.3821 0.5383 0.7511 +vn 0.6979 0.6861 0.2056 +vn -0.9751 -0.1823 0.1265 +vn -0.3821 -0.2516 0.8892 +vn -0.9751 0.1094 -0.1931 +vn -0.3821 0.7969 0.4678 +vn -0.9751 0.2192 -0.0349 +vn -0.3821 -0.8109 -0.4432 +vn 0.6979 -0.7073 0.1125 +vn -0.3821 0.2788 -0.8811 +vn -0.9751 -0.2126 -0.0637 +vn -0.9751 -0.0148 0.2214 +vn 0.6979 0.0477 -0.7146 +vn -0.3821 -0.6334 0.6729 +vn -0.3821 0.8626 -0.3314 +vn 0.6979 -0.5290 -0.4829 +vn -0.9751 -0.0827 -0.2059 +vn -0.3821 0.6125 -0.6920 +vn -0.3821 -0.8521 0.3577 +vn -0.9751 0.1639 0.1496 +vn 0.6979 0.5885 -0.4082 +vn -0.3821 -0.9210 -0.0757 +vn -0.3821 -0.5150 -0.7673 +vn 0.6979 0.2671 0.6646 +vn -0.3821 0.9229 0.0474 +vn 0.9031 -0.2146 0.3720 +vn -0.0049 -0.9652 0.2613 +vn 0.0067 -0.9653 0.2610 +vn -0.9881 0.0890 -0.1256 +vn -0.8631 0.2709 -0.4262 +vn -0.8464 0.5322 0.0192 +vn -0.8198 0.3038 0.4853 +vn -0.7057 -0.0297 0.7079 +vn -0.0003 -1.0000 0.0042 +vn -0.0025 -0.9998 -0.0221 +vn -0.7855 0.1270 0.6057 +vn -0.9488 0.2015 0.2431 +vn -0.8858 0.4639 0.0108 +vn -0.8471 0.3011 -0.4380 +vn -0.0387 0.9992 0.0071 +vn -0.0417 0.9991 0.0071 +vn -1.0000 0.0006 0.0084 +vn -0.0001 -0.9956 -0.0940 +vn -1.0000 0.0001 0.0004 +vn 0.0001 0.9956 0.0941 +vn 0.0001 0.9953 0.0968 +vn 0.0020 -0.0231 0.9997 +vn -0.0084 -0.0395 0.9992 +vn -0.0693 -0.1932 -0.9787 +vn 0.0181 0.0150 0.9997 +vn 0.0812 0.2349 0.9686 +vn 0.0690 0.1924 0.9789 +vn -0.9601 0.2794 0.0122 +vn -0.9572 0.2893 0.0121 +vn -0.9602 0.2790 0.0135 +vn -0.0398 -0.0904 -0.9951 +vn -0.0299 -0.1456 0.9889 +vn -0.0101 0.9986 -0.0516 +vn -0.5988 -0.0920 0.7956 +vn -0.4826 -0.1722 0.8588 +vn -0.1131 -0.9083 0.4027 +vn 0.0273 0.9949 -0.0971 +vn -0.9985 -0.0027 0.0554 +vn 0.0027 -0.9999 -0.0117 +vn 0.0073 0.2267 -0.9739 +vn -0.5826 -0.2972 -0.7565 +vn -0.5826 -0.6714 0.4581 +vn -0.5826 0.5960 0.5526 +vn -0.5826 0.4062 -0.7040 +vn -0.5826 -0.7767 -0.2393 +vn -0.5826 -0.0605 0.8105 +vn -0.5826 0.8037 -0.1214 +vn -0.9031 0.0320 -0.4283 +vn -0.9031 -0.4247 0.0642 +vn -0.9031 0.1571 0.3998 +vn -0.9031 0.3548 -0.2421 +vn -0.9031 -0.3150 -0.2921 +vn -0.9031 -0.2146 0.3721 +vn -0.9031 0.4105 0.1265 +vn 0.3821 0.1311 0.9148 +vn -0.6979 -0.3531 0.6231 +vn 0.3821 -0.1591 -0.9103 +vn 0.3821 0.5383 0.7511 +vn -0.6979 0.6861 0.2056 +vn 0.9751 -0.1823 0.1265 +vn 0.3821 -0.2516 0.8892 +vn 0.9751 0.1094 -0.1931 +vn 0.3821 0.7969 0.4678 +vn 0.9751 0.2192 -0.0349 +vn 0.3821 -0.8109 -0.4432 +vn -0.6979 -0.7073 0.1125 +vn 0.3821 0.2788 -0.8811 +vn 0.9751 -0.2126 -0.0637 +vn 0.9751 -0.0148 0.2214 +vn -0.6979 0.0477 -0.7146 +vn 0.3821 -0.6334 0.6729 +vn 0.3821 0.8626 -0.3314 +vn -0.6979 -0.5290 -0.4829 +vn 0.9751 -0.0827 -0.2059 +vn 0.3821 0.6125 -0.6920 +vn 0.3821 -0.8521 0.3577 +vn 0.9751 0.1639 0.1496 +vn -0.6979 0.5885 -0.4082 +vn 0.3821 -0.9210 -0.0757 +vn 0.3821 -0.5150 -0.7673 +vn -0.6979 0.2671 0.6646 +vn 0.3821 0.9229 0.0474 +vn -0.9031 -0.2146 0.3720 +vn 0.9590 0.2831 0.0119 +vn 0.9604 0.2784 0.0130 +vn -0.0052 0.9527 0.3039 +vn -0.9590 0.2831 0.0119 +vn -0.9604 0.2784 0.0130 +vn 0.0052 0.9527 0.3039 +vn 0.0000 -0.9995 0.0328 +vn 0.0000 -0.9983 -0.0591 +vn 0.0001 -1.0000 -0.0028 +vn 0.8784 -0.4215 0.2253 +vn 0.8784 0.4756 0.0468 +vn 0.8784 -0.4574 0.1387 +vn 0.8784 0.4574 0.1387 +vn 0.8784 -0.4756 0.0468 +vn 0.8784 0.4215 0.2253 +vn 0.8784 -0.4757 -0.0468 +vn 0.8784 0.3695 0.3032 +vn 0.8784 -0.4574 -0.1387 +vn 0.8784 0.3032 0.3695 +vn 0.8784 -0.4215 -0.2253 +vn 0.8784 0.2253 0.4215 +vn 0.8784 0.0468 -0.4756 +vn 0.8784 -0.3695 -0.3032 +vn 0.8784 0.1387 0.4574 +vn 0.8784 0.1387 -0.4574 +vn 0.8784 -0.3032 -0.3695 +vn 0.8784 0.0468 0.4757 +vn 0.8784 0.2253 -0.4215 +vn 0.8784 -0.2253 -0.4215 +vn 0.8784 -0.0468 0.4757 +vn 0.8784 0.3032 -0.3695 +vn 0.8784 -0.1387 -0.4574 +vn 0.8784 -0.1387 0.4574 +vn 0.8784 0.3695 -0.3032 +vn 0.8784 -0.0468 -0.4757 +vn 0.8784 -0.2253 0.4215 +vn 0.8784 0.4215 -0.2253 +vn 0.8784 -0.3032 0.3695 +vn 0.8784 0.4574 -0.1387 +vn 0.8784 -0.3695 0.3032 +vn 0.8784 0.4757 -0.0468 +vn 0.9481 0.0312 -0.3164 +vn 0.9481 -0.2017 0.2458 +vn 0.9481 0.0923 0.3043 +vn 0.9481 0.0923 -0.3043 +vn 0.9481 -0.2458 0.2017 +vn 0.9481 0.0312 0.3164 +vn 0.9481 0.1499 -0.2804 +vn 0.9481 -0.2804 0.1499 +vn 0.9481 0.2017 -0.2458 +vn 0.9481 -0.3043 0.0923 +vn 0.9481 0.2458 -0.2017 +vn 0.9481 -0.3164 0.0312 +vn 0.9481 0.2804 -0.1499 +vn 0.9481 -0.3164 -0.0312 +vn 0.9481 0.3043 -0.0923 +vn 0.9481 -0.3043 -0.0923 +vn 0.9481 0.3164 -0.0312 +vn 0.9481 -0.2804 -0.1499 +vn 0.9481 0.3164 0.0312 +vn 0.9481 -0.2458 -0.2017 +vn 0.9481 0.3043 0.0923 +vn 0.9481 -0.2017 -0.2458 +vn 0.9481 0.2804 0.1499 +vn 0.9481 -0.1499 -0.2804 +vn 0.9481 -0.0312 0.3164 +vn 0.9481 0.2458 0.2017 +vn 0.9481 -0.0923 -0.3043 +vn 0.9481 -0.0923 0.3043 +vn 0.9481 0.2017 0.2458 +vn 0.9481 -0.0312 -0.3164 +vn 0.9481 -0.1499 0.2804 +vn 0.9481 0.1499 0.2804 +vn 0.9938 0.0705 -0.0860 +vn 0.9938 -0.1064 0.0323 +vn 0.9938 0.0860 -0.0705 +vn 0.9938 -0.1107 0.0109 +vn 0.9938 0.0981 -0.0524 +vn 0.9938 -0.1107 -0.0109 +vn 0.9938 0.1064 -0.0323 +vn 0.9938 -0.1064 -0.0323 +vn 0.9938 0.1107 -0.0109 +vn 0.9938 -0.0981 -0.0524 +vn 0.9938 0.1107 0.0109 +vn 0.9938 -0.0860 -0.0705 +vn 0.9938 0.1064 0.0323 +vn 0.9938 -0.0705 -0.0860 +vn 0.9938 0.0981 0.0524 +vn 0.9938 -0.0524 -0.0981 +vn 0.9938 -0.0109 0.1107 +vn 0.9938 0.0860 0.0705 +vn 0.9938 -0.0323 -0.1064 +vn 0.9938 -0.0323 0.1064 +vn 0.9938 0.0705 0.0860 +vn 0.9938 -0.0109 -0.1107 +vn 0.9938 -0.0524 0.0981 +vn 0.9938 0.0524 0.0981 +vn 0.9938 0.0109 -0.1107 +vn 0.9938 -0.0705 0.0860 +vn 0.9938 0.0323 0.1064 +vn 0.9938 0.0323 -0.1064 +vn 0.9938 -0.0860 0.0705 +vn 0.9938 0.0109 0.1107 +vn 0.9938 0.0524 -0.0981 +vn 0.9938 -0.0981 0.0524 +vn 0.8784 0.4757 0.0468 +vn 0.8784 -0.4757 0.0468 +vn -0.9343 -0.1035 0.3413 +vn -0.9343 0.2757 -0.2262 +vn -0.9343 -0.0350 -0.3549 +vn -0.9343 -0.1681 0.3145 +vn -0.9343 0.3145 -0.1681 +vn -0.9343 -0.2262 0.2757 +vn -0.9343 0.3413 -0.1035 +vn -0.9343 -0.2757 0.2262 +vn -0.9343 0.3549 -0.0350 +vn -0.9343 -0.3145 0.1681 +vn -0.9343 0.3549 0.0350 +vn -0.9343 -0.3413 0.1035 +vn -0.9343 0.3413 0.1035 +vn -0.9343 -0.3549 0.0350 +vn -0.9343 0.3145 0.1681 +vn -0.9343 -0.3549 -0.0350 +vn -0.9343 0.2757 0.2262 +vn -0.9343 -0.3413 -0.1035 +vn -0.9343 0.2262 0.2757 +vn -0.9343 -0.3145 -0.1681 +vn -0.9343 0.1681 0.3145 +vn -0.9343 0.0350 -0.3549 +vn -0.9343 -0.2757 -0.2262 +vn -0.9343 0.1035 0.3413 +vn -0.9343 0.1035 -0.3413 +vn -0.9343 -0.2262 -0.2757 +vn -0.9343 0.0350 0.3549 +vn -0.9343 0.1681 -0.3145 +vn -0.9343 -0.1681 -0.3145 +vn -0.9343 -0.0350 0.3549 +vn -0.9343 0.2262 -0.2757 +vn -0.9343 -0.1035 -0.3413 +vn -0.9343 -0.3547 -0.0349 +vn -0.9343 0.2755 0.2261 +vn -0.9343 -0.3410 -0.1035 +vn -0.9343 0.2261 0.2755 +vn -0.9343 -0.3143 -0.1680 +vn -0.9343 0.1680 0.3143 +vn -0.9343 0.0349 -0.3547 +vn -0.9343 -0.2755 -0.2261 +vn -0.9343 0.1035 0.3410 +vn -0.9343 0.1035 -0.3410 +vn -0.9343 -0.2261 -0.2755 +vn -0.9343 0.0349 0.3547 +vn -0.9343 0.1680 -0.3143 +vn -0.9343 -0.1680 -0.3143 +vn -0.9343 -0.0349 0.3547 +vn -0.9343 0.2261 -0.2755 +vn -0.9343 -0.1034 -0.3410 +vn -0.9343 -0.1034 0.3410 +vn -0.9343 0.2755 -0.2261 +vn -0.9343 -0.0349 -0.3547 +vn -0.9343 -0.1680 0.3143 +vn -0.9343 0.3143 -0.1680 +vn -0.9343 -0.2261 0.2755 +vn -0.9343 0.3410 -0.1035 +vn -0.9343 -0.2755 0.2261 +vn -0.9343 0.3547 -0.0349 +vn -0.9343 -0.3143 0.1680 +vn -0.9343 0.3547 0.0349 +vn -0.9343 -0.3410 0.1035 +vn -0.9343 0.3410 0.1035 +vn -0.9343 -0.3547 0.0349 +vn -0.9343 0.3143 0.1680 +vn -0.0001 -1.0000 -0.0028 +vn -0.8784 -0.4215 0.2253 +vn -0.8784 0.4756 0.0468 +vn -0.8784 -0.4574 0.1387 +vn -0.8784 0.4574 0.1387 +vn -0.8784 -0.4756 0.0468 +vn -0.8784 0.4215 0.2253 +vn -0.8784 -0.4757 -0.0468 +vn -0.8784 0.3695 0.3032 +vn -0.8784 -0.4574 -0.1387 +vn -0.8784 0.3032 0.3695 +vn -0.8784 -0.4215 -0.2253 +vn -0.8784 0.2253 0.4215 +vn -0.8784 0.0468 -0.4757 +vn -0.8784 -0.3695 -0.3032 +vn -0.8784 0.1387 0.4574 +vn -0.8784 0.1387 -0.4574 +vn -0.8784 -0.3032 -0.3695 +vn -0.8784 0.0468 0.4757 +vn -0.8784 0.2253 -0.4215 +vn -0.8784 -0.2253 -0.4215 +vn -0.8784 -0.0468 0.4757 +vn -0.8784 0.3032 -0.3695 +vn -0.8784 -0.1387 -0.4574 +vn -0.8784 -0.1387 0.4574 +vn -0.8784 0.3695 -0.3032 +vn -0.8784 -0.0468 -0.4757 +vn -0.8784 -0.2253 0.4215 +vn -0.8784 0.4215 -0.2253 +vn -0.8784 -0.3032 0.3695 +vn -0.8784 0.4574 -0.1387 +vn -0.8784 -0.3695 0.3032 +vn -0.8784 0.4757 -0.0468 +vn -0.9481 0.0312 -0.3164 +vn -0.9481 -0.2017 0.2458 +vn -0.9481 0.0923 0.3043 +vn -0.9481 0.0923 -0.3043 +vn -0.9481 -0.2458 0.2017 +vn -0.9481 0.0312 0.3164 +vn -0.9481 0.1499 -0.2804 +vn -0.9481 -0.2804 0.1499 +vn -0.9481 0.2017 -0.2458 +vn -0.9481 -0.3043 0.0923 +vn -0.9481 0.2458 -0.2017 +vn -0.9481 -0.3164 0.0312 +vn -0.9481 0.2804 -0.1499 +vn -0.9481 -0.3164 -0.0312 +vn -0.9481 0.3043 -0.0923 +vn -0.9481 -0.3043 -0.0923 +vn -0.9481 0.3164 -0.0312 +vn -0.9481 -0.2804 -0.1499 +vn -0.9481 0.3164 0.0312 +vn -0.9481 -0.2458 -0.2017 +vn -0.9481 0.3043 0.0923 +vn -0.9481 -0.2017 -0.2458 +vn -0.9481 0.2804 0.1499 +vn -0.9481 -0.1499 -0.2804 +vn -0.9481 -0.0312 0.3164 +vn -0.9481 0.2458 0.2017 +vn -0.9481 -0.0923 -0.3043 +vn -0.9481 -0.0923 0.3043 +vn -0.9481 0.2017 0.2458 +vn -0.9481 -0.0312 -0.3164 +vn -0.9481 -0.1499 0.2804 +vn -0.9481 0.1499 0.2804 +vn -0.9938 0.0705 -0.0860 +vn -0.9938 -0.1064 0.0323 +vn -0.9938 0.0860 -0.0705 +vn -0.9938 -0.1107 0.0109 +vn -0.9938 0.0981 -0.0524 +vn -0.9938 -0.1107 -0.0109 +vn -0.9938 0.1064 -0.0323 +vn -0.9938 -0.1064 -0.0323 +vn -0.9938 0.1107 -0.0109 +vn -0.9938 -0.0981 -0.0524 +vn -0.9938 0.1107 0.0109 +vn -0.9938 -0.0860 -0.0705 +vn -0.9938 0.1064 0.0323 +vn -0.9938 -0.0705 -0.0860 +vn -0.9938 0.0981 0.0524 +vn -0.9938 -0.0524 -0.0981 +vn -0.9938 -0.0109 0.1107 +vn -0.9938 0.0860 0.0705 +vn -0.9938 -0.0323 -0.1064 +vn -0.9938 -0.0323 0.1064 +vn -0.9938 0.0705 0.0860 +vn -0.9938 -0.0109 -0.1107 +vn -0.9938 -0.0524 0.0981 +vn -0.9938 0.0524 0.0981 +vn -0.9938 0.0109 -0.1107 +vn -0.9938 -0.0705 0.0860 +vn -0.9938 0.0323 0.1064 +vn -0.9938 0.0323 -0.1064 +vn -0.9938 -0.0860 0.0705 +vn -0.9938 0.0109 0.1107 +vn -0.9938 0.0524 -0.0981 +vn -0.9938 -0.0981 0.0524 +vn -0.8784 0.4757 0.0468 +vn -0.8784 0.0468 -0.4756 +vn 0.9343 -0.1035 0.3413 +vn 0.9343 0.2757 -0.2262 +vn 0.9343 -0.0350 -0.3549 +vn 0.9343 -0.1681 0.3145 +vn 0.9343 0.3145 -0.1681 +vn 0.9343 -0.2262 0.2757 +vn 0.9343 0.3413 -0.1035 +vn 0.9343 -0.2757 0.2262 +vn 0.9343 0.3549 -0.0350 +vn 0.9343 -0.3145 0.1681 +vn 0.9343 0.3549 0.0350 +vn 0.9343 -0.3413 0.1035 +vn 0.9343 0.3413 0.1035 +vn 0.9343 -0.3549 0.0350 +vn 0.9343 0.3145 0.1681 +vn 0.9343 -0.3549 -0.0350 +vn 0.9343 0.2757 0.2262 +vn 0.9343 -0.3413 -0.1035 +vn 0.9343 0.2262 0.2757 +vn 0.9343 -0.3145 -0.1681 +vn 0.9343 0.1681 0.3145 +vn 0.9343 0.0350 -0.3549 +vn 0.9343 -0.2757 -0.2262 +vn 0.9343 0.1035 0.3413 +vn 0.9343 0.1035 -0.3413 +vn 0.9343 -0.2262 -0.2757 +vn 0.9343 0.0350 0.3549 +vn 0.9343 0.1681 -0.3145 +vn 0.9343 -0.1681 -0.3145 +vn 0.9343 -0.0350 0.3549 +vn 0.9343 0.2262 -0.2757 +vn 0.9343 -0.1035 -0.3413 +vn 0.9343 -0.3547 -0.0349 +vn 0.9343 0.2755 0.2261 +vn 0.9343 -0.3410 -0.1035 +vn 0.9343 0.2261 0.2755 +vn 0.9343 -0.3143 -0.1680 +vn 0.9343 0.1680 0.3143 +vn 0.9343 0.0349 -0.3547 +vn 0.9343 -0.2755 -0.2261 +vn 0.9343 0.1035 0.3410 +vn 0.9343 0.1035 -0.3410 +vn 0.9343 -0.2261 -0.2755 +vn 0.9343 0.0349 0.3547 +vn 0.9343 0.1680 -0.3143 +vn 0.9343 -0.1680 -0.3143 +vn 0.9343 -0.0349 0.3547 +vn 0.9343 0.2261 -0.2755 +vn 0.9343 -0.1035 -0.3410 +vn 0.9343 -0.1035 0.3410 +vn 0.9343 0.2755 -0.2261 +vn 0.9343 -0.0349 -0.3547 +vn 0.9343 -0.1680 0.3143 +vn 0.9343 0.3143 -0.1680 +vn 0.9343 -0.2261 0.2755 +vn 0.9343 0.3410 -0.1035 +vn 0.9343 -0.2755 0.2261 +vn 0.9343 0.3547 -0.0349 +vn 0.9343 -0.3143 0.1680 +vn 0.9343 0.3547 0.0349 +vn 0.9343 -0.3410 0.1035 +vn 0.9343 0.3410 0.1035 +vn 0.9343 -0.3547 0.0349 +vn 0.9343 0.3143 0.1680 +usemtl Material +s off +f 7/1/1 995/2/1 983/3/1 927/4/1 +f 928/5/2 992/6/2 986/7/2 1/8/2 +f 5/9/3 26/10/3 938/11/3 935/12/3 +f 10/13/4 33/14/4 22/15/4 988/16/4 1001/17/4 +f 10/13/5 7/1/5 27/18/5 33/14/5 +f 63/19/6 109/20/6 66/21/6 67/22/6 49/23/6 +f 1001/17/5 995/2/5 7/1/5 10/13/5 +f 27/18/7 930/24/7 931/25/7 110/26/7 123/27/7 121/28/7 114/29/7 118/30/7 115/31/7 119/32/7 112/33/7 113/34/7 120/35/7 116/36/7 117/37/7 122/38/7 124/39/7 111/40/7 35/41/7 74/42/7 36/43/7 +f 33/44/8 27/45/8 36/46/8 34/47/8 +f 22/15/9 33/14/9 34/48/9 +f 1/8/10 986/49/10 1696/50/10 694/51/10 24/52/10 +f 54/53/11 65/54/11 72/55/11 69/56/11 +f 7/1/1 927/4/1 930/24/1 27/18/1 +f 928/5/2 1/8/2 24/52/2 932/57/2 +f 932/57/12 35/41/12 111/40/12 125/58/12 110/26/12 931/25/12 +f 31/59/13 47/60/13 45/61/13 43/62/13 41/63/13 75/64/13 35/41/13 932/57/13 693/65/13 695/66/13 152/67/13 +f 75/64/14 108/68/14 74/42/14 35/41/14 +f 63/19/15 64/69/15 37/70/15 +f 109/20/16 108/68/16 75/64/16 63/19/16 +f 37/70/17 30/71/17 68/72/17 70/73/17 +f 63/19/18 37/70/18 70/73/18 71/74/18 +f 75/64/19 41/63/19 64/69/19 63/19/19 +f 74/42/20 108/68/20 56/75/20 58/76/20 60/77/20 62/78/20 50/79/20 34/47/20 36/43/20 +f 34/47/21 50/79/21 62/78/21 94/80/21 95/81/21 941/82/21 940/83/21 22/15/21 +f 62/78/22 61/84/22 78/85/22 +f 76/86/23 52/87/23 84/88/23 85/89/23 +f 83/90/24 51/91/24 52/87/24 76/86/24 +f 52/87/23 81/92/23 86/93/23 84/88/23 +f 82/94/23 76/86/23 85/89/23 87/95/23 +f 81/92/23 82/94/23 87/95/23 86/93/23 +f 85/89/25 84/88/25 88/96/25 89/97/25 +f 1942/98/26 940/83/26 939/99/26 943/100/26 +f 101/101/27 1088/102/27 1090/103/27 95/81/27 +f 62/78/28 78/85/28 98/104/28 97/105/28 +f 94/80/29 62/78/29 97/105/29 101/106/29 +f 66/21/16 65/54/16 56/75/16 108/68/16 109/20/16 +f 116/36/30 120/35/30 130/107/30 131/108/30 +f 110/26/31 125/58/31 139/109/31 137/110/31 +f 125/58/32 111/40/32 127/111/32 139/109/32 +f 122/38/30 117/37/30 134/112/30 136/113/30 +f 118/30/33 114/29/33 129/114/33 133/115/33 +f 111/40/30 124/39/30 126/116/30 127/111/30 +f 123/27/34 110/26/34 137/110/34 138/117/34 +f 114/29/34 121/28/34 128/118/34 129/114/34 +f 119/32/33 115/31/33 132/119/33 135/120/33 +f 121/28/35 123/27/35 148/121/35 149/122/35 +f 112/33/36 119/32/36 142/123/36 140/124/36 +f 124/39/37 122/38/37 150/125/37 151/126/37 +f 117/37/37 116/36/37 145/127/37 146/128/37 +f 115/31/36 118/30/36 143/129/36 144/130/36 +f 120/35/37 113/34/37 141/131/37 147/132/37 +f 154/133/38 1152/134/38 1150/135/38 987/136/38 2/137/38 25/138/38 153/139/38 +f 31/59/39 152/67/39 159/140/39 160/141/39 +f 696/142/40 154/133/40 152/143/40 695/144/40 +f 24/52/41 694/51/41 693/145/41 932/57/41 +f 1695/146/42 696/142/42 700/147/42 702/148/42 +f 696/142/43 1695/146/43 1152/134/43 154/133/43 +f 694/51/44 1696/50/44 701/149/44 697/150/44 +f 696/142/45 695/144/45 699/151/45 700/147/45 +f 695/66/46 693/65/46 698/152/46 699/153/46 +f 693/145/47 694/51/47 697/150/47 698/154/47 +f 737/155/48 738/156/48 740/157/48 739/158/48 +f 739/158/49 740/157/49 742/159/49 741/160/49 +f 741/160/50 742/159/50 744/161/50 743/162/50 +f 743/162/51 744/161/51 746/163/51 745/164/51 +f 745/164/52 746/163/52 748/165/52 747/166/52 +f 747/166/53 748/165/53 750/167/53 749/168/53 +f 749/168/54 750/167/54 752/169/54 751/170/54 +f 751/170/55 752/169/55 754/171/55 753/172/55 +f 753/172/56 754/171/56 756/173/56 755/174/56 +f 755/174/57 756/173/57 758/175/57 757/176/57 +f 757/176/58 758/175/58 760/177/58 759/178/58 +f 759/178/59 760/177/59 762/179/59 761/180/59 +f 761/180/60 762/179/60 764/181/60 763/182/60 +f 763/182/61 764/181/61 766/183/61 765/184/61 +f 765/184/62 766/183/62 768/185/62 767/186/62 +f 767/186/63 768/185/63 770/187/63 769/188/63 +f 769/188/64 770/187/64 772/189/64 771/190/64 +f 771/190/65 772/189/65 774/191/65 773/192/65 +f 773/192/66 774/191/66 776/193/66 775/194/66 +f 775/194/67 776/193/67 778/195/67 777/196/67 +f 777/196/68 778/195/68 780/197/68 779/198/68 +f 779/198/69 780/197/69 782/199/69 781/200/69 +f 781/200/70 782/199/70 784/201/70 783/202/70 +f 783/202/71 784/201/71 786/203/71 785/204/71 +f 785/204/72 786/203/72 788/205/72 787/206/72 +f 787/206/73 788/205/73 790/207/73 789/208/73 +f 789/208/74 790/207/74 792/209/74 791/210/74 +f 791/210/75 792/209/75 794/211/75 793/212/75 +f 793/212/76 794/211/76 796/213/76 795/214/76 +f 795/214/77 796/213/77 798/215/77 797/216/77 +f 740/217/21 738/218/21 800/219/21 798/220/21 796/221/21 794/222/21 792/223/21 790/224/21 788/225/21 786/226/21 784/227/21 782/228/21 780/229/21 778/230/21 776/231/21 774/232/21 772/233/21 770/234/21 768/235/21 766/236/21 764/237/21 762/238/21 760/239/21 758/240/21 756/241/21 754/242/21 752/243/21 750/244/21 748/245/21 746/246/21 744/247/21 742/248/21 +f 797/216/78 798/215/78 800/249/78 799/250/78 +f 799/250/79 800/249/79 738/251/79 737/252/79 +f 737/253/25 739/254/25 741/255/25 743/256/25 745/257/25 747/258/25 749/259/25 751/260/25 753/261/25 755/262/25 757/263/25 759/264/25 761/265/25 763/266/25 765/267/25 767/268/25 769/269/25 771/270/25 773/271/25 775/272/25 777/273/25 779/274/25 781/275/25 783/276/25 785/277/25 787/278/25 789/279/25 791/280/25 793/281/25 795/282/25 797/283/25 799/284/25 +f 1928/285/80 3/286/80 927/4/80 983/3/80 +f 5/9/81 929/287/81 992/6/81 928/5/81 +f 28/288/82 29/289/82 931/25/82 930/24/82 +f 29/289/83 26/10/83 932/57/83 931/25/83 +f 26/10/84 5/9/84 928/5/84 932/57/84 +f 3/286/85 28/288/85 930/24/85 927/4/85 +f 29/289/86 28/288/86 936/290/86 937/291/86 +f 28/288/87 3/286/87 934/292/87 936/290/87 +f 26/10/88 29/289/88 937/291/88 938/11/88 +f 929/287/3 5/9/3 935/12/3 933/293/3 +f 3/286/87 1928/285/87 1934/294/87 934/292/87 +f 1090/103/89 1945/295/89 941/82/89 95/81/89 +f 941/82/26 942/296/26 946/297/26 948/298/26 +f 1942/98/90 988/16/90 22/15/90 940/83/90 +f 941/82/91 1945/295/91 944/299/91 942/296/91 +f 947/300/25 948/298/25 946/297/25 945/301/25 +f 939/99/91 940/83/91 947/300/91 945/301/91 +f 940/83/92 941/82/92 948/298/92 947/300/92 +f 942/296/93 939/99/93 945/301/93 946/297/93 +f 996/302/1 1927/303/1 983/3/1 995/2/1 +f 1929/304/2 981/305/2 986/7/2 992/6/2 +f 991/306/3 1937/307/3 1940/308/3 1018/309/3 +f 1002/310/4 1001/17/4 988/16/4 1014/311/4 1025/312/4 +f 1002/310/5 1025/312/5 1019/313/5 996/302/5 +f 1055/314/94 1041/315/94 1059/316/94 1058/317/94 1105/318/94 +f 1001/17/5 1002/310/5 996/302/5 995/2/5 +f 1019/313/95 1028/319/95 1066/320/95 1027/321/95 1107/322/95 1120/323/95 1118/324/95 1113/325/95 1112/326/95 1116/327/95 1109/328/95 1108/329/95 1115/330/95 1111/331/95 1114/332/95 1110/333/95 1117/334/95 1119/335/95 1106/336/95 1932/337/95 1931/338/95 +f 1025/339/96 1026/340/96 1028/341/96 1019/342/96 +f 1014/311/97 1026/343/97 1025/312/97 +f 981/305/98 1016/344/98 1692/345/98 1696/50/98 986/49/98 +f 1046/346/99 1061/347/99 1064/348/99 1057/349/99 +f 996/302/1 1019/313/1 1931/338/1 1927/303/1 +f 1929/304/2 1933/350/2 1016/344/2 981/305/2 +f 1933/350/100 1932/337/100 1106/336/100 1121/351/100 1107/322/100 1027/321/100 +f 1023/352/101 1148/353/101 1693/354/101 1691/355/101 1933/350/101 1027/321/101 1067/356/101 1033/357/101 1035/358/101 1037/359/101 1039/360/101 +f 1067/356/102 1027/321/102 1066/320/102 1104/361/102 +f 1055/314/103 1029/362/103 1056/363/103 +f 1105/318/104 1055/314/104 1067/356/104 1104/361/104 +f 1029/362/17 1062/364/17 1060/365/17 1022/366/17 +f 1055/314/105 1063/367/105 1062/364/105 1029/362/105 +f 1067/356/106 1055/314/106 1056/363/106 1033/357/106 +f 1066/320/107 1028/319/107 1026/340/107 1042/368/107 1054/369/107 1052/370/107 1050/371/107 1048/372/107 1104/361/107 +f 1026/340/25 1014/311/25 1943/373/25 1944/374/25 1091/375/25 1089/376/25 1054/369/25 1042/368/25 +f 1054/369/22 1070/377/22 1053/378/22 +f 1068/379/23 1077/380/23 1076/381/23 1044/382/23 +f 1075/383/108 1068/379/108 1044/382/108 1043/384/108 +f 1044/382/23 1076/381/23 1078/385/23 1073/386/23 +f 1074/387/23 1079/388/23 1077/380/23 1068/379/23 +f 1073/386/23 1078/385/23 1079/388/23 1074/387/23 +f 1077/380/21 1081/389/21 1080/390/21 1076/381/21 +f 1942/98/26 1947/391/26 1941/392/26 1943/373/26 +f 1097/393/27 1091/375/27 1090/103/27 1088/102/27 +f 1054/369/109 1093/394/109 1094/395/109 1070/377/109 +f 1089/376/29 1097/396/29 1093/394/29 1054/369/29 +f 1058/317/104 1105/318/104 1104/361/104 1048/372/104 1057/349/104 +f 1112/326/110 1127/397/110 1126/398/110 1116/327/110 +f 1106/336/111 1133/399/111 1135/400/111 1121/351/111 +f 1121/351/112 1135/400/112 1123/401/112 1107/322/112 +f 1118/324/110 1132/402/110 1130/403/110 1113/325/110 +f 1114/332/113 1129/404/113 1125/405/113 1110/333/113 +f 1107/322/110 1123/401/110 1122/406/110 1120/323/110 +f 1119/335/114 1134/407/114 1133/399/114 1106/336/114 +f 1110/333/114 1125/405/114 1124/408/114 1117/334/114 +f 1115/330/113 1131/409/113 1128/410/113 1111/331/113 +f 1117/334/115 1145/411/115 1144/412/115 1119/335/115 +f 1108/329/116 1136/413/116 1138/414/116 1115/330/116 +f 1120/323/117 1147/415/117 1146/416/117 1118/324/117 +f 1113/325/118 1142/417/118 1141/418/118 1112/326/118 +f 1111/331/116 1140/419/116 1139/420/116 1114/332/116 +f 1116/327/118 1143/421/118 1137/422/118 1109/328/118 +f 1151/423/119 1149/424/119 1017/425/119 982/426/119 987/136/119 1150/135/119 1152/134/119 +f 1023/352/120 1158/427/120 1157/428/120 1148/353/120 +f 1694/429/121 1693/430/121 1148/431/121 1151/423/121 +f 1016/344/122 1933/350/122 1691/432/122 1692/345/122 +f 1695/146/123 1702/433/123 1700/434/123 1694/429/123 +f 1694/429/124 1151/423/124 1152/134/124 1695/146/124 +f 1692/345/125 1697/435/125 1701/436/125 1696/50/125 +f 1694/429/126 1700/434/126 1699/437/126 1693/430/126 +f 1693/354/127 1699/438/127 1698/439/127 1691/355/127 +f 1691/432/128 1698/440/128 1697/435/128 1692/345/128 +f 1737/441/48 1739/442/48 1740/443/48 1738/444/48 +f 1739/442/49 1741/445/49 1742/446/49 1740/443/49 +f 1741/445/50 1743/447/50 1744/448/50 1742/446/50 +f 1743/447/51 1745/449/51 1746/450/51 1744/448/51 +f 1745/449/52 1747/451/52 1748/452/52 1746/450/52 +f 1747/451/53 1749/453/53 1750/454/53 1748/452/53 +f 1749/453/54 1751/455/54 1752/456/54 1750/454/54 +f 1751/455/55 1753/457/55 1754/458/55 1752/456/55 +f 1753/457/56 1755/459/56 1756/460/56 1754/458/56 +f 1755/459/57 1757/461/57 1758/462/57 1756/460/57 +f 1757/461/58 1759/463/58 1760/464/58 1758/462/58 +f 1759/463/59 1761/465/59 1762/466/59 1760/464/59 +f 1761/465/60 1763/467/60 1764/468/60 1762/466/60 +f 1763/467/61 1765/469/61 1766/470/61 1764/468/61 +f 1765/469/62 1767/471/62 1768/472/62 1766/470/62 +f 1767/471/63 1769/473/63 1770/474/63 1768/472/63 +f 1769/473/64 1771/475/64 1772/476/64 1770/474/64 +f 1771/475/65 1773/477/65 1774/478/65 1772/476/65 +f 1773/477/66 1775/479/66 1776/480/66 1774/478/66 +f 1775/479/67 1777/481/67 1778/482/67 1776/480/67 +f 1777/481/68 1779/483/68 1780/484/68 1778/482/68 +f 1779/483/69 1781/485/69 1782/486/69 1780/484/69 +f 1781/485/70 1783/487/70 1784/488/70 1782/486/70 +f 1783/487/71 1785/489/71 1786/490/71 1784/488/71 +f 1785/489/72 1787/491/72 1788/492/72 1786/490/72 +f 1787/491/73 1789/493/73 1790/494/73 1788/492/73 +f 1789/493/74 1791/495/74 1792/496/74 1790/494/74 +f 1791/495/75 1793/497/75 1794/498/75 1792/496/75 +f 1793/497/76 1795/499/76 1796/500/76 1794/498/76 +f 1795/499/77 1797/501/77 1798/502/77 1796/500/77 +f 1740/503/25 1742/504/25 1744/505/25 1746/506/25 1748/507/25 1750/508/25 1752/509/25 1754/510/25 1756/511/25 1758/512/25 1760/513/25 1762/514/25 1764/515/25 1766/516/25 1768/517/25 1770/518/25 1772/519/25 1774/520/25 1776/521/25 1778/522/25 1780/523/25 1782/524/25 1784/525/25 1786/526/25 1788/527/25 1790/528/25 1792/529/25 1794/530/25 1796/531/25 1798/532/25 1800/533/25 1738/534/25 +f 1797/501/78 1799/535/78 1800/536/78 1798/502/78 +f 1799/535/79 1737/537/79 1738/538/79 1800/536/79 +f 1737/539/21 1799/540/21 1797/541/21 1795/542/21 1793/543/21 1791/544/21 1789/545/21 1787/546/21 1785/547/21 1783/548/21 1781/549/21 1779/550/21 1777/551/21 1775/552/21 1773/553/21 1771/554/21 1769/555/21 1767/556/21 1765/557/21 1763/558/21 1761/559/21 1759/560/21 1757/561/21 1755/562/21 1753/563/21 1751/564/21 1749/565/21 1747/566/21 1745/567/21 1743/568/21 1741/569/21 1739/570/21 +f 1928/285/129 983/3/129 1927/303/129 984/571/129 +f 991/306/130 1929/304/130 992/6/130 1930/572/130 +f 1020/573/131 1931/338/131 1932/337/131 1021/574/131 +f 1021/574/132 1932/337/132 1933/350/132 1018/309/132 +f 1018/309/133 1933/350/133 1929/304/133 991/306/133 +f 984/571/134 1927/303/134 1931/338/134 1020/573/134 +f 1021/574/135 1939/575/135 1938/576/135 1020/573/135 +f 1020/573/87 1938/576/87 1936/577/87 984/571/87 +f 1018/309/136 1940/308/136 1939/575/136 1021/574/136 +f 1930/572/3 1935/578/3 1937/307/3 991/306/3 +f 984/571/87 1936/577/87 1934/294/87 1928/285/87 +f 1090/103/89 1091/375/89 1944/374/89 1945/295/89 +f 1944/374/26 1952/579/26 1950/580/26 1946/581/26 +f 1942/98/90 1943/373/90 1014/311/90 988/16/90 +f 1944/374/91 1946/581/91 1948/582/91 1945/295/91 +f 1951/583/21 1949/584/21 1950/580/21 1952/579/21 +f 1941/392/91 1949/584/91 1951/583/91 1943/373/91 +f 1943/373/92 1951/583/92 1952/579/92 1944/374/92 +f 1946/581/93 1950/580/93 1949/584/93 1941/392/93 +usemtl Материал +f 697/150/137 700/147/137 699/151/137 698/154/137 +f 697/150/138 701/149/138 702/148/138 700/147/138 +f 1697/435/139 1698/440/139 1699/437/139 1700/434/139 +f 1697/435/140 1700/434/140 1702/433/140 1701/436/140 +usemtl Материал.001 +f 993/585/141 6/586/141 2/137/141 987/587/141 +f 12/588/21 13/589/21 14/590/21 15/591/21 16/592/21 11/593/21 +f 9/594/21 21/595/21 20/596/21 19/597/21 18/598/21 17/599/21 +f 14/590/142 13/589/142 42/600/142 44/601/142 +f 13/589/143 12/588/143 38/602/143 42/600/143 +f 152/67/144 158/603/144 161/604/144 159/140/144 +f 17/599/145 18/598/145 55/605/145 53/606/145 +f 11/593/146 16/592/146 48/607/146 39/608/146 +f 18/598/147 19/597/147 57/609/147 55/605/147 +f 19/597/148 20/596/148 59/610/148 57/609/148 +f 6/586/149 11/593/149 39/608/149 40/611/149 31/59/149 +f 15/591/150 14/590/150 44/601/150 46/612/150 +f 2/137/151 6/586/151 31/59/151 25/138/151 +f 16/592/152 15/591/152 46/612/152 48/607/152 +f 37/70/153 64/69/153 41/63/153 42/600/153 38/602/153 +f 41/63/154 43/62/154 44/601/154 42/600/154 +f 43/62/155 45/61/155 46/612/155 44/601/155 +f 45/61/156 47/60/156 48/607/156 46/612/156 +f 47/60/157 40/611/157 39/608/157 48/607/157 +f 12/588/158 4/613/158 30/71/158 37/70/158 38/602/158 +f 8/614/159 17/599/159 53/606/159 54/53/159 32/615/159 +f 72/616/160 55/617/160 56/618/160 65/619/160 +f 55/605/161 57/609/161 58/76/161 56/75/161 +f 57/609/162 59/610/162 60/77/162 58/76/162 +f 59/610/163 61/84/163 62/78/163 60/77/163 +f 69/56/21 72/55/21 73/620/21 71/74/21 70/73/21 68/72/21 +f 65/54/164 66/21/164 73/620/164 72/55/164 +f 66/21/165 109/20/165 63/19/165 71/74/165 73/620/165 +f 30/71/166 54/53/166 69/56/166 68/72/166 +f 69/621/167 53/622/167 55/617/167 72/616/167 +f 69/621/168 54/623/168 53/622/168 +f 79/624/21 82/94/21 81/92/21 80/625/21 +f 23/626/169 77/627/169 79/624/169 80/625/169 +f 52/87/170 23/626/170 80/625/170 81/92/170 +f 77/627/171 76/86/171 82/94/171 79/624/171 +f 84/88/172 86/93/172 90/628/172 88/96/172 +f 89/97/173 88/96/173 90/628/173 91/629/173 +f 87/95/174 85/89/174 89/97/174 91/629/174 +f 86/93/21 87/95/21 91/629/21 90/628/21 +f 985/630/170 23/626/170 52/87/170 51/91/170 106/631/170 9/594/170 1000/632/170 +f 985/630/175 1084/633/175 92/634/175 77/627/175 23/626/175 +f 1086/635/176 102/636/176 92/634/176 1084/633/176 +f 101/106/177 102/637/177 1086/635/177 1088/102/177 +f 77/638/178 93/639/178 102/636/178 100/640/178 +f 96/641/179 97/105/179 98/104/179 99/642/179 +f 96/641/21 100/643/21 102/637/21 101/106/21 97/105/21 +f 76/86/180 77/627/180 100/643/180 96/641/180 +f 83/90/181 76/86/181 96/641/181 99/642/181 +f 99/644/182 88/96/182 89/645/182 83/646/182 +f 61/84/183 59/610/183 105/647/183 104/648/183 78/85/183 +f 99/642/184 98/104/184 107/649/184 103/650/184 +f 106/631/185 51/91/185 99/642/185 103/650/185 +f 20/596/183 103/650/183 107/649/183 59/610/183 +f 149/122/186 150/125/186 136/113/186 128/118/186 +f 130/107/187 147/132/187 142/123/187 135/120/187 +f 151/126/188 148/121/188 138/117/188 126/116/188 +f 143/129/189 133/115/189 134/112/189 146/128/189 +f 143/129/190 146/128/190 145/127/190 144/130/190 +f 142/123/191 147/132/191 141/131/191 140/124/191 +f 148/121/192 151/126/192 150/125/192 149/122/192 +f 131/108/193 132/119/193 144/130/193 145/127/193 +f 113/34/194 112/33/194 140/124/194 141/131/194 +f 152/143/195 154/651/195 153/652/195 +f 156/653/196 157/654/196 158/603/196 155/655/196 +f 153/139/197 25/138/197 156/653/197 155/655/197 +f 25/138/198 31/59/198 157/654/198 156/653/198 +f 152/67/199 153/139/199 155/655/199 158/603/199 +f 160/141/200 159/140/200 161/604/200 162/656/200 +f 158/603/201 157/654/201 162/656/201 161/604/201 +f 157/654/149 31/59/149 160/141/149 162/656/149 +f 154/133/202 153/139/202 1150/135/202 1152/134/202 +f 153/652/203 25/657/203 2/658/203 987/659/203 1150/660/203 +f 163/661/204 169/662/204 176/663/204 170/664/204 +f 168/665/205 167/666/205 174/667/205 175/668/205 +f 166/669/206 165/670/206 172/671/206 173/672/206 +f 164/673/207 163/661/207 170/664/207 171/674/207 +f 169/662/208 168/665/208 175/668/208 176/663/208 +f 167/666/209 166/669/209 173/672/209 174/667/209 +f 165/670/210 164/673/210 171/674/210 172/671/210 +f 174/667/211 173/672/211 180/675/211 181/676/211 +f 172/671/212 171/674/212 178/677/212 179/678/212 +f 170/664/213 176/663/213 183/679/213 177/680/213 +f 175/668/214 174/667/214 181/676/214 182/681/214 +f 173/672/215 172/671/215 179/678/215 180/675/215 +f 171/674/216 170/664/216 177/680/216 178/677/216 +f 176/663/217 175/668/217 182/681/217 183/679/217 +f 202/682/25 201/683/25 214/684/25 217/685/25 +f 210/686/25 209/687/25 222/688/25 225/689/25 +f 206/690/25 205/691/25 218/692/25 221/693/25 +f 198/694/25 211/695/25 224/696/25 213/697/25 +f 184/698/218 226/699/218 247/700/218 246/701/218 +f 208/702/25 207/703/25 220/704/25 223/705/25 +f 204/706/25 203/707/25 216/708/25 219/709/25 +f 204/706/21 219/709/21 232/710/21 235/711/21 +f 206/690/21 221/693/21 187/712/21 188/713/21 +f 205/691/21 204/706/21 235/711/21 234/714/21 +f 207/703/21 206/690/21 188/713/21 189/715/21 +f 218/692/21 205/691/21 234/714/21 233/716/21 +f 198/694/21 213/697/21 193/717/21 190/718/21 +f 219/709/23 218/692/23 233/716/23 232/710/23 +f 200/719/25 199/720/25 212/721/25 215/722/25 +f 187/712/219 186/723/219 248/724/219 251/725/219 +f 227/726/220 185/727/220 245/728/220 244/729/220 +f 239/730/221 236/731/221 264/732/221 267/733/221 +f 230/734/222 231/735/222 252/736/222 243/737/222 +f 238/738/223 239/730/223 267/733/223 266/739/223 +f 229/740/224 230/734/224 243/737/224 242/741/224 +f 221/693/23 220/704/23 186/723/23 187/712/23 +f 215/722/23 214/684/23 237/742/23 236/731/23 +f 220/704/21 207/703/21 189/715/21 186/723/21 +f 214/684/21 201/683/21 238/738/21 237/742/21 +f 223/705/23 222/688/23 184/698/23 185/727/23 +f 201/683/21 200/719/21 239/730/21 238/738/21 +f 222/688/21 209/687/21 226/699/21 184/698/21 +f 211/695/21 210/686/21 196/743/21 197/744/21 +f 200/719/21 215/722/21 236/731/21 239/730/21 +f 209/687/21 208/702/21 227/726/21 226/699/21 +f 210/686/21 225/689/21 195/745/21 196/743/21 +f 208/702/21 223/705/21 185/727/21 227/726/21 +f 225/689/23 224/696/23 194/746/23 195/745/23 +f 203/707/21 202/682/21 229/740/21 228/747/21 +f 224/696/21 211/695/21 197/744/21 194/746/21 +f 202/682/21 217/685/21 230/734/21 229/740/21 +f 213/697/23 212/721/23 192/748/23 193/717/23 +f 217/685/23 216/708/23 231/735/23 230/734/23 +f 212/721/21 199/720/21 191/749/21 192/748/21 +f 216/708/21 203/707/21 228/747/21 231/735/21 +f 199/720/21 198/694/21 190/718/21 191/749/21 +f 261/750/25 260/751/25 258/752/25 259/753/25 +f 257/754/25 254/755/25 255/756/25 256/757/25 +f 250/758/25 251/725/25 248/724/25 249/759/25 +f 246/701/25 247/700/25 244/729/25 245/728/25 +f 242/741/25 243/737/25 252/736/25 253/760/25 +f 241/761/25 262/762/25 263/763/25 240/764/25 +f 265/765/25 266/739/25 267/733/25 264/732/25 +f 189/715/225 188/713/225 250/758/225 249/759/225 +f 186/723/226 189/715/226 249/759/226 248/724/226 +f 226/699/227 227/726/227 244/729/227 247/700/227 +f 188/713/228 187/712/228 251/725/228 250/758/228 +f 185/727/229 184/698/229 246/701/229 245/728/229 +f 231/735/230 228/747/230 253/760/230 252/736/230 +f 228/747/231 229/740/231 242/741/231 253/760/231 +f 191/749/232 190/718/232 255/756/232 254/755/232 +f 193/717/233 192/748/233 257/754/233 256/757/233 +f 194/746/234 197/744/234 259/753/234 258/752/234 +f 233/716/235 234/714/235 262/762/235 241/761/235 +f 195/745/236 194/746/236 258/752/236 260/751/236 +f 234/714/237 235/711/237 263/763/237 262/762/237 +f 196/743/238 195/745/238 260/751/238 261/750/238 +f 235/711/239 232/710/239 240/764/239 263/763/239 +f 197/744/240 196/743/240 261/750/240 259/753/240 +f 236/731/241 237/742/241 265/765/241 264/732/241 +f 192/748/242 191/749/242 254/755/242 257/754/242 +f 237/742/243 238/738/243 266/739/243 265/765/243 +f 232/710/244 233/716/244 241/761/244 240/764/244 +f 190/718/245 193/717/245 256/757/245 255/756/245 +f 164/673/21 165/670/21 166/669/21 167/666/21 168/665/21 169/662/21 163/661/21 +f 428/766/204 434/767/204 441/768/204 435/769/204 +f 433/770/205 432/771/205 439/772/205 440/773/205 +f 431/774/206 430/775/206 437/776/206 438/777/206 +f 429/778/207 428/766/207 435/769/207 436/779/207 +f 434/767/208 433/770/208 440/773/208 441/768/208 +f 432/771/209 431/774/209 438/777/209 439/772/209 +f 430/775/210 429/778/210 436/779/210 437/776/210 +f 439/772/211 438/777/211 445/780/211 446/781/211 +f 437/776/212 436/779/212 443/782/212 444/783/212 +f 435/769/213 441/768/213 448/784/213 442/785/213 +f 440/773/214 439/772/214 446/781/214 447/786/214 +f 438/777/215 437/776/215 444/783/215 445/780/215 +f 436/779/246 435/769/246 442/785/246 443/782/246 +f 441/768/217 440/773/217 447/786/217 448/784/217 +f 467/787/25 466/788/25 479/789/25 482/790/25 +f 475/791/25 474/792/25 487/793/25 490/794/25 +f 471/795/25 470/796/25 483/797/25 486/798/25 +f 463/799/25 476/800/25 489/801/25 478/802/25 +f 449/803/218 491/804/218 512/805/218 511/806/218 +f 473/807/25 472/808/25 485/809/25 488/810/25 +f 469/811/25 468/812/25 481/813/25 484/814/25 +f 469/811/21 484/814/21 497/815/21 500/816/21 +f 471/795/21 486/798/21 452/817/21 453/818/21 +f 470/796/21 469/811/21 500/816/21 499/819/21 +f 472/808/21 471/795/21 453/818/21 454/820/21 +f 483/797/21 470/796/21 499/819/21 498/821/21 +f 463/799/21 478/802/21 458/822/21 455/823/21 +f 484/814/23 483/797/23 498/821/23 497/815/23 +f 465/824/25 464/825/25 477/826/25 480/827/25 +f 452/817/219 451/828/219 513/829/219 516/830/219 +f 492/831/220 450/832/220 510/833/220 509/834/220 +f 504/835/221 501/836/221 529/837/221 532/838/221 +f 495/839/222 496/840/222 517/841/222 508/842/222 +f 503/843/223 504/835/223 532/838/223 531/844/223 +f 494/845/224 495/839/224 508/842/224 507/846/224 +f 486/798/23 485/809/23 451/828/23 452/817/23 +f 480/827/23 479/789/23 502/847/23 501/836/23 +f 485/809/21 472/808/21 454/820/21 451/828/21 +f 479/789/21 466/788/21 503/843/21 502/847/21 +f 488/810/23 487/793/23 449/803/23 450/832/23 +f 466/788/21 465/824/21 504/835/21 503/843/21 +f 487/793/21 474/792/21 491/804/21 449/803/21 +f 476/800/21 475/791/21 461/848/21 462/849/21 +f 465/824/21 480/827/21 501/836/21 504/835/21 +f 474/792/21 473/807/21 492/831/21 491/804/21 +f 475/791/21 490/794/21 460/850/21 461/848/21 +f 473/807/21 488/810/21 450/832/21 492/831/21 +f 490/794/23 489/801/23 459/851/23 460/850/23 +f 468/812/21 467/787/21 494/845/21 493/852/21 +f 489/801/21 476/800/21 462/849/21 459/851/21 +f 467/787/21 482/790/21 495/839/21 494/845/21 +f 478/802/23 477/826/23 457/853/23 458/822/23 +f 482/790/23 481/813/23 496/840/23 495/839/23 +f 477/826/21 464/825/21 456/854/21 457/853/21 +f 481/813/21 468/812/21 493/852/21 496/840/21 +f 464/825/21 463/799/21 455/823/21 456/854/21 +f 526/855/25 525/856/25 523/857/25 524/858/25 +f 522/859/25 519/860/25 520/861/25 521/862/25 +f 515/863/25 516/830/25 513/829/25 514/864/25 +f 511/806/25 512/805/25 509/834/25 510/833/25 +f 507/846/25 508/842/25 517/841/25 518/865/25 +f 506/866/25 527/867/25 528/868/25 505/869/25 +f 530/870/25 531/844/25 532/838/25 529/837/25 +f 454/820/225 453/818/225 515/863/225 514/864/225 +f 451/828/226 454/820/226 514/864/226 513/829/226 +f 491/804/227 492/831/227 509/834/227 512/805/227 +f 453/818/228 452/817/228 516/830/228 515/863/228 +f 450/832/229 449/803/229 511/806/229 510/833/229 +f 496/840/230 493/852/230 518/865/230 517/841/230 +f 493/852/231 494/845/231 507/846/231 518/865/231 +f 456/854/232 455/823/232 520/861/232 519/860/232 +f 458/822/233 457/853/233 522/859/233 521/862/233 +f 459/851/234 462/849/234 524/858/234 523/857/234 +f 498/821/235 499/819/235 527/867/235 506/866/235 +f 460/850/236 459/851/236 523/857/236 525/856/236 +f 499/819/237 500/816/237 528/868/237 527/867/237 +f 461/848/238 460/850/238 525/856/238 526/855/238 +f 500/816/239 497/815/239 505/869/239 528/868/239 +f 462/849/240 461/848/240 526/855/240 524/858/240 +f 501/836/241 502/847/241 530/870/241 529/837/241 +f 457/853/242 456/854/242 519/860/242 522/859/242 +f 502/847/243 503/843/243 531/844/243 530/870/243 +f 497/815/244 498/821/244 506/866/244 505/869/244 +f 455/823/245 458/822/245 521/862/245 520/861/245 +f 429/778/21 430/775/21 431/774/21 432/771/21 433/770/21 434/767/21 428/766/21 +f 993/585/247 987/587/247 982/426/247 994/871/247 +f 1004/872/25 1003/873/25 1008/874/25 1007/875/25 1006/876/25 1005/877/25 +f 999/878/25 1009/879/25 1010/880/25 1011/881/25 1012/882/25 1013/883/25 +f 1006/876/142 1036/884/142 1034/885/142 1005/877/142 +f 1005/877/143 1034/885/143 1030/886/143 1004/872/143 +f 1148/353/144 1157/428/144 1159/887/144 1156/888/144 +f 1009/879/145 1045/889/145 1047/890/145 1010/880/145 +f 1003/873/146 1031/891/146 1040/892/146 1008/874/146 +f 1010/880/147 1047/890/147 1049/893/147 1011/881/147 +f 1011/881/148 1049/893/148 1051/894/148 1012/882/148 +f 994/871/149 1023/352/149 1032/895/149 1031/891/149 1003/873/149 +f 1007/875/150 1038/896/150 1036/884/150 1006/876/150 +f 982/426/248 1017/425/248 1023/352/248 994/871/248 +f 1008/874/152 1040/892/152 1038/896/152 1007/875/152 +f 1029/362/249 1030/886/249 1034/885/249 1033/357/249 1056/363/249 +f 1033/357/250 1034/885/250 1036/884/250 1035/358/250 +f 1035/358/251 1036/884/251 1038/896/251 1037/359/251 +f 1037/359/252 1038/896/252 1040/892/252 1039/360/252 +f 1039/360/253 1040/892/253 1031/891/253 1032/895/253 +f 1004/872/254 1030/886/254 1029/362/254 1022/366/254 989/897/254 +f 997/898/255 1024/899/255 1046/346/255 1045/889/255 1009/879/255 +f 1064/900/256 1057/901/256 1048/902/256 1047/903/256 +f 1047/890/257 1048/372/257 1050/371/257 1049/893/257 +f 1049/893/258 1050/371/258 1052/370/258 1051/894/258 +f 1051/894/259 1052/370/259 1054/369/259 1053/378/259 +f 1061/347/25 1060/365/25 1062/364/25 1063/367/25 1065/904/25 1064/348/25 +f 1057/349/260 1064/348/260 1065/904/260 1058/317/260 +f 1058/317/261 1065/904/261 1063/367/261 1055/314/261 1105/318/261 +f 1022/366/166 1060/365/166 1061/347/166 1046/346/166 +f 1061/905/262 1064/900/262 1047/903/262 1045/906/262 +f 1061/905/168 1045/906/168 1046/907/168 +f 1071/908/25 1072/909/25 1073/386/25 1074/387/25 +f 1015/910/169 1072/909/169 1071/908/169 1069/911/169 +f 1044/382/170 1073/386/170 1072/909/170 1015/910/170 +f 1069/911/171 1071/908/171 1074/387/171 1068/379/171 +f 1076/381/172 1080/390/172 1082/912/172 1078/385/172 +f 1081/389/173 1083/913/173 1082/912/173 1080/390/173 +f 1079/388/174 1083/913/174 1081/389/174 1077/380/174 +f 1078/385/25 1082/912/25 1083/913/25 1079/388/25 +f 985/630/170 1000/632/170 999/878/170 1102/914/170 1043/384/170 1044/382/170 1015/910/170 +f 985/630/175 1015/910/175 1069/911/175 1085/915/175 1084/633/175 +f 1086/635/176 1084/633/176 1085/915/176 1098/916/176 +f 1097/396/177 1088/102/177 1086/635/177 1098/917/177 +f 1069/918/263 1096/919/263 1098/916/263 1087/920/263 +f 1092/921/264 1095/922/264 1094/395/264 1093/394/264 +f 1092/921/25 1093/394/25 1097/396/25 1098/917/25 1096/923/25 +f 1068/379/265 1092/921/265 1096/923/265 1069/911/265 +f 1075/383/266 1095/922/266 1092/921/266 1068/379/266 +f 1095/924/267 1075/925/267 1081/926/267 1080/390/267 +f 1053/378/183 1070/377/183 1100/927/183 1101/928/183 1051/894/183 +f 1095/922/184 1099/929/184 1103/930/184 1094/395/184 +f 1102/914/268 1099/929/268 1095/922/268 1043/384/268 +f 1012/882/183 1051/894/183 1103/930/183 1099/929/183 +f 1145/411/269 1124/408/269 1132/402/269 1146/416/269 +f 1126/398/270 1131/409/270 1138/414/270 1143/421/270 +f 1147/415/271 1122/406/271 1134/407/271 1144/412/271 +f 1139/420/272 1142/417/272 1130/403/272 1129/404/272 +f 1139/420/273 1140/419/273 1141/418/273 1142/417/273 +f 1138/414/274 1136/413/274 1137/422/274 1143/421/274 +f 1144/412/275 1145/411/275 1146/416/275 1147/415/275 +f 1127/397/276 1141/418/276 1140/419/276 1128/410/276 +f 1109/328/277 1137/422/277 1136/413/277 1108/329/277 +f 1148/431/278 1149/931/278 1151/932/278 +f 1154/933/279 1153/934/279 1156/888/279 1155/935/279 +f 1149/424/280 1153/934/280 1154/933/280 1017/425/280 +f 1017/425/281 1154/933/281 1155/935/281 1023/352/281 +f 1148/353/282 1156/888/282 1153/934/282 1149/424/282 +f 1158/427/200 1160/936/200 1159/887/200 1157/428/200 +f 1156/888/283 1159/887/283 1160/936/283 1155/935/283 +f 1155/935/149 1160/936/149 1158/427/149 1023/352/149 +f 1151/423/284 1152/134/284 1150/135/284 1149/424/284 +f 1149/931/285 1150/660/285 987/659/285 982/937/285 1017/938/285 +f 1161/939/286 1168/940/286 1174/941/286 1167/942/286 +f 1166/943/287 1173/944/287 1172/945/287 1165/946/287 +f 1164/947/288 1171/948/288 1170/949/288 1163/950/288 +f 1162/951/289 1169/952/289 1168/940/289 1161/939/289 +f 1167/942/290 1174/941/290 1173/944/290 1166/943/290 +f 1165/946/291 1172/945/291 1171/948/291 1164/947/291 +f 1163/950/292 1170/949/292 1169/952/292 1162/951/292 +f 1172/945/293 1179/953/293 1178/954/293 1171/948/293 +f 1170/949/294 1177/955/294 1176/956/294 1169/952/294 +f 1168/940/295 1175/957/295 1181/958/295 1174/941/295 +f 1173/944/296 1180/959/296 1179/953/296 1172/945/296 +f 1171/948/297 1178/954/297 1177/955/297 1170/949/297 +f 1169/952/298 1176/956/298 1175/957/298 1168/940/298 +f 1174/941/299 1181/958/299 1180/959/299 1173/944/299 +f 1200/960/21 1215/961/21 1212/962/21 1199/963/21 +f 1208/964/21 1223/965/21 1220/966/21 1207/967/21 +f 1204/968/21 1219/969/21 1216/970/21 1203/971/21 +f 1196/972/21 1211/973/21 1222/974/21 1209/975/21 +f 1182/976/300 1244/977/300 1245/978/300 1224/979/300 +f 1206/980/21 1221/981/21 1218/982/21 1205/983/21 +f 1202/984/21 1217/985/21 1214/986/21 1201/987/21 +f 1202/984/25 1233/988/25 1230/989/25 1217/985/25 +f 1204/968/25 1186/990/25 1185/991/25 1219/969/25 +f 1203/971/25 1232/992/25 1233/988/25 1202/984/25 +f 1205/983/25 1187/993/25 1186/990/25 1204/968/25 +f 1216/970/25 1231/994/25 1232/992/25 1203/971/25 +f 1196/972/25 1188/995/25 1191/996/25 1211/973/25 +f 1217/985/23 1230/989/23 1231/994/23 1216/970/23 +f 1198/997/21 1213/998/21 1210/999/21 1197/1000/21 +f 1185/991/301 1249/1001/301 1246/1002/301 1184/1003/301 +f 1225/1004/302 1242/1005/302 1243/1006/302 1183/1007/302 +f 1237/1008/303 1265/1009/303 1262/1010/303 1234/1011/303 +f 1228/1012/304 1241/1013/304 1250/1014/304 1229/1015/304 +f 1236/1016/305 1264/1017/305 1265/1009/305 1237/1008/305 +f 1227/1018/306 1240/1019/306 1241/1013/306 1228/1012/306 +f 1219/969/23 1185/991/23 1184/1003/23 1218/982/23 +f 1213/998/23 1234/1011/23 1235/1020/23 1212/962/23 +f 1218/982/25 1184/1003/25 1187/993/25 1205/983/25 +f 1212/962/25 1235/1020/25 1236/1016/25 1199/963/25 +f 1221/981/23 1183/1007/23 1182/976/23 1220/966/23 +f 1199/963/25 1236/1016/25 1237/1008/25 1198/997/25 +f 1220/966/25 1182/976/25 1224/979/25 1207/967/25 +f 1209/975/25 1195/1021/25 1194/1022/25 1208/964/25 +f 1198/997/25 1237/1008/25 1234/1011/25 1213/998/25 +f 1207/967/25 1224/979/25 1225/1004/25 1206/980/25 +f 1208/964/25 1194/1022/25 1193/1023/25 1223/965/25 +f 1206/980/25 1225/1004/25 1183/1007/25 1221/981/25 +f 1223/965/23 1193/1023/23 1192/1024/23 1222/974/23 +f 1201/987/25 1226/1025/25 1227/1018/25 1200/960/25 +f 1222/974/25 1192/1024/25 1195/1021/25 1209/975/25 +f 1200/960/25 1227/1018/25 1228/1012/25 1215/961/25 +f 1211/973/23 1191/996/23 1190/1026/23 1210/999/23 +f 1215/961/23 1228/1012/23 1229/1015/23 1214/986/23 +f 1210/999/25 1190/1026/25 1189/1027/25 1197/1000/25 +f 1214/986/25 1229/1015/25 1226/1025/25 1201/987/25 +f 1197/1000/25 1189/1027/25 1188/995/25 1196/972/25 +f 1259/1028/21 1257/1029/21 1256/1030/21 1258/1031/21 +f 1255/1032/21 1254/1033/21 1253/1034/21 1252/1035/21 +f 1248/1036/21 1247/1037/21 1246/1002/21 1249/1001/21 +f 1244/977/21 1243/1006/21 1242/1005/21 1245/978/21 +f 1240/1019/21 1251/1038/21 1250/1014/21 1241/1013/21 +f 1239/1039/21 1238/1040/21 1261/1041/21 1260/1042/21 +f 1263/1043/21 1262/1010/21 1265/1009/21 1264/1017/21 +f 1187/993/307 1247/1037/307 1248/1036/307 1186/990/307 +f 1184/1003/308 1246/1002/308 1247/1037/308 1187/993/308 +f 1224/979/309 1245/978/309 1242/1005/309 1225/1004/309 +f 1186/990/310 1248/1036/310 1249/1001/310 1185/991/310 +f 1183/1007/311 1243/1006/311 1244/977/311 1182/976/311 +f 1229/1015/312 1250/1014/312 1251/1038/312 1226/1025/312 +f 1226/1025/313 1251/1038/313 1240/1019/313 1227/1018/313 +f 1189/1027/314 1252/1035/314 1253/1034/314 1188/995/314 +f 1191/996/315 1254/1033/315 1255/1032/315 1190/1026/315 +f 1192/1024/316 1256/1030/316 1257/1029/316 1195/1021/316 +f 1231/994/317 1239/1039/317 1260/1042/317 1232/992/317 +f 1193/1023/318 1258/1031/318 1256/1030/318 1192/1024/318 +f 1232/992/319 1260/1042/319 1261/1041/319 1233/988/319 +f 1194/1022/320 1259/1028/320 1258/1031/320 1193/1023/320 +f 1233/988/321 1261/1041/321 1238/1040/321 1230/989/321 +f 1195/1021/322 1257/1029/322 1259/1028/322 1194/1022/322 +f 1234/1011/323 1262/1010/323 1263/1043/323 1235/1020/323 +f 1190/1026/324 1255/1032/324 1252/1035/324 1189/1027/324 +f 1235/1020/325 1263/1043/325 1264/1017/325 1236/1016/325 +f 1230/989/326 1238/1040/326 1239/1039/326 1231/994/326 +f 1188/995/327 1253/1034/327 1254/1033/327 1191/996/327 +f 1162/951/25 1161/939/25 1167/942/25 1166/943/25 1165/946/25 1164/947/25 1163/950/25 +f 1426/1044/286 1433/1045/286 1439/1046/286 1432/1047/286 +f 1431/1048/287 1438/1049/287 1437/1050/287 1430/1051/287 +f 1429/1052/288 1436/1053/288 1435/1054/288 1428/1055/288 +f 1427/1056/289 1434/1057/289 1433/1045/289 1426/1044/289 +f 1432/1047/290 1439/1046/290 1438/1049/290 1431/1048/290 +f 1430/1051/291 1437/1050/291 1436/1053/291 1429/1052/291 +f 1428/1055/292 1435/1054/292 1434/1057/292 1427/1056/292 +f 1437/1050/293 1444/1058/293 1443/1059/293 1436/1053/293 +f 1435/1054/294 1442/1060/294 1441/1061/294 1434/1057/294 +f 1433/1045/295 1440/1062/295 1446/1063/295 1439/1046/295 +f 1438/1049/296 1445/1064/296 1444/1058/296 1437/1050/296 +f 1436/1053/297 1443/1059/297 1442/1060/297 1435/1054/297 +f 1434/1057/328 1441/1061/328 1440/1062/328 1433/1045/328 +f 1439/1046/299 1446/1063/299 1445/1064/299 1438/1049/299 +f 1465/1065/21 1480/1066/21 1477/1067/21 1464/1068/21 +f 1473/1069/21 1488/1070/21 1485/1071/21 1472/1072/21 +f 1469/1073/21 1484/1074/21 1481/1075/21 1468/1076/21 +f 1461/1077/21 1476/1078/21 1487/1079/21 1474/1080/21 +f 1447/1081/300 1509/1082/300 1510/1083/300 1489/1084/300 +f 1471/1085/21 1486/1086/21 1483/1087/21 1470/1088/21 +f 1467/1089/21 1482/1090/21 1479/1091/21 1466/1092/21 +f 1467/1089/25 1498/1093/25 1495/1094/25 1482/1090/25 +f 1469/1073/25 1451/1095/25 1450/1096/25 1484/1074/25 +f 1468/1076/25 1497/1097/25 1498/1093/25 1467/1089/25 +f 1470/1088/25 1452/1098/25 1451/1095/25 1469/1073/25 +f 1481/1075/25 1496/1099/25 1497/1097/25 1468/1076/25 +f 1461/1077/25 1453/1100/25 1456/1101/25 1476/1078/25 +f 1482/1090/23 1495/1094/23 1496/1099/23 1481/1075/23 +f 1463/1102/21 1478/1103/21 1475/1104/21 1462/1105/21 +f 1450/1096/301 1514/1106/301 1511/1107/301 1449/1108/301 +f 1490/1109/302 1507/1110/302 1508/1111/302 1448/1112/302 +f 1502/1113/303 1530/1114/303 1527/1115/303 1499/1116/303 +f 1493/1117/304 1506/1118/304 1515/1119/304 1494/1120/304 +f 1501/1121/305 1529/1122/305 1530/1114/305 1502/1113/305 +f 1492/1123/306 1505/1124/306 1506/1118/306 1493/1117/306 +f 1484/1074/23 1450/1096/23 1449/1108/23 1483/1087/23 +f 1478/1103/23 1499/1116/23 1500/1125/23 1477/1067/23 +f 1483/1087/25 1449/1108/25 1452/1098/25 1470/1088/25 +f 1477/1067/25 1500/1125/25 1501/1121/25 1464/1068/25 +f 1486/1086/23 1448/1112/23 1447/1081/23 1485/1071/23 +f 1464/1068/25 1501/1121/25 1502/1113/25 1463/1102/25 +f 1485/1071/25 1447/1081/25 1489/1084/25 1472/1072/25 +f 1474/1080/25 1460/1126/25 1459/1127/25 1473/1069/25 +f 1463/1102/25 1502/1113/25 1499/1116/25 1478/1103/25 +f 1472/1072/25 1489/1084/25 1490/1109/25 1471/1085/25 +f 1473/1069/25 1459/1127/25 1458/1128/25 1488/1070/25 +f 1471/1085/25 1490/1109/25 1448/1112/25 1486/1086/25 +f 1488/1070/23 1458/1128/23 1457/1129/23 1487/1079/23 +f 1466/1092/25 1491/1130/25 1492/1123/25 1465/1065/25 +f 1487/1079/25 1457/1129/25 1460/1126/25 1474/1080/25 +f 1465/1065/25 1492/1123/25 1493/1117/25 1480/1066/25 +f 1476/1078/23 1456/1101/23 1455/1131/23 1475/1104/23 +f 1480/1066/23 1493/1117/23 1494/1120/23 1479/1091/23 +f 1475/1104/25 1455/1131/25 1454/1132/25 1462/1105/25 +f 1479/1091/25 1494/1120/25 1491/1130/25 1466/1092/25 +f 1462/1105/25 1454/1132/25 1453/1100/25 1461/1077/25 +f 1524/1133/21 1522/1134/21 1521/1135/21 1523/1136/21 +f 1520/1137/21 1519/1138/21 1518/1139/21 1517/1140/21 +f 1513/1141/21 1512/1142/21 1511/1107/21 1514/1106/21 +f 1509/1082/21 1508/1111/21 1507/1110/21 1510/1083/21 +f 1505/1124/21 1516/1143/21 1515/1119/21 1506/1118/21 +f 1504/1144/21 1503/1145/21 1526/1146/21 1525/1147/21 +f 1528/1148/21 1527/1115/21 1530/1114/21 1529/1122/21 +f 1452/1098/307 1512/1142/307 1513/1141/307 1451/1095/307 +f 1449/1108/308 1511/1107/308 1512/1142/308 1452/1098/308 +f 1489/1084/309 1510/1083/309 1507/1110/309 1490/1109/309 +f 1451/1095/310 1513/1141/310 1514/1106/310 1450/1096/310 +f 1448/1112/311 1508/1111/311 1509/1082/311 1447/1081/311 +f 1494/1120/312 1515/1119/312 1516/1143/312 1491/1130/312 +f 1491/1130/313 1516/1143/313 1505/1124/313 1492/1123/313 +f 1454/1132/314 1517/1140/314 1518/1139/314 1453/1100/314 +f 1456/1101/315 1519/1138/315 1520/1137/315 1455/1131/315 +f 1457/1129/316 1521/1135/316 1522/1134/316 1460/1126/316 +f 1496/1099/317 1504/1144/317 1525/1147/317 1497/1097/317 +f 1458/1128/318 1523/1136/318 1521/1135/318 1457/1129/318 +f 1497/1097/319 1525/1147/319 1526/1146/319 1498/1093/319 +f 1459/1127/320 1524/1133/320 1523/1136/320 1458/1128/320 +f 1498/1093/321 1526/1146/321 1503/1145/321 1495/1094/321 +f 1460/1126/322 1522/1134/322 1524/1133/322 1459/1127/322 +f 1499/1116/323 1527/1115/323 1528/1148/323 1500/1125/323 +f 1455/1131/324 1520/1137/324 1517/1140/324 1454/1132/324 +f 1500/1125/325 1528/1148/325 1529/1122/325 1501/1121/325 +f 1495/1094/326 1503/1145/326 1504/1144/326 1496/1099/326 +f 1453/1100/327 1518/1139/327 1519/1138/327 1456/1101/327 +f 1427/1056/25 1426/1044/25 1432/1047/25 1431/1048/25 1430/1051/25 1429/1052/25 1428/1055/25 +usemtl Материал.003 +f 132/119/329 131/108/329 130/107/329 135/120/329 +f 128/118/330 136/113/330 134/112/330 133/115/330 129/114/330 +f 127/111/12 126/116/12 138/117/12 137/110/12 139/109/12 +f 937/291/331 936/290/331 934/292/331 1934/294/331 933/293/331 935/12/331 938/11/331 +f 1128/410/332 1131/409/332 1126/398/332 1127/397/332 +f 1124/408/333 1125/405/333 1129/404/333 1130/403/333 1132/402/333 +f 1123/401/100 1135/400/100 1133/399/100 1134/407/100 1122/406/100 +f 1939/575/334 1940/308/334 1937/307/334 1935/578/334 1934/294/334 1936/577/334 1938/576/334 +usemtl Материал.002 +f 998/1149/335 8/614/335 4/613/335 12/588/335 11/593/335 6/586/335 993/585/335 990/1150/335 +f 1000/632/336 9/594/336 17/599/336 8/614/336 998/1149/336 +f 4/613/337 8/614/337 32/615/337 54/53/337 30/71/337 +f 289/1151/338 290/1152/338 322/1153/338 321/1154/338 +f 276/1155/339 277/1156/339 309/1157/339 308/1158/339 +f 290/1152/340 291/1159/340 323/1160/340 322/1153/340 +f 277/1156/341 278/1161/341 310/1162/341 309/1157/341 +f 291/1159/342 292/1163/342 324/1164/342 323/1160/342 +f 278/1161/343 279/1165/343 311/1166/343 310/1162/343 +f 292/1163/344 293/1167/344 325/1168/344 324/1164/344 +f 279/1165/345 280/1169/345 312/1170/345 311/1166/345 +f 293/1167/346 294/1171/346 326/1172/346 325/1168/346 +f 280/1169/347 281/1173/347 313/1174/347 312/1170/347 +f 294/1171/348 295/1175/348 327/1176/348 326/1172/348 +f 281/1173/349 282/1177/349 314/1178/349 313/1174/349 +f 268/1179/350 269/1180/350 301/1181/350 300/1182/350 +f 295/1175/351 296/1183/351 328/1184/351 327/1176/351 +f 282/1177/352 283/1185/352 315/1186/352 314/1178/352 +f 269/1180/353 270/1187/353 302/1188/353 301/1181/353 +f 296/1183/354 297/1189/354 329/1190/354 328/1184/354 +f 283/1185/355 284/1191/355 316/1192/355 315/1186/355 +f 270/1187/356 271/1193/356 303/1194/356 302/1188/356 +f 297/1189/357 298/1195/357 330/1196/357 329/1190/357 +f 284/1191/358 285/1197/358 317/1198/358 316/1192/358 +f 271/1193/359 272/1199/359 304/1200/359 303/1194/359 +f 298/1195/360 299/1201/360 331/1202/360 330/1196/360 +f 285/1197/361 286/1203/361 318/1204/361 317/1198/361 +f 272/1199/362 273/1205/362 305/1206/362 304/1200/362 +f 299/1201/363 268/1179/363 300/1182/363 331/1202/363 +f 286/1203/364 287/1207/364 319/1208/364 318/1204/364 +f 273/1205/365 274/1209/365 306/1210/365 305/1206/365 +f 287/1207/366 288/1211/366 320/1212/366 319/1208/366 +f 274/1209/367 275/1213/367 307/1214/367 306/1210/367 +f 288/1211/368 289/1151/368 321/1154/368 320/1212/368 +f 275/1213/369 276/1155/369 308/1158/369 307/1214/369 +f 316/1192/370 317/1198/370 349/1215/370 348/1216/370 +f 303/1194/371 304/1200/371 336/1217/371 335/1218/371 +f 330/1196/372 331/1202/372 363/1219/372 362/1220/372 +f 317/1198/373 318/1204/373 350/1221/373 349/1215/373 +f 304/1200/374 305/1206/374 337/1222/374 336/1217/374 +f 331/1202/375 300/1182/375 332/1223/375 363/1219/375 +f 318/1204/376 319/1208/376 351/1224/376 350/1221/376 +f 305/1206/377 306/1210/377 338/1225/377 337/1222/377 +f 319/1208/378 320/1212/378 352/1226/378 351/1224/378 +f 306/1210/379 307/1214/379 339/1227/379 338/1225/379 +f 320/1212/380 321/1154/380 353/1228/380 352/1226/380 +f 307/1214/381 308/1158/381 340/1229/381 339/1227/381 +f 321/1154/382 322/1153/382 354/1230/382 353/1228/382 +f 308/1158/383 309/1157/383 341/1231/383 340/1229/383 +f 322/1153/384 323/1160/384 355/1232/384 354/1230/384 +f 309/1157/385 310/1162/385 342/1233/385 341/1231/385 +f 323/1160/386 324/1164/386 356/1234/386 355/1232/386 +f 310/1162/387 311/1166/387 343/1235/387 342/1233/387 +f 324/1164/388 325/1168/388 357/1236/388 356/1234/388 +f 311/1166/389 312/1170/389 344/1237/389 343/1235/389 +f 325/1168/390 326/1172/390 358/1238/390 357/1236/390 +f 312/1170/391 313/1174/391 345/1239/391 344/1237/391 +f 326/1172/392 327/1176/392 359/1240/392 358/1238/392 +f 313/1174/393 314/1178/393 346/1241/393 345/1239/393 +f 300/1182/394 301/1181/394 333/1242/394 332/1223/394 +f 327/1176/395 328/1184/395 360/1243/395 359/1240/395 +f 314/1178/396 315/1186/396 347/1244/396 346/1241/396 +f 301/1181/397 302/1188/397 334/1245/397 333/1242/397 +f 328/1184/398 329/1190/398 361/1246/398 360/1243/398 +f 315/1186/399 316/1192/399 348/1216/399 347/1244/399 +f 302/1188/400 303/1194/400 335/1218/400 334/1245/400 +f 329/1190/401 330/1196/401 362/1220/401 361/1246/401 +f 351/1224/402 352/1226/402 384/1247/402 383/1248/402 +f 338/1225/403 339/1227/403 371/1249/403 370/1250/403 +f 352/1226/404 353/1228/404 385/1251/404 384/1247/404 +f 339/1227/405 340/1229/405 372/1252/405 371/1249/405 +f 353/1228/406 354/1230/406 386/1253/406 385/1251/406 +f 340/1229/407 341/1231/407 373/1254/407 372/1252/407 +f 354/1230/408 355/1232/408 387/1255/408 386/1253/408 +f 341/1231/409 342/1233/409 374/1256/409 373/1254/409 +f 355/1232/410 356/1234/410 388/1257/410 387/1255/410 +f 342/1233/411 343/1235/411 375/1258/411 374/1256/411 +f 356/1234/412 357/1236/412 389/1259/412 388/1257/412 +f 343/1235/413 344/1237/413 376/1260/413 375/1258/413 +f 357/1236/414 358/1238/414 390/1261/414 389/1259/414 +f 344/1237/415 345/1239/415 377/1262/415 376/1260/415 +f 358/1238/416 359/1240/416 391/1263/416 390/1261/416 +f 345/1239/417 346/1241/417 378/1264/417 377/1262/417 +f 332/1223/418 333/1242/418 365/1265/418 364/1266/418 +f 359/1240/419 360/1243/419 392/1267/419 391/1263/419 +f 346/1241/420 347/1244/420 379/1268/420 378/1264/420 +f 333/1242/421 334/1245/421 366/1269/421 365/1265/421 +f 360/1243/422 361/1246/422 393/1270/422 392/1267/422 +f 347/1244/423 348/1216/423 380/1271/423 379/1268/423 +f 334/1245/424 335/1218/424 367/1272/424 366/1269/424 +f 361/1246/425 362/1220/425 394/1273/425 393/1270/425 +f 348/1216/426 349/1215/426 381/1274/426 380/1271/426 +f 335/1218/427 336/1217/427 368/1275/427 367/1272/427 +f 362/1220/428 363/1219/428 395/1276/428 394/1273/428 +f 349/1215/429 350/1221/429 382/1277/429 381/1274/429 +f 336/1217/430 337/1222/430 369/1278/430 368/1275/430 +f 363/1219/431 332/1223/431 364/1266/431 395/1276/431 +f 350/1221/432 351/1224/432 383/1248/432 382/1277/432 +f 337/1222/433 338/1225/433 370/1250/433 369/1278/433 +f 290/1152/58 289/1151/58 417/1279/58 418/1280/58 +f 277/1156/71 276/1155/71 404/1281/71 405/1282/71 +f 291/1159/57 290/1152/57 418/1280/57 419/1283/57 +f 278/1161/70 277/1156/70 405/1282/70 406/1284/70 +f 292/1163/56 291/1159/56 419/1283/56 420/1285/56 +f 279/1165/69 278/1161/69 406/1284/69 407/1286/69 +f 293/1167/55 292/1163/55 420/1285/55 421/1287/55 +f 280/1169/68 279/1165/68 407/1286/68 408/1288/68 +f 294/1171/54 293/1167/54 421/1287/54 422/1289/54 +f 281/1173/67 280/1169/67 408/1288/67 409/1290/67 +f 295/1175/53 294/1171/53 422/1289/53 423/1291/53 +f 282/1177/66 281/1173/66 409/1290/66 410/1292/66 +f 269/1180/79 268/1179/79 396/1293/79 397/1294/79 +f 296/1183/52 295/1175/52 423/1291/52 424/1295/52 +f 283/1185/65 282/1177/65 410/1292/65 411/1296/65 +f 270/1187/78 269/1180/78 397/1294/78 398/1297/78 +f 297/1189/51 296/1183/51 424/1295/51 425/1298/51 +f 284/1191/64 283/1185/64 411/1296/64 412/1299/64 +f 271/1193/77 270/1187/77 398/1297/77 399/1300/77 +f 298/1195/50 297/1189/50 425/1298/50 426/1301/50 +f 285/1197/63 284/1191/63 412/1299/63 413/1302/63 +f 272/1199/76 271/1193/76 399/1300/76 400/1303/76 +f 299/1201/49 298/1195/49 426/1301/49 427/1304/49 +f 286/1203/62 285/1197/62 413/1302/62 414/1305/62 +f 273/1205/75 272/1199/75 400/1303/75 401/1306/75 +f 268/1179/48 299/1201/48 427/1304/48 396/1293/48 +f 287/1207/61 286/1203/61 414/1305/61 415/1307/61 +f 274/1209/74 273/1205/74 401/1306/74 402/1308/74 +f 288/1211/60 287/1207/60 415/1307/60 416/1309/60 +f 275/1213/73 274/1209/73 402/1308/73 403/1310/73 +f 289/1151/59 288/1211/59 416/1309/59 417/1279/59 +f 276/1155/72 275/1213/72 403/1310/72 404/1281/72 +f 554/1311/338 555/1312/338 587/1313/338 586/1314/338 +f 541/1315/434 542/1316/434 574/1317/434 573/1318/434 +f 555/1312/340 556/1319/340 588/1320/340 587/1313/340 +f 542/1316/341 543/1321/341 575/1322/341 574/1317/341 +f 556/1319/435 557/1323/435 589/1324/435 588/1320/435 +f 543/1321/343 544/1325/343 576/1326/343 575/1322/343 +f 557/1323/344 558/1327/344 590/1328/344 589/1324/344 +f 544/1325/345 545/1329/345 577/1330/345 576/1326/345 +f 558/1327/346 559/1331/346 591/1332/346 590/1328/346 +f 545/1329/347 546/1333/347 578/1334/347 577/1330/347 +f 559/1331/348 560/1335/348 592/1336/348 591/1332/348 +f 546/1333/349 547/1337/349 579/1338/349 578/1334/349 +f 533/1339/350 534/1340/350 566/1341/350 565/1342/350 +f 560/1335/351 561/1343/351 593/1344/351 592/1336/351 +f 547/1337/352 548/1345/352 580/1346/352 579/1338/352 +f 534/1340/353 535/1347/353 567/1348/353 566/1341/353 +f 561/1343/354 562/1349/354 594/1350/354 593/1344/354 +f 548/1345/355 549/1351/355 581/1352/355 580/1346/355 +f 535/1347/356 536/1353/356 568/1354/356 567/1348/356 +f 562/1349/357 563/1355/357 595/1356/357 594/1350/357 +f 549/1351/358 550/1357/358 582/1358/358 581/1352/358 +f 536/1353/359 537/1359/359 569/1360/359 568/1354/359 +f 563/1355/360 564/1361/360 596/1362/360 595/1356/360 +f 550/1357/361 551/1363/361 583/1364/361 582/1358/361 +f 537/1359/362 538/1365/362 570/1366/362 569/1360/362 +f 564/1361/363 533/1339/363 565/1342/363 596/1362/363 +f 551/1363/364 552/1367/364 584/1368/364 583/1364/364 +f 538/1365/365 539/1369/365 571/1370/365 570/1366/365 +f 552/1367/366 553/1371/366 585/1372/366 584/1368/366 +f 539/1369/367 540/1373/367 572/1374/367 571/1370/367 +f 553/1371/368 554/1311/368 586/1314/368 585/1372/368 +f 540/1373/369 541/1315/369 573/1318/369 572/1374/369 +f 581/1352/370 582/1358/370 614/1375/370 613/1376/370 +f 568/1354/371 569/1360/371 601/1377/371 600/1378/371 +f 595/1356/372 596/1362/372 628/1379/372 627/1380/372 +f 582/1358/373 583/1364/373 615/1381/373 614/1375/373 +f 569/1360/374 570/1366/374 602/1382/374 601/1377/374 +f 596/1362/375 565/1342/375 597/1383/375 628/1379/375 +f 583/1364/376 584/1368/376 616/1384/376 615/1381/376 +f 570/1366/377 571/1370/377 603/1385/377 602/1382/377 +f 584/1368/378 585/1372/378 617/1386/378 616/1384/378 +f 571/1370/379 572/1374/379 604/1387/379 603/1385/379 +f 585/1372/380 586/1314/380 618/1388/380 617/1386/380 +f 572/1374/381 573/1318/381 605/1389/381 604/1387/381 +f 586/1314/382 587/1313/382 619/1390/382 618/1388/382 +f 573/1318/383 574/1317/383 606/1391/383 605/1389/383 +f 587/1313/384 588/1320/384 620/1392/384 619/1390/384 +f 574/1317/385 575/1322/385 607/1393/385 606/1391/385 +f 588/1320/386 589/1324/386 621/1394/386 620/1392/386 +f 575/1322/387 576/1326/387 608/1395/387 607/1393/387 +f 589/1324/388 590/1328/388 622/1396/388 621/1394/388 +f 576/1326/389 577/1330/389 609/1397/389 608/1395/389 +f 590/1328/390 591/1332/390 623/1398/390 622/1396/390 +f 577/1330/391 578/1334/391 610/1399/391 609/1397/391 +f 591/1332/392 592/1336/392 624/1400/392 623/1398/392 +f 578/1334/393 579/1338/393 611/1401/393 610/1399/393 +f 565/1342/394 566/1341/394 598/1402/394 597/1383/394 +f 592/1336/395 593/1344/395 625/1403/395 624/1400/395 +f 579/1338/396 580/1346/396 612/1404/396 611/1401/396 +f 566/1341/397 567/1348/397 599/1405/397 598/1402/397 +f 593/1344/398 594/1350/398 626/1406/398 625/1403/398 +f 580/1346/399 581/1352/399 613/1376/399 612/1404/399 +f 567/1348/400 568/1354/400 600/1378/400 599/1405/400 +f 594/1350/401 595/1356/401 627/1380/401 626/1406/401 +f 616/1384/402 617/1386/402 649/1407/402 648/1408/402 +f 603/1385/403 604/1387/403 636/1409/403 635/1410/403 +f 617/1386/404 618/1388/404 650/1411/404 649/1407/404 +f 604/1387/405 605/1389/405 637/1412/405 636/1409/405 +f 618/1388/406 619/1390/406 651/1413/406 650/1411/406 +f 605/1389/407 606/1391/407 638/1414/407 637/1412/407 +f 619/1390/408 620/1392/408 652/1415/408 651/1413/408 +f 606/1391/409 607/1393/409 639/1416/409 638/1414/409 +f 620/1392/410 621/1394/410 653/1417/410 652/1415/410 +f 607/1393/411 608/1395/411 640/1418/411 639/1416/411 +f 621/1394/412 622/1396/412 654/1419/412 653/1417/412 +f 608/1395/413 609/1397/413 641/1420/413 640/1418/413 +f 622/1396/414 623/1398/414 655/1421/414 654/1419/414 +f 609/1397/415 610/1399/415 642/1422/415 641/1420/415 +f 623/1398/416 624/1400/416 656/1423/416 655/1421/416 +f 610/1399/417 611/1401/417 643/1424/417 642/1422/417 +f 597/1383/418 598/1402/418 630/1425/418 629/1426/418 +f 624/1400/419 625/1403/419 657/1427/419 656/1423/419 +f 611/1401/420 612/1404/420 644/1428/420 643/1424/420 +f 598/1402/421 599/1405/421 631/1429/421 630/1425/421 +f 625/1403/422 626/1406/422 658/1430/422 657/1427/422 +f 612/1404/423 613/1376/423 645/1431/423 644/1428/423 +f 599/1405/424 600/1378/424 632/1432/424 631/1429/424 +f 626/1406/425 627/1380/425 659/1433/425 658/1430/425 +f 613/1376/426 614/1375/426 646/1434/426 645/1431/426 +f 600/1378/427 601/1377/427 633/1435/427 632/1432/427 +f 627/1380/428 628/1379/428 660/1436/428 659/1433/428 +f 614/1375/429 615/1381/429 647/1437/429 646/1434/429 +f 601/1377/430 602/1382/430 634/1438/430 633/1435/430 +f 628/1379/431 597/1383/431 629/1426/431 660/1436/431 +f 615/1381/432 616/1384/432 648/1408/432 647/1437/432 +f 602/1382/433 603/1385/433 635/1410/433 634/1438/433 +f 555/1312/58 554/1311/58 682/1439/58 683/1440/58 +f 542/1316/71 541/1315/71 669/1441/71 670/1442/71 +f 556/1319/57 555/1312/57 683/1440/57 684/1443/57 +f 543/1321/70 542/1316/70 670/1442/70 671/1444/70 +f 557/1323/56 556/1319/56 684/1443/56 685/1445/56 +f 544/1325/69 543/1321/69 671/1444/69 672/1446/69 +f 558/1327/55 557/1323/55 685/1445/55 686/1447/55 +f 545/1329/68 544/1325/68 672/1446/68 673/1448/68 +f 559/1331/54 558/1327/54 686/1447/54 687/1449/54 +f 546/1333/67 545/1329/67 673/1448/67 674/1450/67 +f 560/1335/53 559/1331/53 687/1449/53 688/1451/53 +f 547/1337/66 546/1333/66 674/1450/66 675/1452/66 +f 534/1340/79 533/1339/79 661/1453/79 662/1454/79 +f 561/1343/52 560/1335/52 688/1451/52 689/1455/52 +f 548/1345/65 547/1337/65 675/1452/65 676/1456/65 +f 535/1347/78 534/1340/78 662/1454/78 663/1457/78 +f 562/1349/51 561/1343/51 689/1455/51 690/1458/51 +f 549/1351/64 548/1345/64 676/1456/64 677/1459/64 +f 536/1353/77 535/1347/77 663/1457/77 664/1460/77 +f 563/1355/50 562/1349/50 690/1458/50 691/1461/50 +f 550/1357/63 549/1351/63 677/1459/63 678/1462/63 +f 537/1359/76 536/1353/76 664/1460/76 665/1463/76 +f 564/1361/49 563/1355/49 691/1461/49 692/1464/49 +f 551/1363/62 550/1357/62 678/1462/62 679/1465/62 +f 538/1365/75 537/1359/75 665/1463/75 666/1466/75 +f 533/1339/48 564/1361/48 692/1464/48 661/1453/48 +f 552/1367/61 551/1363/61 679/1465/61 680/1467/61 +f 539/1369/74 538/1365/74 666/1466/74 667/1468/74 +f 553/1371/60 552/1367/60 680/1467/60 681/1469/60 +f 540/1373/73 539/1369/73 667/1468/73 668/1470/73 +f 554/1311/59 553/1371/59 681/1469/59 682/1439/59 +f 541/1315/72 540/1373/72 668/1470/72 669/1441/72 +f 414/1305/436 413/1302/436 720/1471/436 721/1472/436 +f 401/1306/437 400/1303/437 707/1473/437 708/1474/437 +f 396/1293/438 427/1304/438 734/1475/438 703/1476/438 +f 415/1307/439 414/1305/439 721/1472/439 722/1477/439 +f 402/1308/440 401/1306/440 708/1474/440 709/1478/440 +f 416/1309/441 415/1307/441 722/1477/441 723/1479/441 +f 403/1310/442 402/1308/442 709/1478/442 710/1480/442 +f 417/1279/443 416/1309/443 723/1479/443 724/1481/443 +f 404/1281/444 403/1310/444 710/1480/444 711/1482/444 +f 418/1280/445 417/1279/445 724/1481/445 725/1483/445 +f 405/1282/446 404/1281/446 711/1482/446 712/1484/446 +f 419/1283/447 418/1280/447 725/1483/447 726/1485/447 +f 406/1284/448 405/1282/448 712/1484/448 713/1486/448 +f 420/1285/449 419/1283/449 726/1485/449 727/1487/449 +f 407/1286/450 406/1284/450 713/1486/450 714/1488/450 +f 421/1287/451 420/1285/451 727/1487/451 728/1489/451 +f 408/1288/452 407/1286/452 714/1488/452 715/1490/452 +f 422/1289/453 421/1287/453 728/1489/453 729/1491/453 +f 409/1290/454 408/1288/454 715/1490/454 716/1492/454 +f 423/1291/455 422/1289/455 729/1491/455 730/1493/455 +f 410/1292/456 409/1290/456 716/1492/456 717/1494/456 +f 397/1294/457 396/1293/457 703/1476/457 704/1495/457 +f 424/1295/458 423/1291/458 730/1493/458 731/1496/458 +f 411/1296/459 410/1292/459 717/1494/459 718/1497/459 +f 398/1297/460 397/1294/460 704/1495/460 705/1498/460 +f 425/1298/461 424/1295/461 731/1496/461 732/1499/461 +f 412/1299/462 411/1296/462 718/1497/462 719/1500/462 +f 399/1300/463 398/1297/463 705/1498/463 706/1501/463 +f 426/1301/464 425/1298/464 732/1499/464 733/1502/464 +f 413/1302/465 412/1299/465 719/1500/465 720/1471/465 +f 400/1303/466 399/1300/466 706/1501/466 707/1473/466 +f 427/1304/467 426/1301/467 733/1502/467 734/1475/467 +f 704/1495/25 703/1476/25 734/1475/25 733/1502/25 732/1499/25 731/1496/25 730/1493/25 729/1491/25 728/1489/25 727/1487/25 726/1485/25 725/1483/25 724/1481/25 723/1479/25 722/1477/25 721/1472/25 720/1471/25 719/1500/25 718/1497/25 717/1494/25 716/1492/25 715/1490/25 714/1488/25 713/1486/25 712/1484/25 711/1482/25 710/1480/25 709/1478/25 708/1474/25 707/1473/25 706/1501/25 705/1498/25 +f 869/1503/51 870/1504/51 872/1505/51 871/1506/51 +f 802/1507/21 735/1508/21 862/1509/21 860/1510/21 858/1511/21 856/1512/21 854/1513/21 852/1514/21 850/1515/21 848/1516/21 846/1517/21 844/1518/21 842/1519/21 840/1520/21 838/1521/21 836/1522/21 834/1523/21 832/1524/21 830/1525/21 828/1526/21 826/1527/21 824/1528/21 822/1529/21 820/1530/21 818/1531/21 816/1532/21 814/1533/21 812/1534/21 810/1535/21 808/1536/21 806/1537/21 804/1538/21 +f 864/1539/25 865/1540/25 867/1541/25 869/1542/25 871/1543/25 873/1544/25 875/1545/25 877/1546/25 879/1547/25 881/1548/25 883/1549/25 885/1550/25 887/1551/25 889/1552/25 891/1553/25 893/1554/25 895/1555/25 897/1556/25 899/1557/25 901/1558/25 903/1559/25 905/1560/25 907/1561/25 909/1562/25 911/1563/25 913/1564/25 915/1565/25 917/1566/25 919/1567/25 921/1568/25 923/1569/25 925/1570/25 +f 857/1571/77 858/1572/77 860/1573/77 859/1574/77 +f 873/1575/53 874/1576/53 876/1577/53 875/1578/53 +f 855/1579/76 856/1580/76 858/1572/76 857/1571/76 +f 875/1578/54 876/1577/54 878/1581/54 877/1582/54 +f 853/1583/75 854/1584/75 856/1580/75 855/1579/75 +f 877/1582/55 878/1581/55 880/1585/55 879/1586/55 +f 851/1587/74 852/1588/74 854/1584/74 853/1583/74 +f 879/1586/56 880/1585/56 882/1589/56 881/1590/56 +f 849/1591/73 850/1592/73 852/1588/73 851/1587/73 +f 881/1590/57 882/1589/57 884/1593/57 883/1594/57 +f 847/1595/72 848/1596/72 850/1592/72 849/1591/72 +f 883/1594/58 884/1593/58 886/1597/58 885/1598/58 +f 845/1599/71 846/1600/71 848/1596/71 847/1595/71 +f 885/1598/59 886/1597/59 888/1601/59 887/1602/59 +f 843/1603/70 844/1604/70 846/1600/70 845/1599/70 +f 887/1602/60 888/1601/60 890/1605/60 889/1606/60 +f 841/1607/69 842/1608/69 844/1604/69 843/1603/69 +f 889/1606/61 890/1605/61 892/1609/61 891/1610/61 +f 839/1611/68 840/1612/68 842/1608/68 841/1607/68 +f 891/1610/62 892/1609/62 894/1613/62 893/1614/62 +f 837/1615/67 838/1616/67 840/1612/67 839/1611/67 +f 893/1614/63 894/1613/63 896/1617/63 895/1618/63 +f 835/1619/66 836/1620/66 838/1616/66 837/1615/66 +f 895/1618/64 896/1617/64 898/1621/64 897/1622/64 +f 833/1623/65 834/1624/65 836/1620/65 835/1619/65 +f 897/1622/65 898/1621/65 900/1625/65 899/1626/65 +f 831/1627/64 832/1628/64 834/1624/64 833/1623/64 +f 899/1626/66 900/1625/66 902/1629/66 901/1630/66 +f 829/1631/63 830/1632/63 832/1628/63 831/1627/63 +f 901/1630/67 902/1629/67 904/1633/67 903/1634/67 +f 827/1635/62 828/1636/62 830/1632/62 829/1631/62 +f 903/1634/68 904/1633/68 906/1637/68 905/1638/68 +f 825/1639/61 826/1640/61 828/1636/61 827/1635/61 +f 905/1638/69 906/1637/69 908/1641/69 907/1642/69 +f 823/1643/60 824/1644/60 826/1640/60 825/1639/60 +f 907/1642/70 908/1641/70 910/1645/70 909/1646/70 +f 821/1647/59 822/1648/59 824/1644/59 823/1643/59 +f 909/1646/71 910/1645/71 912/1649/71 911/1650/71 +f 819/1651/58 820/1652/58 822/1648/58 821/1647/58 +f 911/1650/72 912/1649/72 914/1653/72 913/1654/72 +f 817/1655/57 818/1656/57 820/1652/57 819/1651/57 +f 913/1654/73 914/1653/73 916/1657/73 915/1658/73 +f 815/1659/56 816/1660/56 818/1656/56 817/1655/56 +f 915/1658/74 916/1657/74 918/1661/74 917/1662/74 +f 813/1663/55 814/1664/55 816/1660/55 815/1659/55 +f 917/1662/75 918/1661/75 920/1665/75 919/1666/75 +f 811/1667/54 812/1668/54 814/1664/54 813/1663/54 +f 919/1666/76 920/1665/76 922/1669/76 921/1670/76 +f 809/1671/53 810/1672/53 812/1668/53 811/1667/53 +f 921/1670/77 922/1669/77 924/1673/77 923/1674/77 +f 807/1675/52 808/1676/52 810/1672/52 809/1671/52 +f 866/1677/21 863/1678/21 926/1679/21 924/1680/21 922/1681/21 920/1682/21 918/1683/21 916/1684/21 914/1685/21 912/1686/21 910/1687/21 908/1688/21 906/1689/21 904/1690/21 902/1691/21 900/1692/21 898/1693/21 896/1694/21 894/1695/21 892/1696/21 890/1697/21 888/1698/21 886/1699/21 884/1700/21 882/1701/21 880/1702/21 878/1703/21 876/1704/21 874/1705/21 872/1706/21 870/1707/21 868/1708/21 +f 805/1709/51 806/1710/51 808/1676/51 807/1675/51 +f 736/1711/25 801/1712/25 803/1713/25 805/1714/25 807/1715/25 809/1716/25 811/1717/25 813/1718/25 815/1719/25 817/1720/25 819/1721/25 821/1722/25 823/1723/25 825/1724/25 827/1725/25 829/1726/25 831/1727/25 833/1728/25 835/1729/25 837/1730/25 839/1731/25 841/1732/25 843/1733/25 845/1734/25 847/1735/25 849/1736/25 851/1737/25 853/1738/25 855/1739/25 857/1740/25 859/1741/25 861/1742/25 +f 803/1743/50 804/1744/50 806/1710/50 805/1709/50 +f 861/1745/79 862/1746/79 735/1747/79 736/1748/79 +f 801/1749/49 802/1750/49 804/1744/49 803/1743/49 +f 736/1751/48 735/1752/48 802/1750/48 801/1749/48 +f 871/1506/52 872/1505/52 874/1576/52 873/1575/52 +f 859/1574/78 860/1573/78 862/1746/78 861/1745/78 +f 867/1753/50 868/1754/50 870/1504/50 869/1503/50 +f 925/1755/79 926/1756/79 863/1757/79 864/1758/79 +f 865/1759/49 866/1760/49 868/1754/49 867/1753/49 +f 864/1761/48 863/1762/48 866/1760/48 865/1759/48 +f 923/1674/78 924/1673/78 926/1756/78 925/1755/78 +f 686/1447/468 685/1445/468 973/1763/468 974/1764/468 +f 673/1448/469 672/1446/469 960/1765/469 961/1766/469 +f 687/1449/470 686/1447/470 974/1764/470 975/1767/470 +f 674/1450/471 673/1448/471 961/1766/471 962/1768/471 +f 688/1451/472 687/1449/472 975/1767/472 976/1769/472 +f 675/1452/473 674/1450/473 962/1768/473 963/1770/473 +f 662/1454/474 661/1453/474 949/1771/474 950/1772/474 +f 689/1455/475 688/1451/475 976/1769/475 977/1773/475 +f 676/1456/476 675/1452/476 963/1770/476 964/1774/476 +f 663/1457/477 662/1454/477 950/1772/477 951/1775/477 +f 690/1458/478 689/1455/478 977/1773/478 978/1776/478 +f 677/1459/479 676/1456/479 964/1774/479 965/1777/479 +f 664/1460/480 663/1457/480 951/1775/480 952/1778/480 +f 691/1461/481 690/1458/481 978/1776/481 979/1779/481 +f 678/1462/482 677/1459/482 965/1777/482 966/1780/482 +f 665/1463/483 664/1460/483 952/1778/483 953/1781/483 +f 692/1464/484 691/1461/484 979/1779/484 980/1782/484 +f 679/1465/485 678/1462/485 966/1780/485 967/1783/485 +f 666/1466/486 665/1463/486 953/1781/486 954/1784/486 +f 661/1453/487 692/1464/487 980/1782/487 949/1771/487 +f 680/1467/488 679/1465/488 967/1783/488 968/1785/488 +f 667/1468/489 666/1466/489 954/1784/489 955/1786/489 +f 681/1469/490 680/1467/490 968/1785/490 969/1787/490 +f 668/1470/491 667/1468/491 955/1786/491 956/1788/491 +f 682/1439/492 681/1469/492 969/1787/492 970/1789/492 +f 669/1441/493 668/1470/493 956/1788/493 957/1790/493 +f 683/1440/494 682/1439/494 970/1789/494 971/1791/494 +f 670/1442/495 669/1441/495 957/1790/495 958/1792/495 +f 684/1443/496 683/1440/496 971/1791/496 972/1793/496 +f 671/1444/497 670/1442/497 958/1792/497 959/1794/497 +f 685/1445/498 684/1443/498 972/1793/498 973/1763/498 +f 672/1446/499 671/1444/499 959/1794/499 960/1765/499 +f 950/1772/25 949/1771/25 980/1782/25 979/1779/25 978/1776/25 977/1773/25 976/1769/25 975/1767/25 974/1764/25 973/1763/25 972/1793/25 971/1791/25 970/1789/25 969/1787/25 968/1785/25 967/1783/25 966/1780/25 965/1777/25 964/1774/25 963/1770/25 962/1768/25 961/1766/25 960/1765/25 959/1794/25 958/1792/25 957/1790/25 956/1788/25 955/1786/25 954/1784/25 953/1781/25 952/1778/25 951/1775/25 +f 998/1149/335 990/1150/335 993/585/335 994/871/335 1003/873/335 1004/872/335 989/897/335 997/898/335 +f 1000/632/336 998/1149/336 997/898/336 1009/879/336 999/878/336 +f 989/897/500 1022/366/500 1046/346/500 1024/899/500 997/898/500 +f 1287/1795/501 1319/1796/501 1320/1797/501 1288/1798/501 +f 1274/1799/502 1306/1800/502 1307/1801/502 1275/1802/502 +f 1288/1798/503 1320/1797/503 1321/1803/503 1289/1804/503 +f 1275/1802/504 1307/1801/504 1308/1805/504 1276/1806/504 +f 1289/1804/505 1321/1803/505 1322/1807/505 1290/1808/505 +f 1276/1806/506 1308/1805/506 1309/1809/506 1277/1810/506 +f 1290/1808/507 1322/1807/507 1323/1811/507 1291/1812/507 +f 1277/1810/508 1309/1809/508 1310/1813/508 1278/1814/508 +f 1291/1812/509 1323/1811/509 1324/1815/509 1292/1816/509 +f 1278/1814/510 1310/1813/510 1311/1817/510 1279/1818/510 +f 1292/1816/511 1324/1815/511 1325/1819/511 1293/1820/511 +f 1279/1818/512 1311/1817/512 1312/1821/512 1280/1822/512 +f 1266/1823/513 1298/1824/513 1299/1825/513 1267/1826/513 +f 1293/1820/514 1325/1819/514 1326/1827/514 1294/1828/514 +f 1280/1822/515 1312/1821/515 1313/1829/515 1281/1830/515 +f 1267/1826/516 1299/1825/516 1300/1831/516 1268/1832/516 +f 1294/1828/517 1326/1827/517 1327/1833/517 1295/1834/517 +f 1281/1830/518 1313/1829/518 1314/1835/518 1282/1836/518 +f 1268/1832/519 1300/1831/519 1301/1837/519 1269/1838/519 +f 1295/1834/520 1327/1833/520 1328/1839/520 1296/1840/520 +f 1282/1836/521 1314/1835/521 1315/1841/521 1283/1842/521 +f 1269/1838/522 1301/1837/522 1302/1843/522 1270/1844/522 +f 1296/1840/523 1328/1839/523 1329/1845/523 1297/1846/523 +f 1283/1842/524 1315/1841/524 1316/1847/524 1284/1848/524 +f 1270/1844/525 1302/1843/525 1303/1849/525 1271/1850/525 +f 1297/1846/526 1329/1845/526 1298/1824/526 1266/1823/526 +f 1284/1848/527 1316/1847/527 1317/1851/527 1285/1852/527 +f 1271/1850/528 1303/1849/528 1304/1853/528 1272/1854/528 +f 1285/1852/529 1317/1851/529 1318/1855/529 1286/1856/529 +f 1272/1854/530 1304/1853/530 1305/1857/530 1273/1858/530 +f 1286/1856/531 1318/1855/531 1319/1796/531 1287/1795/531 +f 1273/1858/532 1305/1857/532 1306/1800/532 1274/1799/532 +f 1314/1835/533 1346/1859/533 1347/1860/533 1315/1841/533 +f 1301/1837/534 1333/1861/534 1334/1862/534 1302/1843/534 +f 1328/1839/535 1360/1863/535 1361/1864/535 1329/1845/535 +f 1315/1841/536 1347/1860/536 1348/1865/536 1316/1847/536 +f 1302/1843/537 1334/1862/537 1335/1866/537 1303/1849/537 +f 1329/1845/538 1361/1864/538 1330/1867/538 1298/1824/538 +f 1316/1847/539 1348/1865/539 1349/1868/539 1317/1851/539 +f 1303/1849/540 1335/1866/540 1336/1869/540 1304/1853/540 +f 1317/1851/541 1349/1868/541 1350/1870/541 1318/1855/541 +f 1304/1853/542 1336/1869/542 1337/1871/542 1305/1857/542 +f 1318/1855/543 1350/1870/543 1351/1872/543 1319/1796/543 +f 1305/1857/544 1337/1871/544 1338/1873/544 1306/1800/544 +f 1319/1796/545 1351/1872/545 1352/1874/545 1320/1797/545 +f 1306/1800/546 1338/1873/546 1339/1875/546 1307/1801/546 +f 1320/1797/547 1352/1874/547 1353/1876/547 1321/1803/547 +f 1307/1801/548 1339/1875/548 1340/1877/548 1308/1805/548 +f 1321/1803/549 1353/1876/549 1354/1878/549 1322/1807/549 +f 1308/1805/550 1340/1877/550 1341/1879/550 1309/1809/550 +f 1322/1807/551 1354/1878/551 1355/1880/551 1323/1811/551 +f 1309/1809/552 1341/1879/552 1342/1881/552 1310/1813/552 +f 1323/1811/553 1355/1880/553 1356/1882/553 1324/1815/553 +f 1310/1813/554 1342/1881/554 1343/1883/554 1311/1817/554 +f 1324/1815/555 1356/1882/555 1357/1884/555 1325/1819/555 +f 1311/1817/556 1343/1883/556 1344/1885/556 1312/1821/556 +f 1298/1824/557 1330/1867/557 1331/1886/557 1299/1825/557 +f 1325/1819/558 1357/1884/558 1358/1887/558 1326/1827/558 +f 1312/1821/559 1344/1885/559 1345/1888/559 1313/1829/559 +f 1299/1825/560 1331/1886/560 1332/1889/560 1300/1831/560 +f 1326/1827/561 1358/1887/561 1359/1890/561 1327/1833/561 +f 1313/1829/562 1345/1888/562 1346/1859/562 1314/1835/562 +f 1300/1831/563 1332/1889/563 1333/1861/563 1301/1837/563 +f 1327/1833/564 1359/1890/564 1360/1863/564 1328/1839/564 +f 1349/1868/565 1381/1891/565 1382/1892/565 1350/1870/565 +f 1336/1869/566 1368/1893/566 1369/1894/566 1337/1871/566 +f 1350/1870/567 1382/1892/567 1383/1895/567 1351/1872/567 +f 1337/1871/568 1369/1894/568 1370/1896/568 1338/1873/568 +f 1351/1872/569 1383/1895/569 1384/1897/569 1352/1874/569 +f 1338/1873/570 1370/1896/570 1371/1898/570 1339/1875/570 +f 1352/1874/571 1384/1897/571 1385/1899/571 1353/1876/571 +f 1339/1875/572 1371/1898/572 1372/1900/572 1340/1877/572 +f 1353/1876/573 1385/1899/573 1386/1901/573 1354/1878/573 +f 1340/1877/574 1372/1900/574 1373/1902/574 1341/1879/574 +f 1354/1878/575 1386/1901/575 1387/1903/575 1355/1880/575 +f 1341/1879/576 1373/1902/576 1374/1904/576 1342/1881/576 +f 1355/1880/577 1387/1903/577 1388/1905/577 1356/1882/577 +f 1342/1881/578 1374/1904/578 1375/1906/578 1343/1883/578 +f 1356/1882/579 1388/1905/579 1389/1907/579 1357/1884/579 +f 1343/1883/580 1375/1906/580 1376/1908/580 1344/1885/580 +f 1330/1867/581 1362/1909/581 1363/1910/581 1331/1886/581 +f 1357/1884/582 1389/1907/582 1390/1911/582 1358/1887/582 +f 1344/1885/583 1376/1908/583 1377/1912/583 1345/1888/583 +f 1331/1886/584 1363/1910/584 1364/1913/584 1332/1889/584 +f 1358/1887/585 1390/1911/585 1391/1914/585 1359/1890/585 +f 1345/1888/586 1377/1912/586 1378/1915/586 1346/1859/586 +f 1332/1889/587 1364/1913/587 1365/1916/587 1333/1861/587 +f 1359/1890/588 1391/1914/588 1392/1917/588 1360/1863/588 +f 1346/1859/589 1378/1915/589 1379/1918/589 1347/1860/589 +f 1333/1861/590 1365/1916/590 1366/1919/590 1334/1862/590 +f 1360/1863/591 1392/1917/591 1393/1920/591 1361/1864/591 +f 1347/1860/592 1379/1918/592 1380/1921/592 1348/1865/592 +f 1334/1862/593 1366/1919/593 1367/1922/593 1335/1866/593 +f 1361/1864/594 1393/1920/594 1362/1909/594 1330/1867/594 +f 1348/1865/595 1380/1921/595 1381/1891/595 1349/1868/595 +f 1335/1866/596 1367/1922/596 1368/1893/596 1336/1869/596 +f 1288/1798/58 1416/1923/58 1415/1924/58 1287/1795/58 +f 1275/1802/71 1403/1925/71 1402/1926/71 1274/1799/71 +f 1289/1804/57 1417/1927/57 1416/1923/57 1288/1798/57 +f 1276/1806/70 1404/1928/70 1403/1925/70 1275/1802/70 +f 1290/1808/56 1418/1929/56 1417/1927/56 1289/1804/56 +f 1277/1810/69 1405/1930/69 1404/1928/69 1276/1806/69 +f 1291/1812/55 1419/1931/55 1418/1929/55 1290/1808/55 +f 1278/1814/68 1406/1932/68 1405/1930/68 1277/1810/68 +f 1292/1816/54 1420/1933/54 1419/1931/54 1291/1812/54 +f 1279/1818/67 1407/1934/67 1406/1932/67 1278/1814/67 +f 1293/1820/53 1421/1935/53 1420/1933/53 1292/1816/53 +f 1280/1822/66 1408/1936/66 1407/1934/66 1279/1818/66 +f 1267/1826/79 1395/1937/79 1394/1938/79 1266/1823/79 +f 1294/1828/52 1422/1939/52 1421/1935/52 1293/1820/52 +f 1281/1830/65 1409/1940/65 1408/1936/65 1280/1822/65 +f 1268/1832/78 1396/1941/78 1395/1937/78 1267/1826/78 +f 1295/1834/51 1423/1942/51 1422/1939/51 1294/1828/51 +f 1282/1836/64 1410/1943/64 1409/1940/64 1281/1830/64 +f 1269/1838/77 1397/1944/77 1396/1941/77 1268/1832/77 +f 1296/1840/50 1424/1945/50 1423/1942/50 1295/1834/50 +f 1283/1842/63 1411/1946/63 1410/1943/63 1282/1836/63 +f 1270/1844/76 1398/1947/76 1397/1944/76 1269/1838/76 +f 1297/1846/49 1425/1948/49 1424/1945/49 1296/1840/49 +f 1284/1848/62 1412/1949/62 1411/1946/62 1283/1842/62 +f 1271/1850/75 1399/1950/75 1398/1947/75 1270/1844/75 +f 1266/1823/48 1394/1938/48 1425/1948/48 1297/1846/48 +f 1285/1852/61 1413/1951/61 1412/1949/61 1284/1848/61 +f 1272/1854/74 1400/1952/74 1399/1950/74 1271/1850/74 +f 1286/1856/60 1414/1953/60 1413/1951/60 1285/1852/60 +f 1273/1858/73 1401/1954/73 1400/1952/73 1272/1854/73 +f 1287/1795/59 1415/1924/59 1414/1953/59 1286/1856/59 +f 1274/1799/72 1402/1926/72 1401/1954/72 1273/1858/72 +f 1552/1955/501 1584/1956/501 1585/1957/501 1553/1958/501 +f 1539/1959/597 1571/1960/597 1572/1961/597 1540/1962/597 +f 1553/1958/503 1585/1957/503 1586/1963/503 1554/1964/503 +f 1540/1962/504 1572/1961/504 1573/1965/504 1541/1966/504 +f 1554/1964/505 1586/1963/505 1587/1967/505 1555/1968/505 +f 1541/1966/506 1573/1965/506 1574/1969/506 1542/1970/506 +f 1555/1968/507 1587/1967/507 1588/1971/507 1556/1972/507 +f 1542/1970/508 1574/1969/508 1575/1973/508 1543/1974/508 +f 1556/1972/509 1588/1971/509 1589/1975/509 1557/1976/509 +f 1543/1974/510 1575/1973/510 1576/1977/510 1544/1978/510 +f 1557/1976/511 1589/1975/511 1590/1979/511 1558/1980/511 +f 1544/1978/512 1576/1977/512 1577/1981/512 1545/1982/512 +f 1531/1983/598 1563/1984/598 1564/1985/598 1532/1986/598 +f 1558/1980/514 1590/1979/514 1591/1987/514 1559/1988/514 +f 1545/1982/515 1577/1981/515 1578/1989/515 1546/1990/515 +f 1532/1986/516 1564/1985/516 1565/1991/516 1533/1992/516 +f 1559/1988/517 1591/1987/517 1592/1993/517 1560/1994/517 +f 1546/1990/518 1578/1989/518 1579/1995/518 1547/1996/518 +f 1533/1992/519 1565/1991/519 1566/1997/519 1534/1998/519 +f 1560/1994/520 1592/1993/520 1593/1999/520 1561/2000/520 +f 1547/1996/521 1579/1995/521 1580/2001/521 1548/2002/521 +f 1534/1998/522 1566/1997/522 1567/2003/522 1535/2004/522 +f 1561/2000/523 1593/1999/523 1594/2005/523 1562/2006/523 +f 1548/2002/524 1580/2001/524 1581/2007/524 1549/2008/524 +f 1535/2004/525 1567/2003/525 1568/2009/525 1536/2010/525 +f 1562/2006/526 1594/2005/526 1563/1984/526 1531/1983/526 +f 1549/2008/527 1581/2007/527 1582/2011/527 1550/2012/527 +f 1536/2010/528 1568/2009/528 1569/2013/528 1537/2014/528 +f 1550/2012/529 1582/2011/529 1583/2015/529 1551/2016/529 +f 1537/2014/530 1569/2013/530 1570/2017/530 1538/2018/530 +f 1551/2016/531 1583/2015/531 1584/1956/531 1552/1955/531 +f 1538/2018/532 1570/2017/532 1571/1960/532 1539/1959/532 +f 1579/1995/533 1611/2019/533 1612/2020/533 1580/2001/533 +f 1566/1997/534 1598/2021/534 1599/2022/534 1567/2003/534 +f 1593/1999/535 1625/2023/535 1626/2024/535 1594/2005/535 +f 1580/2001/536 1612/2020/536 1613/2025/536 1581/2007/536 +f 1567/2003/537 1599/2022/537 1600/2026/537 1568/2009/537 +f 1594/2005/538 1626/2024/538 1595/2027/538 1563/1984/538 +f 1581/2007/539 1613/2025/539 1614/2028/539 1582/2011/539 +f 1568/2009/540 1600/2026/540 1601/2029/540 1569/2013/540 +f 1582/2011/541 1614/2028/541 1615/2030/541 1583/2015/541 +f 1569/2013/542 1601/2029/542 1602/2031/542 1570/2017/542 +f 1583/2015/543 1615/2030/543 1616/2032/543 1584/1956/543 +f 1570/2017/544 1602/2031/544 1603/2033/544 1571/1960/544 +f 1584/1956/545 1616/2032/545 1617/2034/545 1585/1957/545 +f 1571/1960/546 1603/2033/546 1604/2035/546 1572/1961/546 +f 1585/1957/547 1617/2034/547 1618/2036/547 1586/1963/547 +f 1572/1961/548 1604/2035/548 1605/2037/548 1573/1965/548 +f 1586/1963/549 1618/2036/549 1619/2038/549 1587/1967/549 +f 1573/1965/550 1605/2037/550 1606/2039/550 1574/1969/550 +f 1587/1967/551 1619/2038/551 1620/2040/551 1588/1971/551 +f 1574/1969/552 1606/2039/552 1607/2041/552 1575/1973/552 +f 1588/1971/553 1620/2040/553 1621/2042/553 1589/1975/553 +f 1575/1973/554 1607/2041/554 1608/2043/554 1576/1977/554 +f 1589/1975/555 1621/2042/555 1622/2044/555 1590/1979/555 +f 1576/1977/556 1608/2043/556 1609/2045/556 1577/1981/556 +f 1563/1984/557 1595/2027/557 1596/2046/557 1564/1985/557 +f 1590/1979/558 1622/2044/558 1623/2047/558 1591/1987/558 +f 1577/1981/559 1609/2045/559 1610/2048/559 1578/1989/559 +f 1564/1985/560 1596/2046/560 1597/2049/560 1565/1991/560 +f 1591/1987/561 1623/2047/561 1624/2050/561 1592/1993/561 +f 1578/1989/562 1610/2048/562 1611/2019/562 1579/1995/562 +f 1565/1991/563 1597/2049/563 1598/2021/563 1566/1997/563 +f 1592/1993/564 1624/2050/564 1625/2023/564 1593/1999/564 +f 1614/2028/565 1646/2051/565 1647/2052/565 1615/2030/565 +f 1601/2029/566 1633/2053/566 1634/2054/566 1602/2031/566 +f 1615/2030/567 1647/2052/567 1648/2055/567 1616/2032/567 +f 1602/2031/568 1634/2054/568 1635/2056/568 1603/2033/568 +f 1616/2032/569 1648/2055/569 1649/2057/569 1617/2034/569 +f 1603/2033/570 1635/2056/570 1636/2058/570 1604/2035/570 +f 1617/2034/571 1649/2057/571 1650/2059/571 1618/2036/571 +f 1604/2035/572 1636/2058/572 1637/2060/572 1605/2037/572 +f 1618/2036/573 1650/2059/573 1651/2061/573 1619/2038/573 +f 1605/2037/574 1637/2060/574 1638/2062/574 1606/2039/574 +f 1619/2038/575 1651/2061/575 1652/2063/575 1620/2040/575 +f 1606/2039/576 1638/2062/576 1639/2064/576 1607/2041/576 +f 1620/2040/577 1652/2063/577 1653/2065/577 1621/2042/577 +f 1607/2041/578 1639/2064/578 1640/2066/578 1608/2043/578 +f 1621/2042/579 1653/2065/579 1654/2067/579 1622/2044/579 +f 1608/2043/580 1640/2066/580 1641/2068/580 1609/2045/580 +f 1595/2027/581 1627/2069/581 1628/2070/581 1596/2046/581 +f 1622/2044/582 1654/2067/582 1655/2071/582 1623/2047/582 +f 1609/2045/583 1641/2068/583 1642/2072/583 1610/2048/583 +f 1596/2046/584 1628/2070/584 1629/2073/584 1597/2049/584 +f 1623/2047/585 1655/2071/585 1656/2074/585 1624/2050/585 +f 1610/2048/586 1642/2072/586 1643/2075/586 1611/2019/586 +f 1597/2049/587 1629/2073/587 1630/2076/587 1598/2021/587 +f 1624/2050/588 1656/2074/588 1657/2077/588 1625/2023/588 +f 1611/2019/589 1643/2075/589 1644/2078/589 1612/2020/589 +f 1598/2021/590 1630/2076/590 1631/2079/590 1599/2022/590 +f 1625/2023/591 1657/2077/591 1658/2080/591 1626/2024/591 +f 1612/2020/592 1644/2078/592 1645/2081/592 1613/2025/592 +f 1599/2022/593 1631/2079/593 1632/2082/593 1600/2026/593 +f 1626/2024/594 1658/2080/594 1627/2069/594 1595/2027/594 +f 1613/2025/595 1645/2081/595 1646/2051/595 1614/2028/595 +f 1600/2026/596 1632/2082/596 1633/2053/596 1601/2029/596 +f 1553/1958/58 1681/2083/58 1680/2084/58 1552/1955/58 +f 1540/1962/71 1668/2085/71 1667/2086/71 1539/1959/71 +f 1554/1964/57 1682/2087/57 1681/2083/57 1553/1958/57 +f 1541/1966/70 1669/2088/70 1668/2085/70 1540/1962/70 +f 1555/1968/56 1683/2089/56 1682/2087/56 1554/1964/56 +f 1542/1970/69 1670/2090/69 1669/2088/69 1541/1966/69 +f 1556/1972/55 1684/2091/55 1683/2089/55 1555/1968/55 +f 1543/1974/68 1671/2092/68 1670/2090/68 1542/1970/68 +f 1557/1976/54 1685/2093/54 1684/2091/54 1556/1972/54 +f 1544/1978/67 1672/2094/67 1671/2092/67 1543/1974/67 +f 1558/1980/53 1686/2095/53 1685/2093/53 1557/1976/53 +f 1545/1982/66 1673/2096/66 1672/2094/66 1544/1978/66 +f 1532/1986/79 1660/2097/79 1659/2098/79 1531/1983/79 +f 1559/1988/52 1687/2099/52 1686/2095/52 1558/1980/52 +f 1546/1990/65 1674/2100/65 1673/2096/65 1545/1982/65 +f 1533/1992/78 1661/2101/78 1660/2097/78 1532/1986/78 +f 1560/1994/51 1688/2102/51 1687/2099/51 1559/1988/51 +f 1547/1996/64 1675/2103/64 1674/2100/64 1546/1990/64 +f 1534/1998/77 1662/2104/77 1661/2101/77 1533/1992/77 +f 1561/2000/50 1689/2105/50 1688/2102/50 1560/1994/50 +f 1548/2002/63 1676/2106/63 1675/2103/63 1547/1996/63 +f 1535/2004/76 1663/2107/76 1662/2104/76 1534/1998/76 +f 1562/2006/49 1690/2108/49 1689/2105/49 1561/2000/49 +f 1549/2008/62 1677/2109/62 1676/2106/62 1548/2002/62 +f 1536/2010/75 1664/2110/75 1663/2107/75 1535/2004/75 +f 1531/1983/48 1659/2098/48 1690/2108/48 1562/2006/48 +f 1550/2012/61 1678/2111/61 1677/2109/61 1549/2008/61 +f 1537/2014/74 1665/2112/74 1664/2110/74 1536/2010/74 +f 1551/2016/60 1679/2113/60 1678/2111/60 1550/2012/60 +f 1538/2018/73 1666/2114/73 1665/2112/73 1537/2014/73 +f 1552/1955/59 1680/2084/59 1679/2113/59 1551/2016/59 +f 1539/1959/72 1667/2086/72 1666/2114/72 1538/2018/72 +f 1412/1949/599 1721/2115/599 1720/2116/599 1411/1946/599 +f 1399/1950/600 1708/2117/600 1707/2118/600 1398/1947/600 +f 1394/1938/601 1703/2119/601 1734/2120/601 1425/1948/601 +f 1413/1951/602 1722/2121/602 1721/2115/602 1412/1949/602 +f 1400/1952/603 1709/2122/603 1708/2117/603 1399/1950/603 +f 1414/1953/604 1723/2123/604 1722/2121/604 1413/1951/604 +f 1401/1954/605 1710/2124/605 1709/2122/605 1400/1952/605 +f 1415/1924/606 1724/2125/606 1723/2123/606 1414/1953/606 +f 1402/1926/607 1711/2126/607 1710/2124/607 1401/1954/607 +f 1416/1923/608 1725/2127/608 1724/2125/608 1415/1924/608 +f 1403/1925/609 1712/2128/609 1711/2126/609 1402/1926/609 +f 1417/1927/610 1726/2129/610 1725/2127/610 1416/1923/610 +f 1404/1928/611 1713/2130/611 1712/2128/611 1403/1925/611 +f 1418/1929/612 1727/2131/612 1726/2129/612 1417/1927/612 +f 1405/1930/613 1714/2132/613 1713/2130/613 1404/1928/613 +f 1419/1931/614 1728/2133/614 1727/2131/614 1418/1929/614 +f 1406/1932/615 1715/2134/615 1714/2132/615 1405/1930/615 +f 1420/1933/616 1729/2135/616 1728/2133/616 1419/1931/616 +f 1407/1934/617 1716/2136/617 1715/2134/617 1406/1932/617 +f 1421/1935/618 1730/2137/618 1729/2135/618 1420/1933/618 +f 1408/1936/619 1717/2138/619 1716/2136/619 1407/1934/619 +f 1395/1937/620 1704/2139/620 1703/2119/620 1394/1938/620 +f 1422/1939/621 1731/2140/621 1730/2137/621 1421/1935/621 +f 1409/1940/622 1718/2141/622 1717/2138/622 1408/1936/622 +f 1396/1941/623 1705/2142/623 1704/2139/623 1395/1937/623 +f 1423/1942/624 1732/2143/624 1731/2140/624 1422/1939/624 +f 1410/1943/625 1719/2144/625 1718/2141/625 1409/1940/625 +f 1397/1944/626 1706/2145/626 1705/2142/626 1396/1941/626 +f 1424/1945/627 1733/2146/627 1732/2143/627 1423/1942/627 +f 1411/1946/628 1720/2116/628 1719/2144/628 1410/1943/628 +f 1398/1947/629 1707/2118/629 1706/2145/629 1397/1944/629 +f 1425/1948/630 1734/2120/630 1733/2146/630 1424/1945/630 +f 1704/2139/21 1705/2142/21 1706/2145/21 1707/2118/21 1708/2117/21 1709/2122/21 1710/2124/21 1711/2126/21 1712/2128/21 1713/2130/21 1714/2132/21 1715/2134/21 1716/2136/21 1717/2138/21 1718/2141/21 1719/2144/21 1720/2116/21 1721/2115/21 1722/2121/21 1723/2123/21 1724/2125/21 1725/2127/21 1726/2129/21 1727/2131/21 1728/2133/21 1729/2135/21 1730/2137/21 1731/2140/21 1732/2143/21 1733/2146/21 1734/2120/21 1703/2119/21 +f 1869/2147/51 1871/2148/51 1872/2149/51 1870/2150/51 +f 1802/2151/25 1804/2152/25 1806/2153/25 1808/2154/25 1810/2155/25 1812/2156/25 1814/2157/25 1816/2158/25 1818/2159/25 1820/2160/25 1822/2161/25 1824/2162/25 1826/2163/25 1828/2164/25 1830/2165/25 1832/2166/25 1834/2167/25 1836/2168/25 1838/2169/25 1840/2170/25 1842/2171/25 1844/2172/25 1846/2173/25 1848/2174/25 1850/2175/25 1852/2176/25 1854/2177/25 1856/2178/25 1858/2179/25 1860/2180/25 1862/2181/25 1735/2182/25 +f 1864/2183/21 1925/2184/21 1923/2185/21 1921/2186/21 1919/2187/21 1917/2188/21 1915/2189/21 1913/2190/21 1911/2191/21 1909/2192/21 1907/2193/21 1905/2194/21 1903/2195/21 1901/2196/21 1899/2197/21 1897/2198/21 1895/2199/21 1893/2200/21 1891/2201/21 1889/2202/21 1887/2203/21 1885/2204/21 1883/2205/21 1881/2206/21 1879/2207/21 1877/2208/21 1875/2209/21 1873/2210/21 1871/2211/21 1869/2212/21 1867/2213/21 1865/2214/21 +f 1857/2215/77 1859/2216/77 1860/2217/77 1858/2218/77 +f 1873/2219/53 1875/2220/53 1876/2221/53 1874/2222/53 +f 1855/2223/76 1857/2215/76 1858/2218/76 1856/2224/76 +f 1875/2220/54 1877/2225/54 1878/2226/54 1876/2221/54 +f 1853/2227/75 1855/2223/75 1856/2224/75 1854/2228/75 +f 1877/2225/55 1879/2229/55 1880/2230/55 1878/2226/55 +f 1851/2231/74 1853/2227/74 1854/2228/74 1852/2232/74 +f 1879/2229/56 1881/2233/56 1882/2234/56 1880/2230/56 +f 1849/2235/73 1851/2231/73 1852/2232/73 1850/2236/73 +f 1881/2233/57 1883/2237/57 1884/2238/57 1882/2234/57 +f 1847/2239/72 1849/2235/72 1850/2236/72 1848/2240/72 +f 1883/2237/58 1885/2241/58 1886/2242/58 1884/2238/58 +f 1845/2243/71 1847/2239/71 1848/2240/71 1846/2244/71 +f 1885/2241/59 1887/2245/59 1888/2246/59 1886/2242/59 +f 1843/2247/70 1845/2243/70 1846/2244/70 1844/2248/70 +f 1887/2245/60 1889/2249/60 1890/2250/60 1888/2246/60 +f 1841/2251/69 1843/2247/69 1844/2248/69 1842/2252/69 +f 1889/2249/61 1891/2253/61 1892/2254/61 1890/2250/61 +f 1839/2255/68 1841/2251/68 1842/2252/68 1840/2256/68 +f 1891/2253/62 1893/2257/62 1894/2258/62 1892/2254/62 +f 1837/2259/67 1839/2255/67 1840/2256/67 1838/2260/67 +f 1893/2257/63 1895/2261/63 1896/2262/63 1894/2258/63 +f 1835/2263/66 1837/2259/66 1838/2260/66 1836/2264/66 +f 1895/2261/64 1897/2265/64 1898/2266/64 1896/2262/64 +f 1833/2267/65 1835/2263/65 1836/2264/65 1834/2268/65 +f 1897/2265/65 1899/2269/65 1900/2270/65 1898/2266/65 +f 1831/2271/64 1833/2267/64 1834/2268/64 1832/2272/64 +f 1899/2269/66 1901/2273/66 1902/2274/66 1900/2270/66 +f 1829/2275/63 1831/2271/63 1832/2272/63 1830/2276/63 +f 1901/2273/67 1903/2277/67 1904/2278/67 1902/2274/67 +f 1827/2279/62 1829/2275/62 1830/2276/62 1828/2280/62 +f 1903/2277/68 1905/2281/68 1906/2282/68 1904/2278/68 +f 1825/2283/61 1827/2279/61 1828/2280/61 1826/2284/61 +f 1905/2281/69 1907/2285/69 1908/2286/69 1906/2282/69 +f 1823/2287/60 1825/2283/60 1826/2284/60 1824/2288/60 +f 1907/2285/70 1909/2289/70 1910/2290/70 1908/2286/70 +f 1821/2291/59 1823/2287/59 1824/2288/59 1822/2292/59 +f 1909/2289/71 1911/2293/71 1912/2294/71 1910/2290/71 +f 1819/2295/58 1821/2291/58 1822/2292/58 1820/2296/58 +f 1911/2293/72 1913/2297/72 1914/2298/72 1912/2294/72 +f 1817/2299/57 1819/2295/57 1820/2296/57 1818/2300/57 +f 1913/2297/73 1915/2301/73 1916/2302/73 1914/2298/73 +f 1815/2303/56 1817/2299/56 1818/2300/56 1816/2304/56 +f 1915/2301/74 1917/2305/74 1918/2306/74 1916/2302/74 +f 1813/2307/55 1815/2303/55 1816/2304/55 1814/2308/55 +f 1917/2305/75 1919/2309/75 1920/2310/75 1918/2306/75 +f 1811/2311/54 1813/2307/54 1814/2308/54 1812/2312/54 +f 1919/2309/76 1921/2313/76 1922/2314/76 1920/2310/76 +f 1809/2315/53 1811/2311/53 1812/2312/53 1810/2316/53 +f 1921/2313/77 1923/2317/77 1924/2318/77 1922/2314/77 +f 1807/2319/52 1809/2315/52 1810/2316/52 1808/2320/52 +f 1866/2321/25 1868/2322/25 1870/2323/25 1872/2324/25 1874/2325/25 1876/2326/25 1878/2327/25 1880/2328/25 1882/2329/25 1884/2330/25 1886/2331/25 1888/2332/25 1890/2333/25 1892/2334/25 1894/2335/25 1896/2336/25 1898/2337/25 1900/2338/25 1902/2339/25 1904/2340/25 1906/2341/25 1908/2342/25 1910/2343/25 1912/2344/25 1914/2345/25 1916/2346/25 1918/2347/25 1920/2348/25 1922/2349/25 1924/2350/25 1926/2351/25 1863/2352/25 +f 1805/2353/51 1807/2319/51 1808/2320/51 1806/2354/51 +f 1736/2355/21 1861/2356/21 1859/2357/21 1857/2358/21 1855/2359/21 1853/2360/21 1851/2361/21 1849/2362/21 1847/2363/21 1845/2364/21 1843/2365/21 1841/2366/21 1839/2367/21 1837/2368/21 1835/2369/21 1833/2370/21 1831/2371/21 1829/2372/21 1827/2373/21 1825/2374/21 1823/2375/21 1821/2376/21 1819/2377/21 1817/2378/21 1815/2379/21 1813/2380/21 1811/2381/21 1809/2382/21 1807/2383/21 1805/2384/21 1803/2385/21 1801/2386/21 +f 1803/2387/50 1805/2353/50 1806/2354/50 1804/2388/50 +f 1861/2389/79 1736/2390/79 1735/2391/79 1862/2392/79 +f 1801/2393/49 1803/2387/49 1804/2388/49 1802/2394/49 +f 1736/2395/48 1801/2393/48 1802/2394/48 1735/2396/48 +f 1871/2148/52 1873/2219/52 1874/2222/52 1872/2149/52 +f 1859/2216/78 1861/2389/78 1862/2392/78 1860/2217/78 +f 1867/2397/50 1869/2147/50 1870/2150/50 1868/2398/50 +f 1925/2399/79 1864/2400/79 1863/2401/79 1926/2402/79 +f 1865/2403/49 1867/2397/49 1868/2398/49 1866/2404/49 +f 1864/2405/48 1865/2403/48 1866/2404/48 1863/2406/48 +f 1923/2317/78 1925/2399/78 1926/2402/78 1924/2318/78 +f 1684/2091/631 1978/2407/631 1977/2408/631 1683/2089/631 +f 1671/2092/632 1965/2409/632 1964/2410/632 1670/2090/632 +f 1685/2093/633 1979/2411/633 1978/2407/633 1684/2091/633 +f 1672/2094/634 1966/2412/634 1965/2409/634 1671/2092/634 +f 1686/2095/635 1980/2413/635 1979/2411/635 1685/2093/635 +f 1673/2096/636 1967/2414/636 1966/2412/636 1672/2094/636 +f 1660/2097/637 1954/2415/637 1953/2416/637 1659/2098/637 +f 1687/2099/638 1981/2417/638 1980/2413/638 1686/2095/638 +f 1674/2100/639 1968/2418/639 1967/2414/639 1673/2096/639 +f 1661/2101/640 1955/2419/640 1954/2415/640 1660/2097/640 +f 1688/2102/641 1982/2420/641 1981/2417/641 1687/2099/641 +f 1675/2103/642 1969/2421/642 1968/2418/642 1674/2100/642 +f 1662/2104/643 1956/2422/643 1955/2419/643 1661/2101/643 +f 1689/2105/644 1983/2423/644 1982/2420/644 1688/2102/644 +f 1676/2106/645 1970/2424/645 1969/2421/645 1675/2103/645 +f 1663/2107/646 1957/2425/646 1956/2422/646 1662/2104/646 +f 1690/2108/647 1984/2426/647 1983/2423/647 1689/2105/647 +f 1677/2109/648 1971/2427/648 1970/2424/648 1676/2106/648 +f 1664/2110/649 1958/2428/649 1957/2425/649 1663/2107/649 +f 1659/2098/650 1953/2416/650 1984/2426/650 1690/2108/650 +f 1678/2111/651 1972/2429/651 1971/2427/651 1677/2109/651 +f 1665/2112/652 1959/2430/652 1958/2428/652 1664/2110/652 +f 1679/2113/653 1973/2431/653 1972/2429/653 1678/2111/653 +f 1666/2114/654 1960/2432/654 1959/2430/654 1665/2112/654 +f 1680/2084/655 1974/2433/655 1973/2431/655 1679/2113/655 +f 1667/2086/656 1961/2434/656 1960/2432/656 1666/2114/656 +f 1681/2083/657 1975/2435/657 1974/2433/657 1680/2084/657 +f 1668/2085/658 1962/2436/658 1961/2434/658 1667/2086/658 +f 1682/2087/659 1976/2437/659 1975/2435/659 1681/2083/659 +f 1669/2088/660 1963/2438/660 1962/2436/660 1668/2085/660 +f 1683/2089/661 1977/2408/661 1976/2437/661 1682/2087/661 +f 1670/2090/662 1964/2410/662 1963/2438/662 1669/2088/662 +f 1954/2415/21 1955/2419/21 1956/2422/21 1957/2425/21 1958/2428/21 1959/2430/21 1960/2432/21 1961/2434/21 1962/2436/21 1963/2438/21 1964/2410/21 1965/2409/21 1966/2412/21 1967/2414/21 1968/2418/21 1969/2421/21 1970/2424/21 1971/2427/21 1972/2429/21 1973/2431/21 1974/2433/21 1975/2435/21 1976/2437/21 1977/2408/21 1978/2407/21 1979/2411/21 1980/2413/21 1981/2417/21 1982/2420/21 1983/2423/21 1984/2426/21 1953/2416/21 +usemtl Материал.004 +f 944/299/92 943/100/92 939/99/92 942/296/92 +f 1948/582/92 1946/581/92 1941/392/92 1947/391/92 +l 4 990 +l 992 993 +l 995 998 +l 93 92 +l 21 103 +l 105 107 +l 989 990 +l 1087 1085 +l 1013 1099 +l 1101 1103 diff --git a/strafe-client/src/compat_worker.rs b/strafe-client/src/compat_worker.rs new file mode 100644 index 0000000..aec9367 --- /dev/null +++ b/strafe-client/src/compat_worker.rs @@ -0,0 +1,21 @@ +pub type QNWorker<'a,Task>=CompatNWorker<'a,Task>; +pub type INWorker<'a,Task>=CompatNWorker<'a,Task>; + +pub struct CompatNWorker<'a,Task>{ + data:std::marker::PhantomData, + f:Box, +} + +impl<'a,Task> CompatNWorker<'a,Task>{ + pub fn new(f:impl FnMut(Task)+Send+'a)->CompatNWorker<'a,Task>{ + Self{ + data:std::marker::PhantomData, + f:Box::new(f), + } + } + + pub fn send(&mut self,task:Task)->Result<(),()>{ + (self.f)(task); + Ok(()) + } +} diff --git a/strafe-client/src/face_crawler.rs b/strafe-client/src/face_crawler.rs new file mode 100644 index 0000000..4fc22d9 --- /dev/null +++ b/strafe-client/src/face_crawler.rs @@ -0,0 +1,127 @@ +use crate::physics::Body; +use crate::model_physics::{GigaTime,FEV,MeshQuery,DirectedEdge,MinkowskiMesh,MinkowskiFace,MinkowskiDirectedEdge,MinkowskiVert}; +use strafesnet_common::integer::{Time,Fixed,Ratio}; + +#[derive(Debug)] +enum Transition{ + Miss, + Next(FEV,GigaTime), + Hit(F,GigaTime), +} + +type MinkowskiFEV=FEV; +type MinkowskiTransition=Transition; + + fn next_transition(fev:&MinkowskiFEV,body_time:GigaTime,mesh:&MinkowskiMesh,body:&Body,mut best_time:GigaTime)->MinkowskiTransition{ + //conflicting derivative means it crosses in the wrong direction. + //if the transition time is equal to an already tested transition, do not replace the current best. + let mut best_transition=MinkowskiTransition::Miss; + match fev{ + &MinkowskiFEV::Face(face_id)=>{ + //test own face collision time, ignoring roots with zero or conflicting derivative + //n=face.normal d=face.dot + //n.a t^2+n.v t+n.p-d==0 + let (n,d)=mesh.face_nd(face_id); + //TODO: use higher precision d value? + //use the mesh transform translation instead of baking it into the d value. + for dt in Fixed::<4,128>::zeroes2((n.dot(body.position)-d)*2,n.dot(body.velocity)*2,n.dot(body.acceleration)){ + if body_time.le_ratio(dt)&&dt.lt_ratio(best_time)&&n.dot(body.extrapolated_velocity_ratio_dt(dt)).is_negative(){ + best_time=dt; + best_transition=MinkowskiTransition::Hit(face_id,dt); + break; + } + } + //test each edge collision time, ignoring roots with zero or conflicting derivative + for &directed_edge_id in mesh.face_edges(face_id).iter(){ + let edge_n=mesh.directed_edge_n(directed_edge_id); + let n=n.cross(edge_n); + let verts=mesh.edge_verts(directed_edge_id.as_undirected()); + //WARNING: d is moved out of the *2 block because of adding two vertices! + //WARNING: precision is swept under the rug! + for dt in Fixed::<4,128>::zeroes2(n.dot(body.position*2-(mesh.vert(verts[0])+mesh.vert(verts[1]))).fix_4(),n.dot(body.velocity).fix_4()*2,n.dot(body.acceleration).fix_4()){ + if body_time.le_ratio(dt)&&dt.lt_ratio(best_time)&&n.dot(body.extrapolated_velocity_ratio_dt(dt)).is_negative(){ + best_time=dt; + best_transition=MinkowskiTransition::Next(MinkowskiFEV::Edge(directed_edge_id.as_undirected()),dt); + break; + } + } + } + //if none: + }, + &MinkowskiFEV::Edge(edge_id)=>{ + //test each face collision time, ignoring roots with zero or conflicting derivative + let edge_n=mesh.edge_n(edge_id); + let edge_verts=mesh.edge_verts(edge_id); + let delta_pos=body.position*2-(mesh.vert(edge_verts[0])+mesh.vert(edge_verts[1])); + for (i,&edge_face_id) in mesh.edge_faces(edge_id).iter().enumerate(){ + let face_n=mesh.face_nd(edge_face_id).0; + //edge_n gets parity from the order of edge_faces + let n=face_n.cross(edge_n)*((i as i64)*2-1); + //WARNING yada yada d *2 + for dt in Fixed::<4,128>::zeroes2(n.dot(delta_pos).fix_4(),n.dot(body.velocity).fix_4()*2,n.dot(body.acceleration).fix_4()){ + if body_time.le_ratio(dt)&&dt.lt_ratio(best_time)&&n.dot(body.extrapolated_velocity_ratio_dt(dt)).is_negative(){ + best_time=dt; + best_transition=MinkowskiTransition::Next(MinkowskiFEV::Face(edge_face_id),dt); + break; + } + } + } + //test each vertex collision time, ignoring roots with zero or conflicting derivative + for (i,&vert_id) in edge_verts.iter().enumerate(){ + //vertex normal gets parity from vert index + let n=edge_n*(1-2*(i as i64)); + for dt in Fixed::<2,64>::zeroes2((n.dot(body.position-mesh.vert(vert_id)))*2,n.dot(body.velocity)*2,n.dot(body.acceleration)){ + if body_time.le_ratio(dt)&&dt.lt_ratio(best_time)&&n.dot(body.extrapolated_velocity_ratio_dt(dt)).is_negative(){ + let dt=Ratio::new(dt.num.fix_4(),dt.den.fix_4()); + best_time=dt; + best_transition=MinkowskiTransition::Next(MinkowskiFEV::Vert(vert_id),dt); + break; + } + } + } + //if none: + }, + &MinkowskiFEV::Vert(vert_id)=>{ + //test each edge collision time, ignoring roots with zero or conflicting derivative + for &directed_edge_id in mesh.vert_edges(vert_id).iter(){ + //edge is directed away from vertex, but we want the dot product to turn out negative + let n=-mesh.directed_edge_n(directed_edge_id); + for dt in Fixed::<2,64>::zeroes2((n.dot(body.position-mesh.vert(vert_id)))*2,n.dot(body.velocity)*2,n.dot(body.acceleration)){ + if body_time.le_ratio(dt)&&dt.lt_ratio(best_time)&&n.dot(body.extrapolated_velocity_ratio_dt(dt)).is_negative(){ + let dt=Ratio::new(dt.num.fix_4(),dt.den.fix_4()); + best_time=dt; + best_transition=MinkowskiTransition::Next(MinkowskiFEV::Edge(directed_edge_id.as_undirected()),dt); + break; + } + } + } + //if none: + }, + } + best_transition + } +pub enum CrawlResult{ + Miss(FEV), + Hit(F,GigaTime), +} +type MinkowskiCrawlResult=CrawlResult; +pub fn crawl_fev(mut fev:MinkowskiFEV,mesh:&MinkowskiMesh,relative_body:&Body,start_time:Time,time_limit:Time)->MinkowskiCrawlResult{ + let mut body_time={ + let r=(start_time-relative_body.time).to_ratio(); + Ratio::new(r.num.fix_4(),r.den.fix_4()) + }; + let time_limit={ + let r=(time_limit-relative_body.time).to_ratio(); + Ratio::new(r.num.fix_4(),r.den.fix_4()) + }; + for _ in 0..20{ + match next_transition(&fev,body_time,mesh,relative_body,time_limit){ + Transition::Miss=>return CrawlResult::Miss(fev), + Transition::Next(next_fev,next_time)=>(fev,body_time)=(next_fev,next_time), + Transition::Hit(face,time)=>return CrawlResult::Hit(face,time), + } + } + //TODO: fix all bugs + //println!("Too many iterations! Using default behaviour instead of crashing..."); + CrawlResult::Miss(fev) +} diff --git a/strafe-client/src/file.rs b/strafe-client/src/file.rs new file mode 100644 index 0000000..3adc397 --- /dev/null +++ b/strafe-client/src/file.rs @@ -0,0 +1,144 @@ +use std::io::Read; + +#[derive(Debug)] +pub enum ReadError{ + #[cfg(feature="roblox")] + Roblox(strafesnet_rbx_loader::ReadError), + #[cfg(feature="source")] + Source(strafesnet_bsp_loader::ReadError), + #[cfg(feature="snf")] + StrafesNET(strafesnet_snf::Error), + #[cfg(feature="snf")] + StrafesNETMap(strafesnet_snf::map::Error), + Io(std::io::Error), + UnknownFileFormat, +} +impl std::fmt::Display for ReadError{ + fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ + write!(f,"{self:?}") + } +} +impl std::error::Error for ReadError{} + +pub enum DataStructure{ + #[cfg(feature="roblox")] + Roblox(strafesnet_rbx_loader::Model), + #[cfg(feature="source")] + Source(strafesnet_bsp_loader::Bsp), + #[cfg(feature="snf")] + StrafesNET(strafesnet_common::map::CompleteMap), +} + +pub fn read(input:R)->Result{ + let mut buf=std::io::BufReader::new(input); + let peek=std::io::BufRead::fill_buf(&mut buf).map_err(ReadError::Io)?; + match &peek[0..4]{ + #[cfg(feature="roblox")] + b"Ok(DataStructure::Roblox(strafesnet_rbx_loader::read(buf).map_err(ReadError::Roblox)?)), + #[cfg(feature="source")] + b"VBSP"=>Ok(DataStructure::Source(strafesnet_bsp_loader::read(buf).map_err(ReadError::Source)?)), + #[cfg(feature="snf")] + b"SNFM"=>Ok(DataStructure::StrafesNET( + strafesnet_snf::read_map(buf).map_err(ReadError::StrafesNET)? + .into_complete_map().map_err(ReadError::StrafesNETMap)? + )), + _=>Err(ReadError::UnknownFileFormat), + } +} + +#[derive(Debug)] +pub enum LoadError{ + ReadError(ReadError), + File(std::io::Error), + Io(std::io::Error), +} +impl std::fmt::Display for LoadError{ + fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ + write!(f,"{self:?}") + } +} +impl std::error::Error for LoadError{} + +pub fn load>(path:P)->Result{ + //blocking because it's simpler... + let file=std::fs::File::open(path).map_err(LoadError::File)?; + match read(file).map_err(LoadError::ReadError)?{ + #[cfg(feature="snf")] + DataStructure::StrafesNET(map)=>Ok(map), + #[cfg(feature="roblox")] + DataStructure::Roblox(model)=>{ + let mut place=model.into_place(); + place.run_scripts(); + + let mut loader=strafesnet_deferred_loader::roblox_legacy(); + + let (texture_loader,mesh_loader)=loader.get_inner_mut(); + + let map_step1=strafesnet_rbx_loader::convert( + &place, + |name|texture_loader.acquire_render_config_id(name), + |name|mesh_loader.acquire_mesh_id(name), + ); + + let meshpart_meshes=mesh_loader.load_meshes().map_err(LoadError::Io)?; + + let map_step2=map_step1.add_meshpart_meshes_and_calculate_attributes( + meshpart_meshes.into_iter().map(|(mesh_id,loader_model)| + (mesh_id,strafesnet_rbx_loader::data::RobloxMeshBytes::new(loader_model.get())) + ) + ); + + let (textures,render_configs)=loader.into_render_configs().map_err(LoadError::Io)?.consume(); + + let map=map_step2.add_render_configs_and_textures( + render_configs.into_iter(), + textures.into_iter().map(|(texture_id,texture)| + (texture_id,match texture{ + strafesnet_deferred_loader::texture::Texture::ImageDDS(data)=>data, + }) + ) + ); + + Ok(map) + }, + #[cfg(feature="source")] + DataStructure::Source(bsp)=>{ + let mut loader=strafesnet_deferred_loader::source_legacy(); + + let (texture_loader,mesh_loader)=loader.get_inner_mut(); + + let map_step1=strafesnet_bsp_loader::convert( + &bsp, + |name|texture_loader.acquire_render_config_id(name), + |name|mesh_loader.acquire_mesh_id(name), + ); + + let prop_meshes=mesh_loader.load_meshes(bsp.as_ref()); + + let map_step2=map_step1.add_prop_meshes( + //the type conflagulator 9000 + prop_meshes.into_iter().map(|(mesh_id,loader_model)| + (mesh_id,strafesnet_bsp_loader::data::ModelData{ + mdl:strafesnet_bsp_loader::data::MdlData::new(loader_model.mdl.get()), + vtx:strafesnet_bsp_loader::data::VtxData::new(loader_model.vtx.get()), + vvd:strafesnet_bsp_loader::data::VvdData::new(loader_model.vvd.get()), + }) + ), + |name|texture_loader.acquire_render_config_id(name), + ); + + let (textures,render_configs)=loader.into_render_configs().map_err(LoadError::Io)?.consume(); + + let map=map_step2.add_render_configs_and_textures( + render_configs.into_iter(), + textures.into_iter().map(|(texture_id,texture)| + (texture_id,match texture{ + strafesnet_deferred_loader::texture::Texture::ImageDDS(data)=>data, + }) + ), + ); + + Ok(map) + }, + } +} diff --git a/strafe-client/src/graphics.rs b/strafe-client/src/graphics.rs new file mode 100644 index 0000000..6a13b11 --- /dev/null +++ b/strafe-client/src/graphics.rs @@ -0,0 +1,989 @@ +use std::borrow::Cow; +use std::collections::{HashSet,HashMap}; +use strafesnet_common::map; +use strafesnet_common::integer; +use strafesnet_common::model::{self, ColorId, NormalId, PolygonIter, PositionId, RenderConfigId, TextureCoordinateId, VertexId}; +use wgpu::{util::DeviceExt,AstcBlock,AstcChannel}; +use crate::model_graphics::{self,IndexedGraphicsMeshOwnedRenderConfig,IndexedGraphicsMeshOwnedRenderConfigId,GraphicsMeshOwnedRenderConfig,GraphicsModelColor4,GraphicsModelOwned,GraphicsVertex}; + +struct Indices{ + count:u32, + buf:wgpu::Buffer, + format:wgpu::IndexFormat, +} +impl Indices{ + fn new(device:&wgpu::Device,indices:&Vec,format:wgpu::IndexFormat)->Self{ + Self{ + buf:device.create_buffer_init(&wgpu::util::BufferInitDescriptor{ + label:Some("Index"), + contents:bytemuck::cast_slice(indices), + usage:wgpu::BufferUsages::INDEX, + }), + count:indices.len() as u32, + format, + } + } +} +struct GraphicsModel{ + indices:Indices, + vertex_buf:wgpu::Buffer, + bind_group:wgpu::BindGroup, + instance_count:u32, +} + +struct GraphicsSamplers{ + repeat:wgpu::Sampler, +} + +struct GraphicsBindGroupLayouts{ + model:wgpu::BindGroupLayout, +} + +struct GraphicsBindGroups{ + camera:wgpu::BindGroup, + skybox_texture:wgpu::BindGroup, +} + +struct GraphicsPipelines{ + skybox:wgpu::RenderPipeline, + model:wgpu::RenderPipeline, +} + +struct GraphicsCamera{ + screen_size:glam::UVec2, + fov:glam::Vec2,//slope + //camera angles and such are extrapolated and passed in every time +} + +#[inline] +fn perspective_rh(fov_x_slope:f32,fov_y_slope:f32,z_near:f32,z_far:f32)->glam::Mat4{ + //glam_assert!(z_near > 0.0 && z_far > 0.0); + let r=z_far/(z_near-z_far); + glam::Mat4::from_cols( + glam::Vec4::new(1.0/fov_x_slope,0.0,0.0,0.0), + glam::Vec4::new(0.0,1.0/fov_y_slope,0.0,0.0), + glam::Vec4::new(0.0,0.0,r,-1.0), + glam::Vec4::new(0.0,0.0,r*z_near,0.0), + ) +} +impl GraphicsCamera{ + pub fn proj(&self)->glam::Mat4{ + perspective_rh(self.fov.x,self.fov.y,0.4,4000.0) + } + pub fn world(&self,pos:glam::Vec3,angles:glam::Vec2)->glam::Mat4{ + //f32 good enough for view matrix + glam::Mat4::from_translation(pos)*glam::Mat4::from_euler(glam::EulerRot::YXZ,angles.x,angles.y,0f32) + } + + pub fn to_uniform_data(&self,pos:glam::Vec3,angles:glam::Vec2)->[f32;16*4]{ + let proj=self.proj(); + let proj_inv=proj.inverse(); + let view_inv=self.world(pos,angles); + let view=view_inv.inverse(); + + let mut raw=[0f32; 16 * 4]; + raw[..16].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj)[..]); + raw[16..32].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&proj_inv)[..]); + raw[32..48].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view)[..]); + raw[48..64].copy_from_slice(&AsRef::<[f32; 16]>::as_ref(&view_inv)[..]); + raw + } +} +impl std::default::Default for GraphicsCamera{ + fn default()->Self{ + Self{ + screen_size:glam::UVec2::ONE, + fov:glam::Vec2::ONE, + } + } +} + +pub struct FrameState{ + pub body:crate::physics::Body, + pub camera:crate::physics::PhysicsCamera, + pub time:integer::Time, +} + +pub struct GraphicsState{ + pipelines:GraphicsPipelines, + bind_groups:GraphicsBindGroups, + bind_group_layouts:GraphicsBindGroupLayouts, + samplers:GraphicsSamplers, + camera:GraphicsCamera, + camera_buf:wgpu::Buffer, + temp_squid_texture_view:wgpu::TextureView, + models:Vec, + depth_view:wgpu::TextureView, + staging_belt:wgpu::util::StagingBelt, +} + +impl GraphicsState{ + const DEPTH_FORMAT:wgpu::TextureFormat=wgpu::TextureFormat::Depth24Plus; + fn create_depth_texture( + config:&wgpu::SurfaceConfiguration, + device:&wgpu::Device, + )->wgpu::TextureView{ + let depth_texture=device.create_texture(&wgpu::TextureDescriptor{ + size:wgpu::Extent3d{ + width:config.width, + height:config.height, + depth_or_array_layers:1, + }, + mip_level_count:1, + sample_count:1, + dimension:wgpu::TextureDimension::D2, + format:Self::DEPTH_FORMAT, + usage:wgpu::TextureUsages::RENDER_ATTACHMENT, + label:None, + view_formats:&[], + }); + + depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) + } + pub fn clear(&mut self){ + self.models.clear(); + } + pub fn load_user_settings(&mut self,user_settings:&crate::settings::UserSettings){ + self.camera.fov=user_settings.calculate_fov(1.0,&self.camera.screen_size).as_vec2(); + } + pub fn generate_models(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,map:&map::CompleteMap){ + //generate texture view per texture + let texture_views:HashMap=map.textures.iter().enumerate().filter_map(|(texture_id,texture_data)|{ + let texture_id=model::TextureId::new(texture_id as u32); + let image=match ddsfile::Dds::read(std::io::Cursor::new(texture_data)){ + Ok(image)=>image, + Err(e)=>{ + println!("Error loading texture: {e}"); + return None; + }, + }; + + let (mut width,mut height)=(image.get_width(),image.get_height()); + + let format=match image.header10.unwrap().dxgi_format{ + ddsfile::DxgiFormat::R8G8B8A8_UNorm_sRGB=>wgpu::TextureFormat::Rgba8UnormSrgb, + ddsfile::DxgiFormat::BC7_UNorm_sRGB =>{ + //floor(w,4),should be ceil(w,4) + width=width/4*4; + height=height/4*4; + wgpu::TextureFormat::Bc7RgbaUnormSrgb + }, + other=>{ + println!("unsupported texture format{:?}",other); + return None; + }, + }; + + let size=wgpu::Extent3d{ + width, + height, + depth_or_array_layers:1, + }; + + let layer_size=wgpu::Extent3d{ + depth_or_array_layers:1, + ..size + }; + let max_mips=layer_size.max_mips(wgpu::TextureDimension::D2); + + let texture=device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor{ + size, + mip_level_count:max_mips, + sample_count:1, + dimension:wgpu::TextureDimension::D2, + format, + usage:wgpu::TextureUsages::TEXTURE_BINDING|wgpu::TextureUsages::COPY_DST, + label:Some(format!("Texture{}",texture_id.get()).as_str()), + view_formats:&[], + }, + wgpu::util::TextureDataOrder::LayerMajor, + &image.data, + ); + Some((texture_id,texture.create_view(&wgpu::TextureViewDescriptor{ + label:Some(format!("Texture{} View",texture_id.get()).as_str()), + dimension:Some(wgpu::TextureViewDimension::D2), + ..wgpu::TextureViewDescriptor::default() + }))) + }).collect(); + let num_textures=texture_views.len(); + + //split groups with different textures into separate models + //the models received here are supposed to be tightly packed,i.e. no code needs to check if two models are using the same groups. + let indexed_models_len=map.models.len(); + //models split into graphics_group.RenderConfigId + let mut owned_mesh_id_from_mesh_id_render_config_id:HashMap>=HashMap::new(); + let mut unique_render_config_models:Vec=Vec::with_capacity(indexed_models_len); + for model in &map.models{ + //wow + let instance=GraphicsModelOwned{ + transform:model.transform.into(), + normal_transform:glam::Mat3::from_cols_array_2d(&model.transform.matrix3.to_array().map(|row|row.map(Into::into))).inverse().transpose(), + color:GraphicsModelColor4::new(model.color), + }; + //get or create owned mesh map + let owned_mesh_map=owned_mesh_id_from_mesh_id_render_config_id + .entry(model.mesh).or_insert_with(||{ + let mut owned_mesh_map=HashMap::new(); + //add mesh if renderid never before seen for this model + //add instance + //convert Model into GraphicsModelOwned + //check each group, if it's using a new render config then make a new clone of the model + if let Some(mesh)=map.meshes.get(model.mesh.get() as usize){ + for graphics_group in mesh.graphics_groups.iter(){ + //get or create owned mesh + let owned_mesh_id=owned_mesh_map + .entry(graphics_group.render).or_insert_with(||{ + //create + let owned_mesh_id=IndexedGraphicsMeshOwnedRenderConfigId::new(unique_render_config_models.len() as u32); + unique_render_config_models.push(IndexedGraphicsMeshOwnedRenderConfig{ + unique_pos:mesh.unique_pos.iter().map(|v|v.to_array().map(Into::into)).collect(), + unique_tex:mesh.unique_tex.iter().map(|v|*v.as_ref()).collect(), + unique_normal:mesh.unique_normal.iter().map(|v|v.to_array().map(Into::into)).collect(), + unique_color:mesh.unique_color.iter().map(|v|*v.as_ref()).collect(), + unique_vertices:mesh.unique_vertices.clone(), + render_config:graphics_group.render, + polys:model::PolygonGroup::PolygonList(model::PolygonList::new(Vec::new())), + instances:Vec::new(), + }); + owned_mesh_id + }); + let owned_mesh=unique_render_config_models.get_mut(owned_mesh_id.get() as usize).unwrap(); + match &mut owned_mesh.polys{ + model::PolygonGroup::PolygonList(polygon_list)=>polygon_list.extend( + graphics_group.groups.iter().flat_map(|polygon_group_id|{ + mesh.polygon_groups[polygon_group_id.get() as usize].polys() + }) + .map(|vertex_id_slice| + vertex_id_slice.to_vec() + ) + ), + } + } + } + owned_mesh_map + }); + for owned_mesh_id in owned_mesh_map.values(){ + let owned_mesh=unique_render_config_models.get_mut(owned_mesh_id.get() as usize).unwrap(); + let render_config=&map.render_configs[owned_mesh.render_config.get() as usize]; + if model.color.w==0.0&&render_config.texture.is_none(){ + continue; + } + owned_mesh.instances.push(instance.clone()); + } + } + //check every model to see if it's using the same (texture,color) but has few instances,if it is combine it into one model + //1. collect unique instances of texture and color,note model id + //2. for each model id,check if removing it from the pool decreases both the model count and instance count by more than one + //3. transpose all models that stay in the set + + //best plan:benchmark set_bind_group,set_vertex_buffer,set_index_buffer and draw_indexed + //check if the estimated render performance is better by transposing multiple model instances into one model instance + + //for now:just deduplicate single models... + let mut deduplicated_models=Vec::with_capacity(indexed_models_len);//use indexed_models_len because the list will likely get smaller instead of bigger + let mut unique_texture_color=HashMap::new();//texture->color->vec![(model_id,instance_id)] + for (model_id,model) in unique_render_config_models.iter().enumerate(){ + //for now:filter out models with more than one instance + if 1=model.unique_pos.iter().map(|untransformed_pos|{ + let pos=instance.transform.transform_point3(glam::Vec3::from_array(untransformed_pos.clone())).to_array(); + let h=bytemuck::cast::<[f32;3],[u32;3]>(pos); + PositionId::new(*pos_id_from.entry(h).or_insert_with(||{ + let pos_id=unique_pos.len(); + unique_pos.push(pos); + pos_id + }) as u32) + }).collect(); + let map_tex_id:Vec=model.unique_tex.iter().map(|&tex|{ + let h=bytemuck::cast::<[f32;2],[u32;2]>(tex); + TextureCoordinateId::new(*tex_id_from.entry(h).or_insert_with(||{ + let tex_id=unique_tex.len(); + unique_tex.push(tex); + tex_id + }) as u32) + }).collect(); + let map_normal_id:Vec=model.unique_normal.iter().map(|untransformed_normal|{ + let normal=(instance.normal_transform*glam::Vec3::from_array(untransformed_normal.clone())).to_array(); + let h=bytemuck::cast::<[f32;3],[u32;3]>(normal); + NormalId::new(*normal_id_from.entry(h).or_insert_with(||{ + let normal_id=unique_normal.len(); + unique_normal.push(normal); + normal_id + }) as u32) + }).collect(); + let map_color_id:Vec=model.unique_color.iter().map(|&color|{ + let h=bytemuck::cast::<[f32;4],[u32;4]>(color); + ColorId::new(*color_id_from.entry(h).or_insert_with(||{ + let color_id=unique_color.len(); + unique_color.push(color); + color_id + }) as u32) + }).collect(); + //map the indexed vertices onto new indices + //creating the vertex map is slightly different because the vertices are directly hashable + let map_vertex_id:Vec=model.unique_vertices.iter().map(|unmapped_vertex|{ + let vertex=model::IndexedVertex{ + pos:map_pos_id[unmapped_vertex.pos.get() as usize], + tex:map_tex_id[unmapped_vertex.tex.get() as usize], + normal:map_normal_id[unmapped_vertex.normal.get() as usize], + color:map_color_id[unmapped_vertex.color.get() as usize], + }; + VertexId::new(*vertex_id_from.entry(vertex.clone()).or_insert_with(||{ + let vertex_id=unique_vertices.len(); + unique_vertices.push(vertex); + vertex_id + }) as u32) + }).collect(); + polys.extend(model.polys.polys().map(|poly| + poly.iter().map(|vertex_id| + map_vertex_id[vertex_id.get() as usize] + ).collect() + )); + } + //push model into dedup + deduplicated_models.push(IndexedGraphicsMeshOwnedRenderConfig{ + unique_pos, + unique_tex, + unique_normal, + unique_color, + unique_vertices, + render_config, + polys:model::PolygonGroup::PolygonList(model::PolygonList::new(polys)), + instances:vec![GraphicsModelOwned{ + transform:glam::Mat4::IDENTITY, + normal_transform:glam::Mat3::IDENTITY, + color + }], + }); + } + } + } + //fill untouched models + for (model_id,model) in unique_render_config_models.into_iter().enumerate(){ + if !selected_model_instances.contains(&model_id){ + deduplicated_models.push(model); + } + } + + //de-index models + let deduplicated_models_len=deduplicated_models.len(); + let models:Vec=deduplicated_models.into_iter().map(|model|{ + let mut vertices=Vec::new(); + let mut index_from_vertex=HashMap::new();//:: + //this mut be combined in a more complex way if the models use different render patterns per group + let mut indices=Vec::new(); + for poly in model.polys.polys(){ + let mut poly_vertices=poly.iter() + .map(|&vertex_index|*index_from_vertex.entry(vertex_index).or_insert_with(||{ + let i=vertices.len(); + let vertex=&model.unique_vertices[vertex_index.get() as usize]; + vertices.push(GraphicsVertex{ + pos:model.unique_pos[vertex.pos.get() as usize], + tex:model.unique_tex[vertex.tex.get() as usize], + normal:model.unique_normal[vertex.normal.get() as usize], + color:model.unique_color[vertex.color.get() as usize], + }); + i + })); + + let a=poly_vertices.next().unwrap(); + let mut b=poly_vertices.next().unwrap(); + + poly_vertices.for_each(|c|{ + indices.extend([a,b,c]); + b=c; + }); + } + GraphicsMeshOwnedRenderConfig{ + instances:model.instances, + indices:if (u32::MAX as usize)Indices::new(device,indices,wgpu::IndexFormat::Uint32), + model_graphics::Indices::U16(indices)=>Indices::new(device,indices,wgpu::IndexFormat::Uint16), + }, + bind_group, + }); + } + } + println!("Texture References={}",num_textures); + println!("Textures Loaded={}",texture_views.len()); + println!("Indexed Models={}",indexed_models_len); + println!("Deduplicated Models={}",deduplicated_models_len); + println!("Graphics Objects:{}",self.models.len()); + println!("Graphics Instances:{}",instance_count); + } + + pub fn new( + device:&wgpu::Device, + queue:&wgpu::Queue, + config:&wgpu::SurfaceConfiguration, + )->Self{ + let camera_bind_group_layout=device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor{ + label:None, + entries:&[ + wgpu::BindGroupLayoutEntry{ + binding:0, + visibility:wgpu::ShaderStages::VERTEX, + ty:wgpu::BindingType::Buffer{ + ty:wgpu::BufferBindingType::Uniform, + has_dynamic_offset:false, + min_binding_size:None, + }, + count:None, + }, + ], + }); + let skybox_texture_bind_group_layout=device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor{ + label:Some("Skybox Texture Bind Group Layout"), + entries:&[ + wgpu::BindGroupLayoutEntry{ + binding:0, + visibility:wgpu::ShaderStages::FRAGMENT, + ty:wgpu::BindingType::Texture{ + sample_type:wgpu::TextureSampleType::Float{filterable:true}, + multisampled:false, + view_dimension:wgpu::TextureViewDimension::Cube, + }, + count:None, + }, + wgpu::BindGroupLayoutEntry{ + binding:1, + visibility:wgpu::ShaderStages::FRAGMENT, + ty:wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + count:None, + }, + ], + }); + let model_bind_group_layout=device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor{ + label:Some("Model Bind Group Layout"), + entries:&[ + wgpu::BindGroupLayoutEntry{ + binding:0, + visibility:wgpu::ShaderStages::VERTEX, + ty:wgpu::BindingType::Buffer{ + ty:wgpu::BufferBindingType::Uniform, + has_dynamic_offset:false, + min_binding_size:None, + }, + count:None, + }, + wgpu::BindGroupLayoutEntry{ + binding:1, + visibility:wgpu::ShaderStages::FRAGMENT, + ty:wgpu::BindingType::Texture{ + sample_type:wgpu::TextureSampleType::Float{filterable:true}, + multisampled:false, + view_dimension:wgpu::TextureViewDimension::D2, + }, + count:None, + }, + wgpu::BindGroupLayoutEntry{ + binding:2, + visibility:wgpu::ShaderStages::FRAGMENT, + ty:wgpu::BindingType::Sampler(wgpu::SamplerBindingType::Filtering), + count:None, + }, + ], + }); + + let clamp_sampler=device.create_sampler(&wgpu::SamplerDescriptor{ + label:Some("Clamp Sampler"), + address_mode_u:wgpu::AddressMode::ClampToEdge, + address_mode_v:wgpu::AddressMode::ClampToEdge, + address_mode_w:wgpu::AddressMode::ClampToEdge, + mag_filter:wgpu::FilterMode::Linear, + min_filter:wgpu::FilterMode::Linear, + mipmap_filter:wgpu::FilterMode::Linear, + ..Default::default() + }); + let repeat_sampler=device.create_sampler(&wgpu::SamplerDescriptor{ + label:Some("Repeat Sampler"), + address_mode_u:wgpu::AddressMode::Repeat, + address_mode_v:wgpu::AddressMode::Repeat, + address_mode_w:wgpu::AddressMode::Repeat, + mag_filter:wgpu::FilterMode::Linear, + min_filter:wgpu::FilterMode::Linear, + mipmap_filter:wgpu::FilterMode::Linear, + anisotropy_clamp:16, + ..Default::default() + }); + + // Create the render pipeline + let shader=device.create_shader_module(wgpu::ShaderModuleDescriptor{ + label:None, + source:wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), + }); + + //load textures + let device_features=device.features(); + + let skybox_texture_view={ + let skybox_format=if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ASTC){ + println!("Using ASTC"); + wgpu::TextureFormat::Astc{ + block:AstcBlock::B4x4, + channel:AstcChannel::UnormSrgb, + } + }else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_ETC2){ + println!("Using ETC2"); + wgpu::TextureFormat::Etc2Rgb8UnormSrgb + }else if device_features.contains(wgpu::Features::TEXTURE_COMPRESSION_BC){ + println!("Using BC"); + wgpu::TextureFormat::Bc1RgbaUnormSrgb + }else{ + println!("Using plain"); + wgpu::TextureFormat::Bgra8UnormSrgb + }; + + let bytes=match skybox_format{ + wgpu::TextureFormat::Astc{ + block:AstcBlock::B4x4, + channel:AstcChannel::UnormSrgb, + }=>&include_bytes!("../images/astc.dds")[..], + wgpu::TextureFormat::Etc2Rgb8UnormSrgb=>&include_bytes!("../images/etc2.dds")[..], + wgpu::TextureFormat::Bc1RgbaUnormSrgb=>&include_bytes!("../images/bc1.dds")[..], + wgpu::TextureFormat::Bgra8UnormSrgb=>&include_bytes!("../images/bgra.dds")[..], + _=>unreachable!(), + }; + + let skybox_image=ddsfile::Dds::read(&mut std::io::Cursor::new(bytes)).unwrap(); + + let size=wgpu::Extent3d{ + width:skybox_image.get_width(), + height:skybox_image.get_height(), + depth_or_array_layers:6, + }; + + let layer_size=wgpu::Extent3d{ + depth_or_array_layers:1, + ..size + }; + let max_mips=layer_size.max_mips(wgpu::TextureDimension::D2); + + let skybox_texture=device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor{ + size, + mip_level_count:max_mips, + sample_count:1, + dimension:wgpu::TextureDimension::D2, + format:skybox_format, + usage:wgpu::TextureUsages::TEXTURE_BINDING|wgpu::TextureUsages::COPY_DST, + label:Some("Skybox Texture"), + view_formats:&[], + }, + wgpu::util::TextureDataOrder::LayerMajor, + &skybox_image.data, + ); + + skybox_texture.create_view(&wgpu::TextureViewDescriptor{ + label:Some("Skybox Texture View"), + dimension:Some(wgpu::TextureViewDimension::Cube), + ..wgpu::TextureViewDescriptor::default() + }) + }; + + //squid + let squid_texture_view={ + let bytes=include_bytes!("../images/squid.dds"); + + let image=ddsfile::Dds::read(&mut std::io::Cursor::new(bytes)).unwrap(); + + let size=wgpu::Extent3d{ + width:image.get_width(), + height:image.get_height(), + depth_or_array_layers:1, + }; + + let layer_size=wgpu::Extent3d{ + depth_or_array_layers:1, + ..size + }; + let max_mips=layer_size.max_mips(wgpu::TextureDimension::D2); + + let texture=device.create_texture_with_data( + queue, + &wgpu::TextureDescriptor{ + size, + mip_level_count:max_mips, + sample_count:1, + dimension:wgpu::TextureDimension::D2, + format:wgpu::TextureFormat::Bc7RgbaUnorm, + usage:wgpu::TextureUsages::TEXTURE_BINDING|wgpu::TextureUsages::COPY_DST, + label:Some("Squid Texture"), + view_formats:&[], + }, + wgpu::util::TextureDataOrder::LayerMajor, + &image.data, + ); + + texture.create_view(&wgpu::TextureViewDescriptor{ + label:Some("Squid Texture View"), + dimension:Some(wgpu::TextureViewDimension::D2), + ..wgpu::TextureViewDescriptor::default() + }) + }; + + let model_pipeline_layout=device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor{ + label:None, + bind_group_layouts:&[ + &camera_bind_group_layout, + &skybox_texture_bind_group_layout, + &model_bind_group_layout, + ], + push_constant_ranges:&[], + }); + let sky_pipeline_layout=device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor{ + label:None, + bind_group_layouts:&[ + &camera_bind_group_layout, + &skybox_texture_bind_group_layout, + ], + push_constant_ranges:&[], + }); + + // Create the render pipelines + let sky_pipeline=device.create_render_pipeline(&wgpu::RenderPipelineDescriptor{ + label:Some("Sky Pipeline"), + layout:Some(&sky_pipeline_layout), + vertex:wgpu::VertexState{ + module:&shader, + entry_point:"vs_sky", + buffers:&[], + compilation_options:wgpu::PipelineCompilationOptions::default(), + }, + fragment:Some(wgpu::FragmentState{ + module:&shader, + entry_point:"fs_sky", + targets:&[Some(config.view_formats[0].into())], + compilation_options:wgpu::PipelineCompilationOptions::default(), + }), + primitive:wgpu::PrimitiveState{ + front_face:wgpu::FrontFace::Cw, + ..Default::default() + }, + depth_stencil:Some(wgpu::DepthStencilState{ + format:Self::DEPTH_FORMAT, + depth_write_enabled:false, + depth_compare:wgpu::CompareFunction::LessEqual, + stencil:wgpu::StencilState::default(), + bias:wgpu::DepthBiasState::default(), + }), + multisample:wgpu::MultisampleState::default(), + multiview:None, + cache:None, + }); + let model_pipeline=device.create_render_pipeline(&wgpu::RenderPipelineDescriptor{ + label:Some("Model Pipeline"), + layout:Some(&model_pipeline_layout), + vertex:wgpu::VertexState{ + module:&shader, + entry_point:"vs_entity_texture", + buffers:&[wgpu::VertexBufferLayout{ + array_stride:std::mem::size_of::() as wgpu::BufferAddress, + step_mode:wgpu::VertexStepMode::Vertex, + attributes:&wgpu::vertex_attr_array![0=>Float32x3,1=>Float32x2,2=>Float32x3,3=>Float32x4], + }], + compilation_options:wgpu::PipelineCompilationOptions::default(), + }, + fragment:Some(wgpu::FragmentState{ + module:&shader, + entry_point:"fs_entity_texture", + targets:&[Some(config.view_formats[0].into())], + compilation_options:wgpu::PipelineCompilationOptions::default(), + }), + primitive:wgpu::PrimitiveState{ + front_face:wgpu::FrontFace::Cw, + cull_mode:Some(wgpu::Face::Front), + ..Default::default() + }, + depth_stencil:Some(wgpu::DepthStencilState{ + format:Self::DEPTH_FORMAT, + depth_write_enabled:true, + depth_compare:wgpu::CompareFunction::LessEqual, + stencil:wgpu::StencilState::default(), + bias:wgpu::DepthBiasState::default(), + }), + multisample:wgpu::MultisampleState::default(), + multiview:None, + cache:None, + }); + + let camera=GraphicsCamera::default(); + let camera_uniforms=camera.to_uniform_data(glam::Vec3::ZERO,glam::Vec2::ZERO); + let camera_buf=device.create_buffer_init(&wgpu::util::BufferInitDescriptor{ + label:Some("Camera"), + contents:bytemuck::cast_slice(&camera_uniforms), + usage:wgpu::BufferUsages::UNIFORM|wgpu::BufferUsages::COPY_DST, + }); + let camera_bind_group=device.create_bind_group(&wgpu::BindGroupDescriptor{ + layout:&camera_bind_group_layout, + entries:&[ + wgpu::BindGroupEntry{ + binding:0, + resource:camera_buf.as_entire_binding(), + }, + ], + label:Some("Camera"), + }); + + let skybox_texture_bind_group=device.create_bind_group(&wgpu::BindGroupDescriptor{ + layout:&skybox_texture_bind_group_layout, + entries:&[ + wgpu::BindGroupEntry{ + binding:0, + resource:wgpu::BindingResource::TextureView(&skybox_texture_view), + }, + wgpu::BindGroupEntry{ + binding:1, + resource:wgpu::BindingResource::Sampler(&clamp_sampler), + }, + ], + label:Some("Sky Texture"), + }); + + let depth_view=Self::create_depth_texture(config,device); + + Self{ + pipelines:GraphicsPipelines{ + skybox:sky_pipeline, + model:model_pipeline + }, + bind_groups:GraphicsBindGroups{ + camera:camera_bind_group, + skybox_texture:skybox_texture_bind_group, + }, + camera, + camera_buf, + models:Vec::new(), + depth_view, + staging_belt:wgpu::util::StagingBelt::new(0x100), + bind_group_layouts:GraphicsBindGroupLayouts{model:model_bind_group_layout}, + samplers:GraphicsSamplers{repeat:repeat_sampler}, + temp_squid_texture_view:squid_texture_view, + } + } + pub fn resize( + &mut self, + device:&wgpu::Device, + config:&wgpu::SurfaceConfiguration, + user_settings:&crate::settings::UserSettings, + ){ + self.depth_view=Self::create_depth_texture(config,device); + self.camera.screen_size=glam::uvec2(config.width,config.height); + self.load_user_settings(user_settings); + } + pub fn render( + &mut self, + view:&wgpu::TextureView, + device:&wgpu::Device, + queue:&wgpu::Queue, + frame_state:FrameState, + ){ + //TODO:use scheduled frame times to create beautiful smoothing simulation physics extrapolation assuming no input + + let mut encoder=device.create_command_encoder(&wgpu::CommandEncoderDescriptor{label:None}); + + // update rotation + let camera_uniforms=self.camera.to_uniform_data( + frame_state.body.extrapolated_position(frame_state.time).map(Into::::into).to_array().into(), + frame_state.camera.simulate_move_angles(glam::IVec2::ZERO) + ); + self.staging_belt + .write_buffer( + &mut encoder, + &self.camera_buf, + 0, + wgpu::BufferSize::new((camera_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), + device, + ) + .copy_from_slice(bytemuck::cast_slice(&camera_uniforms)); + //This code only needs to run when the uniforms change + /* + for model in self.models.iter(){ + let model_uniforms=get_instances_buffer_data(&model.instances); + self.staging_belt + .write_buffer( + &mut encoder, + &model.model_buf,//description of where data will be written when command is executed + 0,//offset in staging belt? + wgpu::BufferSize::new((model_uniforms.len() * 4) as wgpu::BufferAddress).unwrap(), + device, + ) + .copy_from_slice(bytemuck::cast_slice(&model_uniforms)); + } + */ + self.staging_belt.finish(); + + { + let mut rpass=encoder.begin_render_pass(&wgpu::RenderPassDescriptor{ + label:None, + color_attachments:&[Some(wgpu::RenderPassColorAttachment{ + view, + resolve_target:None, + ops:wgpu::Operations{ + load:wgpu::LoadOp::Clear(wgpu::Color{ + r:0.1, + g:0.2, + b:0.3, + a:1.0, + }), + store:wgpu::StoreOp::Store, + }, + })], + depth_stencil_attachment:Some(wgpu::RenderPassDepthStencilAttachment{ + view:&self.depth_view, + depth_ops:Some(wgpu::Operations{ + load:wgpu::LoadOp::Clear(1.0), + store:wgpu::StoreOp::Discard, + }), + stencil_ops:None, + }), + timestamp_writes:Default::default(), + occlusion_query_set:Default::default(), + }); + + rpass.set_bind_group(0,&self.bind_groups.camera,&[]); + rpass.set_bind_group(1,&self.bind_groups.skybox_texture,&[]); + + rpass.set_pipeline(&self.pipelines.model); + for model in &self.models{ + rpass.set_bind_group(2,&model.bind_group,&[]); + rpass.set_vertex_buffer(0,model.vertex_buf.slice(..)); + rpass.set_index_buffer(model.indices.buf.slice(..),model.indices.format); + //TODO: loop over triangle strips + rpass.draw_indexed(0..model.indices.count,0,0..model.instance_count); + } + + rpass.set_pipeline(&self.pipelines.skybox); + rpass.draw(0..3,0..1); + } + + queue.submit(std::iter::once(encoder.finish())); + + self.staging_belt.recall(); + } +} +const MODEL_BUFFER_SIZE:usize=4*4 + 12 + 4;//let size=std::mem::size_of::(); +const MODEL_BUFFER_SIZE_BYTES:usize=MODEL_BUFFER_SIZE*4; +fn get_instances_buffer_data(instances:&[GraphicsModelOwned])->Vec{ + let mut raw=Vec::with_capacity(MODEL_BUFFER_SIZE*instances.len()); + for mi in instances{ + //model transform + raw.extend_from_slice(&AsRef::<[f32; 4*4]>::as_ref(&mi.transform)[..]); + //normal transform + raw.extend_from_slice(AsRef::<[f32; 3]>::as_ref(&mi.normal_transform.x_axis)); + raw.extend_from_slice(&[0.0]); + raw.extend_from_slice(AsRef::<[f32; 3]>::as_ref(&mi.normal_transform.y_axis)); + raw.extend_from_slice(&[0.0]); + raw.extend_from_slice(AsRef::<[f32; 3]>::as_ref(&mi.normal_transform.z_axis)); + raw.extend_from_slice(&[0.0]); + //color + raw.extend_from_slice(AsRef::<[f32; 4]>::as_ref(&mi.color.get())); + } + raw +} diff --git a/strafe-client/src/graphics_worker.rs b/strafe-client/src/graphics_worker.rs new file mode 100644 index 0000000..9950785 --- /dev/null +++ b/strafe-client/src/graphics_worker.rs @@ -0,0 +1,65 @@ +pub enum Instruction{ + Render(crate::graphics::FrameState), + //UpdateModel(crate::graphics::GraphicsModelUpdate), + Resize(winit::dpi::PhysicalSize,crate::settings::UserSettings), + ChangeMap(strafesnet_common::map::CompleteMap), +} + +//Ideally the graphics thread worker description is: +/* +WorkerDescription{ + input:Immediate, + output:Realtime(PoolOrdering::Ordered(3)), +} +*/ +//up to three frames in flight, dropping new frame requests when all three are busy, and dropping output frames when one renders out of order + +pub fn new<'a>( + mut graphics:crate::graphics::GraphicsState, + mut config:wgpu::SurfaceConfiguration, + surface:wgpu::Surface<'a>, + device:wgpu::Device, + queue:wgpu::Queue, +)->crate::compat_worker::INWorker<'a,Instruction>{ + let mut resize=None; + crate::compat_worker::INWorker::new(move |ins:Instruction|{ + match ins{ + Instruction::ChangeMap(map)=>{ + graphics.clear(); + graphics.generate_models(&device,&queue,&map); + }, + Instruction::Resize(size,user_settings)=>{ + resize=Some((size,user_settings)); + } + Instruction::Render(frame_state)=>{ + if let Some((size,user_settings))=resize.take(){ + println!("Resizing to {:?}",size); + let t0=std::time::Instant::now(); + config.width=size.width.max(1); + config.height=size.height.max(1); + surface.configure(&device,&config); + graphics.resize(&device,&config,&user_settings); + println!("Resize took {:?}",t0.elapsed()); + } + //this has to go deeper somehow + let frame=match surface.get_current_texture(){ + Ok(frame)=>frame, + Err(_)=>{ + surface.configure(&device,&config); + surface + .get_current_texture() + .expect("Failed to acquire next surface texture!") + } + }; + let view=frame.texture.create_view(&wgpu::TextureViewDescriptor{ + format:Some(config.view_formats[0]), + ..wgpu::TextureViewDescriptor::default() + }); + + graphics.render(&view,&device,&queue,frame_state); + + frame.present(); + } + } + }) +} diff --git a/strafe-client/src/main.rs b/strafe-client/src/main.rs new file mode 100644 index 0000000..337ba79 --- /dev/null +++ b/strafe-client/src/main.rs @@ -0,0 +1,17 @@ +mod file; +mod setup; +mod window; +mod worker; +mod physics; +mod graphics; +mod settings; +mod face_crawler; +mod compat_worker; +mod model_physics; +mod model_graphics; +mod physics_worker; +mod graphics_worker; + +fn main(){ + setup::setup_and_start(format!("Strafe Client v{}",env!("CARGO_PKG_VERSION"))); +} diff --git a/strafe-client/src/model_graphics.rs b/strafe-client/src/model_graphics.rs new file mode 100644 index 0000000..2468cda --- /dev/null +++ b/strafe-client/src/model_graphics.rs @@ -0,0 +1,48 @@ +use bytemuck::{Pod,Zeroable}; +use strafesnet_common::model::{IndexedVertex,PolygonGroup,RenderConfigId}; +#[derive(Clone,Copy,Pod,Zeroable)] +#[repr(C)] +pub struct GraphicsVertex{ + pub pos:[f32;3], + pub tex:[f32;2], + pub normal:[f32;3], + pub color:[f32;4], +} +#[derive(Clone,Copy,id::Id)] +pub struct IndexedGraphicsMeshOwnedRenderConfigId(u32); +pub struct IndexedGraphicsMeshOwnedRenderConfig{ + pub unique_pos:Vec<[f32;3]>, + pub unique_tex:Vec<[f32;2]>, + pub unique_normal:Vec<[f32;3]>, + pub unique_color:Vec<[f32;4]>, + pub unique_vertices:Vec, + pub render_config:RenderConfigId, + pub polys:PolygonGroup, + pub instances:Vec, +} +pub enum Indices{ + U32(Vec), + U16(Vec), +} +pub struct GraphicsMeshOwnedRenderConfig{ + pub vertices:Vec, + pub indices:Indices, + pub render_config:RenderConfigId, + pub instances:Vec, +} +#[derive(Clone,Copy,PartialEq,id::Id)] +pub struct GraphicsModelColor4(glam::Vec4); +impl std::hash::Hash for GraphicsModelColor4{ + fn hash(&self,state:&mut H) { + for &f in self.0.as_ref(){ + bytemuck::cast::(f).hash(state); + } + } +} +impl Eq for GraphicsModelColor4{} +#[derive(Clone)] +pub struct GraphicsModelOwned{ + pub transform:glam::Mat4, + pub normal_transform:glam::Mat3, + pub color:GraphicsModelColor4, +} diff --git a/strafe-client/src/model_physics.rs b/strafe-client/src/model_physics.rs new file mode 100644 index 0000000..5789b9a --- /dev/null +++ b/strafe-client/src/model_physics.rs @@ -0,0 +1,1001 @@ +use std::borrow::{Borrow,Cow}; +use std::collections::{HashSet,HashMap}; +use strafesnet_common::integer::vec3::Vector3; +use strafesnet_common::model::{self,MeshId,PolygonIter}; +use strafesnet_common::integer::{self,vec3,Fixed,Planar64,Planar64Vec3,Ratio}; + +pub trait UndirectedEdge{ + type DirectedEdge:Copy+DirectedEdge; + fn as_directed(&self,parity:bool)->Self::DirectedEdge; +} +pub trait DirectedEdge{ + type UndirectedEdge:Copy+std::fmt::Debug+UndirectedEdge; + fn as_undirected(&self)->Self::UndirectedEdge; + fn parity(&self)->bool; + //this is stupid but may work fine + fn reverse(&self)-><::UndirectedEdge as UndirectedEdge>::DirectedEdge{ + self.as_undirected().as_directed(!self.parity()) + } +} + +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct MeshVertId(u32); +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct MeshFaceId(u32); + +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct SubmeshVertId(u32); +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct SubmeshEdgeId(u32); +/// DirectedEdgeId refers to an EdgeId when undirected. +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct SubmeshDirectedEdgeId(u32); +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct SubmeshFaceId(u32); + +impl UndirectedEdge for SubmeshEdgeId{ + type DirectedEdge=SubmeshDirectedEdgeId; + fn as_directed(&self,parity:bool)->SubmeshDirectedEdgeId{ + SubmeshDirectedEdgeId(self.0|((parity as u32)<<(u32::BITS-1))) + } +} +impl DirectedEdge for SubmeshDirectedEdgeId{ + type UndirectedEdge=SubmeshEdgeId; + fn as_undirected(&self)->SubmeshEdgeId{ + SubmeshEdgeId(self.0&!(1<<(u32::BITS-1))) + } + fn parity(&self)->bool{ + self.0&(1<<(u32::BITS-1))!=0 + } +} + +//Vertex <-> Edge <-> Face -> Collide +#[derive(Debug)] +pub enum FEV{ + Face(F), + Edge(E::UndirectedEdge), + Vert(V), +} + +//use Unit32 #[repr(C)] for map files +#[derive(Clone,Hash,Eq,PartialEq)] +struct Face{ + normal:Planar64Vec3, + dot:Planar64, +} +struct Vert(Planar64Vec3); +pub trait MeshQuery{ + // Vertex must be Planar64Vec3 because it represents an actual position + type Normal; + type Offset; + fn edge_n(&self,edge_id:EDGE::UndirectedEdge)->Planar64Vec3{ + let verts=self.edge_verts(edge_id); + self.vert(verts[1].clone())-self.vert(verts[0].clone()) + } + fn directed_edge_n(&self,directed_edge_id:EDGE)->Planar64Vec3{ + let verts=self.edge_verts(directed_edge_id.as_undirected()); + (self.vert(verts[1].clone())-self.vert(verts[0].clone()))*((directed_edge_id.parity() as i64)*2-1) + } + fn vert(&self,vert_id:VERT)->Planar64Vec3; + fn face_nd(&self,face_id:FACE)->(Self::Normal,Self::Offset); + fn face_edges(&self,face_id:FACE)->Cow>; + fn edge_faces(&self,edge_id:EDGE::UndirectedEdge)->Cow<[FACE;2]>; + fn edge_verts(&self,edge_id:EDGE::UndirectedEdge)->Cow<[VERT;2]>; + fn vert_edges(&self,vert_id:VERT)->Cow>; + fn vert_faces(&self,vert_id:VERT)->Cow>; +} +struct FaceRefs{ + edges:Vec, + //verts:Vec, +} +struct EdgeRefs{ + faces:[SubmeshFaceId;2],//left, right + verts:[SubmeshVertId;2],//bottom, top +} +struct VertRefs{ + faces:Vec, + edges:Vec, +} +pub struct PhysicsMeshData{ + //this contains all real and virtual faces used in both the complete mesh and convex submeshes + //faces are sorted such that all faces that belong to the complete mesh appear first, and then + //all remaining faces are virtual to operate internal logic of the face crawler + //and cannot be part of a physics collision + //virtual faces are only used in convex submeshes. + faces:Vec,//MeshFaceId indexes this list + verts:Vec,//MeshVertId indexes this list +} +pub struct PhysicsMeshTopology{ + //mapping of local ids to PhysicsMeshData ids + faces:Vec,//SubmeshFaceId indexes this list + verts:Vec,//SubmeshVertId indexes this list + //all ids here are local to this object + face_topology:Vec, + edge_topology:Vec, + vert_topology:Vec, +} +#[derive(Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct PhysicsMeshId(u32); +impl Into for PhysicsMeshId{ + fn into(self)->MeshId{ + MeshId::new(self.0) + } +} +impl From for PhysicsMeshId{ + fn from(value:MeshId)->Self{ + Self::new(value.get()) + } +} +#[derive(Debug,Default,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +pub struct PhysicsSubmeshId(u32); +pub struct PhysicsMesh{ + data:PhysicsMeshData, + complete_mesh:PhysicsMeshTopology, + //Most objects in roblox maps are already convex, so the list length is 0 + //as soon as the mesh is divided into 2 submeshes, the list length jumps to 2. + //length 1 is unnecessary since the complete mesh would be a duplicate of the only submesh, but would still function properly + submeshes:Vec, +} +impl PhysicsMesh{ + pub fn unit_cube()->Self{ + //go go gadget debug print mesh + let data=PhysicsMeshData{ + faces:vec![ + Face{normal:vec3::raw_xyz( 4294967296, 0, 0),dot:Planar64::raw(4294967296)}, + Face{normal:vec3::raw_xyz( 0, 4294967296, 0),dot:Planar64::raw(4294967296)}, + Face{normal:vec3::raw_xyz( 0, 0, 4294967296),dot:Planar64::raw(4294967296)}, + Face{normal:vec3::raw_xyz(-4294967296, 0, 0),dot:Planar64::raw(4294967296)}, + Face{normal:vec3::raw_xyz( 0,-4294967296, 0),dot:Planar64::raw(4294967296)}, + Face{normal:vec3::raw_xyz( 0, 0,-4294967296),dot:Planar64::raw(4294967296)} + ], + verts:vec![ + Vert(vec3::raw_xyz( 4294967296,-4294967296,-4294967296)), + Vert(vec3::raw_xyz( 4294967296, 4294967296,-4294967296)), + Vert(vec3::raw_xyz( 4294967296, 4294967296, 4294967296)), + Vert(vec3::raw_xyz( 4294967296,-4294967296, 4294967296)), + Vert(vec3::raw_xyz(-4294967296, 4294967296,-4294967296)), + Vert(vec3::raw_xyz(-4294967296, 4294967296, 4294967296)), + Vert(vec3::raw_xyz(-4294967296,-4294967296, 4294967296)), + Vert(vec3::raw_xyz(-4294967296,-4294967296,-4294967296)) + ] + }; + let mesh_topology=PhysicsMeshTopology{ + faces:(0..data.faces.len() as u32).map(MeshFaceId::new).collect(), + verts:(0..data.verts.len() as u32).map(MeshVertId::new).collect(), + face_topology:vec![ + FaceRefs{edges:vec![SubmeshDirectedEdgeId((9223372036854775808u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775809u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775810u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId(3)]}, + FaceRefs{edges:vec![SubmeshDirectedEdgeId((9223372036854775812u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775813u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId(6),SubmeshDirectedEdgeId(1)]}, + FaceRefs{edges:vec![SubmeshDirectedEdgeId(7),SubmeshDirectedEdgeId(2),SubmeshDirectedEdgeId((9223372036854775814u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775816u64-(1<<63)+(1<<31)) as u32)]}, + FaceRefs{edges:vec![SubmeshDirectedEdgeId(8),SubmeshDirectedEdgeId(5),SubmeshDirectedEdgeId((9223372036854775817u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId(10)]}, + FaceRefs{edges:vec![SubmeshDirectedEdgeId((9223372036854775815u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775818u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId(11),SubmeshDirectedEdgeId((9223372036854775811u64-(1<<63)+(1<<31)) as u32)]}, + FaceRefs{edges:vec![SubmeshDirectedEdgeId(4),SubmeshDirectedEdgeId(0),SubmeshDirectedEdgeId((9223372036854775819u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId(9)]} + ], + edge_topology:vec![ + EdgeRefs{faces:[SubmeshFaceId(0),SubmeshFaceId(5)],verts:[SubmeshVertId(0),SubmeshVertId(1)]}, + EdgeRefs{faces:[SubmeshFaceId(0),SubmeshFaceId(1)],verts:[SubmeshVertId(1),SubmeshVertId(2)]}, + EdgeRefs{faces:[SubmeshFaceId(0),SubmeshFaceId(2)],verts:[SubmeshVertId(2),SubmeshVertId(3)]}, + EdgeRefs{faces:[SubmeshFaceId(4),SubmeshFaceId(0)],verts:[SubmeshVertId(0),SubmeshVertId(3)]}, + EdgeRefs{faces:[SubmeshFaceId(1),SubmeshFaceId(5)],verts:[SubmeshVertId(1),SubmeshVertId(4)]}, + EdgeRefs{faces:[SubmeshFaceId(1),SubmeshFaceId(3)],verts:[SubmeshVertId(4),SubmeshVertId(5)]}, + EdgeRefs{faces:[SubmeshFaceId(2),SubmeshFaceId(1)],verts:[SubmeshVertId(2),SubmeshVertId(5)]}, + EdgeRefs{faces:[SubmeshFaceId(4),SubmeshFaceId(2)],verts:[SubmeshVertId(3),SubmeshVertId(6)]}, + EdgeRefs{faces:[SubmeshFaceId(2),SubmeshFaceId(3)],verts:[SubmeshVertId(5),SubmeshVertId(6)]}, + EdgeRefs{faces:[SubmeshFaceId(3),SubmeshFaceId(5)],verts:[SubmeshVertId(4),SubmeshVertId(7)]}, + EdgeRefs{faces:[SubmeshFaceId(4),SubmeshFaceId(3)],verts:[SubmeshVertId(6),SubmeshVertId(7)]}, + EdgeRefs{faces:[SubmeshFaceId(5),SubmeshFaceId(4)],verts:[SubmeshVertId(0),SubmeshVertId(7)]} + ], + vert_topology:vec![ + VertRefs{faces:vec![SubmeshFaceId(0),SubmeshFaceId(4),SubmeshFaceId(5)],edges:vec![SubmeshDirectedEdgeId((9223372036854775811u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775819u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775808u64-(1<<63)+(1<<31)) as u32)]}, + VertRefs{faces:vec![SubmeshFaceId(0),SubmeshFaceId(5),SubmeshFaceId(1)],edges:vec![SubmeshDirectedEdgeId((9223372036854775812u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId(0),SubmeshDirectedEdgeId((9223372036854775809u64-(1<<63)+(1<<31)) as u32)]}, + VertRefs{faces:vec![SubmeshFaceId(0),SubmeshFaceId(2),SubmeshFaceId(1)],edges:vec![SubmeshDirectedEdgeId(1),SubmeshDirectedEdgeId((9223372036854775810u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775814u64-(1<<63)+(1<<31)) as u32)]}, + VertRefs{faces:vec![SubmeshFaceId(0),SubmeshFaceId(2),SubmeshFaceId(4)],edges:vec![SubmeshDirectedEdgeId(2),SubmeshDirectedEdgeId(3),SubmeshDirectedEdgeId((9223372036854775815u64-(1<<63)+(1<<31)) as u32)]}, + VertRefs{faces:vec![SubmeshFaceId(3),SubmeshFaceId(5),SubmeshFaceId(1)],edges:vec![SubmeshDirectedEdgeId(4),SubmeshDirectedEdgeId((9223372036854775817u64-(1<<63)+(1<<31)) as u32),SubmeshDirectedEdgeId((9223372036854775813u64-(1<<63)+(1<<31)) as u32)]}, + VertRefs{faces:vec![SubmeshFaceId(2),SubmeshFaceId(3),SubmeshFaceId(1)],edges:vec![SubmeshDirectedEdgeId(5),SubmeshDirectedEdgeId(6),SubmeshDirectedEdgeId((9223372036854775816u64-(1<<63)+(1<<31)) as u32)]}, + VertRefs{faces:vec![SubmeshFaceId(2),SubmeshFaceId(3),SubmeshFaceId(4)],edges:vec![SubmeshDirectedEdgeId(7),SubmeshDirectedEdgeId(8),SubmeshDirectedEdgeId((9223372036854775818u64-(1<<63)+(1<<31)) as u32)]}, + VertRefs{faces:vec![SubmeshFaceId(4),SubmeshFaceId(3),SubmeshFaceId(5)],edges:vec![SubmeshDirectedEdgeId(10),SubmeshDirectedEdgeId(11),SubmeshDirectedEdgeId(9)]} + ] + }; + Self{ + data, + complete_mesh:mesh_topology, + submeshes:Vec::new(), + } + } + pub fn unit_cylinder()->Self{ + Self::unit_cube() + } + #[inline] + pub const fn complete_mesh(&self)->&PhysicsMeshTopology{ + &self.complete_mesh + } + #[inline] + pub const fn complete_mesh_view(&self)->PhysicsMeshView{ + PhysicsMeshView{ + data:&self.data, + topology:self.complete_mesh(), + } + } + #[inline] + pub fn submeshes(&self)->&[PhysicsMeshTopology]{ + //the complete mesh is already a convex mesh when len()==0, len()==1 is invalid but will still work + if self.submeshes.len()==0{ + std::slice::from_ref(&self.complete_mesh) + }else{ + &self.submeshes.as_slice() + } + } + #[inline] + pub fn submesh_view(&self,submesh_id:PhysicsSubmeshId)->PhysicsMeshView{ + PhysicsMeshView{ + data:&self.data, + topology:&self.submeshes()[submesh_id.get() as usize], + } + } + pub fn submesh_views(&self)->impl Iterator{ + self.submeshes().iter().map(|topology|PhysicsMeshView{ + data:&self.data, + topology, + }) + } +} + +//mesh builder code +#[derive(Default,Clone)] +struct VertRefGuy{ + edges:HashSet, + faces:HashSet, +} +#[derive(Clone,Hash,Eq,PartialEq)] +struct EdgeRefVerts([SubmeshVertId;2]); +impl EdgeRefVerts{ + const fn new(v0:SubmeshVertId,v1:SubmeshVertId)->(Self,bool){ + (if v0.0Self{ + Self([SubmeshFaceId(0);2]) + } + fn push(&mut self,i:usize,face_id:SubmeshFaceId){ + self.0[i]=face_id; + } +} +struct FaceRefEdges(Vec); +#[derive(Default)] +struct EdgePool{ + edge_guys:Vec<(EdgeRefVerts,EdgeRefFaces)>, + edge_id_from_guy:HashMap, +} +impl EdgePool{ + fn push(&mut self,edge_ref_verts:EdgeRefVerts)->(&mut EdgeRefFaces,SubmeshEdgeId){ + let edge_id=if let Some(&edge_id)=self.edge_id_from_guy.get(&edge_ref_verts){ + edge_id + }else{ + let edge_id=SubmeshEdgeId::new(self.edge_guys.len() as u32); + self.edge_guys.push((edge_ref_verts.clone(),EdgeRefFaces::new())); + self.edge_id_from_guy.insert(edge_ref_verts,edge_id); + edge_id + }; + (&mut unsafe{self.edge_guys.get_unchecked_mut(edge_id.get() as usize)}.1,edge_id) + } +} + +#[derive(Debug)] +pub enum PhysicsMeshError{ + ZeroVertices, + NoPhysicsGroups, +} +impl std::fmt::Display for PhysicsMeshError{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f,"{self:?}") + } +} +impl std::error::Error for PhysicsMeshError{} + +impl TryFrom<&model::Mesh> for PhysicsMesh{ + type Error=PhysicsMeshError; + fn try_from(mesh:&model::Mesh)->Result{ + if mesh.unique_pos.len()==0{ + return Err(PhysicsMeshError::ZeroVertices); + } + let verts=mesh.unique_pos.iter().copied().map(Vert).collect(); + //TODO: fix submeshes + //flat map mesh.physics_groups[$1].groups.polys()[$2] as face_id + //lower face_id points to upper face_id + //the same face is not allowed to be in multiple polygon groups + let mut faces=Vec::new(); + let mut face_id_from_face=HashMap::new(); + let mut mesh_topologies:Vec=mesh.physics_groups.iter().map(|physics_group|{ + //construct submesh + let mut submesh_faces=Vec::new();//these contain a map from submeshId->meshId + let mut submesh_verts=Vec::new(); + let mut submesh_vert_id_from_mesh_vert_id=HashMap::::new(); + //lazy closure + let mut get_submesh_vert_id=|vert_id:MeshVertId|{ + if let Some(&submesh_vert_id)=submesh_vert_id_from_mesh_vert_id.get(&vert_id){ + submesh_vert_id + }else{ + let submesh_vert_id=SubmeshVertId::new(submesh_verts.len() as u32); + submesh_verts.push(vert_id); + submesh_vert_id_from_mesh_vert_id.insert(vert_id,submesh_vert_id); + submesh_vert_id + } + }; + let mut edge_pool=EdgePool::default(); + let mut vert_ref_guys=vec![VertRefGuy::default();mesh.unique_pos.len()]; + let mut face_ref_guys=Vec::new(); + for polygon_group_id in &physics_group.groups{ + let polygon_group=&mesh.polygon_groups[polygon_group_id.get() as usize]; + for poly_vertices in polygon_group.polys(){ + let submesh_face_id=SubmeshFaceId::new(submesh_faces.len() as u32); + //one face per poly + let mut normal=Vector3::new([Fixed::ZERO,Fixed::ZERO,Fixed::ZERO]); + let len=poly_vertices.len(); + let face_edges=poly_vertices.into_iter().enumerate().map(|(i,vert_id)|{ + let vert0_id=MeshVertId::new(mesh.unique_vertices[vert_id.get() as usize].pos.get() as u32); + let vert1_id=MeshVertId::new(mesh.unique_vertices[poly_vertices[(i+1)%len].get() as usize].pos.get() as u32); + //index submesh verts + let submesh_vert0_id=get_submesh_vert_id(vert0_id); + let submesh_vert1_id=get_submesh_vert_id(vert1_id); + //https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal (Newell's Method) + let v0=mesh.unique_pos[vert0_id.get() as usize]; + let v1=mesh.unique_pos[vert1_id.get() as usize]; + normal+=Vector3::new([ + (v0.y-v1.y)*(v0.z+v1.z), + (v0.z-v1.z)*(v0.x+v1.x), + (v0.x-v1.x)*(v0.y+v1.y), + ]); + //get/create edge and push face into it + let (edge_ref_verts,is_sorted)=EdgeRefVerts::new(submesh_vert0_id,submesh_vert1_id); + let (edge_ref_faces,edge_id)=edge_pool.push(edge_ref_verts); + //polygon vertices as assumed to be listed clockwise + //populate the edge face on the left or right depending on how the edge vertices got sorted + edge_ref_faces.push(!is_sorted as usize,submesh_face_id); + //index edges & face into vertices + { + let vert_ref_guy=unsafe{vert_ref_guys.get_unchecked_mut(submesh_vert0_id.get() as usize)}; + vert_ref_guy.edges.insert(edge_id.as_directed(is_sorted)); + vert_ref_guy.faces.insert(submesh_face_id); + unsafe{vert_ref_guys.get_unchecked_mut(submesh_vert1_id.get() as usize)}.edges.insert(edge_id.as_directed(!is_sorted)); + } + //return directed_edge_id + edge_id.as_directed(is_sorted) + }).collect(); + let mut dot=Fixed::ZERO; + // find the average dot + for &v in poly_vertices{ + dot+=normal.dot(mesh.unique_pos[mesh.unique_vertices[v.get() as usize].pos.get() as usize]); + } + //assume face hash is stable, and there are no flush faces... + let face=Face{ + normal:(normal/len as i64).divide().fix_1(), + dot:(dot/(len*len) as i64).fix_1(), + }; + let face_id=match face_id_from_face.get(&face){ + Some(&face_id)=>face_id, + None=>{ + let face_id=MeshFaceId::new(faces.len() as u32); + face_id_from_face.insert(face.clone(),face_id); + faces.push(face); + face_id + } + }; + submesh_faces.push(face_id); + face_ref_guys.push(FaceRefEdges(face_edges)); + } + } + PhysicsMeshTopology{ + faces:submesh_faces, + verts:submesh_verts, + face_topology:face_ref_guys.into_iter().map(|face_ref_guy|{ + FaceRefs{edges:face_ref_guy.0} + }).collect(), + edge_topology:edge_pool.edge_guys.into_iter().map(|(edge_ref_verts,edge_ref_faces)| + EdgeRefs{faces:edge_ref_faces.0,verts:edge_ref_verts.0} + ).collect(), + vert_topology:vert_ref_guys.into_iter().map(|vert_ref_guy| + VertRefs{ + edges:vert_ref_guy.edges.into_iter().collect(), + faces:vert_ref_guy.faces.into_iter().collect(), + } + ).collect(), + } + }).collect(); + Ok(Self{ + data:PhysicsMeshData{ + faces, + verts, + }, + complete_mesh:mesh_topologies.pop().ok_or(PhysicsMeshError::NoPhysicsGroups)?, + submeshes:mesh_topologies, + }) + } +} + +pub struct PhysicsMeshView<'a>{ + data:&'a PhysicsMeshData, + topology:&'a PhysicsMeshTopology, +} +impl MeshQuery for PhysicsMeshView<'_>{ + type Normal=Planar64Vec3; + type Offset=Planar64; + fn face_nd(&self,face_id:SubmeshFaceId)->(Planar64Vec3,Planar64){ + let face_idx=self.topology.faces[face_id.get() as usize].get() as usize; + (self.data.faces[face_idx].normal,self.data.faces[face_idx].dot) + } + //ideally I never calculate the vertex position, but I have to for the graphical meshes... + fn vert(&self,vert_id:SubmeshVertId)->Planar64Vec3{ + let vert_idx=self.topology.verts[vert_id.get() as usize].get() as usize; + self.data.verts[vert_idx].0 + } + fn face_edges(&self,face_id:SubmeshFaceId)->Cow>{ + Cow::Borrowed(&self.topology.face_topology[face_id.get() as usize].edges) + } + fn edge_faces(&self,edge_id:SubmeshEdgeId)->Cow<[SubmeshFaceId;2]>{ + Cow::Borrowed(&self.topology.edge_topology[edge_id.get() as usize].faces) + } + fn edge_verts(&self,edge_id:SubmeshEdgeId)->Cow<[SubmeshVertId;2]>{ + Cow::Borrowed(&self.topology.edge_topology[edge_id.get() as usize].verts) + } + fn vert_edges(&self,vert_id:SubmeshVertId)->Cow>{ + Cow::Borrowed(&self.topology.vert_topology[vert_id.get() as usize].edges) + } + fn vert_faces(&self,vert_id:SubmeshVertId)->Cow>{ + Cow::Borrowed(&self.topology.vert_topology[vert_id.get() as usize].faces) + } +} + +pub struct PhysicsMeshTransform{ + pub vertex:integer::Planar64Affine3, + pub normal:integer::mat3::Matrix3>, + pub det:Fixed<3,96>, +} +impl PhysicsMeshTransform{ + pub fn new(transform:integer::Planar64Affine3)->Self{ + Self{ + normal:transform.matrix3.adjugate().transpose(), + det:transform.matrix3.det(), + vertex:transform, + } + } +} + +pub struct TransformedMesh<'a>{ + view:PhysicsMeshView<'a>, + transform:&'a PhysicsMeshTransform, +} +impl TransformedMesh<'_>{ + pub const fn new<'a>( + view:PhysicsMeshView<'a>, + transform:&'a PhysicsMeshTransform, + )->TransformedMesh<'a>{ + TransformedMesh{ + view, + transform, + } + } + pub fn verts<'a>(&'a self)->impl Iterator>>+'a{ + self.view.data.verts.iter().map(|&Vert(pos)|self.transform.vertex.transform_point3(pos)) + } + fn farthest_vert(&self,dir:Planar64Vec3)->SubmeshVertId{ + //this happens to be well-defined. there are no virtual virtices + SubmeshVertId::new( + self.view.topology.verts.iter() + .enumerate() + .max_by_key(|(_,&vert_id)| + dir.dot(self.transform.vertex.transform_point3(self.view.data.verts[vert_id.get() as usize].0)) + ) + //assume there is more than zero vertices. + .unwrap().0 as u32 + ) + } +} +impl MeshQuery for TransformedMesh<'_>{ + type Normal=Vector3>; + type Offset=Fixed<4,128>; + fn face_nd(&self,face_id:SubmeshFaceId)->(Self::Normal,Self::Offset){ + let (n,d)=self.view.face_nd(face_id); + let transformed_n=self.transform.normal*n; + let transformed_d=d*self.transform.det+transformed_n.dot(self.transform.vertex.translation); + (transformed_n,transformed_d) + } + fn vert(&self,vert_id:SubmeshVertId)->Planar64Vec3{ + self.transform.vertex.transform_point3(self.view.vert(vert_id)).fix_1() + } + #[inline] + fn face_edges(&self,face_id:SubmeshFaceId)->Cow>{ + self.view.face_edges(face_id) + } + #[inline] + fn edge_faces(&self,edge_id:SubmeshEdgeId)->Cow<[SubmeshFaceId;2]>{ + self.view.edge_faces(edge_id) + } + #[inline] + fn edge_verts(&self,edge_id:SubmeshEdgeId)->Cow<[SubmeshVertId;2]>{ + self.view.edge_verts(edge_id) + } + #[inline] + fn vert_edges(&self,vert_id:SubmeshVertId)->Cow>{ + self.view.vert_edges(vert_id) + } + #[inline] + fn vert_faces(&self,vert_id:SubmeshVertId)->Cow>{ + self.view.vert_faces(vert_id) + } +} + +//Note that a face on a minkowski mesh refers to a pair of fevs on the meshes it's summed from +//(face,vertex) +//(edge,edge) +//(vertex,face) +#[derive(Clone,Copy,Debug)] +pub enum MinkowskiVert{ + VertVert(SubmeshVertId,SubmeshVertId), +} +#[derive(Clone,Copy,Debug)] +pub enum MinkowskiEdge{ + VertEdge(SubmeshVertId,SubmeshEdgeId), + EdgeVert(SubmeshEdgeId,SubmeshVertId), + //EdgeEdge when edges are parallel +} +impl UndirectedEdge for MinkowskiEdge{ + type DirectedEdge=MinkowskiDirectedEdge; + fn as_directed(&self,parity:bool)->Self::DirectedEdge{ + match self{ + MinkowskiEdge::VertEdge(v0,e1)=>MinkowskiDirectedEdge::VertEdge(*v0,e1.as_directed(parity)), + MinkowskiEdge::EdgeVert(e0,v1)=>MinkowskiDirectedEdge::EdgeVert(e0.as_directed(parity),*v1), + } + } +} +#[derive(Clone,Copy,Debug)] +pub enum MinkowskiDirectedEdge{ + VertEdge(SubmeshVertId,SubmeshDirectedEdgeId), + EdgeVert(SubmeshDirectedEdgeId,SubmeshVertId), + //EdgeEdge when edges are parallel +} +impl DirectedEdge for MinkowskiDirectedEdge{ + type UndirectedEdge=MinkowskiEdge; + fn as_undirected(&self)->Self::UndirectedEdge{ + match self{ + MinkowskiDirectedEdge::VertEdge(v0,e1)=>MinkowskiEdge::VertEdge(*v0,e1.as_undirected()), + MinkowskiDirectedEdge::EdgeVert(e0,v1)=>MinkowskiEdge::EdgeVert(e0.as_undirected(),*v1), + } + } + fn parity(&self)->bool{ + match self{ + MinkowskiDirectedEdge::VertEdge(_,e) + |MinkowskiDirectedEdge::EdgeVert(e,_)=>e.parity(), + } + } +} +#[derive(Clone,Copy,Debug,Hash,Eq,PartialEq)] +pub enum MinkowskiFace{ + VertFace(SubmeshVertId,SubmeshFaceId), + EdgeEdge(SubmeshEdgeId,SubmeshEdgeId,bool), + FaceVert(SubmeshFaceId,SubmeshVertId), + //EdgeFace + //FaceEdge + //FaceFace +} + +pub struct MinkowskiMesh<'a>{ + mesh0:TransformedMesh<'a>, + mesh1:TransformedMesh<'a>, +} + +//infinity fev algorithm state transition +#[derive(Debug)] +enum Transition{ + Done,//found closest vert, no edges are better + Vert(MinkowskiVert),//transition to vert +} +enum EV{ + Vert(MinkowskiVert), + Edge(MinkowskiEdge), +} + +pub type GigaTime=Ratio,Fixed<4,128>>; + +impl MinkowskiMesh<'_>{ + pub fn minkowski_sum<'a>(mesh0:TransformedMesh<'a>,mesh1:TransformedMesh<'a>)->MinkowskiMesh<'a>{ + MinkowskiMesh{ + mesh0, + mesh1, + } + } + fn farthest_vert(&self,dir:Planar64Vec3)->MinkowskiVert{ + MinkowskiVert::VertVert(self.mesh0.farthest_vert(dir),self.mesh1.farthest_vert(-dir)) + } + fn next_transition_vert(&self,vert_id:MinkowskiVert,best_distance_squared:&mut Fixed<2,64>,infinity_dir:Planar64Vec3,point:Planar64Vec3)->Transition{ + let mut best_transition=Transition::Done; + for &directed_edge_id in self.vert_edges(vert_id).iter(){ + let edge_n=self.directed_edge_n(directed_edge_id); + //is boundary uncrossable by a crawl from infinity + let edge_verts=self.edge_verts(directed_edge_id.as_undirected()); + //select opposite vertex + let test_vert_id=edge_verts[directed_edge_id.parity() as usize]; + //test if it's closer + let diff=point-self.vert(test_vert_id); + if edge_n.dot(infinity_dir).is_zero(){ + let distance_squared=diff.dot(diff); + if distance_squared<*best_distance_squared{ + best_transition=Transition::Vert(test_vert_id); + *best_distance_squared=distance_squared; + } + } + } + best_transition + } + fn final_ev(&self,vert_id:MinkowskiVert,best_distance_squared:&mut Fixed<2,64>,infinity_dir:Planar64Vec3,point:Planar64Vec3)->EV{ + let mut best_transition=EV::Vert(vert_id); + let diff=point-self.vert(vert_id); + for &directed_edge_id in self.vert_edges(vert_id).iter(){ + let edge_n=self.directed_edge_n(directed_edge_id); + //is boundary uncrossable by a crawl from infinity + //check if time of collision is outside Time::MIN..Time::MAX + if edge_n.dot(infinity_dir).is_zero(){ + let d=edge_n.dot(diff); + //test the edge + let edge_nn=edge_n.dot(edge_n); + if !d.is_negative()&&d<=edge_nn{ + let distance_squared={ + let c=diff.cross(edge_n); + (c.dot(c)/edge_nn).divide().fix_2() + }; + if distance_squared<=*best_distance_squared{ + best_transition=EV::Edge(directed_edge_id.as_undirected()); + *best_distance_squared=distance_squared; + } + } + } + } + best_transition + } + fn crawl_boundaries(&self,mut vert_id:MinkowskiVert,infinity_dir:Planar64Vec3,point:Planar64Vec3)->EV{ + let mut best_distance_squared={ + let diff=point-self.vert(vert_id); + diff.dot(diff) + }; + loop{ + match self.next_transition_vert(vert_id,&mut best_distance_squared,infinity_dir,point){ + Transition::Done=>return self.final_ev(vert_id,&mut best_distance_squared,infinity_dir,point), + Transition::Vert(new_vert_id)=>vert_id=new_vert_id, + } + } + } + /// This function drops a vertex down to an edge or a face if the path from infinity did not cross any vertex-edge boundaries but the point is supposed to have already crossed a boundary down from a vertex + fn infinity_fev(&self,infinity_dir:Planar64Vec3,point:Planar64Vec3)->FEV::{ + //start on any vertex + //cross uncrossable vertex-edge boundaries until you find the closest vertex or edge + //cross edge-face boundary if it's uncrossable + match self.crawl_boundaries(self.farthest_vert(infinity_dir),infinity_dir,point){ + //if a vert is returned, it is the closest point to the infinity point + EV::Vert(vert_id)=>FEV::::Vert(vert_id), + EV::Edge(edge_id)=>{ + //cross to face if the boundary is not crossable and we are on the wrong side + let edge_n=self.edge_n(edge_id); + // point is multiplied by two because vert_sum sums two vertices. + let delta_pos=point*2-{ + let &[v0,v1]=self.edge_verts(edge_id).borrow(); + self.vert(v0)+self.vert(v1) + }; + for (i,&face_id) in self.edge_faces(edge_id).iter().enumerate(){ + let face_n=self.face_nd(face_id).0; + //edge-face boundary nd, n facing out of the face towards the edge + let boundary_n=face_n.cross(edge_n)*(i as i64*2-1); + let boundary_d=boundary_n.dot(delta_pos); + //check if time of collision is outside Time::MIN..Time::MAX + //infinity_dir can always be treated as a velocity + if !boundary_d.is_positive()&&boundary_n.dot(infinity_dir).is_zero(){ + //both faces cannot pass this condition, return early if one does. + return FEV::::Face(face_id); + } + } + FEV::::Edge(edge_id) + }, + } + } + fn closest_fev_not_inside(&self,mut infinity_body:crate::physics::Body)->Option>{ + infinity_body.infinity_dir().map_or(None,|dir|{ + let infinity_fev=self.infinity_fev(-dir,infinity_body.position); + //a line is simpler to solve than a parabola + infinity_body.velocity=dir; + infinity_body.acceleration=vec3::ZERO; + //crawl in from negative infinity along a tangent line to get the closest fev + // TODO: change crawl_fev args to delta time? Optional values? + match crate::face_crawler::crawl_fev(infinity_fev,self,&infinity_body,integer::Time::MIN/4,infinity_body.time){ + crate::face_crawler::CrawlResult::Miss(fev)=>Some(fev), + crate::face_crawler::CrawlResult::Hit(_,_)=>None, + } + }) + } + pub fn predict_collision_in(&self,relative_body:&crate::physics::Body,time_limit:integer::Time)->Option<(MinkowskiFace,GigaTime)>{ + self.closest_fev_not_inside(relative_body.clone()).map_or(None,|fev|{ + //continue forwards along the body parabola + match crate::face_crawler::crawl_fev(fev,self,relative_body,relative_body.time,time_limit){ + crate::face_crawler::CrawlResult::Miss(_)=>None, + crate::face_crawler::CrawlResult::Hit(face,time)=>Some((face,time)), + } + }) + } + pub fn predict_collision_out(&self,relative_body:&crate::physics::Body,time_limit:integer::Time)->Option<(MinkowskiFace,GigaTime)>{ + //create an extrapolated body at time_limit + let infinity_body=crate::physics::Body::new( + relative_body.extrapolated_position(time_limit), + -relative_body.extrapolated_velocity(time_limit), + relative_body.acceleration, + -time_limit, + ); + self.closest_fev_not_inside(infinity_body).map_or(None,|fev|{ + //continue backwards along the body parabola + match crate::face_crawler::crawl_fev(fev,self,&-relative_body.clone(),-time_limit,-relative_body.time){ + crate::face_crawler::CrawlResult::Miss(_)=>None, + crate::face_crawler::CrawlResult::Hit(face,time)=>Some((face,-time)),//no need to test -timeOption<(MinkowskiEdge,GigaTime)>{ + //no algorithm needed, there is only one state and two cases (Edge,None) + //determine when it passes an edge ("sliding off" case) + let mut best_time={ + let r=(time_limit-relative_body.time).to_ratio(); + Ratio::new(r.num.fix_4(),r.den.fix_4()) + }; + let mut best_edge=None; + let face_n=self.face_nd(contact_face_id).0; + for &directed_edge_id in self.face_edges(contact_face_id).iter(){ + let edge_n=self.directed_edge_n(directed_edge_id); + //f x e points in + let n=face_n.cross(edge_n); + let verts=self.edge_verts(directed_edge_id.as_undirected()); + let d=n.dot(self.vert(verts[0])+self.vert(verts[1])); + //WARNING! d outside of *2 + //WARNING: truncated precision + for dt in Fixed::<4,128>::zeroes2(((n.dot(relative_body.position))*2-d).fix_4(),n.dot(relative_body.velocity).fix_4()*2,n.dot(relative_body.acceleration).fix_4()){ + if Ratio::new(Planar64::ZERO,Planar64::EPSILON).le_ratio(dt)&&dt.lt_ratio(best_time)&&n.dot(relative_body.extrapolated_velocity_ratio_dt(dt)).is_negative(){ + best_time=dt; + best_edge=Some(directed_edge_id); + break; + } + } + } + best_edge.map(|e|(e.as_undirected(),best_time)) + } + fn infinity_in(&self,infinity_body:crate::physics::Body)->Option<(MinkowskiFace,GigaTime)>{ + let infinity_fev=self.infinity_fev(-infinity_body.velocity,infinity_body.position); + match crate::face_crawler::crawl_fev(infinity_fev,self,&infinity_body,integer::Time::MIN/4,infinity_body.time){ + crate::face_crawler::CrawlResult::Miss(_)=>None, + crate::face_crawler::CrawlResult::Hit(face,time)=>Some((face,time)), + } + } + pub fn is_point_in_mesh(&self,point:Planar64Vec3)->bool{ + let infinity_body=crate::physics::Body::new(point,vec3::Y,vec3::ZERO,integer::Time::ZERO); + //movement must escape the mesh forwards and backwards in time, + //otherwise the point is not inside the mesh + self.infinity_in(infinity_body) + .is_some_and(|_| + self.infinity_in(-infinity_body) + .is_some() + ) + } +} +impl MeshQuery for MinkowskiMesh<'_>{ + type Normal=Vector3>; + type Offset=Fixed<4,128>; + fn face_nd(&self,face_id:MinkowskiFace)->(Self::Normal,Self::Offset){ + match face_id{ + MinkowskiFace::VertFace(v0,f1)=>{ + let (n,d)=self.mesh1.face_nd(f1); + (-n,d-n.dot(self.mesh0.vert(v0))) + }, + MinkowskiFace::EdgeEdge(e0,e1,parity)=>{ + let edge0_n=self.mesh0.edge_n(e0); + let edge1_n=self.mesh1.edge_n(e1); + let &[e0v0,e0v1]=self.mesh0.edge_verts(e0).borrow(); + let &[e1v0,e1v1]=self.mesh1.edge_verts(e1).borrow(); + let n=edge0_n.cross(edge1_n); + let e0d=n.dot(self.mesh0.vert(e0v0)+self.mesh0.vert(e0v1)); + let e1d=n.dot(self.mesh1.vert(e1v0)+self.mesh1.vert(e1v1)); + ((n*(parity as i64*4-2)).fix_3(),((e0d-e1d)*(parity as i64*2-1)).fix_4()) + }, + MinkowskiFace::FaceVert(f0,v1)=>{ + let (n,d)=self.mesh0.face_nd(f0); + (n,d-n.dot(self.mesh1.vert(v1))) + }, + } + } + fn vert(&self,vert_id:MinkowskiVert)->Planar64Vec3{ + match vert_id{ + MinkowskiVert::VertVert(v0,v1)=>{ + self.mesh0.vert(v0)-self.mesh1.vert(v1) + }, + } + } + fn face_edges(&self,face_id:MinkowskiFace)->Cow>{ + match face_id{ + MinkowskiFace::VertFace(v0,f1)=>{ + Cow::Owned(self.mesh1.face_edges(f1).iter().map(|&edge_id1|{ + MinkowskiDirectedEdge::VertEdge(v0,edge_id1.reverse()) + }).collect()) + }, + MinkowskiFace::EdgeEdge(e0,e1,parity)=>{ + let e0v=self.mesh0.edge_verts(e0); + let e1v=self.mesh1.edge_verts(e1); + //could sort this if ordered edges are needed + //probably just need to reverse this list according to parity + Cow::Owned(vec![ + MinkowskiDirectedEdge::VertEdge(e0v[0],e1.as_directed(parity)), + MinkowskiDirectedEdge::EdgeVert(e0.as_directed(!parity),e1v[0]), + MinkowskiDirectedEdge::VertEdge(e0v[1],e1.as_directed(!parity)), + MinkowskiDirectedEdge::EdgeVert(e0.as_directed(parity),e1v[1]), + ]) + }, + MinkowskiFace::FaceVert(f0,v1)=>{ + Cow::Owned(self.mesh0.face_edges(f0).iter().map(|&edge_id0|{ + MinkowskiDirectedEdge::EdgeVert(edge_id0,v1) + }).collect()) + }, + } + } + fn edge_faces(&self,edge_id:MinkowskiEdge)->Cow<[MinkowskiFace;2]>{ + match edge_id{ + MinkowskiEdge::VertEdge(v0,e1)=>{ + //faces are listed backwards from the minkowski mesh + let v0e=self.mesh0.vert_edges(v0); + let &[e1f0,e1f1]=self.mesh1.edge_faces(e1).borrow(); + Cow::Owned([(e1f1,false),(e1f0,true)].map(|(edge_face_id1,face_parity)|{ + let mut best_edge=None; + let mut best_d:Ratio,Fixed<8,256>>=Ratio::new(Fixed::ZERO,Fixed::ONE); + let edge_face1_n=self.mesh1.face_nd(edge_face_id1).0; + let edge_face1_nn=edge_face1_n.dot(edge_face1_n); + for &directed_edge_id0 in v0e.iter(){ + let edge0_n=self.mesh0.directed_edge_n(directed_edge_id0); + //must be behind other face. + let d=edge_face1_n.dot(edge0_n); + if d.is_negative(){ + let edge0_nn=edge0_n.dot(edge0_n); + // Assume not every number is huge + // TODO: revisit this + let dd=(d*d)/(edge_face1_nn*edge0_nn); + if best_d{ + //tracking index with an external variable because .enumerate() is not available + let v1e=self.mesh1.vert_edges(v1); + let &[e0f0,e0f1]=self.mesh0.edge_faces(e0).borrow(); + Cow::Owned([(e0f0,true),(e0f1,false)].map(|(edge_face_id0,face_parity)|{ + let mut best_edge=None; + let mut best_d:Ratio,Fixed<8,256>>=Ratio::new(Fixed::ZERO,Fixed::ONE); + let edge_face0_n=self.mesh0.face_nd(edge_face_id0).0; + let edge_face0_nn=edge_face0_n.dot(edge_face0_n); + for &directed_edge_id1 in v1e.iter(){ + let edge1_n=self.mesh1.directed_edge_n(directed_edge_id1); + let d=edge_face0_n.dot(edge1_n); + if d.is_negative(){ + let edge1_nn=edge1_n.dot(edge1_n); + let dd=(d*d)/(edge_face0_nn*edge1_nn); + if best_dCow<[MinkowskiVert;2]>{ + match edge_id{ + MinkowskiEdge::VertEdge(v0,e1)=>{ + Cow::Owned(self.mesh1.edge_verts(e1).map(|vert_id1|{ + MinkowskiVert::VertVert(v0,vert_id1) + })) + }, + MinkowskiEdge::EdgeVert(e0,v1)=>{ + Cow::Owned(self.mesh0.edge_verts(e0).map(|vert_id0|{ + MinkowskiVert::VertVert(vert_id0,v1) + })) + }, + } + } + fn vert_edges(&self,vert_id:MinkowskiVert)->Cow>{ + match vert_id{ + MinkowskiVert::VertVert(v0,v1)=>{ + let mut edges=Vec::new(); + //detect shared volume when the other mesh is mirrored along a test edge dir + let v0f=self.mesh0.vert_faces(v0); + let v1f=self.mesh1.vert_faces(v1); + let v0f_n:Vec<_>=v0f.iter().map(|&face_id|self.mesh0.face_nd(face_id).0).collect(); + let v1f_n:Vec<_>=v1f.iter().map(|&face_id|self.mesh1.face_nd(face_id).0).collect(); + let the_len=v0f.len()+v1f.len(); + for &directed_edge_id in self.mesh0.vert_edges(v0).iter(){ + let n=self.mesh0.directed_edge_n(directed_edge_id); + let nn=n.dot(n); + // TODO: there's gotta be a better way to do this + //make a set of faces + let mut face_normals=Vec::with_capacity(the_len); + //add mesh0 faces as-is + face_normals.clone_from(&v0f_n); + for face_n in &v1f_n{ + //add reflected mesh1 faces + face_normals.push(*face_n-(n*face_n.dot(n)*2/nn).divide().fix_3()); + } + if is_empty_volume(face_normals){ + edges.push(MinkowskiDirectedEdge::EdgeVert(directed_edge_id,v1)); + } + } + for &directed_edge_id in self.mesh1.vert_edges(v1).iter(){ + let n=self.mesh1.directed_edge_n(directed_edge_id); + let nn=n.dot(n); + let mut face_normals=Vec::with_capacity(the_len); + face_normals.clone_from(&v1f_n); + for face_n in &v0f_n{ + face_normals.push(*face_n-(n*face_n.dot(n)*2/nn).divide().fix_3()); + } + if is_empty_volume(face_normals){ + edges.push(MinkowskiDirectedEdge::VertEdge(v0,directed_edge_id)); + } + } + Cow::Owned(edges) + }, + } + } + fn vert_faces(&self,_vert_id:MinkowskiVert)->Cow>{ + unimplemented!() + } +} + +fn is_empty_volume(normals:Vec>>)->bool{ + let len=normals.len(); + for i in 0..len-1{ + for j in i+1..len{ + let n=normals[i].cross(normals[j]); + let mut d_comp=None; + for k in 0..len{ + if k!=i&&k!=j{ + let d=n.dot(normals[k]).is_negative(); + if let Some(comp)=&d_comp{ + // This is testing if d_comp*d < 0 + if comp^d{ + return true; + } + }else{ + d_comp=Some(d); + } + } + } + } + } + return false; +} + +#[test] +fn test_is_empty_volume(){ + assert!(!is_empty_volume([vec3::X.fix_3(),vec3::Y.fix_3(),vec3::Z.fix_3()].to_vec())); + assert!(is_empty_volume([vec3::X.fix_3(),vec3::Y.fix_3(),vec3::Z.fix_3(),vec3::NEG_X.fix_3()].to_vec())); +} + +#[test] +fn build_me_a_cube(){ + let mesh=PhysicsMesh::unit_cube(); + //println!("mesh={:?}",mesh); +} diff --git a/strafe-client/src/physics.rs b/strafe-client/src/physics.rs new file mode 100644 index 0000000..956136f --- /dev/null +++ b/strafe-client/src/physics.rs @@ -0,0 +1,2184 @@ +use std::collections::{HashMap,HashSet}; +use crate::model_physics::{self,PhysicsMesh,PhysicsMeshTransform,TransformedMesh,MeshQuery,PhysicsMeshId,PhysicsSubmeshId}; +use strafesnet_common::bvh; +use strafesnet_common::map; +use strafesnet_common::run; +use strafesnet_common::aabb; +use strafesnet_common::model::{MeshId,ModelId}; +use strafesnet_common::mouse::MouseState; +use strafesnet_common::gameplay_attributes::{self,CollisionAttributesId}; +use strafesnet_common::gameplay_modes::{self,StageId}; +use strafesnet_common::gameplay_style::{self,StyleModifiers}; +use strafesnet_common::controls_bitflag::Controls; +use strafesnet_common::instruction::{self,InstructionEmitter,InstructionConsumer,TimedInstruction}; +use strafesnet_common::integer::{self,vec3,mat3,Time,Planar64,Planar64Vec3,Planar64Mat3,Angle32,Ratio64Vec2}; +use gameplay::ModeState; + +//external influence +//this is how you influence the physics from outside +use strafesnet_common::physics::Instruction as PhysicsInputInstruction; + +//internal influence +//when the physics asks itself what happens next, this is how it's represented +#[derive(Debug)] +enum PhysicsInternalInstruction{ + CollisionStart(Collision,model_physics::GigaTime), + CollisionEnd(Collision,model_physics::GigaTime), + StrafeTick, + ReachWalkTargetVelocity, + // Water, +} +#[derive(Debug)] +enum PhysicsInstruction{ + Internal(PhysicsInternalInstruction), + //InputInstructions conditionally activate RefreshWalkTarget + //(by doing what SetWalkTargetVelocity used to do and then flagging it) + Input(PhysicsInputInstruction), +} + +#[derive(Clone,Copy,Debug,Hash)] +pub struct Body{ + pub position:Planar64Vec3,//I64 where 2^32 = 1 u + pub velocity:Planar64Vec3,//I64 where 2^32 = 1 u/s + pub acceleration:Planar64Vec3,//I64 where 2^32 = 1 u/s/s + pub time:Time,//nanoseconds x xxxxD! +} +impl std::ops::Neg for Body{ + type Output=Self; + fn neg(self)->Self::Output{ + Self{ + position:self.position, + velocity:-self.velocity, + acceleration:self.acceleration, + time:-self.time, + } + } +} + +#[derive(Clone,Debug,Default)] +pub struct InputState{ + mouse:MouseState, + next_mouse:MouseState, + controls:strafesnet_common::controls_bitflag::Controls, +} +impl InputState{ + pub const fn get_next_mouse(&self)->&MouseState{ + &self.next_mouse + } + fn set_next_mouse(&mut self,next_mouse:MouseState){ + //I like your functions magic language + self.mouse=std::mem::replace(&mut self.next_mouse,next_mouse); + //equivalently: + //(self.next_mouse,self.mouse)=(next_mouse,self.next_mouse.clone()); + } + fn replace_mouse(&mut self,mouse:MouseState,next_mouse:MouseState){ + (self.next_mouse,self.mouse)=(next_mouse,mouse); + } + fn set_control(&mut self,control:Controls,state:bool){ + self.controls.set(control,state) + } + fn time_delta(&self)->Time{ + self.next_mouse.time-self.mouse.time + } + fn mouse_delta(&self)->glam::IVec2{ + self.next_mouse.pos-self.mouse.pos + } + fn lerp_delta(&self,time:Time)->glam::IVec2{ + //these are deltas + let dm=self.mouse_delta().as_i64vec2(); + let t=(time-self.mouse.time).nanos(); + let dt=self.time_delta().nanos(); + ((dm*t)/dt).as_ivec2() + } +} +#[derive(Clone,Debug)] +enum JumpDirection{ + Exactly(Planar64Vec3), + FromContactNormal, +} +impl JumpDirection{ + fn direction(&self,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,contact:&ContactCollision)->Planar64Vec3{ + match self{ + JumpDirection::FromContactNormal=>contact_normal(models,hitbox_mesh,contact), + &JumpDirection::Exactly(dir)=>dir, + } + } +} +#[derive(Clone,Debug)] +enum TransientAcceleration{ + Reached, + Reachable{ + acceleration:Planar64Vec3, + time:Time, + }, + //walk target will never be reached + Unreachable{ + acceleration:Planar64Vec3, + } +} +#[derive(Clone,Debug)] +struct ContactMoveState{ + jump_direction:JumpDirection, + contact:ContactCollision, + target:TransientAcceleration, +} +impl TransientAcceleration{ + fn with_target_diff(target_diff:Planar64Vec3,accel:Planar64,time:Time)->Self{ + if target_diff==vec3::ZERO{ + TransientAcceleration::Reached + }else{ + //normal friction acceleration is clippedAcceleration.dot(normal)*friction + TransientAcceleration::Reachable{ + acceleration:target_diff.with_length(accel).divide().fix_1(), + time:time+Time::from((target_diff.length()/accel).divide().fix_1()) + } + } + } + fn ground(walk_settings:&gameplay_style::WalkSettings,body:&Body,gravity:Planar64Vec3,target_velocity:Planar64Vec3)->Self{ + let target_diff=target_velocity-body.velocity; + //precalculate accel + let accel=walk_settings.accel(target_diff,gravity); + Self::with_target_diff(target_diff,accel,body.time) + } + fn ladder(ladder_settings:&gameplay_style::LadderSettings,body:&Body,gravity:Planar64Vec3,target_velocity:Planar64Vec3)->Self{ + let target_diff=target_velocity-body.velocity; + let accel=ladder_settings.accel(target_diff,gravity); + Self::with_target_diff(target_diff,accel,body.time) + } + fn acceleration(&self)->Planar64Vec3{ + match self{ + TransientAcceleration::Reached=>vec3::ZERO, + &TransientAcceleration::Reachable{acceleration,time:_}=>acceleration, + &TransientAcceleration::Unreachable{acceleration}=>acceleration, + } + } +} +impl ContactMoveState{ + fn ground(walk_settings:&gameplay_style::WalkSettings,body:&Body,gravity:Planar64Vec3,target_velocity:Planar64Vec3,contact:ContactCollision)->Self{ + Self{ + target:TransientAcceleration::ground(walk_settings,body,gravity,target_velocity), + contact, + jump_direction:JumpDirection::Exactly(vec3::Y), + } + } + fn ladder(ladder_settings:&gameplay_style::LadderSettings,body:&Body,gravity:Planar64Vec3,target_velocity:Planar64Vec3,contact:ContactCollision)->Self{ + Self{//,style,velocity,normal,style.ladder_speed,style.ladder_accel + target:TransientAcceleration::ladder(ladder_settings,body,gravity,target_velocity), + contact, + jump_direction:JumpDirection::FromContactNormal, + } + } +} +fn ground_things(walk_settings:&gameplay_style::WalkSettings,contact:&ContactCollision,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState)->(Planar64Vec3,Planar64Vec3){ + let normal=contact_normal(models,hitbox_mesh,contact); + let gravity=touching.base_acceleration(models,style,camera,input_state); + let control_dir=style.get_y_control_dir(camera,input_state.controls); + let mut target_velocity=walk_settings.get_walk_target_velocity(control_dir,normal); + touching.constrain_velocity(models,hitbox_mesh,&mut target_velocity); + (gravity,target_velocity) +} +fn ladder_things(ladder_settings:&gameplay_style::LadderSettings,contact:&ContactCollision,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState)->(Planar64Vec3,Planar64Vec3){ + let normal=contact_normal(models,hitbox_mesh,contact); + let gravity=touching.base_acceleration(models,style,camera,input_state); + let control_dir=style.get_y_control_dir(camera,input_state.controls); + let mut target_velocity=ladder_settings.get_ladder_target_velocity(control_dir,normal); + touching.constrain_velocity(models,hitbox_mesh,&mut target_velocity); + (gravity,target_velocity) +} + +#[derive(Default)] +struct PhysicsModels{ + meshes:HashMap, + contact_models:HashMap, + intersect_models:HashMap, + contact_attributes:HashMap, + intersect_attributes:HashMap, +} +impl PhysicsModels{ + fn clear(&mut self){ + self.meshes.clear(); + self.contact_models.clear(); + self.intersect_models.clear(); + self.contact_attributes.clear(); + self.intersect_attributes.clear(); + } + fn mesh(&self,convex_mesh_id:ConvexMeshId)->TransformedMesh{ + let (mesh_id,transform)=match convex_mesh_id.model_id{ + PhysicsModelId::Contact(model_id)=>{ + let model=&self.contact_models[&model_id]; + (&model.mesh_id,&model.transform) + }, + PhysicsModelId::Intersect(model_id)=>{ + let model=&self.intersect_models[&model_id]; + (&model.mesh_id,&model.transform) + }, + }; + TransformedMesh::new( + self.meshes[mesh_id].submesh_view(convex_mesh_id.submesh_id), + transform + ) + } + //it's a bit weird to have three functions, but it's always going to be one of these + fn contact_mesh(&self,contact:&ContactCollision)->TransformedMesh{ + let model=&self.contact_models[&contact.model_id]; + TransformedMesh::new( + self.meshes[&model.mesh_id].submesh_view(contact.submesh_id), + &model.transform + ) + } + fn intersect_mesh(&self,intersect:&IntersectCollision)->TransformedMesh{ + let model=&self.intersect_models[&intersect.model_id]; + TransformedMesh::new( + self.meshes[&model.mesh_id].submesh_view(intersect.submesh_id), + &model.transform + ) + } + fn get_model_transform(&self,model_id:ModelId)->Option<&PhysicsMeshTransform>{ + //ModelId can possibly be a decoration + self.contact_models.get(&ContactModelId::new(model_id.get())).map_or_else( + ||self.intersect_models.get(&IntersectModelId::new(model_id.get())) + .map(|model|&model.transform), + |model|Some(&model.transform) + ) + } + fn contact_model(&self,model_id:ContactModelId)->&ContactModel{ + &self.contact_models[&model_id] + } + fn intersect_model(&self,model_id:IntersectModelId)->&IntersectModel{ + &self.intersect_models[&model_id] + } + fn contact_attr(&self,model_id:ContactModelId)->&gameplay_attributes::ContactAttributes{ + &self.contact_attributes[&self.contact_models[&model_id].attr_id] + } + fn intersect_attr(&self,model_id:IntersectModelId)->&gameplay_attributes::IntersectAttributes{ + &self.intersect_attributes[&self.intersect_models[&model_id].attr_id] + } +} + +#[derive(Clone,Copy,Debug)] +pub struct PhysicsCamera{ + //punch: Planar64Vec3, + //punch_velocity: Planar64Vec3, + sensitivity:Ratio64Vec2,//dots to Angle32 ratios + clamped_mouse_pos:glam::IVec2,//angles are calculated from this cumulative value + //angle limits could be an enum + struct that defines whether it's limited and selects clamp or wrap depending + // enum AngleLimit{ + // Unlimited, + // Limited{lower:Angle32,upper:Angle32}, + // } + //pitch_limit:AngleLimit, + //yaw_limit:AngleLimit, +} + +impl PhysicsCamera{ + const ANGLE_PITCH_LOWER_LIMIT:Angle32=Angle32::NEG_FRAC_PI_2; + const ANGLE_PITCH_UPPER_LIMIT:Angle32=Angle32::FRAC_PI_2; + pub fn move_mouse(&mut self,mouse_delta:glam::IVec2){ + let mut unclamped_mouse_pos=self.clamped_mouse_pos+mouse_delta; + unclamped_mouse_pos.y=unclamped_mouse_pos.y.clamp( + self.sensitivity.y.rhs_div_int(Self::ANGLE_PITCH_LOWER_LIMIT.get() as i64) as i32, + self.sensitivity.y.rhs_div_int(Self::ANGLE_PITCH_UPPER_LIMIT.get() as i64) as i32, + ); + self.clamped_mouse_pos=unclamped_mouse_pos; + } + pub fn simulate_move_angles(&self,mouse_delta:glam::IVec2)->glam::Vec2 { + let a=-self.sensitivity.mul_int((self.clamped_mouse_pos+mouse_delta).as_i64vec2()); + let ax=Angle32::wrap_from_i64(a.x); + let ay=Angle32::clamp_from_i64(a.y) + //clamp to actual vertical cam limit + .clamp(Self::ANGLE_PITCH_LOWER_LIMIT,Self::ANGLE_PITCH_UPPER_LIMIT); + return glam::vec2(ax.into(),ay.into()); + } + #[inline] + fn get_rotation(&self,mouse_pos:glam::IVec2)->Planar64Mat3{ + let a=-self.sensitivity.mul_int(mouse_pos.as_i64vec2()); + let ax=Angle32::wrap_from_i64(a.x); + let ay=Angle32::clamp_from_i64(a.y) + //clamp to actual vertical cam limit + .clamp(Self::ANGLE_PITCH_LOWER_LIMIT,Self::ANGLE_PITCH_UPPER_LIMIT); + mat3::from_rotation_yx(ax,ay) + } + fn rotation(&self)->Planar64Mat3{ + self.get_rotation(self.clamped_mouse_pos) + } + fn simulate_move_rotation(&self,mouse_delta:glam::IVec2)->Planar64Mat3{ + self.get_rotation(self.clamped_mouse_pos+mouse_delta) + } + fn get_rotation_y(&self,mouse_pos_x:i32)->Planar64Mat3{ + let ax=-self.sensitivity.x.mul_int(mouse_pos_x as i64); + mat3::from_rotation_y(Angle32::wrap_from_i64(ax)) + } + fn rotation_y(&self)->Planar64Mat3{ + self.get_rotation_y(self.clamped_mouse_pos.x) + } + fn simulate_move_rotation_y(&self,mouse_delta_x:i32)->Planar64Mat3{ + self.get_rotation_y(self.clamped_mouse_pos.x+mouse_delta_x) + } +} + +impl std::default::Default for PhysicsCamera{ + fn default()->Self{ + Self{ + sensitivity:Ratio64Vec2::ONE*200_000, + clamped_mouse_pos:glam::IVec2::ZERO, + } + } +} +mod gameplay{ + use super::{gameplay_modes,HashSet,HashMap,ModelId}; + #[derive(Clone,Debug)] + pub struct ModeState{ + mode_id:gameplay_modes::ModeId, + stage_id:gameplay_modes::StageId, + next_ordered_checkpoint_id:gameplay_modes::CheckpointId,//which OrderedCheckpoint model_id you must pass next (if 0 you haven't passed OrderedCheckpoint0) + unordered_checkpoints:HashSet, + jump_counts:HashMap,//model_id -> jump count + } + impl ModeState{ + pub const fn get_mode_id(&self)->gameplay_modes::ModeId{ + self.mode_id + } + pub const fn get_stage_id(&self)->gameplay_modes::StageId{ + self.stage_id + } + pub const fn get_next_ordered_checkpoint_id(&self)->gameplay_modes::CheckpointId{ + self.next_ordered_checkpoint_id + } + pub fn get_jump_count(&self,model_id:ModelId)->Option{ + self.jump_counts.get(&model_id).copied() + } + pub const fn ordered_checkpoint_count(&self)->u32{ + self.next_ordered_checkpoint_id.get() + } + pub fn unordered_checkpoint_count(&self)->u32{ + self.unordered_checkpoints.len() as u32 + } + pub fn set_mode_id(&mut self,mode_id:gameplay_modes::ModeId){ + self.clear(); + self.mode_id=mode_id; + } + pub fn set_stage_id(&mut self,stage_id:gameplay_modes::StageId){ + self.clear_checkpoints(); + self.stage_id=stage_id; + } + pub fn accumulate_ordered_checkpoint(&mut self,stage:&gameplay_modes::Stage,model_id:ModelId){ + if stage.is_next_ordered_checkpoint(self.get_next_ordered_checkpoint_id(),model_id){ + self.next_ordered_checkpoint_id=gameplay_modes::CheckpointId::new(self.next_ordered_checkpoint_id.get()+1); + } + } + pub fn accumulate_unordered_checkpoint(&mut self,stage:&gameplay_modes::Stage,model_id:ModelId){ + if stage.is_unordered_checkpoint(model_id){ + self.unordered_checkpoints.insert(model_id); + } + } + pub fn clear(&mut self){ + self.clear_jump_counts(); + self.clear_checkpoints(); + } + pub fn clear_jump_counts(&mut self){ + self.jump_counts.clear(); + } + pub fn clear_checkpoints(&mut self){ + self.next_ordered_checkpoint_id=gameplay_modes::CheckpointId::FIRST; + self.unordered_checkpoints.clear(); + } + } + impl std::default::Default for ModeState{ + fn default()->Self{ + Self{ + mode_id:gameplay_modes::ModeId::MAIN, + stage_id:gameplay_modes::StageId::FIRST, + next_ordered_checkpoint_id:gameplay_modes::CheckpointId::FIRST, + unordered_checkpoints:HashSet::new(), + jump_counts:HashMap::new(), + } + } + } +} +#[derive(Clone,Debug)] +struct WorldState{} + +struct HitboxMesh{ + halfsize:Planar64Vec3, + mesh:PhysicsMesh, + transform:PhysicsMeshTransform, +} +impl HitboxMesh{ + fn new(mesh:PhysicsMesh,transform:integer::Planar64Affine3)->Self{ + //calculate extents + let mut aabb=aabb::Aabb::default(); + let transform=PhysicsMeshTransform::new(transform); + let transformed_mesh=TransformedMesh::new(mesh.complete_mesh_view(),&transform); + for vert in transformed_mesh.verts(){ + aabb.grow(vert.fix_1()); + } + Self{ + halfsize:aabb.size()>>1, + mesh, + transform, + } + } + #[inline] + const fn transformed_mesh(&self)->TransformedMesh{ + TransformedMesh::new(self.mesh.complete_mesh_view(),&self.transform) + } +} + +trait StyleHelper{ + fn get_control(&self,control:Controls,controls:Controls)->bool; + fn get_control_dir(&self,controls:Controls)->Planar64Vec3; + fn get_y_control_dir(&self,camera:&PhysicsCamera,controls:Controls)->Planar64Vec3; + fn get_propulsion_control_dir(&self,camera:&PhysicsCamera,controls:Controls)->Planar64Vec3; + fn calculate_mesh(&self)->HitboxMesh; +} +impl StyleHelper for StyleModifiers{ + fn get_control(&self,control:Controls,controls:Controls)->bool{ + controls.intersection(self.controls_mask).contains(control) + } + + fn get_control_dir(&self,controls:Controls)->Planar64Vec3{ + //don't get fancy just do it + let mut control_dir:Planar64Vec3=vec3::ZERO; + //Apply mask after held check so you can require non-allowed keys to be held for some reason + let controls=controls.intersection(self.controls_mask); + if controls.contains(Controls::MoveForward){ + control_dir+=Self::FORWARD_DIR; + } + if controls.contains(Controls::MoveBackward){ + control_dir-=Self::FORWARD_DIR; + } + if controls.contains(Controls::MoveLeft){ + control_dir-=Self::RIGHT_DIR; + } + if controls.contains(Controls::MoveRight){ + control_dir+=Self::RIGHT_DIR; + } + if controls.contains(Controls::MoveUp){ + control_dir+=Self::UP_DIR; + } + if controls.contains(Controls::MoveDown){ + control_dir-=Self::UP_DIR; + } + return control_dir + } + + fn get_y_control_dir(&self,camera:&PhysicsCamera,controls:Controls)->Planar64Vec3{ + (camera.rotation_y()*self.get_control_dir(controls)).fix_1() + } + + fn get_propulsion_control_dir(&self,camera:&PhysicsCamera,controls:Controls)->Planar64Vec3{ + //don't interpolate this! discrete mouse movement, constant acceleration + (camera.rotation()*self.get_control_dir(controls)).fix_1() + } + fn calculate_mesh(&self)->HitboxMesh{ + let mesh=match self.hitbox.mesh{ + gameplay_style::HitboxMesh::Box=>PhysicsMesh::unit_cube(), + gameplay_style::HitboxMesh::Cylinder=>PhysicsMesh::unit_cylinder(), + }; + let transform=integer::Planar64Affine3::new( + mat3::from_diagonal(self.hitbox.halfsize), + vec3::ZERO + ); + HitboxMesh::new(mesh,transform) + } +} +#[derive(Clone,Debug)] +enum MoveState{ + Air, + Walk(ContactMoveState), + Ladder(ContactMoveState), + Water, + Fly, +} +impl MoveState{ + //call this after state.move_state is changed + fn apply_enum(&self,body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + match self{ + MoveState::Fly=>body.acceleration=vec3::ZERO, + MoveState::Air=>{ + //calculate base acceleration + let a=touching.base_acceleration(models,style,camera,input_state); + //set_acceleration clips according to contacts + set_acceleration(body,touching,models,hitbox_mesh,a); + }, + _=>(), + } + } + //function to coerce &mut self into &self + fn apply_to_body(&self,body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + match self{ + MoveState::Air=>(), + MoveState::Water=>(), + MoveState::Fly=>{ + //set velocity according to current control state + let v=style.get_propulsion_control_dir(camera,input_state.controls)*80; + //set_velocity clips velocity according to current touching state + set_velocity(body,touching,models,hitbox_mesh,v); + }, + MoveState::Walk(walk_state) + |MoveState::Ladder(walk_state) + =>{ + //accelerate towards walk target or do nothing + let a=walk_state.target.acceleration(); + set_acceleration(body,touching,models,hitbox_mesh,a); + }, + } + } + /// changes the move state + fn apply_input(&mut self,body:&Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + match self{ + MoveState::Fly + |MoveState::Air + |MoveState::Water=>(), + MoveState::Walk(ContactMoveState{target,contact,jump_direction:_})=>{ + if let Some(walk_settings)=&style.walk{ + let (gravity,target_velocity)=ground_things(walk_settings,contact,touching,models,hitbox_mesh,style,camera,input_state); + *target=TransientAcceleration::ground(walk_settings,body,gravity,target_velocity); + }else{ + panic!("ContactMoveState exists in style which does not allow walking!"); + } + }, + MoveState::Ladder(ContactMoveState{target,contact,jump_direction:_})=>{ + if let Some(ladder_settings)=&style.ladder{ + let (gravity,target_velocity)=ladder_things(ladder_settings,contact,touching,models,hitbox_mesh,style,camera,input_state); + *target=TransientAcceleration::ladder(ladder_settings,body,gravity,target_velocity); + }else{ + panic!("ContactMoveState exists in style which does not allow walking!"); + } + }, + } + } + fn get_walk_state(&self)->Option<&ContactMoveState>{ + match self{ + MoveState::Walk(walk_state) + |MoveState::Ladder(walk_state) + =>Some(walk_state), + MoveState::Air + |MoveState::Water + |MoveState::Fly + =>None, + } + } + fn next_move_instruction(&self,strafe:&Option,time:Time)->Option>{ + //check if you have a valid walk state and create an instruction + match self{ + MoveState::Walk(walk_state)|MoveState::Ladder(walk_state)=>match &walk_state.target{ + &TransientAcceleration::Reachable{acceleration:_,time}=>Some(TimedInstruction{ + time, + instruction:PhysicsInternalInstruction::ReachWalkTargetVelocity + }), + TransientAcceleration::Unreachable{acceleration:_} + |TransientAcceleration::Reached + =>None, + } + MoveState::Air=>strafe.as_ref().map(|strafe|{ + TimedInstruction{ + time:strafe.next_tick(time), + //only poll the physics if there is a before and after mouse event + instruction:PhysicsInternalInstruction::StrafeTick + } + }), + MoveState::Water=>None,//TODO + MoveState::Fly=>None, + } + } + //lmao idk this is convenient + fn apply_enum_and_input_and_body(&mut self,body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + self.apply_enum(body,touching,models,hitbox_mesh,style,camera,input_state); + self.apply_input(body,touching,models,hitbox_mesh,style,camera,input_state); + self.apply_to_body(body,touching,models,hitbox_mesh,style,camera,input_state); + } + fn apply_enum_and_body(&mut self,body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + self.apply_enum(body,touching,models,hitbox_mesh,style,camera,input_state); + self.apply_to_body(body,touching,models,hitbox_mesh,style,camera,input_state); + } + fn apply_input_and_body(&mut self,body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + self.apply_input(body,touching,models,hitbox_mesh,style,camera,input_state); + self.apply_to_body(body,touching,models,hitbox_mesh,style,camera,input_state); + } + fn set_move_state(&mut self,move_state:MoveState,body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + *self=move_state; + //this function call reads the above state that was just set + self.apply_enum_and_body(body,touching,models,hitbox_mesh,style,camera,input_state); + } + fn cull_velocity(&mut self,velocity:Planar64Vec3,body:&mut Body,touching:&mut TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState){ + //TODO: be more precise about contacts + if set_velocity_cull(body,touching,models,hitbox_mesh,velocity){ + //TODO do better + match self.get_walk_state(){ + //did you stop touching the thing you were walking on? + Some(walk_state)=>if !touching.contacts.contains(&walk_state.contact){ + self.set_move_state(MoveState::Air,body,touching,models,hitbox_mesh,style,camera,input_state); + }, + None=>self.apply_enum_and_body(body,touching,models,hitbox_mesh,style,camera,input_state), + } + } + } +} + +#[derive(Clone,Hash,Eq,PartialEq)] +enum PhysicsCollisionAttributes{ + Contact(gameplay_attributes::ContactAttributes), + Intersect(gameplay_attributes::IntersectAttributes), +} +struct NonPhysicsError; +impl TryFrom<&gameplay_attributes::CollisionAttributes> for PhysicsCollisionAttributes{ + type Error=NonPhysicsError; + fn try_from(value:&gameplay_attributes::CollisionAttributes)->Result{ + match value{ + gameplay_attributes::CollisionAttributes::Decoration=>Err(NonPhysicsError), + gameplay_attributes::CollisionAttributes::Contact(attr)=>Ok(Self::Contact(attr.clone())), + gameplay_attributes::CollisionAttributes::Intersect(attr)=>Ok(Self::Intersect(attr.clone())), + } + } +} +#[derive(Clone,Copy,Hash,id::Id,Eq,PartialEq)] +struct ContactAttributesId(u32); +impl Into for ContactAttributesId{ + fn into(self)->CollisionAttributesId{ + CollisionAttributesId::new(self.0) + } +} +impl From for ContactAttributesId{ + fn from(value:CollisionAttributesId)->Self{ + Self::new(value.get()) + } +} +#[derive(Clone,Copy,Hash,id::Id,Eq,PartialEq)] +struct IntersectAttributesId(u32); +impl Into for IntersectAttributesId{ + fn into(self)->CollisionAttributesId{ + CollisionAttributesId::new(self.0) + } +} +impl From for IntersectAttributesId{ + fn from(value:CollisionAttributesId)->Self{ + Self::new(value.get()) + } +} +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +struct ContactModelId(u32); +impl Into for ContactModelId{ + fn into(self)->ModelId{ + ModelId::new(self.get()) + } +} +#[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)] +struct IntersectModelId(u32); +impl Into for IntersectModelId{ + fn into(self)->ModelId{ + ModelId::new(self.get()) + } +} +#[derive(Debug,Clone,Copy,Hash,Eq,PartialEq)] +enum PhysicsModelId{ + Contact(ContactModelId), + Intersect(IntersectModelId), +} +impl Into for PhysicsModelId{ + fn into(self)->ModelId{ + ModelId::new(match self{ + PhysicsModelId::Contact(model_id)=>model_id.get(), + PhysicsModelId::Intersect(model_id)=>model_id.get(), + }) + } +} +//unique physics meshes indexed by this +#[derive(Debug,Clone,Copy,Eq,Hash,PartialEq)] +struct ConvexMeshId{ + model_id:PhysicsModelId, + submesh_id:PhysicsSubmeshId, +} +struct ContactModel{ + mesh_id:PhysicsMeshId, + attr_id:ContactAttributesId, + transform:PhysicsMeshTransform, +} +struct IntersectModel{ + mesh_id:PhysicsMeshId, + attr_id:IntersectAttributesId, + transform:PhysicsMeshTransform, +} + +#[derive(Debug,Clone,Copy,Eq,Hash,PartialEq)] +struct ContactCollision{ + face_id:model_physics::MinkowskiFace, + model_id:ContactModelId, + submesh_id:PhysicsSubmeshId, +} +#[derive(Debug,Clone,Copy,Eq,Hash,PartialEq)] +struct IntersectCollision{ + model_id:IntersectModelId, + submesh_id:PhysicsSubmeshId, +} +#[derive(Debug,Clone,Eq,Hash,PartialEq)] +enum Collision{ + Contact(ContactCollision), + Intersect(IntersectCollision), +} +impl Collision{ + const fn new(convex_mesh_id:ConvexMeshId,face_id:model_physics::MinkowskiFace)->Self{ + match convex_mesh_id.model_id{ + PhysicsModelId::Contact(model_id)=>Collision::Contact(ContactCollision{model_id,submesh_id:convex_mesh_id.submesh_id,face_id}), + PhysicsModelId::Intersect(model_id)=>Collision::Intersect(IntersectCollision{model_id,submesh_id:convex_mesh_id.submesh_id}), + } + } +} +#[derive(Clone,Debug,Default)] +struct TouchingState{ + contacts:HashSet::, + intersects:HashSet::, +} +impl TouchingState{ + fn clear(&mut self){ + self.contacts.clear(); + self.intersects.clear(); + } + fn insert(&mut self,collision:Collision)->bool{ + match collision{ + Collision::Contact(collision)=>self.contacts.insert(collision), + Collision::Intersect(collision)=>self.intersects.insert(collision), + } + } + fn remove(&mut self,collision:&Collision)->bool{ + match collision{ + Collision::Contact(collision)=>self.contacts.remove(collision), + Collision::Intersect(collision)=>self.intersects.remove(collision), + } + } + fn base_acceleration(&self,models:&PhysicsModels,style:&StyleModifiers,camera:&PhysicsCamera,input_state:&InputState)->Planar64Vec3{ + let mut a=style.gravity; + if let Some(rocket_settings)=&style.rocket{ + a+=rocket_settings.acceleration(style.get_propulsion_control_dir(camera,input_state.controls)); + } + //add accelerators + for contact in &self.contacts{ + if let Some(accelerator)=&models.contact_attr(contact.model_id).general.accelerator{ + a+=accelerator.acceleration; + } + } + for intersect in &self.intersects{ + if let Some(accelerator)=&models.intersect_attr(intersect.model_id).general.accelerator{ + a+=accelerator.acceleration; + } + } + //TODO: add water + a + } + fn constrain_velocity(&self,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,velocity:&mut Planar64Vec3){ + //TODO: trey push solve + for contact in &self.contacts{ + let n=contact_normal(models,hitbox_mesh,contact); + let d=n.dot(*velocity); + if d.is_negative(){ + *velocity-=(n*d/n.length_squared()).divide().fix_1(); + } + } + } + fn constrain_acceleration(&self,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,acceleration:&mut Planar64Vec3){ + //TODO: trey push solve + for contact in &self.contacts{ + let n=contact_normal(models,hitbox_mesh,contact); + let d=n.dot(*acceleration); + if d.is_negative(){ + *acceleration-=(n*d/n.length_squared()).divide().fix_1(); + } + } + } + fn predict_collision_end(&self,collector:&mut instruction::InstructionCollector,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,body:&Body,time:Time){ + let relative_body=VirtualBody::relative(&Body::ZERO,body).body(time); + for contact in &self.contacts{ + //detect face slide off + let model_mesh=models.contact_mesh(contact); + let minkowski=model_physics::MinkowskiMesh::minkowski_sum(model_mesh,hitbox_mesh.transformed_mesh()); + collector.collect(minkowski.predict_collision_face_out(&relative_body,collector.time(),contact.face_id).map(|(_face,time)|{ + TimedInstruction{ + time:relative_body.time+time.into(), + instruction:PhysicsInternalInstruction::CollisionEnd( + Collision::Contact(*contact), + time + ), + } + })); + } + for intersect in &self.intersects{ + //detect model collision in reverse + let model_mesh=models.intersect_mesh(intersect); + let minkowski=model_physics::MinkowskiMesh::minkowski_sum(model_mesh,hitbox_mesh.transformed_mesh()); + collector.collect(minkowski.predict_collision_out(&relative_body,collector.time()).map(|(_face,time)|{ + TimedInstruction{ + time:relative_body.time+time.into(), + instruction:PhysicsInternalInstruction::CollisionEnd( + Collision::Intersect(*intersect), + time + ), + } + })); + } + } +} + +impl Body{ + pub const ZERO:Self=Self::new(vec3::ZERO,vec3::ZERO,vec3::ZERO,Time::ZERO); + pub const fn new(position:Planar64Vec3,velocity:Planar64Vec3,acceleration:Planar64Vec3,time:Time)->Self{ + Self{ + position, + velocity, + acceleration, + time, + } + } + pub fn extrapolated_position(&self,time:Time)->Planar64Vec3{ + let dt=time-self.time; + self.position + +(self.velocity*dt).map(|elem|elem.divide().fix_1()) + +self.acceleration.map(|elem|(dt*dt*elem/2).divide().fix_1()) + } + pub fn extrapolated_velocity(&self,time:Time)->Planar64Vec3{ + let dt=time-self.time; + self.velocity+(self.acceleration*dt).map(|elem|elem.divide().fix_1()) + } + pub fn advance_time(&mut self,time:Time){ + self.position=self.extrapolated_position(time); + self.velocity=self.extrapolated_velocity(time); + self.time=time; + } + pub fn extrapolated_position_ratio_dt(&self,dt:integer::Ratio)->Planar64Vec3 + where + // Why? + // All of this can be removed with const generics because the type can be specified as + // Ratio,Fixed> + // which is known to implement all the necessary traits + Num:Copy, + Den:Copy+core::ops::Mul, + D1:Copy, + Num:core::ops::Mul, + Planar64:core::ops::Mul, + N1:core::ops::Add, + Num:core::ops::Mul, + Den:core::ops::Mul, + D2:Copy, + Planar64:core::ops::Mul, + N4:integer::Divide, + T1:integer::Fix, + { + // a*dt^2/2 + v*dt + p + // (a*dt/2+v)*dt+p + (self.acceleration.map(|elem|dt*elem/2)+self.velocity).map(|elem|dt.mul_ratio(elem)) + .map(|elem|elem.divide().fix())+self.position + } + pub fn extrapolated_velocity_ratio_dt(&self,dt:integer::Ratio)->Planar64Vec3 + where + Num:Copy, + Den:Copy, + Num:core::ops::Mul, + Planar64:core::ops::Mul, + N1:integer::Divide, + T1:integer::Fix, + { + // a*dt + v + self.acceleration.map(|elem|(dt*elem).divide().fix())+self.velocity + } + pub fn advance_time_ratio_dt(&mut self,dt:model_physics::GigaTime){ + self.position=self.extrapolated_position_ratio_dt(dt); + self.velocity=self.extrapolated_velocity_ratio_dt(dt); + self.time+=dt.into(); + } + pub fn infinity_dir(&self)->Option{ + if self.velocity==vec3::ZERO{ + if self.acceleration==vec3::ZERO{ + None + }else{ + Some(self.acceleration) + } + }else{ + Some(self.velocity) + } + } + pub fn grow_aabb(&self,aabb:&mut aabb::Aabb,t0:Time,t1:Time){ + aabb.grow(self.extrapolated_position(t0)); + aabb.grow(self.extrapolated_position(t1)); + //v+a*t==0 + //goober code + if !self.acceleration.x.is_zero(){ + let t=-self.velocity.x/self.acceleration.x; + if t0.to_ratio().lt_ratio(t)&&t.lt_ratio(t1.to_ratio()){ + aabb.grow(self.extrapolated_position_ratio_dt(t)); + } + } + if !self.acceleration.y.is_zero(){ + let t=-self.velocity.y/self.acceleration.y; + if t0.to_ratio().lt_ratio(t)&&t.lt_ratio(t1.to_ratio()){ + aabb.grow(self.extrapolated_position_ratio_dt(t)); + } + } + if !self.acceleration.z.is_zero(){ + let t=-self.velocity.z/self.acceleration.z; + if t0.to_ratio().lt_ratio(t)&&t.lt_ratio(t1.to_ratio()){ + aabb.grow(self.extrapolated_position_ratio_dt(t)); + } + } + } + +} +impl std::fmt::Display for Body{ + fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{ + write!(f,"p({}) v({}) a({}) t({})",self.position,self.velocity,self.acceleration,self.time) + } +} + +struct VirtualBody<'a>{ + body0:&'a Body, + body1:&'a Body, +} +impl VirtualBody<'_>{ + const fn relative<'a>(body0:&'a Body,body1:&'a Body)->VirtualBody<'a>{ + //(p0,v0,a0,t0) + //(p1,v1,a1,t1) + VirtualBody{ + body0, + body1, + } + } + fn extrapolated_position(&self,time:Time)->Planar64Vec3{ + self.body1.extrapolated_position(time)-self.body0.extrapolated_position(time) + } + fn extrapolated_velocity(&self,time:Time)->Planar64Vec3{ + self.body1.extrapolated_velocity(time)-self.body0.extrapolated_velocity(time) + } + fn acceleration(&self)->Planar64Vec3{ + self.body1.acceleration-self.body0.acceleration + } + fn body(&self,time:Time)->Body{ + Body::new(self.extrapolated_position(time),self.extrapolated_velocity(time),self.acceleration(),time) + } +} + +#[derive(Clone,Debug)] +pub struct PhysicsState{ + time:Time, + body:Body, + _world:WorldState,//currently there is only one state the world can be in + touching:TouchingState, + //camera must exist in state because wormholes modify the camera, also camera punch + camera:PhysicsCamera, + //input_state + input_state:InputState, + //style + style:StyleModifiers,//mode style with custom style updates applied + //gameplay_state + mode_state:ModeState, + move_state:MoveState, + //run is non optional: when you spawn in a run is created + //the run cannot be finished unless you start it by visiting + //a start zone. If you change mode, a new run is created. + run:run::Run, +} +//random collection of contextual data that doesn't belong in PhysicsState +pub struct PhysicsData{ + //permanent map data + bvh:bvh::BvhNode, + //transient map/environment data (open world loads/unloads parts of this data) + models:PhysicsModels, + //semi-transient data + modes:gameplay_modes::Modes, + //cached calculations + hitbox_mesh:HitboxMesh, +} +impl Default for PhysicsState{ + fn default()->Self{ + Self{ + body:Body::new(vec3::int(0,50,0),vec3::int(0,0,0),vec3::int(0,-100,0),Time::ZERO), + time:Time::ZERO, + style:StyleModifiers::default(), + touching:TouchingState::default(), + move_state:MoveState::Air, + camera:PhysicsCamera::default(), + input_state:InputState::default(), + _world:WorldState{}, + mode_state:ModeState::default(), + run:run::Run::new(), + } + } +} +impl Default for PhysicsData{ + fn default()->Self{ + Self{ + bvh:bvh::BvhNode::default(), + models:Default::default(), + modes:Default::default(), + hitbox_mesh:StyleModifiers::default().calculate_mesh(), + } + } +} + +impl PhysicsState{ + fn clear(&mut self){ + self.touching.clear(); + } + fn reset_to_default(&mut self){ + let mut new_state=Self::default(); + new_state.camera.sensitivity=self.camera.sensitivity; + *self=new_state; + } + fn next_move_instruction(&self)->Option>{ + self.move_state.next_move_instruction(&self.style.strafe,self.time) + } + fn cull_velocity(&mut self,data:&PhysicsData,velocity:Planar64Vec3){ + self.move_state.cull_velocity(velocity,&mut self.body,&mut self.touching,&data.models,&data.hitbox_mesh,&self.style,&self.camera,&self.input_state); + } + fn set_move_state(&mut self,data:&PhysicsData,move_state:MoveState){ + self.move_state.set_move_state(move_state,&mut self.body,&self.touching,&data.models,&data.hitbox_mesh,&self.style,&self.camera,&self.input_state); + } + fn apply_input_and_body(&mut self,data:&PhysicsData){ + self.move_state.apply_input_and_body(&mut self.body,&self.touching,&data.models,&data.hitbox_mesh,&self.style,&self.camera,&self.input_state); + } + //state mutated on collision: + //Accelerator + //stair step-up + + //state mutated on instruction + //change fly acceleration (fly_sustain) + //change fly velocity + + //generic event emmiters + //PlatformStandTime + //walk/swim/air/ladder sounds + //VState? + + //falling under the map + // fn next_respawn_instruction(&self) -> Option> { + // if self.body.position Option> { + // return Some(TimedInstruction{ + // time:(self.time*self.strafe_tick_num/self.strafe_tick_den+1)*self.strafe_tick_den/self.strafe_tick_num, + // //only poll the physics if there is a before and after mouse event + // instruction:PhysicsInstruction::Water + // }); + // } +} + +#[derive(Default)] +pub struct PhysicsContext{ + state:PhysicsState,//this captures the entire state of the physics. + data:PhysicsData,//data currently loaded into memory which is needded for physics to run, but is not part of the state. +} +//the physics consumes the generic PhysicsInstruction, but can only emit the more narrow PhysicsInternalInstruction +impl instruction::InstructionConsumer for PhysicsContext{ + fn process_instruction(&mut self,ins:TimedInstruction){ + atomic_state_update(&mut self.state,&self.data,ins) + } +} +impl instruction::InstructionEmitter for PhysicsContext{ + //this little next instruction function can cache its return value and invalidate the cached value by watching the State. + fn next_instruction(&self,time_limit:Time)->Option>{ + next_instruction_internal(&self.state,&self.data,time_limit) + } +} +impl PhysicsContext{ + pub fn camera_body(&self)->Body{ + Body{ + position:self.state.body.position+self.state.style.camera_offset, + ..self.state.body + } + } + pub const fn camera(&self)->PhysicsCamera{ + self.state.camera + } + pub const fn get_next_mouse(&self)->&MouseState{ + self.state.input_state.get_next_mouse() + } + /// use with caution, this is the only non-instruction way to mess with physics + pub fn generate_models(&mut self,map:&map::CompleteMap){ + self.state.clear(); + let mut modes=map.modes.clone(); + for mode in &mut modes.modes{ + mode.denormalize_data(); + } + let mut used_contact_attributes=Vec::new(); + let mut used_intersect_attributes=Vec::new(); + + //temporary type for type safety lol + #[derive(Clone,Copy,Hash,Eq,PartialEq)] + enum PhysicsAttributesId{ + Contact(ContactAttributesId), + Intersect(IntersectAttributesId), + } + + let mut contact_models=HashMap::new(); + let mut intersect_models=HashMap::new(); + + let mut physics_attr_id_from_model_attr_id=HashMap::::new(); + let mut used_meshes=Vec::new(); + let mut physics_mesh_id_from_model_mesh_id=HashMap::::new(); + for (model_id,model) in map.models.iter().enumerate(){ + //TODO: use .entry().or_insert_with(||{ + let attr_id=if let Some(&attr_id)=physics_attr_id_from_model_attr_id.get(&model.attributes){ + attr_id + }else{ + //check if it's real + match map.attributes.get(model.attributes.get() as usize).and_then(|m_attr|{ + PhysicsCollisionAttributes::try_from(m_attr).map_or(None,|p_attr|{ + let attr_id=match p_attr{ + PhysicsCollisionAttributes::Contact(attr)=>{ + let attr_id=ContactAttributesId::new(used_contact_attributes.len() as u32); + used_contact_attributes.push(attr); + PhysicsAttributesId::Contact(attr_id) + }, + PhysicsCollisionAttributes::Intersect(attr)=>{ + let attr_id=IntersectAttributesId::new(used_intersect_attributes.len() as u32); + used_intersect_attributes.push(attr); + PhysicsAttributesId::Intersect(attr_id) + }, + }; + physics_attr_id_from_model_attr_id.insert(model.attributes,attr_id); + Some(attr_id) + }) + }){ + Some(attr_id)=>attr_id, + None=>continue, + } + }; + let mesh_id=if let Some(&mesh_id)=physics_mesh_id_from_model_mesh_id.get(&model.mesh){ + mesh_id + }else{ + match map.meshes.get(model.mesh.get() as usize).and_then(|mesh|{ + match PhysicsMesh::try_from(mesh){ + Ok(physics_mesh)=>{ + let mesh_id=PhysicsMeshId::new(used_meshes.len() as u32); + used_meshes.push(physics_mesh); + physics_mesh_id_from_model_mesh_id.insert(model.mesh,mesh_id); + Some(mesh_id) + }, + Err(e)=>{ + println!("Failed to build PhysicsMesh: {e}"); + None + } + } + }){ + Some(mesh_id)=>mesh_id, + None=>continue, + } + }; + let transform=PhysicsMeshTransform::new(model.transform); + match attr_id{ + PhysicsAttributesId::Contact(attr_id)=>{ + contact_models.insert(ContactModelId::new(model_id as u32),ContactModel{ + mesh_id, + attr_id, + transform, + }); + }, + PhysicsAttributesId::Intersect(attr_id)=>{ + intersect_models.insert(IntersectModelId::new(model_id as u32),IntersectModel{ + mesh_id, + attr_id, + transform, + }); + }, + } + } + let meshes:HashMap=used_meshes.into_iter() + .enumerate() + .map(|(mesh_id,mesh)| + (PhysicsMeshId::new(mesh_id as u32),mesh) + ).collect(); + let convex_mesh_aabb_list= + //map the two lists into a single type so they can be processed with one closure + contact_models.iter().map(|(&model_id,model)| + (PhysicsModelId::Contact(model_id),&model.mesh_id,&model.transform) + ).chain(intersect_models.iter().map(|(&model_id,model)| + (PhysicsModelId::Intersect(model_id),&model.mesh_id,&model.transform) + )) + .flat_map(|(model_id,mesh_id,transform)|{ + meshes[mesh_id].submesh_views() + .enumerate().map(move|(submesh_id,view)|{ + let mut aabb=aabb::Aabb::default(); + let transformed_mesh=TransformedMesh::new(view,transform); + for v in transformed_mesh.verts(){ + aabb.grow(v.fix_1()); + } + (ConvexMeshId{ + model_id, + submesh_id:PhysicsSubmeshId::new(submesh_id as u32), + },aabb) + }) + }).collect(); + let bvh=bvh::generate_bvh(convex_mesh_aabb_list); + let model_count=contact_models.len()+intersect_models.len(); + let models=PhysicsModels{ + meshes, + contact_models, + intersect_models, + contact_attributes:used_contact_attributes.into_iter() + .enumerate() + .map(|(attr_id,attr)| + (ContactAttributesId::new(attr_id as u32),attr) + ).collect(), + intersect_attributes:used_intersect_attributes.into_iter() + .enumerate() + .map(|(attr_id,attr)| + (IntersectAttributesId::new(attr_id as u32),attr) + ).collect(), + }; + self.data.bvh=bvh; + self.data.models=models; + self.data.modes=modes; + //hitbox_mesh is unchanged + println!("Physics Objects: {}",model_count); + } + + //tickless gaming + fn run_internal_exhaustive(&mut self,time_limit:Time){ + //prepare is ommitted - everything is done via instructions. + while let Some(instruction)=self.next_instruction(time_limit){//collect + //process + self.process_instruction(TimedInstruction{ + time:instruction.time, + instruction:PhysicsInstruction::Internal(instruction.instruction), + }); + //write hash lol + } + } + pub fn run_input_instruction(&mut self,instruction:TimedInstruction){ + self.run_internal_exhaustive(instruction.time); + self.process_instruction(TimedInstruction{ + time:instruction.time, + instruction:PhysicsInstruction::Input(instruction.instruction), + }); + } +} + + //this is the one who asks + fn next_instruction_internal(state:&PhysicsState,data:&PhysicsData,time_limit:Time)->Option>{ + //JUST POLLING!!! NO MUTATION + let mut collector = instruction::InstructionCollector::new(time_limit); + + collector.collect(state.next_move_instruction()); + + //check for collision ends + state.touching.predict_collision_end(&mut collector,&data.models,&data.hitbox_mesh,&state.body,state.time); + //check for collision starts + let mut aabb=aabb::Aabb::default(); + state.body.grow_aabb(&mut aabb,state.time,collector.time()); + aabb.inflate(data.hitbox_mesh.halfsize); + //relative to moving platforms + //let relative_body=&VirtualBody::relative(&Body::default(),&state.body).body(state.time); + let relative_body=&state.body; + data.bvh.the_tester(&aabb,&mut |&convex_mesh_id|{ + //no checks are needed because of the time limits. + let model_mesh=data.models.mesh(convex_mesh_id); + let minkowski=model_physics::MinkowskiMesh::minkowski_sum(model_mesh,data.hitbox_mesh.transformed_mesh()); + collector.collect(minkowski.predict_collision_in(relative_body,collector.time()) + //temp (?) code to avoid collision loops + .map_or(None,|(face,dt)|{ + let time=relative_body.time+dt.into(); + if time<=state.time{None}else{Some((time,face,dt))}}) + .map(|(time,face,dt)| + TimedInstruction{ + time, + instruction:PhysicsInternalInstruction::CollisionStart( + Collision::new(convex_mesh_id,face), + dt + ) + } + ) + ); + }); + collector.instruction() + } + + +fn contact_normal(models:&PhysicsModels,hitbox_mesh:&HitboxMesh,contact:&ContactCollision)->Planar64Vec3{ + let model_mesh=models.contact_mesh(contact); + let minkowski=model_physics::MinkowskiMesh::minkowski_sum(model_mesh,hitbox_mesh.transformed_mesh()); + // TODO: normalize to i64::MAX>>1 + minkowski.face_nd(contact.face_id).0.fix_1() +} + +fn recalculate_touching( + move_state:&mut MoveState, + body:&mut Body, + touching:&mut TouchingState, + run:&mut run::Run, + mode_state:&mut ModeState, + mode:Option<&gameplay_modes::Mode>, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + bvh:&bvh::BvhNode, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + time:Time, +){ + //collision_end all existing contacts + //I would have preferred while let Some(contact)=contacts.pop() + //but there is no such method + while let Some(&contact)=touching.contacts.iter().next(){ + collision_end_contact(move_state,body,touching,models,hitbox_mesh,style,camera,input_state,models.contact_attr(contact.model_id),contact) + } + while let Some(&intersect)=touching.intersects.iter().next(){ + collision_end_intersect(touching,mode,run,models.intersect_attr(intersect.model_id),intersect,time); + } + //find all models in the teleport region + let mut aabb=aabb::Aabb::default(); + aabb.grow(body.position); + aabb.inflate(hitbox_mesh.halfsize); + //relative to moving platforms + //let relative_body=&VirtualBody::relative(&Body::default(),&state.body).body(state.time); + bvh.the_tester(&aabb,&mut |&convex_mesh_id|{ + //no checks are needed because of the time limits. + let model_mesh=models.mesh(convex_mesh_id); + let minkowski=model_physics::MinkowskiMesh::minkowski_sum(model_mesh,hitbox_mesh.transformed_mesh()); + if minkowski.is_point_in_mesh(body.position){ + match convex_mesh_id.model_id{ + //being inside of contact objects is an invalid physics state + //but the physics isn't advanced enough to do anything about it yet + //TODO: PushSolve and search for the closest valid position + PhysicsModelId::Contact(_)=>(), + PhysicsModelId::Intersect(model_id)=> + collision_start_intersect(move_state,body,mode_state,touching,mode,run,models,hitbox_mesh,bvh,style,camera,input_state, + models.intersect_attr(model_id), + IntersectCollision{ + model_id, + submesh_id:convex_mesh_id.submesh_id, + }, + time, + ), + } + } + }); +} +fn set_position( + point:Planar64Vec3, + move_state:&mut MoveState, + body:&mut Body, + touching:&mut TouchingState, + run:&mut run::Run, + mode_state:&mut ModeState, + mode:Option<&gameplay_modes::Mode>, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + bvh:&bvh::BvhNode, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + time:Time, +)->Planar64Vec3{ + //test intersections at new position + //hovering above the surface 0 units is not intersecting. you will fall into it just fine + body.position=point; + //calculate contacts and determine the actual state + recalculate_touching(move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time); + point +} +fn set_velocity_cull(body:&mut Body,touching:&mut TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,v:Planar64Vec3)->bool{ + //This is not correct but is better than what I have + let mut culled=false; + touching.contacts.retain(|contact|{ + let n=contact_normal(models,hitbox_mesh,contact); + let r=n.dot(v).is_positive(); + if r{ + culled=true; + println!("set_velocity_cull contact={:?}",contact); + } + !r + }); + set_velocity(body,touching,models,hitbox_mesh,v); + culled +} +fn set_velocity(body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,mut v:Planar64Vec3){ + touching.constrain_velocity(models,hitbox_mesh,&mut v); + body.velocity=v; +} +fn set_acceleration_cull(body:&mut Body,touching:&mut TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,a:Planar64Vec3)->bool{ + //This is not correct but is better than what I have + let mut culled=false; + touching.contacts.retain(|contact|{ + let n=contact_normal(models,hitbox_mesh,contact); + let r=n.dot(a).is_positive(); + if r{ + culled=true; + println!("set_acceleration_cull contact={:?}",contact); + } + !r + }); + set_acceleration(body,touching,models,hitbox_mesh,a); + culled +} +fn set_acceleration(body:&mut Body,touching:&TouchingState,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,mut a:Planar64Vec3){ + touching.constrain_acceleration(models,hitbox_mesh,&mut a); + body.acceleration=a; +} + +fn teleport( + point:Planar64Vec3, + move_state:&mut MoveState, + body:&mut Body, + touching:&mut TouchingState, + run:&mut run::Run, + mode_state:&mut ModeState, + mode:Option<&gameplay_modes::Mode>, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + bvh:&bvh::BvhNode, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + time:Time, +){ + set_position(point,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time); + set_acceleration(body,touching,models,hitbox_mesh,style.gravity); +} +enum TeleportToSpawnError{ + NoModel, +} +fn teleport_to_spawn( + stage:&gameplay_modes::Stage, + move_state:&mut MoveState, + body:&mut Body, + touching:&mut TouchingState, + run:&mut run::Run, + mode_state:&mut ModeState, + mode:&gameplay_modes::Mode, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + bvh:&bvh::BvhNode, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + time:Time, +)->Result<(),TeleportToSpawnError>{ + const EPSILON:Planar64=Planar64::raw((1<<32)/16); + let transform=models.get_model_transform(stage.spawn()).ok_or(TeleportToSpawnError::NoModel)?; + //TODO: transform.vertex.matrix3.col(1)+transform.vertex.translation + let point=transform.vertex.transform_point3(vec3::Y).fix_1()+Planar64Vec3::new([Planar64::ZERO,style.hitbox.halfsize.y+EPSILON,Planar64::ZERO]); + teleport(point,move_state,body,touching,run,mode_state,Some(mode),models,hitbox_mesh,bvh,style,camera,input_state,time); + Ok(()) +} + +fn run_teleport_behaviour( + model_id:ModelId, + wormhole:Option<&gameplay_attributes::Wormhole>, + mode:Option<&gameplay_modes::Mode>, + move_state:&mut MoveState, + body:&mut Body, + touching:&mut TouchingState, + run:&mut run::Run, + mode_state:&mut ModeState, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + bvh:&bvh::BvhNode, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + time:Time, +){ + //TODO: jump count and checkpoints are always reset on teleport. + //Map makers are expected to use tools to prevent + //multi-boosting on JumpLimit boosters such as spawning into a SetVelocity + if let Some(mode)=mode{ + if let Some(stage_element)=mode.get_element(model_id){ + if let Some(stage)=mode.get_stage(stage_element.stage_id()){ + if mode_state.get_stage_id()if !stage.is_empty(){ + mode_state.set_stage_id(stage_id); + let _=teleport_to_spawn(stage,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time); + return; + }, + None=>{ + //no such stage! set to last existing stage and break loop + mode_state.set_stage_id(StageId::new(stage_id.get()-1)); + loop_unbroken=false; + break; + }, + } + }; + //notably you do not get teleported for touching ordered checkpoints in the wrong order within the same stage. + if loop_unbroken{ + mode_state.set_stage_id(stage_element.stage_id()); + } + }else if stage_element.force(){ + //forced stage_element will set the stage_id even if the stage has already been passed + mode_state.set_stage_id(stage_element.stage_id()); + } + match stage_element.behaviour(){ + gameplay_modes::StageElementBehaviour::SpawnAt=>(), + gameplay_modes::StageElementBehaviour::Trigger + |gameplay_modes::StageElementBehaviour::Teleport=>if let Some(mode_state_stage)=mode.get_stage(mode_state.get_stage_id()){ + //I guess this is correct behaviour when trying to teleport to a non-existent spawn but it's still weird + let _=teleport_to_spawn(mode_state_stage,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time); + return; + }, + gameplay_modes::StageElementBehaviour::Platform=>(), + gameplay_modes::StageElementBehaviour::Check=>(),//this is to run the checkpoint check behaviour without any other side effects + gameplay_modes::StageElementBehaviour::Checkpoint=>{ + //each of these checks if the model is actually a valid respective checkpoint object + //accumulate sequential ordered checkpoints + mode_state.accumulate_ordered_checkpoint(&stage,model_id); + //insert model id in accumulated unordered checkpoints + mode_state.accumulate_unordered_checkpoint(&stage,model_id); + }, + } + } + } + } + if let Some(&gameplay_attributes::Wormhole{destination_model})=wormhole{ + if let (Some(origin),Some(destination))=(models.get_model_transform(model_id),models.get_model_transform(destination_model)){ + let point=body.position-origin.vertex.translation+destination.vertex.translation; + //TODO: camera angles + teleport(point,move_state,body,touching,run,mode_state,mode,models,hitbox_mesh,bvh,style,camera,input_state,time); + } + } +} + +fn collision_start_contact( + move_state:&mut MoveState, + body:&mut Body, + mode_state:&mut ModeState, + touching:&mut TouchingState, + run:&mut run::Run, + mode:Option<&gameplay_modes::Mode>, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + bvh:&bvh::BvhNode, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + attr:&gameplay_attributes::ContactAttributes, + contact:ContactCollision, + time:Time, +){ + let incident_velocity=body.velocity; + //add to touching + touching.insert(Collision::Contact(contact)); + //clip v + set_velocity(body,touching,models,hitbox_mesh,incident_velocity); + match &attr.contacting.contact_behaviour{ + Some(gameplay_attributes::ContactingBehaviour::Surf)=>println!("I'm surfing!"), + Some(gameplay_attributes::ContactingBehaviour::Cling)=>println!("Unimplemented!"), + &Some(gameplay_attributes::ContactingBehaviour::Elastic(elasticity))=>{ + let reflected_velocity=body.velocity+((body.velocity-incident_velocity)*Planar64::raw(elasticity as i64+1)).fix_1(); + set_velocity(body,touching,models,hitbox_mesh,reflected_velocity); + }, + Some(gameplay_attributes::ContactingBehaviour::Ladder(contacting_ladder))=> + if let Some(ladder_settings)=&style.ladder{ + if contacting_ladder.sticky{ + //kill v + //actually you could do this with a booster attribute :thinking: + //it's a little bit different because maybe you want to chain ladders together + set_velocity(body,touching,models,hitbox_mesh,vec3::ZERO);//model.velocity + } + //ladder walkstate + let (gravity,target_velocity)=ladder_things(ladder_settings,&contact,touching,models,hitbox_mesh,style,camera,input_state); + let walk_state=ContactMoveState::ladder(ladder_settings,body,gravity,target_velocity,contact); + move_state.set_move_state(MoveState::Ladder(walk_state),body,touching,models,hitbox_mesh,style,camera,input_state); + }, + Some(gameplay_attributes::ContactingBehaviour::NoJump)=>todo!("nyi"), + None=>if let Some(walk_settings)=&style.walk{ + if walk_settings.is_slope_walkable(contact_normal(models,hitbox_mesh,&contact),vec3::Y){ + //ground + let (gravity,target_velocity)=ground_things(walk_settings,&contact,touching,models,hitbox_mesh,style,camera,input_state); + let walk_state=ContactMoveState::ground(walk_settings,body,gravity,target_velocity,contact); + move_state.set_move_state(MoveState::Walk(walk_state),body,touching,models,hitbox_mesh,style,camera,input_state); + } + }, + } + //I love making functions with 10 arguments to dodge the borrow checker + run_teleport_behaviour(contact.model_id.into(),attr.general.wormhole.as_ref(),mode,move_state,body,touching,run,mode_state,models,hitbox_mesh,bvh,style,camera,input_state,time); + if style.get_control(Controls::Jump,input_state.controls){ + if let (Some(jump_settings),Some(walk_state))=(&style.jump,move_state.get_walk_state()){ + let jump_dir=walk_state.jump_direction.direction(models,hitbox_mesh,&walk_state.contact); + let jumped_velocity=jump_settings.jumped_velocity(style,jump_dir,body.velocity,attr.general.booster.as_ref()); + move_state.cull_velocity(jumped_velocity,body,touching,models,hitbox_mesh,style,camera,input_state); + } + } + match &attr.general.trajectory{ + Some(trajectory)=>{ + match trajectory{ + gameplay_attributes::SetTrajectory::AirTime(_)=>todo!(), + gameplay_attributes::SetTrajectory::Height(_)=>todo!(), + gameplay_attributes::SetTrajectory::TargetPointTime { target_point: _, time: _ }=>todo!(), + gameplay_attributes::SetTrajectory::TargetPointSpeed { target_point: _, speed: _, trajectory_choice: _ }=>todo!(), + &gameplay_attributes::SetTrajectory::Velocity(velocity)=>{ + move_state.cull_velocity(velocity,body,touching,models,hitbox_mesh,style,camera,input_state); + }, + gameplay_attributes::SetTrajectory::DotVelocity { direction: _, dot: _ }=>todo!(), + } + }, + None=>(), + } + //doing enum to set the acceleration when surfing + //doing input_and_body to refresh the walk state if you hit a wall while accelerating + move_state.apply_enum_and_input_and_body(body,touching,models,hitbox_mesh,style,camera,input_state); +} + +fn collision_start_intersect( + move_state:&mut MoveState, + body:&mut Body, + mode_state:&mut ModeState, + touching:&mut TouchingState, + mode:Option<&gameplay_modes::Mode>, + run:&mut run::Run, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + bvh:&bvh::BvhNode, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + attr:&gameplay_attributes::IntersectAttributes, + intersect:IntersectCollision, + time:Time, +){ + //I think that setting the velocity to 0 was preventing surface contacts from entering an infinite loop + touching.insert(Collision::Intersect(intersect)); + //insta booster! + if let Some(booster)=&attr.general.booster{ + move_state.cull_velocity(booster.boost(body.velocity),body,touching,models,hitbox_mesh,style,camera,input_state); + } + if let Some(mode)=mode{ + let zone=mode.get_zone(intersect.model_id.into()); + match zone{ + Some(gameplay_modes::Zone::Start)=>{ + println!("@@@@ Starting new run!"); + *run=run::Run::new(); + }, + Some(gameplay_modes::Zone::Finish)=>{ + match run.finish(time){ + Ok(())=>println!("@@@@ Finished run time={}",run.time(time)), + Err(e)=>println!("@@@@ Run Finish error:{e:?}"), + } + }, + Some(gameplay_modes::Zone::Anticheat)=>run.flag(run::FlagReason::Anticheat), + None=>(), + } + } + run_teleport_behaviour(intersect.model_id.into(),attr.general.wormhole.as_ref(),mode,move_state,body,touching,run,mode_state,models,hitbox_mesh,bvh,style,camera,input_state,time); +} + +fn collision_end_contact( + move_state:&mut MoveState, + body:&mut Body, + touching:&mut TouchingState, + models:&PhysicsModels, + hitbox_mesh:&HitboxMesh, + style:&StyleModifiers, + camera:&PhysicsCamera, + input_state:&InputState, + _attr:&gameplay_attributes::ContactAttributes, + contact:ContactCollision, +){ + touching.remove(&Collision::Contact(contact));//remove contact before calling contact_constrain_acceleration + //check ground + //TODO do better + //this is inner code from move_state.cull_velocity + match move_state.get_walk_state(){ + //did you stop touching the thing you were walking on? + Some(walk_state)=>if walk_state.contact==contact{ + move_state.set_move_state(MoveState::Air,body,touching,models,hitbox_mesh,style,camera,input_state); + }, + None=>move_state.apply_enum_and_body(body,touching,models,hitbox_mesh,style,camera,input_state), + } +} +fn collision_end_intersect( + touching:&mut TouchingState, + mode:Option<&gameplay_modes::Mode>, + run:&mut run::Run, + _attr:&gameplay_attributes::IntersectAttributes, + intersect:IntersectCollision, + time:Time, +){ + touching.remove(&Collision::Intersect(intersect)); + if let Some(mode)=mode{ + let zone=mode.get_zone(intersect.model_id.into()); + match zone{ + Some(gameplay_modes::Zone::Start)=>{ + match run.start(time){ + Ok(())=>println!("@@@@ Started run"), + Err(e)=>println!("@@@@ Run Start error:{e:?}"), + } + }, + _=>(), + } + } +} +fn atomic_internal_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:TimedInstruction){ + state.time=ins.time; + let (should_advance_body,goober_time)=match ins.instruction{ + PhysicsInternalInstruction::CollisionStart(_,dt) + |PhysicsInternalInstruction::CollisionEnd(_,dt)=>(true,Some(dt)), + PhysicsInternalInstruction::StrafeTick + |PhysicsInternalInstruction::ReachWalkTargetVelocity=>(true,None), + }; + if should_advance_body{ + match goober_time{ + Some(dt)=>state.body.advance_time_ratio_dt(dt), + None=>state.body.advance_time(state.time), + } + } + match ins.instruction{ + PhysicsInternalInstruction::CollisionStart(collision,_)=>{ + let mode=data.modes.get_mode(state.mode_state.get_mode_id()); + match collision{ + Collision::Contact(contact)=>collision_start_contact( + &mut state.move_state,&mut state.body,&mut state.mode_state,&mut state.touching,&mut state.run, + mode, + &data.models,&data.hitbox_mesh,&data.bvh,&state.style,&state.camera,&state.input_state, + data.models.contact_attr(contact.model_id), + contact, + state.time, + ), + Collision::Intersect(intersect)=>collision_start_intersect( + &mut state.move_state,&mut state.body,&mut state.mode_state,&mut state.touching, + mode, + &mut state.run,&data.models,&data.hitbox_mesh,&data.bvh,&state.style,&state.camera,&state.input_state, + data.models.intersect_attr(intersect.model_id), + intersect, + state.time, + ), + } + }, + PhysicsInternalInstruction::CollisionEnd(collision,_)=>match collision{ + Collision::Contact(contact)=>collision_end_contact( + &mut state.move_state,&mut state.body,&mut state.touching,&data.models,&data.hitbox_mesh,&state.style,&state.camera,&state.input_state, + data.models.contact_attr(contact.model_id), + contact + ), + Collision::Intersect(intersect)=>collision_end_intersect( + &mut state.touching, + data.modes.get_mode(state.mode_state.get_mode_id()), + &mut state.run, + data.models.intersect_attr(intersect.model_id), + intersect, + state.time + ), + }, + PhysicsInternalInstruction::StrafeTick=>{ + //TODO make this less huge + if let Some(strafe_settings)=&state.style.strafe{ + let controls=state.input_state.controls; + if strafe_settings.activates(controls){ + let masked_controls=strafe_settings.mask(controls); + let control_dir=state.style.get_control_dir(masked_controls); + if control_dir!=vec3::ZERO{ + let camera_mat=state.camera.simulate_move_rotation_y(state.input_state.lerp_delta(state.time).x); + if let Some(ticked_velocity)=strafe_settings.tick_velocity(state.body.velocity,(camera_mat*control_dir).with_length(Planar64::ONE).divide().fix_1()){ + //this is wrong but will work ig + //need to note which push planes activate in push solve and keep those + state.cull_velocity(data,ticked_velocity); + } + } + } + } + } + PhysicsInternalInstruction::ReachWalkTargetVelocity=>{ + match &mut state.move_state{ + MoveState::Air + |MoveState::Water + |MoveState::Fly + =>println!("ReachWalkTargetVelocity fired for non-walking MoveState"), + MoveState::Walk(walk_state)|MoveState::Ladder(walk_state)=>{ + match &walk_state.target{ + //you are not supposed to reach a walk target which is already reached! + TransientAcceleration::Reached=>unreachable!(), + TransientAcceleration::Reachable{acceleration:_,time:_}=>{ + //velocity is already handled by advance_time + //we know that the acceleration is precisely zero because the walk target is known to be reachable + //which means that gravity can be fully cancelled + //ignore moving platforms for now + set_acceleration(&mut state.body,&state.touching,&data.models,&data.hitbox_mesh,vec3::ZERO); + walk_state.target=TransientAcceleration::Reached; + }, + //you are not supposed to reach an unreachable walk target! + TransientAcceleration::Unreachable{acceleration:_}=>unreachable!(), + } + } + } + }, + } + } + +fn atomic_input_instruction(state:&mut PhysicsState,data:&PhysicsData,ins:TimedInstruction){ + state.time=ins.time; + let should_advance_body=match ins.instruction{ + //the body may as well be a quantum wave function + //as far as these instruction are concerned (they don't care where it is) + PhysicsInputInstruction::SetSensitivity(..) + |PhysicsInputInstruction::Reset + |PhysicsInputInstruction::Restart + |PhysicsInputInstruction::Spawn(..) + |PhysicsInputInstruction::SetZoom(..) + |PhysicsInputInstruction::Idle=>false, + //these controls only update the body if you are on the ground + PhysicsInputInstruction::SetNextMouse(..) + |PhysicsInputInstruction::ReplaceMouse(..) + |PhysicsInputInstruction::SetMoveForward(..) + |PhysicsInputInstruction::SetMoveLeft(..) + |PhysicsInputInstruction::SetMoveBack(..) + |PhysicsInputInstruction::SetMoveRight(..) + |PhysicsInputInstruction::SetMoveUp(..) + |PhysicsInputInstruction::SetMoveDown(..) + |PhysicsInputInstruction::SetJump(..)=>{ + match &state.move_state{ + MoveState::Fly + |MoveState::Water + |MoveState::Walk(_) + |MoveState::Ladder(_)=>true, + MoveState::Air=>false, + } + }, + //the body must be updated unconditionally + PhysicsInputInstruction::PracticeFly=>true, + }; + if should_advance_body{ + state.body.advance_time(state.time); + } + //TODO: UNTAB + let mut b_refresh_walk_target=true; + match ins.instruction{ + PhysicsInputInstruction::SetSensitivity(sensitivity)=>state.camera.sensitivity=sensitivity, + PhysicsInputInstruction::SetNextMouse(m)=>{ + state.camera.move_mouse(state.input_state.mouse_delta()); + state.input_state.set_next_mouse(m); + }, + PhysicsInputInstruction::ReplaceMouse(m0,m1)=>{ + state.camera.move_mouse(m0.pos-state.input_state.mouse.pos); + state.input_state.replace_mouse(m0,m1); + }, + PhysicsInputInstruction::SetMoveForward(s)=>state.input_state.set_control(Controls::MoveForward,s), + PhysicsInputInstruction::SetMoveLeft(s)=>state.input_state.set_control(Controls::MoveLeft,s), + PhysicsInputInstruction::SetMoveBack(s)=>state.input_state.set_control(Controls::MoveBackward,s), + PhysicsInputInstruction::SetMoveRight(s)=>state.input_state.set_control(Controls::MoveRight,s), + PhysicsInputInstruction::SetMoveUp(s)=>state.input_state.set_control(Controls::MoveUp,s), + PhysicsInputInstruction::SetMoveDown(s)=>state.input_state.set_control(Controls::MoveDown,s), + PhysicsInputInstruction::SetJump(s)=>{ + state.input_state.set_control(Controls::Jump,s); + if let Some(walk_state)=state.move_state.get_walk_state(){ + if let Some(jump_settings)=&state.style.jump{ + let jump_dir=walk_state.jump_direction.direction(&data.models,&data.hitbox_mesh,&walk_state.contact); + let booster_option=data.models.contact_attr(walk_state.contact.model_id).general.booster.as_ref(); + let jumped_velocity=jump_settings.jumped_velocity(&state.style,jump_dir,state.body.velocity,booster_option); + state.cull_velocity(&data,jumped_velocity); + } + } + b_refresh_walk_target=false; + }, + PhysicsInputInstruction::SetZoom(s)=>{ + state.input_state.set_control(Controls::Zoom,s); + b_refresh_walk_target=false; + }, + PhysicsInputInstruction::Reset=>{ + //totally reset physics state + state.reset_to_default(); + b_refresh_walk_target=false; + }, + PhysicsInputInstruction::Restart=>{ + //teleport to start zone + let mode=data.modes.get_mode(state.mode_state.get_mode_id()); + let spawn_point=mode.and_then(|mode| + //TODO: spawn at the bottom of the start zone plus the hitbox size + //TODO: set camera andles to face the same way as the start zone + data.models.get_model_transform(mode.get_start().into()).map(|transform| + transform.vertex.translation + ) + ).unwrap_or(vec3::ZERO); + set_position(spawn_point,&mut state.move_state,&mut state.body,&mut state.touching,&mut state.run,&mut state.mode_state,mode,&data.models,&data.hitbox_mesh,&data.bvh,&state.style,&state.camera,&state.input_state,state.time); + set_velocity(&mut state.body,&state.touching,&data.models,&data.hitbox_mesh,vec3::ZERO); + state.set_move_state(data,MoveState::Air); + b_refresh_walk_target=false; + } + PhysicsInputInstruction::Spawn(mode_id,stage_id)=>{ + //spawn at a particular stage + if let Some(mode)=data.modes.get_mode(mode_id){ + if let Some(stage)=mode.get_stage(stage_id){ + let _=teleport_to_spawn( + stage, + &mut state.move_state,&mut state.body,&mut state.touching,&mut state.run,&mut state.mode_state, + mode, + &data.models,&data.hitbox_mesh,&data.bvh,&state.style,&state.camera,&state.input_state,state.time + ); + } + } + b_refresh_walk_target=false; + }, + PhysicsInputInstruction::PracticeFly=>{ + match &state.move_state{ + MoveState::Fly=>{ + state.set_move_state(data,MoveState::Air); + }, + _=>{ + state.set_move_state(data,MoveState::Fly); + }, + } + b_refresh_walk_target=false; + }, + PhysicsInputInstruction::Idle=>{ + //literally idle! + b_refresh_walk_target=false; + }, + } + if b_refresh_walk_target{ + state.apply_input_and_body(data); + state.cull_velocity(data,state.body.velocity); + //also check if accelerating away from surface + } +} + + fn atomic_state_update(state:&mut PhysicsState,data:&PhysicsData,ins:TimedInstruction){ + match &ins.instruction{ + PhysicsInstruction::Input(PhysicsInputInstruction::Idle) + |PhysicsInstruction::Input(PhysicsInputInstruction::SetNextMouse(_)) + |PhysicsInstruction::Input(PhysicsInputInstruction::ReplaceMouse(_,_)) + |PhysicsInstruction::Internal(PhysicsInternalInstruction::StrafeTick) + |PhysicsInstruction::Internal(PhysicsInternalInstruction::ReachWalkTargetVelocity)=>(), + _=>println!("{}|{:?}",ins.time,ins.instruction), + } + if ins.time(), + PhysicsInstruction::Internal(instruction)=>atomic_internal_instruction(state,data,TimedInstruction{time:ins.time,instruction}), + PhysicsInstruction::Input(instruction)=>atomic_input_instruction(state,data,TimedInstruction{time:ins.time,instruction}), + } + } + +#[cfg(test)] +mod test{ + use strafesnet_common::integer::{vec3::{self,int as int3},mat3}; + use super::*; + fn test_collision_axis_aligned(relative_body:Body,expected_collision_time:Option