summaryrefslogtreecommitdiff
path: root/Rend
diff options
context:
space:
mode:
authorVasco <[email protected]>2026-08-24 03:53:16 +0100
committerVasco <[email protected]>2026-08-24 03:53:16 +0100
commitad5248a3e1bafc1b7dec4c8af82d56ed324ef314 (patch)
treeb575c3b85d6ad314fa9768855bed9aed8642917e /Rend
parent5dc2716abd43166cd65133625f408ad36a6623b3 (diff)
Slimed out podium. Updated math. Rend kinda works but still bugged.
Diffstat (limited to 'Rend')
-rw-r--r--Rend/demos/build.c85
-rw-r--r--Rend/demos/compute/frag.spvbin376 -> 0 bytes
-rw-r--r--Rend/demos/compute/particle.spvbin1876 -> 0 bytes
-rwxr-xr-xRend/demos/compute/rend_compute_demobin424800 -> 0 bytes
-rwxr-xr-xRend/demos/compute/rend_compute_fastbin450512 -> 0 bytes
-rw-r--r--Rend/demos/compute/sand.spvbin5548 -> 0 bytes
-rw-r--r--Rend/demos/compute/vert.spvbin3704 -> 0 bytes
-rw-r--r--Rend/demos/poof.h874
-rw-r--r--Rend/demos/rend_compute.c214
-rw-r--r--Rend/demos/rend_compute.slang146
-rw-r--r--Rend/demos/rend_teapot.c172
-rw-r--r--Rend/demos/teapot.h17273
-rw-r--r--Rend/demos/teapot/shaders/basic.slang36
-rw-r--r--Rend/demos/teapot/shaders/texture.slang28
-rw-r--r--Rend/demos/teapot/stb_image.h7988
-rw-r--r--Rend/demos/teapot/texture.frag.spvbin684 -> 0 bytes
-rw-r--r--Rend/demos/teapot/texture.vert.spvbin844 -> 0 bytes
-rw-r--r--Rend/demos/teapot/wal.jpgbin21110 -> 0 bytes
-rw-r--r--Rend/podium.h2282
-rw-r--r--Rend/rend.c11
-rw-r--r--Rend/rend.h20
-rw-r--r--Rend/rend_internal.h20
-rw-r--r--Rend/rend_vk.c198
-rw-r--r--Rend/rend_vk_device.c18
-rw-r--r--Rend/rend_vk_internal.h4
25 files changed, 157 insertions, 29212 deletions
diff --git a/Rend/demos/build.c b/Rend/demos/build.c
deleted file mode 100644
index 3d67006..0000000
--- a/Rend/demos/build.c
+++ /dev/null
@@ -1,85 +0,0 @@
-#define POOF_IMPLEMENTATION
-#include "poof.h"
-
-void add_podium_config(Poof_CC *cc) {
- poof_cmd_append(&cc->includes, "Podium");
-
-#if defined(PODIUM_WIN32)
- poof_cc_append_win32(cc, "-DPODIUM_WIN32", "-luser32", "-lgdi32");
- const char *vulkan_sdk = getenv("VULKAN_SDK");
- if (vulkan_sdk) {
- char inc_buf[512], lib_buf[512];
- snprintf(inc_buf, sizeof(inc_buf), "-I%s/Include", vulkan_sdk);
- snprintf(lib_buf, sizeof(lib_buf), "-L%s/Lib", vulkan_sdk);
- poof_cc_append_win32(cc, strdup(inc_buf), strdup(lib_buf));
- }
- poof_cc_append_win32(cc, "-lvulkan-1");
-#else
- poof_cc_append_linux(cc, "-lX11", "-D_REENTRANT", "-lpulse", "-lpulse-simple", "-pthread", "-lvulkan");
-#endif
-}
-
-int main(int argc, char **argv) {
- POOF_GO_REBUILD_URSELF(argc, argv);
-
- Poof_Batch batch = {0};
-
- {
- Poof_Cmd cmd = {0};
- poof_cmd_append(&cmd, "slangc", "rend_compute.slang", "-target", "spirv", "-entry", "particleMain", "-stage", "compute", "-o", "compute/particle.spv");
- poof_batch_append_cmd(&batch, cmd);
- }
-
- {
- Poof_Cmd cmd = {0};
- poof_cmd_append(&cmd, "slangc", "rend_compute.slang", "-target", "spirv", "-entry", "sandMain", "-stage", "compute", "-o", "compute/sand.spv");
- poof_batch_append_cmd(&batch, cmd);
- }
-
- {
- Poof_Cmd cmd = {0};
- poof_cmd_append(&cmd, "slangc", "rend_compute.slang", "-target", "spirv", "-entry", "vertMain", "-stage", "vertex", "-o", "compute/vert.spv");
- poof_batch_append_cmd(&batch, cmd);
- }
-
- {
- Poof_Cmd cmd = {0};
- poof_cmd_append(&cmd, "slangc", "rend_compute.slang", "-target", "spirv", "-entry", "fragMain", "-stage", "fragment", "-o", "compute/frag.spv");
- poof_batch_append_cmd(&batch, cmd);
- }
-
- // Debug build
- {
- Poof_CC cc;
- poof_cc_init(&cc, POOF_CC_GCC, POOF_TARGET_HOST);
- cc.debug_mode = true;
- cc.optimization = POOF_O0;
- cc.output = "compute/rend_compute_demo";
- poof_cmd_append(&cc.inputs, "rend_compute.c");
- poof_cmd_append(&cc.includes, "..", ".");
- poof_cmd_append(&cc.defines, "REND_DEBUG");
- poof_cmd_append(&cc.libs, "m");
- poof_cmd_append(&cc.extra_flags, "-ggdb");
- add_podium_config(&cc);
-
- poof_batch_append_cc(&batch, &cc);
- }
-
- // Debug build
- {
- Poof_CC cc;
- poof_cc_init(&cc, POOF_CC_GCC, POOF_TARGET_HOST);
- cc.debug_mode = true;
- cc.optimization = POOF_O3 | POOF_MSSE2;
- cc.output = "compute/rend_compute_fast";
- poof_cmd_append(&cc.inputs, "rend_compute.c");
- poof_cmd_append(&cc.includes, "..");
- poof_cmd_append(&cc.libs, "m");
- add_podium_config(&cc);
-
- poof_batch_append_cc(&batch, &cc);
- }
-
- poof_batch_run(&batch, "Rend Demos");
- return 0;
-}
diff --git a/Rend/demos/compute/frag.spv b/Rend/demos/compute/frag.spv
deleted file mode 100644
index 5366c51..0000000
--- a/Rend/demos/compute/frag.spv
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/compute/particle.spv b/Rend/demos/compute/particle.spv
deleted file mode 100644
index 6547772..0000000
--- a/Rend/demos/compute/particle.spv
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/compute/rend_compute_demo b/Rend/demos/compute/rend_compute_demo
deleted file mode 100755
index 071b495..0000000
--- a/Rend/demos/compute/rend_compute_demo
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/compute/rend_compute_fast b/Rend/demos/compute/rend_compute_fast
deleted file mode 100755
index b9dac67..0000000
--- a/Rend/demos/compute/rend_compute_fast
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/compute/sand.spv b/Rend/demos/compute/sand.spv
deleted file mode 100644
index 9dcac4d..0000000
--- a/Rend/demos/compute/sand.spv
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/compute/vert.spv b/Rend/demos/compute/vert.spv
deleted file mode 100644
index e5d2970..0000000
--- a/Rend/demos/compute/vert.spv
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/poof.h b/Rend/demos/poof.h
deleted file mode 100644
index 3480557..0000000
--- a/Rend/demos/poof.h
+++ /dev/null
@@ -1,874 +0,0 @@
-/* ===========================================================================
- * POOF - The Universal Build System - Copyright (c) 2026 Vasco Alves
- *
- * PREFIX: Poof_ (types) or poof_ (functions & variables)
- *
- * DESCRIPTION:
- * Platform independent-ish build system!
- * Performant, multi-threaded and mesmerizing.
- *
- * See LICENSE at the end of the file.
- * =========================================================================== */
-
-#ifndef _POOF_H_
-#define _POOF_H_
-
-#define POOF_MAJOR 0
-#define POOF_MINOR 1
-#define POOF_PATCH 0
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdarg.h>
-#include <sys/stat.h>
-
-#if defined(_WIN32)
- #include <windows.h>
- #include <direct.h>
- #include <io.h>
-#else
- #include <unistd.h>
- #include <sys/wait.h>
- #include <sys/types.h>
- #include <dirent.h>
- #include <errno.h>
-#endif
-
-enum PoofTargetPlatform {
- POOF_TARGET_HOST = 0,
- POOF_TARGET_WIN32 = 1,
- POOF_TARGET_LINUX = 1 << 1,
- POOF_TARGET_MACOS = 1 << 2,
-};
-
-enum PoofCCFlags {
- POOF_CC_GCC = 1,
- POOF_CC_CLANG = 1 << 1,
- POOF_CC_MSVC = 1 << 2,
- POOF_CC_MINGW = 1 << 3,
-};
-
-enum PoofOptimizationFlags {
- POOF_O0 = 0,
- POOF_O1 = 1,
- POOF_O2 = 2,
- POOF_O3 = 3,
- POOF_MSSE = 1 << 3,
- POOF_MSSE2 = 1 << 4,
- POOF_AVX = 1 << 5,
- POOF_AVX2 = 1 << 6,
- POOF_AVX512F = 1 << 7,
-};
-
-#define POOF_IS_SET(var, flag) (((var) & (flag)) != 0)
-
-typedef struct Poof_Cmd {
- const char **items;
- size_t capacity;
- size_t count;
-} Poof_Cmd;
-
-typedef struct Poof_CC {
- uint8_t compiler; // enum PoofCCFlags
- uint8_t target_platform; // enum PoofTargetPlatform
- uint32_t optimization; // bitwise PoofOptimizationFlags
- bool debug_mode;
- Poof_Cmd inputs;
- const char *output;
- Poof_Cmd includes;
- Poof_Cmd lib_paths;
- Poof_Cmd libs;
- Poof_Cmd defines;
- Poof_Cmd extra_flags;
-
- /* Platform specific flags */
- Poof_Cmd win32_flags;
- Poof_Cmd linux_flags;
- Poof_Cmd macos_flags;
-} Poof_CC;
-
-typedef struct Poof_Batch {
- Poof_Cmd *cmds;
- size_t capacity;
- size_t count;
-} Poof_Batch;
-
-/* Command operations */
-extern void poof_cmd_append_internal(Poof_Cmd *cmd, ...);
-#define poof_cmd_append(cmd, ...) poof_cmd_append_internal((cmd), __VA_ARGS__, NULL)
-
-#define poof_cc_append_win32(cc, ...) poof_cmd_append_internal(&((cc)->win32_flags), __VA_ARGS__, NULL)
-#define poof_cc_append_linux(cc, ...) poof_cmd_append_internal(&((cc)->linux_flags), __VA_ARGS__, NULL)
-#define poof_cc_append_macos(cc, ...) poof_cmd_append_internal(&((cc)->macos_flags), __VA_ARGS__, NULL)
-
-extern void poof_cmd_free(Poof_Cmd *cmd);
-extern void poof_cmd_clear(Poof_Cmd *cmd);
-extern bool poof_cmd_run(Poof_Cmd *cmd);
-
-/* Batch operations */
-extern void poof_batch_append_cmd(Poof_Batch *batch, Poof_Cmd cmd);
-extern void poof_batch_append_cc(Poof_Batch *batch, Poof_CC *cc);
-#define poof_batch_append(batch, cmd) poof_batch_append_cmd((batch), (cmd))
-extern void poof_batch_free(Poof_Batch *batch);
-extern bool poof_batch_run(Poof_Batch *batch, const char *label);
-extern bool poof_batch_run_parallel(Poof_Batch *batch, const char *label, size_t max_jobs);
-
-/* Compiler abstraction */
-extern uint8_t poof_cc_available(void);
-extern void poof_cc_init(Poof_CC *cc, uint8_t compiler, uint8_t target_platform);
-extern void poof_cc_free(Poof_CC *cc);
-extern bool poof_cc_run(Poof_CC *cc);
-
-/* File and directory utilities */
-extern bool poof_mkdir(const char *path);
-extern bool poof_touch(const char *path);
-extern bool poof_rm(const char *path);
-extern bool poof_rm_recursive(const char *path);
-extern bool poof_copy_file(const char *src, const char *dst);
-extern bool poof_needs_rebuild(const char *target, const char **sources, size_t source_count);
-
-/* Output and pretty printing */
-extern int poof_print(uint32_t col, const char *text, ...);
-extern int poof_progress_bar(const char *label, float value, float min, float max, float width);
-
-/* Rebuild self macro */
-extern void poof_go_rebuild_urself_impl(int argc, char **argv, const char *source_file);
-
-#define POOF_GO_REBUILD_URSELF(argc, argv) poof_go_rebuild_urself_impl(argc, argv, __FILE__)
-
-#endif // _POOF_H_
-
-#ifdef POOF_IMPLEMENTATION
-#undef POOF_IMPLEMENTATION
-
-#if defined(_WIN32)
-#define POOF_DEV_NULL "nul 2>&1"
-#else
-#define POOF_DEV_NULL "/dev/null 2>&1"
-#endif
-
-static bool
-poof__probe_cmd(const char *cmd)
-{
- char buffer[256];
- snprintf(buffer, sizeof(buffer), "%s > " POOF_DEV_NULL, cmd);
- return (system(buffer) == 0);
-}
-
-extern uint8_t
-poof_cc_available(void)
-{
- uint8_t available = 0;
-
- poof_print(0x00FF88, "[POOF] Probing available compilers:\n");
- if (poof__probe_cmd("gcc --version")) {
- available |= POOF_CC_GCC;
- poof_print(0x00FF88, " - GCC: available\n");
- }
-
- if (poof__probe_cmd("clang --version")) {
- available |= POOF_CC_CLANG;
- poof_print(0x00FF88, " - CLANG: available\n");
- }
-
- if (poof__probe_cmd("x86_64-w64-mingw32-gcc --version") || poof__probe_cmd("mingw32-gcc --version")) {
- available |= POOF_CC_MINGW;
- poof_print(0x00FF88, " - MinGW: available\n");
- }
-
- if (poof__probe_cmd("cl")) {
- available |= POOF_CC_MSVC;
- poof_print(0x00FF88, " - MSVC: available\n");
- }
-
- return available;
-}
-
-extern void
-poof_cmd_append_internal(Poof_Cmd *cmd, ...)
-{
- va_list args;
- va_start(args, cmd);
- const char *arg = NULL;
- while ((arg = va_arg(args, const char *)) != NULL) {
-
- if (cmd->count >= cmd->capacity) {
- size_t new_cap = cmd->capacity == 0 ? 16 : cmd->capacity * 2;
- const char **new_items = (const char **)realloc(cmd->items, new_cap * sizeof(const char *));
- if (!new_items) return;
- cmd->items = new_items;
- cmd->capacity = new_cap;
- }
- cmd->items[cmd->count++] = arg;
- }
- va_end(args);
-}
-
-
-extern void
-poof_cmd_clear(Poof_Cmd *cmd)
-{
- /* clear count while keeping capacity */
- cmd->count = 0;
-}
-
-extern void
-poof_cmd_free(Poof_Cmd *cmd)
-{
- if (cmd->items) {
- free(cmd->items);
- cmd->items = NULL;
- }
- cmd->capacity = 0;
- cmd->count = 0;
-}
-
-static char *
-poof__cmd_to_string(const Poof_Cmd *cmd)
-{
- if (!cmd || cmd->count == 0) return NULL;
-
- size_t total_len = 0;
- for (size_t i = 0; i < cmd->count; ++i) {
- total_len += strlen(cmd->items[i]) + 3; // quotes and space
- }
-
- char *cmdline = (char *)malloc(total_len + 1);
- if (!cmdline) return NULL;
- cmdline[0] = '\0';
-
- for (size_t i = 0; i < cmd->count; ++i) {
- if (i > 0) strcat(cmdline, " ");
- bool need_quote = (strchr(cmd->items[i], ' ') != NULL);
- if (need_quote) strcat(cmdline, "\"");
- strcat(cmdline, cmd->items[i]);
- if (need_quote) strcat(cmdline, "\"");
- }
-
- return cmdline;
-}
-
-extern bool
-poof_cmd_run(Poof_Cmd *cmd)
-{
- char *cmdline = poof__cmd_to_string(cmd);
- if (!cmdline) return false;
-
- printf("[POOF] Executing: ");
- poof_print(0xA9B665, "%s\n", cmdline);
-
- int status = system(cmdline);
- free(cmdline);
- poof_cmd_clear(cmd);
- return (status == 0);
-}
-
-extern void
-poof_cc_init(Poof_CC *cc, uint8_t compiler, uint8_t target_platform)
-{
- memset(cc, 0, sizeof(Poof_CC));
- cc->compiler = compiler;
- cc->target_platform = target_platform;
- cc->optimization = POOF_O0;
- cc->debug_mode = true;
-}
-
-extern void
-poof_cc_free(Poof_CC *cc)
-{
- poof_cmd_free(&cc->inputs);
- poof_cmd_free(&cc->includes);
- poof_cmd_free(&cc->lib_paths);
- poof_cmd_free(&cc->libs);
- poof_cmd_free(&cc->defines);
- poof_cmd_free(&cc->extra_flags);
- poof_cmd_free(&cc->win32_flags);
- poof_cmd_free(&cc->linux_flags);
- poof_cmd_free(&cc->macos_flags);
-}
-
-extern void
-poof_batch_append_cmd(Poof_Batch *batch, Poof_Cmd cmd)
-{
- if (batch->count >= batch->capacity) {
- size_t new_cap = batch->capacity == 0 ? 16 : batch->capacity * 2;
- Poof_Cmd *new_cmds = (Poof_Cmd *)realloc(batch->cmds, new_cap * sizeof(Poof_Cmd));
- if (!new_cmds) return;
- batch->cmds = new_cmds;
- batch->capacity = new_cap;
- }
- batch->cmds[batch->count++] = cmd;
-}
-
-static Poof_Cmd
-poof__cc_build_cmd(const Poof_CC *cc, uint8_t target_platform, bool multi_target)
-{
- Poof_Cmd cmd = {0};
-
- // Pick compiler binary
- if (cc->compiler & POOF_CC_GCC) {
- if (target_platform == POOF_TARGET_WIN32) {
- poof_cmd_append(&cmd, "x86_64-w64-mingw32-gcc");
- } else {
- poof_cmd_append(&cmd, "gcc");
- }
- } else if (cc->compiler & POOF_CC_CLANG) {
- poof_cmd_append(&cmd, "clang");
- if (target_platform == POOF_TARGET_WIN32) {
- poof_cmd_append(&cmd, "-target");
- poof_cmd_append(&cmd, "x86_64-pc-windows-gnu");
- } else if (target_platform == POOF_TARGET_LINUX) {
- poof_cmd_append(&cmd, "-target");
- poof_cmd_append(&cmd, "x86_64-unknown-linux-gnu");
- } else if (target_platform == POOF_TARGET_MACOS) {
- poof_cmd_append(&cmd, "-target");
- poof_cmd_append(&cmd, "x86_64-apple-darwin");
- }
- } else if (cc->compiler & POOF_CC_MINGW) {
- poof_cmd_append(&cmd, "x86_64-w64-mingw32-gcc");
- } else if (cc->compiler & POOF_CC_MSVC) {
- poof_cmd_append(&cmd, "cl");
- } else {
- poof_cmd_append(&cmd, "gcc");
- }
-
- bool is_msvc = (cc->compiler & POOF_CC_MSVC) != 0;
-
- // Debug flags
- if (cc->debug_mode) {
- poof_cmd_append(&cmd, is_msvc ? "/Zi" : "-g");
- }
-
- // Optimization flags
- uint32_t opt_level = cc->optimization & 3;
- if (opt_level == POOF_O1) poof_cmd_append(&cmd, is_msvc ? "/O1" : "-O1");
- else if (opt_level == POOF_O2) poof_cmd_append(&cmd, is_msvc ? "/O2" : "-O2");
- else if (opt_level == POOF_O3) poof_cmd_append(&cmd, is_msvc ? "/O2" : "-O3");
- else poof_cmd_append(&cmd, is_msvc ? "/Od" : "-O0");
-
- // SIMD / Arch extensions
- if (POOF_IS_SET(cc->optimization, POOF_MSSE)) poof_cmd_append(&cmd, is_msvc ? "/arch:SSE" : "-msse");
- if (POOF_IS_SET(cc->optimization, POOF_MSSE2)) poof_cmd_append(&cmd, is_msvc ? "/arch:SSE2" : "-msse2");
- if (POOF_IS_SET(cc->optimization, POOF_AVX)) poof_cmd_append(&cmd, is_msvc ? "/arch:AVX" : "-mavx");
- if (POOF_IS_SET(cc->optimization, POOF_AVX2)) poof_cmd_append(&cmd, is_msvc ? "/arch:AVX2" : "-mavx2");
- if (POOF_IS_SET(cc->optimization, POOF_AVX512F)) poof_cmd_append(&cmd, is_msvc ? "/arch:AVX512" : "-mavx512f");
-
- // Defines
- for (size_t i = 0; i < cc->defines.count; ++i) {
- char buf[256];
- snprintf(buf, sizeof(buf), "%s%s", is_msvc ? "/D" : "-D", cc->defines.items[i]);
- poof_cmd_append(&cmd, strdup(buf));
- }
-
- // Include dirs
- for (size_t i = 0; i < cc->includes.count; ++i) {
- char buf[512];
- snprintf(buf, sizeof(buf), "%s%s", is_msvc ? "/I" : "-I", cc->includes.items[i]);
- poof_cmd_append(&cmd, strdup(buf));
- }
-
- // Input files
- for (size_t i = 0; i < cc->inputs.count; ++i) {
- poof_cmd_append(&cmd, cc->inputs.items[i]);
- }
-
- // Output target
- if (cc->output) {
- char out_path[512];
- if (target_platform == POOF_TARGET_WIN32) {
- if (strstr(cc->output, ".exe")) {
- snprintf(out_path, sizeof(out_path), "%s", cc->output);
- } else {
- snprintf(out_path, sizeof(out_path), multi_target ? "%s_win32.exe" : "%s.exe", cc->output);
- }
- } else if (target_platform == POOF_TARGET_MACOS) {
- snprintf(out_path, sizeof(out_path), multi_target ? "%s_macos" : "%s", cc->output);
- } else if (target_platform == POOF_TARGET_LINUX) {
- snprintf(out_path, sizeof(out_path), multi_target ? "%s_linux" : "%s", cc->output);
- } else {
- snprintf(out_path, sizeof(out_path), "%s", cc->output);
- }
-
- if (is_msvc) {
- char buf[512];
- snprintf(buf, sizeof(buf), "/Fe:%s", out_path);
- poof_cmd_append(&cmd, strdup(buf));
- } else {
- poof_cmd_append(&cmd, "-o");
- poof_cmd_append(&cmd, strdup(out_path));
- }
- }
-
- // Lib paths & libs
- for (size_t i = 0; i < cc->lib_paths.count; ++i) {
- char buf[512];
- snprintf(buf, sizeof(buf), "%s%s", is_msvc ? "/LIBPATH:" : "-L", cc->lib_paths.items[i]);
- poof_cmd_append(&cmd, strdup(buf));
- }
-
- for (size_t i = 0; i < cc->libs.count; ++i) {
- if (is_msvc) {
- char buf[256];
- snprintf(buf, sizeof(buf), "%s.lib", cc->libs.items[i]);
- poof_cmd_append(&cmd, strdup(buf));
- } else {
- char buf[256];
- snprintf(buf, sizeof(buf), "-l%s", cc->libs.items[i]);
- poof_cmd_append(&cmd, strdup(buf));
- }
- }
-
- // Extra flags
- for (size_t i = 0; i < cc->extra_flags.count; ++i) {
- poof_cmd_append(&cmd, cc->extra_flags.items[i]);
- }
-
- // Platform specific flags
- const Poof_Cmd *plat_cmd = NULL;
- if (target_platform == POOF_TARGET_WIN32) plat_cmd = &cc->win32_flags;
- else if (target_platform == POOF_TARGET_LINUX) plat_cmd = &cc->linux_flags;
- else if (target_platform == POOF_TARGET_MACOS) plat_cmd = &cc->macos_flags;
-
- if (plat_cmd) {
- for (size_t i = 0; i < plat_cmd->count; ++i) {
- poof_cmd_append(&cmd, plat_cmd->items[i]);
- }
- }
-
- return cmd;
-}
-
-extern void
-poof_batch_append_cc(Poof_Batch *batch, Poof_CC *cc)
-{
- uint8_t mask = cc->target_platform;
- if (mask == 0) {
-#if defined(_WIN32)
- mask = POOF_TARGET_WIN32;
-#elif defined(__APPLE__)
- mask = POOF_TARGET_MACOS;
-#else
- mask = POOF_TARGET_LINUX;
-#endif
- }
-
- uint8_t targets[3] = { POOF_TARGET_WIN32, POOF_TARGET_LINUX, POOF_TARGET_MACOS };
- int target_count = 0;
- for (int i = 0; i < 3; ++i) {
- if (mask & targets[i]) target_count++;
- }
-
- bool multi_target = target_count > 1;
-
- for (int i = 0; i < 3; ++i) {
- if (mask & targets[i]) {
- Poof_Cmd cmd = poof__cc_build_cmd(cc, targets[i], multi_target);
- poof_batch_append_cmd(batch, cmd);
- }
- }
-
- poof_cc_free(cc);
-}
-
-extern void
-poof_batch_free(Poof_Batch *batch)
-{
- if (batch->cmds) {
- for (size_t i = 0; i < batch->count; ++i) {
- poof_cmd_free(&batch->cmds[i]);
- }
- free(batch->cmds);
- batch->cmds = NULL;
- }
- batch->capacity = 0;
- batch->count = 0;
-}
-
-extern bool
-poof_batch_run_parallel(Poof_Batch *batch, const char *label, size_t max_jobs)
-{
- if (!batch || batch->count == 0) return true;
- if (!label) label = "BATCH";
-
-#if defined(_WIN32)
- if (max_jobs == 0) {
- SYSTEM_INFO sysinfo;
- GetSystemInfo(&sysinfo);
- max_jobs = sysinfo.dwNumberOfProcessors > 0 ? sysinfo.dwNumberOfProcessors : 4;
- }
- if (max_jobs > MAXIMUM_WAIT_OBJECTS) max_jobs = MAXIMUM_WAIT_OBJECTS;
-
- size_t total = batch->count;
- size_t next_job = 0;
- size_t completed = 0;
- bool success = true;
-
- HANDLE *handles = (HANDLE *)calloc(max_jobs, sizeof(HANDLE));
- if (!handles) return false;
- size_t active_jobs = 0;
-
- poof_progress_bar(label, 0.0f, 0.0f, (float)total, 30.0f);
-
- while (completed < total) {
- while (active_jobs < max_jobs && next_job < total) {
- char *cmdline = poof__cmd_to_string(&batch->cmds[next_job]);
- if (cmdline) {
- char win_cmd[1024];
- snprintf(win_cmd, sizeof(win_cmd), "cmd.exe /c \"%s\"", cmdline);
-
- STARTUPINFOA si = { sizeof(si) };
- PROCESS_INFORMATION pi = {0};
-
- if (CreateProcessA(NULL, win_cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
- CloseHandle(pi.hThread);
- handles[active_jobs++] = pi.hProcess;
- } else {
- success = false;
- }
- free(cmdline);
- }
- next_job++;
- }
-
- if (active_jobs == 0) break;
-
- DWORD dwWait = WaitForMultipleObjects((DWORD)active_jobs, handles, FALSE, INFINITE);
- if (dwWait >= WAIT_OBJECT_0 && dwWait < WAIT_OBJECT_0 + active_jobs) {
- DWORD idx = dwWait - WAIT_OBJECT_0;
- DWORD exit_code = 0;
- GetExitCodeProcess(handles[idx], &exit_code);
- if (exit_code != 0) success = false;
- CloseHandle(handles[idx]);
-
- for (size_t i = idx; i < active_jobs - 1; ++i) {
- handles[i] = handles[i + 1];
- }
- active_jobs--;
- completed++;
- poof_progress_bar(label, (float)completed, 0.0f, (float)total, 30.0f);
- } else {
- break;
- }
- }
-
- free(handles);
- poof_batch_free(batch);
- return success;
-#else
- if (max_jobs == 0) {
- long nprocs = sysconf(_SC_NPROCESSORS_ONLN);
- max_jobs = (nprocs > 0) ? (size_t)nprocs : 4;
- }
-
- size_t total = batch->count;
- size_t next_job = 0;
- size_t active_jobs = 0;
- size_t completed = 0;
- bool success = true;
-
- poof_progress_bar(label, 0.0f, 0.0f, (float)total, 30.0f);
-
- while (completed < total) {
- while (active_jobs < max_jobs && next_job < total) {
- char *cmdline = poof__cmd_to_string(&batch->cmds[next_job]);
- if (cmdline) {
- pid_t pid = fork();
- if (pid == 0) {
- execl("/bin/sh", "sh", "-c", cmdline, (char *)NULL);
- _exit(127);
- } else if (pid > 0) {
- active_jobs++;
- } else {
- success = false;
- }
- free(cmdline);
- }
- next_job++;
- }
-
- if (active_jobs == 0) break;
-
- int status = 0;
- pid_t done_pid = wait(&status);
- if (done_pid > 0) {
- active_jobs--;
- completed++;
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
- success = false;
- }
- poof_progress_bar(label, (float)completed, 0.0f, (float)total, 30.0f);
- } else if (done_pid < 0 && errno == ECHILD) {
- break;
- }
- }
-
- poof_batch_free(batch);
- return success;
-#endif
-}
-
-extern bool
-poof_batch_run(Poof_Batch *batch, const char *label)
-{
- return poof_batch_run_parallel(batch, label, 0);
-}
-
-static bool
-poof__cc_run_single(const Poof_CC *cc, uint8_t target_platform, bool multi_target)
-{
- Poof_Cmd cmd = poof__cc_build_cmd(cc, target_platform, multi_target);
- bool result = poof_cmd_run(&cmd);
- poof_cmd_free(&cmd);
- return result;
-}
-
-extern bool
-poof_cc_run(Poof_CC *cc)
-{
- uint8_t mask = cc->target_platform;
- if (mask == 0) {
-#if defined(_WIN32)
- mask = POOF_TARGET_WIN32;
-#elif defined(__APPLE__)
- mask = POOF_TARGET_MACOS;
-#else
- mask = POOF_TARGET_LINUX;
-#endif
- }
-
- uint8_t targets[3] = { POOF_TARGET_WIN32, POOF_TARGET_LINUX, POOF_TARGET_MACOS };
- int target_count = 0;
- for (int i = 0; i < 3; ++i) {
- if (mask & targets[i]) target_count++;
- }
-
- bool multi_target = target_count > 1;
- bool success = true;
-
- for (int i = 0; i < 3; ++i) {
- if (mask & targets[i]) {
- if (!poof__cc_run_single(cc, targets[i], multi_target)) {
- success = false;
- }
- }
- }
-
- poof_cc_free(cc);
- return success;
-}
-
-
-extern bool
-poof_mkdir(const char *path)
-{
-#if defined(_WIN32)
- return _mkdir(path) == 0 || errno == EEXIST;
-#else
- return mkdir(path, 0755) == 0 || errno == EEXIST;
-#endif
-}
-
-extern bool
-poof_touch(const char *path)
-{
- FILE *f = fopen(path, "a");
- if (!f) return false;
- fclose(f);
- return true;
-}
-
-extern bool
-poof_rm(const char *path)
-{
- return remove(path) == 0;
-}
-
-extern bool
-poof_rm_recursive(const char *path)
-{
-#if defined(_WIN32)
- char cmd[512];
- snprintf(cmd, sizeof(cmd), "rmdir /s /q \"%s\"", path);
- return system(cmd) == 0;
-#else
- char cmd[512];
- snprintf(cmd, sizeof(cmd), "rm -rf \"%s\"", path);
- return system(cmd) == 0;
-#endif
-}
-
-extern bool
-poof_copy_file(const char *src, const char *dst)
-{
- FILE *in = fopen(src, "rb");
- if (!in) return false;
- FILE *out = fopen(dst, "wb");
- if (!out) {
- fclose(in);
- return false;
- }
-
- char buffer[8192];
- size_t bytes;
- while ((bytes = fread(buffer, 1, sizeof(buffer), in)) > 0) {
- fwrite(buffer, 1, bytes, out);
- }
-
- fclose(in);
- fclose(out);
- return true;
-}
-
-static time_t
-poof__get_mtime(const char *path)
-{
- struct stat attr;
- if (stat(path, &attr) != 0) return 0;
- return attr.st_mtime;
-}
-
-extern bool
-poof_needs_rebuild(const char *target, const char **sources, size_t source_count)
-{
- time_t target_mtime = poof__get_mtime(target);
- if (target_mtime == 0) return true; // Target does not exist
-
- for (size_t i = 0; i < source_count; ++i) {
- time_t src_mtime = poof__get_mtime(sources[i]);
- if (src_mtime > target_mtime) return true;
- }
- return false;
-}
-
-extern int
-poof_print(uint32_t col, const char *text, ...)
-{
- uint8_t r = (col >> 16) & 0xFF;
- uint8_t g = (col >> 8) & 0xFF;
- uint8_t b = col & 0xFF;
-
- printf("\033[38;2;%d;%d;%dm", r, g, b);
-
- va_list args;
- va_start(args, text);
- int res = vprintf(text, args);
- va_end(args);
-
- printf("\033[0m");
- fflush(stdout);
- return res;
-}
-
-extern int
-poof_progress_bar(const char *label, float value, float min, float max, float width)
-{
- float norm = (value - min) / (max - min);
- if (norm < 0.0f) norm = 0.0f;
- if (norm > 1.0f) norm = 1.0f;
-
- int filled = (int)(norm * width);
- int total = (int)width;
-
- char bar[256];
- int pos = 0;
- for (int i = 0; i < total && pos < (int)sizeof(bar) - 1; ++i) {
- if (i < filled) bar[pos++] = '|';
- else bar[pos++] = ' ';
- }
- bar[pos] = '\0';
-
- printf("\r[%s] [", label ? label : "PROGRESS");
- poof_print(0xFE9900, "%s", bar);
- printf("] %d/%d jobs", (int)value, (int)max);
- if (norm >= 1.0f) printf("\n");
- fflush(stdout);
- return 0;
-}
-
-extern void
-poof_go_rebuild_urself_impl(int argc, char **argv, const char *source_file)
-{
- const char *binary_file = argv[0];
- const char *sources[] = { source_file, "Poof/poof.h" };
-
- if (!poof_needs_rebuild(binary_file, sources, 2)) {
- return;
- }
-
- char binary_old[4096];
- snprintf(binary_old, sizeof(binary_old), "%s.old", binary_file);
-
- poof_print(0xFF8800, "[POOF] Source changed. Rebuilding %s...\n", binary_file);
-
- poof_rm(binary_old);
- rename(binary_file, binary_old);
-
- Poof_Cmd cmd = {0};
- poof_cmd_append(&cmd, "gcc", "-o", binary_file, source_file, "-IPodium", "-IPoof");
-
- if (!poof_cmd_run(&cmd)) {
- poof_print(0xFF0000, "[POOF] Rebuild failed!\n");
- rename(binary_old, binary_file);
- exit(1);
- }
- poof_cmd_free(&cmd);
-
- poof_print(0x00FF00, "[POOF] Rebuild successful! Re-launching binary...\n");
-
- #if defined(_WIN32)
- // Windows restart
- int status = system(binary_file);
- exit(status);
- #else
- execv(binary_file, argv);
- perror("execv");
- exit(1);
- #endif
-}
-#endif
-
-/*
-------------------------------------------------------------------------------
-This software is available under 2 licenses -- choose whichever you prefer.
-------------------------------------------------------------------------------
-ALTERNATIVE A - MIT License
-Copyright (c) 2026 Vasco Alves
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-------------------------------------------------------------------------------
-ALTERNATIVE B - Public Domain (www.unlicense.org)
-This is free and unencumbered software released into the public domain.
-Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
-software, either in source code form or as a compiled binary, for any purpose,
-commercial or non-commercial, and by any means.
-In jurisdictions that recognize copyright laws, the author or authors of this
-software dedicate any and all copyright interest in the software to the public
-domain. We make this dedication for the benefit of the public at large and to
-the detriment of our heirs and successors. We intend this dedication to be an
-overt act of relinquishment in perpetuity of all present and future rights to
-this software under copyright law.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------------
-*/
diff --git a/Rend/demos/rend_compute.c b/Rend/demos/rend_compute.c
deleted file mode 100644
index 7d5e407..0000000
--- a/Rend/demos/rend_compute.c
+++ /dev/null
@@ -1,214 +0,0 @@
-#include <string.h>
-
-#ifdef DEBUG_MEMORY
-#define malloc(size) p_debug_malloc_impl((size), __FILE__, __LINE__, __func__)
-#define realloc(ptr, size) p_debug_realloc_impl((ptr), (size), __FILE__, __LINE__, __func__)
-#define free(ptr) p_debug_free_impl((ptr), __FILE__, __LINE__, __func__)
-#endif
-
-#include "../rend.h"
-#include "../rend.c"
-#include <stddef.h>
-
-#define PODIUM_IMPLEMENTATION
-#define P_MODULE_MATH
-#define P_MODULE_VULKAN
-#include "podium.h"
-
-float delta = 0;
-P_Window win;
-P_Event ev;
-
-bool vsync = true;
-
-#define PARTICLE_COUNT 1024 * 10
-#define GRID_WIDTH 512
-#define GRID_HEIGHT 512
-
-typedef struct {
- uint64_t particles;
- uint64_t src_grid;
- uint64_t dst_grid;
- uint32_t particle_count;
- uint32_t width;
- uint32_t height;
- float delta_time;
- uint32_t render_mode;
-} PushConstants;
-
-typedef struct Particle {
- float pos[2];
- float vel[2];
-} Particle;
-
-uint32_t pcg_hash(uint32_t seed) {
- uint32_t state = seed * 747796405u + 2891336453u;
- uint32_t word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
- return (word >> 22u) ^ word;
-}
-
-float cool_beans(uint32_t *seed) {
- *seed = pcg_hash(*seed);
- return (float) *seed / 4294967295.0;
-}
-
-int main() {
-
- if (!p_window_open(&win, 800, 600, "demo")) {
- PFATAL("Failed to open a window!");
- return 1;
- }
-
- // bindless setup
- RendBindingInfo bind_info = {0};
- RendRenderer renderer = rend_renderer_create(&win, REND_BACKEND_AUTO, NULL, vsync, &bind_info);
-
- unsigned long particles_bytes = 0;
- uint8_t *particles_shader = p_file_alloc("particle.spv", &particles_bytes);
-
- unsigned long sand_bytes = 0;
- uint8_t *sand_shader = p_file_alloc("sand.spv", &sand_bytes);
-
- unsigned long vert_size = 0;
- uint8_t *vert = p_file_alloc("vert.spv", &vert_size);
-
- unsigned long frag_size = 0;
- uint8_t *frag = p_file_alloc("frag.spv", &frag_size);
-
- uint32_t seed = 0xC0FFEE;
-
- Particle *initial_particles = malloc(PARTICLE_COUNT * sizeof *initial_particles);
- for (int i = 0; i < PARTICLE_COUNT; i++) {
- initial_particles[i].pos[0] = cool_beans(&seed) * 2.0f - 1.0f;
- initial_particles[i].pos[1] = cool_beans(&seed) * 2.0f - 1.0f;
- initial_particles[i].vel[0] = cool_beans(&seed) * 0.4f - 0.2f;
- initial_particles[i].vel[1] = cool_beans(&seed) * 0.4f - 0.2f;
- }
-
- size_t buffer_size = PARTICLE_COUNT * sizeof(Particle);
- RendBuffer particle_buf = rend_buffer_create(renderer, buffer_size, REND_BUFFER_STORAGE, true);
- rend_buffer_write(renderer, &particle_buf, initial_particles, buffer_size, 0);
-
- size_t grid_buffer_size = GRID_WIDTH * GRID_HEIGHT * sizeof(uint32_t);
- uint32_t *initial_grid = calloc(GRID_WIDTH * GRID_HEIGHT, sizeof(uint32_t));
-
- for (int y = 0; y < 100; y++) {
- for (int x = 150; x < 362; x++) {
- initial_grid[y * GRID_WIDTH + x] = 1; // 1 = sand
- }
- }
-
- RendBuffer src_buf = rend_buffer_create(renderer, GRID_WIDTH * GRID_HEIGHT * sizeof(uint32_t), REND_BUFFER_STORAGE, false);
- RendBuffer dst_buf = rend_buffer_create(renderer, GRID_WIDTH * GRID_HEIGHT * sizeof(uint32_t), REND_BUFFER_STORAGE, false);
- rend_buffer_write(renderer, &src_buf, initial_grid, grid_buffer_size, 0);
- rend_buffer_write(renderer, &dst_buf, initial_grid, grid_buffer_size, 0);
-
- uint64_t particles_address = rend_buffer_address(&particle_buf);
-
- RendBuffer *src_grid = &src_buf;
- RendBuffer *dst_grid = &dst_buf;
-
- RendPushConstantInfo pc = { .offset = 0, .size = sizeof(PushConstants) };
- RendPipeline particle_compute = rend_pipeline_create_compute_spirv(renderer, particles_shader, particles_bytes, &pc, 1);
- RendPipeline sand_compute = rend_pipeline_create_compute_spirv(renderer, sand_shader, sand_bytes, &pc, 1);
- free(particles_shader);
- free(sand_shader);
-
- RendPipeline graphics_pipeline = rend_pipeline_create_graphics_bindless_spirv(renderer, vert, vert_size, frag, frag_size, &pc, 1, REND_POLYGON_MODE_FILL, REND_CULL_MODE_NONE, REND_TOPOLOGY_TRIANGLE_LIST, 0, true);
-
- free(vert);
- free(frag);
-
- float dt = 1.0f / 60.0f;
- uint64_t dt_ns = (uint64_t) (dt * NANOS_PER_SEC);
-
- uint32_t mode = 2;
- while (mode > 0) {
-
- uint64_t start = p_get_time();
-
- P_Event ev;
- while (p_window_poll_event(&win, &ev)) {
- if (ev.type == P_EVENT_WINDOW_CLOSE) {
- mode -= 1;
- break;
- }
- }
-
- if (rend_renderer_frame_begin(renderer)) {
-
- PushConstants pc = {0};
-
- if (mode == 2) {
- /*
- * Sand Simulation
- */
- pc.delta_time = dt;
- pc.width = GRID_WIDTH;
- pc.height = GRID_HEIGHT;
- pc.render_mode = 1;
- pc.src_grid = src_grid->gpu_address;
- pc.dst_grid = dst_grid->gpu_address;
-
- rend_pipeline_bind(sand_compute);
- rend_pipeline_push_constants(sand_compute, &pc, sizeof(pc));
-
- uint32_t x = (GRID_WIDTH + 15) / 16;
- uint32_t y = (GRID_HEIGHT + 15) / 16;
- rend_pipeline_dispatch(sand_compute, x, y, 1);
-
- RendBuffer *temp = src_grid;
- src_grid = dst_grid;
- dst_grid = temp;
-
- memset(src_grid->mapped_memory, 0, grid_buffer_size);
-
- } else {
- /*
- * Particles Simulation
- */
- pc.particles = particles_address;
- pc.delta_time = dt;
- pc.particle_count = PARTICLE_COUNT;
- pc.render_mode = 0;
-
- rend_pipeline_bind(particle_compute);
- rend_pipeline_push_constants(particle_compute, &pc, sizeof(pc));
- rend_pipeline_dispatch(particle_compute, (PARTICLE_COUNT + 255) / 256, 1, 1);
- }
-
- rend_renderer_render_pass_begin(renderer, 0.5f, 0.5f, 0.5f, 0.0f); {
- rend_pipeline_bind(graphics_pipeline);
- rend_pipeline_push_constants(graphics_pipeline, &pc, sizeof(pc));
-
- uint32_t vertex_count = (mode == 2) ? (6 * GRID_WIDTH * GRID_HEIGHT) : (6 * PARTICLE_COUNT);
- rend_pipeline_draw(graphics_pipeline, vertex_count, 1);
-
- } rend_renderer_render_pass_end(renderer);
-
- rend_renderer_frame_end(renderer, NULL);
- }
-
- uint64_t delta_ns = p_get_time() - start;
- if (delta_ns < dt_ns) {
- p_sleep_ns(dt_ns - delta_ns);
- }
- }
-
- free(initial_particles);
- free(initial_grid);
-
- rend_buffer_destroy(&particle_buf);
- rend_buffer_destroy(&src_buf);
- rend_buffer_destroy(&dst_buf);
-
- rend_renderer_destroy(renderer);
- rend_quit();
-
- p_window_close(&win);
-
-#if DEBUG_MEMORY
- p_debug_memory_report();
-#endif
- return 0;
-}
diff --git a/Rend/demos/rend_compute.slang b/Rend/demos/rend_compute.slang
deleted file mode 100644
index 5fb124b..0000000
--- a/Rend/demos/rend_compute.slang
+++ /dev/null
@@ -1,146 +0,0 @@
-struct Particle {
- float2 position;
- float2 velocity;
-};
-
-struct PushConstants {
- Particle* particles;
- uint* srcGrid;
- uint* dstGrid;
- uint particleCount;
- uint width;
- uint height;
- float deltaTime;
- uint renderMode; // 0 = particles, 1 = sand
-};
-
-struct VSOutput {
- float4 position : SV_Position;
- float4 color : COLOR0;
-};
-
-[[vk::push_constant]]
-PushConstants pc;
-
-uint getIndex(uint x, uint y) {
- return y * pc.width + x;
-}
-
-bool isEmpty(uint x, uint y) {
- if (x >= pc.width || y >= pc.height) return false;
- return pc.srcGrid[getIndex(x, y)] == 0;
-}
-
-[shader("compute")]
-[numthreads(256, 1, 1)]
-void particleMain(uint3 threadId : SV_DispatchThreadID) {
- uint index = threadId.x;
- if (index >= pc.particleCount) return;
-
- Particle p = pc.particles[index];
-
- p.position += p.velocity * pc.deltaTime;
- p.velocity *= exp(-0.005 * pc.deltaTime);
-
- pc.particles[index] = p;
-}
-
-[shader("compute")]
-[numthreads(16, 16, 1)]
-void sandMain(uint3 threadId : SV_DispatchThreadID) {
- uint x = threadId.x;
- uint y = threadId.y;
-
- if (x >= pc.width || y >= pc.height) return;
-
- uint currentIdx = getIndex(x, y);
- uint cellState = pc.srcGrid[currentIdx];
-
- if (cellState == 1) { // Sand
- if (y + 1 < pc.height && isEmpty(x, y + 1)) {
- pc.dstGrid[getIndex(x, y + 1)] = 1;
- pc.dstGrid[currentIdx] = 0;
- return;
- }
-
- bool fallLeftFirst = ((x + y) % 2) == 0;
- int dir1 = fallLeftFirst ? -1 : 1;
- int dir2 = fallLeftFirst ? 1 : -1;
-
- if (y + 1 < pc.height && isEmpty(x + dir1, y + 1)) {
- pc.dstGrid[getIndex(x + dir1, y + 1)] = 1;
- pc.dstGrid[currentIdx] = 0;
- return;
- }
- else if (y + 1 < pc.height && isEmpty(x + dir2, y + 1)) {
- pc.dstGrid[getIndex(x + dir2, y + 1)] = 1;
- pc.dstGrid[currentIdx] = 0;
- return;
- }
-
- pc.dstGrid[currentIdx] = 1;
- }
-}
-
-static const float2 QUAD_OFFSETS[6] = {
- float2(-0.5, -0.5), float2( 0.5, -0.5), float2(-0.5, 0.5),
- float2(-0.5, 0.5), float2( 0.5, -0.5), float2( 0.5, 0.5)
-};
-
-float3 cosinePalette(float t, float3 a, float3 b, float3 c, float3 d) {
- return a + b * cos(6.28318 * (c * t + d));
-}
-
-[shader("vertex")]
-VSOutput vertMain(uint vertexID : SV_VertexID) {
- VSOutput output;
-
- uint elementIdx = vertexID / 6;
- uint cornerIdx = vertexID % 6;
-
- float2 worldPos = float2(0.0, 0.0);
- float3 color = float3(0.0, 0.0, 0.0);
-
- if (pc.renderMode == 0) {
- Particle p = pc.particles[elementIdx];
- worldPos = p.position;
-
- float speed = length(p.velocity);
- color = cosinePalette(
- speed * 0.8,
- float3(0.5, 0.5, 0.5),
- float3(0.5, 0.5, 0.5),
- float3(1.0, 1.0, 1.0),
- float3(0.0, 0.33, 0.67)
- );
- }
-
- else {
- uint x = elementIdx % pc.width;
- uint y = elementIdx / pc.width;
-
- uint cellState = pc.srcGrid[elementIdx];
-
- if (cellState == 0) {
- output.position = float4(0, 0, 0, 0);
- output.color = float4(0, 0, 0, 0);
- return output;
- }
-
- worldPos.x = ((float)x / (float)pc.width) * 2.0 - 1.0;
- worldPos.y = ((float)y / (float)pc.height) * 2.0 - 1.0;
-
- color = float3(0.94, 0.82, 0.53);
- }
-
- float2 quadOffset = QUAD_OFFSETS[cornerIdx] * 0.01;
- output.position = float4(worldPos + quadOffset, 0.0, 1.0);
- output.color = float4(color, 1.0);
-
- return output;
-}
-
-[shader("fragment")]
-float4 fragMain(VSOutput input) : SV_Target {
- return input.color;
-}
diff --git a/Rend/demos/rend_teapot.c b/Rend/demos/rend_teapot.c
deleted file mode 100644
index 63f96ee..0000000
--- a/Rend/demos/rend_teapot.c
+++ /dev/null
@@ -1,172 +0,0 @@
-
-#include "teapot.h"
-
-#include "../rend.h"
-#include "../rend.c"
-#include <stddef.h>
-
-#define PODIUM_IMPLEMENTATION
-#define P_MODULE_MATH
-#define P_MODULE_VULKAN
-#include "podium.h"
-
-int main() {
-
- const char *texture_path = "wal.jpg";
- if (!p_file_exists(texture_path)) {
- texture_path = "demos/wal.jpg";
- }
- typedef struct CoolPushConstants {
- P_Mat4 MVP;
- } CoolPushConstants;
-
- typedef struct CoolVertex {
- float pos[3];
- float uv[2];
- } CoolVertex;
-
- CoolVertex cool_array[TEAPOT_VERTEX_COUNT];
-
- for (uint32_t i = 0; i < TEAPOT_VERTEX_COUNT; ++i) {
- cool_array[i].pos[0] = teapot_positions[i][0];
- cool_array[i].pos[1] = teapot_positions[i][1];
- cool_array[i].pos[2] = teapot_positions[i][2];
-
- float u = teapot_positions[i][0] / teapot_positions[i][2];
- float v = teapot_positions[i][1] / teapot_positions[i][2];
-
- cool_array[i].uv[0] = u;
- cool_array[i].uv[1] = v;
- }
-
- size_t vert_size = TEAPOT_VERTEX_COUNT * sizeof *cool_array;
- size_t ind_size = TEAPOT_INDEX_COUNT * sizeof *teapot_indices;
-
- RendBuffer vert_buf = rend_buffer_create(renderer, vert_size, REND_BUFFER_VERTEX, true);
- RendBuffer ind_buf = rend_buffer_create(renderer, ind_size, REND_BUFFER_INDEX, true);
- rend_buffer_write(renderer, &vert_buf, cool_array, vert_size, 0);
- rend_buffer_write(renderer, &ind_buf, teapot_indices, ind_size, 0);
-
- int tex_w, tex_h, tex_channels;
- unsigned char *pixels = stbi_load(texture_path, &tex_w, &tex_h, &tex_channels, 4);
- RendTexture texture = rend_texture_create(renderer, tex_w, tex_h, 1, 0, 1, REND_FORMAT_R8G8B8A8_SRGB);
- if (pixels) {
- rend_texture_copy_data(renderer, &texture, pixels, (size_t)tex_w * tex_h * 4);
- stbi_image_free(pixels);
- }
-
- RendPipeline basic_pipeline = rend_pipeline_create_graphics_spirv(
- renderer,
- basic_vert, basic_vert_bytes,
- basic_frag, basic_frag_bytes,
- &(RendVertexBinding){ .binding = 0, .stride = sizeof(CoolVertex), .input_rate = REND_INPUT_RATE_VERTEX }, 1,
- (RendVertexAttributes[]){
- { .binding = 0, .location = 0, .format = REND_FORMAT_3_SFLOAT32, .offset = offsetof(CoolVertex, pos) },
- { .binding = 0, .location = 1, .format = REND_FORMAT_2_SFLOAT32, .offset = offsetof(CoolVertex, uv) }
- }, 2,
- &(RendPushConstantInfo){ .offset = 0, .size = sizeof(CoolPushConstants) }, 1,
- REND_POLYGON_MODE_FILL,
- REND_CULL_MODE_NONE,
- REND_TOPOLOGY_TRIANGLE_STRIP,
- REND_FORMAT_UNDEFINED,
- true
- );
-
- P_Mat4 view = p_mat4_translate((Vec3f){0.0f, 0.0f, -3.0f});
- P_Mat4 proj = p_mat4_perspective(P_PI_HALF, 800.0f / 600.0f, 0.1f, 100.0f);
- proj.m[1 * 4 + 1] *= -1.0f; /* Vulkan clip space Y inversion fix */
-
- bool running = true;
- uint64_t frame_count = 0;
- float angle = 0;
-
- bool pointer_down = false;
- uint32_t last_pointer_x = 0;
- uint32_t last_pointer_y = 0;
-
- uint16_t frames = 3;
- while (running) {
-
- P_Event ev;
- while (p_window_poll_event(win, &ev)) {
- if (ev.type == P_EVENT_WINDOW_CLOSE) {
- running = false;
- break;
- }
- if (ev.type == P_EVENT_KEY_DOWN) {
- switch (ev.key.key) {
- case P_KEY_W:
- view = p_mat4_translate_by(view, (Vec3f){0.0f, 0.0f, 0.1f});
- break;
- case P_KEY_S:
- view = p_mat4_translate_by(view, (Vec3f){0.0f, 0.0f, -0.1f});
- break;
- case P_KEY_A:
- view = p_mat4_translate_by(view, (Vec3f){0.1f, 0.0f, 0.0f});
- break;
- case P_KEY_D:
- view = p_mat4_translate_by(view, (Vec3f){-0.1f, 0.0f, 0.0f});
- break;
-
- }
- break;
- }
- if (ev.type == P_EVENT_POINTER) {
- if (ev.pointer.state == P_POINTER_PRESSED && ev.pointer.button == 1) {
- pointer_down = true;
- last_pointer_x = ev.pointer.x;
- last_pointer_y = ev.pointer.y;
- } else if (ev.pointer.state == P_POINTER_RELEASED && ev.pointer.button == 1) {
- pointer_down = false;
- } else if (ev.pointer.state == P_POINTER_MOVED) {
- if (pointer_down) {
- float dx = (float)((int)ev.pointer.x - (int)last_pointer_x);
- float dy = (float)((int)ev.pointer.y - (int)last_pointer_y);
-
- float sensitivity = 0.005f;
- float yaw = dx * sensitivity;
- float pitch = dy * sensitivity;
-
- view = p_mat4_rotate_y_by(view, yaw);
- view = p_mat4_mul(p_mat4_rotate_x(pitch), view);
-
- last_pointer_x = ev.pointer.x;
- last_pointer_y = ev.pointer.y;
- }
- }
- }
- }
-
- angle += 0.05;
-
- P_Mat4 model = p_mat4_identity();
- model = p_mat4_rotate_y_by(model, angle * 0.5f);
-
- P_Mat4 mvp = p_mat4_mul(proj, p_mat4_mul(view, model));
-
- CoolPushConstants pc = {
- .MVP = mvp,
- };
-
- if (rend_renderer_frame_begin(renderer)) {
-
- rend_renderer_render_pass_begin(renderer, 0.5, 0.5, 0.5, 0.0); {
- rend_pipeline_bind(basic_pipeline);
- rend_pipeline_push_constants(basic_pipeline, &pc, sizeof pc);
- rend_pipeline_bind_texture(basic_pipeline, &texture, 1, 0);
- rend_pipeline_bind_vertex_buffer(basic_pipeline, 0, vert_buf, 0);
- rend_pipeline_bind_index_buffer(basic_pipeline, ind_buf, 0, REND_INDEX_UINT16);
- rend_pipeline_draw_indexed(basic_pipeline, TEAPOT_INDEX_COUNT, 0, 0, 1);
- } rend_renderer_render_pass_end(renderer);
-
- rend_renderer_frame_end(renderer, NULL);
- }
-
- }
-
- rend_texture_destroy(renderer, &texture);
- rend_buffer_destroy(&vert_buf);
- rend_buffer_destroy(&ind_buf);
-
- return 0;
-}
diff --git a/Rend/demos/teapot.h b/Rend/demos/teapot.h
deleted file mode 100644
index dfde9be..0000000
--- a/Rend/demos/teapot.h
+++ /dev/null
@@ -1,17273 +0,0 @@
-#ifndef TEAPOT_H
-#define TEAPOT_H
-
-#include <stdint.h>
-
-#define TEAPOT_VERTEX_COUNT 3644
-#define TEAPOT_INDEX_COUNT 18960
-
-static const float teapot_positions[TEAPOT_VERTEX_COUNT][3] = {
- {1.368074f, 2.435437f, -0.227403f},
- {1.381968f, 2.400000f, -0.229712f},
- {1.400000f, 2.400000f, 0.000000f},
- {1.385925f, 2.435437f, 0.000000f},
- {1.316296f, 2.435437f, -0.442166f},
- {1.329664f, 2.400000f, -0.446656f},
- {1.233252f, 2.435437f, -0.641628f},
- {1.245776f, 2.400000f, -0.648144f},
- {1.121601f, 2.435437f, -0.823129f},
- {1.132992f, 2.400000f, -0.831488f},
- {0.984007f, 2.435437f, -0.984007f},
- {0.994000f, 2.400000f, -0.994000f},
- {0.823129f, 2.435437f, -1.121601f},
- {0.831488f, 2.400000f, -1.132992f},
- {0.641628f, 2.435437f, -1.233252f},
- {0.648144f, 2.400000f, -1.245776f},
- {0.442166f, 2.435437f, -1.316296f},
- {0.446656f, 2.400000f, -1.329664f},
- {0.227403f, 2.435437f, -1.368074f},
- {0.229712f, 2.400000f, -1.381968f},
- {-0.000000f, 2.435437f, -1.385925f},
- {0.000000f, 2.400000f, -1.400000f},
- {1.362620f, 2.463000f, -0.226496f},
- {1.380400f, 2.463000f, 0.000000f},
- {1.311049f, 2.463000f, -0.440403f},
- {1.228335f, 2.463000f, -0.639070f},
- {1.117130f, 2.463000f, -0.819847f},
- {0.980084f, 2.463000f, -0.980084f},
- {0.819847f, 2.463000f, -1.117130f},
- {0.639070f, 2.463000f, -1.228335f},
- {0.440403f, 2.463000f, -1.311049f},
- {0.226496f, 2.463000f, -1.362620f},
- {-0.000000f, 2.463000f, -1.380400f},
- {1.364422f, 2.482687f, -0.226795f},
- {1.382225f, 2.482687f, 0.000000f},
- {1.312782f, 2.482687f, -0.440985f},
- {1.229959f, 2.482687f, -0.639915f},
- {1.118607f, 2.482687f, -0.820931f},
- {0.981380f, 2.482687f, -0.981380f},
- {0.820931f, 2.482687f, -1.118607f},
- {0.639915f, 2.482687f, -1.229959f},
- {0.440985f, 2.482687f, -1.312782f},
- {0.226795f, 2.482687f, -1.364422f},
- {0.000000f, 2.482687f, -1.382225f},
- {1.372294f, 2.494500f, -0.228104f},
- {1.390200f, 2.494500f, 0.000000f},
- {1.320356f, 2.494500f, -0.443529f},
- {1.237056f, 2.494500f, -0.643607f},
- {1.125061f, 2.494500f, -0.825668f},
- {0.987042f, 2.494500f, -0.987042f},
- {0.825668f, 2.494500f, -1.125061f},
- {0.643607f, 2.494500f, -1.237056f},
- {0.443529f, 2.494500f, -1.320356f},
- {0.228104f, 2.494500f, -1.372294f},
- {-0.000000f, 2.494500f, -1.390200f},
- {1.385053f, 2.498438f, -0.230225f},
- {1.403125f, 2.498438f, 0.000000f},
- {1.332632f, 2.498438f, -0.447653f},
- {1.248557f, 2.498438f, -0.649591f},
- {1.135521f, 2.498438f, -0.833344f},
- {0.996219f, 2.498438f, -0.996219f},
- {0.833344f, 2.498438f, -1.135521f},
- {0.649591f, 2.498438f, -1.248557f},
- {0.447653f, 2.498438f, -1.332632f},
- {0.230225f, 2.498438f, -1.385053f},
- {0.000000f, 2.498438f, -1.403125f},
- {1.401513f, 2.494500f, -0.232961f},
- {1.419800f, 2.494500f, 0.000000f},
- {1.348469f, 2.494500f, -0.452973f},
- {1.263395f, 2.494500f, -0.657311f},
- {1.149016f, 2.494500f, -0.843248f},
- {1.008058f, 2.494500f, -1.008058f},
- {0.843248f, 2.494500f, -1.149016f},
- {0.657311f, 2.494500f, -1.263395f},
- {0.452973f, 2.494500f, -1.348469f},
- {0.232961f, 2.494500f, -1.401513f},
- {-0.000000f, 2.494500f, -1.419800f},
- {1.420490f, 2.482687f, -0.236115f},
- {1.439025f, 2.482687f, 0.000000f},
- {1.366728f, 2.482687f, -0.459107f},
- {1.280502f, 2.482687f, -0.666211f},
- {1.164574f, 2.482687f, -0.854666f},
- {1.021708f, 2.482687f, -1.021708f},
- {0.854666f, 2.482687f, -1.164574f},
- {0.666211f, 2.482687f, -1.280502f},
- {0.459107f, 2.482687f, -1.366728f},
- {0.236115f, 2.482687f, -1.420490f},
- {0.000000f, 2.482687f, -1.439025f},
- {1.440800f, 2.463000f, -0.239491f},
- {1.459600f, 2.463000f, 0.000000f},
- {1.386270f, 2.463000f, -0.465671f},
- {1.298810f, 2.463000f, -0.675736f},
- {1.181225f, 2.463000f, -0.866886f},
- {1.036316f, 2.463000f, -1.036316f},
- {0.866886f, 2.463000f, -1.181225f},
- {0.675736f, 2.463000f, -1.298810f},
- {0.465671f, 2.463000f, -1.386270f},
- {0.239491f, 2.463000f, -1.440800f},
- {-0.000000f, 2.463000f, -1.459600f},
- {1.461258f, 2.435437f, -0.242892f},
- {1.480325f, 2.435437f, 0.000000f},
- {1.405953f, 2.435437f, -0.472283f},
- {1.317252f, 2.435437f, -0.685331f},
- {1.197997f, 2.435437f, -0.879195f},
- {1.051031f, 2.435437f, -1.051031f},
- {0.879195f, 2.435437f, -1.197997f},
- {0.685331f, 2.435437f, -1.317252f},
- {0.472283f, 2.435437f, -1.405953f},
- {0.242892f, 2.435437f, -1.461258f},
- {-0.000000f, 2.435437f, -1.480325f},
- {1.480680f, 2.400000f, -0.246120f},
- {1.500000f, 2.400000f, 0.000000f},
- {1.424640f, 2.400000f, -0.478560f},
- {1.334760f, 2.400000f, -0.694440f},
- {1.213920f, 2.400000f, -0.890880f},
- {1.065000f, 2.400000f, -1.065000f},
- {0.890880f, 2.400000f, -1.213920f},
- {0.694440f, 2.400000f, -1.334760f},
- {0.478560f, 2.400000f, -1.424640f},
- {0.246120f, 2.400000f, -1.480680f},
- {0.000000f, 2.400000f, -1.500000f},
- {-0.227403f, 2.435437f, -1.368074f},
- {-0.229712f, 2.400000f, -1.381968f},
- {0.000000f, 2.400000f, -1.400000f},
- {0.000000f, 2.435437f, -1.385925f},
- {-0.442166f, 2.435437f, -1.316296f},
- {-0.446656f, 2.400000f, -1.329664f},
- {-0.641628f, 2.435437f, -1.233252f},
- {-0.648144f, 2.400000f, -1.245776f},
- {-0.823129f, 2.435437f, -1.121601f},
- {-0.831488f, 2.400000f, -1.132992f},
- {-0.984007f, 2.435437f, -0.984007f},
- {-0.994000f, 2.400000f, -0.994000f},
- {-1.121601f, 2.435437f, -0.823129f},
- {-1.132992f, 2.400000f, -0.831488f},
- {-1.233252f, 2.435437f, -0.641628f},
- {-1.245776f, 2.400000f, -0.648144f},
- {-1.316296f, 2.435437f, -0.442166f},
- {-1.329664f, 2.400000f, -0.446656f},
- {-1.368074f, 2.435437f, -0.227403f},
- {-1.381968f, 2.400000f, -0.229712f},
- {-1.385925f, 2.435437f, 0.000000f},
- {-1.400000f, 2.400000f, 0.000000f},
- {-0.226496f, 2.463000f, -1.362620f},
- {0.000000f, 2.463000f, -1.380400f},
- {-0.440403f, 2.463000f, -1.311049f},
- {-0.639070f, 2.463000f, -1.228335f},
- {-0.819847f, 2.463000f, -1.117130f},
- {-0.980084f, 2.463000f, -0.980084f},
- {-1.117130f, 2.463000f, -0.819847f},
- {-1.228335f, 2.463000f, -0.639070f},
- {-1.311049f, 2.463000f, -0.440403f},
- {-1.362620f, 2.463000f, -0.226496f},
- {-1.380400f, 2.463000f, 0.000000f},
- {-0.226795f, 2.482687f, -1.364422f},
- {0.000000f, 2.482687f, -1.382225f},
- {-0.440985f, 2.482687f, -1.312782f},
- {-0.639915f, 2.482687f, -1.229959f},
- {-0.820931f, 2.482687f, -1.118607f},
- {-0.981380f, 2.482687f, -0.981380f},
- {-1.118607f, 2.482687f, -0.820931f},
- {-1.229959f, 2.482687f, -0.639915f},
- {-1.312782f, 2.482687f, -0.440985f},
- {-1.364422f, 2.482687f, -0.226795f},
- {-1.382225f, 2.482687f, -0.000000f},
- {-0.228104f, 2.494500f, -1.372294f},
- {0.000000f, 2.494500f, -1.390200f},
- {-0.443529f, 2.494500f, -1.320356f},
- {-0.643607f, 2.494500f, -1.237056f},
- {-0.825668f, 2.494500f, -1.125061f},
- {-0.987042f, 2.494500f, -0.987042f},
- {-1.125061f, 2.494500f, -0.825668f},
- {-1.237056f, 2.494500f, -0.643607f},
- {-1.320356f, 2.494500f, -0.443529f},
- {-1.372294f, 2.494500f, -0.228104f},
- {-1.390200f, 2.494500f, 0.000000f},
- {-0.230225f, 2.498438f, -1.385053f},
- {0.000000f, 2.498438f, -1.403125f},
- {-0.447653f, 2.498438f, -1.332632f},
- {-0.649591f, 2.498438f, -1.248557f},
- {-0.833344f, 2.498438f, -1.135521f},
- {-0.996219f, 2.498438f, -0.996219f},
- {-1.135521f, 2.498438f, -0.833344f},
- {-1.248557f, 2.498438f, -0.649591f},
- {-1.332632f, 2.498438f, -0.447653f},
- {-1.385053f, 2.498438f, -0.230225f},
- {-1.403125f, 2.498438f, 0.000000f},
- {-0.232961f, 2.494500f, -1.401513f},
- {0.000000f, 2.494500f, -1.419800f},
- {-0.452973f, 2.494500f, -1.348469f},
- {-0.657311f, 2.494500f, -1.263395f},
- {-0.843248f, 2.494500f, -1.149016f},
- {-1.008058f, 2.494500f, -1.008058f},
- {-1.149016f, 2.494500f, -0.843248f},
- {-1.263395f, 2.494500f, -0.657311f},
- {-1.348469f, 2.494500f, -0.452973f},
- {-1.401513f, 2.494500f, -0.232961f},
- {-1.419800f, 2.494500f, 0.000000f},
- {-0.236115f, 2.482687f, -1.420490f},
- {-0.459107f, 2.482687f, -1.366728f},
- {-0.666211f, 2.482687f, -1.280502f},
- {-0.854666f, 2.482687f, -1.164574f},
- {-1.021708f, 2.482687f, -1.021708f},
- {-1.164574f, 2.482687f, -0.854666f},
- {-1.280502f, 2.482687f, -0.666211f},
- {-1.366728f, 2.482687f, -0.459107f},
- {-1.420490f, 2.482687f, -0.236115f},
- {-1.439025f, 2.482687f, 0.000000f},
- {-0.239491f, 2.463000f, -1.440800f},
- {0.000000f, 2.463000f, -1.459600f},
- {-0.465671f, 2.463000f, -1.386270f},
- {-0.675736f, 2.463000f, -1.298810f},
- {-0.866886f, 2.463000f, -1.181225f},
- {-1.036316f, 2.463000f, -1.036316f},
- {-1.181225f, 2.463000f, -0.866886f},
- {-1.298810f, 2.463000f, -0.675736f},
- {-1.386270f, 2.463000f, -0.465671f},
- {-1.440800f, 2.463000f, -0.239491f},
- {-1.459600f, 2.463000f, 0.000000f},
- {-0.242892f, 2.435437f, -1.461258f},
- {0.000000f, 2.435437f, -1.480325f},
- {-0.472283f, 2.435437f, -1.405953f},
- {-0.685331f, 2.435437f, -1.317252f},
- {-0.879195f, 2.435437f, -1.197997f},
- {-1.051031f, 2.435437f, -1.051031f},
- {-1.197997f, 2.435437f, -0.879195f},
- {-1.317252f, 2.435437f, -0.685331f},
- {-1.405953f, 2.435437f, -0.472283f},
- {-1.461258f, 2.435437f, -0.242892f},
- {-1.480325f, 2.435437f, 0.000000f},
- {-0.246120f, 2.400000f, -1.480680f},
- {0.000000f, 2.400000f, -1.500000f},
- {-0.478560f, 2.400000f, -1.424640f},
- {-0.694440f, 2.400000f, -1.334760f},
- {-0.890880f, 2.400000f, -1.213920f},
- {-1.065000f, 2.400000f, -1.065000f},
- {-1.213920f, 2.400000f, -0.890880f},
- {-1.334760f, 2.400000f, -0.694440f},
- {-1.424640f, 2.400000f, -0.478560f},
- {-1.480680f, 2.400000f, -0.246120f},
- {-1.500000f, 2.400000f, 0.000000f},
- {-1.368074f, 2.435437f, 0.227403f},
- {-1.381968f, 2.400000f, 0.229712f},
- {-1.400000f, 2.400000f, 0.000000f},
- {-1.385925f, 2.435437f, 0.000000f},
- {-1.316296f, 2.435437f, 0.442166f},
- {-1.329664f, 2.400000f, 0.446656f},
- {-1.233252f, 2.435437f, 0.641628f},
- {-1.245776f, 2.400000f, 0.648144f},
- {-1.121601f, 2.435437f, 0.823129f},
- {-1.132992f, 2.400000f, 0.831488f},
- {-0.984007f, 2.435437f, 0.984007f},
- {-0.994000f, 2.400000f, 0.994000f},
- {-0.823129f, 2.435437f, 1.121601f},
- {-0.831488f, 2.400000f, 1.132992f},
- {-0.641628f, 2.435437f, 1.233252f},
- {-0.648144f, 2.400000f, 1.245776f},
- {-0.442166f, 2.435437f, 1.316296f},
- {-0.446656f, 2.400000f, 1.329664f},
- {-0.227403f, 2.435437f, 1.368074f},
- {-0.229712f, 2.400000f, 1.381968f},
- {0.000000f, 2.435437f, 1.385925f},
- {0.000000f, 2.400000f, 1.400000f},
- {-1.362620f, 2.463000f, 0.226496f},
- {-1.380400f, 2.463000f, 0.000000f},
- {-1.311049f, 2.463000f, 0.440403f},
- {-1.228335f, 2.463000f, 0.639070f},
- {-1.117130f, 2.463000f, 0.819847f},
- {-0.980084f, 2.463000f, 0.980084f},
- {-0.819847f, 2.463000f, 1.117130f},
- {-0.639070f, 2.463000f, 1.228335f},
- {-0.440403f, 2.463000f, 1.311049f},
- {-0.226496f, 2.463000f, 1.362620f},
- {0.000000f, 2.463000f, 1.380400f},
- {-1.364422f, 2.482687f, 0.226795f},
- {-1.382225f, 2.482687f, 0.000000f},
- {-1.312782f, 2.482687f, 0.440985f},
- {-1.229959f, 2.482687f, 0.639915f},
- {-1.118607f, 2.482687f, 0.820931f},
- {-0.981380f, 2.482687f, 0.981380f},
- {-0.820931f, 2.482687f, 1.118607f},
- {-0.639915f, 2.482687f, 1.229959f},
- {-0.440985f, 2.482687f, 1.312782f},
- {-0.226795f, 2.482687f, 1.364422f},
- {-0.000000f, 2.482687f, 1.382225f},
- {-1.372294f, 2.494500f, 0.228104f},
- {-1.390200f, 2.494500f, 0.000000f},
- {-1.320356f, 2.494500f, 0.443529f},
- {-1.237056f, 2.494500f, 0.643607f},
- {-1.125061f, 2.494500f, 0.825668f},
- {-0.987042f, 2.494500f, 0.987042f},
- {-0.825668f, 2.494500f, 1.125061f},
- {-0.643607f, 2.494500f, 1.237056f},
- {-0.443529f, 2.494500f, 1.320356f},
- {-0.228104f, 2.494500f, 1.372294f},
- {0.000000f, 2.494500f, 1.390200f},
- {-1.385053f, 2.498438f, 0.230225f},
- {-1.403125f, 2.498438f, 0.000000f},
- {-1.332632f, 2.498438f, 0.447653f},
- {-1.248557f, 2.498438f, 0.649591f},
- {-1.135521f, 2.498438f, 0.833344f},
- {-0.996219f, 2.498438f, 0.996219f},
- {-0.833344f, 2.498438f, 1.135521f},
- {-0.649591f, 2.498438f, 1.248557f},
- {-0.447653f, 2.498438f, 1.332632f},
- {-0.230225f, 2.498438f, 1.385053f},
- {0.000000f, 2.498438f, 1.403125f},
- {-1.401513f, 2.494500f, 0.232961f},
- {-1.419800f, 2.494500f, 0.000000f},
- {-1.348469f, 2.494500f, 0.452973f},
- {-1.263395f, 2.494500f, 0.657311f},
- {-1.149016f, 2.494500f, 0.843248f},
- {-1.008058f, 2.494500f, 1.008058f},
- {-0.843248f, 2.494500f, 1.149016f},
- {-0.657311f, 2.494500f, 1.263395f},
- {-0.452973f, 2.494500f, 1.348469f},
- {-0.232961f, 2.494500f, 1.401513f},
- {0.000000f, 2.494500f, 1.419800f},
- {-1.420490f, 2.482687f, 0.236115f},
- {-1.366728f, 2.482687f, 0.459107f},
- {-1.280502f, 2.482687f, 0.666211f},
- {-1.164574f, 2.482687f, 0.854666f},
- {-1.021708f, 2.482687f, 1.021708f},
- {-0.854666f, 2.482687f, 1.164574f},
- {-0.666211f, 2.482687f, 1.280502f},
- {-0.459107f, 2.482687f, 1.366728f},
- {-0.236115f, 2.482687f, 1.420490f},
- {0.000000f, 2.482687f, 1.439025f},
- {-1.440800f, 2.463000f, 0.239491f},
- {-1.459600f, 2.463000f, 0.000000f},
- {-1.386270f, 2.463000f, 0.465671f},
- {-1.298810f, 2.463000f, 0.675736f},
- {-1.181225f, 2.463000f, 0.866886f},
- {-1.036316f, 2.463000f, 1.036316f},
- {-0.866886f, 2.463000f, 1.181225f},
- {-0.675736f, 2.463000f, 1.298810f},
- {-0.465671f, 2.463000f, 1.386270f},
- {-0.239491f, 2.463000f, 1.440800f},
- {0.000000f, 2.463000f, 1.459600f},
- {-1.461258f, 2.435437f, 0.242892f},
- {-1.480325f, 2.435437f, 0.000000f},
- {-1.405953f, 2.435437f, 0.472283f},
- {-1.317252f, 2.435437f, 0.685331f},
- {-1.197997f, 2.435437f, 0.879195f},
- {-1.051031f, 2.435437f, 1.051031f},
- {-0.879195f, 2.435437f, 1.197997f},
- {-0.685331f, 2.435437f, 1.317252f},
- {-0.472283f, 2.435437f, 1.405953f},
- {-0.242892f, 2.435437f, 1.461258f},
- {0.000000f, 2.435437f, 1.480325f},
- {-1.480680f, 2.400000f, 0.246120f},
- {-1.500000f, 2.400000f, 0.000000f},
- {-1.424640f, 2.400000f, 0.478560f},
- {-1.334760f, 2.400000f, 0.694440f},
- {-1.213920f, 2.400000f, 0.890880f},
- {-1.065000f, 2.400000f, 1.065000f},
- {-0.890880f, 2.400000f, 1.213920f},
- {-0.694440f, 2.400000f, 1.334760f},
- {-0.478560f, 2.400000f, 1.424640f},
- {-0.246120f, 2.400000f, 1.480680f},
- {0.000000f, 2.400000f, 1.500000f},
- {0.227403f, 2.435437f, 1.368074f},
- {0.229712f, 2.400000f, 1.381968f},
- {0.000000f, 2.400000f, 1.400000f},
- {0.000000f, 2.435437f, 1.385925f},
- {0.442166f, 2.435437f, 1.316296f},
- {0.446656f, 2.400000f, 1.329664f},
- {0.641628f, 2.435437f, 1.233252f},
- {0.648144f, 2.400000f, 1.245776f},
- {0.823129f, 2.435437f, 1.121601f},
- {0.831488f, 2.400000f, 1.132992f},
- {0.984007f, 2.435437f, 0.984007f},
- {0.994000f, 2.400000f, 0.994000f},
- {1.121601f, 2.435437f, 0.823129f},
- {1.132992f, 2.400000f, 0.831488f},
- {1.233252f, 2.435437f, 0.641628f},
- {1.245776f, 2.400000f, 0.648144f},
- {1.316296f, 2.435437f, 0.442166f},
- {1.329664f, 2.400000f, 0.446656f},
- {1.368074f, 2.435437f, 0.227403f},
- {1.381968f, 2.400000f, 0.229712f},
- {1.385925f, 2.435437f, -0.000000f},
- {1.400000f, 2.400000f, 0.000000f},
- {0.226496f, 2.463000f, 1.362620f},
- {0.000000f, 2.463000f, 1.380400f},
- {0.440403f, 2.463000f, 1.311049f},
- {0.639070f, 2.463000f, 1.228335f},
- {0.819847f, 2.463000f, 1.117130f},
- {0.980084f, 2.463000f, 0.980084f},
- {1.117130f, 2.463000f, 0.819847f},
- {1.228335f, 2.463000f, 0.639070f},
- {1.311049f, 2.463000f, 0.440403f},
- {1.362620f, 2.463000f, 0.226496f},
- {1.380400f, 2.463000f, -0.000000f},
- {0.226795f, 2.482687f, 1.364422f},
- {0.000000f, 2.482687f, 1.382225f},
- {0.440985f, 2.482687f, 1.312782f},
- {0.639915f, 2.482687f, 1.229959f},
- {0.820931f, 2.482687f, 1.118607f},
- {0.981380f, 2.482687f, 0.981380f},
- {1.118607f, 2.482687f, 0.820931f},
- {1.229959f, 2.482687f, 0.639915f},
- {1.312782f, 2.482687f, 0.440985f},
- {1.364422f, 2.482687f, 0.226795f},
- {1.382225f, 2.482687f, 0.000000f},
- {0.228104f, 2.494500f, 1.372294f},
- {0.000000f, 2.494500f, 1.390200f},
- {0.443529f, 2.494500f, 1.320356f},
- {0.643607f, 2.494500f, 1.237056f},
- {0.825668f, 2.494500f, 1.125061f},
- {0.987042f, 2.494500f, 0.987042f},
- {1.125061f, 2.494500f, 0.825668f},
- {1.237056f, 2.494500f, 0.643607f},
- {1.320356f, 2.494500f, 0.443529f},
- {1.372294f, 2.494500f, 0.228104f},
- {1.390200f, 2.494500f, -0.000000f},
- {0.230225f, 2.498438f, 1.385053f},
- {0.000000f, 2.498438f, 1.403125f},
- {0.447653f, 2.498438f, 1.332632f},
- {0.649591f, 2.498438f, 1.248557f},
- {0.833344f, 2.498438f, 1.135521f},
- {0.996219f, 2.498438f, 0.996219f},
- {1.135521f, 2.498438f, 0.833344f},
- {1.248557f, 2.498438f, 0.649591f},
- {1.332632f, 2.498438f, 0.447653f},
- {1.385053f, 2.498438f, 0.230225f},
- {1.403125f, 2.498438f, 0.000000f},
- {0.232961f, 2.494500f, 1.401513f},
- {0.000000f, 2.494500f, 1.419800f},
- {0.452973f, 2.494500f, 1.348469f},
- {0.657311f, 2.494500f, 1.263395f},
- {0.843248f, 2.494500f, 1.149016f},
- {1.008058f, 2.494500f, 1.008058f},
- {1.149016f, 2.494500f, 0.843248f},
- {1.263395f, 2.494500f, 0.657311f},
- {1.348469f, 2.494500f, 0.452973f},
- {1.401513f, 2.494500f, 0.232961f},
- {1.419800f, 2.494500f, -0.000000f},
- {0.236115f, 2.482687f, 1.420490f},
- {0.459107f, 2.482687f, 1.366728f},
- {0.666211f, 2.482687f, 1.280502f},
- {0.854666f, 2.482687f, 1.164574f},
- {1.021708f, 2.482687f, 1.021708f},
- {1.164574f, 2.482687f, 0.854666f},
- {1.280502f, 2.482687f, 0.666211f},
- {1.366728f, 2.482687f, 0.459107f},
- {1.420490f, 2.482687f, 0.236115f},
- {0.239491f, 2.463000f, 1.440800f},
- {0.000000f, 2.463000f, 1.459600f},
- {0.465671f, 2.463000f, 1.386270f},
- {0.675736f, 2.463000f, 1.298810f},
- {0.866886f, 2.463000f, 1.181225f},
- {1.036316f, 2.463000f, 1.036316f},
- {1.181225f, 2.463000f, 0.866886f},
- {1.298810f, 2.463000f, 0.675736f},
- {1.386270f, 2.463000f, 0.465671f},
- {1.440800f, 2.463000f, 0.239491f},
- {1.459600f, 2.463000f, -0.000000f},
- {0.242892f, 2.435437f, 1.461258f},
- {0.000000f, 2.435437f, 1.480325f},
- {0.472283f, 2.435437f, 1.405953f},
- {0.685331f, 2.435437f, 1.317252f},
- {0.879195f, 2.435437f, 1.197997f},
- {1.051031f, 2.435437f, 1.051031f},
- {1.197997f, 2.435437f, 0.879195f},
- {1.317252f, 2.435437f, 0.685331f},
- {1.405953f, 2.435437f, 0.472283f},
- {1.461258f, 2.435437f, 0.242892f},
- {1.480325f, 2.435437f, -0.000000f},
- {0.246120f, 2.400000f, 1.480680f},
- {0.000000f, 2.400000f, 1.500000f},
- {0.478560f, 2.400000f, 1.424640f},
- {0.694440f, 2.400000f, 1.334760f},
- {0.890880f, 2.400000f, 1.213920f},
- {1.065000f, 2.400000f, 1.065000f},
- {1.213920f, 2.400000f, 0.890880f},
- {1.334760f, 2.400000f, 0.694440f},
- {1.424640f, 2.400000f, 0.478560f},
- {1.480680f, 2.400000f, 0.246120f},
- {1.500000f, 2.400000f, 0.000000f},
- {1.554467f, 2.242575f, -0.258385f},
- {1.574750f, 2.242575f, 0.000000f},
- {1.495635f, 2.242575f, -0.502408f},
- {1.401276f, 2.242575f, -0.729046f},
- {1.274414f, 2.242575f, -0.935276f},
- {1.118073f, 2.242575f, -1.118073f},
- {0.935276f, 2.242575f, -1.274414f},
- {0.729046f, 2.242575f, -1.401276f},
- {0.502408f, 2.242575f, -1.495635f},
- {0.258385f, 2.242575f, -1.554467f},
- {0.000000f, 2.242575f, -1.574750f},
- {1.626774f, 2.085600f, -0.270404f},
- {1.648000f, 2.085600f, 0.000000f},
- {1.565204f, 2.085600f, -0.525778f},
- {1.466456f, 2.085600f, -0.762958f},
- {1.333693f, 2.085600f, -0.978780f},
- {1.170080f, 2.085600f, -1.170080f},
- {0.978780f, 2.085600f, -1.333693f},
- {0.762958f, 2.085600f, -1.466456f},
- {0.525778f, 2.085600f, -1.565204f},
- {0.270404f, 2.085600f, -1.626774f},
- {-0.000000f, 2.085600f, -1.648000f},
- {1.696119f, 1.929525f, -0.281930f},
- {1.718250f, 1.929525f, 0.000000f},
- {1.631925f, 1.929525f, -0.548190f},
- {1.528968f, 1.929525f, -0.795481f},
- {1.390545f, 1.929525f, -1.020503f},
- {1.219958f, 1.929525f, -1.219958f},
- {1.020503f, 1.929525f, -1.390545f},
- {0.795481f, 1.929525f, -1.528968f},
- {0.548190f, 1.929525f, -1.631925f},
- {0.281930f, 1.929525f, -1.696119f},
- {0.000000f, 1.929525f, -1.718250f},
- {1.761022f, 1.774800f, -0.292719f},
- {1.784000f, 1.774800f, 0.000000f},
- {1.694372f, 1.774800f, -0.569167f},
- {1.587475f, 1.774800f, -0.825921f},
- {1.443756f, 1.774800f, -1.059553f},
- {1.266640f, 1.774800f, -1.266640f},
- {1.059553f, 1.774800f, -1.443756f},
- {0.825921f, 1.774800f, -1.587475f},
- {0.569167f, 1.774800f, -1.694372f},
- {0.292719f, 1.774800f, -1.761022f},
- {0.000000f, 1.774800f, -1.784000f},
- {1.820003f, 1.621875f, -0.302523f},
- {1.843750f, 1.621875f, 0.000000f},
- {1.751120f, 1.621875f, -0.588230f},
- {1.640643f, 1.621875f, -0.853583f},
- {1.492110f, 1.621875f, -1.095040f},
- {1.309063f, 1.621875f, -1.309063f},
- {1.095040f, 1.621875f, -1.492110f},
- {0.853583f, 1.621875f, -1.640643f},
- {0.588230f, 1.621875f, -1.751120f},
- {0.302522f, 1.621875f, -1.820003f},
- {-0.000000f, 1.621875f, -1.843750f},
- {1.871580f, 1.471200f, -0.311096f},
- {1.896000f, 1.471200f, 0.000000f},
- {1.800745f, 1.471200f, -0.604900f},
- {1.687137f, 1.471200f, -0.877772f},
- {1.534395f, 1.471200f, -1.126072f},
- {1.346160f, 1.471200f, -1.346160f},
- {1.126072f, 1.471200f, -1.534395f},
- {0.877772f, 1.471200f, -1.687137f},
- {0.604900f, 1.471200f, -1.800745f},
- {0.311096f, 1.471200f, -1.871580f},
- {0.000000f, 1.471200f, -1.896000f},
- {1.914272f, 1.323225f, -0.318192f},
- {1.939250f, 1.323225f, 0.000000f},
- {1.841822f, 1.323225f, -0.618698f},
- {1.725622f, 1.323225f, -0.897795f},
- {1.569396f, 1.323225f, -1.151759f},
- {1.376867f, 1.323225f, -1.376868f},
- {1.151759f, 1.323225f, -1.569396f},
- {0.897795f, 1.323225f, -1.725622f},
- {0.618698f, 1.323225f, -1.841822f},
- {0.318192f, 1.323225f, -1.914272f},
- {-0.000000f, 1.323225f, -1.939250f},
- {1.946601f, 1.178400f, -0.323566f},
- {1.972000f, 1.178400f, 0.000000f},
- {1.872927f, 1.178400f, -0.629147f},
- {1.754764f, 1.178400f, -0.912957f},
- {1.595900f, 1.178400f, -1.171210f},
- {1.400120f, 1.178400f, -1.400120f},
- {1.171210f, 1.178400f, -1.595900f},
- {0.912957f, 1.178400f, -1.754764f},
- {0.629147f, 1.178400f, -1.872927f},
- {0.323566f, 1.178400f, -1.946601f},
- {0.000000f, 1.178400f, -1.972000f},
- {1.967083f, 1.037175f, -0.326970f},
- {1.992750f, 1.037175f, 0.000000f},
- {1.892634f, 1.037175f, -0.635767f},
- {1.773229f, 1.037175f, -0.922564f},
- {1.612693f, 1.037175f, -1.183534f},
- {1.414853f, 1.037175f, -1.414853f},
- {1.183534f, 1.037175f, -1.612693f},
- {0.922564f, 1.037175f, -1.773229f},
- {0.635767f, 1.037175f, -1.892634f},
- {0.326970f, 1.037175f, -1.967083f},
- {0.000000f, 1.037175f, -1.992750f},
- {1.974240f, 0.900000f, -0.328160f},
- {2.000000f, 0.900000f, 0.000000f},
- {1.899520f, 0.900000f, -0.638080f},
- {1.779680f, 0.900000f, -0.925920f},
- {1.618560f, 0.900000f, -1.187840f},
- {1.420000f, 0.900000f, -1.420000f},
- {1.187840f, 0.900000f, -1.618560f},
- {0.925920f, 0.900000f, -1.779680f},
- {0.638080f, 0.900000f, -1.899520f},
- {0.328160f, 0.900000f, -1.974240f},
- {0.000000f, 0.900000f, -2.000000f},
- {-0.258385f, 2.242575f, -1.554467f},
- {0.000000f, 2.242575f, -1.574750f},
- {-0.502408f, 2.242575f, -1.495635f},
- {-0.729046f, 2.242575f, -1.401276f},
- {-0.935276f, 2.242575f, -1.274414f},
- {-1.118073f, 2.242575f, -1.118073f},
- {-1.274414f, 2.242575f, -0.935276f},
- {-1.401276f, 2.242575f, -0.729046f},
- {-1.495635f, 2.242575f, -0.502408f},
- {-1.554467f, 2.242575f, -0.258385f},
- {-1.574750f, 2.242575f, 0.000000f},
- {-0.270404f, 2.085600f, -1.626774f},
- {0.000000f, 2.085600f, -1.648000f},
- {-0.525778f, 2.085600f, -1.565204f},
- {-0.762958f, 2.085600f, -1.466456f},
- {-0.978780f, 2.085600f, -1.333693f},
- {-1.170080f, 2.085600f, -1.170080f},
- {-1.333693f, 2.085600f, -0.978780f},
- {-1.466456f, 2.085600f, -0.762958f},
- {-1.565204f, 2.085600f, -0.525778f},
- {-1.626774f, 2.085600f, -0.270404f},
- {-1.648000f, 2.085600f, 0.000000f},
- {-0.281930f, 1.929525f, -1.696119f},
- {0.000000f, 1.929525f, -1.718250f},
- {-0.548190f, 1.929525f, -1.631925f},
- {-0.795481f, 1.929525f, -1.528968f},
- {-1.020503f, 1.929525f, -1.390545f},
- {-1.219958f, 1.929525f, -1.219958f},
- {-1.390545f, 1.929525f, -1.020503f},
- {-1.528968f, 1.929525f, -0.795481f},
- {-1.631925f, 1.929525f, -0.548190f},
- {-1.696119f, 1.929525f, -0.281930f},
- {-1.718250f, 1.929525f, -0.000000f},
- {-0.292719f, 1.774800f, -1.761022f},
- {0.000000f, 1.774800f, -1.784000f},
- {-0.569167f, 1.774800f, -1.694372f},
- {-0.825921f, 1.774800f, -1.587475f},
- {-1.059553f, 1.774800f, -1.443756f},
- {-1.266640f, 1.774800f, -1.266640f},
- {-1.443756f, 1.774800f, -1.059553f},
- {-1.587475f, 1.774800f, -0.825921f},
- {-1.694372f, 1.774800f, -0.569167f},
- {-1.761022f, 1.774800f, -0.292719f},
- {-1.784000f, 1.774800f, -0.000000f},
- {-0.302523f, 1.621875f, -1.820003f},
- {0.000000f, 1.621875f, -1.843750f},
- {-0.588230f, 1.621875f, -1.751120f},
- {-0.853583f, 1.621875f, -1.640643f},
- {-1.095040f, 1.621875f, -1.492110f},
- {-1.309063f, 1.621875f, -1.309063f},
- {-1.492110f, 1.621875f, -1.095040f},
- {-1.640643f, 1.621875f, -0.853583f},
- {-1.751120f, 1.621875f, -0.588230f},
- {-1.820003f, 1.621875f, -0.302522f},
- {-1.843750f, 1.621875f, 0.000000f},
- {-0.311096f, 1.471200f, -1.871580f},
- {0.000000f, 1.471200f, -1.896000f},
- {-0.604900f, 1.471200f, -1.800745f},
- {-0.877772f, 1.471200f, -1.687137f},
- {-1.126072f, 1.471200f, -1.534395f},
- {-1.346160f, 1.471200f, -1.346160f},
- {-1.534395f, 1.471200f, -1.126072f},
- {-1.687137f, 1.471200f, -0.877772f},
- {-1.800745f, 1.471200f, -0.604900f},
- {-1.871580f, 1.471200f, -0.311096f},
- {-1.896000f, 1.471200f, 0.000000f},
- {-0.318192f, 1.323225f, -1.914272f},
- {0.000000f, 1.323225f, -1.939250f},
- {-0.618698f, 1.323225f, -1.841822f},
- {-0.897795f, 1.323225f, -1.725622f},
- {-1.151759f, 1.323225f, -1.569396f},
- {-1.376868f, 1.323225f, -1.376867f},
- {-1.569396f, 1.323225f, -1.151759f},
- {-1.725622f, 1.323225f, -0.897795f},
- {-1.841822f, 1.323225f, -0.618698f},
- {-1.914272f, 1.323225f, -0.318192f},
- {-1.939250f, 1.323225f, 0.000000f},
- {-0.323566f, 1.178400f, -1.946601f},
- {0.000000f, 1.178400f, -1.972000f},
- {-0.629147f, 1.178400f, -1.872927f},
- {-0.912957f, 1.178400f, -1.754764f},
- {-1.171210f, 1.178400f, -1.595900f},
- {-1.400120f, 1.178400f, -1.400120f},
- {-1.595900f, 1.178400f, -1.171210f},
- {-1.754764f, 1.178400f, -0.912957f},
- {-1.872927f, 1.178400f, -0.629147f},
- {-1.946601f, 1.178400f, -0.323566f},
- {-1.972000f, 1.178400f, -0.000000f},
- {-0.326970f, 1.037175f, -1.967083f},
- {0.000000f, 1.037175f, -1.992750f},
- {-0.635767f, 1.037175f, -1.892634f},
- {-0.922564f, 1.037175f, -1.773229f},
- {-1.183534f, 1.037175f, -1.612693f},
- {-1.414853f, 1.037175f, -1.414853f},
- {-1.612693f, 1.037175f, -1.183534f},
- {-1.773229f, 1.037175f, -0.922564f},
- {-1.892634f, 1.037175f, -0.635767f},
- {-1.967083f, 1.037175f, -0.326970f},
- {-1.992750f, 1.037175f, -0.000000f},
- {-0.328160f, 0.900000f, -1.974240f},
- {0.000000f, 0.900000f, -2.000000f},
- {-0.638080f, 0.900000f, -1.899520f},
- {-0.925920f, 0.900000f, -1.779680f},
- {-1.187840f, 0.900000f, -1.618560f},
- {-1.420000f, 0.900000f, -1.420000f},
- {-1.618560f, 0.900000f, -1.187840f},
- {-1.779680f, 0.900000f, -0.925920f},
- {-1.899520f, 0.900000f, -0.638080f},
- {-1.974240f, 0.900000f, -0.328160f},
- {-2.000000f, 0.900000f, 0.000000f},
- {-1.554467f, 2.242575f, 0.258385f},
- {-1.574750f, 2.242575f, 0.000000f},
- {-1.495635f, 2.242575f, 0.502408f},
- {-1.401276f, 2.242575f, 0.729046f},
- {-1.274414f, 2.242575f, 0.935276f},
- {-1.118073f, 2.242575f, 1.118073f},
- {-0.935276f, 2.242575f, 1.274414f},
- {-0.729046f, 2.242575f, 1.401276f},
- {-0.502408f, 2.242575f, 1.495635f},
- {-0.258385f, 2.242575f, 1.554467f},
- {0.000000f, 2.242575f, 1.574750f},
- {-1.626774f, 2.085600f, 0.270404f},
- {-1.648000f, 2.085600f, 0.000000f},
- {-1.565204f, 2.085600f, 0.525778f},
- {-1.466456f, 2.085600f, 0.762958f},
- {-1.333693f, 2.085600f, 0.978780f},
- {-1.170080f, 2.085600f, 1.170080f},
- {-0.978780f, 2.085600f, 1.333693f},
- {-0.762958f, 2.085600f, 1.466456f},
- {-0.525778f, 2.085600f, 1.565204f},
- {-0.270404f, 2.085600f, 1.626774f},
- {0.000000f, 2.085600f, 1.648000f},
- {-1.696119f, 1.929525f, 0.281930f},
- {-1.718250f, 1.929525f, 0.000000f},
- {-1.631925f, 1.929525f, 0.548190f},
- {-1.528968f, 1.929525f, 0.795481f},
- {-1.390545f, 1.929525f, 1.020503f},
- {-1.219958f, 1.929525f, 1.219958f},
- {-1.020503f, 1.929525f, 1.390545f},
- {-0.795481f, 1.929525f, 1.528968f},
- {-0.548190f, 1.929525f, 1.631925f},
- {-0.281930f, 1.929525f, 1.696119f},
- {-0.000000f, 1.929525f, 1.718250f},
- {-1.761022f, 1.774800f, 0.292719f},
- {-1.784000f, 1.774800f, 0.000000f},
- {-1.694372f, 1.774800f, 0.569167f},
- {-1.587475f, 1.774800f, 0.825921f},
- {-1.443756f, 1.774800f, 1.059553f},
- {-1.266640f, 1.774800f, 1.266640f},
- {-1.059553f, 1.774800f, 1.443756f},
- {-0.825921f, 1.774800f, 1.587475f},
- {-0.569167f, 1.774800f, 1.694372f},
- {-0.292719f, 1.774800f, 1.761022f},
- {-0.000000f, 1.774800f, 1.784000f},
- {-1.820003f, 1.621875f, 0.302523f},
- {-1.843750f, 1.621875f, 0.000000f},
- {-1.751120f, 1.621875f, 0.588230f},
- {-1.640643f, 1.621875f, 0.853583f},
- {-1.492110f, 1.621875f, 1.095040f},
- {-1.309063f, 1.621875f, 1.309063f},
- {-1.095040f, 1.621875f, 1.492110f},
- {-0.853583f, 1.621875f, 1.640643f},
- {-0.588230f, 1.621875f, 1.751120f},
- {-0.302522f, 1.621875f, 1.820003f},
- {0.000000f, 1.621875f, 1.843750f},
- {-1.871580f, 1.471200f, 0.311096f},
- {-1.896000f, 1.471200f, 0.000000f},
- {-1.800745f, 1.471200f, 0.604900f},
- {-1.687137f, 1.471200f, 0.877772f},
- {-1.534395f, 1.471200f, 1.126072f},
- {-1.346160f, 1.471200f, 1.346160f},
- {-1.126072f, 1.471200f, 1.534395f},
- {-0.877772f, 1.471200f, 1.687137f},
- {-0.604900f, 1.471200f, 1.800745f},
- {-0.311096f, 1.471200f, 1.871580f},
- {0.000000f, 1.471200f, 1.896000f},
- {-1.914272f, 1.323225f, 0.318192f},
- {-1.939250f, 1.323225f, 0.000000f},
- {-1.841822f, 1.323225f, 0.618698f},
- {-1.725622f, 1.323225f, 0.897795f},
- {-1.569396f, 1.323225f, 1.151759f},
- {-1.376867f, 1.323225f, 1.376868f},
- {-1.151759f, 1.323225f, 1.569396f},
- {-0.897795f, 1.323225f, 1.725622f},
- {-0.618698f, 1.323225f, 1.841822f},
- {-0.318192f, 1.323225f, 1.914272f},
- {0.000000f, 1.323225f, 1.939250f},
- {-1.946601f, 1.178400f, 0.323566f},
- {-1.972000f, 1.178400f, 0.000000f},
- {-1.872927f, 1.178400f, 0.629147f},
- {-1.754764f, 1.178400f, 0.912957f},
- {-1.595900f, 1.178400f, 1.171210f},
- {-1.400120f, 1.178400f, 1.400120f},
- {-1.171210f, 1.178400f, 1.595900f},
- {-0.912957f, 1.178400f, 1.754764f},
- {-0.629147f, 1.178400f, 1.872927f},
- {-0.323566f, 1.178400f, 1.946601f},
- {-0.000000f, 1.178400f, 1.972000f},
- {-1.967083f, 1.037175f, 0.326970f},
- {-1.992750f, 1.037175f, 0.000000f},
- {-1.892634f, 1.037175f, 0.635767f},
- {-1.773229f, 1.037175f, 0.922564f},
- {-1.612693f, 1.037175f, 1.183534f},
- {-1.414853f, 1.037175f, 1.414853f},
- {-1.183534f, 1.037175f, 1.612693f},
- {-0.922564f, 1.037175f, 1.773229f},
- {-0.635767f, 1.037175f, 1.892634f},
- {-0.326970f, 1.037175f, 1.967083f},
- {-0.000000f, 1.037175f, 1.992750f},
- {-1.974240f, 0.900000f, 0.328160f},
- {-2.000000f, 0.900000f, 0.000000f},
- {-1.899520f, 0.900000f, 0.638080f},
- {-1.779680f, 0.900000f, 0.925920f},
- {-1.618560f, 0.900000f, 1.187840f},
- {-1.420000f, 0.900000f, 1.420000f},
- {-1.187840f, 0.900000f, 1.618560f},
- {-0.925920f, 0.900000f, 1.779680f},
- {-0.638080f, 0.900000f, 1.899520f},
- {-0.328160f, 0.900000f, 1.974240f},
- {0.000000f, 0.900000f, 2.000000f},
- {0.258385f, 2.242575f, 1.554467f},
- {0.000000f, 2.242575f, 1.574750f},
- {0.502408f, 2.242575f, 1.495635f},
- {0.729046f, 2.242575f, 1.401276f},
- {0.935276f, 2.242575f, 1.274414f},
- {1.118073f, 2.242575f, 1.118073f},
- {1.274414f, 2.242575f, 0.935276f},
- {1.401276f, 2.242575f, 0.729046f},
- {1.495635f, 2.242575f, 0.502408f},
- {1.554467f, 2.242575f, 0.258385f},
- {1.574750f, 2.242575f, 0.000000f},
- {0.270404f, 2.085600f, 1.626774f},
- {0.000000f, 2.085600f, 1.648000f},
- {0.525778f, 2.085600f, 1.565204f},
- {0.762958f, 2.085600f, 1.466456f},
- {0.978780f, 2.085600f, 1.333693f},
- {1.170080f, 2.085600f, 1.170080f},
- {1.333693f, 2.085600f, 0.978780f},
- {1.466456f, 2.085600f, 0.762958f},
- {1.565204f, 2.085600f, 0.525778f},
- {1.626774f, 2.085600f, 0.270404f},
- {1.648000f, 2.085600f, -0.000000f},
- {0.281930f, 1.929525f, 1.696119f},
- {0.000000f, 1.929525f, 1.718250f},
- {0.548190f, 1.929525f, 1.631925f},
- {0.795481f, 1.929525f, 1.528968f},
- {1.020503f, 1.929525f, 1.390545f},
- {1.219958f, 1.929525f, 1.219958f},
- {1.390545f, 1.929525f, 1.020503f},
- {1.528968f, 1.929525f, 0.795481f},
- {1.631925f, 1.929525f, 0.548190f},
- {1.696119f, 1.929525f, 0.281930f},
- {1.718250f, 1.929525f, 0.000000f},
- {0.292719f, 1.774800f, 1.761022f},
- {0.000000f, 1.774800f, 1.784000f},
- {0.569167f, 1.774800f, 1.694372f},
- {0.825921f, 1.774800f, 1.587475f},
- {1.059553f, 1.774800f, 1.443756f},
- {1.266640f, 1.774800f, 1.266640f},
- {1.443756f, 1.774800f, 1.059553f},
- {1.587475f, 1.774800f, 0.825921f},
- {1.694372f, 1.774800f, 0.569167f},
- {1.761022f, 1.774800f, 0.292719f},
- {1.784000f, 1.774800f, 0.000000f},
- {0.302523f, 1.621875f, 1.820003f},
- {0.000000f, 1.621875f, 1.843750f},
- {0.588230f, 1.621875f, 1.751120f},
- {0.853583f, 1.621875f, 1.640643f},
- {1.095040f, 1.621875f, 1.492110f},
- {1.309063f, 1.621875f, 1.309063f},
- {1.492110f, 1.621875f, 1.095040f},
- {1.640643f, 1.621875f, 0.853583f},
- {1.751120f, 1.621875f, 0.588230f},
- {1.820003f, 1.621875f, 0.302522f},
- {1.843750f, 1.621875f, -0.000000f},
- {0.311096f, 1.471200f, 1.871580f},
- {0.000000f, 1.471200f, 1.896000f},
- {0.604900f, 1.471200f, 1.800745f},
- {0.877772f, 1.471200f, 1.687137f},
- {1.126072f, 1.471200f, 1.534395f},
- {1.346160f, 1.471200f, 1.346160f},
- {1.534395f, 1.471200f, 1.126072f},
- {1.687137f, 1.471200f, 0.877772f},
- {1.800745f, 1.471200f, 0.604900f},
- {1.871580f, 1.471200f, 0.311096f},
- {1.896000f, 1.471200f, 0.000000f},
- {0.318192f, 1.323225f, 1.914272f},
- {0.000000f, 1.323225f, 1.939250f},
- {0.618698f, 1.323225f, 1.841822f},
- {0.897795f, 1.323225f, 1.725622f},
- {1.151759f, 1.323225f, 1.569396f},
- {1.376868f, 1.323225f, 1.376867f},
- {1.569396f, 1.323225f, 1.151759f},
- {1.725622f, 1.323225f, 0.897795f},
- {1.841822f, 1.323225f, 0.618698f},
- {1.914272f, 1.323225f, 0.318192f},
- {1.939250f, 1.323225f, -0.000000f},
- {0.323566f, 1.178400f, 1.946601f},
- {0.000000f, 1.178400f, 1.972000f},
- {0.629147f, 1.178400f, 1.872927f},
- {0.912957f, 1.178400f, 1.754764f},
- {1.171210f, 1.178400f, 1.595900f},
- {1.400120f, 1.178400f, 1.400120f},
- {1.595900f, 1.178400f, 1.171210f},
- {1.754764f, 1.178400f, 0.912957f},
- {1.872927f, 1.178400f, 0.629147f},
- {1.946601f, 1.178400f, 0.323566f},
- {1.972000f, 1.178400f, 0.000000f},
- {0.326970f, 1.037175f, 1.967083f},
- {0.000000f, 1.037175f, 1.992750f},
- {0.635767f, 1.037175f, 1.892634f},
- {0.922564f, 1.037175f, 1.773229f},
- {1.183534f, 1.037175f, 1.612693f},
- {1.414853f, 1.037175f, 1.414853f},
- {1.612693f, 1.037175f, 1.183534f},
- {1.773229f, 1.037175f, 0.922564f},
- {1.892634f, 1.037175f, 0.635767f},
- {1.967083f, 1.037175f, 0.326970f},
- {1.992750f, 1.037175f, 0.000000f},
- {0.328160f, 0.900000f, 1.974240f},
- {0.000000f, 0.900000f, 2.000000f},
- {0.638080f, 0.900000f, 1.899520f},
- {0.925920f, 0.900000f, 1.779680f},
- {1.187840f, 0.900000f, 1.618560f},
- {1.420000f, 0.900000f, 1.420000f},
- {1.618560f, 0.900000f, 1.187840f},
- {1.779680f, 0.900000f, 0.925920f},
- {1.899520f, 0.900000f, 0.638080f},
- {1.974240f, 0.900000f, 0.328160f},
- {2.000000f, 0.900000f, 0.000000f},
- {1.960420f, 0.771675f, -0.325863f},
- {1.986000f, 0.771675f, 0.000000f},
- {1.886223f, 0.771675f, -0.633613f},
- {1.899520f, 0.900000f, -0.638080f},
- {1.767222f, 0.771675f, -0.919439f},
- {1.779680f, 0.900000f, -0.925920f},
- {1.607230f, 0.771675f, -1.179525f},
- {1.618560f, 0.900000f, -1.187840f},
- {1.410060f, 0.771675f, -1.410060f},
- {1.420000f, 0.900000f, -1.420000f},
- {1.179525f, 0.771675f, -1.607230f},
- {1.187840f, 0.900000f, -1.618560f},
- {0.919439f, 0.771675f, -1.767222f},
- {0.925920f, 0.900000f, -1.779680f},
- {0.633613f, 0.771675f, -1.886223f},
- {0.638080f, 0.900000f, -1.899520f},
- {0.325863f, 0.771675f, -1.960420f},
- {0.328160f, 0.900000f, -1.974240f},
- {-0.000000f, 0.771675f, -1.986000f},
- {1.922910f, 0.656400f, -0.319628f},
- {1.948000f, 0.656400f, 0.000000f},
- {1.850132f, 0.656400f, -0.621490f},
- {1.733408f, 0.656400f, -0.901846f},
- {1.576477f, 0.656400f, -1.156956f},
- {1.383080f, 0.656400f, -1.383080f},
- {1.156956f, 0.656400f, -1.576477f},
- {0.901846f, 0.656400f, -1.733408f},
- {0.621490f, 0.656400f, -1.850132f},
- {0.319628f, 0.656400f, -1.922910f},
- {-0.000000f, 0.656400f, -1.948000f},
- {1.867631f, 0.553725f, -0.310439f},
- {1.892000f, 0.553725f, 0.000000f},
- {1.796946f, 0.553725f, -0.603624f},
- {1.683577f, 0.553725f, -0.875920f},
- {1.531158f, 0.553725f, -1.123697f},
- {1.343320f, 0.553725f, -1.343320f},
- {1.123697f, 0.553725f, -1.531158f},
- {0.875920f, 0.553725f, -1.683577f},
- {0.603624f, 0.553725f, -1.796946f},
- {0.310439f, 0.553725f, -1.867631f},
- {-0.000000f, 0.553725f, -1.892000f},
- {1.800507f, 0.463200f, -0.299282f},
- {1.824000f, 0.463200f, 0.000000f},
- {1.732362f, 0.463200f, -0.581929f},
- {1.623068f, 0.463200f, -0.844439f},
- {1.476127f, 0.463200f, -1.083310f},
- {1.295040f, 0.463200f, -1.295040f},
- {1.083310f, 0.463200f, -1.476127f},
- {0.844439f, 0.463200f, -1.623068f},
- {0.581929f, 0.463200f, -1.732362f},
- {0.299282f, 0.463200f, -1.800507f},
- {0.000000f, 0.463200f, -1.824000f},
- {1.727460f, 0.384375f, -0.287140f},
- {1.750000f, 0.384375f, 0.000000f},
- {1.662080f, 0.384375f, -0.558320f},
- {1.557220f, 0.384375f, -0.810180f},
- {1.416240f, 0.384375f, -1.039360f},
- {1.242500f, 0.384375f, -1.242500f},
- {1.039360f, 0.384375f, -1.416240f},
- {0.810180f, 0.384375f, -1.557220f},
- {0.558320f, 0.384375f, -1.662080f},
- {0.287140f, 0.384375f, -1.727460f},
- {0.000000f, 0.384375f, -1.750000f},
- {1.654413f, 0.316800f, -0.274998f},
- {1.676000f, 0.316800f, 0.000000f},
- {1.591798f, 0.316800f, -0.534711f},
- {1.491372f, 0.316800f, -0.775921f},
- {1.356353f, 0.316800f, -0.995410f},
- {1.189960f, 0.316800f, -1.189960f},
- {0.995410f, 0.316800f, -1.356353f},
- {0.775921f, 0.316800f, -1.491372f},
- {0.534711f, 0.316800f, -1.591798f},
- {0.274998f, 0.316800f, -1.654413f},
- {0.000000f, 0.316800f, -1.676000f},
- {1.587289f, 0.260025f, -0.263841f},
- {1.608000f, 0.260025f, 0.000000f},
- {1.527214f, 0.260025f, -0.513016f},
- {1.430863f, 0.260025f, -0.744440f},
- {1.301322f, 0.260025f, -0.955023f},
- {1.141680f, 0.260025f, -1.141680f},
- {0.955023f, 0.260025f, -1.301322f},
- {0.744440f, 0.260025f, -1.430863f},
- {0.513016f, 0.260025f, -1.527214f},
- {0.263841f, 0.260025f, -1.587289f},
- {0.000000f, 0.260025f, -1.608000f},
- {1.532010f, 0.213600f, -0.254652f},
- {1.552000f, 0.213600f, 0.000000f},
- {1.474028f, 0.213600f, -0.495150f},
- {1.381032f, 0.213600f, -0.718514f},
- {1.256003f, 0.213600f, -0.921764f},
- {1.101920f, 0.213600f, -1.101920f},
- {0.921764f, 0.213600f, -1.256003f},
- {0.718514f, 0.213600f, -1.381032f},
- {0.495150f, 0.213600f, -1.474028f},
- {0.254652f, 0.213600f, -1.532010f},
- {0.000000f, 0.213600f, -1.552000f},
- {1.494500f, 0.177075f, -0.248417f},
- {1.514000f, 0.177075f, 0.000000f},
- {1.437937f, 0.177075f, -0.483027f},
- {1.347218f, 0.177075f, -0.700921f},
- {1.225250f, 0.177075f, -0.899195f},
- {1.074940f, 0.177075f, -1.074940f},
- {0.899195f, 0.177075f, -1.225250f},
- {0.700921f, 0.177075f, -1.347218f},
- {0.483027f, 0.177075f, -1.437937f},
- {0.248417f, 0.177075f, -1.494500f},
- {-0.000000f, 0.177075f, -1.514000f},
- {1.480680f, 0.150000f, -0.246120f},
- {1.500000f, 0.150000f, 0.000000f},
- {1.424640f, 0.150000f, -0.478560f},
- {1.334760f, 0.150000f, -0.694440f},
- {1.213920f, 0.150000f, -0.890880f},
- {1.065000f, 0.150000f, -1.065000f},
- {0.890880f, 0.150000f, -1.213920f},
- {0.694440f, 0.150000f, -1.334760f},
- {0.478560f, 0.150000f, -1.424640f},
- {0.246120f, 0.150000f, -1.480680f},
- {0.000000f, 0.150000f, -1.500000f},
- {-0.325863f, 0.771675f, -1.960420f},
- {0.000000f, 0.771675f, -1.986000f},
- {-0.633613f, 0.771675f, -1.886223f},
- {-0.638080f, 0.900000f, -1.899520f},
- {-0.919439f, 0.771675f, -1.767222f},
- {-0.925920f, 0.900000f, -1.779680f},
- {-1.179525f, 0.771675f, -1.607230f},
- {-1.187840f, 0.900000f, -1.618560f},
- {-1.410060f, 0.771675f, -1.410060f},
- {-1.420000f, 0.900000f, -1.420000f},
- {-1.607230f, 0.771675f, -1.179525f},
- {-1.618560f, 0.900000f, -1.187840f},
- {-1.767222f, 0.771675f, -0.919439f},
- {-1.779680f, 0.900000f, -0.925920f},
- {-1.886223f, 0.771675f, -0.633613f},
- {-1.899520f, 0.900000f, -0.638080f},
- {-1.960420f, 0.771675f, -0.325863f},
- {-1.974240f, 0.900000f, -0.328160f},
- {-1.986000f, 0.771675f, 0.000000f},
- {-0.319628f, 0.656400f, -1.922910f},
- {0.000000f, 0.656400f, -1.948000f},
- {-0.621490f, 0.656400f, -1.850132f},
- {-0.901846f, 0.656400f, -1.733408f},
- {-1.156956f, 0.656400f, -1.576477f},
- {-1.383080f, 0.656400f, -1.383080f},
- {-1.576477f, 0.656400f, -1.156956f},
- {-1.733408f, 0.656400f, -0.901846f},
- {-1.850132f, 0.656400f, -0.621490f},
- {-1.922910f, 0.656400f, -0.319628f},
- {-1.948000f, 0.656400f, 0.000000f},
- {-0.310439f, 0.553725f, -1.867631f},
- {0.000000f, 0.553725f, -1.892000f},
- {-0.603624f, 0.553725f, -1.796946f},
- {-0.875920f, 0.553725f, -1.683577f},
- {-1.123697f, 0.553725f, -1.531158f},
- {-1.343320f, 0.553725f, -1.343320f},
- {-1.531158f, 0.553725f, -1.123697f},
- {-1.683577f, 0.553725f, -0.875920f},
- {-1.796946f, 0.553725f, -0.603624f},
- {-1.867631f, 0.553725f, -0.310439f},
- {-1.892000f, 0.553725f, 0.000000f},
- {-0.299282f, 0.463200f, -1.800507f},
- {0.000000f, 0.463200f, -1.824000f},
- {-0.581929f, 0.463200f, -1.732362f},
- {-0.844439f, 0.463200f, -1.623068f},
- {-1.083310f, 0.463200f, -1.476127f},
- {-1.295040f, 0.463200f, -1.295040f},
- {-1.476127f, 0.463200f, -1.083310f},
- {-1.623068f, 0.463200f, -0.844439f},
- {-1.732362f, 0.463200f, -0.581929f},
- {-1.800507f, 0.463200f, -0.299282f},
- {-1.824000f, 0.463200f, -0.000000f},
- {-0.287140f, 0.384375f, -1.727460f},
- {0.000000f, 0.384375f, -1.750000f},
- {-0.558320f, 0.384375f, -1.662080f},
- {-0.810180f, 0.384375f, -1.557220f},
- {-1.039360f, 0.384375f, -1.416240f},
- {-1.242500f, 0.384375f, -1.242500f},
- {-1.416240f, 0.384375f, -1.039360f},
- {-1.557220f, 0.384375f, -0.810180f},
- {-1.662080f, 0.384375f, -0.558320f},
- {-1.727460f, 0.384375f, -0.287140f},
- {-1.750000f, 0.384375f, -0.000000f},
- {-0.274998f, 0.316800f, -1.654413f},
- {0.000000f, 0.316800f, -1.676000f},
- {-0.534711f, 0.316800f, -1.591798f},
- {-0.775921f, 0.316800f, -1.491372f},
- {-0.995410f, 0.316800f, -1.356353f},
- {-1.189960f, 0.316800f, -1.189960f},
- {-1.356353f, 0.316800f, -0.995410f},
- {-1.491372f, 0.316800f, -0.775921f},
- {-1.591798f, 0.316800f, -0.534711f},
- {-1.654413f, 0.316800f, -0.274998f},
- {-1.676000f, 0.316800f, 0.000000f},
- {-0.263841f, 0.260025f, -1.587289f},
- {0.000000f, 0.260025f, -1.608000f},
- {-0.513016f, 0.260025f, -1.527214f},
- {-0.744440f, 0.260025f, -1.430863f},
- {-0.955023f, 0.260025f, -1.301322f},
- {-1.141680f, 0.260025f, -1.141680f},
- {-1.301322f, 0.260025f, -0.955023f},
- {-1.430863f, 0.260025f, -0.744440f},
- {-1.527214f, 0.260025f, -0.513016f},
- {-1.587289f, 0.260025f, -0.263841f},
- {-1.608000f, 0.260025f, -0.000000f},
- {-0.254652f, 0.213600f, -1.532010f},
- {0.000000f, 0.213600f, -1.552000f},
- {-0.495150f, 0.213600f, -1.474028f},
- {-0.718514f, 0.213600f, -1.381032f},
- {-0.921764f, 0.213600f, -1.256003f},
- {-1.101920f, 0.213600f, -1.101920f},
- {-1.256003f, 0.213600f, -0.921764f},
- {-1.381032f, 0.213600f, -0.718514f},
- {-1.474028f, 0.213600f, -0.495150f},
- {-1.532010f, 0.213600f, -0.254652f},
- {-1.552000f, 0.213600f, 0.000000f},
- {-0.248417f, 0.177075f, -1.494500f},
- {0.000000f, 0.177075f, -1.514000f},
- {-0.483027f, 0.177075f, -1.437937f},
- {-0.700921f, 0.177075f, -1.347218f},
- {-0.899195f, 0.177075f, -1.225250f},
- {-1.074940f, 0.177075f, -1.074940f},
- {-1.225250f, 0.177075f, -0.899195f},
- {-1.347218f, 0.177075f, -0.700921f},
- {-1.437937f, 0.177075f, -0.483027f},
- {-1.494500f, 0.177075f, -0.248417f},
- {-1.514000f, 0.177075f, 0.000000f},
- {-0.246120f, 0.150000f, -1.480680f},
- {0.000000f, 0.150000f, -1.500000f},
- {-0.478560f, 0.150000f, -1.424640f},
- {-0.694440f, 0.150000f, -1.334760f},
- {-0.890880f, 0.150000f, -1.213920f},
- {-1.065000f, 0.150000f, -1.065000f},
- {-1.213920f, 0.150000f, -0.890880f},
- {-1.334760f, 0.150000f, -0.694440f},
- {-1.424640f, 0.150000f, -0.478560f},
- {-1.480680f, 0.150000f, -0.246120f},
- {-1.500000f, 0.150000f, 0.000000f},
- {-1.960420f, 0.771675f, 0.325863f},
- {-1.986000f, 0.771675f, 0.000000f},
- {-1.886223f, 0.771675f, 0.633613f},
- {-1.899520f, 0.900000f, 0.638080f},
- {-1.767222f, 0.771675f, 0.919439f},
- {-1.779680f, 0.900000f, 0.925920f},
- {-1.607230f, 0.771675f, 1.179525f},
- {-1.618560f, 0.900000f, 1.187840f},
- {-1.410060f, 0.771675f, 1.410060f},
- {-1.420000f, 0.900000f, 1.420000f},
- {-1.179525f, 0.771675f, 1.607230f},
- {-1.187840f, 0.900000f, 1.618560f},
- {-0.919439f, 0.771675f, 1.767222f},
- {-0.925920f, 0.900000f, 1.779680f},
- {-0.633613f, 0.771675f, 1.886223f},
- {-0.638080f, 0.900000f, 1.899520f},
- {-0.325863f, 0.771675f, 1.960420f},
- {-0.328160f, 0.900000f, 1.974240f},
- {0.000000f, 0.771675f, 1.986000f},
- {-1.922910f, 0.656400f, 0.319628f},
- {-1.948000f, 0.656400f, 0.000000f},
- {-1.850132f, 0.656400f, 0.621490f},
- {-1.733408f, 0.656400f, 0.901846f},
- {-1.576477f, 0.656400f, 1.156956f},
- {-1.383080f, 0.656400f, 1.383080f},
- {-1.156956f, 0.656400f, 1.576477f},
- {-0.901846f, 0.656400f, 1.733408f},
- {-0.621490f, 0.656400f, 1.850132f},
- {-0.319628f, 0.656400f, 1.922910f},
- {0.000000f, 0.656400f, 1.948000f},
- {-1.867631f, 0.553725f, 0.310439f},
- {-1.892000f, 0.553725f, 0.000000f},
- {-1.796946f, 0.553725f, 0.603624f},
- {-1.683577f, 0.553725f, 0.875920f},
- {-1.531158f, 0.553725f, 1.123697f},
- {-1.343320f, 0.553725f, 1.343320f},
- {-1.123697f, 0.553725f, 1.531158f},
- {-0.875920f, 0.553725f, 1.683577f},
- {-0.603624f, 0.553725f, 1.796946f},
- {-0.310439f, 0.553725f, 1.867631f},
- {0.000000f, 0.553725f, 1.892000f},
- {-1.800507f, 0.463200f, 0.299282f},
- {-1.824000f, 0.463200f, 0.000000f},
- {-1.732362f, 0.463200f, 0.581929f},
- {-1.623068f, 0.463200f, 0.844439f},
- {-1.476127f, 0.463200f, 1.083310f},
- {-1.295040f, 0.463200f, 1.295040f},
- {-1.083310f, 0.463200f, 1.476127f},
- {-0.844439f, 0.463200f, 1.623068f},
- {-0.581929f, 0.463200f, 1.732362f},
- {-0.299282f, 0.463200f, 1.800507f},
- {-0.000000f, 0.463200f, 1.824000f},
- {-1.727460f, 0.384375f, 0.287140f},
- {-1.750000f, 0.384375f, 0.000000f},
- {-1.662080f, 0.384375f, 0.558320f},
- {-1.557220f, 0.384375f, 0.810180f},
- {-1.416240f, 0.384375f, 1.039360f},
- {-1.242500f, 0.384375f, 1.242500f},
- {-1.039360f, 0.384375f, 1.416240f},
- {-0.810180f, 0.384375f, 1.557220f},
- {-0.558320f, 0.384375f, 1.662080f},
- {-0.287140f, 0.384375f, 1.727460f},
- {-0.000000f, 0.384375f, 1.750000f},
- {-1.654413f, 0.316800f, 0.274998f},
- {-1.676000f, 0.316800f, 0.000000f},
- {-1.591798f, 0.316800f, 0.534711f},
- {-1.491372f, 0.316800f, 0.775921f},
- {-1.356353f, 0.316800f, 0.995410f},
- {-1.189960f, 0.316800f, 1.189960f},
- {-0.995410f, 0.316800f, 1.356353f},
- {-0.775921f, 0.316800f, 1.491372f},
- {-0.534711f, 0.316800f, 1.591798f},
- {-0.274998f, 0.316800f, 1.654413f},
- {0.000000f, 0.316800f, 1.676000f},
- {-1.587289f, 0.260025f, 0.263841f},
- {-1.608000f, 0.260025f, 0.000000f},
- {-1.527214f, 0.260025f, 0.513016f},
- {-1.430863f, 0.260025f, 0.744440f},
- {-1.301322f, 0.260025f, 0.955023f},
- {-1.141680f, 0.260025f, 1.141680f},
- {-0.955023f, 0.260025f, 1.301322f},
- {-0.744440f, 0.260025f, 1.430863f},
- {-0.513016f, 0.260025f, 1.527214f},
- {-0.263841f, 0.260025f, 1.587289f},
- {-0.000000f, 0.260025f, 1.608000f},
- {-1.532010f, 0.213600f, 0.254652f},
- {-1.552000f, 0.213600f, 0.000000f},
- {-1.474028f, 0.213600f, 0.495150f},
- {-1.381032f, 0.213600f, 0.718514f},
- {-1.256003f, 0.213600f, 0.921764f},
- {-1.101920f, 0.213600f, 1.101920f},
- {-0.921764f, 0.213600f, 1.256003f},
- {-0.718514f, 0.213600f, 1.381032f},
- {-0.495150f, 0.213600f, 1.474028f},
- {-0.254652f, 0.213600f, 1.532010f},
- {0.000000f, 0.213600f, 1.552000f},
- {-1.494500f, 0.177075f, 0.248417f},
- {-1.514000f, 0.177075f, 0.000000f},
- {-1.437937f, 0.177075f, 0.483027f},
- {-1.347218f, 0.177075f, 0.700921f},
- {-1.225250f, 0.177075f, 0.899195f},
- {-1.074940f, 0.177075f, 1.074940f},
- {-0.899195f, 0.177075f, 1.225250f},
- {-0.700921f, 0.177075f, 1.347218f},
- {-0.483027f, 0.177075f, 1.437937f},
- {-0.248417f, 0.177075f, 1.494500f},
- {0.000000f, 0.177075f, 1.514000f},
- {-1.480680f, 0.150000f, 0.246120f},
- {-1.500000f, 0.150000f, 0.000000f},
- {-1.424640f, 0.150000f, 0.478560f},
- {-1.334760f, 0.150000f, 0.694440f},
- {-1.213920f, 0.150000f, 0.890880f},
- {-1.065000f, 0.150000f, 1.065000f},
- {-0.890880f, 0.150000f, 1.213920f},
- {-0.694440f, 0.150000f, 1.334760f},
- {-0.478560f, 0.150000f, 1.424640f},
- {-0.246120f, 0.150000f, 1.480680f},
- {0.000000f, 0.150000f, 1.500000f},
- {0.325863f, 0.771675f, 1.960420f},
- {0.000000f, 0.771675f, 1.986000f},
- {0.633613f, 0.771675f, 1.886223f},
- {0.638080f, 0.900000f, 1.899520f},
- {0.919439f, 0.771675f, 1.767222f},
- {0.925920f, 0.900000f, 1.779680f},
- {1.179525f, 0.771675f, 1.607230f},
- {1.187840f, 0.900000f, 1.618560f},
- {1.410060f, 0.771675f, 1.410060f},
- {1.420000f, 0.900000f, 1.420000f},
- {1.607230f, 0.771675f, 1.179525f},
- {1.618560f, 0.900000f, 1.187840f},
- {1.767222f, 0.771675f, 0.919439f},
- {1.779680f, 0.900000f, 0.925920f},
- {1.886223f, 0.771675f, 0.633613f},
- {1.899520f, 0.900000f, 0.638080f},
- {1.960420f, 0.771675f, 0.325863f},
- {1.974240f, 0.900000f, 0.328160f},
- {1.986000f, 0.771675f, -0.000000f},
- {0.319628f, 0.656400f, 1.922910f},
- {0.000000f, 0.656400f, 1.948000f},
- {0.621490f, 0.656400f, 1.850132f},
- {0.901846f, 0.656400f, 1.733408f},
- {1.156956f, 0.656400f, 1.576477f},
- {1.383080f, 0.656400f, 1.383080f},
- {1.576477f, 0.656400f, 1.156956f},
- {1.733408f, 0.656400f, 0.901846f},
- {1.850132f, 0.656400f, 0.621490f},
- {1.922910f, 0.656400f, 0.319628f},
- {1.948000f, 0.656400f, -0.000000f},
- {0.310439f, 0.553725f, 1.867631f},
- {0.000000f, 0.553725f, 1.892000f},
- {0.603624f, 0.553725f, 1.796946f},
- {0.875920f, 0.553725f, 1.683577f},
- {1.123697f, 0.553725f, 1.531158f},
- {1.343320f, 0.553725f, 1.343320f},
- {1.531158f, 0.553725f, 1.123697f},
- {1.683577f, 0.553725f, 0.875920f},
- {1.796946f, 0.553725f, 0.603624f},
- {1.867631f, 0.553725f, 0.310439f},
- {1.892000f, 0.553725f, -0.000000f},
- {0.299282f, 0.463200f, 1.800507f},
- {0.000000f, 0.463200f, 1.824000f},
- {0.581929f, 0.463200f, 1.732362f},
- {0.844439f, 0.463200f, 1.623068f},
- {1.083310f, 0.463200f, 1.476127f},
- {1.295040f, 0.463200f, 1.295040f},
- {1.476127f, 0.463200f, 1.083310f},
- {1.623068f, 0.463200f, 0.844439f},
- {1.732362f, 0.463200f, 0.581929f},
- {1.800507f, 0.463200f, 0.299282f},
- {1.824000f, 0.463200f, 0.000000f},
- {0.287140f, 0.384375f, 1.727460f},
- {0.000000f, 0.384375f, 1.750000f},
- {0.558320f, 0.384375f, 1.662080f},
- {0.810180f, 0.384375f, 1.557220f},
- {1.039360f, 0.384375f, 1.416240f},
- {1.242500f, 0.384375f, 1.242500f},
- {1.416240f, 0.384375f, 1.039360f},
- {1.557220f, 0.384375f, 0.810180f},
- {1.662080f, 0.384375f, 0.558320f},
- {1.727460f, 0.384375f, 0.287140f},
- {1.750000f, 0.384375f, 0.000000f},
- {0.274998f, 0.316800f, 1.654413f},
- {0.000000f, 0.316800f, 1.676000f},
- {0.534711f, 0.316800f, 1.591798f},
- {0.775921f, 0.316800f, 1.491372f},
- {0.995410f, 0.316800f, 1.356353f},
- {1.189960f, 0.316800f, 1.189960f},
- {1.356353f, 0.316800f, 0.995410f},
- {1.491372f, 0.316800f, 0.775921f},
- {1.591798f, 0.316800f, 0.534711f},
- {1.654413f, 0.316800f, 0.274998f},
- {1.676000f, 0.316800f, 0.000000f},
- {0.263841f, 0.260025f, 1.587289f},
- {0.000000f, 0.260025f, 1.608000f},
- {0.513016f, 0.260025f, 1.527214f},
- {0.744440f, 0.260025f, 1.430863f},
- {0.955023f, 0.260025f, 1.301322f},
- {1.141680f, 0.260025f, 1.141680f},
- {1.301322f, 0.260025f, 0.955023f},
- {1.430863f, 0.260025f, 0.744440f},
- {1.527214f, 0.260025f, 0.513016f},
- {1.587289f, 0.260025f, 0.263841f},
- {1.608000f, 0.260025f, 0.000000f},
- {0.254652f, 0.213600f, 1.532010f},
- {0.000000f, 0.213600f, 1.552000f},
- {0.495150f, 0.213600f, 1.474028f},
- {0.718514f, 0.213600f, 1.381032f},
- {0.921764f, 0.213600f, 1.256003f},
- {1.101920f, 0.213600f, 1.101920f},
- {1.256003f, 0.213600f, 0.921764f},
- {1.381032f, 0.213600f, 0.718514f},
- {1.474028f, 0.213600f, 0.495150f},
- {1.532010f, 0.213600f, 0.254652f},
- {1.552000f, 0.213600f, 0.000000f},
- {0.248417f, 0.177075f, 1.494500f},
- {0.000000f, 0.177075f, 1.514000f},
- {0.483027f, 0.177075f, 1.437937f},
- {0.700921f, 0.177075f, 1.347218f},
- {0.899195f, 0.177075f, 1.225250f},
- {1.074940f, 0.177075f, 1.074940f},
- {1.225250f, 0.177075f, 0.899195f},
- {1.347218f, 0.177075f, 0.700921f},
- {1.437937f, 0.177075f, 0.483027f},
- {1.494500f, 0.177075f, 0.248417f},
- {1.514000f, 0.177075f, -0.000000f},
- {0.246120f, 0.150000f, 1.480680f},
- {0.000000f, 0.150000f, 1.500000f},
- {0.478560f, 0.150000f, 1.424640f},
- {0.694440f, 0.150000f, 1.334760f},
- {0.890880f, 0.150000f, 1.213920f},
- {1.065000f, 0.150000f, 1.065000f},
- {1.213920f, 0.150000f, 0.890880f},
- {1.334760f, 0.150000f, 0.694440f},
- {1.424640f, 0.150000f, 0.478560f},
- {1.480680f, 0.150000f, 0.246120f},
- {1.500000f, 0.150000f, 0.000000f},
- {-1.800455f, 2.031069f, -0.081000f},
- {-1.597200f, 2.031300f, -0.081000f},
- {-1.600000f, 2.025000f, 0.000000f},
- {-1.800900f, 2.024775f, 0.000000f},
- {-1.799246f, 2.048152f, -0.144000f},
- {-1.589600f, 2.048400f, -0.144000f},
- {-1.797466f, 2.073326f, -0.189000f},
- {-1.578400f, 2.073600f, -0.189000f},
- {-1.795303f, 2.103896f, -0.216000f},
- {-1.564800f, 2.104200f, -0.216000f},
- {-1.792950f, 2.137163f, -0.225000f},
- {-1.550000f, 2.137500f, -0.225000f},
- {-1.790597f, 2.170429f, -0.216000f},
- {-1.535200f, 2.170800f, -0.216000f},
- {-1.788434f, 2.200999f, -0.189000f},
- {-1.521600f, 2.201400f, -0.189000f},
- {-1.786654f, 2.226173f, -0.144000f},
- {-1.510400f, 2.226600f, -0.144000f},
- {-1.785445f, 2.243256f, -0.081000f},
- {-1.502800f, 2.243700f, -0.081000f},
- {-1.785000f, 2.249550f, 0.000000f},
- {-1.500000f, 2.250000f, 0.000000f},
- {-1.984790f, 2.029450f, -0.081000f},
- {-1.983200f, 2.023200f, 0.000000f},
- {-1.989107f, 2.046413f, -0.144000f},
- {-1.995469f, 2.071411f, -0.189000f},
- {-2.003194f, 2.101766f, -0.216000f},
- {-2.011600f, 2.134800f, -0.225000f},
- {-2.020006f, 2.167834f, -0.216000f},
- {-2.027731f, 2.198189f, -0.189000f},
- {-2.034093f, 2.223187f, -0.144000f},
- {-2.038410f, 2.240150f, -0.081000f},
- {-2.040000f, 2.246400f, 0.000000f},
- {-2.149624f, 2.025055f, -0.081000f},
- {-2.146300f, 2.018925f, 0.000000f},
- {-2.158645f, 2.041693f, -0.144000f},
- {-2.171939f, 2.066213f, -0.189000f},
- {-2.188082f, 2.095987f, -0.216000f},
- {-2.205650f, 2.128388f, -0.225000f},
- {-2.223218f, 2.160788f, -0.216000f},
- {-2.239361f, 2.190562f, -0.189000f},
- {-2.252655f, 2.215082f, -0.144000f},
- {-2.261676f, 2.231720f, -0.081000f},
- {-2.265000f, 2.237850f, 0.000000f},
- {-2.294371f, 2.016497f, -0.081000f},
- {-2.289600f, 2.010600f, 0.000000f},
- {-2.307322f, 2.032502f, -0.144000f},
- {-2.326406f, 2.056090f, -0.189000f},
- {-2.349581f, 2.084731f, -0.216000f},
- {-2.374800f, 2.115900f, -0.225000f},
- {-2.400019f, 2.147069f, -0.216000f},
- {-2.423194f, 2.175710f, -0.189000f},
- {-2.442278f, 2.199298f, -0.144000f},
- {-2.455229f, 2.215303f, -0.081000f},
- {-2.460000f, 2.221200f, 0.000000f},
- {-2.418450f, 2.002387f, -0.081000f},
- {-2.412500f, 1.996875f, 0.000000f},
- {-2.434600f, 2.017350f, -0.144000f},
- {-2.458400f, 2.039400f, -0.189000f},
- {-2.487300f, 2.066175f, -0.216000f},
- {-2.518750f, 2.095312f, -0.225000f},
- {-2.550200f, 2.124450f, -0.216000f},
- {-2.579100f, 2.151225f, -0.189000f},
- {-2.602900f, 2.173275f, -0.144000f},
- {-2.619050f, 2.188238f, -0.081000f},
- {-2.625000f, 2.193750f, 0.000000f},
- {-2.521277f, 1.981339f, -0.081000f},
- {-2.514400f, 1.976400f, 0.000000f},
- {-2.539942f, 1.994746f, -0.144000f},
- {-2.567450f, 2.014502f, -0.189000f},
- {-2.600851f, 2.038493f, -0.216000f},
- {-2.637200f, 2.064600f, -0.225000f},
- {-2.673549f, 2.090707f, -0.216000f},
- {-2.706950f, 2.114698f, -0.189000f},
- {-2.734458f, 2.134454f, -0.144000f},
- {-2.753123f, 2.147861f, -0.081000f},
- {-2.760000f, 2.152800f, 0.000000f},
- {-2.602268f, 1.951964f, -0.081000f},
- {-2.594700f, 1.947825f, 0.000000f},
- {-2.622811f, 1.963199f, -0.144000f},
- {-2.653085f, 1.979755f, -0.189000f},
- {-2.689846f, 1.999859f, -0.216000f},
- {-2.729850f, 2.021737f, -0.225000f},
- {-2.769854f, 2.043616f, -0.216000f},
- {-2.806615f, 2.063720f, -0.189000f},
- {-2.836889f, 2.080276f, -0.144000f},
- {-2.857432f, 2.091511f, -0.081000f},
- {-2.865000f, 2.095650f, 0.000000f},
- {-2.660842f, 1.912874f, -0.081000f},
- {-2.652800f, 1.909800f, 0.000000f},
- {-2.682669f, 1.921219f, -0.144000f},
- {-2.714835f, 1.933517f, -0.189000f},
- {-2.753894f, 1.948450f, -0.216000f},
- {-2.796400f, 1.964700f, -0.225000f},
- {-2.838906f, 1.980950f, -0.216000f},
- {-2.877965f, 1.995883f, -0.189000f},
- {-2.910131f, 2.008181f, -0.144000f},
- {-2.931958f, 2.016526f, -0.081000f},
- {-2.940000f, 2.019600f, 0.000000f},
- {-2.696413f, 1.862682f, -0.081000f},
- {-2.688100f, 1.860975f, 0.000000f},
- {-2.718978f, 1.867316f, -0.144000f},
- {-2.752230f, 1.874146f, -0.189000f},
- {-2.792609f, 1.882438f, -0.216000f},
- {-2.836550f, 1.891463f, -0.225000f},
- {-2.880491f, 1.900487f, -0.216000f},
- {-2.920870f, 1.908779f, -0.189000f},
- {-2.954122f, 1.915609f, -0.144000f},
- {-2.976687f, 1.920243f, -0.081000f},
- {-2.985000f, 1.921950f, 0.000000f},
- {-2.708400f, 1.800000f, -0.081000f},
- {-2.700000f, 1.800000f, 0.000000f},
- {-2.731200f, 1.800000f, -0.144000f},
- {-2.764800f, 1.800000f, -0.189000f},
- {-2.805600f, 1.800000f, -0.216000f},
- {-2.850000f, 1.800000f, -0.225000f},
- {-2.894400f, 1.800000f, -0.216000f},
- {-2.935200f, 1.800000f, -0.189000f},
- {-2.968800f, 1.800000f, -0.144000f},
- {-2.991600f, 1.800000f, -0.081000f},
- {-3.000000f, 1.800000f, 0.000000f},
- {-1.785445f, 2.243256f, 0.081000f},
- {-1.502800f, 2.243700f, 0.081000f},
- {-1.786654f, 2.226173f, 0.144000f},
- {-1.510400f, 2.226600f, 0.144000f},
- {-1.788434f, 2.200999f, 0.189000f},
- {-1.521600f, 2.201400f, 0.189000f},
- {-1.790597f, 2.170429f, 0.216000f},
- {-1.535200f, 2.170800f, 0.216000f},
- {-1.792950f, 2.137163f, 0.225000f},
- {-1.550000f, 2.137500f, 0.225000f},
- {-1.795303f, 2.103896f, 0.216000f},
- {-1.564800f, 2.104200f, 0.216000f},
- {-1.797466f, 2.073326f, 0.189000f},
- {-1.578400f, 2.073600f, 0.189000f},
- {-1.799246f, 2.048152f, 0.144000f},
- {-1.589600f, 2.048400f, 0.144000f},
- {-1.800455f, 2.031069f, 0.081000f},
- {-1.597200f, 2.031300f, 0.081000f},
- {-2.038410f, 2.240150f, 0.081000f},
- {-2.040000f, 2.246400f, 0.000000f},
- {-2.034093f, 2.223187f, 0.144000f},
- {-2.027731f, 2.198189f, 0.189000f},
- {-2.020006f, 2.167834f, 0.216000f},
- {-2.011600f, 2.134800f, 0.225000f},
- {-2.003194f, 2.101766f, 0.216000f},
- {-1.995469f, 2.071411f, 0.189000f},
- {-1.989107f, 2.046413f, 0.144000f},
- {-1.984790f, 2.029450f, 0.081000f},
- {-1.983200f, 2.023200f, 0.000000f},
- {-2.261676f, 2.231720f, 0.081000f},
- {-2.252655f, 2.215082f, 0.144000f},
- {-2.239361f, 2.190562f, 0.189000f},
- {-2.223218f, 2.160788f, 0.216000f},
- {-2.205650f, 2.128387f, 0.225000f},
- {-2.188082f, 2.095987f, 0.216000f},
- {-2.171939f, 2.066213f, 0.189000f},
- {-2.158645f, 2.041693f, 0.144000f},
- {-2.149624f, 2.025055f, 0.081000f},
- {-2.455229f, 2.215303f, 0.081000f},
- {-2.460000f, 2.221200f, 0.000000f},
- {-2.442278f, 2.199298f, 0.144000f},
- {-2.423194f, 2.175710f, 0.189000f},
- {-2.400019f, 2.147069f, 0.216000f},
- {-2.374800f, 2.115900f, 0.225000f},
- {-2.349581f, 2.084731f, 0.216000f},
- {-2.326406f, 2.056090f, 0.189000f},
- {-2.307322f, 2.032502f, 0.144000f},
- {-2.294371f, 2.016497f, 0.081000f},
- {-2.289600f, 2.010600f, 0.000000f},
- {-2.619050f, 2.188238f, 0.081000f},
- {-2.602900f, 2.173275f, 0.144000f},
- {-2.579100f, 2.151225f, 0.189000f},
- {-2.550200f, 2.124450f, 0.216000f},
- {-2.518750f, 2.095312f, 0.225000f},
- {-2.487300f, 2.066175f, 0.216000f},
- {-2.458400f, 2.039400f, 0.189000f},
- {-2.434600f, 2.017350f, 0.144000f},
- {-2.418450f, 2.002388f, 0.081000f},
- {-2.412500f, 1.996875f, 0.000000f},
- {-2.753123f, 2.147861f, 0.081000f},
- {-2.760000f, 2.152800f, 0.000000f},
- {-2.734458f, 2.134454f, 0.144000f},
- {-2.706950f, 2.114698f, 0.189000f},
- {-2.673549f, 2.090707f, 0.216000f},
- {-2.637200f, 2.064600f, 0.225000f},
- {-2.600851f, 2.038493f, 0.216000f},
- {-2.567450f, 2.014502f, 0.189000f},
- {-2.539942f, 1.994746f, 0.144000f},
- {-2.521277f, 1.981339f, 0.081000f},
- {-2.514400f, 1.976400f, 0.000000f},
- {-2.857432f, 2.091511f, 0.081000f},
- {-2.836889f, 2.080276f, 0.144000f},
- {-2.806615f, 2.063720f, 0.189000f},
- {-2.769854f, 2.043616f, 0.216000f},
- {-2.729850f, 2.021737f, 0.225000f},
- {-2.689846f, 1.999859f, 0.216000f},
- {-2.653085f, 1.979755f, 0.189000f},
- {-2.622811f, 1.963199f, 0.144000f},
- {-2.602268f, 1.951964f, 0.081000f},
- {-2.931958f, 2.016526f, 0.081000f},
- {-2.910131f, 2.008181f, 0.144000f},
- {-2.877965f, 1.995883f, 0.189000f},
- {-2.838906f, 1.980950f, 0.216000f},
- {-2.796400f, 1.964700f, 0.225000f},
- {-2.753894f, 1.948450f, 0.216000f},
- {-2.714835f, 1.933517f, 0.189000f},
- {-2.682669f, 1.921219f, 0.144000f},
- {-2.660842f, 1.912874f, 0.081000f},
- {-2.652800f, 1.909800f, 0.000000f},
- {-2.976687f, 1.920243f, 0.081000f},
- {-2.985000f, 1.921950f, 0.000000f},
- {-2.954122f, 1.915609f, 0.144000f},
- {-2.920870f, 1.908779f, 0.189000f},
- {-2.880491f, 1.900487f, 0.216000f},
- {-2.836550f, 1.891463f, 0.225000f},
- {-2.792609f, 1.882438f, 0.216000f},
- {-2.752230f, 1.874146f, 0.189000f},
- {-2.718978f, 1.867316f, 0.144000f},
- {-2.696413f, 1.862682f, 0.081000f},
- {-2.688100f, 1.860975f, 0.000000f},
- {-2.991600f, 1.800000f, 0.081000f},
- {-2.968800f, 1.800000f, 0.144000f},
- {-2.935200f, 1.800000f, 0.189000f},
- {-2.894400f, 1.800000f, 0.216000f},
- {-2.850000f, 1.800000f, 0.225000f},
- {-2.805600f, 1.800000f, 0.216000f},
- {-2.764800f, 1.800000f, 0.189000f},
- {-2.731200f, 1.800000f, 0.144000f},
- {-2.708400f, 1.800000f, 0.081000f},
- {-2.702175f, 1.724519f, -0.081000f},
- {-2.693900f, 1.726200f, 0.000000f},
- {-2.724637f, 1.719956f, -0.144000f},
- {-2.757739f, 1.713232f, -0.189000f},
- {-2.797934f, 1.705067f, -0.216000f},
- {-2.841675f, 1.696181f, -0.225000f},
- {-2.885416f, 1.687296f, -0.216000f},
- {-2.925611f, 1.679131f, -0.189000f},
- {-2.958713f, 1.672406f, -0.144000f},
- {-2.981175f, 1.667844f, -0.081000f},
- {-2.989450f, 1.666162f, 0.000000f},
- {-2.683107f, 1.638610f, -0.081000f},
- {-2.675200f, 1.641600f, 0.000000f},
- {-2.704570f, 1.630493f, -0.144000f},
- {-2.736198f, 1.618531f, -0.189000f},
- {-2.774605f, 1.604006f, -0.216000f},
- {-2.816400f, 1.588200f, -0.225000f},
- {-2.858195f, 1.572394f, -0.216000f},
- {-2.896602f, 1.557869f, -0.189000f},
- {-2.928230f, 1.545907f, -0.144000f},
- {-2.949693f, 1.537790f, -0.081000f},
- {-2.957600f, 1.534800f, 0.000000f},
- {-2.650604f, 1.544903f, -0.081000f},
- {-2.643300f, 1.548900f, 0.000000f},
- {-2.670428f, 1.534053f, -0.144000f},
- {-2.699644f, 1.518063f, -0.189000f},
- {-2.735119f, 1.498648f, -0.216000f},
- {-2.773725f, 1.477519f, -0.225000f},
- {-2.812331f, 1.456390f, -0.216000f},
- {-2.847806f, 1.436974f, -0.189000f},
- {-2.877022f, 1.420985f, -0.144000f},
- {-2.896846f, 1.410135f, -0.081000f},
- {-2.904150f, 1.406137f, 0.000000f},
- {-2.604074f, 1.446029f, -0.081000f},
- {-2.597600f, 1.450800f, 0.000000f},
- {-2.621645f, 1.433078f, -0.144000f},
- {-2.647539f, 1.413994f, -0.189000f},
- {-2.678982f, 1.390819f, -0.216000f},
- {-2.713200f, 1.365600f, -0.225000f},
- {-2.747418f, 1.340381f, -0.216000f},
- {-2.778861f, 1.317206f, -0.189000f},
- {-2.804755f, 1.298122f, -0.144000f},
- {-2.822326f, 1.285171f, -0.081000f},
- {-2.828800f, 1.280400f, 0.000000f},
- {-2.542925f, 1.344619f, -0.081000f},
- {-2.537500f, 1.350000f, 0.000000f},
- {-2.557650f, 1.330013f, -0.144000f},
- {-2.579350f, 1.308488f, -0.189000f},
- {-2.605700f, 1.282350f, -0.216000f},
- {-2.634375f, 1.253906f, -0.225000f},
- {-2.663050f, 1.225463f, -0.216000f},
- {-2.689400f, 1.199325f, -0.189000f},
- {-2.711100f, 1.177800f, -0.144000f},
- {-2.725825f, 1.163194f, -0.081000f},
- {-2.731250f, 1.157813f, 0.000000f},
- {-2.466566f, 1.243303f, -0.081000f},
- {-2.462400f, 1.249200f, 0.000000f},
- {-2.477875f, 1.227298f, -0.144000f},
- {-2.494541f, 1.203710f, -0.189000f},
- {-2.514778f, 1.175069f, -0.216000f},
- {-2.536800f, 1.143900f, -0.225000f},
- {-2.558822f, 1.112731f, -0.216000f},
- {-2.579059f, 1.084090f, -0.189000f},
- {-2.595725f, 1.060502f, -0.144000f},
- {-2.607034f, 1.044497f, -0.081000f},
- {-2.611200f, 1.038600f, 0.000000f},
- {-2.374406f, 1.144713f, -0.081000f},
- {-2.371700f, 1.151100f, 0.000000f},
- {-2.381752f, 1.127376f, -0.144000f},
- {-2.392576f, 1.101828f, -0.189000f},
- {-2.405721f, 1.070804f, -0.216000f},
- {-2.420025f, 1.037044f, -0.225000f},
- {-2.434329f, 1.003283f, -0.216000f},
- {-2.447474f, 0.972260f, -0.189000f},
- {-2.458298f, 0.946711f, -0.144000f},
- {-2.465644f, 0.929375f, -0.081000f},
- {-2.468350f, 0.922987f, 0.000000f},
- {-2.265853f, 1.051478f, -0.081000f},
- {-2.264800f, 1.058400f, 0.000000f},
- {-2.268710f, 1.032691f, -0.144000f},
- {-2.272922f, 1.005005f, -0.189000f},
- {-2.278035f, 0.971386f, -0.216000f},
- {-2.283600f, 0.934800f, -0.225000f},
- {-2.289165f, 0.898214f, -0.216000f},
- {-2.294278f, 0.864595f, -0.189000f},
- {-2.298490f, 0.836909f, -0.144000f},
- {-2.301347f, 0.818122f, -0.081000f},
- {-2.302400f, 0.811200f, 0.000000f},
- {-2.140315f, 0.966231f, -0.081000f},
- {-2.141100f, 0.973800f, 0.000000f},
- {-2.138183f, 0.945685f, -0.144000f},
- {-2.135041f, 0.915407f, -0.189000f},
- {-2.131226f, 0.878641f, -0.216000f},
- {-2.127075f, 0.838631f, -0.225000f},
- {-2.122924f, 0.798621f, -0.216000f},
- {-2.119109f, 0.761855f, -0.189000f},
- {-2.115967f, 0.731578f, -0.144000f},
- {-2.113835f, 0.711032f, -0.081000f},
- {-2.113050f, 0.703463f, 0.000000f},
- {-1.997200f, 0.891600f, -0.081000f},
- {-1.989600f, 0.868800f, -0.144000f},
- {-1.978400f, 0.835200f, -0.189000f},
- {-1.964800f, 0.794400f, -0.216000f},
- {-1.950000f, 0.750000f, -0.225000f},
- {-1.935200f, 0.705600f, -0.216000f},
- {-1.921600f, 0.664800f, -0.189000f},
- {-1.910400f, 0.631200f, -0.144000f},
- {-1.902800f, 0.608400f, -0.081000f},
- {-1.900000f, 0.600000f, 0.000000f},
- {-2.981175f, 1.667844f, 0.081000f},
- {-2.958713f, 1.672406f, 0.144000f},
- {-2.925611f, 1.679131f, 0.189000f},
- {-2.885416f, 1.687296f, 0.216000f},
- {-2.841675f, 1.696181f, 0.225000f},
- {-2.797934f, 1.705067f, 0.216000f},
- {-2.757739f, 1.713232f, 0.189000f},
- {-2.724637f, 1.719956f, 0.144000f},
- {-2.702175f, 1.724519f, 0.081000f},
- {-2.949693f, 1.537790f, 0.081000f},
- {-2.957600f, 1.534800f, 0.000000f},
- {-2.928230f, 1.545907f, 0.144000f},
- {-2.896602f, 1.557869f, 0.189000f},
- {-2.858195f, 1.572394f, 0.216000f},
- {-2.816400f, 1.588200f, 0.225000f},
- {-2.774605f, 1.604006f, 0.216000f},
- {-2.736198f, 1.618531f, 0.189000f},
- {-2.704570f, 1.630493f, 0.144000f},
- {-2.683107f, 1.638610f, 0.081000f},
- {-2.675200f, 1.641600f, 0.000000f},
- {-2.896846f, 1.410135f, 0.081000f},
- {-2.904150f, 1.406137f, 0.000000f},
- {-2.877022f, 1.420985f, 0.144000f},
- {-2.847806f, 1.436974f, 0.189000f},
- {-2.812331f, 1.456390f, 0.216000f},
- {-2.773725f, 1.477519f, 0.225000f},
- {-2.735119f, 1.498648f, 0.216000f},
- {-2.699644f, 1.518063f, 0.189000f},
- {-2.670428f, 1.534053f, 0.144000f},
- {-2.650604f, 1.544903f, 0.081000f},
- {-2.822326f, 1.285171f, 0.081000f},
- {-2.804755f, 1.298122f, 0.144000f},
- {-2.778861f, 1.317206f, 0.189000f},
- {-2.747418f, 1.340381f, 0.216000f},
- {-2.713200f, 1.365600f, 0.225000f},
- {-2.678982f, 1.390819f, 0.216000f},
- {-2.647539f, 1.413994f, 0.189000f},
- {-2.621645f, 1.433078f, 0.144000f},
- {-2.604074f, 1.446029f, 0.081000f},
- {-2.725825f, 1.163194f, 0.081000f},
- {-2.731250f, 1.157813f, 0.000000f},
- {-2.711100f, 1.177800f, 0.144000f},
- {-2.689400f, 1.199325f, 0.189000f},
- {-2.663050f, 1.225463f, 0.216000f},
- {-2.634375f, 1.253906f, 0.225000f},
- {-2.605700f, 1.282350f, 0.216000f},
- {-2.579350f, 1.308488f, 0.189000f},
- {-2.557650f, 1.330013f, 0.144000f},
- {-2.542925f, 1.344619f, 0.081000f},
- {-2.537500f, 1.350000f, 0.000000f},
- {-2.607034f, 1.044497f, 0.081000f},
- {-2.611200f, 1.038600f, 0.000000f},
- {-2.595725f, 1.060502f, 0.144000f},
- {-2.579059f, 1.084090f, 0.189000f},
- {-2.558822f, 1.112731f, 0.216000f},
- {-2.536800f, 1.143900f, 0.225000f},
- {-2.514778f, 1.175069f, 0.216000f},
- {-2.494541f, 1.203710f, 0.189000f},
- {-2.477875f, 1.227298f, 0.144000f},
- {-2.466566f, 1.243303f, 0.081000f},
- {-2.462400f, 1.249200f, 0.000000f},
- {-2.465644f, 0.929375f, 0.081000f},
- {-2.458298f, 0.946711f, 0.144000f},
- {-2.447474f, 0.972260f, 0.189000f},
- {-2.434329f, 1.003283f, 0.216000f},
- {-2.420025f, 1.037044f, 0.225000f},
- {-2.405721f, 1.070804f, 0.216000f},
- {-2.392576f, 1.101828f, 0.189000f},
- {-2.381752f, 1.127376f, 0.144000f},
- {-2.374406f, 1.144713f, 0.081000f},
- {-2.301347f, 0.818122f, 0.081000f},
- {-2.302400f, 0.811200f, 0.000000f},
- {-2.298490f, 0.836909f, 0.144000f},
- {-2.294278f, 0.864595f, 0.189000f},
- {-2.289165f, 0.898214f, 0.216000f},
- {-2.283600f, 0.934800f, 0.225000f},
- {-2.278035f, 0.971386f, 0.216000f},
- {-2.272922f, 1.005005f, 0.189000f},
- {-2.268710f, 1.032691f, 0.144000f},
- {-2.265853f, 1.051478f, 0.081000f},
- {-2.264800f, 1.058400f, 0.000000f},
- {-2.113835f, 0.711032f, 0.081000f},
- {-2.113050f, 0.703463f, 0.000000f},
- {-2.115967f, 0.731578f, 0.144000f},
- {-2.119109f, 0.761855f, 0.189000f},
- {-2.122924f, 0.798621f, 0.216000f},
- {-2.127075f, 0.838631f, 0.225000f},
- {-2.131226f, 0.878641f, 0.216000f},
- {-2.135041f, 0.915407f, 0.189000f},
- {-2.138183f, 0.945685f, 0.144000f},
- {-2.140315f, 0.966231f, 0.081000f},
- {-2.141100f, 0.973800f, 0.000000f},
- {-1.902800f, 0.608400f, 0.081000f},
- {-1.900000f, 0.600000f, 0.000000f},
- {-1.910400f, 0.631200f, 0.144000f},
- {-1.921600f, 0.664800f, 0.189000f},
- {-1.935200f, 0.705600f, 0.216000f},
- {-1.950000f, 0.750000f, 0.225000f},
- {-1.964800f, 0.794400f, 0.216000f},
- {-1.978400f, 0.835200f, 0.189000f},
- {-1.989600f, 0.868800f, 0.144000f},
- {-1.997200f, 0.891600f, 0.081000f},
- {-2.000000f, 0.900000f, 0.000000f},
- {1.939394f, 1.423221f, -0.175100f},
- {1.700000f, 1.401900f, -0.178200f},
- {1.700000f, 1.425000f, 0.000000f},
- {1.935900f, 1.444200f, 0.000000f},
- {1.948879f, 1.366278f, -0.311290f},
- {1.700000f, 1.339200f, -0.316800f},
- {1.962857f, 1.282362f, -0.408568f},
- {1.700000f, 1.246800f, -0.415800f},
- {1.979830f, 1.180464f, -0.466934f},
- {1.700000f, 1.134600f, -0.475200f},
- {1.998300f, 1.069575f, -0.486390f},
- {1.700000f, 1.012500f, -0.495000f},
- {2.016770f, 0.958686f, -0.466934f},
- {1.700000f, 0.890400f, -0.475200f},
- {2.033743f, 0.856788f, -0.408568f},
- {1.700000f, 0.778200f, -0.415800f},
- {2.047721f, 0.772872f, -0.311290f},
- {1.700000f, 0.685800f, -0.316800f},
- {2.057206f, 0.715929f, -0.175100f},
- {1.700000f, 0.623100f, -0.178200f},
- {2.060700f, 0.694950f, 0.000000f},
- {1.700000f, 0.600000f, 0.000000f},
- {2.116979f, 1.479120f, -0.166687f},
- {2.111200f, 1.497600f, 0.000000f},
- {2.132666f, 1.428960f, -0.296333f},
- {2.155782f, 1.355040f, -0.388937f},
- {2.183853f, 1.265280f, -0.444499f},
- {2.214400f, 1.167600f, -0.463020f},
- {2.244947f, 1.069920f, -0.444499f},
- {2.273018f, 0.980160f, -0.388937f},
- {2.296134f, 0.906240f, -0.296333f},
- {2.311821f, 0.856080f, -0.166687f},
- {2.317600f, 0.837600f, 0.000000f},
- {2.244457f, 1.563171f, -0.154289f},
- {2.237300f, 1.578900f, 0.000000f},
- {2.263882f, 1.520478f, -0.274291f},
- {2.292510f, 1.457562f, -0.360007f},
- {2.327271f, 1.381164f, -0.411437f},
- {2.365100f, 1.298025f, -0.428580f},
- {2.402929f, 1.214886f, -0.411437f},
- {2.437690f, 1.138488f, -0.360007f},
- {2.466318f, 1.075572f, -0.274291f},
- {2.485743f, 1.032879f, -0.154289f},
- {2.492900f, 1.017150f, 0.000000f},
- {2.333530f, 1.668948f, -0.139234f},
- {2.325600f, 1.681800f, 0.000000f},
- {2.355053f, 1.634064f, -0.247526f},
- {2.386771f, 1.582656f, -0.324878f},
- {2.425286f, 1.520232f, -0.371290f},
- {2.467200f, 1.452300f, -0.386760f},
- {2.509114f, 1.384368f, -0.371290f},
- {2.547629f, 1.321944f, -0.324878f},
- {2.579347f, 1.270536f, -0.247526f},
- {2.600870f, 1.235652f, -0.139234f},
- {2.608800f, 1.222800f, 0.000000f},
- {2.395900f, 1.790025f, -0.122850f},
- {2.387500f, 1.800000f, 0.000000f},
- {2.418700f, 1.762950f, -0.218400f},
- {2.452300f, 1.723050f, -0.286650f},
- {2.493100f, 1.674600f, -0.327600f},
- {2.537500f, 1.621875f, -0.341250f},
- {2.581900f, 1.569150f, -0.327600f},
- {2.622700f, 1.520700f, -0.286650f},
- {2.656300f, 1.480800f, -0.218400f},
- {2.679100f, 1.453725f, -0.122850f},
- {2.687500f, 1.443750f, 0.000000f},
- {2.443270f, 1.919976f, -0.106466f},
- {2.434400f, 1.927200f, 0.000000f},
- {2.467347f, 1.900368f, -0.189274f},
- {2.502829f, 1.871472f, -0.248422f},
- {2.545914f, 1.836384f, -0.283910f},
- {2.592800f, 1.798200f, -0.295740f},
- {2.639686f, 1.760016f, -0.283910f},
- {2.682771f, 1.724928f, -0.248422f},
- {2.718253f, 1.696032f, -0.189274f},
- {2.742330f, 1.676424f, -0.106466f},
- {2.751200f, 1.669200f, 0.000000f},
- {2.487343f, 2.052375f, -0.091411f},
- {2.477700f, 2.057100f, 0.000000f},
- {2.513518f, 2.039550f, -0.162509f},
- {2.552090f, 2.020650f, -0.213293f},
- {2.598929f, 1.997700f, -0.243763f},
- {2.649900f, 1.972725f, -0.253920f},
- {2.700871f, 1.947750f, -0.243763f},
- {2.747710f, 1.924800f, -0.213293f},
- {2.786282f, 1.905900f, -0.162509f},
- {2.812457f, 1.893075f, -0.091411f},
- {2.822100f, 1.888350f, 0.000000f},
- {2.539821f, 2.180796f, -0.079013f},
- {2.528800f, 2.183400f, 0.000000f},
- {2.569734f, 2.173728f, -0.140467f},
- {2.613818f, 2.163312f, -0.184363f},
- {2.667347f, 2.150664f, -0.210701f},
- {2.725600f, 2.136900f, -0.219480f},
- {2.783853f, 2.123136f, -0.210701f},
- {2.837382f, 2.110488f, -0.184363f},
- {2.881466f, 2.100072f, -0.140467f},
- {2.911379f, 2.093004f, -0.079013f},
- {2.922400f, 2.090400f, 0.000000f},
- {2.612406f, 2.298813f, -0.070600f},
- {2.599100f, 2.299800f, 0.000000f},
- {2.648521f, 2.296134f, -0.125510f},
- {2.701743f, 2.292186f, -0.164732f},
- {2.766370f, 2.287392f, -0.188266f},
- {2.836700f, 2.282175f, -0.196110f},
- {2.907030f, 2.276958f, -0.188266f},
- {2.971657f, 2.272164f, -0.164732f},
- {3.024879f, 2.268216f, -0.125510f},
- {3.060994f, 2.265537f, -0.070600f},
- {3.074300f, 2.264550f, 0.000000f},
- {2.716800f, 2.400000f, -0.067500f},
- {2.700000f, 2.400000f, 0.000000f},
- {2.762400f, 2.400000f, -0.120000f},
- {2.829600f, 2.400000f, -0.157500f},
- {2.911200f, 2.400000f, -0.180000f},
- {3.000000f, 2.400000f, -0.187500f},
- {3.088800f, 2.400000f, -0.180000f},
- {3.170400f, 2.400000f, -0.157500f},
- {3.237600f, 2.400000f, -0.120000f},
- {3.283200f, 2.400000f, -0.067500f},
- {3.300000f, 2.400000f, 0.000000f},
- {2.057206f, 0.715929f, 0.175100f},
- {1.700000f, 0.623100f, 0.178200f},
- {1.700000f, 0.600000f, 0.000000f},
- {2.060700f, 0.694950f, 0.000000f},
- {2.047721f, 0.772872f, 0.311290f},
- {1.700000f, 0.685800f, 0.316800f},
- {2.033743f, 0.856788f, 0.408568f},
- {1.700000f, 0.778200f, 0.415800f},
- {2.016770f, 0.958686f, 0.466934f},
- {1.700000f, 0.890400f, 0.475200f},
- {1.998300f, 1.069575f, 0.486390f},
- {1.700000f, 1.012500f, 0.495000f},
- {1.979830f, 1.180464f, 0.466934f},
- {1.700000f, 1.134600f, 0.475200f},
- {1.962857f, 1.282362f, 0.408568f},
- {1.700000f, 1.246800f, 0.415800f},
- {1.948879f, 1.366278f, 0.311290f},
- {1.700000f, 1.339200f, 0.316800f},
- {1.939394f, 1.423221f, 0.175100f},
- {1.700000f, 1.401900f, 0.178200f},
- {1.935900f, 1.444200f, 0.000000f},
- {1.700000f, 1.425000f, 0.000000f},
- {2.311821f, 0.856080f, 0.166687f},
- {2.317600f, 0.837600f, 0.000000f},
- {2.296134f, 0.906240f, 0.296333f},
- {2.273018f, 0.980160f, 0.388937f},
- {2.244947f, 1.069920f, 0.444499f},
- {2.214400f, 1.167600f, 0.463020f},
- {2.183853f, 1.265280f, 0.444499f},
- {2.155782f, 1.355040f, 0.388937f},
- {2.132666f, 1.428960f, 0.296333f},
- {2.116979f, 1.479120f, 0.166687f},
- {2.111200f, 1.497600f, 0.000000f},
- {2.485743f, 1.032879f, 0.154289f},
- {2.492900f, 1.017150f, 0.000000f},
- {2.466318f, 1.075572f, 0.274291f},
- {2.437690f, 1.138488f, 0.360007f},
- {2.402929f, 1.214886f, 0.411437f},
- {2.365100f, 1.298025f, 0.428580f},
- {2.327271f, 1.381164f, 0.411437f},
- {2.292510f, 1.457562f, 0.360007f},
- {2.263882f, 1.520478f, 0.274291f},
- {2.244457f, 1.563171f, 0.154289f},
- {2.237300f, 1.578900f, 0.000000f},
- {2.600870f, 1.235652f, 0.139234f},
- {2.608800f, 1.222800f, 0.000000f},
- {2.579347f, 1.270536f, 0.247526f},
- {2.547629f, 1.321944f, 0.324878f},
- {2.509114f, 1.384368f, 0.371290f},
- {2.467200f, 1.452300f, 0.386760f},
- {2.425286f, 1.520232f, 0.371290f},
- {2.386771f, 1.582656f, 0.324878f},
- {2.355053f, 1.634064f, 0.247526f},
- {2.333530f, 1.668948f, 0.139234f},
- {2.325600f, 1.681800f, 0.000000f},
- {2.679100f, 1.453725f, 0.122850f},
- {2.687500f, 1.443750f, 0.000000f},
- {2.656300f, 1.480800f, 0.218400f},
- {2.622700f, 1.520700f, 0.286650f},
- {2.581900f, 1.569150f, 0.327600f},
- {2.537500f, 1.621875f, 0.341250f},
- {2.493100f, 1.674600f, 0.327600f},
- {2.452300f, 1.723050f, 0.286650f},
- {2.418700f, 1.762950f, 0.218400f},
- {2.395900f, 1.790025f, 0.122850f},
- {2.387500f, 1.800000f, 0.000000f},
- {2.742330f, 1.676424f, 0.106466f},
- {2.751200f, 1.669200f, 0.000000f},
- {2.718253f, 1.696032f, 0.189274f},
- {2.682771f, 1.724928f, 0.248422f},
- {2.639686f, 1.760016f, 0.283910f},
- {2.592800f, 1.798200f, 0.295740f},
- {2.545914f, 1.836384f, 0.283910f},
- {2.502829f, 1.871472f, 0.248422f},
- {2.467347f, 1.900368f, 0.189274f},
- {2.443270f, 1.919976f, 0.106466f},
- {2.434400f, 1.927200f, 0.000000f},
- {2.812457f, 1.893075f, 0.091411f},
- {2.822100f, 1.888350f, 0.000000f},
- {2.786282f, 1.905900f, 0.162509f},
- {2.747710f, 1.924800f, 0.213293f},
- {2.700871f, 1.947750f, 0.243763f},
- {2.649900f, 1.972725f, 0.253920f},
- {2.598929f, 1.997700f, 0.243763f},
- {2.552090f, 2.020650f, 0.213293f},
- {2.513518f, 2.039550f, 0.162509f},
- {2.487343f, 2.052375f, 0.091411f},
- {2.477700f, 2.057100f, 0.000000f},
- {2.911379f, 2.093004f, 0.079013f},
- {2.881466f, 2.100072f, 0.140467f},
- {2.837382f, 2.110488f, 0.184363f},
- {2.783853f, 2.123136f, 0.210701f},
- {2.725600f, 2.136900f, 0.219480f},
- {2.667347f, 2.150664f, 0.210701f},
- {2.613818f, 2.163312f, 0.184363f},
- {2.569734f, 2.173728f, 0.140467f},
- {2.539821f, 2.180796f, 0.079013f},
- {3.060994f, 2.265537f, 0.070600f},
- {3.074300f, 2.264550f, 0.000000f},
- {3.024879f, 2.268216f, 0.125510f},
- {2.971657f, 2.272164f, 0.164732f},
- {2.907030f, 2.276958f, 0.188266f},
- {2.836700f, 2.282175f, 0.196110f},
- {2.766370f, 2.287392f, 0.188266f},
- {2.701743f, 2.292186f, 0.164732f},
- {2.648521f, 2.296134f, 0.125510f},
- {2.612406f, 2.298813f, 0.070600f},
- {2.599100f, 2.299800f, 0.000000f},
- {3.283200f, 2.400000f, 0.067500f},
- {3.300000f, 2.400000f, 0.000000f},
- {3.237600f, 2.400000f, 0.120000f},
- {3.170400f, 2.400000f, 0.157500f},
- {3.088800f, 2.400000f, 0.180000f},
- {3.000000f, 2.400000f, 0.187500f},
- {2.911200f, 2.400000f, 0.180000f},
- {2.829600f, 2.400000f, 0.157500f},
- {2.762400f, 2.400000f, 0.120000f},
- {2.716800f, 2.400000f, 0.067500f},
- {2.700000f, 2.400000f, 0.000000f},
- {2.747407f, 2.420406f, -0.066744f},
- {2.716800f, 2.400000f, -0.067500f},
- {2.700000f, 2.400000f, 0.000000f},
- {2.729800f, 2.420250f, 0.000000f},
- {2.795198f, 2.420829f, -0.118656f},
- {2.762400f, 2.400000f, -0.120000f},
- {2.865626f, 2.421453f, -0.155736f},
- {2.829600f, 2.400000f, -0.157500f},
- {2.951146f, 2.422210f, -0.177984f},
- {2.911200f, 2.400000f, -0.180000f},
- {3.044212f, 2.423034f, -0.185400f},
- {3.000000f, 2.400000f, -0.187500f},
- {3.137279f, 2.423859f, -0.177984f},
- {3.088800f, 2.400000f, -0.180000f},
- {3.222799f, 2.424616f, -0.155736f},
- {3.170400f, 2.400000f, -0.157500f},
- {3.293227f, 2.425240f, -0.118656f},
- {3.237600f, 2.400000f, -0.120000f},
- {3.341018f, 2.425663f, -0.066744f},
- {3.283200f, 2.400000f, -0.067500f},
- {3.358625f, 2.425819f, 0.000000f},
- {2.776365f, 2.436302f, -0.064692f},
- {2.758400f, 2.436000f, 0.000000f},
- {2.825126f, 2.437123f, -0.115008f},
- {2.896986f, 2.438333f, -0.150948f},
- {2.984243f, 2.439802f, -0.172512f},
- {3.079200f, 2.441400f, -0.179700f},
- {3.174157f, 2.442998f, -0.172512f},
- {3.261414f, 2.444467f, -0.150948f},
- {3.333274f, 2.445677f, -0.115008f},
- {3.382035f, 2.446498f, -0.064692f},
- {3.400000f, 2.446800f, 0.000000f},
- {2.802528f, 2.447680f, -0.061668f},
- {2.784600f, 2.447250f, 0.000000f},
- {2.851189f, 2.448847f, -0.109632f},
- {2.922899f, 2.450567f, -0.143892f},
- {3.009977f, 2.452655f, -0.164448f},
- {3.104737f, 2.454928f, -0.171300f},
- {3.199498f, 2.457201f, -0.164448f},
- {3.286576f, 2.459289f, -0.143892f},
- {3.358286f, 2.461009f, -0.109632f},
- {3.406947f, 2.462176f, -0.061668f},
- {3.424875f, 2.462606f, 0.000000f},
- {2.824750f, 2.454529f, -0.057996f},
- {2.807200f, 2.454000f, 0.000000f},
- {2.872387f, 2.455966f, -0.103104f},
- {2.942589f, 2.458082f, -0.135324f},
- {3.027834f, 2.460653f, -0.154656f},
- {3.120600f, 2.463450f, -0.161100f},
- {3.213366f, 2.466247f, -0.154656f},
- {3.298611f, 2.468818f, -0.135324f},
- {3.368813f, 2.470934f, -0.103104f},
- {3.416450f, 2.472371f, -0.057996f},
- {3.434000f, 2.472900f, 0.000000f},
- {2.841887f, 2.456841f, -0.054000f},
- {2.825000f, 2.456250f, 0.000000f},
- {2.887725f, 2.458444f, -0.096000f},
- {2.955275f, 2.460806f, -0.126000f},
- {3.037300f, 2.463675f, -0.144000f},
- {3.126562f, 2.466797f, -0.150000f},
- {3.215825f, 2.469919f, -0.144000f},
- {3.297850f, 2.472787f, -0.126000f},
- {3.365400f, 2.475150f, -0.096000f},
- {3.411237f, 2.476753f, -0.054000f},
- {3.428125f, 2.477344f, 0.000000f},
- {2.852794f, 2.454605f, -0.050004f},
- {2.836800f, 2.454000f, 0.000000f},
- {2.896205f, 2.456246f, -0.088896f},
- {2.960179f, 2.458666f, -0.116676f},
- {3.037862f, 2.461603f, -0.133344f},
- {3.122400f, 2.464800f, -0.138900f},
- {3.206938f, 2.467997f, -0.133344f},
- {3.284621f, 2.470934f, -0.116676f},
- {3.348595f, 2.473354f, -0.088896f},
- {3.392006f, 2.474995f, -0.050004f},
- {3.408000f, 2.475600f, 0.000000f},
- {2.856323f, 2.447812f, -0.046332f},
- {2.841400f, 2.447250f, 0.000000f},
- {2.896829f, 2.449338f, -0.082368f},
- {2.956523f, 2.451588f, -0.108108f},
- {3.029007f, 2.454319f, -0.123552f},
- {3.107887f, 2.457291f, -0.128700f},
- {3.186768f, 2.460263f, -0.123552f},
- {3.259252f, 2.462994f, -0.108108f},
- {3.318946f, 2.465243f, -0.082368f},
- {3.359452f, 2.466769f, -0.046332f},
- {3.374375f, 2.467331f, 0.000000f},
- {2.851331f, 2.436454f, -0.043308f},
- {2.837600f, 2.436000f, 0.000000f},
- {2.888602f, 2.437685f, -0.076992f},
- {2.943526f, 2.439499f, -0.101052f},
- {3.010221f, 2.441702f, -0.115488f},
- {3.082800f, 2.444100f, -0.120300f},
- {3.155379f, 2.446498f, -0.115488f},
- {3.222074f, 2.448701f, -0.101052f},
- {3.276998f, 2.450515f, -0.076992f},
- {3.314269f, 2.451746f, -0.043308f},
- {3.328000f, 2.452200f, 0.000000f},
- {2.836672f, 2.420519f, -0.041256f},
- {2.824200f, 2.420250f, 0.000000f},
- {2.870524f, 2.421250f, -0.073344f},
- {2.920412f, 2.422328f, -0.096264f},
- {2.980990f, 2.423636f, -0.110016f},
- {3.046912f, 2.425059f, -0.114600f},
- {3.112835f, 2.426483f, -0.110016f},
- {3.173413f, 2.427791f, -0.096264f},
- {3.223301f, 2.428868f, -0.073344f},
- {3.257153f, 2.429599f, -0.041256f},
- {3.269625f, 2.429869f, 0.000000f},
- {2.811200f, 2.400000f, -0.040500f},
- {2.800000f, 2.400000f, 0.000000f},
- {2.841600f, 2.400000f, -0.072000f},
- {2.886400f, 2.400000f, -0.094500f},
- {2.940800f, 2.400000f, -0.108000f},
- {3.000000f, 2.400000f, -0.112500f},
- {3.059200f, 2.400000f, -0.108000f},
- {3.113600f, 2.400000f, -0.094500f},
- {3.158400f, 2.400000f, -0.072000f},
- {3.188800f, 2.400000f, -0.040500f},
- {3.200000f, 2.400000f, 0.000000f},
- {3.341018f, 2.425663f, 0.066744f},
- {3.293227f, 2.425240f, 0.118656f},
- {3.222799f, 2.424616f, 0.155736f},
- {3.137279f, 2.423859f, 0.177984f},
- {3.044212f, 2.423034f, 0.185400f},
- {2.951146f, 2.422210f, 0.177984f},
- {2.865626f, 2.421453f, 0.155736f},
- {2.829600f, 2.400000f, 0.157500f},
- {2.795198f, 2.420829f, 0.118656f},
- {2.762400f, 2.400000f, 0.120000f},
- {2.747407f, 2.420406f, 0.066744f},
- {2.716800f, 2.400000f, 0.067500f},
- {3.382035f, 2.446498f, 0.064692f},
- {3.333274f, 2.445677f, 0.115008f},
- {3.261414f, 2.444467f, 0.150948f},
- {3.174157f, 2.442998f, 0.172512f},
- {3.079200f, 2.441400f, 0.179700f},
- {2.984243f, 2.439802f, 0.172512f},
- {2.896986f, 2.438333f, 0.150948f},
- {2.825126f, 2.437123f, 0.115008f},
- {2.776365f, 2.436302f, 0.064692f},
- {3.406947f, 2.462176f, 0.061668f},
- {3.358286f, 2.461009f, 0.109632f},
- {3.286576f, 2.459289f, 0.143892f},
- {3.199498f, 2.457201f, 0.164448f},
- {3.104738f, 2.454928f, 0.171300f},
- {3.009977f, 2.452655f, 0.164448f},
- {2.922899f, 2.450567f, 0.143892f},
- {2.851189f, 2.448847f, 0.109632f},
- {2.802528f, 2.447680f, 0.061668f},
- {2.784600f, 2.447250f, 0.000000f},
- {3.416450f, 2.472371f, 0.057996f},
- {3.368813f, 2.470934f, 0.103104f},
- {3.298611f, 2.468818f, 0.135324f},
- {3.213366f, 2.466247f, 0.154656f},
- {3.120600f, 2.463450f, 0.161100f},
- {3.027834f, 2.460653f, 0.154656f},
- {2.942589f, 2.458082f, 0.135324f},
- {2.872387f, 2.455966f, 0.103104f},
- {2.824750f, 2.454529f, 0.057996f},
- {3.411237f, 2.476753f, 0.054000f},
- {3.428125f, 2.477344f, 0.000000f},
- {3.365400f, 2.475150f, 0.096000f},
- {3.297850f, 2.472788f, 0.126000f},
- {3.215825f, 2.469919f, 0.144000f},
- {3.126562f, 2.466797f, 0.150000f},
- {3.037300f, 2.463675f, 0.144000f},
- {2.955275f, 2.460806f, 0.126000f},
- {2.887725f, 2.458444f, 0.096000f},
- {2.841887f, 2.456841f, 0.054000f},
- {2.825000f, 2.456250f, 0.000000f},
- {3.392006f, 2.474995f, 0.050004f},
- {3.408000f, 2.475600f, 0.000000f},
- {3.348595f, 2.473354f, 0.088896f},
- {3.284621f, 2.470934f, 0.116676f},
- {3.206938f, 2.467997f, 0.133344f},
- {3.122400f, 2.464800f, 0.138900f},
- {3.037862f, 2.461603f, 0.133344f},
- {2.960179f, 2.458666f, 0.116676f},
- {2.896205f, 2.456246f, 0.088896f},
- {2.852794f, 2.454605f, 0.050004f},
- {2.836800f, 2.454000f, 0.000000f},
- {3.359452f, 2.466769f, 0.046332f},
- {3.374375f, 2.467331f, 0.000000f},
- {3.318946f, 2.465243f, 0.082368f},
- {3.259252f, 2.462994f, 0.108108f},
- {3.186768f, 2.460263f, 0.123552f},
- {3.107887f, 2.457291f, 0.128700f},
- {3.029007f, 2.454319f, 0.123552f},
- {2.956523f, 2.451588f, 0.108108f},
- {2.896829f, 2.449338f, 0.082368f},
- {2.856323f, 2.447812f, 0.046332f},
- {2.841400f, 2.447250f, 0.000000f},
- {3.314269f, 2.451746f, 0.043308f},
- {3.328000f, 2.452200f, 0.000000f},
- {3.276998f, 2.450515f, 0.076992f},
- {3.222074f, 2.448701f, 0.101052f},
- {3.155379f, 2.446498f, 0.115488f},
- {3.082800f, 2.444100f, 0.120300f},
- {3.010221f, 2.441702f, 0.115488f},
- {2.943526f, 2.439499f, 0.101052f},
- {2.888602f, 2.437685f, 0.076992f},
- {2.851331f, 2.436454f, 0.043308f},
- {2.837600f, 2.436000f, 0.000000f},
- {3.257153f, 2.429599f, 0.041256f},
- {3.269625f, 2.429869f, 0.000000f},
- {3.223301f, 2.428868f, 0.073344f},
- {3.173413f, 2.427791f, 0.096264f},
- {3.112835f, 2.426483f, 0.110016f},
- {3.046912f, 2.425059f, 0.114600f},
- {2.980990f, 2.423636f, 0.110016f},
- {2.920412f, 2.422328f, 0.096264f},
- {2.870524f, 2.421250f, 0.073344f},
- {2.836672f, 2.420519f, 0.041256f},
- {2.824200f, 2.420250f, 0.000000f},
- {3.188800f, 2.400000f, 0.040500f},
- {3.158400f, 2.400000f, 0.072000f},
- {3.113600f, 2.400000f, 0.094500f},
- {3.059200f, 2.400000f, 0.108000f},
- {3.000000f, 2.400000f, 0.112500f},
- {2.940800f, 2.400000f, 0.108000f},
- {2.886400f, 2.400000f, 0.094500f},
- {2.841600f, 2.400000f, 0.072000f},
- {2.811200f, 2.400000f, 0.040500f},
- {0.000000f, 3.150000f, 0.000000f},
- {0.194600f, 3.141450f, 0.000000f},
- {0.192107f, 3.141450f, -0.032048f},
- {0.184870f, 3.141450f, -0.062272f},
- {0.173255f, 3.141450f, -0.090306f},
- {0.157626f, 3.141450f, -0.115787f},
- {0.138348f, 3.141450f, -0.138348f},
- {0.115787f, 3.141450f, -0.157626f},
- {0.090306f, 3.141450f, -0.173255f},
- {0.062272f, 3.141450f, -0.184870f},
- {0.032048f, 3.141450f, -0.192107f},
- {-0.000000f, 3.141450f, -0.194600f},
- {0.304843f, 3.117600f, -0.050855f},
- {0.308800f, 3.117600f, 0.000000f},
- {0.293360f, 3.117600f, -0.098814f},
- {0.274928f, 3.117600f, -0.143301f},
- {0.250127f, 3.117600f, -0.183734f},
- {0.219536f, 3.117600f, -0.219536f},
- {0.183734f, 3.117600f, -0.250127f},
- {0.143301f, 3.117600f, -0.274928f},
- {0.098814f, 3.117600f, -0.293360f},
- {0.050855f, 3.117600f, -0.304843f},
- {-0.000000f, 3.117600f, -0.308800f},
- {0.353610f, 3.081150f, -0.058988f},
- {0.358200f, 3.081150f, 0.000000f},
- {0.340289f, 3.081150f, -0.114619f},
- {0.318907f, 3.081150f, -0.166221f},
- {0.290138f, 3.081150f, -0.213123f},
- {0.254653f, 3.081150f, -0.254653f},
- {0.213123f, 3.081150f, -0.290138f},
- {0.166221f, 3.081150f, -0.318907f},
- {0.114619f, 3.081150f, -0.340289f},
- {0.058988f, 3.081150f, -0.353610f},
- {-0.000000f, 3.081150f, -0.358200f},
- {0.353807f, 3.034800f, -0.059016f},
- {0.358400f, 3.034800f, 0.000000f},
- {0.340477f, 3.034800f, -0.114676f},
- {0.319082f, 3.034800f, -0.166306f},
- {0.290295f, 3.034800f, -0.213234f},
- {0.254788f, 3.034800f, -0.254788f},
- {0.213234f, 3.034800f, -0.290295f},
- {0.166306f, 3.034800f, -0.319082f},
- {0.114676f, 3.034800f, -0.340477f},
- {0.059016f, 3.034800f, -0.353807f},
- {0.000000f, 3.034800f, -0.358400f},
- {0.320834f, 2.981250f, -0.053508f},
- {0.325000f, 2.981250f, 0.000000f},
- {0.308744f, 2.981250f, -0.103976f},
- {0.289340f, 2.981250f, -0.150793f},
- {0.263232f, 2.981250f, -0.193348f},
- {0.231031f, 2.981250f, -0.231031f},
- {0.193348f, 2.981250f, -0.263232f},
- {0.150793f, 2.981250f, -0.289340f},
- {0.103976f, 2.981250f, -0.308744f},
- {0.053508f, 2.981250f, -0.320834f},
- {-0.000000f, 2.981250f, -0.325000f},
- {0.270092f, 2.923200f, -0.045032f},
- {0.273600f, 2.923200f, 0.000000f},
- {0.259910f, 2.923200f, -0.087511f},
- {0.243569f, 2.923200f, -0.126920f},
- {0.221585f, 2.923200f, -0.162745f},
- {0.194472f, 2.923200f, -0.194472f},
- {0.162745f, 2.923200f, -0.221585f},
- {0.126920f, 2.923200f, -0.243569f},
- {0.087511f, 2.923200f, -0.259910f},
- {0.045032f, 2.923200f, -0.270092f},
- {-0.000000f, 2.923200f, -0.273600f},
- {0.216979f, 2.863350f, -0.036157f},
- {0.219800f, 2.863350f, 0.000000f},
- {0.208794f, 2.863350f, -0.070270f},
- {0.195658f, 2.863350f, -0.101925f},
- {0.177989f, 2.863350f, -0.130707f},
- {0.156200f, 2.863350f, -0.156200f},
- {0.130707f, 2.863350f, -0.177989f},
- {0.101925f, 2.863350f, -0.195658f},
- {0.070270f, 2.863350f, -0.208794f},
- {0.036157f, 2.863350f, -0.216979f},
- {-0.000000f, 2.863350f, -0.219800f},
- {0.176897f, 2.804400f, -0.029450f},
- {0.179200f, 2.804400f, 0.000000f},
- {0.170215f, 2.804400f, -0.057246f},
- {0.159496f, 2.804400f, -0.083047f},
- {0.145078f, 2.804400f, -0.106513f},
- {0.127304f, 2.804400f, -0.127304f},
- {0.106513f, 2.804400f, -0.145078f},
- {0.083047f, 2.804400f, -0.159496f},
- {0.057246f, 2.804400f, -0.170215f},
- {0.029450f, 2.804400f, -0.176897f},
- {-0.000000f, 2.804400f, -0.179200f},
- {0.165245f, 2.749050f, -0.027480f},
- {0.167400f, 2.749050f, 0.000000f},
- {0.158995f, 2.749050f, -0.053428f},
- {0.148969f, 2.749050f, -0.077523f},
- {0.135489f, 2.749050f, -0.099446f},
- {0.118874f, 2.749050f, -0.118874f},
- {0.099446f, 2.749050f, -0.135489f},
- {0.077523f, 2.749050f, -0.148969f},
- {0.053428f, 2.749050f, -0.158995f},
- {0.027480f, 2.749050f, -0.165245f},
- {-0.000000f, 2.749050f, -0.167400f},
- {0.197424f, 2.700000f, -0.032816f},
- {0.200000f, 2.700000f, 0.000000f},
- {0.189952f, 2.700000f, -0.063808f},
- {0.177968f, 2.700000f, -0.092592f},
- {0.161856f, 2.700000f, -0.118784f},
- {0.142000f, 2.700000f, -0.142000f},
- {0.118784f, 2.700000f, -0.161856f},
- {0.092592f, 2.700000f, -0.177968f},
- {0.063808f, 2.700000f, -0.189952f},
- {0.032816f, 2.700000f, -0.197424f},
- {-0.000000f, 2.700000f, -0.200000f},
- {0.000000f, 3.141450f, -0.194600f},
- {-0.032048f, 3.141450f, -0.192107f},
- {-0.062272f, 3.141450f, -0.184870f},
- {-0.090306f, 3.141450f, -0.173255f},
- {-0.115787f, 3.141450f, -0.157626f},
- {-0.138348f, 3.141450f, -0.138348f},
- {-0.157626f, 3.141450f, -0.115787f},
- {-0.173255f, 3.141450f, -0.090306f},
- {-0.184870f, 3.141450f, -0.062272f},
- {-0.192107f, 3.141450f, -0.032048f},
- {-0.194600f, 3.141450f, 0.000000f},
- {-0.050855f, 3.117600f, -0.304843f},
- {0.000000f, 3.117600f, -0.308800f},
- {-0.098814f, 3.117600f, -0.293360f},
- {-0.143301f, 3.117600f, -0.274928f},
- {-0.183734f, 3.117600f, -0.250127f},
- {-0.219536f, 3.117600f, -0.219536f},
- {-0.250127f, 3.117600f, -0.183734f},
- {-0.274928f, 3.117600f, -0.143301f},
- {-0.293360f, 3.117600f, -0.098814f},
- {-0.304843f, 3.117600f, -0.050855f},
- {-0.308800f, 3.117600f, 0.000000f},
- {-0.058988f, 3.081150f, -0.353610f},
- {0.000000f, 3.081150f, -0.358200f},
- {-0.114619f, 3.081150f, -0.340289f},
- {-0.166221f, 3.081150f, -0.318907f},
- {-0.213123f, 3.081150f, -0.290138f},
- {-0.254653f, 3.081150f, -0.254653f},
- {-0.290138f, 3.081150f, -0.213123f},
- {-0.318907f, 3.081150f, -0.166221f},
- {-0.340289f, 3.081150f, -0.114619f},
- {-0.353610f, 3.081150f, -0.058988f},
- {-0.358200f, 3.081150f, 0.000000f},
- {-0.059016f, 3.034800f, -0.353807f},
- {0.000000f, 3.034800f, -0.358400f},
- {-0.114676f, 3.034800f, -0.340477f},
- {-0.166306f, 3.034800f, -0.319082f},
- {-0.213234f, 3.034800f, -0.290295f},
- {-0.254788f, 3.034800f, -0.254788f},
- {-0.290295f, 3.034800f, -0.213234f},
- {-0.319082f, 3.034800f, -0.166306f},
- {-0.340477f, 3.034800f, -0.114676f},
- {-0.353807f, 3.034800f, -0.059016f},
- {-0.358400f, 3.034800f, 0.000000f},
- {-0.053508f, 2.981250f, -0.320834f},
- {0.000000f, 2.981250f, -0.325000f},
- {-0.103976f, 2.981250f, -0.308744f},
- {-0.150793f, 2.981250f, -0.289340f},
- {-0.193348f, 2.981250f, -0.263232f},
- {-0.231031f, 2.981250f, -0.231031f},
- {-0.263232f, 2.981250f, -0.193348f},
- {-0.289340f, 2.981250f, -0.150793f},
- {-0.308744f, 2.981250f, -0.103976f},
- {-0.320834f, 2.981250f, -0.053508f},
- {-0.325000f, 2.981250f, 0.000000f},
- {-0.045032f, 2.923200f, -0.270092f},
- {0.000000f, 2.923200f, -0.273600f},
- {-0.087511f, 2.923200f, -0.259910f},
- {-0.126920f, 2.923200f, -0.243569f},
- {-0.162745f, 2.923200f, -0.221585f},
- {-0.194472f, 2.923200f, -0.194472f},
- {-0.221585f, 2.923200f, -0.162745f},
- {-0.243569f, 2.923200f, -0.126920f},
- {-0.259910f, 2.923200f, -0.087511f},
- {-0.270092f, 2.923200f, -0.045032f},
- {-0.273600f, 2.923200f, 0.000000f},
- {-0.036157f, 2.863350f, -0.216979f},
- {0.000000f, 2.863350f, -0.219800f},
- {-0.070270f, 2.863350f, -0.208794f},
- {-0.101925f, 2.863350f, -0.195658f},
- {-0.130707f, 2.863350f, -0.177989f},
- {-0.156200f, 2.863350f, -0.156200f},
- {-0.177989f, 2.863350f, -0.130707f},
- {-0.195658f, 2.863350f, -0.101925f},
- {-0.208794f, 2.863350f, -0.070270f},
- {-0.216979f, 2.863350f, -0.036157f},
- {-0.219800f, 2.863350f, 0.000000f},
- {-0.029450f, 2.804400f, -0.176897f},
- {0.000000f, 2.804400f, -0.179200f},
- {-0.057246f, 2.804400f, -0.170215f},
- {-0.083047f, 2.804400f, -0.159496f},
- {-0.106513f, 2.804400f, -0.145078f},
- {-0.127304f, 2.804400f, -0.127304f},
- {-0.145078f, 2.804400f, -0.106513f},
- {-0.159496f, 2.804400f, -0.083047f},
- {-0.170215f, 2.804400f, -0.057246f},
- {-0.176897f, 2.804400f, -0.029450f},
- {-0.179200f, 2.804400f, 0.000000f},
- {-0.027480f, 2.749050f, -0.165245f},
- {0.000000f, 2.749050f, -0.167400f},
- {-0.053428f, 2.749050f, -0.158995f},
- {-0.077523f, 2.749050f, -0.148969f},
- {-0.099446f, 2.749050f, -0.135489f},
- {-0.118874f, 2.749050f, -0.118874f},
- {-0.135489f, 2.749050f, -0.099446f},
- {-0.148969f, 2.749050f, -0.077523f},
- {-0.158995f, 2.749050f, -0.053428f},
- {-0.165245f, 2.749050f, -0.027480f},
- {-0.167400f, 2.749050f, 0.000000f},
- {-0.032816f, 2.700000f, -0.197424f},
- {0.000000f, 2.700000f, -0.200000f},
- {-0.063808f, 2.700000f, -0.189952f},
- {-0.092592f, 2.700000f, -0.177968f},
- {-0.118784f, 2.700000f, -0.161856f},
- {-0.142000f, 2.700000f, -0.142000f},
- {-0.161856f, 2.700000f, -0.118784f},
- {-0.177968f, 2.700000f, -0.092592f},
- {-0.189952f, 2.700000f, -0.063808f},
- {-0.197424f, 2.700000f, -0.032816f},
- {-0.200000f, 2.700000f, 0.000000f},
- {-0.194600f, 3.141450f, 0.000000f},
- {-0.192107f, 3.141450f, 0.032048f},
- {-0.184870f, 3.141450f, 0.062272f},
- {-0.173255f, 3.141450f, 0.090306f},
- {-0.157626f, 3.141450f, 0.115787f},
- {-0.138348f, 3.141450f, 0.138348f},
- {-0.115787f, 3.141450f, 0.157626f},
- {-0.090306f, 3.141450f, 0.173255f},
- {-0.062272f, 3.141450f, 0.184870f},
- {-0.032048f, 3.141450f, 0.192107f},
- {0.000000f, 3.141450f, 0.194600f},
- {-0.304843f, 3.117600f, 0.050855f},
- {-0.308800f, 3.117600f, 0.000000f},
- {-0.293360f, 3.117600f, 0.098814f},
- {-0.274928f, 3.117600f, 0.143301f},
- {-0.250127f, 3.117600f, 0.183734f},
- {-0.219536f, 3.117600f, 0.219536f},
- {-0.183734f, 3.117600f, 0.250127f},
- {-0.143301f, 3.117600f, 0.274928f},
- {-0.098814f, 3.117600f, 0.293360f},
- {-0.050855f, 3.117600f, 0.304843f},
- {0.000000f, 3.117600f, 0.308800f},
- {-0.353610f, 3.081150f, 0.058988f},
- {-0.358200f, 3.081150f, 0.000000f},
- {-0.340289f, 3.081150f, 0.114619f},
- {-0.318907f, 3.081150f, 0.166221f},
- {-0.290138f, 3.081150f, 0.213123f},
- {-0.254653f, 3.081150f, 0.254653f},
- {-0.213123f, 3.081150f, 0.290138f},
- {-0.166221f, 3.081150f, 0.318907f},
- {-0.114619f, 3.081150f, 0.340289f},
- {-0.058988f, 3.081150f, 0.353610f},
- {0.000000f, 3.081150f, 0.358200f},
- {-0.353807f, 3.034800f, 0.059016f},
- {-0.358400f, 3.034800f, 0.000000f},
- {-0.340477f, 3.034800f, 0.114676f},
- {-0.319082f, 3.034800f, 0.166306f},
- {-0.290295f, 3.034800f, 0.213234f},
- {-0.254788f, 3.034800f, 0.254788f},
- {-0.213234f, 3.034800f, 0.290295f},
- {-0.166306f, 3.034800f, 0.319082f},
- {-0.114676f, 3.034800f, 0.340477f},
- {-0.059016f, 3.034800f, 0.353807f},
- {0.000000f, 3.034800f, 0.358400f},
- {-0.320834f, 2.981250f, 0.053508f},
- {-0.325000f, 2.981250f, 0.000000f},
- {-0.308744f, 2.981250f, 0.103976f},
- {-0.289340f, 2.981250f, 0.150793f},
- {-0.263232f, 2.981250f, 0.193348f},
- {-0.231031f, 2.981250f, 0.231031f},
- {-0.193348f, 2.981250f, 0.263232f},
- {-0.150793f, 2.981250f, 0.289340f},
- {-0.103976f, 2.981250f, 0.308744f},
- {-0.053508f, 2.981250f, 0.320834f},
- {0.000000f, 2.981250f, 0.325000f},
- {-0.270092f, 2.923200f, 0.045032f},
- {-0.273600f, 2.923200f, 0.000000f},
- {-0.259910f, 2.923200f, 0.087511f},
- {-0.243569f, 2.923200f, 0.126920f},
- {-0.221585f, 2.923200f, 0.162745f},
- {-0.194472f, 2.923200f, 0.194472f},
- {-0.162745f, 2.923200f, 0.221585f},
- {-0.126920f, 2.923200f, 0.243569f},
- {-0.087511f, 2.923200f, 0.259910f},
- {-0.045032f, 2.923200f, 0.270092f},
- {0.000000f, 2.923200f, 0.273600f},
- {-0.216979f, 2.863350f, 0.036157f},
- {-0.219800f, 2.863350f, 0.000000f},
- {-0.208794f, 2.863350f, 0.070270f},
- {-0.195658f, 2.863350f, 0.101925f},
- {-0.177989f, 2.863350f, 0.130707f},
- {-0.156200f, 2.863350f, 0.156200f},
- {-0.130707f, 2.863350f, 0.177989f},
- {-0.101925f, 2.863350f, 0.195658f},
- {-0.070270f, 2.863350f, 0.208794f},
- {-0.036157f, 2.863350f, 0.216979f},
- {0.000000f, 2.863350f, 0.219800f},
- {-0.176897f, 2.804400f, 0.029450f},
- {-0.179200f, 2.804400f, 0.000000f},
- {-0.170215f, 2.804400f, 0.057246f},
- {-0.159496f, 2.804400f, 0.083047f},
- {-0.145078f, 2.804400f, 0.106513f},
- {-0.127304f, 2.804400f, 0.127304f},
- {-0.106513f, 2.804400f, 0.145078f},
- {-0.083047f, 2.804400f, 0.159496f},
- {-0.057246f, 2.804400f, 0.170215f},
- {-0.029450f, 2.804400f, 0.176897f},
- {0.000000f, 2.804400f, 0.179200f},
- {-0.165245f, 2.749050f, 0.027480f},
- {-0.167400f, 2.749050f, 0.000000f},
- {-0.158995f, 2.749050f, 0.053428f},
- {-0.148969f, 2.749050f, 0.077523f},
- {-0.135489f, 2.749050f, 0.099446f},
- {-0.118874f, 2.749050f, 0.118874f},
- {-0.099446f, 2.749050f, 0.135489f},
- {-0.077523f, 2.749050f, 0.148969f},
- {-0.053428f, 2.749050f, 0.158995f},
- {-0.027480f, 2.749050f, 0.165245f},
- {0.000000f, 2.749050f, 0.167400f},
- {-0.197424f, 2.700000f, 0.032816f},
- {-0.200000f, 2.700000f, 0.000000f},
- {-0.189952f, 2.700000f, 0.063808f},
- {-0.177968f, 2.700000f, 0.092592f},
- {-0.161856f, 2.700000f, 0.118784f},
- {-0.142000f, 2.700000f, 0.142000f},
- {-0.118784f, 2.700000f, 0.161856f},
- {-0.092592f, 2.700000f, 0.177968f},
- {-0.063808f, 2.700000f, 0.189952f},
- {-0.032816f, 2.700000f, 0.197424f},
- {0.000000f, 2.700000f, 0.200000f},
- {0.000000f, 3.141450f, 0.194600f},
- {0.032048f, 3.141450f, 0.192107f},
- {0.062272f, 3.141450f, 0.184870f},
- {0.090306f, 3.141450f, 0.173255f},
- {0.115787f, 3.141450f, 0.157626f},
- {0.138348f, 3.141450f, 0.138348f},
- {0.157626f, 3.141450f, 0.115787f},
- {0.173255f, 3.141450f, 0.090306f},
- {0.184870f, 3.141450f, 0.062272f},
- {0.192107f, 3.141450f, 0.032048f},
- {0.194600f, 3.141450f, -0.000000f},
- {0.050855f, 3.117600f, 0.304843f},
- {0.000000f, 3.117600f, 0.308800f},
- {0.098814f, 3.117600f, 0.293360f},
- {0.143301f, 3.117600f, 0.274928f},
- {0.183734f, 3.117600f, 0.250127f},
- {0.219536f, 3.117600f, 0.219536f},
- {0.250127f, 3.117600f, 0.183734f},
- {0.274928f, 3.117600f, 0.143301f},
- {0.293360f, 3.117600f, 0.098814f},
- {0.304843f, 3.117600f, 0.050855f},
- {0.308800f, 3.117600f, -0.000000f},
- {0.058988f, 3.081150f, 0.353610f},
- {0.000000f, 3.081150f, 0.358200f},
- {0.114619f, 3.081150f, 0.340289f},
- {0.166221f, 3.081150f, 0.318907f},
- {0.213123f, 3.081150f, 0.290138f},
- {0.254653f, 3.081150f, 0.254653f},
- {0.290138f, 3.081150f, 0.213123f},
- {0.318907f, 3.081150f, 0.166221f},
- {0.340289f, 3.081150f, 0.114619f},
- {0.353610f, 3.081150f, 0.058988f},
- {0.358200f, 3.081150f, -0.000000f},
- {0.059016f, 3.034800f, 0.353807f},
- {0.000000f, 3.034800f, 0.358400f},
- {0.114676f, 3.034800f, 0.340477f},
- {0.166306f, 3.034800f, 0.319082f},
- {0.213234f, 3.034800f, 0.290295f},
- {0.254788f, 3.034800f, 0.254788f},
- {0.290295f, 3.034800f, 0.213234f},
- {0.319082f, 3.034800f, 0.166306f},
- {0.340477f, 3.034800f, 0.114676f},
- {0.353807f, 3.034800f, 0.059016f},
- {0.358400f, 3.034800f, 0.000000f},
- {0.053508f, 2.981250f, 0.320834f},
- {0.000000f, 2.981250f, 0.325000f},
- {0.103976f, 2.981250f, 0.308744f},
- {0.150793f, 2.981250f, 0.289340f},
- {0.193348f, 2.981250f, 0.263232f},
- {0.231031f, 2.981250f, 0.231031f},
- {0.263232f, 2.981250f, 0.193348f},
- {0.289340f, 2.981250f, 0.150793f},
- {0.308744f, 2.981250f, 0.103976f},
- {0.320834f, 2.981250f, 0.053508f},
- {0.325000f, 2.981250f, -0.000000f},
- {0.045032f, 2.923200f, 0.270092f},
- {0.000000f, 2.923200f, 0.273600f},
- {0.087511f, 2.923200f, 0.259910f},
- {0.126920f, 2.923200f, 0.243569f},
- {0.162745f, 2.923200f, 0.221585f},
- {0.194472f, 2.923200f, 0.194472f},
- {0.221585f, 2.923200f, 0.162745f},
- {0.243569f, 2.923200f, 0.126920f},
- {0.259910f, 2.923200f, 0.087511f},
- {0.270092f, 2.923200f, 0.045032f},
- {0.273600f, 2.923200f, -0.000000f},
- {0.036157f, 2.863350f, 0.216979f},
- {0.000000f, 2.863350f, 0.219800f},
- {0.070270f, 2.863350f, 0.208794f},
- {0.101925f, 2.863350f, 0.195658f},
- {0.130707f, 2.863350f, 0.177989f},
- {0.156200f, 2.863350f, 0.156200f},
- {0.177989f, 2.863350f, 0.130707f},
- {0.195658f, 2.863350f, 0.101925f},
- {0.208794f, 2.863350f, 0.070270f},
- {0.216979f, 2.863350f, 0.036157f},
- {0.219800f, 2.863350f, -0.000000f},
- {0.029450f, 2.804400f, 0.176897f},
- {0.000000f, 2.804400f, 0.179200f},
- {0.057246f, 2.804400f, 0.170215f},
- {0.083047f, 2.804400f, 0.159496f},
- {0.106513f, 2.804400f, 0.145078f},
- {0.127304f, 2.804400f, 0.127304f},
- {0.145078f, 2.804400f, 0.106513f},
- {0.159496f, 2.804400f, 0.083047f},
- {0.170215f, 2.804400f, 0.057246f},
- {0.176897f, 2.804400f, 0.029450f},
- {0.179200f, 2.804400f, -0.000000f},
- {0.027480f, 2.749050f, 0.165245f},
- {0.000000f, 2.749050f, 0.167400f},
- {0.053428f, 2.749050f, 0.158995f},
- {0.077523f, 2.749050f, 0.148969f},
- {0.099446f, 2.749050f, 0.135489f},
- {0.118874f, 2.749050f, 0.118874f},
- {0.135489f, 2.749050f, 0.099446f},
- {0.148969f, 2.749050f, 0.077523f},
- {0.158995f, 2.749050f, 0.053428f},
- {0.165245f, 2.749050f, 0.027480f},
- {0.167400f, 2.749050f, -0.000000f},
- {0.032816f, 2.700000f, 0.197424f},
- {0.000000f, 2.700000f, 0.200000f},
- {0.063808f, 2.700000f, 0.189952f},
- {0.092592f, 2.700000f, 0.177968f},
- {0.118784f, 2.700000f, 0.161856f},
- {0.142000f, 2.700000f, 0.142000f},
- {0.161856f, 2.700000f, 0.118784f},
- {0.177968f, 2.700000f, 0.092592f},
- {0.189952f, 2.700000f, 0.063808f},
- {0.197424f, 2.700000f, 0.032816f},
- {0.200000f, 2.700000f, -0.000000f},
- {0.275801f, 2.659200f, -0.045844f},
- {0.197424f, 2.700000f, -0.032816f},
- {0.200000f, 2.700000f, 0.000000f},
- {0.279400f, 2.659200f, 0.000000f},
- {0.265363f, 2.659200f, -0.089140f},
- {0.189952f, 2.700000f, -0.063808f},
- {0.248621f, 2.659200f, -0.129351f},
- {0.177968f, 2.700000f, -0.092592f},
- {0.226113f, 2.659200f, -0.165941f},
- {0.161856f, 2.700000f, -0.118784f},
- {0.198374f, 2.659200f, -0.198374f},
- {0.142000f, 2.700000f, -0.142000f},
- {0.165941f, 2.659200f, -0.226113f},
- {0.118784f, 2.700000f, -0.161856f},
- {0.129351f, 2.659200f, -0.248621f},
- {0.092592f, 2.700000f, -0.177968f},
- {0.089140f, 2.659200f, -0.265363f},
- {0.063808f, 2.700000f, -0.189952f},
- {0.045844f, 2.659200f, -0.275801f},
- {0.032816f, 2.700000f, -0.197424f},
- {0.000000f, 2.659200f, -0.279400f},
- {-0.000000f, 2.700000f, -0.200000f},
- {0.386161f, 2.625600f, -0.064188f},
- {0.391200f, 2.625600f, 0.000000f},
- {0.371546f, 2.625600f, -0.124808f},
- {0.348105f, 2.625600f, -0.181110f},
- {0.316590f, 2.625600f, -0.232342f},
- {0.277752f, 2.625600f, -0.277752f},
- {0.232342f, 2.625600f, -0.316590f},
- {0.181110f, 2.625600f, -0.348105f},
- {0.124808f, 2.625600f, -0.371546f},
- {0.064188f, 2.625600f, -0.386161f},
- {0.000000f, 2.625600f, -0.391200f},
- {0.519028f, 2.597400f, -0.086273f},
- {0.525800f, 2.597400f, 0.000000f},
- {0.499384f, 2.597400f, -0.167751f},
- {0.467878f, 2.597400f, -0.243424f},
- {0.425519f, 2.597400f, -0.312283f},
- {0.373318f, 2.597400f, -0.373318f},
- {0.312283f, 2.597400f, -0.425519f},
- {0.243424f, 2.597400f, -0.467878f},
- {0.167751f, 2.597400f, -0.499384f},
- {0.086273f, 2.597400f, -0.519028f},
- {-0.000000f, 2.597400f, -0.525800f},
- {0.664924f, 2.572800f, -0.110524f},
- {0.673600f, 2.572800f, 0.000000f},
- {0.639758f, 2.572800f, -0.214905f},
- {0.599396f, 2.572800f, -0.311850f},
- {0.545131f, 2.572800f, -0.400065f},
- {0.478256f, 2.572800f, -0.478256f},
- {0.400065f, 2.572800f, -0.545131f},
- {0.311850f, 2.572800f, -0.599396f},
- {0.214905f, 2.572800f, -0.639758f},
- {0.110524f, 2.572800f, -0.664924f},
- {-0.000000f, 2.572800f, -0.673600f},
- {0.814374f, 2.550000f, -0.135366f},
- {0.825000f, 2.550000f, 0.000000f},
- {0.783552f, 2.550000f, -0.263208f},
- {0.734118f, 2.550000f, -0.381942f},
- {0.667656f, 2.550000f, -0.489984f},
- {0.585750f, 2.550000f, -0.585750f},
- {0.489984f, 2.550000f, -0.667656f},
- {0.381942f, 2.550000f, -0.734118f},
- {0.263208f, 2.550000f, -0.783552f},
- {0.135366f, 2.550000f, -0.814374f},
- {0.000000f, 2.550000f, -0.825000f},
- {0.957901f, 2.527200f, -0.159223f},
- {0.970400f, 2.527200f, 0.000000f},
- {0.921647f, 2.527200f, -0.309596f},
- {0.863501f, 2.527200f, -0.449256f},
- {0.785325f, 2.527200f, -0.576340f},
- {0.688984f, 2.527200f, -0.688984f},
- {0.576340f, 2.527200f, -0.785325f},
- {0.449256f, 2.527200f, -0.863501f},
- {0.309596f, 2.527200f, -0.921647f},
- {0.159223f, 2.527200f, -0.957901f},
- {-0.000000f, 2.527200f, -0.970400f},
- {1.086029f, 2.502600f, -0.180521f},
- {1.100200f, 2.502600f, 0.000000f},
- {1.044926f, 2.502600f, -0.351008f},
- {0.979002f, 2.502600f, -0.509349f},
- {0.890370f, 2.502600f, -0.653431f},
- {0.781142f, 2.502600f, -0.781142f},
- {0.653431f, 2.502600f, -0.890370f},
- {0.509349f, 2.502600f, -0.979002f},
- {0.351008f, 2.502600f, -1.044926f},
- {0.180521f, 2.502600f, -1.086029f},
- {-0.000000f, 2.502600f, -1.100200f},
- {1.189282f, 2.474400f, -0.197684f},
- {1.204800f, 2.474400f, 0.000000f},
- {1.144271f, 2.474400f, -0.384379f},
- {1.072079f, 2.474400f, -0.557774f},
- {0.975021f, 2.474400f, -0.715555f},
- {0.855408f, 2.474400f, -0.855408f},
- {0.715555f, 2.474400f, -0.975021f},
- {0.557774f, 2.474400f, -1.072079f},
- {0.384379f, 2.474400f, -1.144271f},
- {0.197684f, 2.474400f, -1.189282f},
- {-0.000000f, 2.474400f, -1.204800f},
- {1.258183f, 2.440800f, -0.209136f},
- {1.274600f, 2.440800f, 0.000000f},
- {1.210564f, 2.440800f, -0.406648f},
- {1.134190f, 2.440800f, -0.590089f},
- {1.031508f, 2.440800f, -0.757010f},
- {0.904966f, 2.440800f, -0.904966f},
- {0.757010f, 2.440800f, -1.031508f},
- {0.590089f, 2.440800f, -1.134190f},
- {0.406648f, 2.440800f, -1.210564f},
- {0.209136f, 2.440800f, -1.258183f},
- {0.000000f, 2.440800f, -1.274600f},
- {1.283256f, 2.400000f, -0.213304f},
- {1.300000f, 2.400000f, 0.000000f},
- {1.234688f, 2.400000f, -0.414752f},
- {1.156792f, 2.400000f, -0.601848f},
- {1.052064f, 2.400000f, -0.772096f},
- {0.923000f, 2.400000f, -0.923000f},
- {0.772096f, 2.400000f, -1.052064f},
- {0.601848f, 2.400000f, -1.156792f},
- {0.414752f, 2.400000f, -1.234688f},
- {0.213304f, 2.400000f, -1.283256f},
- {-0.000000f, 2.400000f, -1.300000f},
- {-0.045844f, 2.659200f, -0.275801f},
- {-0.032816f, 2.700000f, -0.197424f},
- {0.000000f, 2.700000f, -0.200000f},
- {-0.089140f, 2.659200f, -0.265363f},
- {-0.063808f, 2.700000f, -0.189952f},
- {-0.129351f, 2.659200f, -0.248621f},
- {-0.092592f, 2.700000f, -0.177968f},
- {-0.165941f, 2.659200f, -0.226113f},
- {-0.118784f, 2.700000f, -0.161856f},
- {-0.198374f, 2.659200f, -0.198374f},
- {-0.142000f, 2.700000f, -0.142000f},
- {-0.226113f, 2.659200f, -0.165941f},
- {-0.161856f, 2.700000f, -0.118784f},
- {-0.248621f, 2.659200f, -0.129351f},
- {-0.177968f, 2.700000f, -0.092592f},
- {-0.265363f, 2.659200f, -0.089140f},
- {-0.189952f, 2.700000f, -0.063808f},
- {-0.275801f, 2.659200f, -0.045844f},
- {-0.197424f, 2.700000f, -0.032816f},
- {-0.279400f, 2.659200f, 0.000000f},
- {-0.200000f, 2.700000f, 0.000000f},
- {-0.064188f, 2.625600f, -0.386161f},
- {0.000000f, 2.625600f, -0.391200f},
- {-0.124808f, 2.625600f, -0.371546f},
- {-0.181110f, 2.625600f, -0.348105f},
- {-0.232342f, 2.625600f, -0.316590f},
- {-0.277752f, 2.625600f, -0.277752f},
- {-0.316590f, 2.625600f, -0.232342f},
- {-0.348105f, 2.625600f, -0.181110f},
- {-0.371546f, 2.625600f, -0.124808f},
- {-0.386161f, 2.625600f, -0.064188f},
- {-0.391200f, 2.625600f, 0.000000f},
- {-0.086273f, 2.597400f, -0.519028f},
- {0.000000f, 2.597400f, -0.525800f},
- {-0.167751f, 2.597400f, -0.499384f},
- {-0.243424f, 2.597400f, -0.467878f},
- {-0.312283f, 2.597400f, -0.425519f},
- {-0.373318f, 2.597400f, -0.373318f},
- {-0.425519f, 2.597400f, -0.312283f},
- {-0.467878f, 2.597400f, -0.243424f},
- {-0.499384f, 2.597400f, -0.167751f},
- {-0.519028f, 2.597400f, -0.086273f},
- {-0.525800f, 2.597400f, 0.000000f},
- {-0.110524f, 2.572800f, -0.664924f},
- {0.000000f, 2.572800f, -0.673600f},
- {-0.214905f, 2.572800f, -0.639758f},
- {-0.311850f, 2.572800f, -0.599396f},
- {-0.400065f, 2.572800f, -0.545131f},
- {-0.478256f, 2.572800f, -0.478256f},
- {-0.545131f, 2.572800f, -0.400065f},
- {-0.599396f, 2.572800f, -0.311850f},
- {-0.639758f, 2.572800f, -0.214905f},
- {-0.664924f, 2.572800f, -0.110524f},
- {-0.673600f, 2.572800f, 0.000000f},
- {-0.135366f, 2.550000f, -0.814374f},
- {0.000000f, 2.550000f, -0.825000f},
- {-0.263208f, 2.550000f, -0.783552f},
- {-0.381942f, 2.550000f, -0.734118f},
- {-0.489984f, 2.550000f, -0.667656f},
- {-0.585750f, 2.550000f, -0.585750f},
- {-0.667656f, 2.550000f, -0.489984f},
- {-0.734118f, 2.550000f, -0.381942f},
- {-0.783552f, 2.550000f, -0.263208f},
- {-0.814374f, 2.550000f, -0.135366f},
- {-0.825000f, 2.550000f, 0.000000f},
- {-0.159223f, 2.527200f, -0.957901f},
- {0.000000f, 2.527200f, -0.970400f},
- {-0.309596f, 2.527200f, -0.921647f},
- {-0.449256f, 2.527200f, -0.863501f},
- {-0.576340f, 2.527200f, -0.785325f},
- {-0.688984f, 2.527200f, -0.688984f},
- {-0.785325f, 2.527200f, -0.576340f},
- {-0.863501f, 2.527200f, -0.449256f},
- {-0.921647f, 2.527200f, -0.309596f},
- {-0.957901f, 2.527200f, -0.159223f},
- {-0.970400f, 2.527200f, 0.000000f},
- {-0.180521f, 2.502600f, -1.086029f},
- {0.000000f, 2.502600f, -1.100200f},
- {-0.351008f, 2.502600f, -1.044926f},
- {-0.509349f, 2.502600f, -0.979002f},
- {-0.653431f, 2.502600f, -0.890370f},
- {-0.781142f, 2.502600f, -0.781142f},
- {-0.890370f, 2.502600f, -0.653431f},
- {-0.979002f, 2.502600f, -0.509349f},
- {-1.044926f, 2.502600f, -0.351008f},
- {-1.086029f, 2.502600f, -0.180521f},
- {-1.100200f, 2.502600f, 0.000000f},
- {-0.197684f, 2.474400f, -1.189282f},
- {0.000000f, 2.474400f, -1.204800f},
- {-0.384379f, 2.474400f, -1.144271f},
- {-0.557774f, 2.474400f, -1.072079f},
- {-0.715555f, 2.474400f, -0.975021f},
- {-0.855408f, 2.474400f, -0.855408f},
- {-0.975021f, 2.474400f, -0.715555f},
- {-1.072079f, 2.474400f, -0.557774f},
- {-1.144271f, 2.474400f, -0.384379f},
- {-1.189282f, 2.474400f, -0.197684f},
- {-1.204800f, 2.474400f, 0.000000f},
- {-0.209136f, 2.440800f, -1.258183f},
- {0.000000f, 2.440800f, -1.274600f},
- {-0.406648f, 2.440800f, -1.210564f},
- {-0.590089f, 2.440800f, -1.134190f},
- {-0.757010f, 2.440800f, -1.031508f},
- {-0.904966f, 2.440800f, -0.904966f},
- {-1.031508f, 2.440800f, -0.757010f},
- {-1.134190f, 2.440800f, -0.590089f},
- {-1.210564f, 2.440800f, -0.406648f},
- {-1.258183f, 2.440800f, -0.209136f},
- {-1.274600f, 2.440800f, 0.000000f},
- {-0.213304f, 2.400000f, -1.283256f},
- {0.000000f, 2.400000f, -1.300000f},
- {-0.414752f, 2.400000f, -1.234688f},
- {-0.601848f, 2.400000f, -1.156792f},
- {-0.772096f, 2.400000f, -1.052064f},
- {-0.923000f, 2.400000f, -0.923000f},
- {-1.052064f, 2.400000f, -0.772096f},
- {-1.156792f, 2.400000f, -0.601848f},
- {-1.234688f, 2.400000f, -0.414752f},
- {-1.283256f, 2.400000f, -0.213304f},
- {-1.300000f, 2.400000f, 0.000000f},
- {-0.275801f, 2.659200f, 0.045844f},
- {-0.197424f, 2.700000f, 0.032816f},
- {-0.200000f, 2.700000f, 0.000000f},
- {-0.265363f, 2.659200f, 0.089140f},
- {-0.189952f, 2.700000f, 0.063808f},
- {-0.248621f, 2.659200f, 0.129351f},
- {-0.177968f, 2.700000f, 0.092592f},
- {-0.226113f, 2.659200f, 0.165941f},
- {-0.161856f, 2.700000f, 0.118784f},
- {-0.198374f, 2.659200f, 0.198374f},
- {-0.142000f, 2.700000f, 0.142000f},
- {-0.165941f, 2.659200f, 0.226113f},
- {-0.118784f, 2.700000f, 0.161856f},
- {-0.129351f, 2.659200f, 0.248621f},
- {-0.092592f, 2.700000f, 0.177968f},
- {-0.089140f, 2.659200f, 0.265363f},
- {-0.063808f, 2.700000f, 0.189952f},
- {-0.045844f, 2.659200f, 0.275801f},
- {-0.032816f, 2.700000f, 0.197424f},
- {0.000000f, 2.659200f, 0.279400f},
- {0.000000f, 2.700000f, 0.200000f},
- {-0.386161f, 2.625600f, 0.064188f},
- {-0.391200f, 2.625600f, 0.000000f},
- {-0.371546f, 2.625600f, 0.124808f},
- {-0.348105f, 2.625600f, 0.181110f},
- {-0.316590f, 2.625600f, 0.232342f},
- {-0.277752f, 2.625600f, 0.277752f},
- {-0.232342f, 2.625600f, 0.316590f},
- {-0.181110f, 2.625600f, 0.348105f},
- {-0.124808f, 2.625600f, 0.371546f},
- {-0.064188f, 2.625600f, 0.386161f},
- {0.000000f, 2.625600f, 0.391200f},
- {-0.519028f, 2.597400f, 0.086273f},
- {-0.525800f, 2.597400f, 0.000000f},
- {-0.499384f, 2.597400f, 0.167751f},
- {-0.467878f, 2.597400f, 0.243424f},
- {-0.425519f, 2.597400f, 0.312283f},
- {-0.373318f, 2.597400f, 0.373318f},
- {-0.312283f, 2.597400f, 0.425519f},
- {-0.243424f, 2.597400f, 0.467878f},
- {-0.167751f, 2.597400f, 0.499384f},
- {-0.086273f, 2.597400f, 0.519028f},
- {0.000000f, 2.597400f, 0.525800f},
- {-0.664924f, 2.572800f, 0.110524f},
- {-0.673600f, 2.572800f, 0.000000f},
- {-0.639758f, 2.572800f, 0.214905f},
- {-0.599396f, 2.572800f, 0.311850f},
- {-0.545131f, 2.572800f, 0.400065f},
- {-0.478256f, 2.572800f, 0.478256f},
- {-0.400065f, 2.572800f, 0.545131f},
- {-0.311850f, 2.572800f, 0.599396f},
- {-0.214905f, 2.572800f, 0.639758f},
- {-0.110524f, 2.572800f, 0.664924f},
- {0.000000f, 2.572800f, 0.673600f},
- {-0.814374f, 2.550000f, 0.135366f},
- {-0.825000f, 2.550000f, 0.000000f},
- {-0.783552f, 2.550000f, 0.263208f},
- {-0.734118f, 2.550000f, 0.381942f},
- {-0.667656f, 2.550000f, 0.489984f},
- {-0.585750f, 2.550000f, 0.585750f},
- {-0.489984f, 2.550000f, 0.667656f},
- {-0.381942f, 2.550000f, 0.734118f},
- {-0.263208f, 2.550000f, 0.783552f},
- {-0.135366f, 2.550000f, 0.814374f},
- {0.000000f, 2.550000f, 0.825000f},
- {-0.957901f, 2.527200f, 0.159223f},
- {-0.970400f, 2.527200f, 0.000000f},
- {-0.921647f, 2.527200f, 0.309596f},
- {-0.863501f, 2.527200f, 0.449256f},
- {-0.785325f, 2.527200f, 0.576340f},
- {-0.688984f, 2.527200f, 0.688984f},
- {-0.576340f, 2.527200f, 0.785325f},
- {-0.449256f, 2.527200f, 0.863501f},
- {-0.309596f, 2.527200f, 0.921647f},
- {-0.159223f, 2.527200f, 0.957901f},
- {0.000000f, 2.527200f, 0.970400f},
- {-1.086029f, 2.502600f, 0.180521f},
- {-1.100200f, 2.502600f, 0.000000f},
- {-1.044926f, 2.502600f, 0.351008f},
- {-0.979002f, 2.502600f, 0.509349f},
- {-0.890370f, 2.502600f, 0.653431f},
- {-0.781142f, 2.502600f, 0.781142f},
- {-0.653431f, 2.502600f, 0.890370f},
- {-0.509349f, 2.502600f, 0.979002f},
- {-0.351008f, 2.502600f, 1.044926f},
- {-0.180521f, 2.502600f, 1.086029f},
- {0.000000f, 2.502600f, 1.100200f},
- {-1.189282f, 2.474400f, 0.197684f},
- {-1.204800f, 2.474400f, 0.000000f},
- {-1.144271f, 2.474400f, 0.384379f},
- {-1.072079f, 2.474400f, 0.557774f},
- {-0.975021f, 2.474400f, 0.715555f},
- {-0.855408f, 2.474400f, 0.855408f},
- {-0.715555f, 2.474400f, 0.975021f},
- {-0.557774f, 2.474400f, 1.072079f},
- {-0.384379f, 2.474400f, 1.144271f},
- {-0.197684f, 2.474400f, 1.189282f},
- {0.000000f, 2.474400f, 1.204800f},
- {-1.258183f, 2.440800f, 0.209136f},
- {-1.274600f, 2.440800f, 0.000000f},
- {-1.210564f, 2.440800f, 0.406648f},
- {-1.134190f, 2.440800f, 0.590089f},
- {-1.031508f, 2.440800f, 0.757010f},
- {-0.904966f, 2.440800f, 0.904966f},
- {-0.757010f, 2.440800f, 1.031508f},
- {-0.590089f, 2.440800f, 1.134190f},
- {-0.406648f, 2.440800f, 1.210564f},
- {-0.209136f, 2.440800f, 1.258183f},
- {0.000000f, 2.440800f, 1.274600f},
- {-1.283256f, 2.400000f, 0.213304f},
- {-1.300000f, 2.400000f, 0.000000f},
- {-1.234688f, 2.400000f, 0.414752f},
- {-1.156792f, 2.400000f, 0.601848f},
- {-1.052064f, 2.400000f, 0.772096f},
- {-0.923000f, 2.400000f, 0.923000f},
- {-0.772096f, 2.400000f, 1.052064f},
- {-0.601848f, 2.400000f, 1.156792f},
- {-0.414752f, 2.400000f, 1.234688f},
- {-0.213304f, 2.400000f, 1.283256f},
- {0.000000f, 2.400000f, 1.300000f},
- {0.045844f, 2.659200f, 0.275801f},
- {0.032816f, 2.700000f, 0.197424f},
- {0.000000f, 2.700000f, 0.200000f},
- {0.089140f, 2.659200f, 0.265363f},
- {0.063808f, 2.700000f, 0.189952f},
- {0.129351f, 2.659200f, 0.248621f},
- {0.092592f, 2.700000f, 0.177968f},
- {0.165941f, 2.659200f, 0.226113f},
- {0.118784f, 2.700000f, 0.161856f},
- {0.198374f, 2.659200f, 0.198374f},
- {0.142000f, 2.700000f, 0.142000f},
- {0.226113f, 2.659200f, 0.165941f},
- {0.161856f, 2.700000f, 0.118784f},
- {0.248621f, 2.659200f, 0.129351f},
- {0.177968f, 2.700000f, 0.092592f},
- {0.265363f, 2.659200f, 0.089140f},
- {0.189952f, 2.700000f, 0.063808f},
- {0.275801f, 2.659200f, 0.045844f},
- {0.197424f, 2.700000f, 0.032816f},
- {0.200000f, 2.700000f, -0.000000f},
- {0.064188f, 2.625600f, 0.386161f},
- {0.000000f, 2.625600f, 0.391200f},
- {0.124808f, 2.625600f, 0.371546f},
- {0.181110f, 2.625600f, 0.348105f},
- {0.232342f, 2.625600f, 0.316590f},
- {0.277752f, 2.625600f, 0.277752f},
- {0.316590f, 2.625600f, 0.232342f},
- {0.348105f, 2.625600f, 0.181110f},
- {0.371546f, 2.625600f, 0.124808f},
- {0.386161f, 2.625600f, 0.064188f},
- {0.391200f, 2.625600f, 0.000000f},
- {0.086273f, 2.597400f, 0.519028f},
- {0.000000f, 2.597400f, 0.525800f},
- {0.167751f, 2.597400f, 0.499384f},
- {0.243424f, 2.597400f, 0.467878f},
- {0.312283f, 2.597400f, 0.425519f},
- {0.373318f, 2.597400f, 0.373318f},
- {0.425519f, 2.597400f, 0.312283f},
- {0.467878f, 2.597400f, 0.243424f},
- {0.499384f, 2.597400f, 0.167751f},
- {0.519028f, 2.597400f, 0.086273f},
- {0.525800f, 2.597400f, -0.000000f},
- {0.110524f, 2.572800f, 0.664924f},
- {0.000000f, 2.572800f, 0.673600f},
- {0.214905f, 2.572800f, 0.639758f},
- {0.311850f, 2.572800f, 0.599396f},
- {0.400065f, 2.572800f, 0.545131f},
- {0.478256f, 2.572800f, 0.478256f},
- {0.545131f, 2.572800f, 0.400065f},
- {0.599396f, 2.572800f, 0.311850f},
- {0.639758f, 2.572800f, 0.214905f},
- {0.664924f, 2.572800f, 0.110524f},
- {0.673600f, 2.572800f, -0.000000f},
- {0.135366f, 2.550000f, 0.814374f},
- {0.000000f, 2.550000f, 0.825000f},
- {0.263208f, 2.550000f, 0.783552f},
- {0.381942f, 2.550000f, 0.734118f},
- {0.489984f, 2.550000f, 0.667656f},
- {0.585750f, 2.550000f, 0.585750f},
- {0.667656f, 2.550000f, 0.489984f},
- {0.734118f, 2.550000f, 0.381942f},
- {0.783552f, 2.550000f, 0.263208f},
- {0.814374f, 2.550000f, 0.135366f},
- {0.825000f, 2.550000f, 0.000000f},
- {0.159223f, 2.527200f, 0.957901f},
- {0.000000f, 2.527200f, 0.970400f},
- {0.309596f, 2.527200f, 0.921647f},
- {0.449256f, 2.527200f, 0.863501f},
- {0.576340f, 2.527200f, 0.785325f},
- {0.688984f, 2.527200f, 0.688984f},
- {0.785325f, 2.527200f, 0.576340f},
- {0.863501f, 2.527200f, 0.449256f},
- {0.921647f, 2.527200f, 0.309596f},
- {0.957901f, 2.527200f, 0.159223f},
- {0.970400f, 2.527200f, -0.000000f},
- {0.180521f, 2.502600f, 1.086029f},
- {0.000000f, 2.502600f, 1.100200f},
- {0.351008f, 2.502600f, 1.044926f},
- {0.509349f, 2.502600f, 0.979002f},
- {0.653431f, 2.502600f, 0.890370f},
- {0.781142f, 2.502600f, 0.781142f},
- {0.890370f, 2.502600f, 0.653431f},
- {0.979002f, 2.502600f, 0.509349f},
- {1.044926f, 2.502600f, 0.351008f},
- {1.086029f, 2.502600f, 0.180521f},
- {1.100200f, 2.502600f, -0.000000f},
- {0.197684f, 2.474400f, 1.189282f},
- {0.000000f, 2.474400f, 1.204800f},
- {0.384379f, 2.474400f, 1.144271f},
- {0.557774f, 2.474400f, 1.072079f},
- {0.715555f, 2.474400f, 0.975021f},
- {0.855408f, 2.474400f, 0.855408f},
- {0.975021f, 2.474400f, 0.715555f},
- {1.072079f, 2.474400f, 0.557774f},
- {1.144271f, 2.474400f, 0.384379f},
- {1.189282f, 2.474400f, 0.197684f},
- {1.204800f, 2.474400f, -0.000000f},
- {0.209136f, 2.440800f, 1.258183f},
- {0.000000f, 2.440800f, 1.274600f},
- {0.406648f, 2.440800f, 1.210564f},
- {0.590089f, 2.440800f, 1.134190f},
- {0.757010f, 2.440800f, 1.031508f},
- {0.904966f, 2.440800f, 0.904966f},
- {1.031508f, 2.440800f, 0.757010f},
- {1.134190f, 2.440800f, 0.590089f},
- {1.210564f, 2.440800f, 0.406648f},
- {1.258183f, 2.440800f, 0.209136f},
- {1.274600f, 2.440800f, 0.000000f},
- {0.213304f, 2.400000f, 1.283256f},
- {0.000000f, 2.400000f, 1.300000f},
- {0.414752f, 2.400000f, 1.234688f},
- {0.601848f, 2.400000f, 1.156792f},
- {0.772096f, 2.400000f, 1.052064f},
- {0.923000f, 2.400000f, 0.923000f},
- {1.052064f, 2.400000f, 0.772096f},
- {1.156792f, 2.400000f, 0.601848f},
- {1.234688f, 2.400000f, 0.414752f},
- {1.283256f, 2.400000f, 0.213304f},
- {1.300000f, 2.400000f, -0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.388275f, 0.002175f, 0.000000f},
- {0.383274f, 0.002175f, 0.063708f},
- {0.368768f, 0.002175f, 0.123875f},
- {0.345503f, 0.002175f, 0.179756f},
- {0.314223f, 0.002175f, 0.230604f},
- {0.275675f, 0.002175f, 0.275675f},
- {0.230604f, 0.002175f, 0.314223f},
- {0.179756f, 0.002175f, 0.345503f},
- {0.123875f, 0.002175f, 0.368768f},
- {0.063708f, 0.002175f, 0.383274f},
- {-0.000000f, 0.002175f, 0.388275f},
- {0.694143f, 0.008400f, 0.115381f},
- {0.703200f, 0.008400f, 0.000000f},
- {0.667871f, 0.008400f, 0.224349f},
- {0.625735f, 0.008400f, 0.325553f},
- {0.569086f, 0.008400f, 0.417645f},
- {0.499272f, 0.008400f, 0.499272f},
- {0.417645f, 0.008400f, 0.569086f},
- {0.325553f, 0.008400f, 0.625735f},
- {0.224349f, 0.008400f, 0.667871f},
- {0.115381f, 0.008400f, 0.694143f},
- {0.000000f, 0.008400f, 0.703200f},
- {0.940158f, 0.018225f, 0.156274f},
- {0.952425f, 0.018225f, 0.000000f},
- {0.904575f, 0.018225f, 0.303862f},
- {0.847506f, 0.018225f, 0.440935f},
- {0.770779f, 0.018225f, 0.565664f},
- {0.676222f, 0.018225f, 0.676222f},
- {0.565664f, 0.018225f, 0.770779f},
- {0.440935f, 0.018225f, 0.847506f},
- {0.303862f, 0.018225f, 0.904575f},
- {0.156274f, 0.018225f, 0.940158f},
- {-0.000000f, 0.018225f, 0.952425f},
- {1.128870f, 0.031200f, 0.187642f},
- {1.143600f, 0.031200f, 0.000000f},
- {1.086146f, 0.031200f, 0.364854f},
- {1.017621f, 0.031200f, 0.529441f},
- {0.925493f, 0.031200f, 0.679207f},
- {0.811956f, 0.031200f, 0.811956f},
- {0.679207f, 0.031200f, 0.925493f},
- {0.529441f, 0.031200f, 1.017621f},
- {0.364854f, 0.031200f, 1.086146f},
- {0.187642f, 0.031200f, 1.128870f},
- {0.000000f, 0.031200f, 1.143600f},
- {1.267832f, 0.046875f, 0.210740f},
- {1.284375f, 0.046875f, 0.000000f},
- {1.219848f, 0.046875f, 0.409767f},
- {1.142888f, 0.046875f, 0.594614f},
- {1.039419f, 0.046875f, 0.762816f},
- {0.911906f, 0.046875f, 0.911906f},
- {0.762816f, 0.046875f, 1.039419f},
- {0.594614f, 0.046875f, 1.142888f},
- {0.409767f, 0.046875f, 1.219848f},
- {0.210740f, 0.046875f, 1.267832f},
- {0.000000f, 0.046875f, 1.284375f},
- {1.364595f, 0.064800f, 0.226824f},
- {1.382400f, 0.064800f, 0.000000f},
- {1.312948f, 0.064800f, 0.441041f},
- {1.230115f, 0.064800f, 0.639996f},
- {1.118749f, 0.064800f, 0.821035f},
- {0.981504f, 0.064800f, 0.981504f},
- {0.821035f, 0.064800f, 1.118749f},
- {0.639996f, 0.064800f, 1.230115f},
- {0.441041f, 0.064800f, 1.312948f},
- {0.226824f, 0.064800f, 1.364595f},
- {-0.000000f, 0.064800f, 1.382400f},
- {1.426709f, 0.084525f, 0.237149f},
- {1.445325f, 0.084525f, 0.000000f},
- {1.372712f, 0.084525f, 0.461116f},
- {1.286108f, 0.084525f, 0.669128f},
- {1.169673f, 0.084525f, 0.858407f},
- {1.026181f, 0.084525f, 1.026181f},
- {0.858407f, 0.084525f, 1.169673f},
- {0.669128f, 0.084525f, 1.286108f},
- {0.461116f, 0.084525f, 1.372712f},
- {0.237149f, 0.084525f, 1.426709f},
- {0.000000f, 0.084525f, 1.445325f},
- {1.461727f, 0.105600f, 0.242970f},
- {1.480800f, 0.105600f, 0.000000f},
- {1.406405f, 0.105600f, 0.472434f},
- {1.317675f, 0.105600f, 0.685551f},
- {1.198382f, 0.105600f, 0.879477f},
- {1.051368f, 0.105600f, 1.051368f},
- {0.879477f, 0.105600f, 1.198382f},
- {0.685551f, 0.105600f, 1.317675f},
- {0.472434f, 0.105600f, 1.406405f},
- {0.242970f, 0.105600f, 1.461727f},
- {-0.000000f, 0.105600f, 1.480800f},
- {1.477200f, 0.127575f, 0.245542f},
- {1.496475f, 0.127575f, 0.000000f},
- {1.421292f, 0.127575f, 0.477435f},
- {1.331623f, 0.127575f, 0.692808f},
- {1.211067f, 0.127575f, 0.888786f},
- {1.062497f, 0.127575f, 1.062497f},
- {0.888786f, 0.127575f, 1.211067f},
- {0.692808f, 0.127575f, 1.331623f},
- {0.477435f, 0.127575f, 1.421292f},
- {0.245542f, 0.127575f, 1.477200f},
- {-0.000000f, 0.127575f, 1.496475f},
- {1.480680f, 0.150000f, 0.246120f},
- {1.424640f, 0.150000f, 0.478560f},
- {1.334760f, 0.150000f, 0.694440f},
- {1.213920f, 0.150000f, 0.890880f},
- {0.890880f, 0.150000f, 1.213920f},
- {0.694440f, 0.150000f, 1.334760f},
- {0.478560f, 0.150000f, 1.424640f},
- {0.246120f, 0.150000f, 1.480680f},
- {0.000000f, 0.002175f, 0.388275f},
- {-0.063708f, 0.002175f, 0.383274f},
- {-0.123875f, 0.002175f, 0.368768f},
- {-0.179756f, 0.002175f, 0.345503f},
- {-0.230604f, 0.002175f, 0.314223f},
- {-0.275675f, 0.002175f, 0.275675f},
- {-0.314223f, 0.002175f, 0.230604f},
- {-0.345503f, 0.002175f, 0.179756f},
- {-0.368768f, 0.002175f, 0.123875f},
- {-0.383274f, 0.002175f, 0.063708f},
- {-0.388275f, 0.002175f, -0.000000f},
- {-0.115381f, 0.008400f, 0.694143f},
- {-0.224349f, 0.008400f, 0.667871f},
- {-0.325553f, 0.008400f, 0.625735f},
- {-0.417645f, 0.008400f, 0.569086f},
- {-0.499272f, 0.008400f, 0.499272f},
- {-0.569086f, 0.008400f, 0.417645f},
- {-0.625735f, 0.008400f, 0.325553f},
- {-0.667871f, 0.008400f, 0.224349f},
- {-0.694143f, 0.008400f, 0.115381f},
- {-0.703200f, 0.008400f, 0.000000f},
- {-0.156274f, 0.018225f, 0.940158f},
- {0.000000f, 0.018225f, 0.952425f},
- {-0.303862f, 0.018225f, 0.904575f},
- {-0.440935f, 0.018225f, 0.847506f},
- {-0.565664f, 0.018225f, 0.770779f},
- {-0.676222f, 0.018225f, 0.676222f},
- {-0.770779f, 0.018225f, 0.565664f},
- {-0.847506f, 0.018225f, 0.440935f},
- {-0.904575f, 0.018225f, 0.303862f},
- {-0.940158f, 0.018225f, 0.156274f},
- {-0.952425f, 0.018225f, -0.000000f},
- {-0.187642f, 0.031200f, 1.128870f},
- {0.000000f, 0.031200f, 1.143600f},
- {-0.364854f, 0.031200f, 1.086146f},
- {-0.529441f, 0.031200f, 1.017621f},
- {-0.679207f, 0.031200f, 0.925493f},
- {-0.811956f, 0.031200f, 0.811956f},
- {-0.925493f, 0.031200f, 0.679207f},
- {-1.017621f, 0.031200f, 0.529441f},
- {-1.086146f, 0.031200f, 0.364854f},
- {-1.128870f, 0.031200f, 0.187642f},
- {-1.143600f, 0.031200f, 0.000000f},
- {-0.210740f, 0.046875f, 1.267832f},
- {0.000000f, 0.046875f, 1.284375f},
- {-0.409767f, 0.046875f, 1.219848f},
- {-0.594614f, 0.046875f, 1.142888f},
- {-0.762816f, 0.046875f, 1.039419f},
- {-0.911906f, 0.046875f, 0.911906f},
- {-1.039419f, 0.046875f, 0.762816f},
- {-1.142888f, 0.046875f, 0.594614f},
- {-1.219848f, 0.046875f, 0.409767f},
- {-1.267832f, 0.046875f, 0.210740f},
- {-1.284375f, 0.046875f, 0.000000f},
- {-0.226824f, 0.064800f, 1.364595f},
- {0.000000f, 0.064800f, 1.382400f},
- {-0.441041f, 0.064800f, 1.312948f},
- {-0.639996f, 0.064800f, 1.230115f},
- {-0.821035f, 0.064800f, 1.118749f},
- {-0.981504f, 0.064800f, 0.981504f},
- {-1.118749f, 0.064800f, 0.821035f},
- {-1.230115f, 0.064800f, 0.639996f},
- {-1.312948f, 0.064800f, 0.441041f},
- {-1.364595f, 0.064800f, 0.226824f},
- {-1.382400f, 0.064800f, -0.000000f},
- {-0.237149f, 0.084525f, 1.426709f},
- {0.000000f, 0.084525f, 1.445325f},
- {-0.461116f, 0.084525f, 1.372712f},
- {-0.669128f, 0.084525f, 1.286108f},
- {-0.858407f, 0.084525f, 1.169673f},
- {-1.026181f, 0.084525f, 1.026181f},
- {-1.169673f, 0.084525f, 0.858407f},
- {-1.286108f, 0.084525f, 0.669128f},
- {-1.372712f, 0.084525f, 0.461116f},
- {-1.426709f, 0.084525f, 0.237149f},
- {-1.445325f, 0.084525f, 0.000000f},
- {-0.242970f, 0.105600f, 1.461727f},
- {0.000000f, 0.105600f, 1.480800f},
- {-0.472434f, 0.105600f, 1.406405f},
- {-0.685551f, 0.105600f, 1.317675f},
- {-0.879477f, 0.105600f, 1.198382f},
- {-1.051368f, 0.105600f, 1.051368f},
- {-1.198382f, 0.105600f, 0.879477f},
- {-1.317675f, 0.105600f, 0.685551f},
- {-1.406405f, 0.105600f, 0.472434f},
- {-1.461727f, 0.105600f, 0.242970f},
- {-1.480800f, 0.105600f, -0.000000f},
- {-0.245542f, 0.127575f, 1.477200f},
- {0.000000f, 0.127575f, 1.496475f},
- {-0.477435f, 0.127575f, 1.421292f},
- {-0.692808f, 0.127575f, 1.331623f},
- {-0.888786f, 0.127575f, 1.211067f},
- {-1.062497f, 0.127575f, 1.062497f},
- {-1.211067f, 0.127575f, 0.888786f},
- {-1.331623f, 0.127575f, 0.692808f},
- {-1.421292f, 0.127575f, 0.477435f},
- {-1.477200f, 0.127575f, 0.245542f},
- {-1.496475f, 0.127575f, -0.000000f},
- {-0.246120f, 0.150000f, 1.480680f},
- {-0.478560f, 0.150000f, 1.424640f},
- {-0.694440f, 0.150000f, 1.334760f},
- {-0.890880f, 0.150000f, 1.213920f},
- {-1.213920f, 0.150000f, 0.890880f},
- {-1.334760f, 0.150000f, 0.694440f},
- {-1.424640f, 0.150000f, 0.478560f},
- {-1.480680f, 0.150000f, 0.246120f},
- {-0.388275f, 0.002175f, 0.000000f},
- {-0.383274f, 0.002175f, -0.063708f},
- {-0.368768f, 0.002175f, -0.123875f},
- {-0.345503f, 0.002175f, -0.179756f},
- {-0.314223f, 0.002175f, -0.230604f},
- {-0.275675f, 0.002175f, -0.275675f},
- {-0.230604f, 0.002175f, -0.314223f},
- {-0.179756f, 0.002175f, -0.345503f},
- {-0.123875f, 0.002175f, -0.368768f},
- {-0.063708f, 0.002175f, -0.383274f},
- {0.000000f, 0.002175f, -0.388275f},
- {-0.694143f, 0.008400f, -0.115381f},
- {-0.667871f, 0.008400f, -0.224349f},
- {-0.625735f, 0.008400f, -0.325553f},
- {-0.569086f, 0.008400f, -0.417645f},
- {-0.499272f, 0.008400f, -0.499272f},
- {-0.417645f, 0.008400f, -0.569086f},
- {-0.325553f, 0.008400f, -0.625735f},
- {-0.224349f, 0.008400f, -0.667871f},
- {-0.115381f, 0.008400f, -0.694143f},
- {0.000000f, 0.008400f, -0.703200f},
- {-0.940158f, 0.018225f, -0.156274f},
- {-0.952425f, 0.018225f, 0.000000f},
- {-0.904575f, 0.018225f, -0.303862f},
- {-0.847506f, 0.018225f, -0.440935f},
- {-0.770779f, 0.018225f, -0.565664f},
- {-0.676222f, 0.018225f, -0.676222f},
- {-0.565664f, 0.018225f, -0.770779f},
- {-0.440935f, 0.018225f, -0.847506f},
- {-0.303862f, 0.018225f, -0.904575f},
- {-0.156274f, 0.018225f, -0.940158f},
- {0.000000f, 0.018225f, -0.952425f},
- {-1.128870f, 0.031200f, -0.187642f},
- {-1.143600f, 0.031200f, 0.000000f},
- {-1.086146f, 0.031200f, -0.364854f},
- {-1.017621f, 0.031200f, -0.529441f},
- {-0.925493f, 0.031200f, -0.679207f},
- {-0.811956f, 0.031200f, -0.811956f},
- {-0.679207f, 0.031200f, -0.925493f},
- {-0.529441f, 0.031200f, -1.017621f},
- {-0.364854f, 0.031200f, -1.086146f},
- {-0.187642f, 0.031200f, -1.128870f},
- {0.000000f, 0.031200f, -1.143600f},
- {-1.267832f, 0.046875f, -0.210740f},
- {-1.284375f, 0.046875f, 0.000000f},
- {-1.219848f, 0.046875f, -0.409767f},
- {-1.142888f, 0.046875f, -0.594614f},
- {-1.039419f, 0.046875f, -0.762816f},
- {-0.911906f, 0.046875f, -0.911906f},
- {-0.762816f, 0.046875f, -1.039419f},
- {-0.594614f, 0.046875f, -1.142888f},
- {-0.409767f, 0.046875f, -1.219848f},
- {-0.210740f, 0.046875f, -1.267832f},
- {-0.000000f, 0.046875f, -1.284375f},
- {-1.364595f, 0.064800f, -0.226824f},
- {-1.382400f, 0.064800f, 0.000000f},
- {-1.312948f, 0.064800f, -0.441041f},
- {-1.230115f, 0.064800f, -0.639996f},
- {-1.118749f, 0.064800f, -0.821035f},
- {-0.981504f, 0.064800f, -0.981504f},
- {-0.821035f, 0.064800f, -1.118749f},
- {-0.639996f, 0.064800f, -1.230115f},
- {-0.441041f, 0.064800f, -1.312948f},
- {-0.226824f, 0.064800f, -1.364595f},
- {0.000000f, 0.064800f, -1.382400f},
- {-1.426709f, 0.084525f, -0.237149f},
- {-1.445325f, 0.084525f, 0.000000f},
- {-1.372712f, 0.084525f, -0.461116f},
- {-1.286108f, 0.084525f, -0.669128f},
- {-1.169673f, 0.084525f, -0.858407f},
- {-1.026181f, 0.084525f, -1.026181f},
- {-0.858407f, 0.084525f, -1.169673f},
- {-0.669128f, 0.084525f, -1.286108f},
- {-0.461116f, 0.084525f, -1.372712f},
- {-0.237149f, 0.084525f, -1.426709f},
- {0.000000f, 0.084525f, -1.445325f},
- {-1.461727f, 0.105600f, -0.242970f},
- {-1.480800f, 0.105600f, 0.000000f},
- {-1.406405f, 0.105600f, -0.472434f},
- {-1.317675f, 0.105600f, -0.685551f},
- {-1.198382f, 0.105600f, -0.879477f},
- {-1.051368f, 0.105600f, -1.051368f},
- {-0.879477f, 0.105600f, -1.198382f},
- {-0.685551f, 0.105600f, -1.317675f},
- {-0.472434f, 0.105600f, -1.406405f},
- {-0.242970f, 0.105600f, -1.461727f},
- {0.000000f, 0.105600f, -1.480800f},
- {-1.477200f, 0.127575f, -0.245542f},
- {-1.496475f, 0.127575f, 0.000000f},
- {-1.421292f, 0.127575f, -0.477435f},
- {-1.331623f, 0.127575f, -0.692808f},
- {-1.211067f, 0.127575f, -0.888786f},
- {-1.062497f, 0.127575f, -1.062497f},
- {-0.888786f, 0.127575f, -1.211067f},
- {-0.692808f, 0.127575f, -1.331623f},
- {-0.477435f, 0.127575f, -1.421292f},
- {-0.245542f, 0.127575f, -1.477200f},
- {0.000000f, 0.127575f, -1.496475f},
- {-1.480680f, 0.150000f, -0.246120f},
- {-1.424640f, 0.150000f, -0.478560f},
- {-1.334760f, 0.150000f, -0.694440f},
- {-1.213920f, 0.150000f, -0.890880f},
- {-0.890880f, 0.150000f, -1.213920f},
- {-0.694440f, 0.150000f, -1.334760f},
- {-0.478560f, 0.150000f, -1.424640f},
- {-0.246120f, 0.150000f, -1.480680f},
- {0.000000f, 0.002175f, -0.388275f},
- {0.063708f, 0.002175f, -0.383274f},
- {0.123875f, 0.002175f, -0.368768f},
- {0.179756f, 0.002175f, -0.345503f},
- {0.230604f, 0.002175f, -0.314223f},
- {0.275675f, 0.002175f, -0.275675f},
- {0.314223f, 0.002175f, -0.230604f},
- {0.345503f, 0.002175f, -0.179756f},
- {0.368768f, 0.002175f, -0.123875f},
- {0.383274f, 0.002175f, -0.063708f},
- {0.388275f, 0.002175f, 0.000000f},
- {0.115381f, 0.008400f, -0.694143f},
- {0.224349f, 0.008400f, -0.667871f},
- {0.325553f, 0.008400f, -0.625735f},
- {0.417645f, 0.008400f, -0.569086f},
- {0.499272f, 0.008400f, -0.499272f},
- {0.569086f, 0.008400f, -0.417645f},
- {0.625735f, 0.008400f, -0.325553f},
- {0.667871f, 0.008400f, -0.224349f},
- {0.694143f, 0.008400f, -0.115381f},
- {0.156274f, 0.018225f, -0.940158f},
- {0.000000f, 0.018225f, -0.952425f},
- {0.303862f, 0.018225f, -0.904575f},
- {0.440935f, 0.018225f, -0.847506f},
- {0.565664f, 0.018225f, -0.770779f},
- {0.676222f, 0.018225f, -0.676222f},
- {0.770779f, 0.018225f, -0.565664f},
- {0.847506f, 0.018225f, -0.440935f},
- {0.904575f, 0.018225f, -0.303862f},
- {0.940158f, 0.018225f, -0.156274f},
- {0.952425f, 0.018225f, 0.000000f},
- {0.187642f, 0.031200f, -1.128870f},
- {0.000000f, 0.031200f, -1.143600f},
- {0.364854f, 0.031200f, -1.086146f},
- {0.529441f, 0.031200f, -1.017621f},
- {0.679207f, 0.031200f, -0.925493f},
- {0.811956f, 0.031200f, -0.811956f},
- {0.925493f, 0.031200f, -0.679207f},
- {1.017621f, 0.031200f, -0.529441f},
- {1.086146f, 0.031200f, -0.364854f},
- {1.128870f, 0.031200f, -0.187642f},
- {1.143600f, 0.031200f, 0.000000f},
- {0.210740f, 0.046875f, -1.267832f},
- {0.000000f, 0.046875f, -1.284375f},
- {0.409767f, 0.046875f, -1.219848f},
- {0.594614f, 0.046875f, -1.142888f},
- {0.762816f, 0.046875f, -1.039419f},
- {0.911906f, 0.046875f, -0.911906f},
- {1.039419f, 0.046875f, -0.762816f},
- {1.142888f, 0.046875f, -0.594614f},
- {1.219848f, 0.046875f, -0.409767f},
- {1.267832f, 0.046875f, -0.210740f},
- {1.284375f, 0.046875f, -0.000000f},
- {0.226824f, 0.064800f, -1.364595f},
- {0.000000f, 0.064800f, -1.382400f},
- {0.441041f, 0.064800f, -1.312948f},
- {0.639996f, 0.064800f, -1.230115f},
- {0.821035f, 0.064800f, -1.118749f},
- {0.981504f, 0.064800f, -0.981504f},
- {1.118749f, 0.064800f, -0.821035f},
- {1.230115f, 0.064800f, -0.639996f},
- {1.312948f, 0.064800f, -0.441041f},
- {1.364595f, 0.064800f, -0.226824f},
- {1.382400f, 0.064800f, 0.000000f},
- {0.237149f, 0.084525f, -1.426709f},
- {0.000000f, 0.084525f, -1.445325f},
- {0.461116f, 0.084525f, -1.372712f},
- {0.669128f, 0.084525f, -1.286108f},
- {0.858407f, 0.084525f, -1.169673f},
- {1.026181f, 0.084525f, -1.026181f},
- {1.169673f, 0.084525f, -0.858407f},
- {1.286108f, 0.084525f, -0.669128f},
- {1.372712f, 0.084525f, -0.461116f},
- {1.426709f, 0.084525f, -0.237149f},
- {1.445325f, 0.084525f, 0.000000f},
- {0.242970f, 0.105600f, -1.461727f},
- {0.000000f, 0.105600f, -1.480800f},
- {0.472434f, 0.105600f, -1.406405f},
- {0.685551f, 0.105600f, -1.317675f},
- {0.879477f, 0.105600f, -1.198382f},
- {1.051368f, 0.105600f, -1.051368f},
- {1.198382f, 0.105600f, -0.879477f},
- {1.317675f, 0.105600f, -0.685551f},
- {1.406405f, 0.105600f, -0.472434f},
- {1.461727f, 0.105600f, -0.242970f},
- {1.480800f, 0.105600f, 0.000000f},
- {0.245542f, 0.127575f, -1.477200f},
- {0.000000f, 0.127575f, -1.496475f},
- {0.477435f, 0.127575f, -1.421292f},
- {0.692808f, 0.127575f, -1.331623f},
- {0.888786f, 0.127575f, -1.211067f},
- {1.062497f, 0.127575f, -1.062497f},
- {1.211067f, 0.127575f, -0.888786f},
- {1.331623f, 0.127575f, -0.692808f},
- {1.421292f, 0.127575f, -0.477435f},
- {1.477200f, 0.127575f, -0.245542f},
- {1.496475f, 0.127575f, 0.000000f},
- {0.246120f, 0.150000f, -1.480680f},
- {0.478560f, 0.150000f, -1.424640f},
- {0.694440f, 0.150000f, -1.334760f},
- {0.890880f, 0.150000f, -1.213920f},
- {1.213920f, 0.150000f, -0.890880f},
- {1.334760f, 0.150000f, -0.694440f},
- {1.424640f, 0.150000f, -0.478560f},
- {1.480680f, 0.150000f, -0.246120f},
-};
-
-static const float teapot_texcoords[TEAPOT_VERTEX_COUNT][2] = {
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
- {0.000000f, 0.000000f},
-};
-
-static const float teapot_normals[TEAPOT_VERTEX_COUNT][3] = {
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
- {0.000000f, 0.000000f, 0.000000f},
-};
-
-static const uint16_t teapot_indices[TEAPOT_INDEX_COUNT] = {
- 0, 1, 2,
- 2, 3, 0,
- 4, 5, 1,
- 1, 0, 4,
- 6, 7, 5,
- 5, 4, 6,
- 8, 9, 7,
- 7, 6, 8,
- 10, 11, 9,
- 9, 8, 10,
- 12, 13, 11,
- 11, 10, 12,
- 14, 15, 13,
- 13, 12, 14,
- 16, 17, 15,
- 15, 14, 16,
- 18, 19, 17,
- 17, 16, 18,
- 20, 21, 19,
- 19, 18, 20,
- 22, 0, 3,
- 3, 23, 22,
- 24, 4, 0,
- 0, 22, 24,
- 25, 6, 4,
- 4, 24, 25,
- 26, 8, 6,
- 6, 25, 26,
- 27, 10, 8,
- 8, 26, 27,
- 28, 12, 10,
- 10, 27, 28,
- 29, 14, 12,
- 12, 28, 29,
- 30, 16, 14,
- 14, 29, 30,
- 31, 18, 16,
- 16, 30, 31,
- 32, 20, 18,
- 18, 31, 32,
- 33, 22, 23,
- 23, 34, 33,
- 35, 24, 22,
- 22, 33, 35,
- 36, 25, 24,
- 24, 35, 36,
- 37, 26, 25,
- 25, 36, 37,
- 38, 27, 26,
- 26, 37, 38,
- 39, 28, 27,
- 27, 38, 39,
- 40, 29, 28,
- 28, 39, 40,
- 41, 30, 29,
- 29, 40, 41,
- 42, 31, 30,
- 30, 41, 42,
- 43, 32, 31,
- 31, 42, 43,
- 44, 33, 34,
- 34, 45, 44,
- 46, 35, 33,
- 33, 44, 46,
- 47, 36, 35,
- 35, 46, 47,
- 48, 37, 36,
- 36, 47, 48,
- 49, 38, 37,
- 37, 48, 49,
- 50, 39, 38,
- 38, 49, 50,
- 51, 40, 39,
- 39, 50, 51,
- 52, 41, 40,
- 40, 51, 52,
- 53, 42, 41,
- 41, 52, 53,
- 54, 43, 42,
- 42, 53, 54,
- 55, 44, 45,
- 45, 56, 55,
- 57, 46, 44,
- 44, 55, 57,
- 58, 47, 46,
- 46, 57, 58,
- 59, 48, 47,
- 47, 58, 59,
- 60, 49, 48,
- 48, 59, 60,
- 61, 50, 49,
- 49, 60, 61,
- 62, 51, 50,
- 50, 61, 62,
- 63, 52, 51,
- 51, 62, 63,
- 64, 53, 52,
- 52, 63, 64,
- 65, 54, 53,
- 53, 64, 65,
- 66, 55, 56,
- 56, 67, 66,
- 68, 57, 55,
- 55, 66, 68,
- 69, 58, 57,
- 57, 68, 69,
- 70, 59, 58,
- 58, 69, 70,
- 71, 60, 59,
- 59, 70, 71,
- 72, 61, 60,
- 60, 71, 72,
- 73, 62, 61,
- 61, 72, 73,
- 74, 63, 62,
- 62, 73, 74,
- 75, 64, 63,
- 63, 74, 75,
- 76, 65, 64,
- 64, 75, 76,
- 77, 66, 67,
- 67, 78, 77,
- 79, 68, 66,
- 66, 77, 79,
- 80, 69, 68,
- 68, 79, 80,
- 81, 70, 69,
- 69, 80, 81,
- 82, 71, 70,
- 70, 81, 82,
- 83, 72, 71,
- 71, 82, 83,
- 84, 73, 72,
- 72, 83, 84,
- 85, 74, 73,
- 73, 84, 85,
- 86, 75, 74,
- 74, 85, 86,
- 87, 76, 75,
- 75, 86, 87,
- 88, 77, 78,
- 78, 89, 88,
- 90, 79, 77,
- 77, 88, 90,
- 91, 80, 79,
- 79, 90, 91,
- 92, 81, 80,
- 80, 91, 92,
- 93, 82, 81,
- 81, 92, 93,
- 94, 83, 82,
- 82, 93, 94,
- 95, 84, 83,
- 83, 94, 95,
- 96, 85, 84,
- 84, 95, 96,
- 97, 86, 85,
- 85, 96, 97,
- 98, 87, 86,
- 86, 97, 98,
- 99, 88, 89,
- 89, 100, 99,
- 101, 90, 88,
- 88, 99, 101,
- 102, 91, 90,
- 90, 101, 102,
- 103, 92, 91,
- 91, 102, 103,
- 104, 93, 92,
- 92, 103, 104,
- 105, 94, 93,
- 93, 104, 105,
- 106, 95, 94,
- 94, 105, 106,
- 107, 96, 95,
- 95, 106, 107,
- 108, 97, 96,
- 96, 107, 108,
- 109, 98, 97,
- 97, 108, 109,
- 110, 99, 100,
- 100, 111, 110,
- 112, 101, 99,
- 99, 110, 112,
- 113, 102, 101,
- 101, 112, 113,
- 114, 103, 102,
- 102, 113, 114,
- 115, 104, 103,
- 103, 114, 115,
- 116, 105, 104,
- 104, 115, 116,
- 117, 106, 105,
- 105, 116, 117,
- 118, 107, 106,
- 106, 117, 118,
- 119, 108, 107,
- 107, 118, 119,
- 120, 109, 108,
- 108, 119, 120,
- 121, 122, 123,
- 123, 124, 121,
- 125, 126, 122,
- 122, 121, 125,
- 127, 128, 126,
- 126, 125, 127,
- 129, 130, 128,
- 128, 127, 129,
- 131, 132, 130,
- 130, 129, 131,
- 133, 134, 132,
- 132, 131, 133,
- 135, 136, 134,
- 134, 133, 135,
- 137, 138, 136,
- 136, 135, 137,
- 139, 140, 138,
- 138, 137, 139,
- 141, 142, 140,
- 140, 139, 141,
- 143, 121, 124,
- 124, 144, 143,
- 145, 125, 121,
- 121, 143, 145,
- 146, 127, 125,
- 125, 145, 146,
- 147, 129, 127,
- 127, 146, 147,
- 148, 131, 129,
- 129, 147, 148,
- 149, 133, 131,
- 131, 148, 149,
- 150, 135, 133,
- 133, 149, 150,
- 151, 137, 135,
- 135, 150, 151,
- 152, 139, 137,
- 137, 151, 152,
- 153, 141, 139,
- 139, 152, 153,
- 154, 143, 144,
- 144, 155, 154,
- 156, 145, 143,
- 143, 154, 156,
- 157, 146, 145,
- 145, 156, 157,
- 158, 147, 146,
- 146, 157, 158,
- 159, 148, 147,
- 147, 158, 159,
- 160, 149, 148,
- 148, 159, 160,
- 161, 150, 149,
- 149, 160, 161,
- 162, 151, 150,
- 150, 161, 162,
- 163, 152, 151,
- 151, 162, 163,
- 164, 153, 152,
- 152, 163, 164,
- 165, 154, 155,
- 155, 166, 165,
- 167, 156, 154,
- 154, 165, 167,
- 168, 157, 156,
- 156, 167, 168,
- 169, 158, 157,
- 157, 168, 169,
- 170, 159, 158,
- 158, 169, 170,
- 171, 160, 159,
- 159, 170, 171,
- 172, 161, 160,
- 160, 171, 172,
- 173, 162, 161,
- 161, 172, 173,
- 174, 163, 162,
- 162, 173, 174,
- 175, 164, 163,
- 163, 174, 175,
- 176, 165, 166,
- 166, 177, 176,
- 178, 167, 165,
- 165, 176, 178,
- 179, 168, 167,
- 167, 178, 179,
- 180, 169, 168,
- 168, 179, 180,
- 181, 170, 169,
- 169, 180, 181,
- 182, 171, 170,
- 170, 181, 182,
- 183, 172, 171,
- 171, 182, 183,
- 184, 173, 172,
- 172, 183, 184,
- 185, 174, 173,
- 173, 184, 185,
- 186, 175, 174,
- 174, 185, 186,
- 187, 176, 177,
- 177, 188, 187,
- 189, 178, 176,
- 176, 187, 189,
- 190, 179, 178,
- 178, 189, 190,
- 191, 180, 179,
- 179, 190, 191,
- 192, 181, 180,
- 180, 191, 192,
- 193, 182, 181,
- 181, 192, 193,
- 194, 183, 182,
- 182, 193, 194,
- 195, 184, 183,
- 183, 194, 195,
- 196, 185, 184,
- 184, 195, 196,
- 197, 186, 185,
- 185, 196, 197,
- 198, 187, 188,
- 188, 87, 198,
- 199, 189, 187,
- 187, 198, 199,
- 200, 190, 189,
- 189, 199, 200,
- 201, 191, 190,
- 190, 200, 201,
- 202, 192, 191,
- 191, 201, 202,
- 203, 193, 192,
- 192, 202, 203,
- 204, 194, 193,
- 193, 203, 204,
- 205, 195, 194,
- 194, 204, 205,
- 206, 196, 195,
- 195, 205, 206,
- 207, 197, 196,
- 196, 206, 207,
- 208, 198, 87,
- 87, 209, 208,
- 210, 199, 198,
- 198, 208, 210,
- 211, 200, 199,
- 199, 210, 211,
- 212, 201, 200,
- 200, 211, 212,
- 213, 202, 201,
- 201, 212, 213,
- 214, 203, 202,
- 202, 213, 214,
- 215, 204, 203,
- 203, 214, 215,
- 216, 205, 204,
- 204, 215, 216,
- 217, 206, 205,
- 205, 216, 217,
- 218, 207, 206,
- 206, 217, 218,
- 219, 208, 209,
- 209, 220, 219,
- 221, 210, 208,
- 208, 219, 221,
- 222, 211, 210,
- 210, 221, 222,
- 223, 212, 211,
- 211, 222, 223,
- 224, 213, 212,
- 212, 223, 224,
- 225, 214, 213,
- 213, 224, 225,
- 226, 215, 214,
- 214, 225, 226,
- 227, 216, 215,
- 215, 226, 227,
- 228, 217, 216,
- 216, 227, 228,
- 229, 218, 217,
- 217, 228, 229,
- 230, 219, 220,
- 220, 231, 230,
- 232, 221, 219,
- 219, 230, 232,
- 233, 222, 221,
- 221, 232, 233,
- 234, 223, 222,
- 222, 233, 234,
- 235, 224, 223,
- 223, 234, 235,
- 236, 225, 224,
- 224, 235, 236,
- 237, 226, 225,
- 225, 236, 237,
- 238, 227, 226,
- 226, 237, 238,
- 239, 228, 227,
- 227, 238, 239,
- 240, 229, 228,
- 228, 239, 240,
- 241, 242, 243,
- 243, 244, 241,
- 245, 246, 242,
- 242, 241, 245,
- 247, 248, 246,
- 246, 245, 247,
- 249, 250, 248,
- 248, 247, 249,
- 251, 252, 250,
- 250, 249, 251,
- 253, 254, 252,
- 252, 251, 253,
- 255, 256, 254,
- 254, 253, 255,
- 257, 258, 256,
- 256, 255, 257,
- 259, 260, 258,
- 258, 257, 259,
- 261, 262, 260,
- 260, 259, 261,
- 263, 241, 244,
- 244, 264, 263,
- 265, 245, 241,
- 241, 263, 265,
- 266, 247, 245,
- 245, 265, 266,
- 267, 249, 247,
- 247, 266, 267,
- 268, 251, 249,
- 249, 267, 268,
- 269, 253, 251,
- 251, 268, 269,
- 270, 255, 253,
- 253, 269, 270,
- 271, 257, 255,
- 255, 270, 271,
- 272, 259, 257,
- 257, 271, 272,
- 273, 261, 259,
- 259, 272, 273,
- 274, 263, 264,
- 264, 275, 274,
- 276, 265, 263,
- 263, 274, 276,
- 277, 266, 265,
- 265, 276, 277,
- 278, 267, 266,
- 266, 277, 278,
- 279, 268, 267,
- 267, 278, 279,
- 280, 269, 268,
- 268, 279, 280,
- 281, 270, 269,
- 269, 280, 281,
- 282, 271, 270,
- 270, 281, 282,
- 283, 272, 271,
- 271, 282, 283,
- 284, 273, 272,
- 272, 283, 284,
- 285, 274, 275,
- 275, 286, 285,
- 287, 276, 274,
- 274, 285, 287,
- 288, 277, 276,
- 276, 287, 288,
- 289, 278, 277,
- 277, 288, 289,
- 290, 279, 278,
- 278, 289, 290,
- 291, 280, 279,
- 279, 290, 291,
- 292, 281, 280,
- 280, 291, 292,
- 293, 282, 281,
- 281, 292, 293,
- 294, 283, 282,
- 282, 293, 294,
- 295, 284, 283,
- 283, 294, 295,
- 296, 285, 286,
- 286, 297, 296,
- 298, 287, 285,
- 285, 296, 298,
- 299, 288, 287,
- 287, 298, 299,
- 300, 289, 288,
- 288, 299, 300,
- 301, 290, 289,
- 289, 300, 301,
- 302, 291, 290,
- 290, 301, 302,
- 303, 292, 291,
- 291, 302, 303,
- 304, 293, 292,
- 292, 303, 304,
- 305, 294, 293,
- 293, 304, 305,
- 306, 295, 294,
- 294, 305, 306,
- 307, 296, 297,
- 297, 308, 307,
- 309, 298, 296,
- 296, 307, 309,
- 310, 299, 298,
- 298, 309, 310,
- 311, 300, 299,
- 299, 310, 311,
- 312, 301, 300,
- 300, 311, 312,
- 313, 302, 301,
- 301, 312, 313,
- 314, 303, 302,
- 302, 313, 314,
- 315, 304, 303,
- 303, 314, 315,
- 316, 305, 304,
- 304, 315, 316,
- 317, 306, 305,
- 305, 316, 317,
- 318, 307, 308,
- 308, 207, 318,
- 319, 309, 307,
- 307, 318, 319,
- 320, 310, 309,
- 309, 319, 320,
- 321, 311, 310,
- 310, 320, 321,
- 322, 312, 311,
- 311, 321, 322,
- 323, 313, 312,
- 312, 322, 323,
- 324, 314, 313,
- 313, 323, 324,
- 325, 315, 314,
- 314, 324, 325,
- 326, 316, 315,
- 315, 325, 326,
- 327, 317, 316,
- 316, 326, 327,
- 328, 318, 207,
- 207, 329, 328,
- 330, 319, 318,
- 318, 328, 330,
- 331, 320, 319,
- 319, 330, 331,
- 332, 321, 320,
- 320, 331, 332,
- 333, 322, 321,
- 321, 332, 333,
- 334, 323, 322,
- 322, 333, 334,
- 335, 324, 323,
- 323, 334, 335,
- 336, 325, 324,
- 324, 335, 336,
- 337, 326, 325,
- 325, 336, 337,
- 338, 327, 326,
- 326, 337, 338,
- 339, 328, 329,
- 329, 340, 339,
- 341, 330, 328,
- 328, 339, 341,
- 342, 331, 330,
- 330, 341, 342,
- 343, 332, 331,
- 331, 342, 343,
- 344, 333, 332,
- 332, 343, 344,
- 345, 334, 333,
- 333, 344, 345,
- 346, 335, 334,
- 334, 345, 346,
- 347, 336, 335,
- 335, 346, 347,
- 348, 337, 336,
- 336, 347, 348,
- 349, 338, 337,
- 337, 348, 349,
- 350, 339, 340,
- 340, 351, 350,
- 352, 341, 339,
- 339, 350, 352,
- 353, 342, 341,
- 341, 352, 353,
- 354, 343, 342,
- 342, 353, 354,
- 355, 344, 343,
- 343, 354, 355,
- 356, 345, 344,
- 344, 355, 356,
- 357, 346, 345,
- 345, 356, 357,
- 358, 347, 346,
- 346, 357, 358,
- 359, 348, 347,
- 347, 358, 359,
- 360, 349, 348,
- 348, 359, 360,
- 361, 362, 363,
- 363, 364, 361,
- 365, 366, 362,
- 362, 361, 365,
- 367, 368, 366,
- 366, 365, 367,
- 369, 370, 368,
- 368, 367, 369,
- 371, 372, 370,
- 370, 369, 371,
- 373, 374, 372,
- 372, 371, 373,
- 375, 376, 374,
- 374, 373, 375,
- 377, 378, 376,
- 376, 375, 377,
- 379, 380, 378,
- 378, 377, 379,
- 381, 382, 380,
- 380, 379, 381,
- 383, 361, 364,
- 364, 384, 383,
- 385, 365, 361,
- 361, 383, 385,
- 386, 367, 365,
- 365, 385, 386,
- 387, 369, 367,
- 367, 386, 387,
- 388, 371, 369,
- 369, 387, 388,
- 389, 373, 371,
- 371, 388, 389,
- 390, 375, 373,
- 373, 389, 390,
- 391, 377, 375,
- 375, 390, 391,
- 392, 379, 377,
- 377, 391, 392,
- 393, 381, 379,
- 379, 392, 393,
- 394, 383, 384,
- 384, 395, 394,
- 396, 385, 383,
- 383, 394, 396,
- 397, 386, 385,
- 385, 396, 397,
- 398, 387, 386,
- 386, 397, 398,
- 399, 388, 387,
- 387, 398, 399,
- 400, 389, 388,
- 388, 399, 400,
- 401, 390, 389,
- 389, 400, 401,
- 402, 391, 390,
- 390, 401, 402,
- 403, 392, 391,
- 391, 402, 403,
- 404, 393, 392,
- 392, 403, 404,
- 405, 394, 395,
- 395, 406, 405,
- 407, 396, 394,
- 394, 405, 407,
- 408, 397, 396,
- 396, 407, 408,
- 409, 398, 397,
- 397, 408, 409,
- 410, 399, 398,
- 398, 409, 410,
- 411, 400, 399,
- 399, 410, 411,
- 412, 401, 400,
- 400, 411, 412,
- 413, 402, 401,
- 401, 412, 413,
- 414, 403, 402,
- 402, 413, 414,
- 415, 404, 403,
- 403, 414, 415,
- 416, 405, 406,
- 406, 417, 416,
- 418, 407, 405,
- 405, 416, 418,
- 419, 408, 407,
- 407, 418, 419,
- 420, 409, 408,
- 408, 419, 420,
- 421, 410, 409,
- 409, 420, 421,
- 422, 411, 410,
- 410, 421, 422,
- 423, 412, 411,
- 411, 422, 423,
- 424, 413, 412,
- 412, 423, 424,
- 425, 414, 413,
- 413, 424, 425,
- 426, 415, 414,
- 414, 425, 426,
- 427, 416, 417,
- 417, 428, 427,
- 429, 418, 416,
- 416, 427, 429,
- 430, 419, 418,
- 418, 429, 430,
- 431, 420, 419,
- 419, 430, 431,
- 432, 421, 420,
- 420, 431, 432,
- 433, 422, 421,
- 421, 432, 433,
- 434, 423, 422,
- 422, 433, 434,
- 435, 424, 423,
- 423, 434, 435,
- 436, 425, 424,
- 424, 435, 436,
- 437, 426, 425,
- 425, 436, 437,
- 438, 427, 428,
- 428, 327, 438,
- 439, 429, 427,
- 427, 438, 439,
- 440, 430, 429,
- 429, 439, 440,
- 441, 431, 430,
- 430, 440, 441,
- 442, 432, 431,
- 431, 441, 442,
- 443, 433, 432,
- 432, 442, 443,
- 444, 434, 433,
- 433, 443, 444,
- 445, 435, 434,
- 434, 444, 445,
- 446, 436, 435,
- 435, 445, 446,
- 78, 437, 436,
- 436, 446, 78,
- 447, 438, 327,
- 327, 448, 447,
- 449, 439, 438,
- 438, 447, 449,
- 450, 440, 439,
- 439, 449, 450,
- 451, 441, 440,
- 440, 450, 451,
- 452, 442, 441,
- 441, 451, 452,
- 453, 443, 442,
- 442, 452, 453,
- 454, 444, 443,
- 443, 453, 454,
- 455, 445, 444,
- 444, 454, 455,
- 456, 446, 445,
- 445, 455, 456,
- 457, 78, 446,
- 446, 456, 457,
- 458, 447, 448,
- 448, 459, 458,
- 460, 449, 447,
- 447, 458, 460,
- 461, 450, 449,
- 449, 460, 461,
- 462, 451, 450,
- 450, 461, 462,
- 463, 452, 451,
- 451, 462, 463,
- 464, 453, 452,
- 452, 463, 464,
- 465, 454, 453,
- 453, 464, 465,
- 466, 455, 454,
- 454, 465, 466,
- 467, 456, 455,
- 455, 466, 467,
- 468, 457, 456,
- 456, 467, 468,
- 469, 458, 459,
- 459, 470, 469,
- 471, 460, 458,
- 458, 469, 471,
- 472, 461, 460,
- 460, 471, 472,
- 473, 462, 461,
- 461, 472, 473,
- 474, 463, 462,
- 462, 473, 474,
- 475, 464, 463,
- 463, 474, 475,
- 476, 465, 464,
- 464, 475, 476,
- 477, 466, 465,
- 465, 476, 477,
- 478, 467, 466,
- 466, 477, 478,
- 479, 468, 467,
- 467, 478, 479,
- 480, 110, 111,
- 111, 481, 480,
- 482, 112, 110,
- 110, 480, 482,
- 483, 113, 112,
- 112, 482, 483,
- 484, 114, 113,
- 113, 483, 484,
- 485, 115, 114,
- 114, 484, 485,
- 486, 116, 115,
- 115, 485, 486,
- 487, 117, 116,
- 116, 486, 487,
- 488, 118, 117,
- 117, 487, 488,
- 489, 119, 118,
- 118, 488, 489,
- 490, 120, 119,
- 119, 489, 490,
- 491, 480, 481,
- 481, 492, 491,
- 493, 482, 480,
- 480, 491, 493,
- 494, 483, 482,
- 482, 493, 494,
- 495, 484, 483,
- 483, 494, 495,
- 496, 485, 484,
- 484, 495, 496,
- 497, 486, 485,
- 485, 496, 497,
- 498, 487, 486,
- 486, 497, 498,
- 499, 488, 487,
- 487, 498, 499,
- 500, 489, 488,
- 488, 499, 500,
- 501, 490, 489,
- 489, 500, 501,
- 502, 491, 492,
- 492, 503, 502,
- 504, 493, 491,
- 491, 502, 504,
- 505, 494, 493,
- 493, 504, 505,
- 506, 495, 494,
- 494, 505, 506,
- 507, 496, 495,
- 495, 506, 507,
- 508, 497, 496,
- 496, 507, 508,
- 509, 498, 497,
- 497, 508, 509,
- 510, 499, 498,
- 498, 509, 510,
- 511, 500, 499,
- 499, 510, 511,
- 512, 501, 500,
- 500, 511, 512,
- 513, 502, 503,
- 503, 514, 513,
- 515, 504, 502,
- 502, 513, 515,
- 516, 505, 504,
- 504, 515, 516,
- 517, 506, 505,
- 505, 516, 517,
- 518, 507, 506,
- 506, 517, 518,
- 519, 508, 507,
- 507, 518, 519,
- 520, 509, 508,
- 508, 519, 520,
- 521, 510, 509,
- 509, 520, 521,
- 522, 511, 510,
- 510, 521, 522,
- 523, 512, 511,
- 511, 522, 523,
- 524, 513, 514,
- 514, 525, 524,
- 526, 515, 513,
- 513, 524, 526,
- 527, 516, 515,
- 515, 526, 527,
- 528, 517, 516,
- 516, 527, 528,
- 529, 518, 517,
- 517, 528, 529,
- 530, 519, 518,
- 518, 529, 530,
- 531, 520, 519,
- 519, 530, 531,
- 532, 521, 520,
- 520, 531, 532,
- 533, 522, 521,
- 521, 532, 533,
- 534, 523, 522,
- 522, 533, 534,
- 535, 524, 525,
- 525, 536, 535,
- 537, 526, 524,
- 524, 535, 537,
- 538, 527, 526,
- 526, 537, 538,
- 539, 528, 527,
- 527, 538, 539,
- 540, 529, 528,
- 528, 539, 540,
- 541, 530, 529,
- 529, 540, 541,
- 542, 531, 530,
- 530, 541, 542,
- 543, 532, 531,
- 531, 542, 543,
- 544, 533, 532,
- 532, 543, 544,
- 545, 534, 533,
- 533, 544, 545,
- 546, 535, 536,
- 536, 547, 546,
- 548, 537, 535,
- 535, 546, 548,
- 549, 538, 537,
- 537, 548, 549,
- 550, 539, 538,
- 538, 549, 550,
- 551, 540, 539,
- 539, 550, 551,
- 552, 541, 540,
- 540, 551, 552,
- 553, 542, 541,
- 541, 552, 553,
- 554, 543, 542,
- 542, 553, 554,
- 555, 544, 543,
- 543, 554, 555,
- 556, 545, 544,
- 544, 555, 556,
- 557, 546, 547,
- 547, 558, 557,
- 559, 548, 546,
- 546, 557, 559,
- 560, 549, 548,
- 548, 559, 560,
- 561, 550, 549,
- 549, 560, 561,
- 562, 551, 550,
- 550, 561, 562,
- 563, 552, 551,
- 551, 562, 563,
- 564, 553, 552,
- 552, 563, 564,
- 565, 554, 553,
- 553, 564, 565,
- 566, 555, 554,
- 554, 565, 566,
- 567, 556, 555,
- 555, 566, 567,
- 568, 557, 558,
- 558, 569, 568,
- 570, 559, 557,
- 557, 568, 570,
- 571, 560, 559,
- 559, 570, 571,
- 572, 561, 560,
- 560, 571, 572,
- 573, 562, 561,
- 561, 572, 573,
- 574, 563, 562,
- 562, 573, 574,
- 575, 564, 563,
- 563, 574, 575,
- 576, 565, 564,
- 564, 575, 576,
- 577, 566, 565,
- 565, 576, 577,
- 578, 567, 566,
- 566, 577, 578,
- 579, 568, 569,
- 569, 580, 579,
- 581, 570, 568,
- 568, 579, 581,
- 582, 571, 570,
- 570, 581, 582,
- 583, 572, 571,
- 571, 582, 583,
- 584, 573, 572,
- 572, 583, 584,
- 585, 574, 573,
- 573, 584, 585,
- 586, 575, 574,
- 574, 585, 586,
- 587, 576, 575,
- 575, 586, 587,
- 588, 577, 576,
- 576, 587, 588,
- 589, 578, 577,
- 577, 588, 589,
- 590, 230, 231,
- 231, 591, 590,
- 592, 232, 230,
- 230, 590, 592,
- 593, 233, 232,
- 232, 592, 593,
- 594, 234, 233,
- 233, 593, 594,
- 595, 235, 234,
- 234, 594, 595,
- 596, 236, 235,
- 235, 595, 596,
- 597, 237, 236,
- 236, 596, 597,
- 598, 238, 237,
- 237, 597, 598,
- 599, 239, 238,
- 238, 598, 599,
- 600, 240, 239,
- 239, 599, 600,
- 601, 590, 591,
- 591, 602, 601,
- 603, 592, 590,
- 590, 601, 603,
- 604, 593, 592,
- 592, 603, 604,
- 605, 594, 593,
- 593, 604, 605,
- 606, 595, 594,
- 594, 605, 606,
- 607, 596, 595,
- 595, 606, 607,
- 608, 597, 596,
- 596, 607, 608,
- 609, 598, 597,
- 597, 608, 609,
- 610, 599, 598,
- 598, 609, 610,
- 611, 600, 599,
- 599, 610, 611,
- 612, 601, 602,
- 602, 613, 612,
- 614, 603, 601,
- 601, 612, 614,
- 615, 604, 603,
- 603, 614, 615,
- 616, 605, 604,
- 604, 615, 616,
- 617, 606, 605,
- 605, 616, 617,
- 618, 607, 606,
- 606, 617, 618,
- 619, 608, 607,
- 607, 618, 619,
- 620, 609, 608,
- 608, 619, 620,
- 621, 610, 609,
- 609, 620, 621,
- 622, 611, 610,
- 610, 621, 622,
- 623, 612, 613,
- 613, 624, 623,
- 625, 614, 612,
- 612, 623, 625,
- 626, 615, 614,
- 614, 625, 626,
- 627, 616, 615,
- 615, 626, 627,
- 628, 617, 616,
- 616, 627, 628,
- 629, 618, 617,
- 617, 628, 629,
- 630, 619, 618,
- 618, 629, 630,
- 631, 620, 619,
- 619, 630, 631,
- 632, 621, 620,
- 620, 631, 632,
- 633, 622, 621,
- 621, 632, 633,
- 634, 623, 624,
- 624, 635, 634,
- 636, 625, 623,
- 623, 634, 636,
- 637, 626, 625,
- 625, 636, 637,
- 638, 627, 626,
- 626, 637, 638,
- 639, 628, 627,
- 627, 638, 639,
- 640, 629, 628,
- 628, 639, 640,
- 641, 630, 629,
- 629, 640, 641,
- 642, 631, 630,
- 630, 641, 642,
- 643, 632, 631,
- 631, 642, 643,
- 644, 633, 632,
- 632, 643, 644,
- 645, 634, 635,
- 635, 646, 645,
- 647, 636, 634,
- 634, 645, 647,
- 648, 637, 636,
- 636, 647, 648,
- 649, 638, 637,
- 637, 648, 649,
- 650, 639, 638,
- 638, 649, 650,
- 651, 640, 639,
- 639, 650, 651,
- 652, 641, 640,
- 640, 651, 652,
- 653, 642, 641,
- 641, 652, 653,
- 654, 643, 642,
- 642, 653, 654,
- 655, 644, 643,
- 643, 654, 655,
- 656, 645, 646,
- 646, 657, 656,
- 658, 647, 645,
- 645, 656, 658,
- 659, 648, 647,
- 647, 658, 659,
- 660, 649, 648,
- 648, 659, 660,
- 661, 650, 649,
- 649, 660, 661,
- 662, 651, 650,
- 650, 661, 662,
- 663, 652, 651,
- 651, 662, 663,
- 664, 653, 652,
- 652, 663, 664,
- 665, 654, 653,
- 653, 664, 665,
- 666, 655, 654,
- 654, 665, 666,
- 667, 656, 657,
- 657, 668, 667,
- 669, 658, 656,
- 656, 667, 669,
- 670, 659, 658,
- 658, 669, 670,
- 671, 660, 659,
- 659, 670, 671,
- 672, 661, 660,
- 660, 671, 672,
- 673, 662, 661,
- 661, 672, 673,
- 674, 663, 662,
- 662, 673, 674,
- 675, 664, 663,
- 663, 674, 675,
- 676, 665, 664,
- 664, 675, 676,
- 677, 666, 665,
- 665, 676, 677,
- 678, 667, 668,
- 668, 679, 678,
- 680, 669, 667,
- 667, 678, 680,
- 681, 670, 669,
- 669, 680, 681,
- 682, 671, 670,
- 670, 681, 682,
- 683, 672, 671,
- 671, 682, 683,
- 684, 673, 672,
- 672, 683, 684,
- 685, 674, 673,
- 673, 684, 685,
- 686, 675, 674,
- 674, 685, 686,
- 687, 676, 675,
- 675, 686, 687,
- 688, 677, 676,
- 676, 687, 688,
- 689, 678, 679,
- 679, 690, 689,
- 691, 680, 678,
- 678, 689, 691,
- 692, 681, 680,
- 680, 691, 692,
- 693, 682, 681,
- 681, 692, 693,
- 694, 683, 682,
- 682, 693, 694,
- 695, 684, 683,
- 683, 694, 695,
- 696, 685, 684,
- 684, 695, 696,
- 697, 686, 685,
- 685, 696, 697,
- 698, 687, 686,
- 686, 697, 698,
- 699, 688, 687,
- 687, 698, 699,
- 700, 350, 351,
- 351, 701, 700,
- 702, 352, 350,
- 350, 700, 702,
- 703, 353, 352,
- 352, 702, 703,
- 704, 354, 353,
- 353, 703, 704,
- 705, 355, 354,
- 354, 704, 705,
- 706, 356, 355,
- 355, 705, 706,
- 707, 357, 356,
- 356, 706, 707,
- 708, 358, 357,
- 357, 707, 708,
- 709, 359, 358,
- 358, 708, 709,
- 710, 360, 359,
- 359, 709, 710,
- 711, 700, 701,
- 701, 712, 711,
- 713, 702, 700,
- 700, 711, 713,
- 714, 703, 702,
- 702, 713, 714,
- 715, 704, 703,
- 703, 714, 715,
- 716, 705, 704,
- 704, 715, 716,
- 717, 706, 705,
- 705, 716, 717,
- 718, 707, 706,
- 706, 717, 718,
- 719, 708, 707,
- 707, 718, 719,
- 720, 709, 708,
- 708, 719, 720,
- 721, 710, 709,
- 709, 720, 721,
- 722, 711, 712,
- 712, 723, 722,
- 724, 713, 711,
- 711, 722, 724,
- 725, 714, 713,
- 713, 724, 725,
- 726, 715, 714,
- 714, 725, 726,
- 727, 716, 715,
- 715, 726, 727,
- 728, 717, 716,
- 716, 727, 728,
- 729, 718, 717,
- 717, 728, 729,
- 730, 719, 718,
- 718, 729, 730,
- 731, 720, 719,
- 719, 730, 731,
- 732, 721, 720,
- 720, 731, 732,
- 733, 722, 723,
- 723, 734, 733,
- 735, 724, 722,
- 722, 733, 735,
- 736, 725, 724,
- 724, 735, 736,
- 737, 726, 725,
- 725, 736, 737,
- 738, 727, 726,
- 726, 737, 738,
- 739, 728, 727,
- 727, 738, 739,
- 740, 729, 728,
- 728, 739, 740,
- 741, 730, 729,
- 729, 740, 741,
- 742, 731, 730,
- 730, 741, 742,
- 743, 732, 731,
- 731, 742, 743,
- 744, 733, 734,
- 734, 745, 744,
- 746, 735, 733,
- 733, 744, 746,
- 747, 736, 735,
- 735, 746, 747,
- 748, 737, 736,
- 736, 747, 748,
- 749, 738, 737,
- 737, 748, 749,
- 750, 739, 738,
- 738, 749, 750,
- 751, 740, 739,
- 739, 750, 751,
- 752, 741, 740,
- 740, 751, 752,
- 753, 742, 741,
- 741, 752, 753,
- 754, 743, 742,
- 742, 753, 754,
- 755, 744, 745,
- 745, 756, 755,
- 757, 746, 744,
- 744, 755, 757,
- 758, 747, 746,
- 746, 757, 758,
- 759, 748, 747,
- 747, 758, 759,
- 760, 749, 748,
- 748, 759, 760,
- 761, 750, 749,
- 749, 760, 761,
- 762, 751, 750,
- 750, 761, 762,
- 763, 752, 751,
- 751, 762, 763,
- 764, 753, 752,
- 752, 763, 764,
- 765, 754, 753,
- 753, 764, 765,
- 766, 755, 756,
- 756, 767, 766,
- 768, 757, 755,
- 755, 766, 768,
- 769, 758, 757,
- 757, 768, 769,
- 770, 759, 758,
- 758, 769, 770,
- 771, 760, 759,
- 759, 770, 771,
- 772, 761, 760,
- 760, 771, 772,
- 773, 762, 761,
- 761, 772, 773,
- 774, 763, 762,
- 762, 773, 774,
- 775, 764, 763,
- 763, 774, 775,
- 776, 765, 764,
- 764, 775, 776,
- 777, 766, 767,
- 767, 778, 777,
- 779, 768, 766,
- 766, 777, 779,
- 780, 769, 768,
- 768, 779, 780,
- 781, 770, 769,
- 769, 780, 781,
- 782, 771, 770,
- 770, 781, 782,
- 783, 772, 771,
- 771, 782, 783,
- 784, 773, 772,
- 772, 783, 784,
- 785, 774, 773,
- 773, 784, 785,
- 786, 775, 774,
- 774, 785, 786,
- 787, 776, 775,
- 775, 786, 787,
- 788, 777, 778,
- 778, 789, 788,
- 790, 779, 777,
- 777, 788, 790,
- 791, 780, 779,
- 779, 790, 791,
- 792, 781, 780,
- 780, 791, 792,
- 793, 782, 781,
- 781, 792, 793,
- 794, 783, 782,
- 782, 793, 794,
- 795, 784, 783,
- 783, 794, 795,
- 796, 785, 784,
- 784, 795, 796,
- 797, 786, 785,
- 785, 796, 797,
- 798, 787, 786,
- 786, 797, 798,
- 799, 788, 789,
- 789, 800, 799,
- 801, 790, 788,
- 788, 799, 801,
- 802, 791, 790,
- 790, 801, 802,
- 803, 792, 791,
- 791, 802, 803,
- 804, 793, 792,
- 792, 803, 804,
- 805, 794, 793,
- 793, 804, 805,
- 806, 795, 794,
- 794, 805, 806,
- 807, 796, 795,
- 795, 806, 807,
- 808, 797, 796,
- 796, 807, 808,
- 809, 798, 797,
- 797, 808, 809,
- 810, 469, 470,
- 470, 811, 810,
- 812, 471, 469,
- 469, 810, 812,
- 813, 472, 471,
- 471, 812, 813,
- 814, 473, 472,
- 472, 813, 814,
- 815, 474, 473,
- 473, 814, 815,
- 816, 475, 474,
- 474, 815, 816,
- 817, 476, 475,
- 475, 816, 817,
- 818, 477, 476,
- 476, 817, 818,
- 819, 478, 477,
- 477, 818, 819,
- 820, 479, 478,
- 478, 819, 820,
- 821, 810, 811,
- 811, 822, 821,
- 823, 812, 810,
- 810, 821, 823,
- 824, 813, 812,
- 812, 823, 824,
- 825, 814, 813,
- 813, 824, 825,
- 826, 815, 814,
- 814, 825, 826,
- 827, 816, 815,
- 815, 826, 827,
- 828, 817, 816,
- 816, 827, 828,
- 829, 818, 817,
- 817, 828, 829,
- 830, 819, 818,
- 818, 829, 830,
- 831, 820, 819,
- 819, 830, 831,
- 832, 821, 822,
- 822, 833, 832,
- 834, 823, 821,
- 821, 832, 834,
- 835, 824, 823,
- 823, 834, 835,
- 836, 825, 824,
- 824, 835, 836,
- 837, 826, 825,
- 825, 836, 837,
- 838, 827, 826,
- 826, 837, 838,
- 839, 828, 827,
- 827, 838, 839,
- 840, 829, 828,
- 828, 839, 840,
- 841, 830, 829,
- 829, 840, 841,
- 842, 831, 830,
- 830, 841, 842,
- 843, 832, 833,
- 833, 844, 843,
- 845, 834, 832,
- 832, 843, 845,
- 846, 835, 834,
- 834, 845, 846,
- 847, 836, 835,
- 835, 846, 847,
- 848, 837, 836,
- 836, 847, 848,
- 849, 838, 837,
- 837, 848, 849,
- 850, 839, 838,
- 838, 849, 850,
- 851, 840, 839,
- 839, 850, 851,
- 852, 841, 840,
- 840, 851, 852,
- 853, 842, 841,
- 841, 852, 853,
- 854, 843, 844,
- 844, 855, 854,
- 856, 845, 843,
- 843, 854, 856,
- 857, 846, 845,
- 845, 856, 857,
- 858, 847, 846,
- 846, 857, 858,
- 859, 848, 847,
- 847, 858, 859,
- 860, 849, 848,
- 848, 859, 860,
- 861, 850, 849,
- 849, 860, 861,
- 862, 851, 850,
- 850, 861, 862,
- 863, 852, 851,
- 851, 862, 863,
- 864, 853, 852,
- 852, 863, 864,
- 865, 854, 855,
- 855, 866, 865,
- 867, 856, 854,
- 854, 865, 867,
- 868, 857, 856,
- 856, 867, 868,
- 869, 858, 857,
- 857, 868, 869,
- 870, 859, 858,
- 858, 869, 870,
- 871, 860, 859,
- 859, 870, 871,
- 872, 861, 860,
- 860, 871, 872,
- 873, 862, 861,
- 861, 872, 873,
- 874, 863, 862,
- 862, 873, 874,
- 875, 864, 863,
- 863, 874, 875,
- 876, 865, 866,
- 866, 877, 876,
- 878, 867, 865,
- 865, 876, 878,
- 879, 868, 867,
- 867, 878, 879,
- 880, 869, 868,
- 868, 879, 880,
- 881, 870, 869,
- 869, 880, 881,
- 882, 871, 870,
- 870, 881, 882,
- 883, 872, 871,
- 871, 882, 883,
- 884, 873, 872,
- 872, 883, 884,
- 885, 874, 873,
- 873, 884, 885,
- 886, 875, 874,
- 874, 885, 886,
- 887, 876, 877,
- 877, 888, 887,
- 889, 878, 876,
- 876, 887, 889,
- 890, 879, 878,
- 878, 889, 890,
- 891, 880, 879,
- 879, 890, 891,
- 892, 881, 880,
- 880, 891, 892,
- 893, 882, 881,
- 881, 892, 893,
- 894, 883, 882,
- 882, 893, 894,
- 895, 884, 883,
- 883, 894, 895,
- 896, 885, 884,
- 884, 895, 896,
- 897, 886, 885,
- 885, 896, 897,
- 898, 887, 888,
- 888, 899, 898,
- 900, 889, 887,
- 887, 898, 900,
- 901, 890, 889,
- 889, 900, 901,
- 902, 891, 890,
- 890, 901, 902,
- 903, 892, 891,
- 891, 902, 903,
- 904, 893, 892,
- 892, 903, 904,
- 905, 894, 893,
- 893, 904, 905,
- 906, 895, 894,
- 894, 905, 906,
- 907, 896, 895,
- 895, 906, 907,
- 908, 897, 896,
- 896, 907, 908,
- 909, 898, 899,
- 899, 910, 909,
- 911, 900, 898,
- 898, 909, 911,
- 912, 901, 900,
- 900, 911, 912,
- 913, 902, 901,
- 901, 912, 913,
- 914, 903, 902,
- 902, 913, 914,
- 915, 904, 903,
- 903, 914, 915,
- 916, 905, 904,
- 904, 915, 916,
- 917, 906, 905,
- 905, 916, 917,
- 918, 907, 906,
- 906, 917, 918,
- 919, 908, 907,
- 907, 918, 919,
- 920, 579, 580,
- 580, 921, 920,
- 922, 923, 579,
- 579, 920, 922,
- 924, 925, 923,
- 923, 922, 924,
- 926, 927, 925,
- 925, 924, 926,
- 928, 929, 927,
- 927, 926, 928,
- 930, 931, 929,
- 929, 928, 930,
- 932, 933, 931,
- 931, 930, 932,
- 934, 935, 933,
- 933, 932, 934,
- 936, 937, 935,
- 935, 934, 936,
- 938, 690, 937,
- 937, 936, 938,
- 939, 920, 921,
- 921, 940, 939,
- 941, 922, 920,
- 920, 939, 941,
- 942, 924, 922,
- 922, 941, 942,
- 943, 926, 924,
- 924, 942, 943,
- 944, 928, 926,
- 926, 943, 944,
- 945, 930, 928,
- 928, 944, 945,
- 946, 932, 930,
- 930, 945, 946,
- 947, 934, 932,
- 932, 946, 947,
- 948, 936, 934,
- 934, 947, 948,
- 949, 938, 936,
- 936, 948, 949,
- 950, 939, 940,
- 940, 951, 950,
- 952, 941, 939,
- 939, 950, 952,
- 953, 942, 941,
- 941, 952, 953,
- 954, 943, 942,
- 942, 953, 954,
- 955, 944, 943,
- 943, 954, 955,
- 956, 945, 944,
- 944, 955, 956,
- 957, 946, 945,
- 945, 956, 957,
- 958, 947, 946,
- 946, 957, 958,
- 959, 948, 947,
- 947, 958, 959,
- 960, 949, 948,
- 948, 959, 960,
- 961, 950, 951,
- 951, 962, 961,
- 963, 952, 950,
- 950, 961, 963,
- 964, 953, 952,
- 952, 963, 964,
- 965, 954, 953,
- 953, 964, 965,
- 966, 955, 954,
- 954, 965, 966,
- 967, 956, 955,
- 955, 966, 967,
- 968, 957, 956,
- 956, 967, 968,
- 969, 958, 957,
- 957, 968, 969,
- 970, 959, 958,
- 958, 969, 970,
- 971, 960, 959,
- 959, 970, 971,
- 972, 961, 962,
- 962, 973, 972,
- 974, 963, 961,
- 961, 972, 974,
- 975, 964, 963,
- 963, 974, 975,
- 976, 965, 964,
- 964, 975, 976,
- 977, 966, 965,
- 965, 976, 977,
- 978, 967, 966,
- 966, 977, 978,
- 979, 968, 967,
- 967, 978, 979,
- 980, 969, 968,
- 968, 979, 980,
- 981, 970, 969,
- 969, 980, 981,
- 982, 971, 970,
- 970, 981, 982,
- 983, 972, 973,
- 973, 984, 983,
- 985, 974, 972,
- 972, 983, 985,
- 986, 975, 974,
- 974, 985, 986,
- 987, 976, 975,
- 975, 986, 987,
- 988, 977, 976,
- 976, 987, 988,
- 989, 978, 977,
- 977, 988, 989,
- 990, 979, 978,
- 978, 989, 990,
- 991, 980, 979,
- 979, 990, 991,
- 992, 981, 980,
- 980, 991, 992,
- 993, 982, 981,
- 981, 992, 993,
- 994, 983, 984,
- 984, 995, 994,
- 996, 985, 983,
- 983, 994, 996,
- 997, 986, 985,
- 985, 996, 997,
- 998, 987, 986,
- 986, 997, 998,
- 999, 988, 987,
- 987, 998, 999,
- 1000, 989, 988,
- 988, 999, 1000,
- 1001, 990, 989,
- 989, 1000, 1001,
- 1002, 991, 990,
- 990, 1001, 1002,
- 1003, 992, 991,
- 991, 1002, 1003,
- 1004, 993, 992,
- 992, 1003, 1004,
- 1005, 994, 995,
- 995, 1006, 1005,
- 1007, 996, 994,
- 994, 1005, 1007,
- 1008, 997, 996,
- 996, 1007, 1008,
- 1009, 998, 997,
- 997, 1008, 1009,
- 1010, 999, 998,
- 998, 1009, 1010,
- 1011, 1000, 999,
- 999, 1010, 1011,
- 1012, 1001, 1000,
- 1000, 1011, 1012,
- 1013, 1002, 1001,
- 1001, 1012, 1013,
- 1014, 1003, 1002,
- 1002, 1013, 1014,
- 1015, 1004, 1003,
- 1003, 1014, 1015,
- 1016, 1005, 1006,
- 1006, 1017, 1016,
- 1018, 1007, 1005,
- 1005, 1016, 1018,
- 1019, 1008, 1007,
- 1007, 1018, 1019,
- 1020, 1009, 1008,
- 1008, 1019, 1020,
- 1021, 1010, 1009,
- 1009, 1020, 1021,
- 1022, 1011, 1010,
- 1010, 1021, 1022,
- 1023, 1012, 1011,
- 1011, 1022, 1023,
- 1024, 1013, 1012,
- 1012, 1023, 1024,
- 1025, 1014, 1013,
- 1013, 1024, 1025,
- 1026, 1015, 1014,
- 1014, 1025, 1026,
- 1027, 1016, 1017,
- 1017, 1028, 1027,
- 1029, 1018, 1016,
- 1016, 1027, 1029,
- 1030, 1019, 1018,
- 1018, 1029, 1030,
- 1031, 1020, 1019,
- 1019, 1030, 1031,
- 1032, 1021, 1020,
- 1020, 1031, 1032,
- 1033, 1022, 1021,
- 1021, 1032, 1033,
- 1034, 1023, 1022,
- 1022, 1033, 1034,
- 1035, 1024, 1023,
- 1023, 1034, 1035,
- 1036, 1025, 1024,
- 1024, 1035, 1036,
- 1037, 1026, 1025,
- 1025, 1036, 1037,
- 1038, 689, 690,
- 690, 1039, 1038,
- 1040, 1041, 689,
- 689, 1038, 1040,
- 1042, 1043, 1041,
- 1041, 1040, 1042,
- 1044, 1045, 1043,
- 1043, 1042, 1044,
- 1046, 1047, 1045,
- 1045, 1044, 1046,
- 1048, 1049, 1047,
- 1047, 1046, 1048,
- 1050, 1051, 1049,
- 1049, 1048, 1050,
- 1052, 1053, 1051,
- 1051, 1050, 1052,
- 1054, 1055, 1053,
- 1053, 1052, 1054,
- 1056, 800, 1055,
- 1055, 1054, 1056,
- 1057, 1038, 1039,
- 1039, 1058, 1057,
- 1059, 1040, 1038,
- 1038, 1057, 1059,
- 1060, 1042, 1040,
- 1040, 1059, 1060,
- 1061, 1044, 1042,
- 1042, 1060, 1061,
- 1062, 1046, 1044,
- 1044, 1061, 1062,
- 1063, 1048, 1046,
- 1046, 1062, 1063,
- 1064, 1050, 1048,
- 1048, 1063, 1064,
- 1065, 1052, 1050,
- 1050, 1064, 1065,
- 1066, 1054, 1052,
- 1052, 1065, 1066,
- 1067, 1056, 1054,
- 1054, 1066, 1067,
- 1068, 1057, 1058,
- 1058, 1069, 1068,
- 1070, 1059, 1057,
- 1057, 1068, 1070,
- 1071, 1060, 1059,
- 1059, 1070, 1071,
- 1072, 1061, 1060,
- 1060, 1071, 1072,
- 1073, 1062, 1061,
- 1061, 1072, 1073,
- 1074, 1063, 1062,
- 1062, 1073, 1074,
- 1075, 1064, 1063,
- 1063, 1074, 1075,
- 1076, 1065, 1064,
- 1064, 1075, 1076,
- 1077, 1066, 1065,
- 1065, 1076, 1077,
- 1078, 1067, 1066,
- 1066, 1077, 1078,
- 1079, 1068, 1069,
- 1069, 1080, 1079,
- 1081, 1070, 1068,
- 1068, 1079, 1081,
- 1082, 1071, 1070,
- 1070, 1081, 1082,
- 1083, 1072, 1071,
- 1071, 1082, 1083,
- 1084, 1073, 1072,
- 1072, 1083, 1084,
- 1085, 1074, 1073,
- 1073, 1084, 1085,
- 1086, 1075, 1074,
- 1074, 1085, 1086,
- 1087, 1076, 1075,
- 1075, 1086, 1087,
- 1088, 1077, 1076,
- 1076, 1087, 1088,
- 1089, 1078, 1077,
- 1077, 1088, 1089,
- 1090, 1079, 1080,
- 1080, 1091, 1090,
- 1092, 1081, 1079,
- 1079, 1090, 1092,
- 1093, 1082, 1081,
- 1081, 1092, 1093,
- 1094, 1083, 1082,
- 1082, 1093, 1094,
- 1095, 1084, 1083,
- 1083, 1094, 1095,
- 1096, 1085, 1084,
- 1084, 1095, 1096,
- 1097, 1086, 1085,
- 1085, 1096, 1097,
- 1098, 1087, 1086,
- 1086, 1097, 1098,
- 1099, 1088, 1087,
- 1087, 1098, 1099,
- 1100, 1089, 1088,
- 1088, 1099, 1100,
- 1101, 1090, 1091,
- 1091, 1102, 1101,
- 1103, 1092, 1090,
- 1090, 1101, 1103,
- 1104, 1093, 1092,
- 1092, 1103, 1104,
- 1105, 1094, 1093,
- 1093, 1104, 1105,
- 1106, 1095, 1094,
- 1094, 1105, 1106,
- 1107, 1096, 1095,
- 1095, 1106, 1107,
- 1108, 1097, 1096,
- 1096, 1107, 1108,
- 1109, 1098, 1097,
- 1097, 1108, 1109,
- 1110, 1099, 1098,
- 1098, 1109, 1110,
- 1111, 1100, 1099,
- 1099, 1110, 1111,
- 1112, 1101, 1102,
- 1102, 1113, 1112,
- 1114, 1103, 1101,
- 1101, 1112, 1114,
- 1115, 1104, 1103,
- 1103, 1114, 1115,
- 1116, 1105, 1104,
- 1104, 1115, 1116,
- 1117, 1106, 1105,
- 1105, 1116, 1117,
- 1118, 1107, 1106,
- 1106, 1117, 1118,
- 1119, 1108, 1107,
- 1107, 1118, 1119,
- 1120, 1109, 1108,
- 1108, 1119, 1120,
- 1121, 1110, 1109,
- 1109, 1120, 1121,
- 1122, 1111, 1110,
- 1110, 1121, 1122,
- 1123, 1112, 1113,
- 1113, 1124, 1123,
- 1125, 1114, 1112,
- 1112, 1123, 1125,
- 1126, 1115, 1114,
- 1114, 1125, 1126,
- 1127, 1116, 1115,
- 1115, 1126, 1127,
- 1128, 1117, 1116,
- 1116, 1127, 1128,
- 1129, 1118, 1117,
- 1117, 1128, 1129,
- 1130, 1119, 1118,
- 1118, 1129, 1130,
- 1131, 1120, 1119,
- 1119, 1130, 1131,
- 1132, 1121, 1120,
- 1120, 1131, 1132,
- 1133, 1122, 1121,
- 1121, 1132, 1133,
- 1134, 1123, 1124,
- 1124, 1135, 1134,
- 1136, 1125, 1123,
- 1123, 1134, 1136,
- 1137, 1126, 1125,
- 1125, 1136, 1137,
- 1138, 1127, 1126,
- 1126, 1137, 1138,
- 1139, 1128, 1127,
- 1127, 1138, 1139,
- 1140, 1129, 1128,
- 1128, 1139, 1140,
- 1141, 1130, 1129,
- 1129, 1140, 1141,
- 1142, 1131, 1130,
- 1130, 1141, 1142,
- 1143, 1132, 1131,
- 1131, 1142, 1143,
- 1144, 1133, 1132,
- 1132, 1143, 1144,
- 1145, 1134, 1135,
- 1135, 1146, 1145,
- 1147, 1136, 1134,
- 1134, 1145, 1147,
- 1148, 1137, 1136,
- 1136, 1147, 1148,
- 1149, 1138, 1137,
- 1137, 1148, 1149,
- 1150, 1139, 1138,
- 1138, 1149, 1150,
- 1151, 1140, 1139,
- 1139, 1150, 1151,
- 1152, 1141, 1140,
- 1140, 1151, 1152,
- 1153, 1142, 1141,
- 1141, 1152, 1153,
- 1154, 1143, 1142,
- 1142, 1153, 1154,
- 1155, 1144, 1143,
- 1143, 1154, 1155,
- 1156, 799, 800,
- 800, 1157, 1156,
- 1158, 1159, 799,
- 799, 1156, 1158,
- 1160, 1161, 1159,
- 1159, 1158, 1160,
- 1162, 1163, 1161,
- 1161, 1160, 1162,
- 1164, 1165, 1163,
- 1163, 1162, 1164,
- 1166, 1167, 1165,
- 1165, 1164, 1166,
- 1168, 1169, 1167,
- 1167, 1166, 1168,
- 1170, 1171, 1169,
- 1169, 1168, 1170,
- 1172, 1173, 1171,
- 1171, 1170, 1172,
- 1174, 910, 1173,
- 1173, 1172, 1174,
- 1175, 1156, 1157,
- 1157, 1176, 1175,
- 1177, 1158, 1156,
- 1156, 1175, 1177,
- 1178, 1160, 1158,
- 1158, 1177, 1178,
- 1179, 1162, 1160,
- 1160, 1178, 1179,
- 1180, 1164, 1162,
- 1162, 1179, 1180,
- 1181, 1166, 1164,
- 1164, 1180, 1181,
- 1182, 1168, 1166,
- 1166, 1181, 1182,
- 1183, 1170, 1168,
- 1168, 1182, 1183,
- 1184, 1172, 1170,
- 1170, 1183, 1184,
- 1185, 1174, 1172,
- 1172, 1184, 1185,
- 1186, 1175, 1176,
- 1176, 1187, 1186,
- 1188, 1177, 1175,
- 1175, 1186, 1188,
- 1189, 1178, 1177,
- 1177, 1188, 1189,
- 1190, 1179, 1178,
- 1178, 1189, 1190,
- 1191, 1180, 1179,
- 1179, 1190, 1191,
- 1192, 1181, 1180,
- 1180, 1191, 1192,
- 1193, 1182, 1181,
- 1181, 1192, 1193,
- 1194, 1183, 1182,
- 1182, 1193, 1194,
- 1195, 1184, 1183,
- 1183, 1194, 1195,
- 1196, 1185, 1184,
- 1184, 1195, 1196,
- 1197, 1186, 1187,
- 1187, 1198, 1197,
- 1199, 1188, 1186,
- 1186, 1197, 1199,
- 1200, 1189, 1188,
- 1188, 1199, 1200,
- 1201, 1190, 1189,
- 1189, 1200, 1201,
- 1202, 1191, 1190,
- 1190, 1201, 1202,
- 1203, 1192, 1191,
- 1191, 1202, 1203,
- 1204, 1193, 1192,
- 1192, 1203, 1204,
- 1205, 1194, 1193,
- 1193, 1204, 1205,
- 1206, 1195, 1194,
- 1194, 1205, 1206,
- 1207, 1196, 1195,
- 1195, 1206, 1207,
- 1208, 1197, 1198,
- 1198, 1209, 1208,
- 1210, 1199, 1197,
- 1197, 1208, 1210,
- 1211, 1200, 1199,
- 1199, 1210, 1211,
- 1212, 1201, 1200,
- 1200, 1211, 1212,
- 1213, 1202, 1201,
- 1201, 1212, 1213,
- 1214, 1203, 1202,
- 1202, 1213, 1214,
- 1215, 1204, 1203,
- 1203, 1214, 1215,
- 1216, 1205, 1204,
- 1204, 1215, 1216,
- 1217, 1206, 1205,
- 1205, 1216, 1217,
- 1218, 1207, 1206,
- 1206, 1217, 1218,
- 1219, 1208, 1209,
- 1209, 1220, 1219,
- 1221, 1210, 1208,
- 1208, 1219, 1221,
- 1222, 1211, 1210,
- 1210, 1221, 1222,
- 1223, 1212, 1211,
- 1211, 1222, 1223,
- 1224, 1213, 1212,
- 1212, 1223, 1224,
- 1225, 1214, 1213,
- 1213, 1224, 1225,
- 1226, 1215, 1214,
- 1214, 1225, 1226,
- 1227, 1216, 1215,
- 1215, 1226, 1227,
- 1228, 1217, 1216,
- 1216, 1227, 1228,
- 1229, 1218, 1217,
- 1217, 1228, 1229,
- 1230, 1219, 1220,
- 1220, 1231, 1230,
- 1232, 1221, 1219,
- 1219, 1230, 1232,
- 1233, 1222, 1221,
- 1221, 1232, 1233,
- 1234, 1223, 1222,
- 1222, 1233, 1234,
- 1235, 1224, 1223,
- 1223, 1234, 1235,
- 1236, 1225, 1224,
- 1224, 1235, 1236,
- 1237, 1226, 1225,
- 1225, 1236, 1237,
- 1238, 1227, 1226,
- 1226, 1237, 1238,
- 1239, 1228, 1227,
- 1227, 1238, 1239,
- 1240, 1229, 1228,
- 1228, 1239, 1240,
- 1241, 1230, 1231,
- 1231, 1242, 1241,
- 1243, 1232, 1230,
- 1230, 1241, 1243,
- 1244, 1233, 1232,
- 1232, 1243, 1244,
- 1245, 1234, 1233,
- 1233, 1244, 1245,
- 1246, 1235, 1234,
- 1234, 1245, 1246,
- 1247, 1236, 1235,
- 1235, 1246, 1247,
- 1248, 1237, 1236,
- 1236, 1247, 1248,
- 1249, 1238, 1237,
- 1237, 1248, 1249,
- 1250, 1239, 1238,
- 1238, 1249, 1250,
- 1251, 1240, 1239,
- 1239, 1250, 1251,
- 1252, 1241, 1242,
- 1242, 1253, 1252,
- 1254, 1243, 1241,
- 1241, 1252, 1254,
- 1255, 1244, 1243,
- 1243, 1254, 1255,
- 1256, 1245, 1244,
- 1244, 1255, 1256,
- 1257, 1246, 1245,
- 1245, 1256, 1257,
- 1258, 1247, 1246,
- 1246, 1257, 1258,
- 1259, 1248, 1247,
- 1247, 1258, 1259,
- 1260, 1249, 1248,
- 1248, 1259, 1260,
- 1261, 1250, 1249,
- 1249, 1260, 1261,
- 1262, 1251, 1250,
- 1250, 1261, 1262,
- 1263, 1252, 1253,
- 1253, 1264, 1263,
- 1265, 1254, 1252,
- 1252, 1263, 1265,
- 1266, 1255, 1254,
- 1254, 1265, 1266,
- 1267, 1256, 1255,
- 1255, 1266, 1267,
- 1268, 1257, 1256,
- 1256, 1267, 1268,
- 1269, 1258, 1257,
- 1257, 1268, 1269,
- 1270, 1259, 1258,
- 1258, 1269, 1270,
- 1271, 1260, 1259,
- 1259, 1270, 1271,
- 1272, 1261, 1260,
- 1260, 1271, 1272,
- 1273, 1262, 1261,
- 1261, 1272, 1273,
- 1274, 909, 910,
- 910, 1275, 1274,
- 1276, 1277, 909,
- 909, 1274, 1276,
- 1278, 1279, 1277,
- 1277, 1276, 1278,
- 1280, 1281, 1279,
- 1279, 1278, 1280,
- 1282, 1283, 1281,
- 1281, 1280, 1282,
- 1284, 1285, 1283,
- 1283, 1282, 1284,
- 1286, 1287, 1285,
- 1285, 1284, 1286,
- 1288, 1289, 1287,
- 1287, 1286, 1288,
- 1290, 1291, 1289,
- 1289, 1288, 1290,
- 1292, 580, 1291,
- 1291, 1290, 1292,
- 1293, 1274, 1275,
- 1275, 1294, 1293,
- 1295, 1276, 1274,
- 1274, 1293, 1295,
- 1296, 1278, 1276,
- 1276, 1295, 1296,
- 1297, 1280, 1278,
- 1278, 1296, 1297,
- 1298, 1282, 1280,
- 1280, 1297, 1298,
- 1299, 1284, 1282,
- 1282, 1298, 1299,
- 1300, 1286, 1284,
- 1284, 1299, 1300,
- 1301, 1288, 1286,
- 1286, 1300, 1301,
- 1302, 1290, 1288,
- 1288, 1301, 1302,
- 1303, 1292, 1290,
- 1290, 1302, 1303,
- 1304, 1293, 1294,
- 1294, 1305, 1304,
- 1306, 1295, 1293,
- 1293, 1304, 1306,
- 1307, 1296, 1295,
- 1295, 1306, 1307,
- 1308, 1297, 1296,
- 1296, 1307, 1308,
- 1309, 1298, 1297,
- 1297, 1308, 1309,
- 1310, 1299, 1298,
- 1298, 1309, 1310,
- 1311, 1300, 1299,
- 1299, 1310, 1311,
- 1312, 1301, 1300,
- 1300, 1311, 1312,
- 1313, 1302, 1301,
- 1301, 1312, 1313,
- 1314, 1303, 1302,
- 1302, 1313, 1314,
- 1315, 1304, 1305,
- 1305, 1316, 1315,
- 1317, 1306, 1304,
- 1304, 1315, 1317,
- 1318, 1307, 1306,
- 1306, 1317, 1318,
- 1319, 1308, 1307,
- 1307, 1318, 1319,
- 1320, 1309, 1308,
- 1308, 1319, 1320,
- 1321, 1310, 1309,
- 1309, 1320, 1321,
- 1322, 1311, 1310,
- 1310, 1321, 1322,
- 1323, 1312, 1311,
- 1311, 1322, 1323,
- 1324, 1313, 1312,
- 1312, 1323, 1324,
- 1325, 1314, 1313,
- 1313, 1324, 1325,
- 1326, 1315, 1316,
- 1316, 1327, 1326,
- 1328, 1317, 1315,
- 1315, 1326, 1328,
- 1329, 1318, 1317,
- 1317, 1328, 1329,
- 1330, 1319, 1318,
- 1318, 1329, 1330,
- 1331, 1320, 1319,
- 1319, 1330, 1331,
- 1332, 1321, 1320,
- 1320, 1331, 1332,
- 1333, 1322, 1321,
- 1321, 1332, 1333,
- 1334, 1323, 1322,
- 1322, 1333, 1334,
- 1335, 1324, 1323,
- 1323, 1334, 1335,
- 1336, 1325, 1324,
- 1324, 1335, 1336,
- 1337, 1326, 1327,
- 1327, 1338, 1337,
- 1339, 1328, 1326,
- 1326, 1337, 1339,
- 1340, 1329, 1328,
- 1328, 1339, 1340,
- 1341, 1330, 1329,
- 1329, 1340, 1341,
- 1342, 1331, 1330,
- 1330, 1341, 1342,
- 1343, 1332, 1331,
- 1331, 1342, 1343,
- 1344, 1333, 1332,
- 1332, 1343, 1344,
- 1345, 1334, 1333,
- 1333, 1344, 1345,
- 1346, 1335, 1334,
- 1334, 1345, 1346,
- 1347, 1336, 1335,
- 1335, 1346, 1347,
- 1348, 1337, 1338,
- 1338, 1349, 1348,
- 1350, 1339, 1337,
- 1337, 1348, 1350,
- 1351, 1340, 1339,
- 1339, 1350, 1351,
- 1352, 1341, 1340,
- 1340, 1351, 1352,
- 1353, 1342, 1341,
- 1341, 1352, 1353,
- 1354, 1343, 1342,
- 1342, 1353, 1354,
- 1355, 1344, 1343,
- 1343, 1354, 1355,
- 1356, 1345, 1344,
- 1344, 1355, 1356,
- 1357, 1346, 1345,
- 1345, 1356, 1357,
- 1358, 1347, 1346,
- 1346, 1357, 1358,
- 1359, 1348, 1349,
- 1349, 1360, 1359,
- 1361, 1350, 1348,
- 1348, 1359, 1361,
- 1362, 1351, 1350,
- 1350, 1361, 1362,
- 1363, 1352, 1351,
- 1351, 1362, 1363,
- 1364, 1353, 1352,
- 1352, 1363, 1364,
- 1365, 1354, 1353,
- 1353, 1364, 1365,
- 1366, 1355, 1354,
- 1354, 1365, 1366,
- 1367, 1356, 1355,
- 1355, 1366, 1367,
- 1368, 1357, 1356,
- 1356, 1367, 1368,
- 1369, 1358, 1357,
- 1357, 1368, 1369,
- 1370, 1359, 1360,
- 1360, 1371, 1370,
- 1372, 1361, 1359,
- 1359, 1370, 1372,
- 1373, 1362, 1361,
- 1361, 1372, 1373,
- 1374, 1363, 1362,
- 1362, 1373, 1374,
- 1375, 1364, 1363,
- 1363, 1374, 1375,
- 1376, 1365, 1364,
- 1364, 1375, 1376,
- 1377, 1366, 1365,
- 1365, 1376, 1377,
- 1378, 1367, 1366,
- 1366, 1377, 1378,
- 1379, 1368, 1367,
- 1367, 1378, 1379,
- 1380, 1369, 1368,
- 1368, 1379, 1380,
- 1381, 1370, 1371,
- 1371, 1382, 1381,
- 1383, 1372, 1370,
- 1370, 1381, 1383,
- 1384, 1373, 1372,
- 1372, 1383, 1384,
- 1385, 1374, 1373,
- 1373, 1384, 1385,
- 1386, 1375, 1374,
- 1374, 1385, 1386,
- 1387, 1376, 1375,
- 1375, 1386, 1387,
- 1388, 1377, 1376,
- 1376, 1387, 1388,
- 1389, 1378, 1377,
- 1377, 1388, 1389,
- 1390, 1379, 1378,
- 1378, 1389, 1390,
- 1391, 1380, 1379,
- 1379, 1390, 1391,
- 1392, 1393, 1394,
- 1394, 1395, 1392,
- 1396, 1397, 1393,
- 1393, 1392, 1396,
- 1398, 1399, 1397,
- 1397, 1396, 1398,
- 1400, 1401, 1399,
- 1399, 1398, 1400,
- 1402, 1403, 1401,
- 1401, 1400, 1402,
- 1404, 1405, 1403,
- 1403, 1402, 1404,
- 1406, 1407, 1405,
- 1405, 1404, 1406,
- 1408, 1409, 1407,
- 1407, 1406, 1408,
- 1410, 1411, 1409,
- 1409, 1408, 1410,
- 1412, 1413, 1411,
- 1411, 1410, 1412,
- 1414, 1392, 1395,
- 1395, 1415, 1414,
- 1416, 1396, 1392,
- 1392, 1414, 1416,
- 1417, 1398, 1396,
- 1396, 1416, 1417,
- 1418, 1400, 1398,
- 1398, 1417, 1418,
- 1419, 1402, 1400,
- 1400, 1418, 1419,
- 1420, 1404, 1402,
- 1402, 1419, 1420,
- 1421, 1406, 1404,
- 1404, 1420, 1421,
- 1422, 1408, 1406,
- 1406, 1421, 1422,
- 1423, 1410, 1408,
- 1408, 1422, 1423,
- 1424, 1412, 1410,
- 1410, 1423, 1424,
- 1425, 1414, 1415,
- 1415, 1426, 1425,
- 1427, 1416, 1414,
- 1414, 1425, 1427,
- 1428, 1417, 1416,
- 1416, 1427, 1428,
- 1429, 1418, 1417,
- 1417, 1428, 1429,
- 1430, 1419, 1418,
- 1418, 1429, 1430,
- 1431, 1420, 1419,
- 1419, 1430, 1431,
- 1432, 1421, 1420,
- 1420, 1431, 1432,
- 1433, 1422, 1421,
- 1421, 1432, 1433,
- 1434, 1423, 1422,
- 1422, 1433, 1434,
- 1435, 1424, 1423,
- 1423, 1434, 1435,
- 1436, 1425, 1426,
- 1426, 1437, 1436,
- 1438, 1427, 1425,
- 1425, 1436, 1438,
- 1439, 1428, 1427,
- 1427, 1438, 1439,
- 1440, 1429, 1428,
- 1428, 1439, 1440,
- 1441, 1430, 1429,
- 1429, 1440, 1441,
- 1442, 1431, 1430,
- 1430, 1441, 1442,
- 1443, 1432, 1431,
- 1431, 1442, 1443,
- 1444, 1433, 1432,
- 1432, 1443, 1444,
- 1445, 1434, 1433,
- 1433, 1444, 1445,
- 1446, 1435, 1434,
- 1434, 1445, 1446,
- 1447, 1436, 1437,
- 1437, 1448, 1447,
- 1449, 1438, 1436,
- 1436, 1447, 1449,
- 1450, 1439, 1438,
- 1438, 1449, 1450,
- 1451, 1440, 1439,
- 1439, 1450, 1451,
- 1452, 1441, 1440,
- 1440, 1451, 1452,
- 1453, 1442, 1441,
- 1441, 1452, 1453,
- 1454, 1443, 1442,
- 1442, 1453, 1454,
- 1455, 1444, 1443,
- 1443, 1454, 1455,
- 1456, 1445, 1444,
- 1444, 1455, 1456,
- 1457, 1446, 1445,
- 1445, 1456, 1457,
- 1458, 1447, 1448,
- 1448, 1459, 1458,
- 1460, 1449, 1447,
- 1447, 1458, 1460,
- 1461, 1450, 1449,
- 1449, 1460, 1461,
- 1462, 1451, 1450,
- 1450, 1461, 1462,
- 1463, 1452, 1451,
- 1451, 1462, 1463,
- 1464, 1453, 1452,
- 1452, 1463, 1464,
- 1465, 1454, 1453,
- 1453, 1464, 1465,
- 1466, 1455, 1454,
- 1454, 1465, 1466,
- 1467, 1456, 1455,
- 1455, 1466, 1467,
- 1468, 1457, 1456,
- 1456, 1467, 1468,
- 1469, 1458, 1459,
- 1459, 1470, 1469,
- 1471, 1460, 1458,
- 1458, 1469, 1471,
- 1472, 1461, 1460,
- 1460, 1471, 1472,
- 1473, 1462, 1461,
- 1461, 1472, 1473,
- 1474, 1463, 1462,
- 1462, 1473, 1474,
- 1475, 1464, 1463,
- 1463, 1474, 1475,
- 1476, 1465, 1464,
- 1464, 1475, 1476,
- 1477, 1466, 1465,
- 1465, 1476, 1477,
- 1478, 1467, 1466,
- 1466, 1477, 1478,
- 1479, 1468, 1467,
- 1467, 1478, 1479,
- 1480, 1469, 1470,
- 1470, 1481, 1480,
- 1482, 1471, 1469,
- 1469, 1480, 1482,
- 1483, 1472, 1471,
- 1471, 1482, 1483,
- 1484, 1473, 1472,
- 1472, 1483, 1484,
- 1485, 1474, 1473,
- 1473, 1484, 1485,
- 1486, 1475, 1474,
- 1474, 1485, 1486,
- 1487, 1476, 1475,
- 1475, 1486, 1487,
- 1488, 1477, 1476,
- 1476, 1487, 1488,
- 1489, 1478, 1477,
- 1477, 1488, 1489,
- 1490, 1479, 1478,
- 1478, 1489, 1490,
- 1491, 1480, 1481,
- 1481, 1492, 1491,
- 1493, 1482, 1480,
- 1480, 1491, 1493,
- 1494, 1483, 1482,
- 1482, 1493, 1494,
- 1495, 1484, 1483,
- 1483, 1494, 1495,
- 1496, 1485, 1484,
- 1484, 1495, 1496,
- 1497, 1486, 1485,
- 1485, 1496, 1497,
- 1498, 1487, 1486,
- 1486, 1497, 1498,
- 1499, 1488, 1487,
- 1487, 1498, 1499,
- 1500, 1489, 1488,
- 1488, 1499, 1500,
- 1501, 1490, 1489,
- 1489, 1500, 1501,
- 1502, 1491, 1492,
- 1492, 1503, 1502,
- 1504, 1493, 1491,
- 1491, 1502, 1504,
- 1505, 1494, 1493,
- 1493, 1504, 1505,
- 1506, 1495, 1494,
- 1494, 1505, 1506,
- 1507, 1496, 1495,
- 1495, 1506, 1507,
- 1508, 1497, 1496,
- 1496, 1507, 1508,
- 1509, 1498, 1497,
- 1497, 1508, 1509,
- 1510, 1499, 1498,
- 1498, 1509, 1510,
- 1511, 1500, 1499,
- 1499, 1510, 1511,
- 1512, 1501, 1500,
- 1500, 1511, 1512,
- 1513, 1514, 1413,
- 1413, 1412, 1513,
- 1515, 1516, 1514,
- 1514, 1513, 1515,
- 1517, 1518, 1516,
- 1516, 1515, 1517,
- 1519, 1520, 1518,
- 1518, 1517, 1519,
- 1521, 1522, 1520,
- 1520, 1519, 1521,
- 1523, 1524, 1522,
- 1522, 1521, 1523,
- 1525, 1526, 1524,
- 1524, 1523, 1525,
- 1527, 1528, 1526,
- 1526, 1525, 1527,
- 1529, 1530, 1528,
- 1528, 1527, 1529,
- 1395, 1394, 1530,
- 1530, 1529, 1395,
- 1531, 1513, 1412,
- 1412, 1532, 1531,
- 1533, 1515, 1513,
- 1513, 1531, 1533,
- 1534, 1517, 1515,
- 1515, 1533, 1534,
- 1535, 1519, 1517,
- 1517, 1534, 1535,
- 1536, 1521, 1519,
- 1519, 1535, 1536,
- 1537, 1523, 1521,
- 1521, 1536, 1537,
- 1538, 1525, 1523,
- 1523, 1537, 1538,
- 1539, 1527, 1525,
- 1525, 1538, 1539,
- 1540, 1529, 1527,
- 1527, 1539, 1540,
- 1541, 1395, 1529,
- 1529, 1540, 1541,
- 1542, 1531, 1532,
- 1532, 1435, 1542,
- 1543, 1533, 1531,
- 1531, 1542, 1543,
- 1544, 1534, 1533,
- 1533, 1543, 1544,
- 1545, 1535, 1534,
- 1534, 1544, 1545,
- 1546, 1536, 1535,
- 1535, 1545, 1546,
- 1547, 1537, 1536,
- 1536, 1546, 1547,
- 1548, 1538, 1537,
- 1537, 1547, 1548,
- 1549, 1539, 1538,
- 1538, 1548, 1549,
- 1550, 1540, 1539,
- 1539, 1549, 1550,
- 1426, 1541, 1540,
- 1540, 1550, 1426,
- 1551, 1542, 1435,
- 1435, 1552, 1551,
- 1553, 1543, 1542,
- 1542, 1551, 1553,
- 1554, 1544, 1543,
- 1543, 1553, 1554,
- 1555, 1545, 1544,
- 1544, 1554, 1555,
- 1556, 1546, 1545,
- 1545, 1555, 1556,
- 1557, 1547, 1546,
- 1546, 1556, 1557,
- 1558, 1548, 1547,
- 1547, 1557, 1558,
- 1559, 1549, 1548,
- 1548, 1558, 1559,
- 1560, 1550, 1549,
- 1549, 1559, 1560,
- 1561, 1426, 1550,
- 1550, 1560, 1561,
- 1562, 1551, 1552,
- 1552, 1457, 1562,
- 1563, 1553, 1551,
- 1551, 1562, 1563,
- 1564, 1554, 1553,
- 1553, 1563, 1564,
- 1565, 1555, 1554,
- 1554, 1564, 1565,
- 1566, 1556, 1555,
- 1555, 1565, 1566,
- 1567, 1557, 1556,
- 1556, 1566, 1567,
- 1568, 1558, 1557,
- 1557, 1567, 1568,
- 1569, 1559, 1558,
- 1558, 1568, 1569,
- 1570, 1560, 1559,
- 1559, 1569, 1570,
- 1571, 1561, 1560,
- 1560, 1570, 1571,
- 1572, 1562, 1457,
- 1457, 1573, 1572,
- 1574, 1563, 1562,
- 1562, 1572, 1574,
- 1575, 1564, 1563,
- 1563, 1574, 1575,
- 1576, 1565, 1564,
- 1564, 1575, 1576,
- 1577, 1566, 1565,
- 1565, 1576, 1577,
- 1578, 1567, 1566,
- 1566, 1577, 1578,
- 1579, 1568, 1567,
- 1567, 1578, 1579,
- 1580, 1569, 1568,
- 1568, 1579, 1580,
- 1581, 1570, 1569,
- 1569, 1580, 1581,
- 1582, 1571, 1570,
- 1570, 1581, 1582,
- 1583, 1572, 1573,
- 1573, 1479, 1583,
- 1584, 1574, 1572,
- 1572, 1583, 1584,
- 1585, 1575, 1574,
- 1574, 1584, 1585,
- 1586, 1576, 1575,
- 1575, 1585, 1586,
- 1587, 1577, 1576,
- 1576, 1586, 1587,
- 1588, 1578, 1577,
- 1577, 1587, 1588,
- 1589, 1579, 1578,
- 1578, 1588, 1589,
- 1590, 1580, 1579,
- 1579, 1589, 1590,
- 1591, 1581, 1580,
- 1580, 1590, 1591,
- 1470, 1582, 1581,
- 1581, 1591, 1470,
- 1592, 1583, 1479,
- 1479, 1490, 1592,
- 1593, 1584, 1583,
- 1583, 1592, 1593,
- 1594, 1585, 1584,
- 1584, 1593, 1594,
- 1595, 1586, 1585,
- 1585, 1594, 1595,
- 1596, 1587, 1586,
- 1586, 1595, 1596,
- 1597, 1588, 1587,
- 1587, 1596, 1597,
- 1598, 1589, 1588,
- 1588, 1597, 1598,
- 1599, 1590, 1589,
- 1589, 1598, 1599,
- 1600, 1591, 1590,
- 1590, 1599, 1600,
- 1601, 1470, 1591,
- 1591, 1600, 1601,
- 1602, 1592, 1490,
- 1490, 1603, 1602,
- 1604, 1593, 1592,
- 1592, 1602, 1604,
- 1605, 1594, 1593,
- 1593, 1604, 1605,
- 1606, 1595, 1594,
- 1594, 1605, 1606,
- 1607, 1596, 1595,
- 1595, 1606, 1607,
- 1608, 1597, 1596,
- 1596, 1607, 1608,
- 1609, 1598, 1597,
- 1597, 1608, 1609,
- 1610, 1599, 1598,
- 1598, 1609, 1610,
- 1611, 1600, 1599,
- 1599, 1610, 1611,
- 1612, 1601, 1600,
- 1600, 1611, 1612,
- 1613, 1602, 1603,
- 1603, 1512, 1613,
- 1614, 1604, 1602,
- 1602, 1613, 1614,
- 1615, 1605, 1604,
- 1604, 1614, 1615,
- 1616, 1606, 1605,
- 1605, 1615, 1616,
- 1617, 1607, 1606,
- 1606, 1616, 1617,
- 1618, 1608, 1607,
- 1607, 1617, 1618,
- 1619, 1609, 1608,
- 1608, 1618, 1619,
- 1620, 1610, 1609,
- 1609, 1619, 1620,
- 1621, 1611, 1610,
- 1610, 1620, 1621,
- 1503, 1612, 1611,
- 1611, 1621, 1503,
- 1622, 1502, 1503,
- 1503, 1623, 1622,
- 1624, 1504, 1502,
- 1502, 1622, 1624,
- 1625, 1505, 1504,
- 1504, 1624, 1625,
- 1626, 1506, 1505,
- 1505, 1625, 1626,
- 1627, 1507, 1506,
- 1506, 1626, 1627,
- 1628, 1508, 1507,
- 1507, 1627, 1628,
- 1629, 1509, 1508,
- 1508, 1628, 1629,
- 1630, 1510, 1509,
- 1509, 1629, 1630,
- 1631, 1511, 1510,
- 1510, 1630, 1631,
- 1632, 1512, 1511,
- 1511, 1631, 1632,
- 1633, 1622, 1623,
- 1623, 1634, 1633,
- 1635, 1624, 1622,
- 1622, 1633, 1635,
- 1636, 1625, 1624,
- 1624, 1635, 1636,
- 1637, 1626, 1625,
- 1625, 1636, 1637,
- 1638, 1627, 1626,
- 1626, 1637, 1638,
- 1639, 1628, 1627,
- 1627, 1638, 1639,
- 1640, 1629, 1628,
- 1628, 1639, 1640,
- 1641, 1630, 1629,
- 1629, 1640, 1641,
- 1642, 1631, 1630,
- 1630, 1641, 1642,
- 1643, 1632, 1631,
- 1631, 1642, 1643,
- 1644, 1633, 1634,
- 1634, 1645, 1644,
- 1646, 1635, 1633,
- 1633, 1644, 1646,
- 1647, 1636, 1635,
- 1635, 1646, 1647,
- 1648, 1637, 1636,
- 1636, 1647, 1648,
- 1649, 1638, 1637,
- 1637, 1648, 1649,
- 1650, 1639, 1638,
- 1638, 1649, 1650,
- 1651, 1640, 1639,
- 1639, 1650, 1651,
- 1652, 1641, 1640,
- 1640, 1651, 1652,
- 1653, 1642, 1641,
- 1641, 1652, 1653,
- 1654, 1643, 1642,
- 1642, 1653, 1654,
- 1655, 1644, 1645,
- 1645, 1656, 1655,
- 1657, 1646, 1644,
- 1644, 1655, 1657,
- 1658, 1647, 1646,
- 1646, 1657, 1658,
- 1659, 1648, 1647,
- 1647, 1658, 1659,
- 1660, 1649, 1648,
- 1648, 1659, 1660,
- 1661, 1650, 1649,
- 1649, 1660, 1661,
- 1662, 1651, 1650,
- 1650, 1661, 1662,
- 1663, 1652, 1651,
- 1651, 1662, 1663,
- 1664, 1653, 1652,
- 1652, 1663, 1664,
- 1665, 1654, 1653,
- 1653, 1664, 1665,
- 1666, 1655, 1656,
- 1656, 1667, 1666,
- 1668, 1657, 1655,
- 1655, 1666, 1668,
- 1669, 1658, 1657,
- 1657, 1668, 1669,
- 1670, 1659, 1658,
- 1658, 1669, 1670,
- 1671, 1660, 1659,
- 1659, 1670, 1671,
- 1672, 1661, 1660,
- 1660, 1671, 1672,
- 1673, 1662, 1661,
- 1661, 1672, 1673,
- 1674, 1663, 1662,
- 1662, 1673, 1674,
- 1675, 1664, 1663,
- 1663, 1674, 1675,
- 1676, 1665, 1664,
- 1664, 1675, 1676,
- 1677, 1666, 1667,
- 1667, 1678, 1677,
- 1679, 1668, 1666,
- 1666, 1677, 1679,
- 1680, 1669, 1668,
- 1668, 1679, 1680,
- 1681, 1670, 1669,
- 1669, 1680, 1681,
- 1682, 1671, 1670,
- 1670, 1681, 1682,
- 1683, 1672, 1671,
- 1671, 1682, 1683,
- 1684, 1673, 1672,
- 1672, 1683, 1684,
- 1685, 1674, 1673,
- 1673, 1684, 1685,
- 1686, 1675, 1674,
- 1674, 1685, 1686,
- 1687, 1676, 1675,
- 1675, 1686, 1687,
- 1688, 1677, 1678,
- 1678, 1689, 1688,
- 1690, 1679, 1677,
- 1677, 1688, 1690,
- 1691, 1680, 1679,
- 1679, 1690, 1691,
- 1692, 1681, 1680,
- 1680, 1691, 1692,
- 1693, 1682, 1681,
- 1681, 1692, 1693,
- 1694, 1683, 1682,
- 1682, 1693, 1694,
- 1695, 1684, 1683,
- 1683, 1694, 1695,
- 1696, 1685, 1684,
- 1684, 1695, 1696,
- 1697, 1686, 1685,
- 1685, 1696, 1697,
- 1698, 1687, 1686,
- 1686, 1697, 1698,
- 1699, 1688, 1689,
- 1689, 1700, 1699,
- 1701, 1690, 1688,
- 1688, 1699, 1701,
- 1702, 1691, 1690,
- 1690, 1701, 1702,
- 1703, 1692, 1691,
- 1691, 1702, 1703,
- 1704, 1693, 1692,
- 1692, 1703, 1704,
- 1705, 1694, 1693,
- 1693, 1704, 1705,
- 1706, 1695, 1694,
- 1694, 1705, 1706,
- 1707, 1696, 1695,
- 1695, 1706, 1707,
- 1708, 1697, 1696,
- 1696, 1707, 1708,
- 1709, 1698, 1697,
- 1697, 1708, 1709,
- 1710, 1699, 1700,
- 1700, 1711, 1710,
- 1712, 1701, 1699,
- 1699, 1710, 1712,
- 1713, 1702, 1701,
- 1701, 1712, 1713,
- 1714, 1703, 1702,
- 1702, 1713, 1714,
- 1715, 1704, 1703,
- 1703, 1714, 1715,
- 1716, 1705, 1704,
- 1704, 1715, 1716,
- 1717, 1706, 1705,
- 1705, 1716, 1717,
- 1718, 1707, 1706,
- 1706, 1717, 1718,
- 1719, 1708, 1707,
- 1707, 1718, 1719,
- 1720, 1709, 1708,
- 1708, 1719, 1720,
- 1721, 1710, 1711,
- 1711, 800, 1721,
- 1722, 1712, 1710,
- 1710, 1721, 1722,
- 1723, 1713, 1712,
- 1712, 1722, 1723,
- 1724, 1714, 1713,
- 1713, 1723, 1724,
- 1725, 1715, 1714,
- 1714, 1724, 1725,
- 1726, 1716, 1715,
- 1715, 1725, 1726,
- 1727, 1717, 1716,
- 1716, 1726, 1727,
- 1728, 1718, 1717,
- 1717, 1727, 1728,
- 1729, 1719, 1718,
- 1718, 1728, 1729,
- 1730, 1720, 1719,
- 1719, 1729, 1730,
- 1731, 1613, 1512,
- 1512, 1632, 1731,
- 1732, 1614, 1613,
- 1613, 1731, 1732,
- 1733, 1615, 1614,
- 1614, 1732, 1733,
- 1734, 1616, 1615,
- 1615, 1733, 1734,
- 1735, 1617, 1616,
- 1616, 1734, 1735,
- 1736, 1618, 1617,
- 1617, 1735, 1736,
- 1737, 1619, 1618,
- 1618, 1736, 1737,
- 1738, 1620, 1619,
- 1619, 1737, 1738,
- 1739, 1621, 1620,
- 1620, 1738, 1739,
- 1623, 1503, 1621,
- 1621, 1739, 1623,
- 1740, 1731, 1632,
- 1632, 1741, 1740,
- 1742, 1732, 1731,
- 1731, 1740, 1742,
- 1743, 1733, 1732,
- 1732, 1742, 1743,
- 1744, 1734, 1733,
- 1733, 1743, 1744,
- 1745, 1735, 1734,
- 1734, 1744, 1745,
- 1746, 1736, 1735,
- 1735, 1745, 1746,
- 1747, 1737, 1736,
- 1736, 1746, 1747,
- 1748, 1738, 1737,
- 1737, 1747, 1748,
- 1749, 1739, 1738,
- 1738, 1748, 1749,
- 1750, 1623, 1739,
- 1739, 1749, 1750,
- 1751, 1740, 1741,
- 1741, 1752, 1751,
- 1753, 1742, 1740,
- 1740, 1751, 1753,
- 1754, 1743, 1742,
- 1742, 1753, 1754,
- 1755, 1744, 1743,
- 1743, 1754, 1755,
- 1756, 1745, 1744,
- 1744, 1755, 1756,
- 1757, 1746, 1745,
- 1745, 1756, 1757,
- 1758, 1747, 1746,
- 1746, 1757, 1758,
- 1759, 1748, 1747,
- 1747, 1758, 1759,
- 1760, 1749, 1748,
- 1748, 1759, 1760,
- 1645, 1750, 1749,
- 1749, 1760, 1645,
- 1761, 1751, 1752,
- 1752, 1665, 1761,
- 1762, 1753, 1751,
- 1751, 1761, 1762,
- 1763, 1754, 1753,
- 1753, 1762, 1763,
- 1764, 1755, 1754,
- 1754, 1763, 1764,
- 1765, 1756, 1755,
- 1755, 1764, 1765,
- 1766, 1757, 1756,
- 1756, 1765, 1766,
- 1767, 1758, 1757,
- 1757, 1766, 1767,
- 1768, 1759, 1758,
- 1758, 1767, 1768,
- 1769, 1760, 1759,
- 1759, 1768, 1769,
- 1656, 1645, 1760,
- 1760, 1769, 1656,
- 1770, 1761, 1665,
- 1665, 1771, 1770,
- 1772, 1762, 1761,
- 1761, 1770, 1772,
- 1773, 1763, 1762,
- 1762, 1772, 1773,
- 1774, 1764, 1763,
- 1763, 1773, 1774,
- 1775, 1765, 1764,
- 1764, 1774, 1775,
- 1776, 1766, 1765,
- 1765, 1775, 1776,
- 1777, 1767, 1766,
- 1766, 1776, 1777,
- 1778, 1768, 1767,
- 1767, 1777, 1778,
- 1779, 1769, 1768,
- 1768, 1778, 1779,
- 1780, 1656, 1769,
- 1769, 1779, 1780,
- 1781, 1770, 1771,
- 1771, 1782, 1781,
- 1783, 1772, 1770,
- 1770, 1781, 1783,
- 1784, 1773, 1772,
- 1772, 1783, 1784,
- 1785, 1774, 1773,
- 1773, 1784, 1785,
- 1786, 1775, 1774,
- 1774, 1785, 1786,
- 1787, 1776, 1775,
- 1775, 1786, 1787,
- 1788, 1777, 1776,
- 1776, 1787, 1788,
- 1789, 1778, 1777,
- 1777, 1788, 1789,
- 1790, 1779, 1778,
- 1778, 1789, 1790,
- 1791, 1780, 1779,
- 1779, 1790, 1791,
- 1792, 1781, 1782,
- 1782, 1698, 1792,
- 1793, 1783, 1781,
- 1781, 1792, 1793,
- 1794, 1784, 1783,
- 1783, 1793, 1794,
- 1795, 1785, 1784,
- 1784, 1794, 1795,
- 1796, 1786, 1785,
- 1785, 1795, 1796,
- 1797, 1787, 1786,
- 1786, 1796, 1797,
- 1798, 1788, 1787,
- 1787, 1797, 1798,
- 1799, 1789, 1788,
- 1788, 1798, 1799,
- 1800, 1790, 1789,
- 1789, 1799, 1800,
- 1689, 1791, 1790,
- 1790, 1800, 1689,
- 1801, 1792, 1698,
- 1698, 1802, 1801,
- 1803, 1793, 1792,
- 1792, 1801, 1803,
- 1804, 1794, 1793,
- 1793, 1803, 1804,
- 1805, 1795, 1794,
- 1794, 1804, 1805,
- 1806, 1796, 1795,
- 1795, 1805, 1806,
- 1807, 1797, 1796,
- 1796, 1806, 1807,
- 1808, 1798, 1797,
- 1797, 1807, 1808,
- 1809, 1799, 1798,
- 1798, 1808, 1809,
- 1810, 1800, 1799,
- 1799, 1809, 1810,
- 1811, 1689, 1800,
- 1800, 1810, 1811,
- 1812, 1801, 1802,
- 1802, 1813, 1812,
- 1814, 1803, 1801,
- 1801, 1812, 1814,
- 1815, 1804, 1803,
- 1803, 1814, 1815,
- 1816, 1805, 1804,
- 1804, 1815, 1816,
- 1817, 1806, 1805,
- 1805, 1816, 1817,
- 1818, 1807, 1806,
- 1806, 1817, 1818,
- 1819, 1808, 1807,
- 1807, 1818, 1819,
- 1820, 1809, 1808,
- 1808, 1819, 1820,
- 1821, 1810, 1809,
- 1809, 1820, 1821,
- 1822, 1811, 1810,
- 1810, 1821, 1822,
- 1823, 1812, 1813,
- 1813, 1824, 1823,
- 1825, 1814, 1812,
- 1812, 1823, 1825,
- 1826, 1815, 1814,
- 1814, 1825, 1826,
- 1827, 1816, 1815,
- 1815, 1826, 1827,
- 1828, 1817, 1816,
- 1816, 1827, 1828,
- 1829, 1818, 1817,
- 1817, 1828, 1829,
- 1830, 1819, 1818,
- 1818, 1829, 1830,
- 1831, 1820, 1819,
- 1819, 1830, 1831,
- 1832, 1821, 1820,
- 1820, 1831, 1832,
- 1833, 1822, 1821,
- 1821, 1832, 1833,
- 1834, 1835, 1836,
- 1836, 1837, 1834,
- 1838, 1839, 1835,
- 1835, 1834, 1838,
- 1840, 1841, 1839,
- 1839, 1838, 1840,
- 1842, 1843, 1841,
- 1841, 1840, 1842,
- 1844, 1845, 1843,
- 1843, 1842, 1844,
- 1846, 1847, 1845,
- 1845, 1844, 1846,
- 1848, 1849, 1847,
- 1847, 1846, 1848,
- 1850, 1851, 1849,
- 1849, 1848, 1850,
- 1852, 1853, 1851,
- 1851, 1850, 1852,
- 1854, 1855, 1853,
- 1853, 1852, 1854,
- 1856, 1834, 1837,
- 1837, 1857, 1856,
- 1858, 1838, 1834,
- 1834, 1856, 1858,
- 1859, 1840, 1838,
- 1838, 1858, 1859,
- 1860, 1842, 1840,
- 1840, 1859, 1860,
- 1861, 1844, 1842,
- 1842, 1860, 1861,
- 1862, 1846, 1844,
- 1844, 1861, 1862,
- 1863, 1848, 1846,
- 1846, 1862, 1863,
- 1864, 1850, 1848,
- 1848, 1863, 1864,
- 1865, 1852, 1850,
- 1850, 1864, 1865,
- 1866, 1854, 1852,
- 1852, 1865, 1866,
- 1867, 1856, 1857,
- 1857, 1868, 1867,
- 1869, 1858, 1856,
- 1856, 1867, 1869,
- 1870, 1859, 1858,
- 1858, 1869, 1870,
- 1871, 1860, 1859,
- 1859, 1870, 1871,
- 1872, 1861, 1860,
- 1860, 1871, 1872,
- 1873, 1862, 1861,
- 1861, 1872, 1873,
- 1874, 1863, 1862,
- 1862, 1873, 1874,
- 1875, 1864, 1863,
- 1863, 1874, 1875,
- 1876, 1865, 1864,
- 1864, 1875, 1876,
- 1877, 1866, 1865,
- 1865, 1876, 1877,
- 1878, 1867, 1868,
- 1868, 1879, 1878,
- 1880, 1869, 1867,
- 1867, 1878, 1880,
- 1881, 1870, 1869,
- 1869, 1880, 1881,
- 1882, 1871, 1870,
- 1870, 1881, 1882,
- 1883, 1872, 1871,
- 1871, 1882, 1883,
- 1884, 1873, 1872,
- 1872, 1883, 1884,
- 1885, 1874, 1873,
- 1873, 1884, 1885,
- 1886, 1875, 1874,
- 1874, 1885, 1886,
- 1887, 1876, 1875,
- 1875, 1886, 1887,
- 1888, 1877, 1876,
- 1876, 1887, 1888,
- 1889, 1878, 1879,
- 1879, 1890, 1889,
- 1891, 1880, 1878,
- 1878, 1889, 1891,
- 1892, 1881, 1880,
- 1880, 1891, 1892,
- 1893, 1882, 1881,
- 1881, 1892, 1893,
- 1894, 1883, 1882,
- 1882, 1893, 1894,
- 1895, 1884, 1883,
- 1883, 1894, 1895,
- 1896, 1885, 1884,
- 1884, 1895, 1896,
- 1897, 1886, 1885,
- 1885, 1896, 1897,
- 1898, 1887, 1886,
- 1886, 1897, 1898,
- 1899, 1888, 1887,
- 1887, 1898, 1899,
- 1900, 1889, 1890,
- 1890, 1901, 1900,
- 1902, 1891, 1889,
- 1889, 1900, 1902,
- 1903, 1892, 1891,
- 1891, 1902, 1903,
- 1904, 1893, 1892,
- 1892, 1903, 1904,
- 1905, 1894, 1893,
- 1893, 1904, 1905,
- 1906, 1895, 1894,
- 1894, 1905, 1906,
- 1907, 1896, 1895,
- 1895, 1906, 1907,
- 1908, 1897, 1896,
- 1896, 1907, 1908,
- 1909, 1898, 1897,
- 1897, 1908, 1909,
- 1910, 1899, 1898,
- 1898, 1909, 1910,
- 1911, 1900, 1901,
- 1901, 1912, 1911,
- 1913, 1902, 1900,
- 1900, 1911, 1913,
- 1914, 1903, 1902,
- 1902, 1913, 1914,
- 1915, 1904, 1903,
- 1903, 1914, 1915,
- 1916, 1905, 1904,
- 1904, 1915, 1916,
- 1917, 1906, 1905,
- 1905, 1916, 1917,
- 1918, 1907, 1906,
- 1906, 1917, 1918,
- 1919, 1908, 1907,
- 1907, 1918, 1919,
- 1920, 1909, 1908,
- 1908, 1919, 1920,
- 1921, 1910, 1909,
- 1909, 1920, 1921,
- 1922, 1911, 1912,
- 1912, 1923, 1922,
- 1924, 1913, 1911,
- 1911, 1922, 1924,
- 1925, 1914, 1913,
- 1913, 1924, 1925,
- 1926, 1915, 1914,
- 1914, 1925, 1926,
- 1927, 1916, 1915,
- 1915, 1926, 1927,
- 1928, 1917, 1916,
- 1916, 1927, 1928,
- 1929, 1918, 1917,
- 1917, 1928, 1929,
- 1930, 1919, 1918,
- 1918, 1929, 1930,
- 1931, 1920, 1919,
- 1919, 1930, 1931,
- 1932, 1921, 1920,
- 1920, 1931, 1932,
- 1933, 1922, 1923,
- 1923, 1934, 1933,
- 1935, 1924, 1922,
- 1922, 1933, 1935,
- 1936, 1925, 1924,
- 1924, 1935, 1936,
- 1937, 1926, 1925,
- 1925, 1936, 1937,
- 1938, 1927, 1926,
- 1926, 1937, 1938,
- 1939, 1928, 1927,
- 1927, 1938, 1939,
- 1940, 1929, 1928,
- 1928, 1939, 1940,
- 1941, 1930, 1929,
- 1929, 1940, 1941,
- 1942, 1931, 1930,
- 1930, 1941, 1942,
- 1943, 1932, 1931,
- 1931, 1942, 1943,
- 1944, 1933, 1934,
- 1934, 1945, 1944,
- 1946, 1935, 1933,
- 1933, 1944, 1946,
- 1947, 1936, 1935,
- 1935, 1946, 1947,
- 1948, 1937, 1936,
- 1936, 1947, 1948,
- 1949, 1938, 1937,
- 1937, 1948, 1949,
- 1950, 1939, 1938,
- 1938, 1949, 1950,
- 1951, 1940, 1939,
- 1939, 1950, 1951,
- 1952, 1941, 1940,
- 1940, 1951, 1952,
- 1953, 1942, 1941,
- 1941, 1952, 1953,
- 1954, 1943, 1942,
- 1942, 1953, 1954,
- 1955, 1956, 1957,
- 1957, 1958, 1955,
- 1959, 1960, 1956,
- 1956, 1955, 1959,
- 1961, 1962, 1960,
- 1960, 1959, 1961,
- 1963, 1964, 1962,
- 1962, 1961, 1963,
- 1965, 1966, 1964,
- 1964, 1963, 1965,
- 1967, 1968, 1966,
- 1966, 1965, 1967,
- 1969, 1970, 1968,
- 1968, 1967, 1969,
- 1971, 1972, 1970,
- 1970, 1969, 1971,
- 1973, 1974, 1972,
- 1972, 1971, 1973,
- 1975, 1976, 1974,
- 1974, 1973, 1975,
- 1977, 1955, 1958,
- 1958, 1978, 1977,
- 1979, 1959, 1955,
- 1955, 1977, 1979,
- 1980, 1961, 1959,
- 1959, 1979, 1980,
- 1981, 1963, 1961,
- 1961, 1980, 1981,
- 1982, 1965, 1963,
- 1963, 1981, 1982,
- 1983, 1967, 1965,
- 1965, 1982, 1983,
- 1984, 1969, 1967,
- 1967, 1983, 1984,
- 1985, 1971, 1969,
- 1969, 1984, 1985,
- 1986, 1973, 1971,
- 1971, 1985, 1986,
- 1987, 1975, 1973,
- 1973, 1986, 1987,
- 1988, 1977, 1978,
- 1978, 1989, 1988,
- 1990, 1979, 1977,
- 1977, 1988, 1990,
- 1991, 1980, 1979,
- 1979, 1990, 1991,
- 1992, 1981, 1980,
- 1980, 1991, 1992,
- 1993, 1982, 1981,
- 1981, 1992, 1993,
- 1994, 1983, 1982,
- 1982, 1993, 1994,
- 1995, 1984, 1983,
- 1983, 1994, 1995,
- 1996, 1985, 1984,
- 1984, 1995, 1996,
- 1997, 1986, 1985,
- 1985, 1996, 1997,
- 1998, 1987, 1986,
- 1986, 1997, 1998,
- 1999, 1988, 1989,
- 1989, 2000, 1999,
- 2001, 1990, 1988,
- 1988, 1999, 2001,
- 2002, 1991, 1990,
- 1990, 2001, 2002,
- 2003, 1992, 1991,
- 1991, 2002, 2003,
- 2004, 1993, 1992,
- 1992, 2003, 2004,
- 2005, 1994, 1993,
- 1993, 2004, 2005,
- 2006, 1995, 1994,
- 1994, 2005, 2006,
- 2007, 1996, 1995,
- 1995, 2006, 2007,
- 2008, 1997, 1996,
- 1996, 2007, 2008,
- 2009, 1998, 1997,
- 1997, 2008, 2009,
- 2010, 1999, 2000,
- 2000, 2011, 2010,
- 2012, 2001, 1999,
- 1999, 2010, 2012,
- 2013, 2002, 2001,
- 2001, 2012, 2013,
- 2014, 2003, 2002,
- 2002, 2013, 2014,
- 2015, 2004, 2003,
- 2003, 2014, 2015,
- 2016, 2005, 2004,
- 2004, 2015, 2016,
- 2017, 2006, 2005,
- 2005, 2016, 2017,
- 2018, 2007, 2006,
- 2006, 2017, 2018,
- 2019, 2008, 2007,
- 2007, 2018, 2019,
- 2020, 2009, 2008,
- 2008, 2019, 2020,
- 2021, 2010, 2011,
- 2011, 2022, 2021,
- 2023, 2012, 2010,
- 2010, 2021, 2023,
- 2024, 2013, 2012,
- 2012, 2023, 2024,
- 2025, 2014, 2013,
- 2013, 2024, 2025,
- 2026, 2015, 2014,
- 2014, 2025, 2026,
- 2027, 2016, 2015,
- 2015, 2026, 2027,
- 2028, 2017, 2016,
- 2016, 2027, 2028,
- 2029, 2018, 2017,
- 2017, 2028, 2029,
- 2030, 2019, 2018,
- 2018, 2029, 2030,
- 2031, 2020, 2019,
- 2019, 2030, 2031,
- 2032, 2021, 2022,
- 2022, 2033, 2032,
- 2034, 2023, 2021,
- 2021, 2032, 2034,
- 2035, 2024, 2023,
- 2023, 2034, 2035,
- 2036, 2025, 2024,
- 2024, 2035, 2036,
- 2037, 2026, 2025,
- 2025, 2036, 2037,
- 2038, 2027, 2026,
- 2026, 2037, 2038,
- 2039, 2028, 2027,
- 2027, 2038, 2039,
- 2040, 2029, 2028,
- 2028, 2039, 2040,
- 2041, 2030, 2029,
- 2029, 2040, 2041,
- 2042, 2031, 2030,
- 2030, 2041, 2042,
- 2043, 2032, 2033,
- 2033, 1932, 2043,
- 2044, 2034, 2032,
- 2032, 2043, 2044,
- 2045, 2035, 2034,
- 2034, 2044, 2045,
- 2046, 2036, 2035,
- 2035, 2045, 2046,
- 2047, 2037, 2036,
- 2036, 2046, 2047,
- 2048, 2038, 2037,
- 2037, 2047, 2048,
- 2049, 2039, 2038,
- 2038, 2048, 2049,
- 2050, 2040, 2039,
- 2039, 2049, 2050,
- 2051, 2041, 2040,
- 2040, 2050, 2051,
- 1923, 2042, 2041,
- 2041, 2051, 1923,
- 2052, 2043, 1932,
- 1932, 2053, 2052,
- 2054, 2044, 2043,
- 2043, 2052, 2054,
- 2055, 2045, 2044,
- 2044, 2054, 2055,
- 2056, 2046, 2045,
- 2045, 2055, 2056,
- 2057, 2047, 2046,
- 2046, 2056, 2057,
- 2058, 2048, 2047,
- 2047, 2057, 2058,
- 2059, 2049, 2048,
- 2048, 2058, 2059,
- 2060, 2050, 2049,
- 2049, 2059, 2060,
- 2061, 2051, 2050,
- 2050, 2060, 2061,
- 2062, 1923, 2051,
- 2051, 2061, 2062,
- 2063, 2052, 2053,
- 2053, 2064, 2063,
- 2065, 2054, 2052,
- 2052, 2063, 2065,
- 2066, 2055, 2054,
- 2054, 2065, 2066,
- 2067, 2056, 2055,
- 2055, 2066, 2067,
- 2068, 2057, 2056,
- 2056, 2067, 2068,
- 2069, 2058, 2057,
- 2057, 2068, 2069,
- 2070, 2059, 2058,
- 2058, 2069, 2070,
- 2071, 2060, 2059,
- 2059, 2070, 2071,
- 2072, 2061, 2060,
- 2060, 2071, 2072,
- 2073, 2062, 2061,
- 2061, 2072, 2073,
- 2074, 2075, 2076,
- 2076, 2077, 2074,
- 2078, 2079, 2075,
- 2075, 2074, 2078,
- 2080, 2081, 2079,
- 2079, 2078, 2080,
- 2082, 2083, 2081,
- 2081, 2080, 2082,
- 2084, 2085, 2083,
- 2083, 2082, 2084,
- 2086, 2087, 2085,
- 2085, 2084, 2086,
- 2088, 2089, 2087,
- 2087, 2086, 2088,
- 2090, 2091, 2089,
- 2089, 2088, 2090,
- 2092, 2093, 2091,
- 2091, 2090, 2092,
- 2094, 2064, 2093,
- 2093, 2092, 2094,
- 2095, 2074, 2077,
- 2077, 2096, 2095,
- 2097, 2078, 2074,
- 2074, 2095, 2097,
- 2098, 2080, 2078,
- 2078, 2097, 2098,
- 2099, 2082, 2080,
- 2080, 2098, 2099,
- 2100, 2084, 2082,
- 2082, 2099, 2100,
- 2101, 2086, 2084,
- 2084, 2100, 2101,
- 2102, 2088, 2086,
- 2086, 2101, 2102,
- 2103, 2090, 2088,
- 2088, 2102, 2103,
- 2104, 2092, 2090,
- 2090, 2103, 2104,
- 2105, 2094, 2092,
- 2092, 2104, 2105,
- 2106, 2095, 2096,
- 2096, 2107, 2106,
- 2108, 2097, 2095,
- 2095, 2106, 2108,
- 2109, 2098, 2097,
- 2097, 2108, 2109,
- 2110, 2099, 2098,
- 2098, 2109, 2110,
- 2111, 2100, 2099,
- 2099, 2110, 2111,
- 2112, 2101, 2100,
- 2100, 2111, 2112,
- 2113, 2102, 2101,
- 2101, 2112, 2113,
- 2114, 2103, 2102,
- 2102, 2113, 2114,
- 2115, 2104, 2103,
- 2103, 2114, 2115,
- 2116, 2105, 2104,
- 2104, 2115, 2116,
- 2117, 2106, 2107,
- 2107, 2118, 2117,
- 2119, 2108, 2106,
- 2106, 2117, 2119,
- 2120, 2109, 2108,
- 2108, 2119, 2120,
- 2121, 2110, 2109,
- 2109, 2120, 2121,
- 2122, 2111, 2110,
- 2110, 2121, 2122,
- 2123, 2112, 2111,
- 2111, 2122, 2123,
- 2124, 2113, 2112,
- 2112, 2123, 2124,
- 2125, 2114, 2113,
- 2113, 2124, 2125,
- 2126, 2115, 2114,
- 2114, 2125, 2126,
- 2127, 2116, 2115,
- 2115, 2126, 2127,
- 2128, 2117, 2118,
- 2118, 2129, 2128,
- 2130, 2119, 2117,
- 2117, 2128, 2130,
- 2131, 2120, 2119,
- 2119, 2130, 2131,
- 2132, 2121, 2120,
- 2120, 2131, 2132,
- 2133, 2122, 2121,
- 2121, 2132, 2133,
- 2134, 2123, 2122,
- 2122, 2133, 2134,
- 2135, 2124, 2123,
- 2123, 2134, 2135,
- 2136, 2125, 2124,
- 2124, 2135, 2136,
- 2137, 2126, 2125,
- 2125, 2136, 2137,
- 2138, 2127, 2126,
- 2126, 2137, 2138,
- 2139, 2128, 2129,
- 2129, 2140, 2139,
- 2141, 2130, 2128,
- 2128, 2139, 2141,
- 2142, 2131, 2130,
- 2130, 2141, 2142,
- 2143, 2132, 2131,
- 2131, 2142, 2143,
- 2144, 2133, 2132,
- 2132, 2143, 2144,
- 2145, 2134, 2133,
- 2133, 2144, 2145,
- 2146, 2135, 2134,
- 2134, 2145, 2146,
- 2147, 2136, 2135,
- 2135, 2146, 2147,
- 2148, 2137, 2136,
- 2136, 2147, 2148,
- 2149, 2138, 2137,
- 2137, 2148, 2149,
- 2150, 2139, 2140,
- 2140, 2151, 2150,
- 2152, 2141, 2139,
- 2139, 2150, 2152,
- 2153, 2142, 2141,
- 2141, 2152, 2153,
- 2154, 2143, 2142,
- 2142, 2153, 2154,
- 2155, 2144, 2143,
- 2143, 2154, 2155,
- 2156, 2145, 2144,
- 2144, 2155, 2156,
- 2157, 2146, 2145,
- 2145, 2156, 2157,
- 2158, 2147, 2146,
- 2146, 2157, 2158,
- 2159, 2148, 2147,
- 2147, 2158, 2159,
- 2160, 2149, 2148,
- 2148, 2159, 2160,
- 2161, 2150, 2151,
- 2151, 2162, 2161,
- 2163, 2152, 2150,
- 2150, 2161, 2163,
- 2164, 2153, 2152,
- 2152, 2163, 2164,
- 2165, 2154, 2153,
- 2153, 2164, 2165,
- 2166, 2155, 2154,
- 2154, 2165, 2166,
- 2167, 2156, 2155,
- 2155, 2166, 2167,
- 2168, 2157, 2156,
- 2156, 2167, 2168,
- 2169, 2158, 2157,
- 2157, 2168, 2169,
- 2170, 2159, 2158,
- 2158, 2169, 2170,
- 2171, 2160, 2159,
- 2159, 2170, 2171,
- 2172, 2161, 2162,
- 2162, 2173, 2172,
- 2174, 2163, 2161,
- 2161, 2172, 2174,
- 2175, 2164, 2163,
- 2163, 2174, 2175,
- 2176, 2165, 2164,
- 2164, 2175, 2176,
- 2177, 2166, 2165,
- 2165, 2176, 2177,
- 2178, 2167, 2166,
- 2166, 2177, 2178,
- 2179, 2168, 2167,
- 2167, 2178, 2179,
- 2180, 2169, 2168,
- 2168, 2179, 2180,
- 2181, 2170, 2169,
- 2169, 2180, 2181,
- 2182, 2171, 2170,
- 2170, 2181, 2182,
- 2183, 2172, 2173,
- 2173, 2184, 2183,
- 2185, 2174, 2172,
- 2172, 2183, 2185,
- 2186, 2175, 2174,
- 2174, 2185, 2186,
- 2187, 2176, 2175,
- 2175, 2186, 2187,
- 2188, 2177, 2176,
- 2176, 2187, 2188,
- 2189, 2178, 2177,
- 2177, 2188, 2189,
- 2190, 2179, 2178,
- 2178, 2189, 2190,
- 2191, 2180, 2179,
- 2179, 2190, 2191,
- 2192, 2181, 2180,
- 2180, 2191, 2192,
- 2193, 2182, 2181,
- 2181, 2192, 2193,
- 2194, 2063, 2064,
- 2064, 2094, 2194,
- 2195, 2065, 2063,
- 2063, 2194, 2195,
- 2196, 2066, 2065,
- 2065, 2195, 2196,
- 2197, 2067, 2066,
- 2066, 2196, 2197,
- 2198, 2068, 2067,
- 2067, 2197, 2198,
- 2199, 2069, 2068,
- 2068, 2198, 2199,
- 2200, 2201, 2069,
- 2069, 2199, 2200,
- 2202, 2203, 2201,
- 2201, 2200, 2202,
- 2204, 2205, 2203,
- 2203, 2202, 2204,
- 2077, 2076, 2205,
- 2205, 2204, 2077,
- 2206, 2194, 2094,
- 2094, 2105, 2206,
- 2207, 2195, 2194,
- 2194, 2206, 2207,
- 2208, 2196, 2195,
- 2195, 2207, 2208,
- 2209, 2197, 2196,
- 2196, 2208, 2209,
- 2210, 2198, 2197,
- 2197, 2209, 2210,
- 2211, 2199, 2198,
- 2198, 2210, 2211,
- 2212, 2200, 2199,
- 2199, 2211, 2212,
- 2213, 2202, 2200,
- 2200, 2212, 2213,
- 2214, 2204, 2202,
- 2202, 2213, 2214,
- 2096, 2077, 2204,
- 2204, 2214, 2096,
- 2215, 2206, 2105,
- 2105, 2116, 2215,
- 2216, 2207, 2206,
- 2206, 2215, 2216,
- 2217, 2208, 2207,
- 2207, 2216, 2217,
- 2218, 2209, 2208,
- 2208, 2217, 2218,
- 2219, 2210, 2209,
- 2209, 2218, 2219,
- 2220, 2211, 2210,
- 2210, 2219, 2220,
- 2221, 2212, 2211,
- 2211, 2220, 2221,
- 2222, 2213, 2212,
- 2212, 2221, 2222,
- 2223, 2214, 2213,
- 2213, 2222, 2223,
- 2224, 2096, 2214,
- 2214, 2223, 2224,
- 2225, 2215, 2116,
- 2116, 2127, 2225,
- 2226, 2216, 2215,
- 2215, 2225, 2226,
- 2227, 2217, 2216,
- 2216, 2226, 2227,
- 2228, 2218, 2217,
- 2217, 2227, 2228,
- 2229, 2219, 2218,
- 2218, 2228, 2229,
- 2230, 2220, 2219,
- 2219, 2229, 2230,
- 2231, 2221, 2220,
- 2220, 2230, 2231,
- 2232, 2222, 2221,
- 2221, 2231, 2232,
- 2233, 2223, 2222,
- 2222, 2232, 2233,
- 2118, 2224, 2223,
- 2223, 2233, 2118,
- 2234, 2225, 2127,
- 2127, 2235, 2234,
- 2236, 2226, 2225,
- 2225, 2234, 2236,
- 2237, 2227, 2226,
- 2226, 2236, 2237,
- 2238, 2228, 2227,
- 2227, 2237, 2238,
- 2239, 2229, 2228,
- 2228, 2238, 2239,
- 2240, 2230, 2229,
- 2229, 2239, 2240,
- 2241, 2231, 2230,
- 2230, 2240, 2241,
- 2242, 2232, 2231,
- 2231, 2241, 2242,
- 2243, 2233, 2232,
- 2232, 2242, 2243,
- 2244, 2118, 2233,
- 2233, 2243, 2244,
- 2245, 2234, 2235,
- 2235, 2246, 2245,
- 2247, 2236, 2234,
- 2234, 2245, 2247,
- 2248, 2237, 2236,
- 2236, 2247, 2248,
- 2249, 2238, 2237,
- 2237, 2248, 2249,
- 2250, 2239, 2238,
- 2238, 2249, 2250,
- 2251, 2240, 2239,
- 2239, 2250, 2251,
- 2252, 2241, 2240,
- 2240, 2251, 2252,
- 2253, 2242, 2241,
- 2241, 2252, 2253,
- 2254, 2243, 2242,
- 2242, 2253, 2254,
- 2255, 2244, 2243,
- 2243, 2254, 2255,
- 2256, 2245, 2246,
- 2246, 2257, 2256,
- 2258, 2247, 2245,
- 2245, 2256, 2258,
- 2259, 2248, 2247,
- 2247, 2258, 2259,
- 2260, 2249, 2248,
- 2248, 2259, 2260,
- 2261, 2250, 2249,
- 2249, 2260, 2261,
- 2262, 2251, 2250,
- 2250, 2261, 2262,
- 2263, 2252, 2251,
- 2251, 2262, 2263,
- 2264, 2253, 2252,
- 2252, 2263, 2264,
- 2265, 2254, 2253,
- 2253, 2264, 2265,
- 2266, 2255, 2254,
- 2254, 2265, 2266,
- 2267, 2256, 2257,
- 2257, 2268, 2267,
- 2269, 2258, 2256,
- 2256, 2267, 2269,
- 2270, 2259, 2258,
- 2258, 2269, 2270,
- 2271, 2260, 2259,
- 2259, 2270, 2271,
- 2272, 2261, 2260,
- 2260, 2271, 2272,
- 2273, 2262, 2261,
- 2261, 2272, 2273,
- 2274, 2263, 2262,
- 2262, 2273, 2274,
- 2275, 2264, 2263,
- 2263, 2274, 2275,
- 2276, 2265, 2264,
- 2264, 2275, 2276,
- 2277, 2266, 2265,
- 2265, 2276, 2277,
- 2278, 2267, 2268,
- 2268, 2279, 2278,
- 2280, 2269, 2267,
- 2267, 2278, 2280,
- 2281, 2270, 2269,
- 2269, 2280, 2281,
- 2282, 2271, 2270,
- 2270, 2281, 2282,
- 2283, 2272, 2271,
- 2271, 2282, 2283,
- 2284, 2273, 2272,
- 2272, 2283, 2284,
- 2285, 2274, 2273,
- 2273, 2284, 2285,
- 2286, 2275, 2274,
- 2274, 2285, 2286,
- 2287, 2276, 2275,
- 2275, 2286, 2287,
- 2288, 2277, 2276,
- 2276, 2287, 2288,
- 2289, 2278, 2279,
- 2279, 2193, 2289,
- 2290, 2280, 2278,
- 2278, 2289, 2290,
- 2291, 2281, 2280,
- 2280, 2290, 2291,
- 2292, 2282, 2281,
- 2281, 2291, 2292,
- 2293, 2283, 2282,
- 2282, 2292, 2293,
- 2294, 2284, 2283,
- 2283, 2293, 2294,
- 2295, 2285, 2284,
- 2284, 2294, 2295,
- 2296, 2286, 2285,
- 2285, 2295, 2296,
- 2297, 2287, 2286,
- 2286, 2296, 2297,
- 2184, 2288, 2287,
- 2287, 2297, 2184,
- 2298, 2299, 2300,
- 2298, 2300, 2301,
- 2298, 2301, 2302,
- 2298, 2302, 2303,
- 2298, 2303, 2304,
- 2298, 2304, 2305,
- 2298, 2305, 2306,
- 2298, 2306, 2307,
- 2298, 2307, 2308,
- 2298, 2308, 2309,
- 2310, 2300, 2299,
- 2299, 2311, 2310,
- 2312, 2301, 2300,
- 2300, 2310, 2312,
- 2313, 2302, 2301,
- 2301, 2312, 2313,
- 2314, 2303, 2302,
- 2302, 2313, 2314,
- 2315, 2304, 2303,
- 2303, 2314, 2315,
- 2316, 2305, 2304,
- 2304, 2315, 2316,
- 2317, 2306, 2305,
- 2305, 2316, 2317,
- 2318, 2307, 2306,
- 2306, 2317, 2318,
- 2319, 2308, 2307,
- 2307, 2318, 2319,
- 2320, 2309, 2308,
- 2308, 2319, 2320,
- 2321, 2310, 2311,
- 2311, 2322, 2321,
- 2323, 2312, 2310,
- 2310, 2321, 2323,
- 2324, 2313, 2312,
- 2312, 2323, 2324,
- 2325, 2314, 2313,
- 2313, 2324, 2325,
- 2326, 2315, 2314,
- 2314, 2325, 2326,
- 2327, 2316, 2315,
- 2315, 2326, 2327,
- 2328, 2317, 2316,
- 2316, 2327, 2328,
- 2329, 2318, 2317,
- 2317, 2328, 2329,
- 2330, 2319, 2318,
- 2318, 2329, 2330,
- 2331, 2320, 2319,
- 2319, 2330, 2331,
- 2332, 2321, 2322,
- 2322, 2333, 2332,
- 2334, 2323, 2321,
- 2321, 2332, 2334,
- 2335, 2324, 2323,
- 2323, 2334, 2335,
- 2336, 2325, 2324,
- 2324, 2335, 2336,
- 2337, 2326, 2325,
- 2325, 2336, 2337,
- 2338, 2327, 2326,
- 2326, 2337, 2338,
- 2339, 2328, 2327,
- 2327, 2338, 2339,
- 2340, 2329, 2328,
- 2328, 2339, 2340,
- 2341, 2330, 2329,
- 2329, 2340, 2341,
- 2342, 2331, 2330,
- 2330, 2341, 2342,
- 2343, 2332, 2333,
- 2333, 2344, 2343,
- 2345, 2334, 2332,
- 2332, 2343, 2345,
- 2346, 2335, 2334,
- 2334, 2345, 2346,
- 2347, 2336, 2335,
- 2335, 2346, 2347,
- 2348, 2337, 2336,
- 2336, 2347, 2348,
- 2349, 2338, 2337,
- 2337, 2348, 2349,
- 2350, 2339, 2338,
- 2338, 2349, 2350,
- 2351, 2340, 2339,
- 2339, 2350, 2351,
- 2352, 2341, 2340,
- 2340, 2351, 2352,
- 2353, 2342, 2341,
- 2341, 2352, 2353,
- 2354, 2343, 2344,
- 2344, 2355, 2354,
- 2356, 2345, 2343,
- 2343, 2354, 2356,
- 2357, 2346, 2345,
- 2345, 2356, 2357,
- 2358, 2347, 2346,
- 2346, 2357, 2358,
- 2359, 2348, 2347,
- 2347, 2358, 2359,
- 2360, 2349, 2348,
- 2348, 2359, 2360,
- 2361, 2350, 2349,
- 2349, 2360, 2361,
- 2362, 2351, 2350,
- 2350, 2361, 2362,
- 2363, 2352, 2351,
- 2351, 2362, 2363,
- 2364, 2353, 2352,
- 2352, 2363, 2364,
- 2365, 2354, 2355,
- 2355, 2366, 2365,
- 2367, 2356, 2354,
- 2354, 2365, 2367,
- 2368, 2357, 2356,
- 2356, 2367, 2368,
- 2369, 2358, 2357,
- 2357, 2368, 2369,
- 2370, 2359, 2358,
- 2358, 2369, 2370,
- 2371, 2360, 2359,
- 2359, 2370, 2371,
- 2372, 2361, 2360,
- 2360, 2371, 2372,
- 2373, 2362, 2361,
- 2361, 2372, 2373,
- 2374, 2363, 2362,
- 2362, 2373, 2374,
- 2375, 2364, 2363,
- 2363, 2374, 2375,
- 2376, 2365, 2366,
- 2366, 2377, 2376,
- 2378, 2367, 2365,
- 2365, 2376, 2378,
- 2379, 2368, 2367,
- 2367, 2378, 2379,
- 2380, 2369, 2368,
- 2368, 2379, 2380,
- 2381, 2370, 2369,
- 2369, 2380, 2381,
- 2382, 2371, 2370,
- 2370, 2381, 2382,
- 2383, 2372, 2371,
- 2371, 2382, 2383,
- 2384, 2373, 2372,
- 2372, 2383, 2384,
- 2385, 2374, 2373,
- 2373, 2384, 2385,
- 2386, 2375, 2374,
- 2374, 2385, 2386,
- 2387, 2376, 2377,
- 2377, 2388, 2387,
- 2389, 2378, 2376,
- 2376, 2387, 2389,
- 2390, 2379, 2378,
- 2378, 2389, 2390,
- 2391, 2380, 2379,
- 2379, 2390, 2391,
- 2392, 2381, 2380,
- 2380, 2391, 2392,
- 2393, 2382, 2381,
- 2381, 2392, 2393,
- 2394, 2383, 2382,
- 2382, 2393, 2394,
- 2395, 2384, 2383,
- 2383, 2394, 2395,
- 2396, 2385, 2384,
- 2384, 2395, 2396,
- 2397, 2386, 2385,
- 2385, 2396, 2397,
- 2398, 2387, 2388,
- 2388, 2399, 2398,
- 2400, 2389, 2387,
- 2387, 2398, 2400,
- 2401, 2390, 2389,
- 2389, 2400, 2401,
- 2402, 2391, 2390,
- 2390, 2401, 2402,
- 2403, 2392, 2391,
- 2391, 2402, 2403,
- 2404, 2393, 2392,
- 2392, 2403, 2404,
- 2405, 2394, 2393,
- 2393, 2404, 2405,
- 2406, 2395, 2394,
- 2394, 2405, 2406,
- 2407, 2396, 2395,
- 2395, 2406, 2407,
- 2408, 2397, 2396,
- 2396, 2407, 2408,
- 2298, 2409, 2410,
- 2298, 2410, 2411,
- 2298, 2411, 2412,
- 2298, 2412, 2413,
- 2298, 2413, 2414,
- 2298, 2414, 2415,
- 2298, 2415, 2416,
- 2298, 2416, 2417,
- 2298, 2417, 2418,
- 2298, 2418, 2419,
- 2420, 2410, 2409,
- 2409, 2421, 2420,
- 2422, 2411, 2410,
- 2410, 2420, 2422,
- 2423, 2412, 2411,
- 2411, 2422, 2423,
- 2424, 2413, 2412,
- 2412, 2423, 2424,
- 2425, 2414, 2413,
- 2413, 2424, 2425,
- 2426, 2415, 2414,
- 2414, 2425, 2426,
- 2427, 2416, 2415,
- 2415, 2426, 2427,
- 2428, 2417, 2416,
- 2416, 2427, 2428,
- 2429, 2418, 2417,
- 2417, 2428, 2429,
- 2430, 2419, 2418,
- 2418, 2429, 2430,
- 2431, 2420, 2421,
- 2421, 2432, 2431,
- 2433, 2422, 2420,
- 2420, 2431, 2433,
- 2434, 2423, 2422,
- 2422, 2433, 2434,
- 2435, 2424, 2423,
- 2423, 2434, 2435,
- 2436, 2425, 2424,
- 2424, 2435, 2436,
- 2437, 2426, 2425,
- 2425, 2436, 2437,
- 2438, 2427, 2426,
- 2426, 2437, 2438,
- 2439, 2428, 2427,
- 2427, 2438, 2439,
- 2440, 2429, 2428,
- 2428, 2439, 2440,
- 2441, 2430, 2429,
- 2429, 2440, 2441,
- 2442, 2431, 2432,
- 2432, 2443, 2442,
- 2444, 2433, 2431,
- 2431, 2442, 2444,
- 2445, 2434, 2433,
- 2433, 2444, 2445,
- 2446, 2435, 2434,
- 2434, 2445, 2446,
- 2447, 2436, 2435,
- 2435, 2446, 2447,
- 2448, 2437, 2436,
- 2436, 2447, 2448,
- 2449, 2438, 2437,
- 2437, 2448, 2449,
- 2450, 2439, 2438,
- 2438, 2449, 2450,
- 2451, 2440, 2439,
- 2439, 2450, 2451,
- 2452, 2441, 2440,
- 2440, 2451, 2452,
- 2453, 2442, 2443,
- 2443, 2454, 2453,
- 2455, 2444, 2442,
- 2442, 2453, 2455,
- 2456, 2445, 2444,
- 2444, 2455, 2456,
- 2457, 2446, 2445,
- 2445, 2456, 2457,
- 2458, 2447, 2446,
- 2446, 2457, 2458,
- 2459, 2448, 2447,
- 2447, 2458, 2459,
- 2460, 2449, 2448,
- 2448, 2459, 2460,
- 2461, 2450, 2449,
- 2449, 2460, 2461,
- 2462, 2451, 2450,
- 2450, 2461, 2462,
- 2463, 2452, 2451,
- 2451, 2462, 2463,
- 2464, 2453, 2454,
- 2454, 2465, 2464,
- 2466, 2455, 2453,
- 2453, 2464, 2466,
- 2467, 2456, 2455,
- 2455, 2466, 2467,
- 2468, 2457, 2456,
- 2456, 2467, 2468,
- 2469, 2458, 2457,
- 2457, 2468, 2469,
- 2470, 2459, 2458,
- 2458, 2469, 2470,
- 2471, 2460, 2459,
- 2459, 2470, 2471,
- 2472, 2461, 2460,
- 2460, 2471, 2472,
- 2473, 2462, 2461,
- 2461, 2472, 2473,
- 2474, 2463, 2462,
- 2462, 2473, 2474,
- 2475, 2464, 2465,
- 2465, 2476, 2475,
- 2477, 2466, 2464,
- 2464, 2475, 2477,
- 2478, 2467, 2466,
- 2466, 2477, 2478,
- 2479, 2468, 2467,
- 2467, 2478, 2479,
- 2480, 2469, 2468,
- 2468, 2479, 2480,
- 2481, 2470, 2469,
- 2469, 2480, 2481,
- 2482, 2471, 2470,
- 2470, 2481, 2482,
- 2483, 2472, 2471,
- 2471, 2482, 2483,
- 2484, 2473, 2472,
- 2472, 2483, 2484,
- 2485, 2474, 2473,
- 2473, 2484, 2485,
- 2486, 2475, 2476,
- 2476, 2487, 2486,
- 2488, 2477, 2475,
- 2475, 2486, 2488,
- 2489, 2478, 2477,
- 2477, 2488, 2489,
- 2490, 2479, 2478,
- 2478, 2489, 2490,
- 2491, 2480, 2479,
- 2479, 2490, 2491,
- 2492, 2481, 2480,
- 2480, 2491, 2492,
- 2493, 2482, 2481,
- 2481, 2492, 2493,
- 2494, 2483, 2482,
- 2482, 2493, 2494,
- 2495, 2484, 2483,
- 2483, 2494, 2495,
- 2496, 2485, 2484,
- 2484, 2495, 2496,
- 2497, 2486, 2487,
- 2487, 2498, 2497,
- 2499, 2488, 2486,
- 2486, 2497, 2499,
- 2500, 2489, 2488,
- 2488, 2499, 2500,
- 2501, 2490, 2489,
- 2489, 2500, 2501,
- 2502, 2491, 2490,
- 2490, 2501, 2502,
- 2503, 2492, 2491,
- 2491, 2502, 2503,
- 2504, 2493, 2492,
- 2492, 2503, 2504,
- 2505, 2494, 2493,
- 2493, 2504, 2505,
- 2506, 2495, 2494,
- 2494, 2505, 2506,
- 2507, 2496, 2495,
- 2495, 2506, 2507,
- 2508, 2497, 2498,
- 2498, 2509, 2508,
- 2510, 2499, 2497,
- 2497, 2508, 2510,
- 2511, 2500, 2499,
- 2499, 2510, 2511,
- 2512, 2501, 2500,
- 2500, 2511, 2512,
- 2513, 2502, 2501,
- 2501, 2512, 2513,
- 2514, 2503, 2502,
- 2502, 2513, 2514,
- 2515, 2504, 2503,
- 2503, 2514, 2515,
- 2516, 2505, 2504,
- 2504, 2515, 2516,
- 2517, 2506, 2505,
- 2505, 2516, 2517,
- 2518, 2507, 2506,
- 2506, 2517, 2518,
- 2298, 2519, 2520,
- 2298, 2520, 2521,
- 2298, 2521, 2522,
- 2298, 2522, 2523,
- 2298, 2523, 2524,
- 2298, 2524, 2525,
- 2298, 2525, 2526,
- 2298, 2526, 2527,
- 2298, 2527, 2528,
- 2298, 2528, 2529,
- 2530, 2520, 2519,
- 2519, 2531, 2530,
- 2532, 2521, 2520,
- 2520, 2530, 2532,
- 2533, 2522, 2521,
- 2521, 2532, 2533,
- 2534, 2523, 2522,
- 2522, 2533, 2534,
- 2535, 2524, 2523,
- 2523, 2534, 2535,
- 2536, 2525, 2524,
- 2524, 2535, 2536,
- 2537, 2526, 2525,
- 2525, 2536, 2537,
- 2538, 2527, 2526,
- 2526, 2537, 2538,
- 2539, 2528, 2527,
- 2527, 2538, 2539,
- 2540, 2529, 2528,
- 2528, 2539, 2540,
- 2541, 2530, 2531,
- 2531, 2542, 2541,
- 2543, 2532, 2530,
- 2530, 2541, 2543,
- 2544, 2533, 2532,
- 2532, 2543, 2544,
- 2545, 2534, 2533,
- 2533, 2544, 2545,
- 2546, 2535, 2534,
- 2534, 2545, 2546,
- 2547, 2536, 2535,
- 2535, 2546, 2547,
- 2548, 2537, 2536,
- 2536, 2547, 2548,
- 2549, 2538, 2537,
- 2537, 2548, 2549,
- 2550, 2539, 2538,
- 2538, 2549, 2550,
- 2551, 2540, 2539,
- 2539, 2550, 2551,
- 2552, 2541, 2542,
- 2542, 2553, 2552,
- 2554, 2543, 2541,
- 2541, 2552, 2554,
- 2555, 2544, 2543,
- 2543, 2554, 2555,
- 2556, 2545, 2544,
- 2544, 2555, 2556,
- 2557, 2546, 2545,
- 2545, 2556, 2557,
- 2558, 2547, 2546,
- 2546, 2557, 2558,
- 2559, 2548, 2547,
- 2547, 2558, 2559,
- 2560, 2549, 2548,
- 2548, 2559, 2560,
- 2561, 2550, 2549,
- 2549, 2560, 2561,
- 2562, 2551, 2550,
- 2550, 2561, 2562,
- 2563, 2552, 2553,
- 2553, 2564, 2563,
- 2565, 2554, 2552,
- 2552, 2563, 2565,
- 2566, 2555, 2554,
- 2554, 2565, 2566,
- 2567, 2556, 2555,
- 2555, 2566, 2567,
- 2568, 2557, 2556,
- 2556, 2567, 2568,
- 2569, 2558, 2557,
- 2557, 2568, 2569,
- 2570, 2559, 2558,
- 2558, 2569, 2570,
- 2571, 2560, 2559,
- 2559, 2570, 2571,
- 2572, 2561, 2560,
- 2560, 2571, 2572,
- 2573, 2562, 2561,
- 2561, 2572, 2573,
- 2574, 2563, 2564,
- 2564, 2575, 2574,
- 2576, 2565, 2563,
- 2563, 2574, 2576,
- 2577, 2566, 2565,
- 2565, 2576, 2577,
- 2578, 2567, 2566,
- 2566, 2577, 2578,
- 2579, 2568, 2567,
- 2567, 2578, 2579,
- 2580, 2569, 2568,
- 2568, 2579, 2580,
- 2581, 2570, 2569,
- 2569, 2580, 2581,
- 2582, 2571, 2570,
- 2570, 2581, 2582,
- 2583, 2572, 2571,
- 2571, 2582, 2583,
- 2584, 2573, 2572,
- 2572, 2583, 2584,
- 2585, 2574, 2575,
- 2575, 2586, 2585,
- 2587, 2576, 2574,
- 2574, 2585, 2587,
- 2588, 2577, 2576,
- 2576, 2587, 2588,
- 2589, 2578, 2577,
- 2577, 2588, 2589,
- 2590, 2579, 2578,
- 2578, 2589, 2590,
- 2591, 2580, 2579,
- 2579, 2590, 2591,
- 2592, 2581, 2580,
- 2580, 2591, 2592,
- 2593, 2582, 2581,
- 2581, 2592, 2593,
- 2594, 2583, 2582,
- 2582, 2593, 2594,
- 2595, 2584, 2583,
- 2583, 2594, 2595,
- 2596, 2585, 2586,
- 2586, 2597, 2596,
- 2598, 2587, 2585,
- 2585, 2596, 2598,
- 2599, 2588, 2587,
- 2587, 2598, 2599,
- 2600, 2589, 2588,
- 2588, 2599, 2600,
- 2601, 2590, 2589,
- 2589, 2600, 2601,
- 2602, 2591, 2590,
- 2590, 2601, 2602,
- 2603, 2592, 2591,
- 2591, 2602, 2603,
- 2604, 2593, 2592,
- 2592, 2603, 2604,
- 2605, 2594, 2593,
- 2593, 2604, 2605,
- 2606, 2595, 2594,
- 2594, 2605, 2606,
- 2607, 2596, 2597,
- 2597, 2608, 2607,
- 2609, 2598, 2596,
- 2596, 2607, 2609,
- 2610, 2599, 2598,
- 2598, 2609, 2610,
- 2611, 2600, 2599,
- 2599, 2610, 2611,
- 2612, 2601, 2600,
- 2600, 2611, 2612,
- 2613, 2602, 2601,
- 2601, 2612, 2613,
- 2614, 2603, 2602,
- 2602, 2613, 2614,
- 2615, 2604, 2603,
- 2603, 2614, 2615,
- 2616, 2605, 2604,
- 2604, 2615, 2616,
- 2617, 2606, 2605,
- 2605, 2616, 2617,
- 2618, 2607, 2608,
- 2608, 2619, 2618,
- 2620, 2609, 2607,
- 2607, 2618, 2620,
- 2621, 2610, 2609,
- 2609, 2620, 2621,
- 2622, 2611, 2610,
- 2610, 2621, 2622,
- 2623, 2612, 2611,
- 2611, 2622, 2623,
- 2624, 2613, 2612,
- 2612, 2623, 2624,
- 2625, 2614, 2613,
- 2613, 2624, 2625,
- 2626, 2615, 2614,
- 2614, 2625, 2626,
- 2627, 2616, 2615,
- 2615, 2626, 2627,
- 2628, 2617, 2616,
- 2616, 2627, 2628,
- 2298, 2629, 2630,
- 2298, 2630, 2631,
- 2298, 2631, 2632,
- 2298, 2632, 2633,
- 2298, 2633, 2634,
- 2298, 2634, 2635,
- 2298, 2635, 2636,
- 2298, 2636, 2637,
- 2298, 2637, 2638,
- 2298, 2638, 2639,
- 2640, 2630, 2629,
- 2629, 2641, 2640,
- 2642, 2631, 2630,
- 2630, 2640, 2642,
- 2643, 2632, 2631,
- 2631, 2642, 2643,
- 2644, 2633, 2632,
- 2632, 2643, 2644,
- 2645, 2634, 2633,
- 2633, 2644, 2645,
- 2646, 2635, 2634,
- 2634, 2645, 2646,
- 2647, 2636, 2635,
- 2635, 2646, 2647,
- 2648, 2637, 2636,
- 2636, 2647, 2648,
- 2649, 2638, 2637,
- 2637, 2648, 2649,
- 2650, 2639, 2638,
- 2638, 2649, 2650,
- 2651, 2640, 2641,
- 2641, 2652, 2651,
- 2653, 2642, 2640,
- 2640, 2651, 2653,
- 2654, 2643, 2642,
- 2642, 2653, 2654,
- 2655, 2644, 2643,
- 2643, 2654, 2655,
- 2656, 2645, 2644,
- 2644, 2655, 2656,
- 2657, 2646, 2645,
- 2645, 2656, 2657,
- 2658, 2647, 2646,
- 2646, 2657, 2658,
- 2659, 2648, 2647,
- 2647, 2658, 2659,
- 2660, 2649, 2648,
- 2648, 2659, 2660,
- 2661, 2650, 2649,
- 2649, 2660, 2661,
- 2662, 2651, 2652,
- 2652, 2663, 2662,
- 2664, 2653, 2651,
- 2651, 2662, 2664,
- 2665, 2654, 2653,
- 2653, 2664, 2665,
- 2666, 2655, 2654,
- 2654, 2665, 2666,
- 2667, 2656, 2655,
- 2655, 2666, 2667,
- 2668, 2657, 2656,
- 2656, 2667, 2668,
- 2669, 2658, 2657,
- 2657, 2668, 2669,
- 2670, 2659, 2658,
- 2658, 2669, 2670,
- 2671, 2660, 2659,
- 2659, 2670, 2671,
- 2672, 2661, 2660,
- 2660, 2671, 2672,
- 2673, 2662, 2663,
- 2663, 2674, 2673,
- 2675, 2664, 2662,
- 2662, 2673, 2675,
- 2676, 2665, 2664,
- 2664, 2675, 2676,
- 2677, 2666, 2665,
- 2665, 2676, 2677,
- 2678, 2667, 2666,
- 2666, 2677, 2678,
- 2679, 2668, 2667,
- 2667, 2678, 2679,
- 2680, 2669, 2668,
- 2668, 2679, 2680,
- 2681, 2670, 2669,
- 2669, 2680, 2681,
- 2682, 2671, 2670,
- 2670, 2681, 2682,
- 2683, 2672, 2671,
- 2671, 2682, 2683,
- 2684, 2673, 2674,
- 2674, 2685, 2684,
- 2686, 2675, 2673,
- 2673, 2684, 2686,
- 2687, 2676, 2675,
- 2675, 2686, 2687,
- 2688, 2677, 2676,
- 2676, 2687, 2688,
- 2689, 2678, 2677,
- 2677, 2688, 2689,
- 2690, 2679, 2678,
- 2678, 2689, 2690,
- 2691, 2680, 2679,
- 2679, 2690, 2691,
- 2692, 2681, 2680,
- 2680, 2691, 2692,
- 2693, 2682, 2681,
- 2681, 2692, 2693,
- 2694, 2683, 2682,
- 2682, 2693, 2694,
- 2695, 2684, 2685,
- 2685, 2696, 2695,
- 2697, 2686, 2684,
- 2684, 2695, 2697,
- 2698, 2687, 2686,
- 2686, 2697, 2698,
- 2699, 2688, 2687,
- 2687, 2698, 2699,
- 2700, 2689, 2688,
- 2688, 2699, 2700,
- 2701, 2690, 2689,
- 2689, 2700, 2701,
- 2702, 2691, 2690,
- 2690, 2701, 2702,
- 2703, 2692, 2691,
- 2691, 2702, 2703,
- 2704, 2693, 2692,
- 2692, 2703, 2704,
- 2705, 2694, 2693,
- 2693, 2704, 2705,
- 2706, 2695, 2696,
- 2696, 2707, 2706,
- 2708, 2697, 2695,
- 2695, 2706, 2708,
- 2709, 2698, 2697,
- 2697, 2708, 2709,
- 2710, 2699, 2698,
- 2698, 2709, 2710,
- 2711, 2700, 2699,
- 2699, 2710, 2711,
- 2712, 2701, 2700,
- 2700, 2711, 2712,
- 2713, 2702, 2701,
- 2701, 2712, 2713,
- 2714, 2703, 2702,
- 2702, 2713, 2714,
- 2715, 2704, 2703,
- 2703, 2714, 2715,
- 2716, 2705, 2704,
- 2704, 2715, 2716,
- 2717, 2706, 2707,
- 2707, 2718, 2717,
- 2719, 2708, 2706,
- 2706, 2717, 2719,
- 2720, 2709, 2708,
- 2708, 2719, 2720,
- 2721, 2710, 2709,
- 2709, 2720, 2721,
- 2722, 2711, 2710,
- 2710, 2721, 2722,
- 2723, 2712, 2711,
- 2711, 2722, 2723,
- 2724, 2713, 2712,
- 2712, 2723, 2724,
- 2725, 2714, 2713,
- 2713, 2724, 2725,
- 2726, 2715, 2714,
- 2714, 2725, 2726,
- 2727, 2716, 2715,
- 2715, 2726, 2727,
- 2728, 2717, 2718,
- 2718, 2729, 2728,
- 2730, 2719, 2717,
- 2717, 2728, 2730,
- 2731, 2720, 2719,
- 2719, 2730, 2731,
- 2732, 2721, 2720,
- 2720, 2731, 2732,
- 2733, 2722, 2721,
- 2721, 2732, 2733,
- 2734, 2723, 2722,
- 2722, 2733, 2734,
- 2735, 2724, 2723,
- 2723, 2734, 2735,
- 2736, 2725, 2724,
- 2724, 2735, 2736,
- 2737, 2726, 2725,
- 2725, 2736, 2737,
- 2738, 2727, 2726,
- 2726, 2737, 2738,
- 2739, 2740, 2741,
- 2741, 2742, 2739,
- 2743, 2744, 2740,
- 2740, 2739, 2743,
- 2745, 2746, 2744,
- 2744, 2743, 2745,
- 2747, 2748, 2746,
- 2746, 2745, 2747,
- 2749, 2750, 2748,
- 2748, 2747, 2749,
- 2751, 2752, 2750,
- 2750, 2749, 2751,
- 2753, 2754, 2752,
- 2752, 2751, 2753,
- 2755, 2756, 2754,
- 2754, 2753, 2755,
- 2757, 2758, 2756,
- 2756, 2755, 2757,
- 2759, 2760, 2758,
- 2758, 2757, 2759,
- 2761, 2739, 2742,
- 2742, 2762, 2761,
- 2763, 2743, 2739,
- 2739, 2761, 2763,
- 2764, 2745, 2743,
- 2743, 2763, 2764,
- 2765, 2747, 2745,
- 2745, 2764, 2765,
- 2766, 2749, 2747,
- 2747, 2765, 2766,
- 2767, 2751, 2749,
- 2749, 2766, 2767,
- 2768, 2753, 2751,
- 2751, 2767, 2768,
- 2769, 2755, 2753,
- 2753, 2768, 2769,
- 2770, 2757, 2755,
- 2755, 2769, 2770,
- 2771, 2759, 2757,
- 2757, 2770, 2771,
- 2772, 2761, 2762,
- 2762, 2773, 2772,
- 2774, 2763, 2761,
- 2761, 2772, 2774,
- 2775, 2764, 2763,
- 2763, 2774, 2775,
- 2776, 2765, 2764,
- 2764, 2775, 2776,
- 2777, 2766, 2765,
- 2765, 2776, 2777,
- 2778, 2767, 2766,
- 2766, 2777, 2778,
- 2779, 2768, 2767,
- 2767, 2778, 2779,
- 2780, 2769, 2768,
- 2768, 2779, 2780,
- 2781, 2770, 2769,
- 2769, 2780, 2781,
- 2782, 2771, 2770,
- 2770, 2781, 2782,
- 2783, 2772, 2773,
- 2773, 2784, 2783,
- 2785, 2774, 2772,
- 2772, 2783, 2785,
- 2786, 2775, 2774,
- 2774, 2785, 2786,
- 2787, 2776, 2775,
- 2775, 2786, 2787,
- 2788, 2777, 2776,
- 2776, 2787, 2788,
- 2789, 2778, 2777,
- 2777, 2788, 2789,
- 2790, 2779, 2778,
- 2778, 2789, 2790,
- 2791, 2780, 2779,
- 2779, 2790, 2791,
- 2792, 2781, 2780,
- 2780, 2791, 2792,
- 2793, 2782, 2781,
- 2781, 2792, 2793,
- 2794, 2783, 2784,
- 2784, 2795, 2794,
- 2796, 2785, 2783,
- 2783, 2794, 2796,
- 2797, 2786, 2785,
- 2785, 2796, 2797,
- 2798, 2787, 2786,
- 2786, 2797, 2798,
- 2799, 2788, 2787,
- 2787, 2798, 2799,
- 2800, 2789, 2788,
- 2788, 2799, 2800,
- 2801, 2790, 2789,
- 2789, 2800, 2801,
- 2802, 2791, 2790,
- 2790, 2801, 2802,
- 2803, 2792, 2791,
- 2791, 2802, 2803,
- 2804, 2793, 2792,
- 2792, 2803, 2804,
- 2805, 2794, 2795,
- 2795, 2806, 2805,
- 2807, 2796, 2794,
- 2794, 2805, 2807,
- 2808, 2797, 2796,
- 2796, 2807, 2808,
- 2809, 2798, 2797,
- 2797, 2808, 2809,
- 2810, 2799, 2798,
- 2798, 2809, 2810,
- 2811, 2800, 2799,
- 2799, 2810, 2811,
- 2812, 2801, 2800,
- 2800, 2811, 2812,
- 2813, 2802, 2801,
- 2801, 2812, 2813,
- 2814, 2803, 2802,
- 2802, 2813, 2814,
- 2815, 2804, 2803,
- 2803, 2814, 2815,
- 2816, 2805, 2806,
- 2806, 2817, 2816,
- 2818, 2807, 2805,
- 2805, 2816, 2818,
- 2819, 2808, 2807,
- 2807, 2818, 2819,
- 2820, 2809, 2808,
- 2808, 2819, 2820,
- 2821, 2810, 2809,
- 2809, 2820, 2821,
- 2822, 2811, 2810,
- 2810, 2821, 2822,
- 2823, 2812, 2811,
- 2811, 2822, 2823,
- 2824, 2813, 2812,
- 2812, 2823, 2824,
- 2825, 2814, 2813,
- 2813, 2824, 2825,
- 2826, 2815, 2814,
- 2814, 2825, 2826,
- 2827, 2816, 2817,
- 2817, 2828, 2827,
- 2829, 2818, 2816,
- 2816, 2827, 2829,
- 2830, 2819, 2818,
- 2818, 2829, 2830,
- 2831, 2820, 2819,
- 2819, 2830, 2831,
- 2832, 2821, 2820,
- 2820, 2831, 2832,
- 2833, 2822, 2821,
- 2821, 2832, 2833,
- 2834, 2823, 2822,
- 2822, 2833, 2834,
- 2835, 2824, 2823,
- 2823, 2834, 2835,
- 2836, 2825, 2824,
- 2824, 2835, 2836,
- 2837, 2826, 2825,
- 2825, 2836, 2837,
- 2838, 2827, 2828,
- 2828, 2839, 2838,
- 2840, 2829, 2827,
- 2827, 2838, 2840,
- 2841, 2830, 2829,
- 2829, 2840, 2841,
- 2842, 2831, 2830,
- 2830, 2841, 2842,
- 2843, 2832, 2831,
- 2831, 2842, 2843,
- 2844, 2833, 2832,
- 2832, 2843, 2844,
- 2845, 2834, 2833,
- 2833, 2844, 2845,
- 2846, 2835, 2834,
- 2834, 2845, 2846,
- 2847, 2836, 2835,
- 2835, 2846, 2847,
- 2848, 2837, 2836,
- 2836, 2847, 2848,
- 2849, 2838, 2839,
- 2839, 2850, 2849,
- 2851, 2840, 2838,
- 2838, 2849, 2851,
- 2852, 2841, 2840,
- 2840, 2851, 2852,
- 2853, 2842, 2841,
- 2841, 2852, 2853,
- 2854, 2843, 2842,
- 2842, 2853, 2854,
- 2855, 2844, 2843,
- 2843, 2854, 2855,
- 2856, 2845, 2844,
- 2844, 2855, 2856,
- 2857, 2846, 2845,
- 2845, 2856, 2857,
- 2858, 2847, 2846,
- 2846, 2857, 2858,
- 2859, 2848, 2847,
- 2847, 2858, 2859,
- 2860, 2861, 2862,
- 2862, 2759, 2860,
- 2863, 2864, 2861,
- 2861, 2860, 2863,
- 2865, 2866, 2864,
- 2864, 2863, 2865,
- 2867, 2868, 2866,
- 2866, 2865, 2867,
- 2869, 2870, 2868,
- 2868, 2867, 2869,
- 2871, 2872, 2870,
- 2870, 2869, 2871,
- 2873, 2874, 2872,
- 2872, 2871, 2873,
- 2875, 2876, 2874,
- 2874, 2873, 2875,
- 2877, 2878, 2876,
- 2876, 2875, 2877,
- 2879, 2880, 2878,
- 2878, 2877, 2879,
- 2881, 2860, 2759,
- 2759, 2882, 2881,
- 2883, 2863, 2860,
- 2860, 2881, 2883,
- 2884, 2865, 2863,
- 2863, 2883, 2884,
- 2885, 2867, 2865,
- 2865, 2884, 2885,
- 2886, 2869, 2867,
- 2867, 2885, 2886,
- 2887, 2871, 2869,
- 2869, 2886, 2887,
- 2888, 2873, 2871,
- 2871, 2887, 2888,
- 2889, 2875, 2873,
- 2873, 2888, 2889,
- 2890, 2877, 2875,
- 2875, 2889, 2890,
- 2891, 2879, 2877,
- 2877, 2890, 2891,
- 2892, 2881, 2882,
- 2882, 2893, 2892,
- 2894, 2883, 2881,
- 2881, 2892, 2894,
- 2895, 2884, 2883,
- 2883, 2894, 2895,
- 2896, 2885, 2884,
- 2884, 2895, 2896,
- 2897, 2886, 2885,
- 2885, 2896, 2897,
- 2898, 2887, 2886,
- 2886, 2897, 2898,
- 2899, 2888, 2887,
- 2887, 2898, 2899,
- 2900, 2889, 2888,
- 2888, 2899, 2900,
- 2901, 2890, 2889,
- 2889, 2900, 2901,
- 2902, 2891, 2890,
- 2890, 2901, 2902,
- 2903, 2892, 2893,
- 2893, 2904, 2903,
- 2905, 2894, 2892,
- 2892, 2903, 2905,
- 2906, 2895, 2894,
- 2894, 2905, 2906,
- 2907, 2896, 2895,
- 2895, 2906, 2907,
- 2908, 2897, 2896,
- 2896, 2907, 2908,
- 2909, 2898, 2897,
- 2897, 2908, 2909,
- 2910, 2899, 2898,
- 2898, 2909, 2910,
- 2911, 2900, 2899,
- 2899, 2910, 2911,
- 2912, 2901, 2900,
- 2900, 2911, 2912,
- 2913, 2902, 2901,
- 2901, 2912, 2913,
- 2914, 2903, 2904,
- 2904, 2915, 2914,
- 2916, 2905, 2903,
- 2903, 2914, 2916,
- 2917, 2906, 2905,
- 2905, 2916, 2917,
- 2918, 2907, 2906,
- 2906, 2917, 2918,
- 2919, 2908, 2907,
- 2907, 2918, 2919,
- 2920, 2909, 2908,
- 2908, 2919, 2920,
- 2921, 2910, 2909,
- 2909, 2920, 2921,
- 2922, 2911, 2910,
- 2910, 2921, 2922,
- 2923, 2912, 2911,
- 2911, 2922, 2923,
- 2924, 2913, 2912,
- 2912, 2923, 2924,
- 2925, 2914, 2915,
- 2915, 2926, 2925,
- 2927, 2916, 2914,
- 2914, 2925, 2927,
- 2928, 2917, 2916,
- 2916, 2927, 2928,
- 2929, 2918, 2917,
- 2917, 2928, 2929,
- 2930, 2919, 2918,
- 2918, 2929, 2930,
- 2931, 2920, 2919,
- 2919, 2930, 2931,
- 2932, 2921, 2920,
- 2920, 2931, 2932,
- 2933, 2922, 2921,
- 2921, 2932, 2933,
- 2934, 2923, 2922,
- 2922, 2933, 2934,
- 2935, 2924, 2923,
- 2923, 2934, 2935,
- 2936, 2925, 2926,
- 2926, 2937, 2936,
- 2938, 2927, 2925,
- 2925, 2936, 2938,
- 2939, 2928, 2927,
- 2927, 2938, 2939,
- 2940, 2929, 2928,
- 2928, 2939, 2940,
- 2941, 2930, 2929,
- 2929, 2940, 2941,
- 2942, 2931, 2930,
- 2930, 2941, 2942,
- 2943, 2932, 2931,
- 2931, 2942, 2943,
- 2944, 2933, 2932,
- 2932, 2943, 2944,
- 2945, 2934, 2933,
- 2933, 2944, 2945,
- 2946, 2935, 2934,
- 2934, 2945, 2946,
- 2947, 2936, 2937,
- 2937, 2948, 2947,
- 2949, 2938, 2936,
- 2936, 2947, 2949,
- 2950, 2939, 2938,
- 2938, 2949, 2950,
- 2951, 2940, 2939,
- 2939, 2950, 2951,
- 2952, 2941, 2940,
- 2940, 2951, 2952,
- 2953, 2942, 2941,
- 2941, 2952, 2953,
- 2954, 2943, 2942,
- 2942, 2953, 2954,
- 2955, 2944, 2943,
- 2943, 2954, 2955,
- 2956, 2945, 2944,
- 2944, 2955, 2956,
- 2957, 2946, 2945,
- 2945, 2956, 2957,
- 2958, 2947, 2948,
- 2948, 2959, 2958,
- 2960, 2949, 2947,
- 2947, 2958, 2960,
- 2961, 2950, 2949,
- 2949, 2960, 2961,
- 2962, 2951, 2950,
- 2950, 2961, 2962,
- 2963, 2952, 2951,
- 2951, 2962, 2963,
- 2964, 2953, 2952,
- 2952, 2963, 2964,
- 2965, 2954, 2953,
- 2953, 2964, 2965,
- 2966, 2955, 2954,
- 2954, 2965, 2966,
- 2967, 2956, 2955,
- 2955, 2966, 2967,
- 2968, 2957, 2956,
- 2956, 2967, 2968,
- 2969, 2958, 2959,
- 2959, 2970, 2969,
- 2971, 2960, 2958,
- 2958, 2969, 2971,
- 2972, 2961, 2960,
- 2960, 2971, 2972,
- 2973, 2962, 2961,
- 2961, 2972, 2973,
- 2974, 2963, 2962,
- 2962, 2973, 2974,
- 2975, 2964, 2963,
- 2963, 2974, 2975,
- 2976, 2965, 2964,
- 2964, 2975, 2976,
- 2977, 2966, 2965,
- 2965, 2976, 2977,
- 2978, 2967, 2966,
- 2966, 2977, 2978,
- 2979, 2968, 2967,
- 2967, 2978, 2979,
- 2980, 2981, 2982,
- 2982, 2879, 2980,
- 2983, 2984, 2981,
- 2981, 2980, 2983,
- 2985, 2986, 2984,
- 2984, 2983, 2985,
- 2987, 2988, 2986,
- 2986, 2985, 2987,
- 2989, 2990, 2988,
- 2988, 2987, 2989,
- 2991, 2992, 2990,
- 2990, 2989, 2991,
- 2993, 2994, 2992,
- 2992, 2991, 2993,
- 2995, 2996, 2994,
- 2994, 2993, 2995,
- 2997, 2998, 2996,
- 2996, 2995, 2997,
- 2999, 3000, 2998,
- 2998, 2997, 2999,
- 3001, 2980, 2879,
- 2879, 3002, 3001,
- 3003, 2983, 2980,
- 2980, 3001, 3003,
- 3004, 2985, 2983,
- 2983, 3003, 3004,
- 3005, 2987, 2985,
- 2985, 3004, 3005,
- 3006, 2989, 2987,
- 2987, 3005, 3006,
- 3007, 2991, 2989,
- 2989, 3006, 3007,
- 3008, 2993, 2991,
- 2991, 3007, 3008,
- 3009, 2995, 2993,
- 2993, 3008, 3009,
- 3010, 2997, 2995,
- 2995, 3009, 3010,
- 3011, 2999, 2997,
- 2997, 3010, 3011,
- 3012, 3001, 3002,
- 3002, 3013, 3012,
- 3014, 3003, 3001,
- 3001, 3012, 3014,
- 3015, 3004, 3003,
- 3003, 3014, 3015,
- 3016, 3005, 3004,
- 3004, 3015, 3016,
- 3017, 3006, 3005,
- 3005, 3016, 3017,
- 3018, 3007, 3006,
- 3006, 3017, 3018,
- 3019, 3008, 3007,
- 3007, 3018, 3019,
- 3020, 3009, 3008,
- 3008, 3019, 3020,
- 3021, 3010, 3009,
- 3009, 3020, 3021,
- 3022, 3011, 3010,
- 3010, 3021, 3022,
- 3023, 3012, 3013,
- 3013, 3024, 3023,
- 3025, 3014, 3012,
- 3012, 3023, 3025,
- 3026, 3015, 3014,
- 3014, 3025, 3026,
- 3027, 3016, 3015,
- 3015, 3026, 3027,
- 3028, 3017, 3016,
- 3016, 3027, 3028,
- 3029, 3018, 3017,
- 3017, 3028, 3029,
- 3030, 3019, 3018,
- 3018, 3029, 3030,
- 3031, 3020, 3019,
- 3019, 3030, 3031,
- 3032, 3021, 3020,
- 3020, 3031, 3032,
- 3033, 3022, 3021,
- 3021, 3032, 3033,
- 3034, 3023, 3024,
- 3024, 3035, 3034,
- 3036, 3025, 3023,
- 3023, 3034, 3036,
- 3037, 3026, 3025,
- 3025, 3036, 3037,
- 3038, 3027, 3026,
- 3026, 3037, 3038,
- 3039, 3028, 3027,
- 3027, 3038, 3039,
- 3040, 3029, 3028,
- 3028, 3039, 3040,
- 3041, 3030, 3029,
- 3029, 3040, 3041,
- 3042, 3031, 3030,
- 3030, 3041, 3042,
- 3043, 3032, 3031,
- 3031, 3042, 3043,
- 3044, 3033, 3032,
- 3032, 3043, 3044,
- 3045, 3034, 3035,
- 3035, 3046, 3045,
- 3047, 3036, 3034,
- 3034, 3045, 3047,
- 3048, 3037, 3036,
- 3036, 3047, 3048,
- 3049, 3038, 3037,
- 3037, 3048, 3049,
- 3050, 3039, 3038,
- 3038, 3049, 3050,
- 3051, 3040, 3039,
- 3039, 3050, 3051,
- 3052, 3041, 3040,
- 3040, 3051, 3052,
- 3053, 3042, 3041,
- 3041, 3052, 3053,
- 3054, 3043, 3042,
- 3042, 3053, 3054,
- 3055, 3044, 3043,
- 3043, 3054, 3055,
- 3056, 3045, 3046,
- 3046, 3057, 3056,
- 3058, 3047, 3045,
- 3045, 3056, 3058,
- 3059, 3048, 3047,
- 3047, 3058, 3059,
- 3060, 3049, 3048,
- 3048, 3059, 3060,
- 3061, 3050, 3049,
- 3049, 3060, 3061,
- 3062, 3051, 3050,
- 3050, 3061, 3062,
- 3063, 3052, 3051,
- 3051, 3062, 3063,
- 3064, 3053, 3052,
- 3052, 3063, 3064,
- 3065, 3054, 3053,
- 3053, 3064, 3065,
- 3066, 3055, 3054,
- 3054, 3065, 3066,
- 3067, 3056, 3057,
- 3057, 3068, 3067,
- 3069, 3058, 3056,
- 3056, 3067, 3069,
- 3070, 3059, 3058,
- 3058, 3069, 3070,
- 3071, 3060, 3059,
- 3059, 3070, 3071,
- 3072, 3061, 3060,
- 3060, 3071, 3072,
- 3073, 3062, 3061,
- 3061, 3072, 3073,
- 3074, 3063, 3062,
- 3062, 3073, 3074,
- 3075, 3064, 3063,
- 3063, 3074, 3075,
- 3076, 3065, 3064,
- 3064, 3075, 3076,
- 3077, 3066, 3065,
- 3065, 3076, 3077,
- 3078, 3067, 3068,
- 3068, 3079, 3078,
- 3080, 3069, 3067,
- 3067, 3078, 3080,
- 3081, 3070, 3069,
- 3069, 3080, 3081,
- 3082, 3071, 3070,
- 3070, 3081, 3082,
- 3083, 3072, 3071,
- 3071, 3082, 3083,
- 3084, 3073, 3072,
- 3072, 3083, 3084,
- 3085, 3074, 3073,
- 3073, 3084, 3085,
- 3086, 3075, 3074,
- 3074, 3085, 3086,
- 3087, 3076, 3075,
- 3075, 3086, 3087,
- 3088, 3077, 3076,
- 3076, 3087, 3088,
- 3089, 3078, 3079,
- 3079, 3090, 3089,
- 3091, 3080, 3078,
- 3078, 3089, 3091,
- 3092, 3081, 3080,
- 3080, 3091, 3092,
- 3093, 3082, 3081,
- 3081, 3092, 3093,
- 3094, 3083, 3082,
- 3082, 3093, 3094,
- 3095, 3084, 3083,
- 3083, 3094, 3095,
- 3096, 3085, 3084,
- 3084, 3095, 3096,
- 3097, 3086, 3085,
- 3085, 3096, 3097,
- 3098, 3087, 3086,
- 3086, 3097, 3098,
- 3099, 3088, 3087,
- 3087, 3098, 3099,
- 3100, 3101, 3102,
- 3102, 2999, 3100,
- 3103, 3104, 3101,
- 3101, 3100, 3103,
- 3105, 3106, 3104,
- 3104, 3103, 3105,
- 3107, 3108, 3106,
- 3106, 3105, 3107,
- 3109, 3110, 3108,
- 3108, 3107, 3109,
- 3111, 3112, 3110,
- 3110, 3109, 3111,
- 3113, 3114, 3112,
- 3112, 3111, 3113,
- 3115, 3116, 3114,
- 3114, 3113, 3115,
- 3117, 3118, 3116,
- 3116, 3115, 3117,
- 2742, 3119, 3118,
- 3118, 3117, 2742,
- 3120, 3100, 2999,
- 2999, 3121, 3120,
- 3122, 3103, 3100,
- 3100, 3120, 3122,
- 3123, 3105, 3103,
- 3103, 3122, 3123,
- 3124, 3107, 3105,
- 3105, 3123, 3124,
- 3125, 3109, 3107,
- 3107, 3124, 3125,
- 3126, 3111, 3109,
- 3109, 3125, 3126,
- 3127, 3113, 3111,
- 3111, 3126, 3127,
- 3128, 3115, 3113,
- 3113, 3127, 3128,
- 3129, 3117, 3115,
- 3115, 3128, 3129,
- 3130, 2742, 3117,
- 3117, 3129, 3130,
- 3131, 3120, 3121,
- 3121, 3132, 3131,
- 3133, 3122, 3120,
- 3120, 3131, 3133,
- 3134, 3123, 3122,
- 3122, 3133, 3134,
- 3135, 3124, 3123,
- 3123, 3134, 3135,
- 3136, 3125, 3124,
- 3124, 3135, 3136,
- 3137, 3126, 3125,
- 3125, 3136, 3137,
- 3138, 3127, 3126,
- 3126, 3137, 3138,
- 3139, 3128, 3127,
- 3127, 3138, 3139,
- 3140, 3129, 3128,
- 3128, 3139, 3140,
- 3141, 3130, 3129,
- 3129, 3140, 3141,
- 3142, 3131, 3132,
- 3132, 3143, 3142,
- 3144, 3133, 3131,
- 3131, 3142, 3144,
- 3145, 3134, 3133,
- 3133, 3144, 3145,
- 3146, 3135, 3134,
- 3134, 3145, 3146,
- 3147, 3136, 3135,
- 3135, 3146, 3147,
- 3148, 3137, 3136,
- 3136, 3147, 3148,
- 3149, 3138, 3137,
- 3137, 3148, 3149,
- 3150, 3139, 3138,
- 3138, 3149, 3150,
- 3151, 3140, 3139,
- 3139, 3150, 3151,
- 3152, 3141, 3140,
- 3140, 3151, 3152,
- 3153, 3142, 3143,
- 3143, 3154, 3153,
- 3155, 3144, 3142,
- 3142, 3153, 3155,
- 3156, 3145, 3144,
- 3144, 3155, 3156,
- 3157, 3146, 3145,
- 3145, 3156, 3157,
- 3158, 3147, 3146,
- 3146, 3157, 3158,
- 3159, 3148, 3147,
- 3147, 3158, 3159,
- 3160, 3149, 3148,
- 3148, 3159, 3160,
- 3161, 3150, 3149,
- 3149, 3160, 3161,
- 3162, 3151, 3150,
- 3150, 3161, 3162,
- 3163, 3152, 3151,
- 3151, 3162, 3163,
- 3164, 3153, 3154,
- 3154, 3165, 3164,
- 3166, 3155, 3153,
- 3153, 3164, 3166,
- 3167, 3156, 3155,
- 3155, 3166, 3167,
- 3168, 3157, 3156,
- 3156, 3167, 3168,
- 3169, 3158, 3157,
- 3157, 3168, 3169,
- 3170, 3159, 3158,
- 3158, 3169, 3170,
- 3171, 3160, 3159,
- 3159, 3170, 3171,
- 3172, 3161, 3160,
- 3160, 3171, 3172,
- 3173, 3162, 3161,
- 3161, 3172, 3173,
- 3174, 3163, 3162,
- 3162, 3173, 3174,
- 3175, 3164, 3165,
- 3165, 3176, 3175,
- 3177, 3166, 3164,
- 3164, 3175, 3177,
- 3178, 3167, 3166,
- 3166, 3177, 3178,
- 3179, 3168, 3167,
- 3167, 3178, 3179,
- 3180, 3169, 3168,
- 3168, 3179, 3180,
- 3181, 3170, 3169,
- 3169, 3180, 3181,
- 3182, 3171, 3170,
- 3170, 3181, 3182,
- 3183, 3172, 3171,
- 3171, 3182, 3183,
- 3184, 3173, 3172,
- 3172, 3183, 3184,
- 3185, 3174, 3173,
- 3173, 3184, 3185,
- 3186, 3175, 3176,
- 3176, 3187, 3186,
- 3188, 3177, 3175,
- 3175, 3186, 3188,
- 3189, 3178, 3177,
- 3177, 3188, 3189,
- 3190, 3179, 3178,
- 3178, 3189, 3190,
- 3191, 3180, 3179,
- 3179, 3190, 3191,
- 3192, 3181, 3180,
- 3180, 3191, 3192,
- 3193, 3182, 3181,
- 3181, 3192, 3193,
- 3194, 3183, 3182,
- 3182, 3193, 3194,
- 3195, 3184, 3183,
- 3183, 3194, 3195,
- 3196, 3185, 3184,
- 3184, 3195, 3196,
- 3197, 3186, 3187,
- 3187, 3198, 3197,
- 3199, 3188, 3186,
- 3186, 3197, 3199,
- 3200, 3189, 3188,
- 3188, 3199, 3200,
- 3201, 3190, 3189,
- 3189, 3200, 3201,
- 3202, 3191, 3190,
- 3190, 3201, 3202,
- 3203, 3192, 3191,
- 3191, 3202, 3203,
- 3204, 3193, 3192,
- 3192, 3203, 3204,
- 3205, 3194, 3193,
- 3193, 3204, 3205,
- 3206, 3195, 3194,
- 3194, 3205, 3206,
- 3207, 3196, 3195,
- 3195, 3206, 3207,
- 3208, 3197, 3198,
- 3198, 3209, 3208,
- 3210, 3199, 3197,
- 3197, 3208, 3210,
- 3211, 3200, 3199,
- 3199, 3210, 3211,
- 3212, 3201, 3200,
- 3200, 3211, 3212,
- 3213, 3202, 3201,
- 3201, 3212, 3213,
- 3214, 3203, 3202,
- 3202, 3213, 3214,
- 3215, 3204, 3203,
- 3203, 3214, 3215,
- 3216, 3205, 3204,
- 3204, 3215, 3216,
- 3217, 3206, 3205,
- 3205, 3216, 3217,
- 3218, 3207, 3206,
- 3206, 3217, 3218,
- 3219, 3220, 3221,
- 3219, 3221, 3222,
- 3219, 3222, 3223,
- 3219, 3223, 3224,
- 3219, 3224, 3225,
- 3219, 3225, 3226,
- 3219, 3226, 3227,
- 3219, 3227, 3228,
- 3219, 3228, 3229,
- 3219, 3229, 3230,
- 3231, 3221, 3220,
- 3220, 3232, 3231,
- 3233, 3222, 3221,
- 3221, 3231, 3233,
- 3234, 3223, 3222,
- 3222, 3233, 3234,
- 3235, 3224, 3223,
- 3223, 3234, 3235,
- 3236, 3225, 3224,
- 3224, 3235, 3236,
- 3237, 3226, 3225,
- 3225, 3236, 3237,
- 3238, 3227, 3226,
- 3226, 3237, 3238,
- 3239, 3228, 3227,
- 3227, 3238, 3239,
- 3240, 3229, 3228,
- 3228, 3239, 3240,
- 3241, 3230, 3229,
- 3229, 3240, 3241,
- 3242, 3231, 3232,
- 3232, 3243, 3242,
- 3244, 3233, 3231,
- 3231, 3242, 3244,
- 3245, 3234, 3233,
- 3233, 3244, 3245,
- 3246, 3235, 3234,
- 3234, 3245, 3246,
- 3247, 3236, 3235,
- 3235, 3246, 3247,
- 3248, 3237, 3236,
- 3236, 3247, 3248,
- 3249, 3238, 3237,
- 3237, 3248, 3249,
- 3250, 3239, 3238,
- 3238, 3249, 3250,
- 3251, 3240, 3239,
- 3239, 3250, 3251,
- 3252, 3241, 3240,
- 3240, 3251, 3252,
- 3253, 3242, 3243,
- 3243, 3254, 3253,
- 3255, 3244, 3242,
- 3242, 3253, 3255,
- 3256, 3245, 3244,
- 3244, 3255, 3256,
- 3257, 3246, 3245,
- 3245, 3256, 3257,
- 3258, 3247, 3246,
- 3246, 3257, 3258,
- 3259, 3248, 3247,
- 3247, 3258, 3259,
- 3260, 3249, 3248,
- 3248, 3259, 3260,
- 3261, 3250, 3249,
- 3249, 3260, 3261,
- 3262, 3251, 3250,
- 3250, 3261, 3262,
- 3263, 3252, 3251,
- 3251, 3262, 3263,
- 3264, 3253, 3254,
- 3254, 3265, 3264,
- 3266, 3255, 3253,
- 3253, 3264, 3266,
- 3267, 3256, 3255,
- 3255, 3266, 3267,
- 3268, 3257, 3256,
- 3256, 3267, 3268,
- 3269, 3258, 3257,
- 3257, 3268, 3269,
- 3270, 3259, 3258,
- 3258, 3269, 3270,
- 3271, 3260, 3259,
- 3259, 3270, 3271,
- 3272, 3261, 3260,
- 3260, 3271, 3272,
- 3273, 3262, 3261,
- 3261, 3272, 3273,
- 3274, 3263, 3262,
- 3262, 3273, 3274,
- 3275, 3264, 3265,
- 3265, 3276, 3275,
- 3277, 3266, 3264,
- 3264, 3275, 3277,
- 3278, 3267, 3266,
- 3266, 3277, 3278,
- 3279, 3268, 3267,
- 3267, 3278, 3279,
- 3280, 3269, 3268,
- 3268, 3279, 3280,
- 3281, 3270, 3269,
- 3269, 3280, 3281,
- 3282, 3271, 3270,
- 3270, 3281, 3282,
- 3283, 3272, 3271,
- 3271, 3282, 3283,
- 3284, 3273, 3272,
- 3272, 3283, 3284,
- 3285, 3274, 3273,
- 3273, 3284, 3285,
- 3286, 3275, 3276,
- 3276, 3287, 3286,
- 3288, 3277, 3275,
- 3275, 3286, 3288,
- 3289, 3278, 3277,
- 3277, 3288, 3289,
- 3290, 3279, 3278,
- 3278, 3289, 3290,
- 3291, 3280, 3279,
- 3279, 3290, 3291,
- 3292, 3281, 3280,
- 3280, 3291, 3292,
- 3293, 3282, 3281,
- 3281, 3292, 3293,
- 3294, 3283, 3282,
- 3282, 3293, 3294,
- 3295, 3284, 3283,
- 3283, 3294, 3295,
- 3296, 3285, 3284,
- 3284, 3295, 3296,
- 3297, 3286, 3287,
- 3287, 3298, 3297,
- 3299, 3288, 3286,
- 3286, 3297, 3299,
- 3300, 3289, 3288,
- 3288, 3299, 3300,
- 3301, 3290, 3289,
- 3289, 3300, 3301,
- 3302, 3291, 3290,
- 3290, 3301, 3302,
- 3303, 3292, 3291,
- 3291, 3302, 3303,
- 3304, 3293, 3292,
- 3292, 3303, 3304,
- 3305, 3294, 3293,
- 3293, 3304, 3305,
- 3306, 3295, 3294,
- 3294, 3305, 3306,
- 3307, 3296, 3295,
- 3295, 3306, 3307,
- 3308, 3297, 3298,
- 3298, 3309, 3308,
- 3310, 3299, 3297,
- 3297, 3308, 3310,
- 3311, 3300, 3299,
- 3299, 3310, 3311,
- 3312, 3301, 3300,
- 3300, 3311, 3312,
- 3313, 3302, 3301,
- 3301, 3312, 3313,
- 3314, 3303, 3302,
- 3302, 3313, 3314,
- 3315, 3304, 3303,
- 3303, 3314, 3315,
- 3316, 3305, 3304,
- 3304, 3315, 3316,
- 3317, 3306, 3305,
- 3305, 3316, 3317,
- 3318, 3307, 3306,
- 3306, 3317, 3318,
- 3319, 3308, 3309,
- 3309, 1391, 3319,
- 3320, 3310, 3308,
- 3308, 3319, 3320,
- 3321, 3311, 3310,
- 3310, 3320, 3321,
- 3322, 3312, 3311,
- 3311, 3321, 3322,
- 1386, 3313, 3312,
- 3312, 3322, 1386,
- 3323, 3314, 3313,
- 3313, 1386, 3323,
- 3324, 3315, 3314,
- 3314, 3323, 3324,
- 3325, 3316, 3315,
- 3315, 3324, 3325,
- 3326, 3317, 3316,
- 3316, 3325, 3326,
- 1273, 3318, 3317,
- 3317, 3326, 1273,
- 3219, 3327, 3328,
- 3219, 3328, 3329,
- 3219, 3329, 3330,
- 3219, 3330, 3331,
- 3219, 3331, 3332,
- 3219, 3332, 3333,
- 3219, 3333, 3334,
- 3219, 3334, 3335,
- 3219, 3335, 3336,
- 3219, 3336, 3337,
- 3338, 3328, 3327,
- 3327, 3241, 3338,
- 3339, 3329, 3328,
- 3328, 3338, 3339,
- 3340, 3330, 3329,
- 3329, 3339, 3340,
- 3341, 3331, 3330,
- 3330, 3340, 3341,
- 3342, 3332, 3331,
- 3331, 3341, 3342,
- 3343, 3333, 3332,
- 3332, 3342, 3343,
- 3344, 3334, 3333,
- 3333, 3343, 3344,
- 3345, 3335, 3334,
- 3334, 3344, 3345,
- 3346, 3336, 3335,
- 3335, 3345, 3346,
- 3347, 3337, 3336,
- 3336, 3346, 3347,
- 3348, 3338, 3241,
- 3241, 3349, 3348,
- 3350, 3339, 3338,
- 3338, 3348, 3350,
- 3351, 3340, 3339,
- 3339, 3350, 3351,
- 3352, 3341, 3340,
- 3340, 3351, 3352,
- 3353, 3342, 3341,
- 3341, 3352, 3353,
- 3354, 3343, 3342,
- 3342, 3353, 3354,
- 3355, 3344, 3343,
- 3343, 3354, 3355,
- 3356, 3345, 3344,
- 3344, 3355, 3356,
- 3357, 3346, 3345,
- 3345, 3356, 3357,
- 3358, 3347, 3346,
- 3346, 3357, 3358,
- 3359, 3348, 3349,
- 3349, 3360, 3359,
- 3361, 3350, 3348,
- 3348, 3359, 3361,
- 3362, 3351, 3350,
- 3350, 3361, 3362,
- 3363, 3352, 3351,
- 3351, 3362, 3363,
- 3364, 3353, 3352,
- 3352, 3363, 3364,
- 3365, 3354, 3353,
- 3353, 3364, 3365,
- 3366, 3355, 3354,
- 3354, 3365, 3366,
- 3367, 3356, 3355,
- 3355, 3366, 3367,
- 3368, 3357, 3356,
- 3356, 3367, 3368,
- 3369, 3358, 3357,
- 3357, 3368, 3369,
- 3370, 3359, 3360,
- 3360, 3371, 3370,
- 3372, 3361, 3359,
- 3359, 3370, 3372,
- 3373, 3362, 3361,
- 3361, 3372, 3373,
- 3374, 3363, 3362,
- 3362, 3373, 3374,
- 3375, 3364, 3363,
- 3363, 3374, 3375,
- 3376, 3365, 3364,
- 3364, 3375, 3376,
- 3377, 3366, 3365,
- 3365, 3376, 3377,
- 3378, 3367, 3366,
- 3366, 3377, 3378,
- 3379, 3368, 3367,
- 3367, 3378, 3379,
- 3380, 3369, 3368,
- 3368, 3379, 3380,
- 3381, 3370, 3371,
- 3371, 3382, 3381,
- 3383, 3372, 3370,
- 3370, 3381, 3383,
- 3384, 3373, 3372,
- 3372, 3383, 3384,
- 3385, 3374, 3373,
- 3373, 3384, 3385,
- 3386, 3375, 3374,
- 3374, 3385, 3386,
- 3387, 3376, 3375,
- 3375, 3386, 3387,
- 3388, 3377, 3376,
- 3376, 3387, 3388,
- 3389, 3378, 3377,
- 3377, 3388, 3389,
- 3390, 3379, 3378,
- 3378, 3389, 3390,
- 3391, 3380, 3379,
- 3379, 3390, 3391,
- 3392, 3381, 3382,
- 3382, 3393, 3392,
- 3394, 3383, 3381,
- 3381, 3392, 3394,
- 3395, 3384, 3383,
- 3383, 3394, 3395,
- 3396, 3385, 3384,
- 3384, 3395, 3396,
- 3397, 3386, 3385,
- 3385, 3396, 3397,
- 3398, 3387, 3386,
- 3386, 3397, 3398,
- 3399, 3388, 3387,
- 3387, 3398, 3399,
- 3400, 3389, 3388,
- 3388, 3399, 3400,
- 3401, 3390, 3389,
- 3389, 3400, 3401,
- 3402, 3391, 3390,
- 3390, 3401, 3402,
- 3403, 3392, 3393,
- 3393, 3404, 3403,
- 3405, 3394, 3392,
- 3392, 3403, 3405,
- 3406, 3395, 3394,
- 3394, 3405, 3406,
- 3407, 3396, 3395,
- 3395, 3406, 3407,
- 3408, 3397, 3396,
- 3396, 3407, 3408,
- 3409, 3398, 3397,
- 3397, 3408, 3409,
- 3410, 3399, 3398,
- 3398, 3409, 3410,
- 3411, 3400, 3399,
- 3399, 3410, 3411,
- 3412, 3401, 3400,
- 3400, 3411, 3412,
- 3413, 3402, 3401,
- 3401, 3412, 3413,
- 3414, 3403, 3404,
- 3404, 3415, 3414,
- 3416, 3405, 3403,
- 3403, 3414, 3416,
- 3417, 3406, 3405,
- 3405, 3416, 3417,
- 3418, 3407, 3406,
- 3406, 3417, 3418,
- 3419, 3408, 3407,
- 3407, 3418, 3419,
- 3420, 3409, 3408,
- 3408, 3419, 3420,
- 3421, 3410, 3409,
- 3409, 3420, 3421,
- 3422, 3411, 3410,
- 3410, 3421, 3422,
- 3423, 3412, 3411,
- 3411, 3422, 3423,
- 3424, 3413, 3412,
- 3412, 3423, 3424,
- 3425, 3414, 3415,
- 3415, 1273, 3425,
- 3426, 3416, 3414,
- 3414, 3425, 3426,
- 3427, 3417, 3416,
- 3416, 3426, 3427,
- 3428, 3418, 3417,
- 3417, 3427, 3428,
- 1268, 3419, 3418,
- 3418, 3428, 1268,
- 3429, 3420, 3419,
- 3419, 1268, 3429,
- 3430, 3421, 3420,
- 3420, 3429, 3430,
- 3431, 3422, 3421,
- 3421, 3430, 3431,
- 3432, 3423, 3422,
- 3422, 3431, 3432,
- 1155, 3424, 3423,
- 3423, 3432, 1155,
- 3219, 3433, 3434,
- 3219, 3434, 3435,
- 3219, 3435, 3436,
- 3219, 3436, 3437,
- 3219, 3437, 3438,
- 3219, 3438, 3439,
- 3219, 3439, 3440,
- 3219, 3440, 3441,
- 3219, 3441, 3442,
- 3219, 3442, 3443,
- 3444, 3434, 3433,
- 3433, 3347, 3444,
- 3445, 3435, 3434,
- 3434, 3444, 3445,
- 3446, 3436, 3435,
- 3435, 3445, 3446,
- 3447, 3437, 3436,
- 3436, 3446, 3447,
- 3448, 3438, 3437,
- 3437, 3447, 3448,
- 3449, 3439, 3438,
- 3438, 3448, 3449,
- 3450, 3440, 3439,
- 3439, 3449, 3450,
- 3451, 3441, 3440,
- 3440, 3450, 3451,
- 3452, 3442, 3441,
- 3441, 3451, 3452,
- 3453, 3443, 3442,
- 3442, 3452, 3453,
- 3454, 3444, 3347,
- 3347, 3455, 3454,
- 3456, 3445, 3444,
- 3444, 3454, 3456,
- 3457, 3446, 3445,
- 3445, 3456, 3457,
- 3458, 3447, 3446,
- 3446, 3457, 3458,
- 3459, 3448, 3447,
- 3447, 3458, 3459,
- 3460, 3449, 3448,
- 3448, 3459, 3460,
- 3461, 3450, 3449,
- 3449, 3460, 3461,
- 3462, 3451, 3450,
- 3450, 3461, 3462,
- 3463, 3452, 3451,
- 3451, 3462, 3463,
- 3464, 3453, 3452,
- 3452, 3463, 3464,
- 3465, 3454, 3455,
- 3455, 3466, 3465,
- 3467, 3456, 3454,
- 3454, 3465, 3467,
- 3468, 3457, 3456,
- 3456, 3467, 3468,
- 3469, 3458, 3457,
- 3457, 3468, 3469,
- 3470, 3459, 3458,
- 3458, 3469, 3470,
- 3471, 3460, 3459,
- 3459, 3470, 3471,
- 3472, 3461, 3460,
- 3460, 3471, 3472,
- 3473, 3462, 3461,
- 3461, 3472, 3473,
- 3474, 3463, 3462,
- 3462, 3473, 3474,
- 3475, 3464, 3463,
- 3463, 3474, 3475,
- 3476, 3465, 3466,
- 3466, 3477, 3476,
- 3478, 3467, 3465,
- 3465, 3476, 3478,
- 3479, 3468, 3467,
- 3467, 3478, 3479,
- 3480, 3469, 3468,
- 3468, 3479, 3480,
- 3481, 3470, 3469,
- 3469, 3480, 3481,
- 3482, 3471, 3470,
- 3470, 3481, 3482,
- 3483, 3472, 3471,
- 3471, 3482, 3483,
- 3484, 3473, 3472,
- 3472, 3483, 3484,
- 3485, 3474, 3473,
- 3473, 3484, 3485,
- 3486, 3475, 3474,
- 3474, 3485, 3486,
- 3487, 3476, 3477,
- 3477, 3488, 3487,
- 3489, 3478, 3476,
- 3476, 3487, 3489,
- 3490, 3479, 3478,
- 3478, 3489, 3490,
- 3491, 3480, 3479,
- 3479, 3490, 3491,
- 3492, 3481, 3480,
- 3480, 3491, 3492,
- 3493, 3482, 3481,
- 3481, 3492, 3493,
- 3494, 3483, 3482,
- 3482, 3493, 3494,
- 3495, 3484, 3483,
- 3483, 3494, 3495,
- 3496, 3485, 3484,
- 3484, 3495, 3496,
- 3497, 3486, 3485,
- 3485, 3496, 3497,
- 3498, 3487, 3488,
- 3488, 3499, 3498,
- 3500, 3489, 3487,
- 3487, 3498, 3500,
- 3501, 3490, 3489,
- 3489, 3500, 3501,
- 3502, 3491, 3490,
- 3490, 3501, 3502,
- 3503, 3492, 3491,
- 3491, 3502, 3503,
- 3504, 3493, 3492,
- 3492, 3503, 3504,
- 3505, 3494, 3493,
- 3493, 3504, 3505,
- 3506, 3495, 3494,
- 3494, 3505, 3506,
- 3507, 3496, 3495,
- 3495, 3506, 3507,
- 3508, 3497, 3496,
- 3496, 3507, 3508,
- 3509, 3498, 3499,
- 3499, 3510, 3509,
- 3511, 3500, 3498,
- 3498, 3509, 3511,
- 3512, 3501, 3500,
- 3500, 3511, 3512,
- 3513, 3502, 3501,
- 3501, 3512, 3513,
- 3514, 3503, 3502,
- 3502, 3513, 3514,
- 3515, 3504, 3503,
- 3503, 3514, 3515,
- 3516, 3505, 3504,
- 3504, 3515, 3516,
- 3517, 3506, 3505,
- 3505, 3516, 3517,
- 3518, 3507, 3506,
- 3506, 3517, 3518,
- 3519, 3508, 3507,
- 3507, 3518, 3519,
- 3520, 3509, 3510,
- 3510, 3521, 3520,
- 3522, 3511, 3509,
- 3509, 3520, 3522,
- 3523, 3512, 3511,
- 3511, 3522, 3523,
- 3524, 3513, 3512,
- 3512, 3523, 3524,
- 3525, 3514, 3513,
- 3513, 3524, 3525,
- 3526, 3515, 3514,
- 3514, 3525, 3526,
- 3527, 3516, 3515,
- 3515, 3526, 3527,
- 3528, 3517, 3516,
- 3516, 3527, 3528,
- 3529, 3518, 3517,
- 3517, 3528, 3529,
- 3530, 3519, 3518,
- 3518, 3529, 3530,
- 3531, 3520, 3521,
- 3521, 1155, 3531,
- 3532, 3522, 3520,
- 3520, 3531, 3532,
- 3533, 3523, 3522,
- 3522, 3532, 3533,
- 3534, 3524, 3523,
- 3523, 3533, 3534,
- 1150, 3525, 3524,
- 3524, 3534, 1150,
- 3535, 3526, 3525,
- 3525, 1150, 3535,
- 3536, 3527, 3526,
- 3526, 3535, 3536,
- 3537, 3528, 3527,
- 3527, 3536, 3537,
- 3538, 3529, 3528,
- 3528, 3537, 3538,
- 1037, 3530, 3529,
- 3529, 3538, 1037,
- 3219, 3539, 3540,
- 3219, 3540, 3541,
- 3219, 3541, 3542,
- 3219, 3542, 3543,
- 3219, 3543, 3544,
- 3219, 3544, 3545,
- 3219, 3545, 3546,
- 3219, 3546, 3547,
- 3219, 3547, 3548,
- 3219, 3548, 3549,
- 3550, 3540, 3539,
- 3539, 3453, 3550,
- 3551, 3541, 3540,
- 3540, 3550, 3551,
- 3552, 3542, 3541,
- 3541, 3551, 3552,
- 3553, 3543, 3542,
- 3542, 3552, 3553,
- 3554, 3544, 3543,
- 3543, 3553, 3554,
- 3555, 3545, 3544,
- 3544, 3554, 3555,
- 3556, 3546, 3545,
- 3545, 3555, 3556,
- 3557, 3547, 3546,
- 3546, 3556, 3557,
- 3558, 3548, 3547,
- 3547, 3557, 3558,
- 3232, 3549, 3548,
- 3548, 3558, 3232,
- 3559, 3550, 3453,
- 3453, 3560, 3559,
- 3561, 3551, 3550,
- 3550, 3559, 3561,
- 3562, 3552, 3551,
- 3551, 3561, 3562,
- 3563, 3553, 3552,
- 3552, 3562, 3563,
- 3564, 3554, 3553,
- 3553, 3563, 3564,
- 3565, 3555, 3554,
- 3554, 3564, 3565,
- 3566, 3556, 3555,
- 3555, 3565, 3566,
- 3567, 3557, 3556,
- 3556, 3566, 3567,
- 3568, 3558, 3557,
- 3557, 3567, 3568,
- 3569, 3232, 3558,
- 3558, 3568, 3569,
- 3570, 3559, 3560,
- 3560, 3571, 3570,
- 3572, 3561, 3559,
- 3559, 3570, 3572,
- 3573, 3562, 3561,
- 3561, 3572, 3573,
- 3574, 3563, 3562,
- 3562, 3573, 3574,
- 3575, 3564, 3563,
- 3563, 3574, 3575,
- 3576, 3565, 3564,
- 3564, 3575, 3576,
- 3577, 3566, 3565,
- 3565, 3576, 3577,
- 3578, 3567, 3566,
- 3566, 3577, 3578,
- 3579, 3568, 3567,
- 3567, 3578, 3579,
- 3580, 3569, 3568,
- 3568, 3579, 3580,
- 3581, 3570, 3571,
- 3571, 3582, 3581,
- 3583, 3572, 3570,
- 3570, 3581, 3583,
- 3584, 3573, 3572,
- 3572, 3583, 3584,
- 3585, 3574, 3573,
- 3573, 3584, 3585,
- 3586, 3575, 3574,
- 3574, 3585, 3586,
- 3587, 3576, 3575,
- 3575, 3586, 3587,
- 3588, 3577, 3576,
- 3576, 3587, 3588,
- 3589, 3578, 3577,
- 3577, 3588, 3589,
- 3590, 3579, 3578,
- 3578, 3589, 3590,
- 3591, 3580, 3579,
- 3579, 3590, 3591,
- 3592, 3581, 3582,
- 3582, 3593, 3592,
- 3594, 3583, 3581,
- 3581, 3592, 3594,
- 3595, 3584, 3583,
- 3583, 3594, 3595,
- 3596, 3585, 3584,
- 3584, 3595, 3596,
- 3597, 3586, 3585,
- 3585, 3596, 3597,
- 3598, 3587, 3586,
- 3586, 3597, 3598,
- 3599, 3588, 3587,
- 3587, 3598, 3599,
- 3600, 3589, 3588,
- 3588, 3599, 3600,
- 3601, 3590, 3589,
- 3589, 3600, 3601,
- 3602, 3591, 3590,
- 3590, 3601, 3602,
- 3603, 3592, 3593,
- 3593, 3604, 3603,
- 3605, 3594, 3592,
- 3592, 3603, 3605,
- 3606, 3595, 3594,
- 3594, 3605, 3606,
- 3607, 3596, 3595,
- 3595, 3606, 3607,
- 3608, 3597, 3596,
- 3596, 3607, 3608,
- 3609, 3598, 3597,
- 3597, 3608, 3609,
- 3610, 3599, 3598,
- 3598, 3609, 3610,
- 3611, 3600, 3599,
- 3599, 3610, 3611,
- 3612, 3601, 3600,
- 3600, 3611, 3612,
- 3613, 3602, 3601,
- 3601, 3612, 3613,
- 3614, 3603, 3604,
- 3604, 3615, 3614,
- 3616, 3605, 3603,
- 3603, 3614, 3616,
- 3617, 3606, 3605,
- 3605, 3616, 3617,
- 3618, 3607, 3606,
- 3606, 3617, 3618,
- 3619, 3608, 3607,
- 3607, 3618, 3619,
- 3620, 3609, 3608,
- 3608, 3619, 3620,
- 3621, 3610, 3609,
- 3609, 3620, 3621,
- 3622, 3611, 3610,
- 3610, 3621, 3622,
- 3623, 3612, 3611,
- 3611, 3622, 3623,
- 3624, 3613, 3612,
- 3612, 3623, 3624,
- 3625, 3614, 3615,
- 3615, 3626, 3625,
- 3627, 3616, 3614,
- 3614, 3625, 3627,
- 3628, 3617, 3616,
- 3616, 3627, 3628,
- 3629, 3618, 3617,
- 3617, 3628, 3629,
- 3630, 3619, 3618,
- 3618, 3629, 3630,
- 3631, 3620, 3619,
- 3619, 3630, 3631,
- 3632, 3621, 3620,
- 3620, 3631, 3632,
- 3633, 3622, 3621,
- 3621, 3632, 3633,
- 3634, 3623, 3622,
- 3622, 3633, 3634,
- 3635, 3624, 3623,
- 3623, 3634, 3635,
- 3636, 3625, 3626,
- 3626, 1037, 3636,
- 3637, 3627, 3625,
- 3625, 3636, 3637,
- 3638, 3628, 3627,
- 3627, 3637, 3638,
- 3639, 3629, 3628,
- 3628, 3638, 3639,
- 1032, 3630, 3629,
- 3629, 3639, 1032,
- 3640, 3631, 3630,
- 3630, 1032, 3640,
- 3641, 3632, 3631,
- 3631, 3640, 3641,
- 3642, 3633, 3632,
- 3632, 3641, 3642,
- 3643, 3634, 3633,
- 3633, 3642, 3643,
- 1391, 3635, 3634,
- 3634, 3643, 1391,
-};
-
-#endif // TEAPOT_H
diff --git a/Rend/demos/teapot/shaders/basic.slang b/Rend/demos/teapot/shaders/basic.slang
deleted file mode 100644
index cfbf48a..0000000
--- a/Rend/demos/teapot/shaders/basic.slang
+++ /dev/null
@@ -1,36 +0,0 @@
-struct VSInput {
- [[vk::location(0)]] float3 inPosition : POSITION;
- [[vk::location(1)]] float2 uv : TEXCOORD0;
-};
-
-struct VSOutput {
- float4 pos : SV_Position;
- float3 color;
- float2 uv;
-};
-
-struct PushConstants {
- float4x4 ubo;
-};
-
-[[vk::binding(0, 0)]] ConstantBuffer<float4x4> ubos[3];
-[[vk::binding(1, 0)]] Sampler2D test[3];
-
-[[vk::push_constant]]
-PushConstants pc;
-
-[shader("vertex")]
-VSOutput vertMain(VSInput input) {
- VSOutput output;
-
- output.pos = mul(pc.ubo, float4(input.inPosition, 1.0));
- output.color = input.inPosition;
- output.uv = input.uv;
- return output;
-}
-
-[shader("fragment")]
-float4 fragMain(VSOutput vertIn) : SV_TARGET {
- float4 col = test[0].Sample(vertIn.uv);
- return float4(col.rgb, 1.0);
-}
diff --git a/Rend/demos/teapot/shaders/texture.slang b/Rend/demos/teapot/shaders/texture.slang
deleted file mode 100644
index 0210b66..0000000
--- a/Rend/demos/teapot/shaders/texture.slang
+++ /dev/null
@@ -1,28 +0,0 @@
-struct VSInput {
- [[vk::location(0)]] float3 pos : POSITION;
- [[vk::location(1)]] float2 uv : TEXCOORD0;
- [[vk::location(2)]] float2 offset;
-};
-
-struct VSOutput {
- float4 pos : SV_Position;
- float2 uv;
-};
-
-[[vk::binding(0, 0)]] ConstantBuffer<float4x4> ubos[3];
-[[vk::binding(1, 0)]] Sampler2D test[3];
-
-[shader("vertex")]
-VSOutput vertMain(VSInput input) {
- VSOutput output;
- output.pos = float4(input.pos, 1.0);
- output.pos.x -= input.offset.x;
- output.pos.y -= input.offset.y;
- output.uv = input.uv;
- return output;
-}
-
-[shader("fragment")]
-float4 fragMain(VSOutput vertIn) : SV_TARGET {
- return test[0].Sample(vertIn.uv);
-}
diff --git a/Rend/demos/teapot/stb_image.h b/Rend/demos/teapot/stb_image.h
deleted file mode 100644
index 9eedabe..0000000
--- a/Rend/demos/teapot/stb_image.h
+++ /dev/null
@@ -1,7988 +0,0 @@
-/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb
- no warranty implied; use at your own risk
-
- Do this:
- #define STB_IMAGE_IMPLEMENTATION
- before you include this file in *one* C or C++ file to create the implementation.
-
- // i.e. it should look like this:
- #include ...
- #include ...
- #include ...
- #define STB_IMAGE_IMPLEMENTATION
- #include "stb_image.h"
-
- You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.
- And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free
-
-
- QUICK NOTES:
- Primarily of interest to game developers and other people who can
- avoid problematic images and only need the trivial interface
-
- JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)
- PNG 1/2/4/8/16-bit-per-channel
-
- TGA (not sure what subset, if a subset)
- BMP non-1bpp, non-RLE
- PSD (composited view only, no extra channels, 8/16 bit-per-channel)
-
- GIF (*comp always reports as 4-channel)
- HDR (radiance rgbE format)
- PIC (Softimage PIC)
- PNM (PPM and PGM binary only)
-
- Animated GIF still needs a proper API, but here's one way to do it:
- http://gist.github.com/urraka/685d9a6340b26b830d49
-
- - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
- - decode from arbitrary I/O callbacks
- - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)
-
- Full documentation under "DOCUMENTATION" below.
-
-
-LICENSE
-
- See end of file for license information.
-
-RECENT REVISION HISTORY:
-
- 2.30 (2024-05-31) avoid erroneous gcc warning
- 2.29 (2023-05-xx) optimizations
- 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff
- 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes
- 2.26 (2020-07-13) many minor fixes
- 2.25 (2020-02-02) fix warnings
- 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically
- 2.23 (2019-08-11) fix clang static analysis warning
- 2.22 (2019-03-04) gif fixes, fix warnings
- 2.21 (2019-02-25) fix typo in comment
- 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
- 2.19 (2018-02-11) fix warning
- 2.18 (2018-01-30) fix warnings
- 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
- 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes
- 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC
- 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
- 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes
- 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
- 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64
- RGB-format JPEG; remove white matting in PSD;
- allocate large structures on the stack;
- correct channel count for PNG & BMP
- 2.10 (2016-01-22) avoid warning introduced in 2.09
- 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED
-
- See end of file for full revision history.
-
-
- ============================ Contributors =========================
-
- Image formats Extensions, features
- Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info)
- Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info)
- Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG)
- Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks)
- Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG)
- Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip)
- Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD)
- github:urraka (animated gif) Junggon Kim (PNM comments)
- Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA)
- socks-the-fox (16-bit PNG)
- Jeremy Sawicki (handle all ImageNet JPGs)
- Optimizations & bugfixes Mikhail Morozov (1-bit BMP)
- Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query)
- Arseny Kapoulkine Simon Breuss (16-bit PNM)
- John-Mark Allen
- Carmelo J Fdez-Aguera
-
- Bug & warning fixes
- Marc LeBlanc David Woo Guillaume George Martins Mozeiko
- Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski
- Phil Jordan Dave Moore Roy Eltham
- Hayaki Saito Nathan Reed Won Chun
- Luke Graham Johan Duparc Nick Verigakis the Horde3D community
- Thomas Ruf Ronny Chevalier github:rlyeh
- Janez Zemva John Bartholomew Michal Cichon github:romigrou
- Jonathan Blow Ken Hamada Tero Hanninen github:svdijk
- Eugene Golushkov Laurent Gomila Cort Stratton github:snagar
- Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex
- Cass Everitt Ryamond Barbiero github:grim210
- Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw
- Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus
- Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo
- Julian Raschke Gregory Mullen Christian Floisand github:darealshinji
- Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007
- Brad Weinberger Matvey Cherevko github:mosra
- Luca Sas Alexander Veselov Zack Middleton [reserved]
- Ryan C. Gordon [reserved] [reserved]
- DO NOT ADD YOUR NAME HERE
-
- Jacko Dirks
-
- To add your name to the credits, pick a random blank space in the middle and fill it.
- 80% of merge conflicts on stb PRs are due to people adding their name at the end
- of the credits.
-*/
-
-#ifndef STBI_INCLUDE_STB_IMAGE_H
-#define STBI_INCLUDE_STB_IMAGE_H
-
-// DOCUMENTATION
-//
-// Limitations:
-// - no 12-bit-per-channel JPEG
-// - no JPEGs with arithmetic coding
-// - GIF always returns *comp=4
-//
-// Basic usage (see HDR discussion below for HDR usage):
-// int x,y,n;
-// unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
-// // ... process data if not NULL ...
-// // ... x = width, y = height, n = # 8-bit components per pixel ...
-// // ... replace '0' with '1'..'4' to force that many components per pixel
-// // ... but 'n' will always be the number that it would have been if you said 0
-// stbi_image_free(data);
-//
-// Standard parameters:
-// int *x -- outputs image width in pixels
-// int *y -- outputs image height in pixels
-// int *channels_in_file -- outputs # of image components in image file
-// int desired_channels -- if non-zero, # of image components requested in result
-//
-// The return value from an image loader is an 'unsigned char *' which points
-// to the pixel data, or NULL on an allocation failure or if the image is
-// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
-// with each pixel consisting of N interleaved 8-bit components; the first
-// pixel pointed to is top-left-most in the image. There is no padding between
-// image scanlines or between pixels, regardless of format. The number of
-// components N is 'desired_channels' if desired_channels is non-zero, or
-// *channels_in_file otherwise. If desired_channels is non-zero,
-// *channels_in_file has the number of components that _would_ have been
-// output otherwise. E.g. if you set desired_channels to 4, you will always
-// get RGBA output, but you can check *channels_in_file to see if it's trivially
-// opaque because e.g. there were only 3 channels in the source image.
-//
-// An output image with N components has the following components interleaved
-// in this order in each pixel:
-//
-// N=#comp components
-// 1 grey
-// 2 grey, alpha
-// 3 red, green, blue
-// 4 red, green, blue, alpha
-//
-// If image loading fails for any reason, the return value will be NULL,
-// and *x, *y, *channels_in_file will be unchanged. The function
-// stbi_failure_reason() can be queried for an extremely brief, end-user
-// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS
-// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
-// more user-friendly ones.
-//
-// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
-//
-// To query the width, height and component count of an image without having to
-// decode the full file, you can use the stbi_info family of functions:
-//
-// int x,y,n,ok;
-// ok = stbi_info(filename, &x, &y, &n);
-// // returns ok=1 and sets x, y, n if image is a supported format,
-// // 0 otherwise.
-//
-// Note that stb_image pervasively uses ints in its public API for sizes,
-// including sizes of memory buffers. This is now part of the API and thus
-// hard to change without causing breakage. As a result, the various image
-// loaders all have certain limits on image size; these differ somewhat
-// by format but generally boil down to either just under 2GB or just under
-// 1GB. When the decoded image would be larger than this, stb_image decoding
-// will fail.
-//
-// Additionally, stb_image will reject image files that have any of their
-// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS,
-// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit,
-// the only way to have an image with such dimensions load correctly
-// is for it to have a rather extreme aspect ratio. Either way, the
-// assumption here is that such larger images are likely to be malformed
-// or malicious. If you do need to load an image with individual dimensions
-// larger than that, and it still fits in the overall size limit, you can
-// #define STBI_MAX_DIMENSIONS on your own to be something larger.
-//
-// ===========================================================================
-//
-// UNICODE:
-//
-// If compiling for Windows and you wish to use Unicode filenames, compile
-// with
-// #define STBI_WINDOWS_UTF8
-// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert
-// Windows wchar_t filenames to utf8.
-//
-// ===========================================================================
-//
-// Philosophy
-//
-// stb libraries are designed with the following priorities:
-//
-// 1. easy to use
-// 2. easy to maintain
-// 3. good performance
-//
-// Sometimes I let "good performance" creep up in priority over "easy to maintain",
-// and for best performance I may provide less-easy-to-use APIs that give higher
-// performance, in addition to the easy-to-use ones. Nevertheless, it's important
-// to keep in mind that from the standpoint of you, a client of this library,
-// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
-//
-// Some secondary priorities arise directly from the first two, some of which
-// provide more explicit reasons why performance can't be emphasized.
-//
-// - Portable ("ease of use")
-// - Small source code footprint ("easy to maintain")
-// - No dependencies ("ease of use")
-//
-// ===========================================================================
-//
-// I/O callbacks
-//
-// I/O callbacks allow you to read from arbitrary sources, like packaged
-// files or some other source. Data read from callbacks are processed
-// through a small internal buffer (currently 128 bytes) to try to reduce
-// overhead.
-//
-// The three functions you must define are "read" (reads some bytes of data),
-// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
-//
-// ===========================================================================
-//
-// SIMD support
-//
-// The JPEG decoder will try to automatically use SIMD kernels on x86 when
-// supported by the compiler. For ARM Neon support, you must explicitly
-// request it.
-//
-// (The old do-it-yourself SIMD API is no longer supported in the current
-// code.)
-//
-// On x86, SSE2 will automatically be used when available based on a run-time
-// test; if not, the generic C versions are used as a fall-back. On ARM targets,
-// the typical path is to have separate builds for NEON and non-NEON devices
-// (at least this is true for iOS and Android). Therefore, the NEON support is
-// toggled by a build flag: define STBI_NEON to get NEON loops.
-//
-// If for some reason you do not want to use any of SIMD code, or if
-// you have issues compiling it, you can disable it entirely by
-// defining STBI_NO_SIMD.
-//
-// ===========================================================================
-//
-// HDR image support (disable by defining STBI_NO_HDR)
-//
-// stb_image supports loading HDR images in general, and currently the Radiance
-// .HDR file format specifically. You can still load any file through the existing
-// interface; if you attempt to load an HDR file, it will be automatically remapped
-// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
-// both of these constants can be reconfigured through this interface:
-//
-// stbi_hdr_to_ldr_gamma(2.2f);
-// stbi_hdr_to_ldr_scale(1.0f);
-//
-// (note, do not use _inverse_ constants; stbi_image will invert them
-// appropriately).
-//
-// Additionally, there is a new, parallel interface for loading files as
-// (linear) floats to preserve the full dynamic range:
-//
-// float *data = stbi_loadf(filename, &x, &y, &n, 0);
-//
-// If you load LDR images through this interface, those images will
-// be promoted to floating point values, run through the inverse of
-// constants corresponding to the above:
-//
-// stbi_ldr_to_hdr_scale(1.0f);
-// stbi_ldr_to_hdr_gamma(2.2f);
-//
-// Finally, given a filename (or an open file or memory block--see header
-// file for details) containing image data, you can query for the "most
-// appropriate" interface to use (that is, whether the image is HDR or
-// not), using:
-//
-// stbi_is_hdr(char *filename);
-//
-// ===========================================================================
-//
-// iPhone PNG support:
-//
-// We optionally support converting iPhone-formatted PNGs (which store
-// premultiplied BGRA) back to RGB, even though they're internally encoded
-// differently. To enable this conversion, call
-// stbi_convert_iphone_png_to_rgb(1).
-//
-// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
-// pixel to remove any premultiplied alpha *only* if the image file explicitly
-// says there's premultiplied data (currently only happens in iPhone images,
-// and only if iPhone convert-to-rgb processing is on).
-//
-// ===========================================================================
-//
-// ADDITIONAL CONFIGURATION
-//
-// - You can suppress implementation of any of the decoders to reduce
-// your code footprint by #defining one or more of the following
-// symbols before creating the implementation.
-//
-// STBI_NO_JPEG
-// STBI_NO_PNG
-// STBI_NO_BMP
-// STBI_NO_PSD
-// STBI_NO_TGA
-// STBI_NO_GIF
-// STBI_NO_HDR
-// STBI_NO_PIC
-// STBI_NO_PNM (.ppm and .pgm)
-//
-// - You can request *only* certain decoders and suppress all other ones
-// (this will be more forward-compatible, as addition of new decoders
-// doesn't require you to disable them explicitly):
-//
-// STBI_ONLY_JPEG
-// STBI_ONLY_PNG
-// STBI_ONLY_BMP
-// STBI_ONLY_PSD
-// STBI_ONLY_TGA
-// STBI_ONLY_GIF
-// STBI_ONLY_HDR
-// STBI_ONLY_PIC
-// STBI_ONLY_PNM (.ppm and .pgm)
-//
-// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
-// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
-//
-// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater
-// than that size (in either width or height) without further processing.
-// This is to let programs in the wild set an upper bound to prevent
-// denial-of-service attacks on untrusted data, as one could generate a
-// valid image of gigantic dimensions and force stb_image to allocate a
-// huge block of memory and spend disproportionate time decoding it. By
-// default this is set to (1 << 24), which is 16777216, but that's still
-// very big.
-
-#ifndef STBI_NO_STDIO
-#include <stdio.h>
-#endif // STBI_NO_STDIO
-
-#define STBI_VERSION 1
-
-enum
-{
- STBI_default = 0, // only used for desired_channels
-
- STBI_grey = 1,
- STBI_grey_alpha = 2,
- STBI_rgb = 3,
- STBI_rgb_alpha = 4
-};
-
-#include <stdlib.h>
-typedef unsigned char stbi_uc;
-typedef unsigned short stbi_us;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifndef STBIDEF
-#ifdef STB_IMAGE_STATIC
-#define STBIDEF static
-#else
-#define STBIDEF extern
-#endif
-#endif
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// PRIMARY API - works on images of any type
-//
-
-//
-// load image by filename, open file, or memory buffer
-//
-
-typedef struct
-{
- int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read
- void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
- int (*eof) (void *user); // returns nonzero if we are at end of file/data
-} stbi_io_callbacks;
-
-////////////////////////////////////
-//
-// 8-bits-per-channel interface
-//
-
-STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
-
-#ifndef STBI_NO_STDIO
-STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
-// for stbi_load_from_file, file pointer is left pointing immediately after image
-#endif
-
-#ifndef STBI_NO_GIF
-STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
-#endif
-
-#ifdef STBI_WINDOWS_UTF8
-STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
-#endif
-
-////////////////////////////////////
-//
-// 16-bits-per-channel interface
-//
-
-STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
-
-#ifndef STBI_NO_STDIO
-STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
-STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
-#endif
-
-////////////////////////////////////
-//
-// float-per-channel interface
-//
-#ifndef STBI_NO_LINEAR
- STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
- STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
-
- #ifndef STBI_NO_STDIO
- STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
- STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
- #endif
-#endif
-
-#ifndef STBI_NO_HDR
- STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
- STBIDEF void stbi_hdr_to_ldr_scale(float scale);
-#endif // STBI_NO_HDR
-
-#ifndef STBI_NO_LINEAR
- STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
- STBIDEF void stbi_ldr_to_hdr_scale(float scale);
-#endif // STBI_NO_LINEAR
-
-// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
-STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
-STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_is_hdr (char const *filename);
-STBIDEF int stbi_is_hdr_from_file(FILE *f);
-#endif // STBI_NO_STDIO
-
-
-// get a VERY brief reason for failure
-// on most compilers (and ALL modern mainstream compilers) this is threadsafe
-STBIDEF const char *stbi_failure_reason (void);
-
-// free the loaded image -- this is just free()
-STBIDEF void stbi_image_free (void *retval_from_stbi_load);
-
-// get image dimensions & components without fully decoding
-STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
-STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
-STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);
-STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);
-
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
-STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
-STBIDEF int stbi_is_16_bit (char const *filename);
-STBIDEF int stbi_is_16_bit_from_file(FILE *f);
-#endif
-
-
-
-// for image formats that explicitly notate that they have premultiplied alpha,
-// we just return the colors as stored in the file. set this flag to force
-// unpremultiplication. results are undefined if the unpremultiply overflow.
-STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
-
-// indicate whether we should process iphone images back to canonical format,
-// or just pass them through "as-is"
-STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
-
-// flip the image vertically, so the first pixel in the output array is the bottom left
-STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
-
-// as above, but only applies to images loaded on the thread that calls the function
-// this function is only available if your compiler supports thread-local variables;
-// calling it will fail to link if your compiler doesn't
-STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply);
-STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert);
-STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);
-
-// ZLIB client - used by PNG, available for other purposes
-
-STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
-STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
-STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
-STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
-
-STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
-STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-//
-//
-//// end header file /////////////////////////////////////////////////////
-#endif // STBI_INCLUDE_STB_IMAGE_H
-
-#ifdef STB_IMAGE_IMPLEMENTATION
-
-#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
- || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
- || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
- || defined(STBI_ONLY_ZLIB)
- #ifndef STBI_ONLY_JPEG
- #define STBI_NO_JPEG
- #endif
- #ifndef STBI_ONLY_PNG
- #define STBI_NO_PNG
- #endif
- #ifndef STBI_ONLY_BMP
- #define STBI_NO_BMP
- #endif
- #ifndef STBI_ONLY_PSD
- #define STBI_NO_PSD
- #endif
- #ifndef STBI_ONLY_TGA
- #define STBI_NO_TGA
- #endif
- #ifndef STBI_ONLY_GIF
- #define STBI_NO_GIF
- #endif
- #ifndef STBI_ONLY_HDR
- #define STBI_NO_HDR
- #endif
- #ifndef STBI_ONLY_PIC
- #define STBI_NO_PIC
- #endif
- #ifndef STBI_ONLY_PNM
- #define STBI_NO_PNM
- #endif
-#endif
-
-#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
-#define STBI_NO_ZLIB
-#endif
-
-
-#include <stdarg.h>
-#include <stddef.h> // ptrdiff_t on osx
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-
-#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
-#include <math.h> // ldexp, pow
-#endif
-
-#ifndef STBI_NO_STDIO
-#include <stdio.h>
-#endif
-
-#ifndef STBI_ASSERT
-#include <assert.h>
-#define STBI_ASSERT(x) assert(x)
-#endif
-
-#ifdef __cplusplus
-#define STBI_EXTERN extern "C"
-#else
-#define STBI_EXTERN extern
-#endif
-
-
-#ifndef _MSC_VER
- #ifdef __cplusplus
- #define stbi_inline inline
- #else
- #define stbi_inline
- #endif
-#else
- #define stbi_inline __forceinline
-#endif
-
-#ifndef STBI_NO_THREAD_LOCALS
- #if defined(__cplusplus) && __cplusplus >= 201103L
- #define STBI_THREAD_LOCAL thread_local
- #elif defined(__GNUC__) && __GNUC__ < 5
- #define STBI_THREAD_LOCAL __thread
- #elif defined(_MSC_VER)
- #define STBI_THREAD_LOCAL __declspec(thread)
- #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
- #define STBI_THREAD_LOCAL _Thread_local
- #endif
-
- #ifndef STBI_THREAD_LOCAL
- #if defined(__GNUC__)
- #define STBI_THREAD_LOCAL __thread
- #endif
- #endif
-#endif
-
-#if defined(_MSC_VER) || defined(__SYMBIAN32__)
-typedef unsigned short stbi__uint16;
-typedef signed short stbi__int16;
-typedef unsigned int stbi__uint32;
-typedef signed int stbi__int32;
-#else
-#include <stdint.h>
-typedef uint16_t stbi__uint16;
-typedef int16_t stbi__int16;
-typedef uint32_t stbi__uint32;
-typedef int32_t stbi__int32;
-#endif
-
-// should produce compiler error if size is wrong
-typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
-
-#ifdef _MSC_VER
-#define STBI_NOTUSED(v) (void)(v)
-#else
-#define STBI_NOTUSED(v) (void)sizeof(v)
-#endif
-
-#ifdef _MSC_VER
-#define STBI_HAS_LROTL
-#endif
-
-#ifdef STBI_HAS_LROTL
- #define stbi_lrot(x,y) _lrotl(x,y)
-#else
- #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31)))
-#endif
-
-#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
-// ok
-#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
-// ok
-#else
-#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
-#endif
-
-#ifndef STBI_MALLOC
-#define STBI_MALLOC(sz) malloc(sz)
-#define STBI_REALLOC(p,newsz) realloc(p,newsz)
-#define STBI_FREE(p) free(p)
-#endif
-
-#ifndef STBI_REALLOC_SIZED
-#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
-#endif
-
-// x86/x64 detection
-#if defined(__x86_64__) || defined(_M_X64)
-#define STBI__X64_TARGET
-#elif defined(__i386) || defined(_M_IX86)
-#define STBI__X86_TARGET
-#endif
-
-#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
-// gcc doesn't support sse2 intrinsics unless you compile with -msse2,
-// which in turn means it gets to use SSE2 everywhere. This is unfortunate,
-// but previous attempts to provide the SSE2 functions with runtime
-// detection caused numerous issues. The way architecture extensions are
-// exposed in GCC/Clang is, sadly, not really suited for one-file libs.
-// New behavior: if compiled with -msse2, we use SSE2 without any
-// detection; if not, we don't use it at all.
-#define STBI_NO_SIMD
-#endif
-
-#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
-// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET
-//
-// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the
-// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.
-// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not
-// simultaneously enabling "-mstackrealign".
-//
-// See https://github.com/nothings/stb/issues/81 for more information.
-//
-// So default to no SSE2 on 32-bit MinGW. If you've read this far and added
-// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.
-#define STBI_NO_SIMD
-#endif
-
-#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
-#define STBI_SSE2
-#include <emmintrin.h>
-
-#ifdef _MSC_VER
-
-#if _MSC_VER >= 1400 // not VC6
-#include <intrin.h> // __cpuid
-static int stbi__cpuid3(void)
-{
- int info[4];
- __cpuid(info,1);
- return info[3];
-}
-#else
-static int stbi__cpuid3(void)
-{
- int res;
- __asm {
- mov eax,1
- cpuid
- mov res,edx
- }
- return res;
-}
-#endif
-
-#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
-
-#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
-static int stbi__sse2_available(void)
-{
- int info3 = stbi__cpuid3();
- return ((info3 >> 26) & 1) != 0;
-}
-#endif
-
-#else // assume GCC-style if not VC++
-#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
-
-#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
-static int stbi__sse2_available(void)
-{
- // If we're even attempting to compile this on GCC/Clang, that means
- // -msse2 is on, which means the compiler is allowed to use SSE2
- // instructions at will, and so are we.
- return 1;
-}
-#endif
-
-#endif
-#endif
-
-// ARM NEON
-#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
-#undef STBI_NEON
-#endif
-
-#ifdef STBI_NEON
-#include <arm_neon.h>
-#ifdef _MSC_VER
-#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
-#else
-#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
-#endif
-#endif
-
-#ifndef STBI_SIMD_ALIGN
-#define STBI_SIMD_ALIGN(type, name) type name
-#endif
-
-#ifndef STBI_MAX_DIMENSIONS
-#define STBI_MAX_DIMENSIONS (1 << 24)
-#endif
-
-///////////////////////////////////////////////
-//
-// stbi__context struct and start_xxx functions
-
-// stbi__context structure is our basic context used by all images, so it
-// contains all the IO context, plus some basic image information
-typedef struct
-{
- stbi__uint32 img_x, img_y;
- int img_n, img_out_n;
-
- stbi_io_callbacks io;
- void *io_user_data;
-
- int read_from_callbacks;
- int buflen;
- stbi_uc buffer_start[128];
- int callback_already_read;
-
- stbi_uc *img_buffer, *img_buffer_end;
- stbi_uc *img_buffer_original, *img_buffer_original_end;
-} stbi__context;
-
-
-static void stbi__refill_buffer(stbi__context *s);
-
-// initialize a memory-decode context
-static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
-{
- s->io.read = NULL;
- s->read_from_callbacks = 0;
- s->callback_already_read = 0;
- s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
- s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
-}
-
-// initialize a callback-based context
-static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
-{
- s->io = *c;
- s->io_user_data = user;
- s->buflen = sizeof(s->buffer_start);
- s->read_from_callbacks = 1;
- s->callback_already_read = 0;
- s->img_buffer = s->img_buffer_original = s->buffer_start;
- stbi__refill_buffer(s);
- s->img_buffer_original_end = s->img_buffer_end;
-}
-
-#ifndef STBI_NO_STDIO
-
-static int stbi__stdio_read(void *user, char *data, int size)
-{
- return (int) fread(data,1,size,(FILE*) user);
-}
-
-static void stbi__stdio_skip(void *user, int n)
-{
- int ch;
- fseek((FILE*) user, n, SEEK_CUR);
- ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */
- if (ch != EOF) {
- ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */
- }
-}
-
-static int stbi__stdio_eof(void *user)
-{
- return feof((FILE*) user) || ferror((FILE *) user);
-}
-
-static stbi_io_callbacks stbi__stdio_callbacks =
-{
- stbi__stdio_read,
- stbi__stdio_skip,
- stbi__stdio_eof,
-};
-
-static void stbi__start_file(stbi__context *s, FILE *f)
-{
- stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
-}
-
-//static void stop_file(stbi__context *s) { }
-
-#endif // !STBI_NO_STDIO
-
-static void stbi__rewind(stbi__context *s)
-{
- // conceptually rewind SHOULD rewind to the beginning of the stream,
- // but we just rewind to the beginning of the initial buffer, because
- // we only use it after doing 'test', which only ever looks at at most 92 bytes
- s->img_buffer = s->img_buffer_original;
- s->img_buffer_end = s->img_buffer_original_end;
-}
-
-enum
-{
- STBI_ORDER_RGB,
- STBI_ORDER_BGR
-};
-
-typedef struct
-{
- int bits_per_channel;
- int num_channels;
- int channel_order;
-} stbi__result_info;
-
-#ifndef STBI_NO_JPEG
-static int stbi__jpeg_test(stbi__context *s);
-static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PNG
-static int stbi__png_test(stbi__context *s);
-static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
-static int stbi__png_is16(stbi__context *s);
-#endif
-
-#ifndef STBI_NO_BMP
-static int stbi__bmp_test(stbi__context *s);
-static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_TGA
-static int stbi__tga_test(stbi__context *s);
-static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PSD
-static int stbi__psd_test(stbi__context *s);
-static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);
-static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
-static int stbi__psd_is16(stbi__context *s);
-#endif
-
-#ifndef STBI_NO_HDR
-static int stbi__hdr_test(stbi__context *s);
-static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PIC
-static int stbi__pic_test(stbi__context *s);
-static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_GIF
-static int stbi__gif_test(stbi__context *s);
-static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
-static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
-#endif
-
-#ifndef STBI_NO_PNM
-static int stbi__pnm_test(stbi__context *s);
-static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
-static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
-static int stbi__pnm_is16(stbi__context *s);
-#endif
-
-static
-#ifdef STBI_THREAD_LOCAL
-STBI_THREAD_LOCAL
-#endif
-const char *stbi__g_failure_reason;
-
-STBIDEF const char *stbi_failure_reason(void)
-{
- return stbi__g_failure_reason;
-}
-
-#ifndef STBI_NO_FAILURE_STRINGS
-static int stbi__err(const char *str)
-{
- stbi__g_failure_reason = str;
- return 0;
-}
-#endif
-
-static void *stbi__malloc(size_t size)
-{
- return STBI_MALLOC(size);
-}
-
-// stb_image uses ints pervasively, including for offset calculations.
-// therefore the largest decoded image size we can support with the
-// current code, even on 64-bit targets, is INT_MAX. this is not a
-// significant limitation for the intended use case.
-//
-// we do, however, need to make sure our size calculations don't
-// overflow. hence a few helper functions for size calculations that
-// multiply integers together, making sure that they're non-negative
-// and no overflow occurs.
-
-// return 1 if the sum is valid, 0 on overflow.
-// negative terms are considered invalid.
-static int stbi__addsizes_valid(int a, int b)
-{
- if (b < 0) return 0;
- // now 0 <= b <= INT_MAX, hence also
- // 0 <= INT_MAX - b <= INTMAX.
- // And "a + b <= INT_MAX" (which might overflow) is the
- // same as a <= INT_MAX - b (no overflow)
- return a <= INT_MAX - b;
-}
-
-// returns 1 if the product is valid, 0 on overflow.
-// negative factors are considered invalid.
-static int stbi__mul2sizes_valid(int a, int b)
-{
- if (a < 0 || b < 0) return 0;
- if (b == 0) return 1; // mul-by-0 is always safe
- // portable way to check for no overflows in a*b
- return a <= INT_MAX/b;
-}
-
-#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
-// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow
-static int stbi__mad2sizes_valid(int a, int b, int add)
-{
- return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
-}
-#endif
-
-// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow
-static int stbi__mad3sizes_valid(int a, int b, int c, int add)
-{
- return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
- stbi__addsizes_valid(a*b*c, add);
-}
-
-// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
-#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
-static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
-{
- return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
- stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
-}
-#endif
-
-#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
-// mallocs with size overflow checking
-static void *stbi__malloc_mad2(int a, int b, int add)
-{
- if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
- return stbi__malloc(a*b + add);
-}
-#endif
-
-static void *stbi__malloc_mad3(int a, int b, int c, int add)
-{
- if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
- return stbi__malloc(a*b*c + add);
-}
-
-#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
-static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
-{
- if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
- return stbi__malloc(a*b*c*d + add);
-}
-#endif
-
-// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow.
-static int stbi__addints_valid(int a, int b)
-{
- if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow
- if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0.
- return a <= INT_MAX - b;
-}
-
-// returns 1 if the product of two ints fits in a signed short, 0 on overflow.
-static int stbi__mul2shorts_valid(int a, int b)
-{
- if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow
- if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid
- if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN
- return a >= SHRT_MIN / b;
-}
-
-// stbi__err - error
-// stbi__errpf - error returning pointer to float
-// stbi__errpuc - error returning pointer to unsigned char
-
-#ifdef STBI_NO_FAILURE_STRINGS
- #define stbi__err(x,y) 0
-#elif defined(STBI_FAILURE_USERMSG)
- #define stbi__err(x,y) stbi__err(y)
-#else
- #define stbi__err(x,y) stbi__err(x)
-#endif
-
-#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
-#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
-
-STBIDEF void stbi_image_free(void *retval_from_stbi_load)
-{
- STBI_FREE(retval_from_stbi_load);
-}
-
-#ifndef STBI_NO_LINEAR
-static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
-#endif
-
-#ifndef STBI_NO_HDR
-static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
-#endif
-
-static int stbi__vertically_flip_on_load_global = 0;
-
-STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
-{
- stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
-}
-
-#ifndef STBI_THREAD_LOCAL
-#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
-#else
-static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
-
-STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
-{
- stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
- stbi__vertically_flip_on_load_set = 1;
-}
-
-#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
- ? stbi__vertically_flip_on_load_local \
- : stbi__vertically_flip_on_load_global)
-#endif // STBI_THREAD_LOCAL
-
-static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
-{
- memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
- ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
- ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
- ri->num_channels = 0;
-
- // test the formats with a very explicit header first (at least a FOURCC
- // or distinctive magic number first)
- #ifndef STBI_NO_PNG
- if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_BMP
- if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_GIF
- if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_PSD
- if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
- #else
- STBI_NOTUSED(bpc);
- #endif
- #ifndef STBI_NO_PIC
- if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri);
- #endif
-
- // then the formats that can end up attempting to load with just 1 or 2
- // bytes matching expectations; these are prone to false positives, so
- // try them later
- #ifndef STBI_NO_JPEG
- if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
- #endif
- #ifndef STBI_NO_PNM
- if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri);
- #endif
-
- #ifndef STBI_NO_HDR
- if (stbi__hdr_test(s)) {
- float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
- return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
- }
- #endif
-
- #ifndef STBI_NO_TGA
- // test tga last because it's a crappy test!
- if (stbi__tga_test(s))
- return stbi__tga_load(s,x,y,comp,req_comp, ri);
- #endif
-
- return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
-}
-
-static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)
-{
- int i;
- int img_len = w * h * channels;
- stbi_uc *reduced;
-
- reduced = (stbi_uc *) stbi__malloc(img_len);
- if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory");
-
- for (i = 0; i < img_len; ++i)
- reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling
-
- STBI_FREE(orig);
- return reduced;
-}
-
-static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)
-{
- int i;
- int img_len = w * h * channels;
- stbi__uint16 *enlarged;
-
- enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
- if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
-
- for (i = 0; i < img_len; ++i)
- enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff
-
- STBI_FREE(orig);
- return enlarged;
-}
-
-static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
-{
- int row;
- size_t bytes_per_row = (size_t)w * bytes_per_pixel;
- stbi_uc temp[2048];
- stbi_uc *bytes = (stbi_uc *)image;
-
- for (row = 0; row < (h>>1); row++) {
- stbi_uc *row0 = bytes + row*bytes_per_row;
- stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
- // swap row0 with row1
- size_t bytes_left = bytes_per_row;
- while (bytes_left) {
- size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);
- memcpy(temp, row0, bytes_copy);
- memcpy(row0, row1, bytes_copy);
- memcpy(row1, temp, bytes_copy);
- row0 += bytes_copy;
- row1 += bytes_copy;
- bytes_left -= bytes_copy;
- }
- }
-}
-
-#ifndef STBI_NO_GIF
-static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)
-{
- int slice;
- int slice_size = w * h * bytes_per_pixel;
-
- stbi_uc *bytes = (stbi_uc *)image;
- for (slice = 0; slice < z; ++slice) {
- stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
- bytes += slice_size;
- }
-}
-#endif
-
-static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
-{
- stbi__result_info ri;
- void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
-
- if (result == NULL)
- return NULL;
-
- // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
- STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
-
- if (ri.bits_per_channel != 8) {
- result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
- ri.bits_per_channel = 8;
- }
-
- // @TODO: move stbi__convert_format to here
-
- if (stbi__vertically_flip_on_load) {
- int channels = req_comp ? req_comp : *comp;
- stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));
- }
-
- return (unsigned char *) result;
-}
-
-static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
-{
- stbi__result_info ri;
- void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
-
- if (result == NULL)
- return NULL;
-
- // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
- STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
-
- if (ri.bits_per_channel != 16) {
- result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
- ri.bits_per_channel = 16;
- }
-
- // @TODO: move stbi__convert_format16 to here
- // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision
-
- if (stbi__vertically_flip_on_load) {
- int channels = req_comp ? req_comp : *comp;
- stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));
- }
-
- return (stbi__uint16 *) result;
-}
-
-#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
-static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
-{
- if (stbi__vertically_flip_on_load && result != NULL) {
- int channels = req_comp ? req_comp : *comp;
- stbi__vertical_flip(result, *x, *y, channels * sizeof(float));
- }
-}
-#endif
-
-#ifndef STBI_NO_STDIO
-
-#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
-STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
-STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
-#endif
-
-#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
-STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
-{
- return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);
-}
-#endif
-
-static FILE *stbi__fopen(char const *filename, char const *mode)
-{
- FILE *f;
-#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
- wchar_t wMode[64];
- wchar_t wFilename[1024];
- if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))
- return 0;
-
- if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))
- return 0;
-
-#if defined(_MSC_VER) && _MSC_VER >= 1400
- if (0 != _wfopen_s(&f, wFilename, wMode))
- f = 0;
-#else
- f = _wfopen(wFilename, wMode);
-#endif
-
-#elif defined(_MSC_VER) && _MSC_VER >= 1400
- if (0 != fopen_s(&f, filename, mode))
- f=0;
-#else
- f = fopen(filename, mode);
-#endif
- return f;
-}
-
-
-STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
-{
- FILE *f = stbi__fopen(filename, "rb");
- unsigned char *result;
- if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
- result = stbi_load_from_file(f,x,y,comp,req_comp);
- fclose(f);
- return result;
-}
-
-STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
-{
- unsigned char *result;
- stbi__context s;
- stbi__start_file(&s,f);
- result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
- if (result) {
- // need to 'unget' all the characters in the IO buffer
- fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
- }
- return result;
-}
-
-STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)
-{
- stbi__uint16 *result;
- stbi__context s;
- stbi__start_file(&s,f);
- result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
- if (result) {
- // need to 'unget' all the characters in the IO buffer
- fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
- }
- return result;
-}
-
-STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)
-{
- FILE *f = stbi__fopen(filename, "rb");
- stbi__uint16 *result;
- if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file");
- result = stbi_load_from_file_16(f,x,y,comp,req_comp);
- fclose(f);
- return result;
-}
-
-
-#endif //!STBI_NO_STDIO
-
-STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
-}
-
-STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);
- return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
-}
-
-STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
-}
-
-STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
- return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
-}
-
-#ifndef STBI_NO_GIF
-STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
-{
- unsigned char *result;
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
-
- result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
- if (stbi__vertically_flip_on_load) {
- stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
- }
-
- return result;
-}
-#endif
-
-#ifndef STBI_NO_LINEAR
-static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
-{
- unsigned char *data;
- #ifndef STBI_NO_HDR
- if (stbi__hdr_test(s)) {
- stbi__result_info ri;
- float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
- if (hdr_data)
- stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
- return hdr_data;
- }
- #endif
- data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
- if (data)
- return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
- return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
-}
-
-STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__loadf_main(&s,x,y,comp,req_comp);
-}
-
-STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
- return stbi__loadf_main(&s,x,y,comp,req_comp);
-}
-
-#ifndef STBI_NO_STDIO
-STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
-{
- float *result;
- FILE *f = stbi__fopen(filename, "rb");
- if (!f) return stbi__errpf("can't fopen", "Unable to open file");
- result = stbi_loadf_from_file(f,x,y,comp,req_comp);
- fclose(f);
- return result;
-}
-
-STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
-{
- stbi__context s;
- stbi__start_file(&s,f);
- return stbi__loadf_main(&s,x,y,comp,req_comp);
-}
-#endif // !STBI_NO_STDIO
-
-#endif // !STBI_NO_LINEAR
-
-// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
-// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
-// reports false!
-
-STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
-{
- #ifndef STBI_NO_HDR
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__hdr_test(&s);
- #else
- STBI_NOTUSED(buffer);
- STBI_NOTUSED(len);
- return 0;
- #endif
-}
-
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_is_hdr (char const *filename)
-{
- FILE *f = stbi__fopen(filename, "rb");
- int result=0;
- if (f) {
- result = stbi_is_hdr_from_file(f);
- fclose(f);
- }
- return result;
-}
-
-STBIDEF int stbi_is_hdr_from_file(FILE *f)
-{
- #ifndef STBI_NO_HDR
- long pos = ftell(f);
- int res;
- stbi__context s;
- stbi__start_file(&s,f);
- res = stbi__hdr_test(&s);
- fseek(f, pos, SEEK_SET);
- return res;
- #else
- STBI_NOTUSED(f);
- return 0;
- #endif
-}
-#endif // !STBI_NO_STDIO
-
-STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
-{
- #ifndef STBI_NO_HDR
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
- return stbi__hdr_test(&s);
- #else
- STBI_NOTUSED(clbk);
- STBI_NOTUSED(user);
- return 0;
- #endif
-}
-
-#ifndef STBI_NO_LINEAR
-static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
-
-STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
-STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
-#endif
-
-static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
-
-STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
-STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
-
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// Common code used by all image loaders
-//
-
-enum
-{
- STBI__SCAN_load=0,
- STBI__SCAN_type,
- STBI__SCAN_header
-};
-
-static void stbi__refill_buffer(stbi__context *s)
-{
- int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
- s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original);
- if (n == 0) {
- // at end of file, treat same as if from memory, but need to handle case
- // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
- s->read_from_callbacks = 0;
- s->img_buffer = s->buffer_start;
- s->img_buffer_end = s->buffer_start+1;
- *s->img_buffer = 0;
- } else {
- s->img_buffer = s->buffer_start;
- s->img_buffer_end = s->buffer_start + n;
- }
-}
-
-stbi_inline static stbi_uc stbi__get8(stbi__context *s)
-{
- if (s->img_buffer < s->img_buffer_end)
- return *s->img_buffer++;
- if (s->read_from_callbacks) {
- stbi__refill_buffer(s);
- return *s->img_buffer++;
- }
- return 0;
-}
-
-#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
-// nothing
-#else
-stbi_inline static int stbi__at_eof(stbi__context *s)
-{
- if (s->io.read) {
- if (!(s->io.eof)(s->io_user_data)) return 0;
- // if feof() is true, check if buffer = end
- // special case: we've only got the special 0 character at the end
- if (s->read_from_callbacks == 0) return 1;
- }
-
- return s->img_buffer >= s->img_buffer_end;
-}
-#endif
-
-#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
-// nothing
-#else
-static void stbi__skip(stbi__context *s, int n)
-{
- if (n == 0) return; // already there!
- if (n < 0) {
- s->img_buffer = s->img_buffer_end;
- return;
- }
- if (s->io.read) {
- int blen = (int) (s->img_buffer_end - s->img_buffer);
- if (blen < n) {
- s->img_buffer = s->img_buffer_end;
- (s->io.skip)(s->io_user_data, n - blen);
- return;
- }
- }
- s->img_buffer += n;
-}
-#endif
-
-#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
-// nothing
-#else
-static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
-{
- if (s->io.read) {
- int blen = (int) (s->img_buffer_end - s->img_buffer);
- if (blen < n) {
- int res, count;
-
- memcpy(buffer, s->img_buffer, blen);
-
- count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
- res = (count == (n-blen));
- s->img_buffer = s->img_buffer_end;
- return res;
- }
- }
-
- if (s->img_buffer+n <= s->img_buffer_end) {
- memcpy(buffer, s->img_buffer, n);
- s->img_buffer += n;
- return 1;
- } else
- return 0;
-}
-#endif
-
-#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
-// nothing
-#else
-static int stbi__get16be(stbi__context *s)
-{
- int z = stbi__get8(s);
- return (z << 8) + stbi__get8(s);
-}
-#endif
-
-#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
-// nothing
-#else
-static stbi__uint32 stbi__get32be(stbi__context *s)
-{
- stbi__uint32 z = stbi__get16be(s);
- return (z << 16) + stbi__get16be(s);
-}
-#endif
-
-#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
-// nothing
-#else
-static int stbi__get16le(stbi__context *s)
-{
- int z = stbi__get8(s);
- return z + (stbi__get8(s) << 8);
-}
-#endif
-
-#ifndef STBI_NO_BMP
-static stbi__uint32 stbi__get32le(stbi__context *s)
-{
- stbi__uint32 z = stbi__get16le(s);
- z += (stbi__uint32)stbi__get16le(s) << 16;
- return z;
-}
-#endif
-
-#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
-
-#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
-// nothing
-#else
-//////////////////////////////////////////////////////////////////////////////
-//
-// generic converter from built-in img_n to req_comp
-// individual types do this automatically as much as possible (e.g. jpeg
-// does all cases internally since it needs to colorspace convert anyway,
-// and it never has alpha, so very few cases ). png can automatically
-// interleave an alpha=255 channel, but falls back to this for other cases
-//
-// assume data buffer is malloced, so malloc a new one and free that one
-// only failure mode is malloc failing
-
-static stbi_uc stbi__compute_y(int r, int g, int b)
-{
- return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
-}
-#endif
-
-#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
-// nothing
-#else
-static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
-{
- int i,j;
- unsigned char *good;
-
- if (req_comp == img_n) return data;
- STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
-
- good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
- if (good == NULL) {
- STBI_FREE(data);
- return stbi__errpuc("outofmem", "Out of memory");
- }
-
- for (j=0; j < (int) y; ++j) {
- unsigned char *src = data + j * x * img_n ;
- unsigned char *dest = good + j * x * req_comp;
-
- #define STBI__COMBO(a,b) ((a)*8+(b))
- #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
- // convert source image with img_n components to one with req_comp components;
- // avoid switch per pixel, so use switch per scanline and massive macros
- switch (STBI__COMBO(img_n, req_comp)) {
- STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break;
- STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break;
- STBI__CASE(2,1) { dest[0]=src[0]; } break;
- STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
- STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break;
- STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
- STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break;
- STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
- STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;
- STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
- default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion");
- }
- #undef STBI__CASE
- }
-
- STBI_FREE(data);
- return good;
-}
-#endif
-
-#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
-// nothing
-#else
-static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
-{
- return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
-}
-#endif
-
-#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
-// nothing
-#else
-static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
-{
- int i,j;
- stbi__uint16 *good;
-
- if (req_comp == img_n) return data;
- STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
-
- good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
- if (good == NULL) {
- STBI_FREE(data);
- return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
- }
-
- for (j=0; j < (int) y; ++j) {
- stbi__uint16 *src = data + j * x * img_n ;
- stbi__uint16 *dest = good + j * x * req_comp;
-
- #define STBI__COMBO(a,b) ((a)*8+(b))
- #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
- // convert source image with img_n components to one with req_comp components;
- // avoid switch per pixel, so use switch per scanline and massive macros
- switch (STBI__COMBO(img_n, req_comp)) {
- STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break;
- STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break;
- STBI__CASE(2,1) { dest[0]=src[0]; } break;
- STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
- STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;
- STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break;
- STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
- STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;
- STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;
- STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
- STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;
- default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion");
- }
- #undef STBI__CASE
- }
-
- STBI_FREE(data);
- return good;
-}
-#endif
-
-#ifndef STBI_NO_LINEAR
-static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
-{
- int i,k,n;
- float *output;
- if (!data) return NULL;
- output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);
- if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
- // compute number of non-alpha components
- if (comp & 1) n = comp; else n = comp-1;
- for (i=0; i < x*y; ++i) {
- for (k=0; k < n; ++k) {
- output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
- }
- }
- if (n < comp) {
- for (i=0; i < x*y; ++i) {
- output[i*comp + n] = data[i*comp + n]/255.0f;
- }
- }
- STBI_FREE(data);
- return output;
-}
-#endif
-
-#ifndef STBI_NO_HDR
-#define stbi__float2int(x) ((int) (x))
-static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
-{
- int i,k,n;
- stbi_uc *output;
- if (!data) return NULL;
- output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
- if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
- // compute number of non-alpha components
- if (comp & 1) n = comp; else n = comp-1;
- for (i=0; i < x*y; ++i) {
- for (k=0; k < n; ++k) {
- float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
- if (z < 0) z = 0;
- if (z > 255) z = 255;
- output[i*comp + k] = (stbi_uc) stbi__float2int(z);
- }
- if (k < comp) {
- float z = data[i*comp+k] * 255 + 0.5f;
- if (z < 0) z = 0;
- if (z > 255) z = 255;
- output[i*comp + k] = (stbi_uc) stbi__float2int(z);
- }
- }
- STBI_FREE(data);
- return output;
-}
-#endif
-
-//////////////////////////////////////////////////////////////////////////////
-//
-// "baseline" JPEG/JFIF decoder
-//
-// simple implementation
-// - doesn't support delayed output of y-dimension
-// - simple interface (only one output format: 8-bit interleaved RGB)
-// - doesn't try to recover corrupt jpegs
-// - doesn't allow partial loading, loading multiple at once
-// - still fast on x86 (copying globals into locals doesn't help x86)
-// - allocates lots of intermediate memory (full size of all components)
-// - non-interleaved case requires this anyway
-// - allows good upsampling (see next)
-// high-quality
-// - upsampled channels are bilinearly interpolated, even across blocks
-// - quality integer IDCT derived from IJG's 'slow'
-// performance
-// - fast huffman; reasonable integer IDCT
-// - some SIMD kernels for common paths on targets with SSE2/NEON
-// - uses a lot of intermediate memory, could cache poorly
-
-#ifndef STBI_NO_JPEG
-
-// huffman decoding acceleration
-#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
-
-typedef struct
-{
- stbi_uc fast[1 << FAST_BITS];
- // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
- stbi__uint16 code[256];
- stbi_uc values[256];
- stbi_uc size[257];
- unsigned int maxcode[18];
- int delta[17]; // old 'firstsymbol' - old 'firstcode'
-} stbi__huffman;
-
-typedef struct
-{
- stbi__context *s;
- stbi__huffman huff_dc[4];
- stbi__huffman huff_ac[4];
- stbi__uint16 dequant[4][64];
- stbi__int16 fast_ac[4][1 << FAST_BITS];
-
-// sizes for components, interleaved MCUs
- int img_h_max, img_v_max;
- int img_mcu_x, img_mcu_y;
- int img_mcu_w, img_mcu_h;
-
-// definition of jpeg image component
- struct
- {
- int id;
- int h,v;
- int tq;
- int hd,ha;
- int dc_pred;
-
- int x,y,w2,h2;
- stbi_uc *data;
- void *raw_data, *raw_coeff;
- stbi_uc *linebuf;
- short *coeff; // progressive only
- int coeff_w, coeff_h; // number of 8x8 coefficient blocks
- } img_comp[4];
-
- stbi__uint32 code_buffer; // jpeg entropy-coded buffer
- int code_bits; // number of valid bits
- unsigned char marker; // marker seen while filling entropy buffer
- int nomore; // flag if we saw a marker so must stop
-
- int progressive;
- int spec_start;
- int spec_end;
- int succ_high;
- int succ_low;
- int eob_run;
- int jfif;
- int app14_color_transform; // Adobe APP14 tag
- int rgb;
-
- int scan_n, order[4];
- int restart_interval, todo;
-
-// kernels
- void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);
- void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);
- stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);
-} stbi__jpeg;
-
-static int stbi__build_huffman(stbi__huffman *h, int *count)
-{
- int i,j,k=0;
- unsigned int code;
- // build size list for each symbol (from JPEG spec)
- for (i=0; i < 16; ++i) {
- for (j=0; j < count[i]; ++j) {
- h->size[k++] = (stbi_uc) (i+1);
- if(k >= 257) return stbi__err("bad size list","Corrupt JPEG");
- }
- }
- h->size[k] = 0;
-
- // compute actual symbols (from jpeg spec)
- code = 0;
- k = 0;
- for(j=1; j <= 16; ++j) {
- // compute delta to add to code to compute symbol id
- h->delta[j] = k - code;
- if (h->size[k] == j) {
- while (h->size[k] == j)
- h->code[k++] = (stbi__uint16) (code++);
- if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
- }
- // compute largest code + 1 for this size, preshifted as needed later
- h->maxcode[j] = code << (16-j);
- code <<= 1;
- }
- h->maxcode[j] = 0xffffffff;
-
- // build non-spec acceleration table; 255 is flag for not-accelerated
- memset(h->fast, 255, 1 << FAST_BITS);
- for (i=0; i < k; ++i) {
- int s = h->size[i];
- if (s <= FAST_BITS) {
- int c = h->code[i] << (FAST_BITS-s);
- int m = 1 << (FAST_BITS-s);
- for (j=0; j < m; ++j) {
- h->fast[c+j] = (stbi_uc) i;
- }
- }
- }
- return 1;
-}
-
-// build a table that decodes both magnitude and value of small ACs in
-// one go.
-static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
-{
- int i;
- for (i=0; i < (1 << FAST_BITS); ++i) {
- stbi_uc fast = h->fast[i];
- fast_ac[i] = 0;
- if (fast < 255) {
- int rs = h->values[fast];
- int run = (rs >> 4) & 15;
- int magbits = rs & 15;
- int len = h->size[fast];
-
- if (magbits && len + magbits <= FAST_BITS) {
- // magnitude code followed by receive_extend code
- int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
- int m = 1 << (magbits - 1);
- if (k < m) k += (~0U << magbits) + 1;
- // if the result is small enough, we can fit it in fast_ac table
- if (k >= -128 && k <= 127)
- fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
- }
- }
- }
-}
-
-static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
-{
- do {
- unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
- if (b == 0xff) {
- int c = stbi__get8(j->s);
- while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes
- if (c != 0) {
- j->marker = (unsigned char) c;
- j->nomore = 1;
- return;
- }
- }
- j->code_buffer |= b << (24 - j->code_bits);
- j->code_bits += 8;
- } while (j->code_bits <= 24);
-}
-
-// (1 << n) - 1
-static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
-
-// decode a jpeg huffman value from the bitstream
-stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
-{
- unsigned int temp;
- int c,k;
-
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
-
- // look at the top FAST_BITS and determine what symbol ID it is,
- // if the code is <= FAST_BITS
- c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
- k = h->fast[c];
- if (k < 255) {
- int s = h->size[k];
- if (s > j->code_bits)
- return -1;
- j->code_buffer <<= s;
- j->code_bits -= s;
- return h->values[k];
- }
-
- // naive test is to shift the code_buffer down so k bits are
- // valid, then test against maxcode. To speed this up, we've
- // preshifted maxcode left so that it has (16-k) 0s at the
- // end; in other words, regardless of the number of bits, it
- // wants to be compared against something shifted to have 16;
- // that way we don't need to shift inside the loop.
- temp = j->code_buffer >> 16;
- for (k=FAST_BITS+1 ; ; ++k)
- if (temp < h->maxcode[k])
- break;
- if (k == 17) {
- // error! code not found
- j->code_bits -= 16;
- return -1;
- }
-
- if (k > j->code_bits)
- return -1;
-
- // convert the huffman code to the symbol id
- c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
- if(c < 0 || c >= 256) // symbol id out of bounds!
- return -1;
- STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
-
- // convert the id to a symbol
- j->code_bits -= k;
- j->code_buffer <<= k;
- return h->values[c];
-}
-
-// bias[n] = (-1<<n) + 1
-static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
-
-// combined JPEG 'receive' and JPEG 'extend', since baseline
-// always extends everything it receives.
-stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
-{
- unsigned int k;
- int sgn;
- if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
- if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
-
- sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative)
- k = stbi_lrot(j->code_buffer, n);
- j->code_buffer = k & ~stbi__bmask[n];
- k &= stbi__bmask[n];
- j->code_bits -= n;
- return k + (stbi__jbias[n] & (sgn - 1));
-}
-
-// get some unsigned bits
-stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
-{
- unsigned int k;
- if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
- if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
- k = stbi_lrot(j->code_buffer, n);
- j->code_buffer = k & ~stbi__bmask[n];
- k &= stbi__bmask[n];
- j->code_bits -= n;
- return k;
-}
-
-stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
-{
- unsigned int k;
- if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
- if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing
- k = j->code_buffer;
- j->code_buffer <<= 1;
- --j->code_bits;
- return k & 0x80000000;
-}
-
-// given a value that's at position X in the zigzag stream,
-// where does it appear in the 8x8 matrix coded as row-major?
-static const stbi_uc stbi__jpeg_dezigzag[64+15] =
-{
- 0, 1, 8, 16, 9, 2, 3, 10,
- 17, 24, 32, 25, 18, 11, 4, 5,
- 12, 19, 26, 33, 40, 48, 41, 34,
- 27, 20, 13, 6, 7, 14, 21, 28,
- 35, 42, 49, 56, 57, 50, 43, 36,
- 29, 22, 15, 23, 30, 37, 44, 51,
- 58, 59, 52, 45, 38, 31, 39, 46,
- 53, 60, 61, 54, 47, 55, 62, 63,
- // let corrupt input sample past end
- 63, 63, 63, 63, 63, 63, 63, 63,
- 63, 63, 63, 63, 63, 63, 63
-};
-
-// decode one 64-entry block--
-static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)
-{
- int diff,dc,k;
- int t;
-
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
- t = stbi__jpeg_huff_decode(j, hdc);
- if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG");
-
- // 0 all the ac values now so we can do it 32-bits at a time
- memset(data,0,64*sizeof(data[0]));
-
- diff = t ? stbi__extend_receive(j, t) : 0;
- if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG");
- dc = j->img_comp[b].dc_pred + diff;
- j->img_comp[b].dc_pred = dc;
- if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
- data[0] = (short) (dc * dequant[0]);
-
- // decode AC components, see JPEG spec
- k = 1;
- do {
- unsigned int zig;
- int c,r,s;
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
- c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
- r = fac[c];
- if (r) { // fast-AC path
- k += (r >> 4) & 15; // run
- s = r & 15; // combined length
- if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
- j->code_buffer <<= s;
- j->code_bits -= s;
- // decode into unzigzag'd location
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) ((r >> 8) * dequant[zig]);
- } else {
- int rs = stbi__jpeg_huff_decode(j, hac);
- if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
- s = rs & 15;
- r = rs >> 4;
- if (s == 0) {
- if (rs != 0xf0) break; // end block
- k += 16;
- } else {
- k += r;
- // decode into unzigzag'd location
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
- }
- }
- } while (k < 64);
- return 1;
-}
-
-static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)
-{
- int diff,dc;
- int t;
- if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
-
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
-
- if (j->succ_high == 0) {
- // first scan for DC coefficient, must be first
- memset(data,0,64*sizeof(data[0])); // 0 all the ac values now
- t = stbi__jpeg_huff_decode(j, hdc);
- if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
- diff = t ? stbi__extend_receive(j, t) : 0;
-
- if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG");
- dc = j->img_comp[b].dc_pred + diff;
- j->img_comp[b].dc_pred = dc;
- if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
- data[0] = (short) (dc * (1 << j->succ_low));
- } else {
- // refinement scan for DC coefficient
- if (stbi__jpeg_get_bit(j))
- data[0] += (short) (1 << j->succ_low);
- }
- return 1;
-}
-
-// @OPTIMIZE: store non-zigzagged during the decode passes,
-// and only de-zigzag when dequantizing
-static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)
-{
- int k;
- if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
-
- if (j->succ_high == 0) {
- int shift = j->succ_low;
-
- if (j->eob_run) {
- --j->eob_run;
- return 1;
- }
-
- k = j->spec_start;
- do {
- unsigned int zig;
- int c,r,s;
- if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
- c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
- r = fac[c];
- if (r) { // fast-AC path
- k += (r >> 4) & 15; // run
- s = r & 15; // combined length
- if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
- j->code_buffer <<= s;
- j->code_bits -= s;
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) ((r >> 8) * (1 << shift));
- } else {
- int rs = stbi__jpeg_huff_decode(j, hac);
- if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
- s = rs & 15;
- r = rs >> 4;
- if (s == 0) {
- if (r < 15) {
- j->eob_run = (1 << r);
- if (r)
- j->eob_run += stbi__jpeg_get_bits(j, r);
- --j->eob_run;
- break;
- }
- k += 16;
- } else {
- k += r;
- zig = stbi__jpeg_dezigzag[k++];
- data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));
- }
- }
- } while (k <= j->spec_end);
- } else {
- // refinement scan for these AC coefficients
-
- short bit = (short) (1 << j->succ_low);
-
- if (j->eob_run) {
- --j->eob_run;
- for (k = j->spec_start; k <= j->spec_end; ++k) {
- short *p = &data[stbi__jpeg_dezigzag[k]];
- if (*p != 0)
- if (stbi__jpeg_get_bit(j))
- if ((*p & bit)==0) {
- if (*p > 0)
- *p += bit;
- else
- *p -= bit;
- }
- }
- } else {
- k = j->spec_start;
- do {
- int r,s;
- int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh
- if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
- s = rs & 15;
- r = rs >> 4;
- if (s == 0) {
- if (r < 15) {
- j->eob_run = (1 << r) - 1;
- if (r)
- j->eob_run += stbi__jpeg_get_bits(j, r);
- r = 64; // force end of block
- } else {
- // r=15 s=0 should write 16 0s, so we just do
- // a run of 15 0s and then write s (which is 0),
- // so we don't have to do anything special here
- }
- } else {
- if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");
- // sign bit
- if (stbi__jpeg_get_bit(j))
- s = bit;
- else
- s = -bit;
- }
-
- // advance by r
- while (k <= j->spec_end) {
- short *p = &data[stbi__jpeg_dezigzag[k++]];
- if (*p != 0) {
- if (stbi__jpeg_get_bit(j))
- if ((*p & bit)==0) {
- if (*p > 0)
- *p += bit;
- else
- *p -= bit;
- }
- } else {
- if (r == 0) {
- *p = (short) s;
- break;
- }
- --r;
- }
- }
- } while (k <= j->spec_end);
- }
- }
- return 1;
-}
-
-// take a -128..127 value and stbi__clamp it and convert to 0..255
-stbi_inline static stbi_uc stbi__clamp(int x)
-{
- // trick to use a single test to catch both cases
- if ((unsigned int) x > 255) {
- if (x < 0) return 0;
- if (x > 255) return 255;
- }
- return (stbi_uc) x;
-}
-
-#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
-#define stbi__fsh(x) ((x) * 4096)
-
-// derived from jidctint -- DCT_ISLOW
-#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
- int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
- p2 = s2; \
- p3 = s6; \
- p1 = (p2+p3) * stbi__f2f(0.5411961f); \
- t2 = p1 + p3*stbi__f2f(-1.847759065f); \
- t3 = p1 + p2*stbi__f2f( 0.765366865f); \
- p2 = s0; \
- p3 = s4; \
- t0 = stbi__fsh(p2+p3); \
- t1 = stbi__fsh(p2-p3); \
- x0 = t0+t3; \
- x3 = t0-t3; \
- x1 = t1+t2; \
- x2 = t1-t2; \
- t0 = s7; \
- t1 = s5; \
- t2 = s3; \
- t3 = s1; \
- p3 = t0+t2; \
- p4 = t1+t3; \
- p1 = t0+t3; \
- p2 = t1+t2; \
- p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
- t0 = t0*stbi__f2f( 0.298631336f); \
- t1 = t1*stbi__f2f( 2.053119869f); \
- t2 = t2*stbi__f2f( 3.072711026f); \
- t3 = t3*stbi__f2f( 1.501321110f); \
- p1 = p5 + p1*stbi__f2f(-0.899976223f); \
- p2 = p5 + p2*stbi__f2f(-2.562915447f); \
- p3 = p3*stbi__f2f(-1.961570560f); \
- p4 = p4*stbi__f2f(-0.390180644f); \
- t3 += p1+p4; \
- t2 += p2+p3; \
- t1 += p2+p4; \
- t0 += p1+p3;
-
-static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
-{
- int i,val[64],*v=val;
- stbi_uc *o;
- short *d = data;
-
- // columns
- for (i=0; i < 8; ++i,++d, ++v) {
- // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
- if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
- && d[40]==0 && d[48]==0 && d[56]==0) {
- // no shortcut 0 seconds
- // (1|2|3|4|5|6|7)==0 0 seconds
- // all separate -0.047 seconds
- // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
- int dcterm = d[0]*4;
- v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
- } else {
- STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
- // constants scaled things up by 1<<12; let's bring them back
- // down, but keep 2 extra bits of precision
- x0 += 512; x1 += 512; x2 += 512; x3 += 512;
- v[ 0] = (x0+t3) >> 10;
- v[56] = (x0-t3) >> 10;
- v[ 8] = (x1+t2) >> 10;
- v[48] = (x1-t2) >> 10;
- v[16] = (x2+t1) >> 10;
- v[40] = (x2-t1) >> 10;
- v[24] = (x3+t0) >> 10;
- v[32] = (x3-t0) >> 10;
- }
- }
-
- for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
- // no fast case since the first 1D IDCT spread components out
- STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
- // constants scaled things up by 1<<12, plus we had 1<<2 from first
- // loop, plus horizontal and vertical each scale by sqrt(8) so together
- // we've got an extra 1<<3, so 1<<17 total we need to remove.
- // so we want to round that, which means adding 0.5 * 1<<17,
- // aka 65536. Also, we'll end up with -128 to 127 that we want
- // to encode as 0..255 by adding 128, so we'll add that before the shift
- x0 += 65536 + (128<<17);
- x1 += 65536 + (128<<17);
- x2 += 65536 + (128<<17);
- x3 += 65536 + (128<<17);
- // tried computing the shifts into temps, or'ing the temps to see
- // if any were out of range, but that was slower
- o[0] = stbi__clamp((x0+t3) >> 17);
- o[7] = stbi__clamp((x0-t3) >> 17);
- o[1] = stbi__clamp((x1+t2) >> 17);
- o[6] = stbi__clamp((x1-t2) >> 17);
- o[2] = stbi__clamp((x2+t1) >> 17);
- o[5] = stbi__clamp((x2-t1) >> 17);
- o[3] = stbi__clamp((x3+t0) >> 17);
- o[4] = stbi__clamp((x3-t0) >> 17);
- }
-}
-
-#ifdef STBI_SSE2
-// sse2 integer IDCT. not the fastest possible implementation but it
-// produces bit-identical results to the generic C version so it's
-// fully "transparent".
-static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
-{
- // This is constructed to match our regular (generic) integer IDCT exactly.
- __m128i row0, row1, row2, row3, row4, row5, row6, row7;
- __m128i tmp;
-
- // dot product constant: even elems=x, odd elems=y
- #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
-
- // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit)
- // out(1) = c1[even]*x + c1[odd]*y
- #define dct_rot(out0,out1, x,y,c0,c1) \
- __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
- __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
- __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
- __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
- __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
- __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
-
- // out = in << 12 (in 16-bit, out 32-bit)
- #define dct_widen(out, in) \
- __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
- __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
-
- // wide add
- #define dct_wadd(out, a, b) \
- __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
- __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
-
- // wide sub
- #define dct_wsub(out, a, b) \
- __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
- __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
-
- // butterfly a/b, add bias, then shift by "s" and pack
- #define dct_bfly32o(out0, out1, a,b,bias,s) \
- { \
- __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
- __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
- dct_wadd(sum, abiased, b); \
- dct_wsub(dif, abiased, b); \
- out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
- out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
- }
-
- // 8-bit interleave step (for transposes)
- #define dct_interleave8(a, b) \
- tmp = a; \
- a = _mm_unpacklo_epi8(a, b); \
- b = _mm_unpackhi_epi8(tmp, b)
-
- // 16-bit interleave step (for transposes)
- #define dct_interleave16(a, b) \
- tmp = a; \
- a = _mm_unpacklo_epi16(a, b); \
- b = _mm_unpackhi_epi16(tmp, b)
-
- #define dct_pass(bias,shift) \
- { \
- /* even part */ \
- dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
- __m128i sum04 = _mm_add_epi16(row0, row4); \
- __m128i dif04 = _mm_sub_epi16(row0, row4); \
- dct_widen(t0e, sum04); \
- dct_widen(t1e, dif04); \
- dct_wadd(x0, t0e, t3e); \
- dct_wsub(x3, t0e, t3e); \
- dct_wadd(x1, t1e, t2e); \
- dct_wsub(x2, t1e, t2e); \
- /* odd part */ \
- dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
- dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
- __m128i sum17 = _mm_add_epi16(row1, row7); \
- __m128i sum35 = _mm_add_epi16(row3, row5); \
- dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
- dct_wadd(x4, y0o, y4o); \
- dct_wadd(x5, y1o, y5o); \
- dct_wadd(x6, y2o, y5o); \
- dct_wadd(x7, y3o, y4o); \
- dct_bfly32o(row0,row7, x0,x7,bias,shift); \
- dct_bfly32o(row1,row6, x1,x6,bias,shift); \
- dct_bfly32o(row2,row5, x2,x5,bias,shift); \
- dct_bfly32o(row3,row4, x3,x4,bias,shift); \
- }
-
- __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
- __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
- __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
- __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
- __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
- __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
- __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
- __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
-
- // rounding biases in column/row passes, see stbi__idct_block for explanation.
- __m128i bias_0 = _mm_set1_epi32(512);
- __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
-
- // load
- row0 = _mm_load_si128((const __m128i *) (data + 0*8));
- row1 = _mm_load_si128((const __m128i *) (data + 1*8));
- row2 = _mm_load_si128((const __m128i *) (data + 2*8));
- row3 = _mm_load_si128((const __m128i *) (data + 3*8));
- row4 = _mm_load_si128((const __m128i *) (data + 4*8));
- row5 = _mm_load_si128((const __m128i *) (data + 5*8));
- row6 = _mm_load_si128((const __m128i *) (data + 6*8));
- row7 = _mm_load_si128((const __m128i *) (data + 7*8));
-
- // column pass
- dct_pass(bias_0, 10);
-
- {
- // 16bit 8x8 transpose pass 1
- dct_interleave16(row0, row4);
- dct_interleave16(row1, row5);
- dct_interleave16(row2, row6);
- dct_interleave16(row3, row7);
-
- // transpose pass 2
- dct_interleave16(row0, row2);
- dct_interleave16(row1, row3);
- dct_interleave16(row4, row6);
- dct_interleave16(row5, row7);
-
- // transpose pass 3
- dct_interleave16(row0, row1);
- dct_interleave16(row2, row3);
- dct_interleave16(row4, row5);
- dct_interleave16(row6, row7);
- }
-
- // row pass
- dct_pass(bias_1, 17);
-
- {
- // pack
- __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
- __m128i p1 = _mm_packus_epi16(row2, row3);
- __m128i p2 = _mm_packus_epi16(row4, row5);
- __m128i p3 = _mm_packus_epi16(row6, row7);
-
- // 8bit 8x8 transpose pass 1
- dct_interleave8(p0, p2); // a0e0a1e1...
- dct_interleave8(p1, p3); // c0g0c1g1...
-
- // transpose pass 2
- dct_interleave8(p0, p1); // a0c0e0g0...
- dct_interleave8(p2, p3); // b0d0f0h0...
-
- // transpose pass 3
- dct_interleave8(p0, p2); // a0b0c0d0...
- dct_interleave8(p1, p3); // a4b4c4d4...
-
- // store
- _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
- _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
- _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
- _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
- _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
- }
-
-#undef dct_const
-#undef dct_rot
-#undef dct_widen
-#undef dct_wadd
-#undef dct_wsub
-#undef dct_bfly32o
-#undef dct_interleave8
-#undef dct_interleave16
-#undef dct_pass
-}
-
-#endif // STBI_SSE2
-
-#ifdef STBI_NEON
-
-// NEON integer IDCT. should produce bit-identical
-// results to the generic C version.
-static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
-{
- int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
-
- int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
- int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
- int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
- int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
- int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
- int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
- int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
- int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
- int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
- int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
- int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
- int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
-
-#define dct_long_mul(out, inq, coeff) \
- int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
- int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
-
-#define dct_long_mac(out, acc, inq, coeff) \
- int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
- int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
-
-#define dct_widen(out, inq) \
- int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
- int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
-
-// wide add
-#define dct_wadd(out, a, b) \
- int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
- int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
-
-// wide sub
-#define dct_wsub(out, a, b) \
- int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
- int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
-
-// butterfly a/b, then shift using "shiftop" by "s" and pack
-#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
- { \
- dct_wadd(sum, a, b); \
- dct_wsub(dif, a, b); \
- out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
- out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
- }
-
-#define dct_pass(shiftop, shift) \
- { \
- /* even part */ \
- int16x8_t sum26 = vaddq_s16(row2, row6); \
- dct_long_mul(p1e, sum26, rot0_0); \
- dct_long_mac(t2e, p1e, row6, rot0_1); \
- dct_long_mac(t3e, p1e, row2, rot0_2); \
- int16x8_t sum04 = vaddq_s16(row0, row4); \
- int16x8_t dif04 = vsubq_s16(row0, row4); \
- dct_widen(t0e, sum04); \
- dct_widen(t1e, dif04); \
- dct_wadd(x0, t0e, t3e); \
- dct_wsub(x3, t0e, t3e); \
- dct_wadd(x1, t1e, t2e); \
- dct_wsub(x2, t1e, t2e); \
- /* odd part */ \
- int16x8_t sum15 = vaddq_s16(row1, row5); \
- int16x8_t sum17 = vaddq_s16(row1, row7); \
- int16x8_t sum35 = vaddq_s16(row3, row5); \
- int16x8_t sum37 = vaddq_s16(row3, row7); \
- int16x8_t sumodd = vaddq_s16(sum17, sum35); \
- dct_long_mul(p5o, sumodd, rot1_0); \
- dct_long_mac(p1o, p5o, sum17, rot1_1); \
- dct_long_mac(p2o, p5o, sum35, rot1_2); \
- dct_long_mul(p3o, sum37, rot2_0); \
- dct_long_mul(p4o, sum15, rot2_1); \
- dct_wadd(sump13o, p1o, p3o); \
- dct_wadd(sump24o, p2o, p4o); \
- dct_wadd(sump23o, p2o, p3o); \
- dct_wadd(sump14o, p1o, p4o); \
- dct_long_mac(x4, sump13o, row7, rot3_0); \
- dct_long_mac(x5, sump24o, row5, rot3_1); \
- dct_long_mac(x6, sump23o, row3, rot3_2); \
- dct_long_mac(x7, sump14o, row1, rot3_3); \
- dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
- dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
- dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
- dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
- }
-
- // load
- row0 = vld1q_s16(data + 0*8);
- row1 = vld1q_s16(data + 1*8);
- row2 = vld1q_s16(data + 2*8);
- row3 = vld1q_s16(data + 3*8);
- row4 = vld1q_s16(data + 4*8);
- row5 = vld1q_s16(data + 5*8);
- row6 = vld1q_s16(data + 6*8);
- row7 = vld1q_s16(data + 7*8);
-
- // add DC bias
- row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
-
- // column pass
- dct_pass(vrshrn_n_s32, 10);
-
- // 16bit 8x8 transpose
- {
-// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.
-// whether compilers actually get this is another story, sadly.
-#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
-#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }
-#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }
-
- // pass 1
- dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
- dct_trn16(row2, row3);
- dct_trn16(row4, row5);
- dct_trn16(row6, row7);
-
- // pass 2
- dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
- dct_trn32(row1, row3);
- dct_trn32(row4, row6);
- dct_trn32(row5, row7);
-
- // pass 3
- dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
- dct_trn64(row1, row5);
- dct_trn64(row2, row6);
- dct_trn64(row3, row7);
-
-#undef dct_trn16
-#undef dct_trn32
-#undef dct_trn64
- }
-
- // row pass
- // vrshrn_n_s32 only supports shifts up to 16, we need
- // 17. so do a non-rounding shift of 16 first then follow
- // up with a rounding shift by 1.
- dct_pass(vshrn_n_s32, 16);
-
- {
- // pack and round
- uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
- uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
- uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
- uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
- uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
- uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
- uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
- uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
-
- // again, these can translate into one instruction, but often don't.
-#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
-#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }
-#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }
-
- // sadly can't use interleaved stores here since we only write
- // 8 bytes to each scan line!
-
- // 8x8 8-bit transpose pass 1
- dct_trn8_8(p0, p1);
- dct_trn8_8(p2, p3);
- dct_trn8_8(p4, p5);
- dct_trn8_8(p6, p7);
-
- // pass 2
- dct_trn8_16(p0, p2);
- dct_trn8_16(p1, p3);
- dct_trn8_16(p4, p6);
- dct_trn8_16(p5, p7);
-
- // pass 3
- dct_trn8_32(p0, p4);
- dct_trn8_32(p1, p5);
- dct_trn8_32(p2, p6);
- dct_trn8_32(p3, p7);
-
- // store
- vst1_u8(out, p0); out += out_stride;
- vst1_u8(out, p1); out += out_stride;
- vst1_u8(out, p2); out += out_stride;
- vst1_u8(out, p3); out += out_stride;
- vst1_u8(out, p4); out += out_stride;
- vst1_u8(out, p5); out += out_stride;
- vst1_u8(out, p6); out += out_stride;
- vst1_u8(out, p7);
-
-#undef dct_trn8_8
-#undef dct_trn8_16
-#undef dct_trn8_32
- }
-
-#undef dct_long_mul
-#undef dct_long_mac
-#undef dct_widen
-#undef dct_wadd
-#undef dct_wsub
-#undef dct_bfly32o
-#undef dct_pass
-}
-
-#endif // STBI_NEON
-
-#define STBI__MARKER_none 0xff
-// if there's a pending marker from the entropy stream, return that
-// otherwise, fetch from the stream and get a marker. if there's no
-// marker, return 0xff, which is never a valid marker value
-static stbi_uc stbi__get_marker(stbi__jpeg *j)
-{
- stbi_uc x;
- if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
- x = stbi__get8(j->s);
- if (x != 0xff) return STBI__MARKER_none;
- while (x == 0xff)
- x = stbi__get8(j->s); // consume repeated 0xff fill bytes
- return x;
-}
-
-// in each scan, we'll have scan_n components, and the order
-// of the components is specified by order[]
-#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
-
-// after a restart interval, stbi__jpeg_reset the entropy decoder and
-// the dc prediction
-static void stbi__jpeg_reset(stbi__jpeg *j)
-{
- j->code_bits = 0;
- j->code_buffer = 0;
- j->nomore = 0;
- j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
- j->marker = STBI__MARKER_none;
- j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
- j->eob_run = 0;
- // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
- // since we don't even allow 1<<30 pixels
-}
-
-static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
-{
- stbi__jpeg_reset(z);
- if (!z->progressive) {
- if (z->scan_n == 1) {
- int i,j;
- STBI_SIMD_ALIGN(short, data[64]);
- int n = z->order[0];
- // non-interleaved data, we just need to process one block at a time,
- // in trivial scanline order
- // number of blocks to do just depends on how many actual "pixels" this
- // component has, independent of interleaved MCU blocking and such
- int w = (z->img_comp[n].x+7) >> 3;
- int h = (z->img_comp[n].y+7) >> 3;
- for (j=0; j < h; ++j) {
- for (i=0; i < w; ++i) {
- int ha = z->img_comp[n].ha;
- if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
- z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
- // every data block is an MCU, so countdown the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- // if it's NOT a restart, then just bail, so we get corrupt data
- // rather than no data
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- } else { // interleaved
- int i,j,k,x,y;
- STBI_SIMD_ALIGN(short, data[64]);
- for (j=0; j < z->img_mcu_y; ++j) {
- for (i=0; i < z->img_mcu_x; ++i) {
- // scan an interleaved mcu... process scan_n components in order
- for (k=0; k < z->scan_n; ++k) {
- int n = z->order[k];
- // scan out an mcu's worth of this component; that's just determined
- // by the basic H and V specified for the component
- for (y=0; y < z->img_comp[n].v; ++y) {
- for (x=0; x < z->img_comp[n].h; ++x) {
- int x2 = (i*z->img_comp[n].h + x)*8;
- int y2 = (j*z->img_comp[n].v + y)*8;
- int ha = z->img_comp[n].ha;
- if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
- z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
- }
- }
- }
- // after all interleaved components, that's an interleaved MCU,
- // so now count down the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- }
- } else {
- if (z->scan_n == 1) {
- int i,j;
- int n = z->order[0];
- // non-interleaved data, we just need to process one block at a time,
- // in trivial scanline order
- // number of blocks to do just depends on how many actual "pixels" this
- // component has, independent of interleaved MCU blocking and such
- int w = (z->img_comp[n].x+7) >> 3;
- int h = (z->img_comp[n].y+7) >> 3;
- for (j=0; j < h; ++j) {
- for (i=0; i < w; ++i) {
- short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
- if (z->spec_start == 0) {
- if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
- return 0;
- } else {
- int ha = z->img_comp[n].ha;
- if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
- return 0;
- }
- // every data block is an MCU, so countdown the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- } else { // interleaved
- int i,j,k,x,y;
- for (j=0; j < z->img_mcu_y; ++j) {
- for (i=0; i < z->img_mcu_x; ++i) {
- // scan an interleaved mcu... process scan_n components in order
- for (k=0; k < z->scan_n; ++k) {
- int n = z->order[k];
- // scan out an mcu's worth of this component; that's just determined
- // by the basic H and V specified for the component
- for (y=0; y < z->img_comp[n].v; ++y) {
- for (x=0; x < z->img_comp[n].h; ++x) {
- int x2 = (i*z->img_comp[n].h + x);
- int y2 = (j*z->img_comp[n].v + y);
- short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
- if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
- return 0;
- }
- }
- }
- // after all interleaved components, that's an interleaved MCU,
- // so now count down the restart interval
- if (--z->todo <= 0) {
- if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
- if (!STBI__RESTART(z->marker)) return 1;
- stbi__jpeg_reset(z);
- }
- }
- }
- return 1;
- }
- }
-}
-
-static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)
-{
- int i;
- for (i=0; i < 64; ++i)
- data[i] *= dequant[i];
-}
-
-static void stbi__jpeg_finish(stbi__jpeg *z)
-{
- if (z->progressive) {
- // dequantize and idct the data
- int i,j,n;
- for (n=0; n < z->s->img_n; ++n) {
- int w = (z->img_comp[n].x+7) >> 3;
- int h = (z->img_comp[n].y+7) >> 3;
- for (j=0; j < h; ++j) {
- for (i=0; i < w; ++i) {
- short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
- stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
- z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
- }
- }
- }
- }
-}
-
-static int stbi__process_marker(stbi__jpeg *z, int m)
-{
- int L;
- switch (m) {
- case STBI__MARKER_none: // no marker found
- return stbi__err("expected marker","Corrupt JPEG");
-
- case 0xDD: // DRI - specify restart interval
- if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
- z->restart_interval = stbi__get16be(z->s);
- return 1;
-
- case 0xDB: // DQT - define quantization table
- L = stbi__get16be(z->s)-2;
- while (L > 0) {
- int q = stbi__get8(z->s);
- int p = q >> 4, sixteen = (p != 0);
- int t = q & 15,i;
- if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
- if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
-
- for (i=0; i < 64; ++i)
- z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
- L -= (sixteen ? 129 : 65);
- }
- return L==0;
-
- case 0xC4: // DHT - define huffman table
- L = stbi__get16be(z->s)-2;
- while (L > 0) {
- stbi_uc *v;
- int sizes[16],i,n=0;
- int q = stbi__get8(z->s);
- int tc = q >> 4;
- int th = q & 15;
- if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
- for (i=0; i < 16; ++i) {
- sizes[i] = stbi__get8(z->s);
- n += sizes[i];
- }
- if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values!
- L -= 17;
- if (tc == 0) {
- if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
- v = z->huff_dc[th].values;
- } else {
- if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
- v = z->huff_ac[th].values;
- }
- for (i=0; i < n; ++i)
- v[i] = stbi__get8(z->s);
- if (tc != 0)
- stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
- L -= n;
- }
- return L==0;
- }
-
- // check for comment block or APP blocks
- if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
- L = stbi__get16be(z->s);
- if (L < 2) {
- if (m == 0xFE)
- return stbi__err("bad COM len","Corrupt JPEG");
- else
- return stbi__err("bad APP len","Corrupt JPEG");
- }
- L -= 2;
-
- if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
- static const unsigned char tag[5] = {'J','F','I','F','\0'};
- int ok = 1;
- int i;
- for (i=0; i < 5; ++i)
- if (stbi__get8(z->s) != tag[i])
- ok = 0;
- L -= 5;
- if (ok)
- z->jfif = 1;
- } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
- static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
- int ok = 1;
- int i;
- for (i=0; i < 6; ++i)
- if (stbi__get8(z->s) != tag[i])
- ok = 0;
- L -= 6;
- if (ok) {
- stbi__get8(z->s); // version
- stbi__get16be(z->s); // flags0
- stbi__get16be(z->s); // flags1
- z->app14_color_transform = stbi__get8(z->s); // color transform
- L -= 6;
- }
- }
-
- stbi__skip(z->s, L);
- return 1;
- }
-
- return stbi__err("unknown marker","Corrupt JPEG");
-}
-
-// after we see SOS
-static int stbi__process_scan_header(stbi__jpeg *z)
-{
- int i;
- int Ls = stbi__get16be(z->s);
- z->scan_n = stbi__get8(z->s);
- if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG");
- if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");
- for (i=0; i < z->scan_n; ++i) {
- int id = stbi__get8(z->s), which;
- int q = stbi__get8(z->s);
- for (which = 0; which < z->s->img_n; ++which)
- if (z->img_comp[which].id == id)
- break;
- if (which == z->s->img_n) return 0; // no match
- z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
- z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
- z->order[i] = which;
- }
-
- {
- int aa;
- z->spec_start = stbi__get8(z->s);
- z->spec_end = stbi__get8(z->s); // should be 63, but might be 0
- aa = stbi__get8(z->s);
- z->succ_high = (aa >> 4);
- z->succ_low = (aa & 15);
- if (z->progressive) {
- if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
- return stbi__err("bad SOS", "Corrupt JPEG");
- } else {
- if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");
- if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");
- z->spec_end = 63;
- }
- }
-
- return 1;
-}
-
-static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)
-{
- int i;
- for (i=0; i < ncomp; ++i) {
- if (z->img_comp[i].raw_data) {
- STBI_FREE(z->img_comp[i].raw_data);
- z->img_comp[i].raw_data = NULL;
- z->img_comp[i].data = NULL;
- }
- if (z->img_comp[i].raw_coeff) {
- STBI_FREE(z->img_comp[i].raw_coeff);
- z->img_comp[i].raw_coeff = 0;
- z->img_comp[i].coeff = 0;
- }
- if (z->img_comp[i].linebuf) {
- STBI_FREE(z->img_comp[i].linebuf);
- z->img_comp[i].linebuf = NULL;
- }
- }
- return why;
-}
-
-static int stbi__process_frame_header(stbi__jpeg *z, int scan)
-{
- stbi__context *s = z->s;
- int Lf,p,i,q, h_max=1,v_max=1,c;
- Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
- p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
- s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
- s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
- if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
- if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
- c = stbi__get8(s);
- if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
- s->img_n = c;
- for (i=0; i < c; ++i) {
- z->img_comp[i].data = NULL;
- z->img_comp[i].linebuf = NULL;
- }
-
- if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
-
- z->rgb = 0;
- for (i=0; i < s->img_n; ++i) {
- static const unsigned char rgb[3] = { 'R', 'G', 'B' };
- z->img_comp[i].id = stbi__get8(s);
- if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
- ++z->rgb;
- q = stbi__get8(s);
- z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG");
- z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG");
- z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
- }
-
- if (scan != STBI__SCAN_load) return 1;
-
- if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode");
-
- for (i=0; i < s->img_n; ++i) {
- if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
- if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
- }
-
- // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios
- // and I've never seen a non-corrupted JPEG file actually use them
- for (i=0; i < s->img_n; ++i) {
- if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG");
- if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG");
- }
-
- // compute interleaved mcu info
- z->img_h_max = h_max;
- z->img_v_max = v_max;
- z->img_mcu_w = h_max * 8;
- z->img_mcu_h = v_max * 8;
- // these sizes can't be more than 17 bits
- z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
- z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
-
- for (i=0; i < s->img_n; ++i) {
- // number of effective pixels (e.g. for non-interleaved MCU)
- z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
- z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
- // to simplify generation, we'll allocate enough memory to decode
- // the bogus oversized data from using interleaved MCUs and their
- // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
- // discard the extra data until colorspace conversion
- //
- // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)
- // so these muls can't overflow with 32-bit ints (which we require)
- z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
- z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
- z->img_comp[i].coeff = 0;
- z->img_comp[i].raw_coeff = 0;
- z->img_comp[i].linebuf = NULL;
- z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
- if (z->img_comp[i].raw_data == NULL)
- return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
- // align blocks for idct using mmx/sse
- z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
- if (z->progressive) {
- // w2, h2 are multiples of 8 (see above)
- z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
- z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
- z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
- if (z->img_comp[i].raw_coeff == NULL)
- return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
- z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
- }
- }
-
- return 1;
-}
-
-// use comparisons since in some cases we handle more than one case (e.g. SOF)
-#define stbi__DNL(x) ((x) == 0xdc)
-#define stbi__SOI(x) ((x) == 0xd8)
-#define stbi__EOI(x) ((x) == 0xd9)
-#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
-#define stbi__SOS(x) ((x) == 0xda)
-
-#define stbi__SOF_progressive(x) ((x) == 0xc2)
-
-static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
-{
- int m;
- z->jfif = 0;
- z->app14_color_transform = -1; // valid values are 0,1,2
- z->marker = STBI__MARKER_none; // initialize cached marker to empty
- m = stbi__get_marker(z);
- if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
- if (scan == STBI__SCAN_type) return 1;
- m = stbi__get_marker(z);
- while (!stbi__SOF(m)) {
- if (!stbi__process_marker(z,m)) return 0;
- m = stbi__get_marker(z);
- while (m == STBI__MARKER_none) {
- // some files have extra padding after their blocks, so ok, we'll scan
- if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
- m = stbi__get_marker(z);
- }
- }
- z->progressive = stbi__SOF_progressive(m);
- if (!stbi__process_frame_header(z, scan)) return 0;
- return 1;
-}
-
-static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j)
-{
- // some JPEGs have junk at end, skip over it but if we find what looks
- // like a valid marker, resume there
- while (!stbi__at_eof(j->s)) {
- stbi_uc x = stbi__get8(j->s);
- while (x == 0xff) { // might be a marker
- if (stbi__at_eof(j->s)) return STBI__MARKER_none;
- x = stbi__get8(j->s);
- if (x != 0x00 && x != 0xff) {
- // not a stuffed zero or lead-in to another marker, looks
- // like an actual marker, return it
- return x;
- }
- // stuffed zero has x=0 now which ends the loop, meaning we go
- // back to regular scan loop.
- // repeated 0xff keeps trying to read the next byte of the marker.
- }
- }
- return STBI__MARKER_none;
-}
-
-// decode image to YCbCr format
-static int stbi__decode_jpeg_image(stbi__jpeg *j)
-{
- int m;
- for (m = 0; m < 4; m++) {
- j->img_comp[m].raw_data = NULL;
- j->img_comp[m].raw_coeff = NULL;
- }
- j->restart_interval = 0;
- if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
- m = stbi__get_marker(j);
- while (!stbi__EOI(m)) {
- if (stbi__SOS(m)) {
- if (!stbi__process_scan_header(j)) return 0;
- if (!stbi__parse_entropy_coded_data(j)) return 0;
- if (j->marker == STBI__MARKER_none ) {
- j->marker = stbi__skip_jpeg_junk_at_end(j);
- // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
- }
- m = stbi__get_marker(j);
- if (STBI__RESTART(m))
- m = stbi__get_marker(j);
- } else if (stbi__DNL(m)) {
- int Ld = stbi__get16be(j->s);
- stbi__uint32 NL = stbi__get16be(j->s);
- if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
- if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
- m = stbi__get_marker(j);
- } else {
- if (!stbi__process_marker(j, m)) return 1;
- m = stbi__get_marker(j);
- }
- }
- if (j->progressive)
- stbi__jpeg_finish(j);
- return 1;
-}
-
-// static jfif-centered resampling (across block boundaries)
-
-typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
- int w, int hs);
-
-#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
-
-static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- STBI_NOTUSED(out);
- STBI_NOTUSED(in_far);
- STBI_NOTUSED(w);
- STBI_NOTUSED(hs);
- return in_near;
-}
-
-static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate two samples vertically for every one in input
- int i;
- STBI_NOTUSED(hs);
- for (i=0; i < w; ++i)
- out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
- return out;
-}
-
-static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate two samples horizontally for every one in input
- int i;
- stbi_uc *input = in_near;
-
- if (w == 1) {
- // if only one sample, can't do any interpolation
- out[0] = out[1] = input[0];
- return out;
- }
-
- out[0] = input[0];
- out[1] = stbi__div4(input[0]*3 + input[1] + 2);
- for (i=1; i < w-1; ++i) {
- int n = 3*input[i]+2;
- out[i*2+0] = stbi__div4(n+input[i-1]);
- out[i*2+1] = stbi__div4(n+input[i+1]);
- }
- out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
- out[i*2+1] = input[w-1];
-
- STBI_NOTUSED(in_far);
- STBI_NOTUSED(hs);
-
- return out;
-}
-
-#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
-
-static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate 2x2 samples for every one in input
- int i,t0,t1;
- if (w == 1) {
- out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
- return out;
- }
-
- t1 = 3*in_near[0] + in_far[0];
- out[0] = stbi__div4(t1+2);
- for (i=1; i < w; ++i) {
- t0 = t1;
- t1 = 3*in_near[i]+in_far[i];
- out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
- out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
- }
- out[w*2-1] = stbi__div4(t1+2);
-
- STBI_NOTUSED(hs);
-
- return out;
-}
-
-#if defined(STBI_SSE2) || defined(STBI_NEON)
-static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // need to generate 2x2 samples for every one in input
- int i=0,t0,t1;
-
- if (w == 1) {
- out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
- return out;
- }
-
- t1 = 3*in_near[0] + in_far[0];
- // process groups of 8 pixels for as long as we can.
- // note we can't handle the last pixel in a row in this loop
- // because we need to handle the filter boundary conditions.
- for (; i < ((w-1) & ~7); i += 8) {
-#if defined(STBI_SSE2)
- // load and perform the vertical filtering pass
- // this uses 3*x + y = 4*x + (y - x)
- __m128i zero = _mm_setzero_si128();
- __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
- __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
- __m128i farw = _mm_unpacklo_epi8(farb, zero);
- __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
- __m128i diff = _mm_sub_epi16(farw, nearw);
- __m128i nears = _mm_slli_epi16(nearw, 2);
- __m128i curr = _mm_add_epi16(nears, diff); // current row
-
- // horizontal filter works the same based on shifted vers of current
- // row. "prev" is current row shifted right by 1 pixel; we need to
- // insert the previous pixel value (from t1).
- // "next" is current row shifted left by 1 pixel, with first pixel
- // of next block of 8 pixels added in.
- __m128i prv0 = _mm_slli_si128(curr, 2);
- __m128i nxt0 = _mm_srli_si128(curr, 2);
- __m128i prev = _mm_insert_epi16(prv0, t1, 0);
- __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
-
- // horizontal filter, polyphase implementation since it's convenient:
- // even pixels = 3*cur + prev = cur*4 + (prev - cur)
- // odd pixels = 3*cur + next = cur*4 + (next - cur)
- // note the shared term.
- __m128i bias = _mm_set1_epi16(8);
- __m128i curs = _mm_slli_epi16(curr, 2);
- __m128i prvd = _mm_sub_epi16(prev, curr);
- __m128i nxtd = _mm_sub_epi16(next, curr);
- __m128i curb = _mm_add_epi16(curs, bias);
- __m128i even = _mm_add_epi16(prvd, curb);
- __m128i odd = _mm_add_epi16(nxtd, curb);
-
- // interleave even and odd pixels, then undo scaling.
- __m128i int0 = _mm_unpacklo_epi16(even, odd);
- __m128i int1 = _mm_unpackhi_epi16(even, odd);
- __m128i de0 = _mm_srli_epi16(int0, 4);
- __m128i de1 = _mm_srli_epi16(int1, 4);
-
- // pack and write output
- __m128i outv = _mm_packus_epi16(de0, de1);
- _mm_storeu_si128((__m128i *) (out + i*2), outv);
-#elif defined(STBI_NEON)
- // load and perform the vertical filtering pass
- // this uses 3*x + y = 4*x + (y - x)
- uint8x8_t farb = vld1_u8(in_far + i);
- uint8x8_t nearb = vld1_u8(in_near + i);
- int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
- int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
- int16x8_t curr = vaddq_s16(nears, diff); // current row
-
- // horizontal filter works the same based on shifted vers of current
- // row. "prev" is current row shifted right by 1 pixel; we need to
- // insert the previous pixel value (from t1).
- // "next" is current row shifted left by 1 pixel, with first pixel
- // of next block of 8 pixels added in.
- int16x8_t prv0 = vextq_s16(curr, curr, 7);
- int16x8_t nxt0 = vextq_s16(curr, curr, 1);
- int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
- int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
-
- // horizontal filter, polyphase implementation since it's convenient:
- // even pixels = 3*cur + prev = cur*4 + (prev - cur)
- // odd pixels = 3*cur + next = cur*4 + (next - cur)
- // note the shared term.
- int16x8_t curs = vshlq_n_s16(curr, 2);
- int16x8_t prvd = vsubq_s16(prev, curr);
- int16x8_t nxtd = vsubq_s16(next, curr);
- int16x8_t even = vaddq_s16(curs, prvd);
- int16x8_t odd = vaddq_s16(curs, nxtd);
-
- // undo scaling and round, then store with even/odd phases interleaved
- uint8x8x2_t o;
- o.val[0] = vqrshrun_n_s16(even, 4);
- o.val[1] = vqrshrun_n_s16(odd, 4);
- vst2_u8(out + i*2, o);
-#endif
-
- // "previous" value for next iter
- t1 = 3*in_near[i+7] + in_far[i+7];
- }
-
- t0 = t1;
- t1 = 3*in_near[i] + in_far[i];
- out[i*2] = stbi__div16(3*t1 + t0 + 8);
-
- for (++i; i < w; ++i) {
- t0 = t1;
- t1 = 3*in_near[i]+in_far[i];
- out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
- out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
- }
- out[w*2-1] = stbi__div4(t1+2);
-
- STBI_NOTUSED(hs);
-
- return out;
-}
-#endif
-
-static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
-{
- // resample with nearest-neighbor
- int i,j;
- STBI_NOTUSED(in_far);
- for (i=0; i < w; ++i)
- for (j=0; j < hs; ++j)
- out[i*hs+j] = in_near[i];
- return out;
-}
-
-// this is a reduced-precision calculation of YCbCr-to-RGB introduced
-// to make sure the code produces the same results in both SIMD and scalar
-#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
-static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)
-{
- int i;
- for (i=0; i < count; ++i) {
- int y_fixed = (y[i] << 20) + (1<<19); // rounding
- int r,g,b;
- int cr = pcr[i] - 128;
- int cb = pcb[i] - 128;
- r = y_fixed + cr* stbi__float2fixed(1.40200f);
- g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
- b = y_fixed + cb* stbi__float2fixed(1.77200f);
- r >>= 20;
- g >>= 20;
- b >>= 20;
- if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
- if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
- if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
- out[0] = (stbi_uc)r;
- out[1] = (stbi_uc)g;
- out[2] = (stbi_uc)b;
- out[3] = 255;
- out += step;
- }
-}
-
-#if defined(STBI_SSE2) || defined(STBI_NEON)
-static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)
-{
- int i = 0;
-
-#ifdef STBI_SSE2
- // step == 3 is pretty ugly on the final interleave, and i'm not convinced
- // it's useful in practice (you wouldn't use it for textures, for example).
- // so just accelerate step == 4 case.
- if (step == 4) {
- // this is a fairly straightforward implementation and not super-optimized.
- __m128i signflip = _mm_set1_epi8(-0x80);
- __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f));
- __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
- __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
- __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f));
- __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
- __m128i xw = _mm_set1_epi16(255); // alpha channel
-
- for (; i+7 < count; i += 8) {
- // load
- __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
- __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
- __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
- __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
- __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
-
- // unpack to short (and left-shift cr, cb by 8)
- __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
- __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
- __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
-
- // color transform
- __m128i yws = _mm_srli_epi16(yw, 4);
- __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
- __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
- __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
- __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
- __m128i rws = _mm_add_epi16(cr0, yws);
- __m128i gwt = _mm_add_epi16(cb0, yws);
- __m128i bws = _mm_add_epi16(yws, cb1);
- __m128i gws = _mm_add_epi16(gwt, cr1);
-
- // descale
- __m128i rw = _mm_srai_epi16(rws, 4);
- __m128i bw = _mm_srai_epi16(bws, 4);
- __m128i gw = _mm_srai_epi16(gws, 4);
-
- // back to byte, set up for transpose
- __m128i brb = _mm_packus_epi16(rw, bw);
- __m128i gxb = _mm_packus_epi16(gw, xw);
-
- // transpose to interleave channels
- __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
- __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
- __m128i o0 = _mm_unpacklo_epi16(t0, t1);
- __m128i o1 = _mm_unpackhi_epi16(t0, t1);
-
- // store
- _mm_storeu_si128((__m128i *) (out + 0), o0);
- _mm_storeu_si128((__m128i *) (out + 16), o1);
- out += 32;
- }
- }
-#endif
-
-#ifdef STBI_NEON
- // in this version, step=3 support would be easy to add. but is there demand?
- if (step == 4) {
- // this is a fairly straightforward implementation and not super-optimized.
- uint8x8_t signflip = vdup_n_u8(0x80);
- int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f));
- int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
- int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
- int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f));
-
- for (; i+7 < count; i += 8) {
- // load
- uint8x8_t y_bytes = vld1_u8(y + i);
- uint8x8_t cr_bytes = vld1_u8(pcr + i);
- uint8x8_t cb_bytes = vld1_u8(pcb + i);
- int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
- int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
-
- // expand to s16
- int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
- int16x8_t crw = vshll_n_s8(cr_biased, 7);
- int16x8_t cbw = vshll_n_s8(cb_biased, 7);
-
- // color transform
- int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
- int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
- int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
- int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
- int16x8_t rws = vaddq_s16(yws, cr0);
- int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
- int16x8_t bws = vaddq_s16(yws, cb1);
-
- // undo scaling, round, convert to byte
- uint8x8x4_t o;
- o.val[0] = vqrshrun_n_s16(rws, 4);
- o.val[1] = vqrshrun_n_s16(gws, 4);
- o.val[2] = vqrshrun_n_s16(bws, 4);
- o.val[3] = vdup_n_u8(255);
-
- // store, interleaving r/g/b/a
- vst4_u8(out, o);
- out += 8*4;
- }
- }
-#endif
-
- for (; i < count; ++i) {
- int y_fixed = (y[i] << 20) + (1<<19); // rounding
- int r,g,b;
- int cr = pcr[i] - 128;
- int cb = pcb[i] - 128;
- r = y_fixed + cr* stbi__float2fixed(1.40200f);
- g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
- b = y_fixed + cb* stbi__float2fixed(1.77200f);
- r >>= 20;
- g >>= 20;
- b >>= 20;
- if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
- if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
- if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
- out[0] = (stbi_uc)r;
- out[1] = (stbi_uc)g;
- out[2] = (stbi_uc)b;
- out[3] = 255;
- out += step;
- }
-}
-#endif
-
-// set up the kernels
-static void stbi__setup_jpeg(stbi__jpeg *j)
-{
- j->idct_block_kernel = stbi__idct_block;
- j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
- j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
-
-#ifdef STBI_SSE2
- if (stbi__sse2_available()) {
- j->idct_block_kernel = stbi__idct_simd;
- j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
- j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
- }
-#endif
-
-#ifdef STBI_NEON
- j->idct_block_kernel = stbi__idct_simd;
- j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
- j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
-#endif
-}
-
-// clean up the temporary component buffers
-static void stbi__cleanup_jpeg(stbi__jpeg *j)
-{
- stbi__free_jpeg_components(j, j->s->img_n, 0);
-}
-
-typedef struct
-{
- resample_row_func resample;
- stbi_uc *line0,*line1;
- int hs,vs; // expansion factor in each axis
- int w_lores; // horizontal pixels pre-expansion
- int ystep; // how far through vertical expansion we are
- int ypos; // which pre-expansion row we're on
-} stbi__resample;
-
-// fast 0..255 * 0..255 => 0..255 rounded multiplication
-static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
-{
- unsigned int t = x*y + 128;
- return (stbi_uc) ((t + (t >>8)) >> 8);
-}
-
-static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
-{
- int n, decode_n, is_rgb;
- z->s->img_n = 0; // make stbi__cleanup_jpeg safe
-
- // validate req_comp
- if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
-
- // load a jpeg image from whichever source, but leave in YCbCr format
- if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
-
- // determine actual number of components to generate
- n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
-
- is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
-
- if (z->s->img_n == 3 && n < 3 && !is_rgb)
- decode_n = 1;
- else
- decode_n = z->s->img_n;
-
- // nothing to do if no components requested; check this now to avoid
- // accessing uninitialized coutput[0] later
- if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }
-
- // resample and color-convert
- {
- int k;
- unsigned int i,j;
- stbi_uc *output;
- stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
-
- stbi__resample res_comp[4];
-
- for (k=0; k < decode_n; ++k) {
- stbi__resample *r = &res_comp[k];
-
- // allocate line buffer big enough for upsampling off the edges
- // with upsample factor of 4
- z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
- if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
-
- r->hs = z->img_h_max / z->img_comp[k].h;
- r->vs = z->img_v_max / z->img_comp[k].v;
- r->ystep = r->vs >> 1;
- r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
- r->ypos = 0;
- r->line0 = r->line1 = z->img_comp[k].data;
-
- if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
- else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
- else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
- else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
- else r->resample = stbi__resample_row_generic;
- }
-
- // can't error after this so, this is safe
- output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
- if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
-
- // now go ahead and resample
- for (j=0; j < z->s->img_y; ++j) {
- stbi_uc *out = output + n * z->s->img_x * j;
- for (k=0; k < decode_n; ++k) {
- stbi__resample *r = &res_comp[k];
- int y_bot = r->ystep >= (r->vs >> 1);
- coutput[k] = r->resample(z->img_comp[k].linebuf,
- y_bot ? r->line1 : r->line0,
- y_bot ? r->line0 : r->line1,
- r->w_lores, r->hs);
- if (++r->ystep >= r->vs) {
- r->ystep = 0;
- r->line0 = r->line1;
- if (++r->ypos < z->img_comp[k].y)
- r->line1 += z->img_comp[k].w2;
- }
- }
- if (n >= 3) {
- stbi_uc *y = coutput[0];
- if (z->s->img_n == 3) {
- if (is_rgb) {
- for (i=0; i < z->s->img_x; ++i) {
- out[0] = y[i];
- out[1] = coutput[1][i];
- out[2] = coutput[2][i];
- out[3] = 255;
- out += n;
- }
- } else {
- z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
- }
- } else if (z->s->img_n == 4) {
- if (z->app14_color_transform == 0) { // CMYK
- for (i=0; i < z->s->img_x; ++i) {
- stbi_uc m = coutput[3][i];
- out[0] = stbi__blinn_8x8(coutput[0][i], m);
- out[1] = stbi__blinn_8x8(coutput[1][i], m);
- out[2] = stbi__blinn_8x8(coutput[2][i], m);
- out[3] = 255;
- out += n;
- }
- } else if (z->app14_color_transform == 2) { // YCCK
- z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
- for (i=0; i < z->s->img_x; ++i) {
- stbi_uc m = coutput[3][i];
- out[0] = stbi__blinn_8x8(255 - out[0], m);
- out[1] = stbi__blinn_8x8(255 - out[1], m);
- out[2] = stbi__blinn_8x8(255 - out[2], m);
- out += n;
- }
- } else { // YCbCr + alpha? Ignore the fourth channel for now
- z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
- }
- } else
- for (i=0; i < z->s->img_x; ++i) {
- out[0] = out[1] = out[2] = y[i];
- out[3] = 255; // not used if n==3
- out += n;
- }
- } else {
- if (is_rgb) {
- if (n == 1)
- for (i=0; i < z->s->img_x; ++i)
- *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
- else {
- for (i=0; i < z->s->img_x; ++i, out += 2) {
- out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
- out[1] = 255;
- }
- }
- } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
- for (i=0; i < z->s->img_x; ++i) {
- stbi_uc m = coutput[3][i];
- stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
- stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
- stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
- out[0] = stbi__compute_y(r, g, b);
- out[1] = 255;
- out += n;
- }
- } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
- for (i=0; i < z->s->img_x; ++i) {
- out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
- out[1] = 255;
- out += n;
- }
- } else {
- stbi_uc *y = coutput[0];
- if (n == 1)
- for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
- else
- for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
- }
- }
- }
- stbi__cleanup_jpeg(z);
- *out_x = z->s->img_x;
- *out_y = z->s->img_y;
- if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
- return output;
- }
-}
-
-static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- unsigned char* result;
- stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
- if (!j) return stbi__errpuc("outofmem", "Out of memory");
- memset(j, 0, sizeof(stbi__jpeg));
- STBI_NOTUSED(ri);
- j->s = s;
- stbi__setup_jpeg(j);
- result = load_jpeg_image(j, x,y,comp,req_comp);
- STBI_FREE(j);
- return result;
-}
-
-static int stbi__jpeg_test(stbi__context *s)
-{
- int r;
- stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
- if (!j) return stbi__err("outofmem", "Out of memory");
- memset(j, 0, sizeof(stbi__jpeg));
- j->s = s;
- stbi__setup_jpeg(j);
- r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
- stbi__rewind(s);
- STBI_FREE(j);
- return r;
-}
-
-static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
-{
- if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
- stbi__rewind( j->s );
- return 0;
- }
- if (x) *x = j->s->img_x;
- if (y) *y = j->s->img_y;
- if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
- return 1;
-}
-
-static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int result;
- stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
- if (!j) return stbi__err("outofmem", "Out of memory");
- memset(j, 0, sizeof(stbi__jpeg));
- j->s = s;
- result = stbi__jpeg_info_raw(j, x, y, comp);
- STBI_FREE(j);
- return result;
-}
-#endif
-
-// public domain zlib decode v0.2 Sean Barrett 2006-11-18
-// simple implementation
-// - all input must be provided in an upfront buffer
-// - all output is written to a single output buffer (can malloc/realloc)
-// performance
-// - fast huffman
-
-#ifndef STBI_NO_ZLIB
-
-// fast-way is faster to check than jpeg huffman, but slow way is slower
-#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
-#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
-#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet
-
-// zlib-style huffman encoding
-// (jpegs packs from left, zlib from right, so can't share code)
-typedef struct
-{
- stbi__uint16 fast[1 << STBI__ZFAST_BITS];
- stbi__uint16 firstcode[16];
- int maxcode[17];
- stbi__uint16 firstsymbol[16];
- stbi_uc size[STBI__ZNSYMS];
- stbi__uint16 value[STBI__ZNSYMS];
-} stbi__zhuffman;
-
-stbi_inline static int stbi__bitreverse16(int n)
-{
- n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
- n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
- n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
- n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
- return n;
-}
-
-stbi_inline static int stbi__bit_reverse(int v, int bits)
-{
- STBI_ASSERT(bits <= 16);
- // to bit reverse n bits, reverse 16 and shift
- // e.g. 11 bits, bit reverse and shift away 5
- return stbi__bitreverse16(v) >> (16-bits);
-}
-
-static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)
-{
- int i,k=0;
- int code, next_code[16], sizes[17];
-
- // DEFLATE spec for generating codes
- memset(sizes, 0, sizeof(sizes));
- memset(z->fast, 0, sizeof(z->fast));
- for (i=0; i < num; ++i)
- ++sizes[sizelist[i]];
- sizes[0] = 0;
- for (i=1; i < 16; ++i)
- if (sizes[i] > (1 << i))
- return stbi__err("bad sizes", "Corrupt PNG");
- code = 0;
- for (i=1; i < 16; ++i) {
- next_code[i] = code;
- z->firstcode[i] = (stbi__uint16) code;
- z->firstsymbol[i] = (stbi__uint16) k;
- code = (code + sizes[i]);
- if (sizes[i])
- if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG");
- z->maxcode[i] = code << (16-i); // preshift for inner loop
- code <<= 1;
- k += sizes[i];
- }
- z->maxcode[16] = 0x10000; // sentinel
- for (i=0; i < num; ++i) {
- int s = sizelist[i];
- if (s) {
- int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
- stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
- z->size [c] = (stbi_uc ) s;
- z->value[c] = (stbi__uint16) i;
- if (s <= STBI__ZFAST_BITS) {
- int j = stbi__bit_reverse(next_code[s],s);
- while (j < (1 << STBI__ZFAST_BITS)) {
- z->fast[j] = fastv;
- j += (1 << s);
- }
- }
- ++next_code[s];
- }
- }
- return 1;
-}
-
-// zlib-from-memory implementation for PNG reading
-// because PNG allows splitting the zlib stream arbitrarily,
-// and it's annoying structurally to have PNG call ZLIB call PNG,
-// we require PNG read all the IDATs and combine them into a single
-// memory buffer
-
-typedef struct
-{
- stbi_uc *zbuffer, *zbuffer_end;
- int num_bits;
- int hit_zeof_once;
- stbi__uint32 code_buffer;
-
- char *zout;
- char *zout_start;
- char *zout_end;
- int z_expandable;
-
- stbi__zhuffman z_length, z_distance;
-} stbi__zbuf;
-
-stbi_inline static int stbi__zeof(stbi__zbuf *z)
-{
- return (z->zbuffer >= z->zbuffer_end);
-}
-
-stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
-{
- return stbi__zeof(z) ? 0 : *z->zbuffer++;
-}
-
-static void stbi__fill_bits(stbi__zbuf *z)
-{
- do {
- if (z->code_buffer >= (1U << z->num_bits)) {
- z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */
- return;
- }
- z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;
- z->num_bits += 8;
- } while (z->num_bits <= 24);
-}
-
-stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
-{
- unsigned int k;
- if (z->num_bits < n) stbi__fill_bits(z);
- k = z->code_buffer & ((1 << n) - 1);
- z->code_buffer >>= n;
- z->num_bits -= n;
- return k;
-}
-
-static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
-{
- int b,s,k;
- // not resolved by fast table, so compute it the slow way
- // use jpeg approach, which requires MSbits at top
- k = stbi__bit_reverse(a->code_buffer, 16);
- for (s=STBI__ZFAST_BITS+1; ; ++s)
- if (k < z->maxcode[s])
- break;
- if (s >= 16) return -1; // invalid code!
- // code size is s, so:
- b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
- if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere!
- if (z->size[b] != s) return -1; // was originally an assert, but report failure instead.
- a->code_buffer >>= s;
- a->num_bits -= s;
- return z->value[b];
-}
-
-stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
-{
- int b,s;
- if (a->num_bits < 16) {
- if (stbi__zeof(a)) {
- if (!a->hit_zeof_once) {
- // This is the first time we hit eof, insert 16 extra padding btis
- // to allow us to keep going; if we actually consume any of them
- // though, that is invalid data. This is caught later.
- a->hit_zeof_once = 1;
- a->num_bits += 16; // add 16 implicit zero bits
- } else {
- // We already inserted our extra 16 padding bits and are again
- // out, this stream is actually prematurely terminated.
- return -1;
- }
- } else {
- stbi__fill_bits(a);
- }
- }
- b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
- if (b) {
- s = b >> 9;
- a->code_buffer >>= s;
- a->num_bits -= s;
- return b & 511;
- }
- return stbi__zhuffman_decode_slowpath(a, z);
-}
-
-static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
-{
- char *q;
- unsigned int cur, limit, old_limit;
- z->zout = zout;
- if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
- cur = (unsigned int) (z->zout - z->zout_start);
- limit = old_limit = (unsigned) (z->zout_end - z->zout_start);
- if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory");
- while (cur + n > limit) {
- if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory");
- limit *= 2;
- }
- q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
- STBI_NOTUSED(old_limit);
- if (q == NULL) return stbi__err("outofmem", "Out of memory");
- z->zout_start = q;
- z->zout = q + cur;
- z->zout_end = q + limit;
- return 1;
-}
-
-static const int stbi__zlength_base[31] = {
- 3,4,5,6,7,8,9,10,11,13,
- 15,17,19,23,27,31,35,43,51,59,
- 67,83,99,115,131,163,195,227,258,0,0 };
-
-static const int stbi__zlength_extra[31]=
-{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
-
-static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
-257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
-
-static const int stbi__zdist_extra[32] =
-{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
-
-static int stbi__parse_huffman_block(stbi__zbuf *a)
-{
- char *zout = a->zout;
- for(;;) {
- int z = stbi__zhuffman_decode(a, &a->z_length);
- if (z < 256) {
- if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
- if (zout >= a->zout_end) {
- if (!stbi__zexpand(a, zout, 1)) return 0;
- zout = a->zout;
- }
- *zout++ = (char) z;
- } else {
- stbi_uc *p;
- int len,dist;
- if (z == 256) {
- a->zout = zout;
- if (a->hit_zeof_once && a->num_bits < 16) {
- // The first time we hit zeof, we inserted 16 extra zero bits into our bit
- // buffer so the decoder can just do its speculative decoding. But if we
- // actually consumed any of those bits (which is the case when num_bits < 16),
- // the stream actually read past the end so it is malformed.
- return stbi__err("unexpected end","Corrupt PNG");
- }
- return 1;
- }
- if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data
- z -= 257;
- len = stbi__zlength_base[z];
- if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
- z = stbi__zhuffman_decode(a, &a->z_distance);
- if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data
- dist = stbi__zdist_base[z];
- if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
- if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
- if (len > a->zout_end - zout) {
- if (!stbi__zexpand(a, zout, len)) return 0;
- zout = a->zout;
- }
- p = (stbi_uc *) (zout - dist);
- if (dist == 1) { // run of one byte; common in images.
- stbi_uc v = *p;
- if (len) { do *zout++ = v; while (--len); }
- } else {
- if (len) { do *zout++ = *p++; while (--len); }
- }
- }
- }
-}
-
-static int stbi__compute_huffman_codes(stbi__zbuf *a)
-{
- static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
- stbi__zhuffman z_codelength;
- stbi_uc lencodes[286+32+137];//padding for maximum single op
- stbi_uc codelength_sizes[19];
- int i,n;
-
- int hlit = stbi__zreceive(a,5) + 257;
- int hdist = stbi__zreceive(a,5) + 1;
- int hclen = stbi__zreceive(a,4) + 4;
- int ntot = hlit + hdist;
-
- memset(codelength_sizes, 0, sizeof(codelength_sizes));
- for (i=0; i < hclen; ++i) {
- int s = stbi__zreceive(a,3);
- codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
- }
- if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
-
- n = 0;
- while (n < ntot) {
- int c = stbi__zhuffman_decode(a, &z_codelength);
- if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");
- if (c < 16)
- lencodes[n++] = (stbi_uc) c;
- else {
- stbi_uc fill = 0;
- if (c == 16) {
- c = stbi__zreceive(a,2)+3;
- if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");
- fill = lencodes[n-1];
- } else if (c == 17) {
- c = stbi__zreceive(a,3)+3;
- } else if (c == 18) {
- c = stbi__zreceive(a,7)+11;
- } else {
- return stbi__err("bad codelengths", "Corrupt PNG");
- }
- if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");
- memset(lencodes+n, fill, c);
- n += c;
- }
- }
- if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG");
- if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
- if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
- return 1;
-}
-
-static int stbi__parse_uncompressed_block(stbi__zbuf *a)
-{
- stbi_uc header[4];
- int len,nlen,k;
- if (a->num_bits & 7)
- stbi__zreceive(a, a->num_bits & 7); // discard
- // drain the bit-packed data into header
- k = 0;
- while (a->num_bits > 0) {
- header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
- a->code_buffer >>= 8;
- a->num_bits -= 8;
- }
- if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG");
- // now fill header the normal way
- while (k < 4)
- header[k++] = stbi__zget8(a);
- len = header[1] * 256 + header[0];
- nlen = header[3] * 256 + header[2];
- if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
- if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
- if (a->zout + len > a->zout_end)
- if (!stbi__zexpand(a, a->zout, len)) return 0;
- memcpy(a->zout, a->zbuffer, len);
- a->zbuffer += len;
- a->zout += len;
- return 1;
-}
-
-static int stbi__parse_zlib_header(stbi__zbuf *a)
-{
- int cmf = stbi__zget8(a);
- int cm = cmf & 15;
- /* int cinfo = cmf >> 4; */
- int flg = stbi__zget8(a);
- if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
- if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
- if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
- if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
- // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
- return 1;
-}
-
-static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =
-{
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
- 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
- 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
-};
-static const stbi_uc stbi__zdefault_distance[32] =
-{
- 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
-};
-/*
-Init algorithm:
-{
- int i; // use <= to match clearly with spec
- for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
- for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
- for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
- for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
-
- for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
-}
-*/
-
-static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
-{
- int final, type;
- if (parse_header)
- if (!stbi__parse_zlib_header(a)) return 0;
- a->num_bits = 0;
- a->code_buffer = 0;
- a->hit_zeof_once = 0;
- do {
- final = stbi__zreceive(a,1);
- type = stbi__zreceive(a,2);
- if (type == 0) {
- if (!stbi__parse_uncompressed_block(a)) return 0;
- } else if (type == 3) {
- return 0;
- } else {
- if (type == 1) {
- // use fixed code lengths
- if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) return 0;
- if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;
- } else {
- if (!stbi__compute_huffman_codes(a)) return 0;
- }
- if (!stbi__parse_huffman_block(a)) return 0;
- }
- } while (!final);
- return 1;
-}
-
-static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
-{
- a->zout_start = obuf;
- a->zout = obuf;
- a->zout_end = obuf + olen;
- a->z_expandable = exp;
-
- return stbi__parse_zlib(a, parse_header);
-}
-
-STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
-{
- stbi__zbuf a;
- char *p = (char *) stbi__malloc(initial_size);
- if (p == NULL) return NULL;
- a.zbuffer = (stbi_uc *) buffer;
- a.zbuffer_end = (stbi_uc *) buffer + len;
- if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
- return a.zout_start;
- } else {
- STBI_FREE(a.zout_start);
- return NULL;
- }
-}
-
-STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
-{
- return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
-}
-
-STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
-{
- stbi__zbuf a;
- char *p = (char *) stbi__malloc(initial_size);
- if (p == NULL) return NULL;
- a.zbuffer = (stbi_uc *) buffer;
- a.zbuffer_end = (stbi_uc *) buffer + len;
- if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
- return a.zout_start;
- } else {
- STBI_FREE(a.zout_start);
- return NULL;
- }
-}
-
-STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
-{
- stbi__zbuf a;
- a.zbuffer = (stbi_uc *) ibuffer;
- a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
- if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
- return (int) (a.zout - a.zout_start);
- else
- return -1;
-}
-
-STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
-{
- stbi__zbuf a;
- char *p = (char *) stbi__malloc(16384);
- if (p == NULL) return NULL;
- a.zbuffer = (stbi_uc *) buffer;
- a.zbuffer_end = (stbi_uc *) buffer+len;
- if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
- if (outlen) *outlen = (int) (a.zout - a.zout_start);
- return a.zout_start;
- } else {
- STBI_FREE(a.zout_start);
- return NULL;
- }
-}
-
-STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
-{
- stbi__zbuf a;
- a.zbuffer = (stbi_uc *) ibuffer;
- a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
- if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
- return (int) (a.zout - a.zout_start);
- else
- return -1;
-}
-#endif
-
-// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
-// simple implementation
-// - only 8-bit samples
-// - no CRC checking
-// - allocates lots of intermediate memory
-// - avoids problem of streaming data between subsystems
-// - avoids explicit window management
-// performance
-// - uses stb_zlib, a PD zlib implementation with fast huffman decoding
-
-#ifndef STBI_NO_PNG
-typedef struct
-{
- stbi__uint32 length;
- stbi__uint32 type;
-} stbi__pngchunk;
-
-static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
-{
- stbi__pngchunk c;
- c.length = stbi__get32be(s);
- c.type = stbi__get32be(s);
- return c;
-}
-
-static int stbi__check_png_header(stbi__context *s)
-{
- static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
- int i;
- for (i=0; i < 8; ++i)
- if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
- return 1;
-}
-
-typedef struct
-{
- stbi__context *s;
- stbi_uc *idata, *expanded, *out;
- int depth;
-} stbi__png;
-
-
-enum {
- STBI__F_none=0,
- STBI__F_sub=1,
- STBI__F_up=2,
- STBI__F_avg=3,
- STBI__F_paeth=4,
- // synthetic filter used for first scanline to avoid needing a dummy row of 0s
- STBI__F_avg_first
-};
-
-static stbi_uc first_row_filter[5] =
-{
- STBI__F_none,
- STBI__F_sub,
- STBI__F_none,
- STBI__F_avg_first,
- STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub
-};
-
-static int stbi__paeth(int a, int b, int c)
-{
- // This formulation looks very different from the reference in the PNG spec, but is
- // actually equivalent and has favorable data dependencies and admits straightforward
- // generation of branch-free code, which helps performance significantly.
- int thresh = c*3 - (a + b);
- int lo = a < b ? a : b;
- int hi = a < b ? b : a;
- int t0 = (hi <= thresh) ? lo : c;
- int t1 = (thresh <= lo) ? hi : t0;
- return t1;
-}
-
-static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
-
-// adds an extra all-255 alpha channel
-// dest == src is legal
-// img_n must be 1 or 3
-static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n)
-{
- int i;
- // must process data backwards since we allow dest==src
- if (img_n == 1) {
- for (i=x-1; i >= 0; --i) {
- dest[i*2+1] = 255;
- dest[i*2+0] = src[i];
- }
- } else {
- STBI_ASSERT(img_n == 3);
- for (i=x-1; i >= 0; --i) {
- dest[i*4+3] = 255;
- dest[i*4+2] = src[i*3+2];
- dest[i*4+1] = src[i*3+1];
- dest[i*4+0] = src[i*3+0];
- }
- }
-}
-
-// create the png data from post-deflated data
-static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)
-{
- int bytes = (depth == 16 ? 2 : 1);
- stbi__context *s = a->s;
- stbi__uint32 i,j,stride = x*out_n*bytes;
- stbi__uint32 img_len, img_width_bytes;
- stbi_uc *filter_buf;
- int all_ok = 1;
- int k;
- int img_n = s->img_n; // copy it into a local for later
-
- int output_bytes = out_n*bytes;
- int filter_bytes = img_n*bytes;
- int width = x;
-
- STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
- a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into
- if (!a->out) return stbi__err("outofmem", "Out of memory");
-
- // note: error exits here don't need to clean up a->out individually,
- // stbi__do_png always does on error.
- if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG");
- img_width_bytes = (((img_n * x * depth) + 7) >> 3);
- if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG");
- img_len = (img_width_bytes + 1) * y;
-
- // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,
- // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),
- // so just check for raw_len < img_len always.
- if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
-
- // Allocate two scan lines worth of filter workspace buffer.
- filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0);
- if (!filter_buf) return stbi__err("outofmem", "Out of memory");
-
- // Filtering for low-bit-depth images
- if (depth < 8) {
- filter_bytes = 1;
- width = img_width_bytes;
- }
-
- for (j=0; j < y; ++j) {
- // cur/prior filter buffers alternate
- stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes;
- stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes;
- stbi_uc *dest = a->out + stride*j;
- int nk = width * filter_bytes;
- int filter = *raw++;
-
- // check filter type
- if (filter > 4) {
- all_ok = stbi__err("invalid filter","Corrupt PNG");
- break;
- }
-
- // if first row, use special filter that doesn't sample previous row
- if (j == 0) filter = first_row_filter[filter];
-
- // perform actual filtering
- switch (filter) {
- case STBI__F_none:
- memcpy(cur, raw, nk);
- break;
- case STBI__F_sub:
- memcpy(cur, raw, filter_bytes);
- for (k = filter_bytes; k < nk; ++k)
- cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]);
- break;
- case STBI__F_up:
- for (k = 0; k < nk; ++k)
- cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
- break;
- case STBI__F_avg:
- for (k = 0; k < filter_bytes; ++k)
- cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
- for (k = filter_bytes; k < nk; ++k)
- cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1));
- break;
- case STBI__F_paeth:
- for (k = 0; k < filter_bytes; ++k)
- cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0)
- for (k = filter_bytes; k < nk; ++k)
- cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes]));
- break;
- case STBI__F_avg_first:
- memcpy(cur, raw, filter_bytes);
- for (k = filter_bytes; k < nk; ++k)
- cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1));
- break;
- }
-
- raw += nk;
-
- // expand decoded bits in cur to dest, also adding an extra alpha channel if desired
- if (depth < 8) {
- stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
- stbi_uc *in = cur;
- stbi_uc *out = dest;
- stbi_uc inb = 0;
- stbi__uint32 nsmp = x*img_n;
-
- // expand bits to bytes first
- if (depth == 4) {
- for (i=0; i < nsmp; ++i) {
- if ((i & 1) == 0) inb = *in++;
- *out++ = scale * (inb >> 4);
- inb <<= 4;
- }
- } else if (depth == 2) {
- for (i=0; i < nsmp; ++i) {
- if ((i & 3) == 0) inb = *in++;
- *out++ = scale * (inb >> 6);
- inb <<= 2;
- }
- } else {
- STBI_ASSERT(depth == 1);
- for (i=0; i < nsmp; ++i) {
- if ((i & 7) == 0) inb = *in++;
- *out++ = scale * (inb >> 7);
- inb <<= 1;
- }
- }
-
- // insert alpha=255 values if desired
- if (img_n != out_n)
- stbi__create_png_alpha_expand8(dest, dest, x, img_n);
- } else if (depth == 8) {
- if (img_n == out_n)
- memcpy(dest, cur, x*img_n);
- else
- stbi__create_png_alpha_expand8(dest, cur, x, img_n);
- } else if (depth == 16) {
- // convert the image data from big-endian to platform-native
- stbi__uint16 *dest16 = (stbi__uint16*)dest;
- stbi__uint32 nsmp = x*img_n;
-
- if (img_n == out_n) {
- for (i = 0; i < nsmp; ++i, ++dest16, cur += 2)
- *dest16 = (cur[0] << 8) | cur[1];
- } else {
- STBI_ASSERT(img_n+1 == out_n);
- if (img_n == 1) {
- for (i = 0; i < x; ++i, dest16 += 2, cur += 2) {
- dest16[0] = (cur[0] << 8) | cur[1];
- dest16[1] = 0xffff;
- }
- } else {
- STBI_ASSERT(img_n == 3);
- for (i = 0; i < x; ++i, dest16 += 4, cur += 6) {
- dest16[0] = (cur[0] << 8) | cur[1];
- dest16[1] = (cur[2] << 8) | cur[3];
- dest16[2] = (cur[4] << 8) | cur[5];
- dest16[3] = 0xffff;
- }
- }
- }
- }
- }
-
- STBI_FREE(filter_buf);
- if (!all_ok) return 0;
-
- return 1;
-}
-
-static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)
-{
- int bytes = (depth == 16 ? 2 : 1);
- int out_bytes = out_n * bytes;
- stbi_uc *final;
- int p;
- if (!interlaced)
- return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
-
- // de-interlacing
- final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
- if (!final) return stbi__err("outofmem", "Out of memory");
- for (p=0; p < 7; ++p) {
- int xorig[] = { 0,4,0,2,0,1,0 };
- int yorig[] = { 0,0,4,0,2,0,1 };
- int xspc[] = { 8,8,4,4,2,2,1 };
- int yspc[] = { 8,8,8,4,4,2,2 };
- int i,j,x,y;
- // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
- x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
- y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
- if (x && y) {
- stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
- if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
- STBI_FREE(final);
- return 0;
- }
- for (j=0; j < y; ++j) {
- for (i=0; i < x; ++i) {
- int out_y = j*yspc[p]+yorig[p];
- int out_x = i*xspc[p]+xorig[p];
- memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
- a->out + (j*x+i)*out_bytes, out_bytes);
- }
- }
- STBI_FREE(a->out);
- image_data += img_len;
- image_data_len -= img_len;
- }
- }
- a->out = final;
-
- return 1;
-}
-
-static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
-{
- stbi__context *s = z->s;
- stbi__uint32 i, pixel_count = s->img_x * s->img_y;
- stbi_uc *p = z->out;
-
- // compute color-based transparency, assuming we've
- // already got 255 as the alpha value in the output
- STBI_ASSERT(out_n == 2 || out_n == 4);
-
- if (out_n == 2) {
- for (i=0; i < pixel_count; ++i) {
- p[1] = (p[0] == tc[0] ? 0 : 255);
- p += 2;
- }
- } else {
- for (i=0; i < pixel_count; ++i) {
- if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
- p[3] = 0;
- p += 4;
- }
- }
- return 1;
-}
-
-static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)
-{
- stbi__context *s = z->s;
- stbi__uint32 i, pixel_count = s->img_x * s->img_y;
- stbi__uint16 *p = (stbi__uint16*) z->out;
-
- // compute color-based transparency, assuming we've
- // already got 65535 as the alpha value in the output
- STBI_ASSERT(out_n == 2 || out_n == 4);
-
- if (out_n == 2) {
- for (i = 0; i < pixel_count; ++i) {
- p[1] = (p[0] == tc[0] ? 0 : 65535);
- p += 2;
- }
- } else {
- for (i = 0; i < pixel_count; ++i) {
- if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
- p[3] = 0;
- p += 4;
- }
- }
- return 1;
-}
-
-static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
-{
- stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
- stbi_uc *p, *temp_out, *orig = a->out;
-
- p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
- if (p == NULL) return stbi__err("outofmem", "Out of memory");
-
- // between here and free(out) below, exitting would leak
- temp_out = p;
-
- if (pal_img_n == 3) {
- for (i=0; i < pixel_count; ++i) {
- int n = orig[i]*4;
- p[0] = palette[n ];
- p[1] = palette[n+1];
- p[2] = palette[n+2];
- p += 3;
- }
- } else {
- for (i=0; i < pixel_count; ++i) {
- int n = orig[i]*4;
- p[0] = palette[n ];
- p[1] = palette[n+1];
- p[2] = palette[n+2];
- p[3] = palette[n+3];
- p += 4;
- }
- }
- STBI_FREE(a->out);
- a->out = temp_out;
-
- STBI_NOTUSED(len);
-
- return 1;
-}
-
-static int stbi__unpremultiply_on_load_global = 0;
-static int stbi__de_iphone_flag_global = 0;
-
-STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
-{
- stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
-}
-
-STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
-{
- stbi__de_iphone_flag_global = flag_true_if_should_convert;
-}
-
-#ifndef STBI_THREAD_LOCAL
-#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global
-#define stbi__de_iphone_flag stbi__de_iphone_flag_global
-#else
-static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
-static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
-
-STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)
-{
- stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
- stbi__unpremultiply_on_load_set = 1;
-}
-
-STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)
-{
- stbi__de_iphone_flag_local = flag_true_if_should_convert;
- stbi__de_iphone_flag_set = 1;
-}
-
-#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \
- ? stbi__unpremultiply_on_load_local \
- : stbi__unpremultiply_on_load_global)
-#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \
- ? stbi__de_iphone_flag_local \
- : stbi__de_iphone_flag_global)
-#endif // STBI_THREAD_LOCAL
-
-static void stbi__de_iphone(stbi__png *z)
-{
- stbi__context *s = z->s;
- stbi__uint32 i, pixel_count = s->img_x * s->img_y;
- stbi_uc *p = z->out;
-
- if (s->img_out_n == 3) { // convert bgr to rgb
- for (i=0; i < pixel_count; ++i) {
- stbi_uc t = p[0];
- p[0] = p[2];
- p[2] = t;
- p += 3;
- }
- } else {
- STBI_ASSERT(s->img_out_n == 4);
- if (stbi__unpremultiply_on_load) {
- // convert bgr to rgb and unpremultiply
- for (i=0; i < pixel_count; ++i) {
- stbi_uc a = p[3];
- stbi_uc t = p[0];
- if (a) {
- stbi_uc half = a / 2;
- p[0] = (p[2] * 255 + half) / a;
- p[1] = (p[1] * 255 + half) / a;
- p[2] = ( t * 255 + half) / a;
- } else {
- p[0] = p[2];
- p[2] = t;
- }
- p += 4;
- }
- } else {
- // convert bgr to rgb
- for (i=0; i < pixel_count; ++i) {
- stbi_uc t = p[0];
- p[0] = p[2];
- p[2] = t;
- p += 4;
- }
- }
- }
-}
-
-#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
-
-static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
-{
- stbi_uc palette[1024], pal_img_n=0;
- stbi_uc has_trans=0, tc[3]={0};
- stbi__uint16 tc16[3];
- stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
- int first=1,k,interlace=0, color=0, is_iphone=0;
- stbi__context *s = z->s;
-
- z->expanded = NULL;
- z->idata = NULL;
- z->out = NULL;
-
- if (!stbi__check_png_header(s)) return 0;
-
- if (scan == STBI__SCAN_type) return 1;
-
- for (;;) {
- stbi__pngchunk c = stbi__get_chunk_header(s);
- switch (c.type) {
- case STBI__PNG_TYPE('C','g','B','I'):
- is_iphone = 1;
- stbi__skip(s, c.length);
- break;
- case STBI__PNG_TYPE('I','H','D','R'): {
- int comp,filter;
- if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
- first = 0;
- if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
- s->img_x = stbi__get32be(s);
- s->img_y = stbi__get32be(s);
- if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
- if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
- z->depth = stbi__get8(s); if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only");
- color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG");
- if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG");
- if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
- comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG");
- filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG");
- interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
- if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
- if (!pal_img_n) {
- s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
- if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
- } else {
- // if paletted, then pal_n is our final components, and
- // img_n is # components to decompress/filter.
- s->img_n = 1;
- if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
- }
- // even with SCAN_header, have to scan to see if we have a tRNS
- break;
- }
-
- case STBI__PNG_TYPE('P','L','T','E'): {
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
- pal_len = c.length / 3;
- if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
- for (i=0; i < pal_len; ++i) {
- palette[i*4+0] = stbi__get8(s);
- palette[i*4+1] = stbi__get8(s);
- palette[i*4+2] = stbi__get8(s);
- palette[i*4+3] = 255;
- }
- break;
- }
-
- case STBI__PNG_TYPE('t','R','N','S'): {
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
- if (pal_img_n) {
- if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }
- if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
- if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
- pal_img_n = 4;
- for (i=0; i < c.length; ++i)
- palette[i*4+3] = stbi__get8(s);
- } else {
- if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
- if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
- has_trans = 1;
- // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now.
- if (scan == STBI__SCAN_header) { ++s->img_n; return 1; }
- if (z->depth == 16) {
- for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning
- tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is
- } else {
- for (k = 0; k < s->img_n && k < 3; ++k)
- tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger
- }
- }
- break;
- }
-
- case STBI__PNG_TYPE('I','D','A','T'): {
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
- if (scan == STBI__SCAN_header) {
- // header scan definitely stops at first IDAT
- if (pal_img_n)
- s->img_n = pal_img_n;
- return 1;
- }
- if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes");
- if ((int)(ioff + c.length) < (int)ioff) return 0;
- if (ioff + c.length > idata_limit) {
- stbi__uint32 idata_limit_old = idata_limit;
- stbi_uc *p;
- if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
- while (ioff + c.length > idata_limit)
- idata_limit *= 2;
- STBI_NOTUSED(idata_limit_old);
- p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
- z->idata = p;
- }
- if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
- ioff += c.length;
- break;
- }
-
- case STBI__PNG_TYPE('I','E','N','D'): {
- stbi__uint32 raw_len, bpl;
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if (scan != STBI__SCAN_load) return 1;
- if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
- // initial guess for decoded data size to avoid unnecessary reallocs
- bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component
- raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
- z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
- if (z->expanded == NULL) return 0; // zlib should set error
- STBI_FREE(z->idata); z->idata = NULL;
- if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
- s->img_out_n = s->img_n+1;
- else
- s->img_out_n = s->img_n;
- if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;
- if (has_trans) {
- if (z->depth == 16) {
- if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;
- } else {
- if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
- }
- }
- if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
- stbi__de_iphone(z);
- if (pal_img_n) {
- // pal_img_n == 3 or 4
- s->img_n = pal_img_n; // record the actual colors we had
- s->img_out_n = pal_img_n;
- if (req_comp >= 3) s->img_out_n = req_comp;
- if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
- return 0;
- } else if (has_trans) {
- // non-paletted image with tRNS -> source image has (constant) alpha
- ++s->img_n;
- }
- STBI_FREE(z->expanded); z->expanded = NULL;
- // end of PNG chunk, read and skip CRC
- stbi__get32be(s);
- return 1;
- }
-
- default:
- // if critical, fail
- if (first) return stbi__err("first not IHDR", "Corrupt PNG");
- if ((c.type & (1 << 29)) == 0) {
- #ifndef STBI_NO_FAILURE_STRINGS
- // not threadsafe
- static char invalid_chunk[] = "XXXX PNG chunk not known";
- invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
- invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
- invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
- invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
- #endif
- return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
- }
- stbi__skip(s, c.length);
- break;
- }
- // end of PNG chunk, read and skip CRC
- stbi__get32be(s);
- }
-}
-
-static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)
-{
- void *result=NULL;
- if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
- if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
- if (p->depth <= 8)
- ri->bits_per_channel = 8;
- else if (p->depth == 16)
- ri->bits_per_channel = 16;
- else
- return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth");
- result = p->out;
- p->out = NULL;
- if (req_comp && req_comp != p->s->img_out_n) {
- if (ri->bits_per_channel == 8)
- result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
- else
- result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
- p->s->img_out_n = req_comp;
- if (result == NULL) return result;
- }
- *x = p->s->img_x;
- *y = p->s->img_y;
- if (n) *n = p->s->img_n;
- }
- STBI_FREE(p->out); p->out = NULL;
- STBI_FREE(p->expanded); p->expanded = NULL;
- STBI_FREE(p->idata); p->idata = NULL;
-
- return result;
-}
-
-static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi__png p;
- p.s = s;
- return stbi__do_png(&p, x,y,comp,req_comp, ri);
-}
-
-static int stbi__png_test(stbi__context *s)
-{
- int r;
- r = stbi__check_png_header(s);
- stbi__rewind(s);
- return r;
-}
-
-static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
-{
- if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
- stbi__rewind( p->s );
- return 0;
- }
- if (x) *x = p->s->img_x;
- if (y) *y = p->s->img_y;
- if (comp) *comp = p->s->img_n;
- return 1;
-}
-
-static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
-{
- stbi__png p;
- p.s = s;
- return stbi__png_info_raw(&p, x, y, comp);
-}
-
-static int stbi__png_is16(stbi__context *s)
-{
- stbi__png p;
- p.s = s;
- if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
- return 0;
- if (p.depth != 16) {
- stbi__rewind(p.s);
- return 0;
- }
- return 1;
-}
-#endif
-
-// Microsoft/Windows BMP image
-
-#ifndef STBI_NO_BMP
-static int stbi__bmp_test_raw(stbi__context *s)
-{
- int r;
- int sz;
- if (stbi__get8(s) != 'B') return 0;
- if (stbi__get8(s) != 'M') return 0;
- stbi__get32le(s); // discard filesize
- stbi__get16le(s); // discard reserved
- stbi__get16le(s); // discard reserved
- stbi__get32le(s); // discard data offset
- sz = stbi__get32le(s);
- r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
- return r;
-}
-
-static int stbi__bmp_test(stbi__context *s)
-{
- int r = stbi__bmp_test_raw(s);
- stbi__rewind(s);
- return r;
-}
-
-
-// returns 0..31 for the highest set bit
-static int stbi__high_bit(unsigned int z)
-{
- int n=0;
- if (z == 0) return -1;
- if (z >= 0x10000) { n += 16; z >>= 16; }
- if (z >= 0x00100) { n += 8; z >>= 8; }
- if (z >= 0x00010) { n += 4; z >>= 4; }
- if (z >= 0x00004) { n += 2; z >>= 2; }
- if (z >= 0x00002) { n += 1;/* >>= 1;*/ }
- return n;
-}
-
-static int stbi__bitcount(unsigned int a)
-{
- a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
- a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
- a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
- a = (a + (a >> 8)); // max 16 per 8 bits
- a = (a + (a >> 16)); // max 32 per 8 bits
- return a & 0xff;
-}
-
-// extract an arbitrarily-aligned N-bit value (N=bits)
-// from v, and then make it 8-bits long and fractionally
-// extend it to full full range.
-static int stbi__shiftsigned(unsigned int v, int shift, int bits)
-{
- static unsigned int mul_table[9] = {
- 0,
- 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
- 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
- };
- static unsigned int shift_table[9] = {
- 0, 0,0,1,0,2,4,6,0,
- };
- if (shift < 0)
- v <<= -shift;
- else
- v >>= shift;
- STBI_ASSERT(v < 256);
- v >>= (8-bits);
- STBI_ASSERT(bits >= 0 && bits <= 8);
- return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
-}
-
-typedef struct
-{
- int bpp, offset, hsz;
- unsigned int mr,mg,mb,ma, all_a;
- int extra_read;
-} stbi__bmp_data;
-
-static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress)
-{
- // BI_BITFIELDS specifies masks explicitly, don't override
- if (compress == 3)
- return 1;
-
- if (compress == 0) {
- if (info->bpp == 16) {
- info->mr = 31u << 10;
- info->mg = 31u << 5;
- info->mb = 31u << 0;
- } else if (info->bpp == 32) {
- info->mr = 0xffu << 16;
- info->mg = 0xffu << 8;
- info->mb = 0xffu << 0;
- info->ma = 0xffu << 24;
- info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
- } else {
- // otherwise, use defaults, which is all-0
- info->mr = info->mg = info->mb = info->ma = 0;
- }
- return 1;
- }
- return 0; // error
-}
-
-static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
-{
- int hsz;
- if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
- stbi__get32le(s); // discard filesize
- stbi__get16le(s); // discard reserved
- stbi__get16le(s); // discard reserved
- info->offset = stbi__get32le(s);
- info->hsz = hsz = stbi__get32le(s);
- info->mr = info->mg = info->mb = info->ma = 0;
- info->extra_read = 14;
-
- if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP");
-
- if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
- if (hsz == 12) {
- s->img_x = stbi__get16le(s);
- s->img_y = stbi__get16le(s);
- } else {
- s->img_x = stbi__get32le(s);
- s->img_y = stbi__get32le(s);
- }
- if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
- info->bpp = stbi__get16le(s);
- if (hsz != 12) {
- int compress = stbi__get32le(s);
- if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
- if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes
- if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel
- stbi__get32le(s); // discard sizeof
- stbi__get32le(s); // discard hres
- stbi__get32le(s); // discard vres
- stbi__get32le(s); // discard colorsused
- stbi__get32le(s); // discard max important
- if (hsz == 40 || hsz == 56) {
- if (hsz == 56) {
- stbi__get32le(s);
- stbi__get32le(s);
- stbi__get32le(s);
- stbi__get32le(s);
- }
- if (info->bpp == 16 || info->bpp == 32) {
- if (compress == 0) {
- stbi__bmp_set_mask_defaults(info, compress);
- } else if (compress == 3) {
- info->mr = stbi__get32le(s);
- info->mg = stbi__get32le(s);
- info->mb = stbi__get32le(s);
- info->extra_read += 12;
- // not documented, but generated by photoshop and handled by mspaint
- if (info->mr == info->mg && info->mg == info->mb) {
- // ?!?!?
- return stbi__errpuc("bad BMP", "bad BMP");
- }
- } else
- return stbi__errpuc("bad BMP", "bad BMP");
- }
- } else {
- // V4/V5 header
- int i;
- if (hsz != 108 && hsz != 124)
- return stbi__errpuc("bad BMP", "bad BMP");
- info->mr = stbi__get32le(s);
- info->mg = stbi__get32le(s);
- info->mb = stbi__get32le(s);
- info->ma = stbi__get32le(s);
- if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs
- stbi__bmp_set_mask_defaults(info, compress);
- stbi__get32le(s); // discard color space
- for (i=0; i < 12; ++i)
- stbi__get32le(s); // discard color space parameters
- if (hsz == 124) {
- stbi__get32le(s); // discard rendering intent
- stbi__get32le(s); // discard offset of profile data
- stbi__get32le(s); // discard size of profile data
- stbi__get32le(s); // discard reserved
- }
- }
- }
- return (void *) 1;
-}
-
-
-static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi_uc *out;
- unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
- stbi_uc pal[256][4];
- int psize=0,i,j,width;
- int flip_vertically, pad, target;
- stbi__bmp_data info;
- STBI_NOTUSED(ri);
-
- info.all_a = 255;
- if (stbi__bmp_parse_header(s, &info) == NULL)
- return NULL; // error code already set
-
- flip_vertically = ((int) s->img_y) > 0;
- s->img_y = abs((int) s->img_y);
-
- if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
- if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
-
- mr = info.mr;
- mg = info.mg;
- mb = info.mb;
- ma = info.ma;
- all_a = info.all_a;
-
- if (info.hsz == 12) {
- if (info.bpp < 24)
- psize = (info.offset - info.extra_read - 24) / 3;
- } else {
- if (info.bpp < 16)
- psize = (info.offset - info.extra_read - info.hsz) >> 2;
- }
- if (psize == 0) {
- // accept some number of extra bytes after the header, but if the offset points either to before
- // the header ends or implies a large amount of extra data, reject the file as malformed
- int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);
- int header_limit = 1024; // max we actually read is below 256 bytes currently.
- int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.
- if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {
- return stbi__errpuc("bad header", "Corrupt BMP");
- }
- // we established that bytes_read_so_far is positive and sensible.
- // the first half of this test rejects offsets that are either too small positives, or
- // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn
- // ensures the number computed in the second half of the test can't overflow.
- if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {
- return stbi__errpuc("bad offset", "Corrupt BMP");
- } else {
- stbi__skip(s, info.offset - bytes_read_so_far);
- }
- }
-
- if (info.bpp == 24 && ma == 0xff000000)
- s->img_n = 3;
- else
- s->img_n = ma ? 4 : 3;
- if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
- target = req_comp;
- else
- target = s->img_n; // if they want monochrome, we'll post-convert
-
- // sanity-check size
- if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
- return stbi__errpuc("too large", "Corrupt BMP");
-
- out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
- if (!out) return stbi__errpuc("outofmem", "Out of memory");
- if (info.bpp < 16) {
- int z=0;
- if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
- for (i=0; i < psize; ++i) {
- pal[i][2] = stbi__get8(s);
- pal[i][1] = stbi__get8(s);
- pal[i][0] = stbi__get8(s);
- if (info.hsz != 12) stbi__get8(s);
- pal[i][3] = 255;
- }
- stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
- if (info.bpp == 1) width = (s->img_x + 7) >> 3;
- else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
- else if (info.bpp == 8) width = s->img_x;
- else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
- pad = (-width)&3;
- if (info.bpp == 1) {
- for (j=0; j < (int) s->img_y; ++j) {
- int bit_offset = 7, v = stbi__get8(s);
- for (i=0; i < (int) s->img_x; ++i) {
- int color = (v>>bit_offset)&0x1;
- out[z++] = pal[color][0];
- out[z++] = pal[color][1];
- out[z++] = pal[color][2];
- if (target == 4) out[z++] = 255;
- if (i+1 == (int) s->img_x) break;
- if((--bit_offset) < 0) {
- bit_offset = 7;
- v = stbi__get8(s);
- }
- }
- stbi__skip(s, pad);
- }
- } else {
- for (j=0; j < (int) s->img_y; ++j) {
- for (i=0; i < (int) s->img_x; i += 2) {
- int v=stbi__get8(s),v2=0;
- if (info.bpp == 4) {
- v2 = v & 15;
- v >>= 4;
- }
- out[z++] = pal[v][0];
- out[z++] = pal[v][1];
- out[z++] = pal[v][2];
- if (target == 4) out[z++] = 255;
- if (i+1 == (int) s->img_x) break;
- v = (info.bpp == 8) ? stbi__get8(s) : v2;
- out[z++] = pal[v][0];
- out[z++] = pal[v][1];
- out[z++] = pal[v][2];
- if (target == 4) out[z++] = 255;
- }
- stbi__skip(s, pad);
- }
- }
- } else {
- int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
- int z = 0;
- int easy=0;
- stbi__skip(s, info.offset - info.extra_read - info.hsz);
- if (info.bpp == 24) width = 3 * s->img_x;
- else if (info.bpp == 16) width = 2*s->img_x;
- else /* bpp = 32 and pad = 0 */ width=0;
- pad = (-width) & 3;
- if (info.bpp == 24) {
- easy = 1;
- } else if (info.bpp == 32) {
- if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
- easy = 2;
- }
- if (!easy) {
- if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
- // right shift amt to put high bit in position #7
- rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
- gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
- bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
- ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
- if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
- }
- for (j=0; j < (int) s->img_y; ++j) {
- if (easy) {
- for (i=0; i < (int) s->img_x; ++i) {
- unsigned char a;
- out[z+2] = stbi__get8(s);
- out[z+1] = stbi__get8(s);
- out[z+0] = stbi__get8(s);
- z += 3;
- a = (easy == 2 ? stbi__get8(s) : 255);
- all_a |= a;
- if (target == 4) out[z++] = a;
- }
- } else {
- int bpp = info.bpp;
- for (i=0; i < (int) s->img_x; ++i) {
- stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
- unsigned int a;
- out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
- out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
- out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
- a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
- all_a |= a;
- if (target == 4) out[z++] = STBI__BYTECAST(a);
- }
- }
- stbi__skip(s, pad);
- }
- }
-
- // if alpha channel is all 0s, replace with all 255s
- if (target == 4 && all_a == 0)
- for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
- out[i] = 255;
-
- if (flip_vertically) {
- stbi_uc t;
- for (j=0; j < (int) s->img_y>>1; ++j) {
- stbi_uc *p1 = out + j *s->img_x*target;
- stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
- for (i=0; i < (int) s->img_x*target; ++i) {
- t = p1[i]; p1[i] = p2[i]; p2[i] = t;
- }
- }
- }
-
- if (req_comp && req_comp != target) {
- out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
- if (out == NULL) return out; // stbi__convert_format frees input on failure
- }
-
- *x = s->img_x;
- *y = s->img_y;
- if (comp) *comp = s->img_n;
- return out;
-}
-#endif
-
-// Targa Truevision - TGA
-// by Jonathan Dummer
-#ifndef STBI_NO_TGA
-// returns STBI_rgb or whatever, 0 on error
-static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)
-{
- // only RGB or RGBA (incl. 16bit) or grey allowed
- if (is_rgb16) *is_rgb16 = 0;
- switch(bits_per_pixel) {
- case 8: return STBI_grey;
- case 16: if(is_grey) return STBI_grey_alpha;
- // fallthrough
- case 15: if(is_rgb16) *is_rgb16 = 1;
- return STBI_rgb;
- case 24: // fallthrough
- case 32: return bits_per_pixel/8;
- default: return 0;
- }
-}
-
-static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
- int sz, tga_colormap_type;
- stbi__get8(s); // discard Offset
- tga_colormap_type = stbi__get8(s); // colormap type
- if( tga_colormap_type > 1 ) {
- stbi__rewind(s);
- return 0; // only RGB or indexed allowed
- }
- tga_image_type = stbi__get8(s); // image type
- if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
- if (tga_image_type != 1 && tga_image_type != 9) {
- stbi__rewind(s);
- return 0;
- }
- stbi__skip(s,4); // skip index of first colormap entry and number of entries
- sz = stbi__get8(s); // check bits per palette color entry
- if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
- stbi__rewind(s);
- return 0;
- }
- stbi__skip(s,4); // skip image x and y origin
- tga_colormap_bpp = sz;
- } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
- if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
- stbi__rewind(s);
- return 0; // only RGB or grey allowed, +/- RLE
- }
- stbi__skip(s,9); // skip colormap specification and image x/y origin
- tga_colormap_bpp = 0;
- }
- tga_w = stbi__get16le(s);
- if( tga_w < 1 ) {
- stbi__rewind(s);
- return 0; // test width
- }
- tga_h = stbi__get16le(s);
- if( tga_h < 1 ) {
- stbi__rewind(s);
- return 0; // test height
- }
- tga_bits_per_pixel = stbi__get8(s); // bits per pixel
- stbi__get8(s); // ignore alpha bits
- if (tga_colormap_bpp != 0) {
- if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
- // when using a colormap, tga_bits_per_pixel is the size of the indexes
- // I don't think anything but 8 or 16bit indexes makes sense
- stbi__rewind(s);
- return 0;
- }
- tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
- } else {
- tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
- }
- if(!tga_comp) {
- stbi__rewind(s);
- return 0;
- }
- if (x) *x = tga_w;
- if (y) *y = tga_h;
- if (comp) *comp = tga_comp;
- return 1; // seems to have passed everything
-}
-
-static int stbi__tga_test(stbi__context *s)
-{
- int res = 0;
- int sz, tga_color_type;
- stbi__get8(s); // discard Offset
- tga_color_type = stbi__get8(s); // color type
- if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed
- sz = stbi__get8(s); // image type
- if ( tga_color_type == 1 ) { // colormapped (paletted) image
- if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
- stbi__skip(s,4); // skip index of first colormap entry and number of entries
- sz = stbi__get8(s); // check bits per palette color entry
- if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
- stbi__skip(s,4); // skip image x and y origin
- } else { // "normal" image w/o colormap
- if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
- stbi__skip(s,9); // skip colormap specification and image x/y origin
- }
- if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width
- if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height
- sz = stbi__get8(s); // bits per pixel
- if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
- if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
-
- res = 1; // if we got this far, everything's good and we can return 1 instead of 0
-
-errorEnd:
- stbi__rewind(s);
- return res;
-}
-
-// read 16bit value and convert to 24bit RGB
-static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
-{
- stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
- stbi__uint16 fiveBitMask = 31;
- // we have 3 channels with 5bits each
- int r = (px >> 10) & fiveBitMask;
- int g = (px >> 5) & fiveBitMask;
- int b = px & fiveBitMask;
- // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later
- out[0] = (stbi_uc)((r * 255)/31);
- out[1] = (stbi_uc)((g * 255)/31);
- out[2] = (stbi_uc)((b * 255)/31);
-
- // some people claim that the most significant bit might be used for alpha
- // (possibly if an alpha-bit is set in the "image descriptor byte")
- // but that only made 16bit test images completely translucent..
- // so let's treat all 15 and 16bit TGAs as RGB with no alpha.
-}
-
-static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- // read in the TGA header stuff
- int tga_offset = stbi__get8(s);
- int tga_indexed = stbi__get8(s);
- int tga_image_type = stbi__get8(s);
- int tga_is_RLE = 0;
- int tga_palette_start = stbi__get16le(s);
- int tga_palette_len = stbi__get16le(s);
- int tga_palette_bits = stbi__get8(s);
- int tga_x_origin = stbi__get16le(s);
- int tga_y_origin = stbi__get16le(s);
- int tga_width = stbi__get16le(s);
- int tga_height = stbi__get16le(s);
- int tga_bits_per_pixel = stbi__get8(s);
- int tga_comp, tga_rgb16=0;
- int tga_inverted = stbi__get8(s);
- // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
- // image data
- unsigned char *tga_data;
- unsigned char *tga_palette = NULL;
- int i, j;
- unsigned char raw_data[4] = {0};
- int RLE_count = 0;
- int RLE_repeating = 0;
- int read_next_pixel = 1;
- STBI_NOTUSED(ri);
- STBI_NOTUSED(tga_x_origin); // @TODO
- STBI_NOTUSED(tga_y_origin); // @TODO
-
- if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
- if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
-
- // do a tiny bit of precessing
- if ( tga_image_type >= 8 )
- {
- tga_image_type -= 8;
- tga_is_RLE = 1;
- }
- tga_inverted = 1 - ((tga_inverted >> 5) & 1);
-
- // If I'm paletted, then I'll use the number of bits from the palette
- if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
- else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
-
- if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency
- return stbi__errpuc("bad format", "Can't find out TGA pixelformat");
-
- // tga info
- *x = tga_width;
- *y = tga_height;
- if (comp) *comp = tga_comp;
-
- if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
- return stbi__errpuc("too large", "Corrupt TGA");
-
- tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
- if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
-
- // skip to the data's starting position (offset usually = 0)
- stbi__skip(s, tga_offset );
-
- if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
- for (i=0; i < tga_height; ++i) {
- int row = tga_inverted ? tga_height -i - 1 : i;
- stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
- stbi__getn(s, tga_row, tga_width * tga_comp);
- }
- } else {
- // do I need to load a palette?
- if ( tga_indexed)
- {
- if (tga_palette_len == 0) { /* you have to have at least one entry! */
- STBI_FREE(tga_data);
- return stbi__errpuc("bad palette", "Corrupt TGA");
- }
-
- // any data to skip? (offset usually = 0)
- stbi__skip(s, tga_palette_start );
- // load the palette
- tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
- if (!tga_palette) {
- STBI_FREE(tga_data);
- return stbi__errpuc("outofmem", "Out of memory");
- }
- if (tga_rgb16) {
- stbi_uc *pal_entry = tga_palette;
- STBI_ASSERT(tga_comp == STBI_rgb);
- for (i=0; i < tga_palette_len; ++i) {
- stbi__tga_read_rgb16(s, pal_entry);
- pal_entry += tga_comp;
- }
- } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
- STBI_FREE(tga_data);
- STBI_FREE(tga_palette);
- return stbi__errpuc("bad palette", "Corrupt TGA");
- }
- }
- // load the data
- for (i=0; i < tga_width * tga_height; ++i)
- {
- // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
- if ( tga_is_RLE )
- {
- if ( RLE_count == 0 )
- {
- // yep, get the next byte as a RLE command
- int RLE_cmd = stbi__get8(s);
- RLE_count = 1 + (RLE_cmd & 127);
- RLE_repeating = RLE_cmd >> 7;
- read_next_pixel = 1;
- } else if ( !RLE_repeating )
- {
- read_next_pixel = 1;
- }
- } else
- {
- read_next_pixel = 1;
- }
- // OK, if I need to read a pixel, do it now
- if ( read_next_pixel )
- {
- // load however much data we did have
- if ( tga_indexed )
- {
- // read in index, then perform the lookup
- int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
- if ( pal_idx >= tga_palette_len ) {
- // invalid index
- pal_idx = 0;
- }
- pal_idx *= tga_comp;
- for (j = 0; j < tga_comp; ++j) {
- raw_data[j] = tga_palette[pal_idx+j];
- }
- } else if(tga_rgb16) {
- STBI_ASSERT(tga_comp == STBI_rgb);
- stbi__tga_read_rgb16(s, raw_data);
- } else {
- // read in the data raw
- for (j = 0; j < tga_comp; ++j) {
- raw_data[j] = stbi__get8(s);
- }
- }
- // clear the reading flag for the next pixel
- read_next_pixel = 0;
- } // end of reading a pixel
-
- // copy data
- for (j = 0; j < tga_comp; ++j)
- tga_data[i*tga_comp+j] = raw_data[j];
-
- // in case we're in RLE mode, keep counting down
- --RLE_count;
- }
- // do I need to invert the image?
- if ( tga_inverted )
- {
- for (j = 0; j*2 < tga_height; ++j)
- {
- int index1 = j * tga_width * tga_comp;
- int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
- for (i = tga_width * tga_comp; i > 0; --i)
- {
- unsigned char temp = tga_data[index1];
- tga_data[index1] = tga_data[index2];
- tga_data[index2] = temp;
- ++index1;
- ++index2;
- }
- }
- }
- // clear my palette, if I had one
- if ( tga_palette != NULL )
- {
- STBI_FREE( tga_palette );
- }
- }
-
- // swap RGB - if the source data was RGB16, it already is in the right order
- if (tga_comp >= 3 && !tga_rgb16)
- {
- unsigned char* tga_pixel = tga_data;
- for (i=0; i < tga_width * tga_height; ++i)
- {
- unsigned char temp = tga_pixel[0];
- tga_pixel[0] = tga_pixel[2];
- tga_pixel[2] = temp;
- tga_pixel += tga_comp;
- }
- }
-
- // convert to target component count
- if (req_comp && req_comp != tga_comp)
- tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
-
- // the things I do to get rid of an error message, and yet keep
- // Microsoft's C compilers happy... [8^(
- tga_palette_start = tga_palette_len = tga_palette_bits =
- tga_x_origin = tga_y_origin = 0;
- STBI_NOTUSED(tga_palette_start);
- // OK, done
- return tga_data;
-}
-#endif
-
-// *************************************************************************************************
-// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
-
-#ifndef STBI_NO_PSD
-static int stbi__psd_test(stbi__context *s)
-{
- int r = (stbi__get32be(s) == 0x38425053);
- stbi__rewind(s);
- return r;
-}
-
-static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)
-{
- int count, nleft, len;
-
- count = 0;
- while ((nleft = pixelCount - count) > 0) {
- len = stbi__get8(s);
- if (len == 128) {
- // No-op.
- } else if (len < 128) {
- // Copy next len+1 bytes literally.
- len++;
- if (len > nleft) return 0; // corrupt data
- count += len;
- while (len) {
- *p = stbi__get8(s);
- p += 4;
- len--;
- }
- } else if (len > 128) {
- stbi_uc val;
- // Next -len+1 bytes in the dest are replicated from next source byte.
- // (Interpret len as a negative 8-bit int.)
- len = 257 - len;
- if (len > nleft) return 0; // corrupt data
- val = stbi__get8(s);
- count += len;
- while (len) {
- *p = val;
- p += 4;
- len--;
- }
- }
- }
-
- return 1;
-}
-
-static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
-{
- int pixelCount;
- int channelCount, compression;
- int channel, i;
- int bitdepth;
- int w,h;
- stbi_uc *out;
- STBI_NOTUSED(ri);
-
- // Check identifier
- if (stbi__get32be(s) != 0x38425053) // "8BPS"
- return stbi__errpuc("not PSD", "Corrupt PSD image");
-
- // Check file type version.
- if (stbi__get16be(s) != 1)
- return stbi__errpuc("wrong version", "Unsupported version of PSD image");
-
- // Skip 6 reserved bytes.
- stbi__skip(s, 6 );
-
- // Read the number of channels (R, G, B, A, etc).
- channelCount = stbi__get16be(s);
- if (channelCount < 0 || channelCount > 16)
- return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
-
- // Read the rows and columns of the image.
- h = stbi__get32be(s);
- w = stbi__get32be(s);
-
- if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
- if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
-
- // Make sure the depth is 8 bits.
- bitdepth = stbi__get16be(s);
- if (bitdepth != 8 && bitdepth != 16)
- return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit");
-
- // Make sure the color mode is RGB.
- // Valid options are:
- // 0: Bitmap
- // 1: Grayscale
- // 2: Indexed color
- // 3: RGB color
- // 4: CMYK color
- // 7: Multichannel
- // 8: Duotone
- // 9: Lab color
- if (stbi__get16be(s) != 3)
- return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
-
- // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)
- stbi__skip(s,stbi__get32be(s) );
-
- // Skip the image resources. (resolution, pen tool paths, etc)
- stbi__skip(s, stbi__get32be(s) );
-
- // Skip the reserved data.
- stbi__skip(s, stbi__get32be(s) );
-
- // Find out if the data is compressed.
- // Known values:
- // 0: no compression
- // 1: RLE compressed
- compression = stbi__get16be(s);
- if (compression > 1)
- return stbi__errpuc("bad compression", "PSD has an unknown compression format");
-
- // Check size
- if (!stbi__mad3sizes_valid(4, w, h, 0))
- return stbi__errpuc("too large", "Corrupt PSD");
-
- // Create the destination image.
-
- if (!compression && bitdepth == 16 && bpc == 16) {
- out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
- ri->bits_per_channel = 16;
- } else
- out = (stbi_uc *) stbi__malloc(4 * w*h);
-
- if (!out) return stbi__errpuc("outofmem", "Out of memory");
- pixelCount = w*h;
-
- // Initialize the data to zero.
- //memset( out, 0, pixelCount * 4 );
-
- // Finally, the image data.
- if (compression) {
- // RLE as used by .PSD and .TIFF
- // Loop until you get the number of unpacked bytes you are expecting:
- // Read the next source byte into n.
- // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
- // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
- // Else if n is 128, noop.
- // Endloop
-
- // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,
- // which we're going to just skip.
- stbi__skip(s, h * channelCount * 2 );
-
- // Read the RLE data by channel.
- for (channel = 0; channel < 4; channel++) {
- stbi_uc *p;
-
- p = out+channel;
- if (channel >= channelCount) {
- // Fill this channel with default data.
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = (channel == 3 ? 255 : 0);
- } else {
- // Read the RLE data.
- if (!stbi__psd_decode_rle(s, p, pixelCount)) {
- STBI_FREE(out);
- return stbi__errpuc("corrupt", "bad RLE data");
- }
- }
- }
-
- } else {
- // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
- // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.
-
- // Read the data by channel.
- for (channel = 0; channel < 4; channel++) {
- if (channel >= channelCount) {
- // Fill this channel with default data.
- if (bitdepth == 16 && bpc == 16) {
- stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
- stbi__uint16 val = channel == 3 ? 65535 : 0;
- for (i = 0; i < pixelCount; i++, q += 4)
- *q = val;
- } else {
- stbi_uc *p = out+channel;
- stbi_uc val = channel == 3 ? 255 : 0;
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = val;
- }
- } else {
- if (ri->bits_per_channel == 16) { // output bpc
- stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
- for (i = 0; i < pixelCount; i++, q += 4)
- *q = (stbi__uint16) stbi__get16be(s);
- } else {
- stbi_uc *p = out+channel;
- if (bitdepth == 16) { // input bpc
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = (stbi_uc) (stbi__get16be(s) >> 8);
- } else {
- for (i = 0; i < pixelCount; i++, p += 4)
- *p = stbi__get8(s);
- }
- }
- }
- }
- }
-
- // remove weird white matte from PSD
- if (channelCount >= 4) {
- if (ri->bits_per_channel == 16) {
- for (i=0; i < w*h; ++i) {
- stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
- if (pixel[3] != 0 && pixel[3] != 65535) {
- float a = pixel[3] / 65535.0f;
- float ra = 1.0f / a;
- float inv_a = 65535.0f * (1 - ra);
- pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
- pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
- pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
- }
- }
- } else {
- for (i=0; i < w*h; ++i) {
- unsigned char *pixel = out + 4*i;
- if (pixel[3] != 0 && pixel[3] != 255) {
- float a = pixel[3] / 255.0f;
- float ra = 1.0f / a;
- float inv_a = 255.0f * (1 - ra);
- pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);
- pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);
- pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);
- }
- }
- }
- }
-
- // convert to desired output format
- if (req_comp && req_comp != 4) {
- if (ri->bits_per_channel == 16)
- out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
- else
- out = stbi__convert_format(out, 4, req_comp, w, h);
- if (out == NULL) return out; // stbi__convert_format frees input on failure
- }
-
- if (comp) *comp = 4;
- *y = h;
- *x = w;
-
- return out;
-}
-#endif
-
-// *************************************************************************************************
-// Softimage PIC loader
-// by Tom Seddon
-//
-// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
-// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
-
-#ifndef STBI_NO_PIC
-static int stbi__pic_is4(stbi__context *s,const char *str)
-{
- int i;
- for (i=0; i<4; ++i)
- if (stbi__get8(s) != (stbi_uc)str[i])
- return 0;
-
- return 1;
-}
-
-static int stbi__pic_test_core(stbi__context *s)
-{
- int i;
-
- if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
- return 0;
-
- for(i=0;i<84;++i)
- stbi__get8(s);
-
- if (!stbi__pic_is4(s,"PICT"))
- return 0;
-
- return 1;
-}
-
-typedef struct
-{
- stbi_uc size,type,channel;
-} stbi__pic_packet;
-
-static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
-{
- int mask=0x80, i;
-
- for (i=0; i<4; ++i, mask>>=1) {
- if (channel & mask) {
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
- dest[i]=stbi__get8(s);
- }
- }
-
- return dest;
-}
-
-static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
-{
- int mask=0x80,i;
-
- for (i=0;i<4; ++i, mask>>=1)
- if (channel&mask)
- dest[i]=src[i];
-}
-
-static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
-{
- int act_comp=0,num_packets=0,y,chained;
- stbi__pic_packet packets[10];
-
- // this will (should...) cater for even some bizarre stuff like having data
- // for the same channel in multiple packets.
- do {
- stbi__pic_packet *packet;
-
- if (num_packets==sizeof(packets)/sizeof(packets[0]))
- return stbi__errpuc("bad format","too many packets");
-
- packet = &packets[num_packets++];
-
- chained = stbi__get8(s);
- packet->size = stbi__get8(s);
- packet->type = stbi__get8(s);
- packet->channel = stbi__get8(s);
-
- act_comp |= packet->channel;
-
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)");
- if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp");
- } while (chained);
-
- *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
-
- for(y=0; y<height; ++y) {
- int packet_idx;
-
- for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
- stbi__pic_packet *packet = &packets[packet_idx];
- stbi_uc *dest = result+y*width*4;
-
- switch (packet->type) {
- default:
- return stbi__errpuc("bad format","packet has bad compression type");
-
- case 0: {//uncompressed
- int x;
-
- for(x=0;x<width;++x, dest+=4)
- if (!stbi__readval(s,packet->channel,dest))
- return 0;
- break;
- }
-
- case 1://Pure RLE
- {
- int left=width, i;
-
- while (left>0) {
- stbi_uc count,value[4];
-
- count=stbi__get8(s);
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)");
-
- if (count > left)
- count = (stbi_uc) left;
-
- if (!stbi__readval(s,packet->channel,value)) return 0;
-
- for(i=0; i<count; ++i,dest+=4)
- stbi__copyval(packet->channel,dest,value);
- left -= count;
- }
- }
- break;
-
- case 2: {//Mixed RLE
- int left=width;
- while (left>0) {
- int count = stbi__get8(s), i;
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)");
-
- if (count >= 128) { // Repeated
- stbi_uc value[4];
-
- if (count==128)
- count = stbi__get16be(s);
- else
- count -= 127;
- if (count > left)
- return stbi__errpuc("bad file","scanline overrun");
-
- if (!stbi__readval(s,packet->channel,value))
- return 0;
-
- for(i=0;i<count;++i, dest += 4)
- stbi__copyval(packet->channel,dest,value);
- } else { // Raw
- ++count;
- if (count>left) return stbi__errpuc("bad file","scanline overrun");
-
- for(i=0;i<count;++i, dest+=4)
- if (!stbi__readval(s,packet->channel,dest))
- return 0;
- }
- left-=count;
- }
- break;
- }
- }
- }
- }
-
- return result;
-}
-
-static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)
-{
- stbi_uc *result;
- int i, x,y, internal_comp;
- STBI_NOTUSED(ri);
-
- if (!comp) comp = &internal_comp;
-
- for (i=0; i<92; ++i)
- stbi__get8(s);
-
- x = stbi__get16be(s);
- y = stbi__get16be(s);
-
- if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
- if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
-
- if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)");
- if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode");
-
- stbi__get32be(s); //skip `ratio'
- stbi__get16be(s); //skip `fields'
- stbi__get16be(s); //skip `pad'
-
- // intermediate buffer is RGBA
- result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
- if (!result) return stbi__errpuc("outofmem", "Out of memory");
- memset(result, 0xff, x*y*4);
-
- if (!stbi__pic_load_core(s,x,y,comp, result)) {
- STBI_FREE(result);
- result=0;
- }
- *px = x;
- *py = y;
- if (req_comp == 0) req_comp = *comp;
- result=stbi__convert_format(result,4,req_comp,x,y);
-
- return result;
-}
-
-static int stbi__pic_test(stbi__context *s)
-{
- int r = stbi__pic_test_core(s);
- stbi__rewind(s);
- return r;
-}
-#endif
-
-// *************************************************************************************************
-// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
-
-#ifndef STBI_NO_GIF
-typedef struct
-{
- stbi__int16 prefix;
- stbi_uc first;
- stbi_uc suffix;
-} stbi__gif_lzw;
-
-typedef struct
-{
- int w,h;
- stbi_uc *out; // output buffer (always 4 components)
- stbi_uc *background; // The current "background" as far as a gif is concerned
- stbi_uc *history;
- int flags, bgindex, ratio, transparent, eflags;
- stbi_uc pal[256][4];
- stbi_uc lpal[256][4];
- stbi__gif_lzw codes[8192];
- stbi_uc *color_table;
- int parse, step;
- int lflags;
- int start_x, start_y;
- int max_x, max_y;
- int cur_x, cur_y;
- int line_size;
- int delay;
-} stbi__gif;
-
-static int stbi__gif_test_raw(stbi__context *s)
-{
- int sz;
- if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
- sz = stbi__get8(s);
- if (sz != '9' && sz != '7') return 0;
- if (stbi__get8(s) != 'a') return 0;
- return 1;
-}
-
-static int stbi__gif_test(stbi__context *s)
-{
- int r = stbi__gif_test_raw(s);
- stbi__rewind(s);
- return r;
-}
-
-static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
-{
- int i;
- for (i=0; i < num_entries; ++i) {
- pal[i][2] = stbi__get8(s);
- pal[i][1] = stbi__get8(s);
- pal[i][0] = stbi__get8(s);
- pal[i][3] = transp == i ? 0 : 255;
- }
-}
-
-static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
-{
- stbi_uc version;
- if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
- return stbi__err("not GIF", "Corrupt GIF");
-
- version = stbi__get8(s);
- if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF");
- if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF");
-
- stbi__g_failure_reason = "";
- g->w = stbi__get16le(s);
- g->h = stbi__get16le(s);
- g->flags = stbi__get8(s);
- g->bgindex = stbi__get8(s);
- g->ratio = stbi__get8(s);
- g->transparent = -1;
-
- if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
- if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
-
- if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments
-
- if (is_info) return 1;
-
- if (g->flags & 0x80)
- stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
-
- return 1;
-}
-
-static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
-{
- stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
- if (!g) return stbi__err("outofmem", "Out of memory");
- if (!stbi__gif_header(s, g, comp, 1)) {
- STBI_FREE(g);
- stbi__rewind( s );
- return 0;
- }
- if (x) *x = g->w;
- if (y) *y = g->h;
- STBI_FREE(g);
- return 1;
-}
-
-static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
-{
- stbi_uc *p, *c;
- int idx;
-
- // recurse to decode the prefixes, since the linked-list is backwards,
- // and working backwards through an interleaved image would be nasty
- if (g->codes[code].prefix >= 0)
- stbi__out_gif_code(g, g->codes[code].prefix);
-
- if (g->cur_y >= g->max_y) return;
-
- idx = g->cur_x + g->cur_y;
- p = &g->out[idx];
- g->history[idx / 4] = 1;
-
- c = &g->color_table[g->codes[code].suffix * 4];
- if (c[3] > 128) { // don't render transparent pixels;
- p[0] = c[2];
- p[1] = c[1];
- p[2] = c[0];
- p[3] = c[3];
- }
- g->cur_x += 4;
-
- if (g->cur_x >= g->max_x) {
- g->cur_x = g->start_x;
- g->cur_y += g->step;
-
- while (g->cur_y >= g->max_y && g->parse > 0) {
- g->step = (1 << g->parse) * g->line_size;
- g->cur_y = g->start_y + (g->step >> 1);
- --g->parse;
- }
- }
-}
-
-static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
-{
- stbi_uc lzw_cs;
- stbi__int32 len, init_code;
- stbi__uint32 first;
- stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
- stbi__gif_lzw *p;
-
- lzw_cs = stbi__get8(s);
- if (lzw_cs > 12) return NULL;
- clear = 1 << lzw_cs;
- first = 1;
- codesize = lzw_cs + 1;
- codemask = (1 << codesize) - 1;
- bits = 0;
- valid_bits = 0;
- for (init_code = 0; init_code < clear; init_code++) {
- g->codes[init_code].prefix = -1;
- g->codes[init_code].first = (stbi_uc) init_code;
- g->codes[init_code].suffix = (stbi_uc) init_code;
- }
-
- // support no starting clear code
- avail = clear+2;
- oldcode = -1;
-
- len = 0;
- for(;;) {
- if (valid_bits < codesize) {
- if (len == 0) {
- len = stbi__get8(s); // start new block
- if (len == 0)
- return g->out;
- }
- --len;
- bits |= (stbi__int32) stbi__get8(s) << valid_bits;
- valid_bits += 8;
- } else {
- stbi__int32 code = bits & codemask;
- bits >>= codesize;
- valid_bits -= codesize;
- // @OPTIMIZE: is there some way we can accelerate the non-clear path?
- if (code == clear) { // clear code
- codesize = lzw_cs + 1;
- codemask = (1 << codesize) - 1;
- avail = clear + 2;
- oldcode = -1;
- first = 0;
- } else if (code == clear + 1) { // end of stream code
- stbi__skip(s, len);
- while ((len = stbi__get8(s)) > 0)
- stbi__skip(s,len);
- return g->out;
- } else if (code <= avail) {
- if (first) {
- return stbi__errpuc("no clear code", "Corrupt GIF");
- }
-
- if (oldcode >= 0) {
- p = &g->codes[avail++];
- if (avail > 8192) {
- return stbi__errpuc("too many codes", "Corrupt GIF");
- }
-
- p->prefix = (stbi__int16) oldcode;
- p->first = g->codes[oldcode].first;
- p->suffix = (code == avail) ? p->first : g->codes[code].first;
- } else if (code == avail)
- return stbi__errpuc("illegal code in raster", "Corrupt GIF");
-
- stbi__out_gif_code(g, (stbi__uint16) code);
-
- if ((avail & codemask) == 0 && avail <= 0x0FFF) {
- codesize++;
- codemask = (1 << codesize) - 1;
- }
-
- oldcode = code;
- } else {
- return stbi__errpuc("illegal code in raster", "Corrupt GIF");
- }
- }
- }
-}
-
-// this function is designed to support animated gifs, although stb_image doesn't support it
-// two back is the image from two frames ago, used for a very specific disposal format
-static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
-{
- int dispose;
- int first_frame;
- int pi;
- int pcount;
- STBI_NOTUSED(req_comp);
-
- // on first frame, any non-written pixels get the background colour (non-transparent)
- first_frame = 0;
- if (g->out == 0) {
- if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
- if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
- return stbi__errpuc("too large", "GIF image is too large");
- pcount = g->w * g->h;
- g->out = (stbi_uc *) stbi__malloc(4 * pcount);
- g->background = (stbi_uc *) stbi__malloc(4 * pcount);
- g->history = (stbi_uc *) stbi__malloc(pcount);
- if (!g->out || !g->background || !g->history)
- return stbi__errpuc("outofmem", "Out of memory");
-
- // image is treated as "transparent" at the start - ie, nothing overwrites the current background;
- // background colour is only used for pixels that are not rendered first frame, after that "background"
- // color refers to the color that was there the previous frame.
- memset(g->out, 0x00, 4 * pcount);
- memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
- memset(g->history, 0x00, pcount); // pixels that were affected previous frame
- first_frame = 1;
- } else {
- // second frame - how do we dispose of the previous one?
- dispose = (g->eflags & 0x1C) >> 2;
- pcount = g->w * g->h;
-
- if ((dispose == 3) && (two_back == 0)) {
- dispose = 2; // if I don't have an image to revert back to, default to the old background
- }
-
- if (dispose == 3) { // use previous graphic
- for (pi = 0; pi < pcount; ++pi) {
- if (g->history[pi]) {
- memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
- }
- }
- } else if (dispose == 2) {
- // restore what was changed last frame to background before that frame;
- for (pi = 0; pi < pcount; ++pi) {
- if (g->history[pi]) {
- memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
- }
- }
- } else {
- // This is a non-disposal case eithe way, so just
- // leave the pixels as is, and they will become the new background
- // 1: do not dispose
- // 0: not specified.
- }
-
- // background is what out is after the undoing of the previou frame;
- memcpy( g->background, g->out, 4 * g->w * g->h );
- }
-
- // clear my history;
- memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
-
- for (;;) {
- int tag = stbi__get8(s);
- switch (tag) {
- case 0x2C: /* Image Descriptor */
- {
- stbi__int32 x, y, w, h;
- stbi_uc *o;
-
- x = stbi__get16le(s);
- y = stbi__get16le(s);
- w = stbi__get16le(s);
- h = stbi__get16le(s);
- if (((x + w) > (g->w)) || ((y + h) > (g->h)))
- return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
-
- g->line_size = g->w * 4;
- g->start_x = x * 4;
- g->start_y = y * g->line_size;
- g->max_x = g->start_x + w * 4;
- g->max_y = g->start_y + h * g->line_size;
- g->cur_x = g->start_x;
- g->cur_y = g->start_y;
-
- // if the width of the specified rectangle is 0, that means
- // we may not see *any* pixels or the image is malformed;
- // to make sure this is caught, move the current y down to
- // max_y (which is what out_gif_code checks).
- if (w == 0)
- g->cur_y = g->max_y;
-
- g->lflags = stbi__get8(s);
-
- if (g->lflags & 0x40) {
- g->step = 8 * g->line_size; // first interlaced spacing
- g->parse = 3;
- } else {
- g->step = g->line_size;
- g->parse = 0;
- }
-
- if (g->lflags & 0x80) {
- stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
- g->color_table = (stbi_uc *) g->lpal;
- } else if (g->flags & 0x80) {
- g->color_table = (stbi_uc *) g->pal;
- } else
- return stbi__errpuc("missing color table", "Corrupt GIF");
-
- o = stbi__process_gif_raster(s, g);
- if (!o) return NULL;
-
- // if this was the first frame,
- pcount = g->w * g->h;
- if (first_frame && (g->bgindex > 0)) {
- // if first frame, any pixel not drawn to gets the background color
- for (pi = 0; pi < pcount; ++pi) {
- if (g->history[pi] == 0) {
- g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
- memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
- }
- }
- }
-
- return o;
- }
-
- case 0x21: // Comment Extension.
- {
- int len;
- int ext = stbi__get8(s);
- if (ext == 0xF9) { // Graphic Control Extension.
- len = stbi__get8(s);
- if (len == 4) {
- g->eflags = stbi__get8(s);
- g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.
-
- // unset old transparent
- if (g->transparent >= 0) {
- g->pal[g->transparent][3] = 255;
- }
- if (g->eflags & 0x01) {
- g->transparent = stbi__get8(s);
- if (g->transparent >= 0) {
- g->pal[g->transparent][3] = 0;
- }
- } else {
- // don't need transparent
- stbi__skip(s, 1);
- g->transparent = -1;
- }
- } else {
- stbi__skip(s, len);
- break;
- }
- }
- while ((len = stbi__get8(s)) != 0) {
- stbi__skip(s, len);
- }
- break;
- }
-
- case 0x3B: // gif stream termination code
- return (stbi_uc *) s; // using '1' causes warning on some compilers
-
- default:
- return stbi__errpuc("unknown code", "Corrupt GIF");
- }
- }
-}
-
-static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays)
-{
- STBI_FREE(g->out);
- STBI_FREE(g->history);
- STBI_FREE(g->background);
-
- if (out) STBI_FREE(out);
- if (delays && *delays) STBI_FREE(*delays);
- return stbi__errpuc("outofmem", "Out of memory");
-}
-
-static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
-{
- if (stbi__gif_test(s)) {
- int layers = 0;
- stbi_uc *u = 0;
- stbi_uc *out = 0;
- stbi_uc *two_back = 0;
- stbi__gif g;
- int stride;
- int out_size = 0;
- int delays_size = 0;
-
- STBI_NOTUSED(out_size);
- STBI_NOTUSED(delays_size);
-
- memset(&g, 0, sizeof(g));
- if (delays) {
- *delays = 0;
- }
-
- do {
- u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
- if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
-
- if (u) {
- *x = g.w;
- *y = g.h;
- ++layers;
- stride = g.w * g.h * 4;
-
- if (out) {
- void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
- if (!tmp)
- return stbi__load_gif_main_outofmem(&g, out, delays);
- else {
- out = (stbi_uc*) tmp;
- out_size = layers * stride;
- }
-
- if (delays) {
- int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );
- if (!new_delays)
- return stbi__load_gif_main_outofmem(&g, out, delays);
- *delays = new_delays;
- delays_size = layers * sizeof(int);
- }
- } else {
- out = (stbi_uc*)stbi__malloc( layers * stride );
- if (!out)
- return stbi__load_gif_main_outofmem(&g, out, delays);
- out_size = layers * stride;
- if (delays) {
- *delays = (int*) stbi__malloc( layers * sizeof(int) );
- if (!*delays)
- return stbi__load_gif_main_outofmem(&g, out, delays);
- delays_size = layers * sizeof(int);
- }
- }
- memcpy( out + ((layers - 1) * stride), u, stride );
- if (layers >= 2) {
- two_back = out - 2 * stride;
- }
-
- if (delays) {
- (*delays)[layers - 1U] = g.delay;
- }
- }
- } while (u != 0);
-
- // free temp buffer;
- STBI_FREE(g.out);
- STBI_FREE(g.history);
- STBI_FREE(g.background);
-
- // do the final conversion after loading everything;
- if (req_comp && req_comp != 4)
- out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
-
- *z = layers;
- return out;
- } else {
- return stbi__errpuc("not GIF", "Image was not as a gif type.");
- }
-}
-
-static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi_uc *u = 0;
- stbi__gif g;
- memset(&g, 0, sizeof(g));
- STBI_NOTUSED(ri);
-
- u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
- if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
- if (u) {
- *x = g.w;
- *y = g.h;
-
- // moved conversion to after successful load so that the same
- // can be done for multiple frames.
- if (req_comp && req_comp != 4)
- u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
- } else if (g.out) {
- // if there was an error and we allocated an image buffer, free it!
- STBI_FREE(g.out);
- }
-
- // free buffers needed for multiple frame loading;
- STBI_FREE(g.history);
- STBI_FREE(g.background);
-
- return u;
-}
-
-static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
-{
- return stbi__gif_info_raw(s,x,y,comp);
-}
-#endif
-
-// *************************************************************************************************
-// Radiance RGBE HDR loader
-// originally by Nicolas Schulz
-#ifndef STBI_NO_HDR
-static int stbi__hdr_test_core(stbi__context *s, const char *signature)
-{
- int i;
- for (i=0; signature[i]; ++i)
- if (stbi__get8(s) != signature[i])
- return 0;
- stbi__rewind(s);
- return 1;
-}
-
-static int stbi__hdr_test(stbi__context* s)
-{
- int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
- stbi__rewind(s);
- if(!r) {
- r = stbi__hdr_test_core(s, "#?RGBE\n");
- stbi__rewind(s);
- }
- return r;
-}
-
-#define STBI__HDR_BUFLEN 1024
-static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
-{
- int len=0;
- char c = '\0';
-
- c = (char) stbi__get8(z);
-
- while (!stbi__at_eof(z) && c != '\n') {
- buffer[len++] = c;
- if (len == STBI__HDR_BUFLEN-1) {
- // flush to end of line
- while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
- ;
- break;
- }
- c = (char) stbi__get8(z);
- }
-
- buffer[len] = 0;
- return buffer;
-}
-
-static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
-{
- if ( input[3] != 0 ) {
- float f1;
- // Exponent
- f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
- if (req_comp <= 2)
- output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
- else {
- output[0] = input[0] * f1;
- output[1] = input[1] * f1;
- output[2] = input[2] * f1;
- }
- if (req_comp == 2) output[1] = 1;
- if (req_comp == 4) output[3] = 1;
- } else {
- switch (req_comp) {
- case 4: output[3] = 1; /* fallthrough */
- case 3: output[0] = output[1] = output[2] = 0;
- break;
- case 2: output[1] = 1; /* fallthrough */
- case 1: output[0] = 0;
- break;
- }
- }
-}
-
-static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- char buffer[STBI__HDR_BUFLEN];
- char *token;
- int valid = 0;
- int width, height;
- stbi_uc *scanline;
- float *hdr_data;
- int len;
- unsigned char count, value;
- int i, j, k, c1,c2, z;
- const char *headerToken;
- STBI_NOTUSED(ri);
-
- // Check identifier
- headerToken = stbi__hdr_gettoken(s,buffer);
- if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0)
- return stbi__errpf("not HDR", "Corrupt HDR image");
-
- // Parse header
- for(;;) {
- token = stbi__hdr_gettoken(s,buffer);
- if (token[0] == 0) break;
- if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
- }
-
- if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format");
-
- // Parse width and height
- // can't use sscanf() if we're not using stdio!
- token = stbi__hdr_gettoken(s,buffer);
- if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
- token += 3;
- height = (int) strtol(token, &token, 10);
- while (*token == ' ') ++token;
- if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
- token += 3;
- width = (int) strtol(token, NULL, 10);
-
- if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
- if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
-
- *x = width;
- *y = height;
-
- if (comp) *comp = 3;
- if (req_comp == 0) req_comp = 3;
-
- if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))
- return stbi__errpf("too large", "HDR image is too large");
-
- // Read data
- hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);
- if (!hdr_data)
- return stbi__errpf("outofmem", "Out of memory");
-
- // Load image data
- // image data is stored as some number of sca
- if ( width < 8 || width >= 32768) {
- // Read flat data
- for (j=0; j < height; ++j) {
- for (i=0; i < width; ++i) {
- stbi_uc rgbe[4];
- main_decode_loop:
- stbi__getn(s, rgbe, 4);
- stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
- }
- }
- } else {
- // Read RLE-encoded data
- scanline = NULL;
-
- for (j = 0; j < height; ++j) {
- c1 = stbi__get8(s);
- c2 = stbi__get8(s);
- len = stbi__get8(s);
- if (c1 != 2 || c2 != 2 || (len & 0x80)) {
- // not run-length encoded, so we have to actually use THIS data as a decoded
- // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
- stbi_uc rgbe[4];
- rgbe[0] = (stbi_uc) c1;
- rgbe[1] = (stbi_uc) c2;
- rgbe[2] = (stbi_uc) len;
- rgbe[3] = (stbi_uc) stbi__get8(s);
- stbi__hdr_convert(hdr_data, rgbe, req_comp);
- i = 1;
- j = 0;
- STBI_FREE(scanline);
- goto main_decode_loop; // yes, this makes no sense
- }
- len <<= 8;
- len |= stbi__get8(s);
- if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
- if (scanline == NULL) {
- scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
- if (!scanline) {
- STBI_FREE(hdr_data);
- return stbi__errpf("outofmem", "Out of memory");
- }
- }
-
- for (k = 0; k < 4; ++k) {
- int nleft;
- i = 0;
- while ((nleft = width - i) > 0) {
- count = stbi__get8(s);
- if (count > 128) {
- // Run
- value = stbi__get8(s);
- count -= 128;
- if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
- for (z = 0; z < count; ++z)
- scanline[i++ * 4 + k] = value;
- } else {
- // Dump
- if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
- for (z = 0; z < count; ++z)
- scanline[i++ * 4 + k] = stbi__get8(s);
- }
- }
- }
- for (i=0; i < width; ++i)
- stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
- }
- if (scanline)
- STBI_FREE(scanline);
- }
-
- return hdr_data;
-}
-
-static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
-{
- char buffer[STBI__HDR_BUFLEN];
- char *token;
- int valid = 0;
- int dummy;
-
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
-
- if (stbi__hdr_test(s) == 0) {
- stbi__rewind( s );
- return 0;
- }
-
- for(;;) {
- token = stbi__hdr_gettoken(s,buffer);
- if (token[0] == 0) break;
- if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
- }
-
- if (!valid) {
- stbi__rewind( s );
- return 0;
- }
- token = stbi__hdr_gettoken(s,buffer);
- if (strncmp(token, "-Y ", 3)) {
- stbi__rewind( s );
- return 0;
- }
- token += 3;
- *y = (int) strtol(token, &token, 10);
- while (*token == ' ') ++token;
- if (strncmp(token, "+X ", 3)) {
- stbi__rewind( s );
- return 0;
- }
- token += 3;
- *x = (int) strtol(token, NULL, 10);
- *comp = 3;
- return 1;
-}
-#endif // STBI_NO_HDR
-
-#ifndef STBI_NO_BMP
-static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
-{
- void *p;
- stbi__bmp_data info;
-
- info.all_a = 255;
- p = stbi__bmp_parse_header(s, &info);
- if (p == NULL) {
- stbi__rewind( s );
- return 0;
- }
- if (x) *x = s->img_x;
- if (y) *y = s->img_y;
- if (comp) {
- if (info.bpp == 24 && info.ma == 0xff000000)
- *comp = 3;
- else
- *comp = info.ma ? 4 : 3;
- }
- return 1;
-}
-#endif
-
-#ifndef STBI_NO_PSD
-static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int channelCount, dummy, depth;
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
- if (stbi__get32be(s) != 0x38425053) {
- stbi__rewind( s );
- return 0;
- }
- if (stbi__get16be(s) != 1) {
- stbi__rewind( s );
- return 0;
- }
- stbi__skip(s, 6);
- channelCount = stbi__get16be(s);
- if (channelCount < 0 || channelCount > 16) {
- stbi__rewind( s );
- return 0;
- }
- *y = stbi__get32be(s);
- *x = stbi__get32be(s);
- depth = stbi__get16be(s);
- if (depth != 8 && depth != 16) {
- stbi__rewind( s );
- return 0;
- }
- if (stbi__get16be(s) != 3) {
- stbi__rewind( s );
- return 0;
- }
- *comp = 4;
- return 1;
-}
-
-static int stbi__psd_is16(stbi__context *s)
-{
- int channelCount, depth;
- if (stbi__get32be(s) != 0x38425053) {
- stbi__rewind( s );
- return 0;
- }
- if (stbi__get16be(s) != 1) {
- stbi__rewind( s );
- return 0;
- }
- stbi__skip(s, 6);
- channelCount = stbi__get16be(s);
- if (channelCount < 0 || channelCount > 16) {
- stbi__rewind( s );
- return 0;
- }
- STBI_NOTUSED(stbi__get32be(s));
- STBI_NOTUSED(stbi__get32be(s));
- depth = stbi__get16be(s);
- if (depth != 16) {
- stbi__rewind( s );
- return 0;
- }
- return 1;
-}
-#endif
-
-#ifndef STBI_NO_PIC
-static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int act_comp=0,num_packets=0,chained,dummy;
- stbi__pic_packet packets[10];
-
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
-
- if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
- stbi__rewind(s);
- return 0;
- }
-
- stbi__skip(s, 88);
-
- *x = stbi__get16be(s);
- *y = stbi__get16be(s);
- if (stbi__at_eof(s)) {
- stbi__rewind( s);
- return 0;
- }
- if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
- stbi__rewind( s );
- return 0;
- }
-
- stbi__skip(s, 8);
-
- do {
- stbi__pic_packet *packet;
-
- if (num_packets==sizeof(packets)/sizeof(packets[0]))
- return 0;
-
- packet = &packets[num_packets++];
- chained = stbi__get8(s);
- packet->size = stbi__get8(s);
- packet->type = stbi__get8(s);
- packet->channel = stbi__get8(s);
- act_comp |= packet->channel;
-
- if (stbi__at_eof(s)) {
- stbi__rewind( s );
- return 0;
- }
- if (packet->size != 8) {
- stbi__rewind( s );
- return 0;
- }
- } while (chained);
-
- *comp = (act_comp & 0x10 ? 4 : 3);
-
- return 1;
-}
-#endif
-
-// *************************************************************************************************
-// Portable Gray Map and Portable Pixel Map loader
-// by Ken Miller
-//
-// PGM: http://netpbm.sourceforge.net/doc/pgm.html
-// PPM: http://netpbm.sourceforge.net/doc/ppm.html
-//
-// Known limitations:
-// Does not support comments in the header section
-// Does not support ASCII image data (formats P2 and P3)
-
-#ifndef STBI_NO_PNM
-
-static int stbi__pnm_test(stbi__context *s)
-{
- char p, t;
- p = (char) stbi__get8(s);
- t = (char) stbi__get8(s);
- if (p != 'P' || (t != '5' && t != '6')) {
- stbi__rewind( s );
- return 0;
- }
- return 1;
-}
-
-static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
-{
- stbi_uc *out;
- STBI_NOTUSED(ri);
-
- ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);
- if (ri->bits_per_channel == 0)
- return 0;
-
- if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
- if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
-
- *x = s->img_x;
- *y = s->img_y;
- if (comp) *comp = s->img_n;
-
- if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
- return stbi__errpuc("too large", "PNM too large");
-
- out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
- if (!out) return stbi__errpuc("outofmem", "Out of memory");
- if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {
- STBI_FREE(out);
- return stbi__errpuc("bad PNM", "PNM file truncated");
- }
-
- if (req_comp && req_comp != s->img_n) {
- if (ri->bits_per_channel == 16) {
- out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);
- } else {
- out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
- }
- if (out == NULL) return out; // stbi__convert_format frees input on failure
- }
- return out;
-}
-
-static int stbi__pnm_isspace(char c)
-{
- return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
-}
-
-static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)
-{
- for (;;) {
- while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
- *c = (char) stbi__get8(s);
-
- if (stbi__at_eof(s) || *c != '#')
- break;
-
- while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
- *c = (char) stbi__get8(s);
- }
-}
-
-static int stbi__pnm_isdigit(char c)
-{
- return c >= '0' && c <= '9';
-}
-
-static int stbi__pnm_getinteger(stbi__context *s, char *c)
-{
- int value = 0;
-
- while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
- value = value*10 + (*c - '0');
- *c = (char) stbi__get8(s);
- if((value > 214748364) || (value == 214748364 && *c > '7'))
- return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int");
- }
-
- return value;
-}
-
-static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
-{
- int maxv, dummy;
- char c, p, t;
-
- if (!x) x = &dummy;
- if (!y) y = &dummy;
- if (!comp) comp = &dummy;
-
- stbi__rewind(s);
-
- // Get identifier
- p = (char) stbi__get8(s);
- t = (char) stbi__get8(s);
- if (p != 'P' || (t != '5' && t != '6')) {
- stbi__rewind(s);
- return 0;
- }
-
- *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm
-
- c = (char) stbi__get8(s);
- stbi__pnm_skip_whitespace(s, &c);
-
- *x = stbi__pnm_getinteger(s, &c); // read width
- if(*x == 0)
- return stbi__err("invalid width", "PPM image header had zero or overflowing width");
- stbi__pnm_skip_whitespace(s, &c);
-
- *y = stbi__pnm_getinteger(s, &c); // read height
- if (*y == 0)
- return stbi__err("invalid width", "PPM image header had zero or overflowing width");
- stbi__pnm_skip_whitespace(s, &c);
-
- maxv = stbi__pnm_getinteger(s, &c); // read max value
- if (maxv > 65535)
- return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images");
- else if (maxv > 255)
- return 16;
- else
- return 8;
-}
-
-static int stbi__pnm_is16(stbi__context *s)
-{
- if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
- return 1;
- return 0;
-}
-#endif
-
-static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
-{
- #ifndef STBI_NO_JPEG
- if (stbi__jpeg_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PNG
- if (stbi__png_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_GIF
- if (stbi__gif_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_BMP
- if (stbi__bmp_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PSD
- if (stbi__psd_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PIC
- if (stbi__pic_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_PNM
- if (stbi__pnm_info(s, x, y, comp)) return 1;
- #endif
-
- #ifndef STBI_NO_HDR
- if (stbi__hdr_info(s, x, y, comp)) return 1;
- #endif
-
- // test tga last because it's a crappy test!
- #ifndef STBI_NO_TGA
- if (stbi__tga_info(s, x, y, comp))
- return 1;
- #endif
- return stbi__err("unknown image type", "Image not of any known type, or corrupt");
-}
-
-static int stbi__is_16_main(stbi__context *s)
-{
- #ifndef STBI_NO_PNG
- if (stbi__png_is16(s)) return 1;
- #endif
-
- #ifndef STBI_NO_PSD
- if (stbi__psd_is16(s)) return 1;
- #endif
-
- #ifndef STBI_NO_PNM
- if (stbi__pnm_is16(s)) return 1;
- #endif
- return 0;
-}
-
-#ifndef STBI_NO_STDIO
-STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
-{
- FILE *f = stbi__fopen(filename, "rb");
- int result;
- if (!f) return stbi__err("can't fopen", "Unable to open file");
- result = stbi_info_from_file(f, x, y, comp);
- fclose(f);
- return result;
-}
-
-STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
-{
- int r;
- stbi__context s;
- long pos = ftell(f);
- stbi__start_file(&s, f);
- r = stbi__info_main(&s,x,y,comp);
- fseek(f,pos,SEEK_SET);
- return r;
-}
-
-STBIDEF int stbi_is_16_bit(char const *filename)
-{
- FILE *f = stbi__fopen(filename, "rb");
- int result;
- if (!f) return stbi__err("can't fopen", "Unable to open file");
- result = stbi_is_16_bit_from_file(f);
- fclose(f);
- return result;
-}
-
-STBIDEF int stbi_is_16_bit_from_file(FILE *f)
-{
- int r;
- stbi__context s;
- long pos = ftell(f);
- stbi__start_file(&s, f);
- r = stbi__is_16_main(&s);
- fseek(f,pos,SEEK_SET);
- return r;
-}
-#endif // !STBI_NO_STDIO
-
-STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__info_main(&s,x,y,comp);
-}
-
-STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
- return stbi__info_main(&s,x,y,comp);
-}
-
-STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
-{
- stbi__context s;
- stbi__start_mem(&s,buffer,len);
- return stbi__is_16_main(&s);
-}
-
-STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)
-{
- stbi__context s;
- stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
- return stbi__is_16_main(&s);
-}
-
-#endif // STB_IMAGE_IMPLEMENTATION
-
-/*
- revision history:
- 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
- 2.19 (2018-02-11) fix warning
- 2.18 (2018-01-30) fix warnings
- 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
- 1-bit BMP
- *_is_16_bit api
- avoid warnings
- 2.16 (2017-07-23) all functions have 16-bit variants;
- STBI_NO_STDIO works again;
- compilation fixes;
- fix rounding in unpremultiply;
- optimize vertical flip;
- disable raw_len validation;
- documentation fixes
- 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;
- warning fixes; disable run-time SSE detection on gcc;
- uniform handling of optional "return" values;
- thread-safe initialization of zlib tables
- 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
- 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now
- 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
- 2.11 (2016-04-02) allocate large structures on the stack
- remove white matting for transparent PSD
- fix reported channel count for PNG & BMP
- re-enable SSE2 in non-gcc 64-bit
- support RGB-formatted JPEG
- read 16-bit PNGs (only as 8-bit)
- 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED
- 2.09 (2016-01-16) allow comments in PNM files
- 16-bit-per-pixel TGA (not bit-per-component)
- info() for TGA could break due to .hdr handling
- info() for BMP to shares code instead of sloppy parse
- can use STBI_REALLOC_SIZED if allocator doesn't support realloc
- code cleanup
- 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
- 2.07 (2015-09-13) fix compiler warnings
- partial animated GIF support
- limited 16-bpc PSD support
- #ifdef unused functions
- bug with < 92 byte PIC,PNM,HDR,TGA
- 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
- 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
- 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
- 2.03 (2015-04-12) extra corruption checking (mmozeiko)
- stbi_set_flip_vertically_on_load (nguillemot)
- fix NEON support; fix mingw support
- 2.02 (2015-01-19) fix incorrect assert, fix warning
- 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
- 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
- 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
- progressive JPEG (stb)
- PGM/PPM support (Ken Miller)
- STBI_MALLOC,STBI_REALLOC,STBI_FREE
- GIF bugfix -- seemingly never worked
- STBI_NO_*, STBI_ONLY_*
- 1.48 (2014-12-14) fix incorrectly-named assert()
- 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
- optimize PNG (ryg)
- fix bug in interlaced PNG with user-specified channel count (stb)
- 1.46 (2014-08-26)
- fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
- 1.45 (2014-08-16)
- fix MSVC-ARM internal compiler error by wrapping malloc
- 1.44 (2014-08-07)
- various warning fixes from Ronny Chevalier
- 1.43 (2014-07-15)
- fix MSVC-only compiler problem in code changed in 1.42
- 1.42 (2014-07-09)
- don't define _CRT_SECURE_NO_WARNINGS (affects user code)
- fixes to stbi__cleanup_jpeg path
- added STBI_ASSERT to avoid requiring assert.h
- 1.41 (2014-06-25)
- fix search&replace from 1.36 that messed up comments/error messages
- 1.40 (2014-06-22)
- fix gcc struct-initialization warning
- 1.39 (2014-06-15)
- fix to TGA optimization when req_comp != number of components in TGA;
- fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)
- add support for BMP version 5 (more ignored fields)
- 1.38 (2014-06-06)
- suppress MSVC warnings on integer casts truncating values
- fix accidental rename of 'skip' field of I/O
- 1.37 (2014-06-04)
- remove duplicate typedef
- 1.36 (2014-06-03)
- convert to header file single-file library
- if de-iphone isn't set, load iphone images color-swapped instead of returning NULL
- 1.35 (2014-05-27)
- various warnings
- fix broken STBI_SIMD path
- fix bug where stbi_load_from_file no longer left file pointer in correct place
- fix broken non-easy path for 32-bit BMP (possibly never used)
- TGA optimization by Arseny Kapoulkine
- 1.34 (unknown)
- use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
- 1.33 (2011-07-14)
- make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
- 1.32 (2011-07-13)
- support for "info" function for all supported filetypes (SpartanJ)
- 1.31 (2011-06-20)
- a few more leak fixes, bug in PNG handling (SpartanJ)
- 1.30 (2011-06-11)
- added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
- removed deprecated format-specific test/load functions
- removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
- error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
- fix inefficiency in decoding 32-bit BMP (David Woo)
- 1.29 (2010-08-16)
- various warning fixes from Aurelien Pocheville
- 1.28 (2010-08-01)
- fix bug in GIF palette transparency (SpartanJ)
- 1.27 (2010-08-01)
- cast-to-stbi_uc to fix warnings
- 1.26 (2010-07-24)
- fix bug in file buffering for PNG reported by SpartanJ
- 1.25 (2010-07-17)
- refix trans_data warning (Won Chun)
- 1.24 (2010-07-12)
- perf improvements reading from files on platforms with lock-heavy fgetc()
- minor perf improvements for jpeg
- deprecated type-specific functions so we'll get feedback if they're needed
- attempt to fix trans_data warning (Won Chun)
- 1.23 fixed bug in iPhone support
- 1.22 (2010-07-10)
- removed image *writing* support
- stbi_info support from Jetro Lauha
- GIF support from Jean-Marc Lienher
- iPhone PNG-extensions from James Brown
- warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
- 1.21 fix use of 'stbi_uc' in header (reported by jon blow)
- 1.20 added support for Softimage PIC, by Tom Seddon
- 1.19 bug in interlaced PNG corruption check (found by ryg)
- 1.18 (2008-08-02)
- fix a threading bug (local mutable static)
- 1.17 support interlaced PNG
- 1.16 major bugfix - stbi__convert_format converted one too many pixels
- 1.15 initialize some fields for thread safety
- 1.14 fix threadsafe conversion bug
- header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
- 1.13 threadsafe
- 1.12 const qualifiers in the API
- 1.11 Support installable IDCT, colorspace conversion routines
- 1.10 Fixes for 64-bit (don't use "unsigned long")
- optimized upsampling by Fabian "ryg" Giesen
- 1.09 Fix format-conversion for PSD code (bad global variables!)
- 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz
- 1.07 attempt to fix C++ warning/errors again
- 1.06 attempt to fix C++ warning/errors again
- 1.05 fix TGA loading to return correct *comp and use good luminance calc
- 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free
- 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR
- 1.02 support for (subset of) HDR files, float interface for preferred access to them
- 1.01 fix bug: possible bug in handling right-side up bmps... not sure
- fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
- 1.00 interface to zlib that skips zlib header
- 0.99 correct handling of alpha in palette
- 0.98 TGA loader by lonesock; dynamically add loaders (untested)
- 0.97 jpeg errors on too large a file; also catch another malloc failure
- 0.96 fix detection of invalid v value - particleman@mollyrocket forum
- 0.95 during header scan, seek to markers in case of padding
- 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same
- 0.93 handle jpegtran output; verbose errors
- 0.92 read 4,8,16,24,32-bit BMP files of several formats
- 0.91 output 24-bit Windows 3.0 BMP files
- 0.90 fix a few more warnings; bump version number to approach 1.0
- 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd
- 0.60 fix compiling as c++
- 0.59 fix warnings: merge Dave Moore's -Wall fixes
- 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian
- 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
- 0.56 fix bug: zlib uncompressed mode len vs. nlen
- 0.55 fix bug: restart_interval not initialized to 0
- 0.54 allow NULL for 'int *comp'
- 0.53 fix bug in png 3->4; speedup png decoding
- 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments
- 0.51 obey req_comp requests, 1-component jpegs return as 1-component,
- on 'test' only check type, not whether we support this variant
- 0.50 (2006-11-19)
- first released version
-*/
-
-
-/*
-------------------------------------------------------------------------------
-This software is available under 2 licenses -- choose whichever you prefer.
-------------------------------------------------------------------------------
-ALTERNATIVE A - MIT License
-Copyright (c) 2017 Sean Barrett
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-------------------------------------------------------------------------------
-ALTERNATIVE B - Public Domain (www.unlicense.org)
-This is free and unencumbered software released into the public domain.
-Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
-software, either in source code form or as a compiled binary, for any purpose,
-commercial or non-commercial, and by any means.
-In jurisdictions that recognize copyright laws, the author or authors of this
-software dedicate any and all copyright interest in the software to the public
-domain. We make this dedication for the benefit of the public at large and to
-the detriment of our heirs and successors. We intend this dedication to be an
-overt act of relinquishment in perpetuity of all present and future rights to
-this software under copyright law.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-------------------------------------------------------------------------------
-*/
diff --git a/Rend/demos/teapot/texture.frag.spv b/Rend/demos/teapot/texture.frag.spv
deleted file mode 100644
index 09a2e00..0000000
--- a/Rend/demos/teapot/texture.frag.spv
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/teapot/texture.vert.spv b/Rend/demos/teapot/texture.vert.spv
deleted file mode 100644
index 9e6c442..0000000
--- a/Rend/demos/teapot/texture.vert.spv
+++ /dev/null
Binary files differ
diff --git a/Rend/demos/teapot/wal.jpg b/Rend/demos/teapot/wal.jpg
deleted file mode 100644
index d30a9a2..0000000
--- a/Rend/demos/teapot/wal.jpg
+++ /dev/null
Binary files differ
diff --git a/Rend/podium.h b/Rend/podium.h
deleted file mode 100644
index 517774e..0000000
--- a/Rend/podium.h
+++ /dev/null
@@ -1,2282 +0,0 @@
-/* ===========================================================================
- * PODIUM - The Finished Platform Layer - Copyright (c) 2026 Vasco Alves
- *
- * ---------------------------------------------------------------------------
- * To stand on the shoulders of giants...
- * Giants must stand still!"
- * - Eskil Steenberg - "You should finish your software" – BSC 2025
- * ---------------------------------------------------------------------------
- *
- * PREFIX: P_ (types) or p_ (functions & variables)
- *
- * GOAL:
- * Replace the standard library, always talk to the os directly.
- * Besides some optimization and security benefits. Obviously some standard
- * library functions are highly optimized, namely memory and math
- * into our code and debug it. Still a lot is left to be desired
- * and so this library includes it via "modules" which can be imported
- * by flags.
- *
- * DESIGN:
- * The API is finished. It's done. Newer modules may be added in the future
- * but that should not change the underlying core. New platforms may also
- * be added, but the API stays the same.
- *
- * COMPILE TIME FLAGS
- * | Name | Description |
- * |-----------------|---------------------------------------------------------|
- * | PODIUM_WIN32 | Used to explicitly compile for Windows. |
- * | PODIUM_LINUX | Used to explicitly compile for Linux and FreeBSD. |
- *
- * MODULES
- * | Name | Description |
- * |-----------------|---------------------------------------------------------|
- * | P_MODULE_VULKAN | Gives access to vulkan related utilities. |
- * | P_MODULE_STRING | Include string manipulation utilities. |
- * | P_MODULE_MATH | Trigonometry and linear algebra functions. |
- * | P_MODULE_ALLOC | Memory allocators: Arena, Stack & Pool. |
- *
- * =========================================================================== */
-
-#ifndef _PODIUM_H_
-#define _PODIUM_H_
-
-#define PODIUM_MAJOR "0" // needs more revisions and use to reach 1.0 status
-#define PODIUM_MINOR "2" // vulkan module
-#define PODIUM_PATCH "2" // gamepad
-
-#define POAPI static inline
-#define PODEF static inline
-
-/*
- * Auto-detect platforms.
- */
-
-/* Windows */
-#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(__TOS_WIN__)
- #define PODIUM_WIN32
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #endif
-/* Apple */
-#elif defined(__APPLE__) || defined(__MACH__)
- #include <TargetConditionals.h>
- #define PODIUM_APPLE
- #if TARGET_OS_IPHONE
- #define PODIUM_IOS
- #else
- #define PODIUM_MACOS
- #endif
-/* Linux / BSD */
-#elif defined(__linux__) || defined(__FreeBSD__)
- #define PODIUM_LINUX
- #ifndef _POSIX_C_SOURCE
- #define _POSIX_C_SOURCE 200112L
- #endif
-#endif
-
-#include <stdarg.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <string.h> /* memcpy */
-#include <stdio.h> /* vsnprintf */
-
-/*
- * NOTE: The <REPLACE> comments are used by the build
- * script to know what includes to inline into the
- * final single header file!
- */
-
-/* --- Start of p_types.h --- */
-#ifndef _PODIUM_TYPES_
-#define _PODIUM_TYPES_
-
-#define NANOS_PER_SEC (1000*1000*1000)
-#define P_PI_HALF 1.57079632679f
-#define P_PI 3.14159265f
-#define P_PI2 6.28318531f
-#define P_PI_POW2 9.86960440f
-
-#ifdef NDEBUG
- #define assert(x) ((void)0)
-#else
- #ifndef assert
- #define assert(x) \
- do { \
- if (!(x)) { \
- __builtin_trap(); \
- } \
- } while (0)
- #endif
-#endif
-
-#ifndef BUFSIZ
- #define BUFSIZ 8192
-#endif
-
-typedef unsigned char u8;
-typedef signed char i8;
-typedef unsigned short u16;
-typedef short i16;
-typedef unsigned int u32;
-typedef int i32;
-typedef unsigned long long u64;
-typedef long long i64;
-typedef float f32;
-typedef double f64;
-
-#ifndef __cplusplus
-#define bool _Bool
-#define false 0
-#define true 1
-#endif
-
-/* C++ uses static_assert, C11 uses _Static_assert */
-#ifdef __cplusplus
- #define STATIC_ASSERT static_assert
-#else
- #define STATIC_ASSERT _Static_assert
-#endif
-
-STATIC_ASSERT(sizeof(u8) == 1, "u8 must be 1 byte");
-STATIC_ASSERT(sizeof(u16) == 2, "u16 must be 2 bytes");
-STATIC_ASSERT(sizeof(u32) == 4, "u32 must be 4 bytes");
-STATIC_ASSERT(sizeof(u64) == 8, "u64 must be 8 bytes");
-
-STATIC_ASSERT(sizeof(i8) == 1, "i8 must be 1 byte");
-STATIC_ASSERT(sizeof(i16) == 2, "i16 must be 2 bytes");
-STATIC_ASSERT(sizeof(i32) == 4, "i32 must be 4 bytes");
-STATIC_ASSERT(sizeof(i64) == 8, "i64 must be 8 bytes");
-
-STATIC_ASSERT(sizeof(f32) == 4, "f32 must be 4 bytes");
-STATIC_ASSERT(sizeof(f64) == 8, "f64 must be 8 bytes");
-#define U8_MAX 255
-#define U16_MAX 65535
-#define U32_MAX 4294967295
-
-/* Architecture specific sizing */
-#if defined(__x86_64__) || defined(__aarch64__) || defined(_M_X64)
- typedef u64 usize;
- typedef u64 uintptr;
- typedef u32 idx;
- STATIC_ASSERT(sizeof(usize) == 8, "usize must be 8 bytes on 64-bit");
-#else
- typedef u32 usize;
- typedef u32 uintptr;
- typedef u16 idx;
- STATIC_ASSERT(sizeof(usize) == 4, "usize must be 4 bytes on 32-bit");
-#endif
-
-#ifndef NULL
- #ifdef __cplusplus
- #define NULL 0
- #else
- #define NULL ((void*)0)
- #endif
-#endif
-
-#endif // _PODIUM_TYPES_
-/* --- End of p_types.h --- */
-/* --- Start of p_log.h --- */
-/*
- * Logging!
- */
-
-#include <stdlib.h>
-
-#ifdef DEBUG
-#define LOG_DEBUG(...) PRINTF(__VA_ARGS__)
-#else
-#define LOG_DEBUG(...) ((void)0)
-#endif
-
-/* fatal and error always enabled */
-#define PFATAL(message, ...) p_log_printf(P_LOG_LEVEL_FATAL, message, ##__VA_ARGS__)
-#define PERROR(message, ...) p_log_printf(P_LOG_LEVEL_ERROR, message, ##__VA_ARGS__)
-
-/* warn and info enabled by default but can be disabled */
-#define P_LOG_WARN_ENABLED 1
-#define P_LOG_INFO_ENABLED 1
-
-#if P_LOG_WARN_ENABLED == 1
-#define PWARN(message, ...) p_log_printf(P_LOG_LEVEL_WARN, message, ##__VA_ARGS__)
-#else
-#define PWARN(message, ...)
-#endif
-
-#if P_LOG_INFO_ENABLED == 1
-#define PINFO(message, ...) p_log_printf(P_LOG_LEVEL_INFO, message, ##__VA_ARGS__)
-#else
-#define PINFO(message, ...)
-#endif
-
-#if P_LOG_DEBUG_ENABLED == 1
-#define PDEBUG(message, ...) p_log_printf(P_LOG_LEVEL_DEBUG, message, ##__VA_ARGS__)
-#else
-#define PDEBUG(message, ...)
-#endif
-
-#if P_LOG_TRACE_ENABLED == 1
-#define PTRACE(message, ...) p_log_printf(P_LOG_LEVEL_TRACE, message, ##__VA_ARGS__)
-#else
-#define PTRACE(message, ...)
-#endif
-
-typedef enum P_Log_Level {
- P_LOG_LEVEL_FATAL = 0,
- P_LOG_LEVEL_ERROR,
- P_LOG_LEVEL_WARN,
- P_LOG_LEVEL_INFO,
- P_LOG_LEVEL_DEBUG,
- P_LOG_LEVEL_TRACE,
- P_COUNT_LOG_LEVEL
-} P_Log_Level;
-
-#define P_PREFIX_LEN 7
-static const char *p_prefix[P_COUNT_LOG_LEVEL] = {
- [P_LOG_LEVEL_FATAL] = "[FATAL]",
- [P_LOG_LEVEL_ERROR] = "[ERROR]",
- [P_LOG_LEVEL_WARN] = "[WARNI]",
- [P_LOG_LEVEL_INFO] = "[INFOR]",
- [P_LOG_LEVEL_DEBUG] = "[DEBUG]",
- [P_LOG_LEVEL_TRACE] = "[TRACE]",
-};
-
-#define P_MAX_ALLOCS 512
-
-typedef struct P_DebugMemoryInfo {
- void *ptr;
- size_t size;
- const char *file;
- const char *func;
- int line;
-} P_DebugMemoryInfo;
-
-static uint64_t p_alloc_count = 0;
-static P_DebugMemoryInfo p_ptr_array[P_MAX_ALLOCS];
-
-static inline void *
-p_debug_malloc_impl(size_t size, const char *file, int line, const char *func)
-{
- void *ptr = malloc(size);
- printf("[ALLOC] %p (%zu bytes) -> %s:%d %s()\n", ptr, size, file, line, func);
-
- if (ptr) {
- if (p_alloc_count < P_MAX_ALLOCS) {
- p_ptr_array[p_alloc_count++] = (P_DebugMemoryInfo){
- .ptr = ptr,
- .size = size,
- .file = file,
- .func = func,
- .line = line
- };
- } else {
- fprintf(stderr, "[ERROR] Debug allocator tracking capacity (%d) exceeded!\n", P_MAX_ALLOCS);
- }
- }
- return ptr;
-}
-
-static inline void
-p_debug_free_impl(void *ptr, const char *file, int line, const char *func)
-{
- printf("[FREE] %p -> %s:%d %s()\n", ptr, file, line, func);
-
- if (!ptr) return; // Standard C allows free(NULL)
-
- bool found = false;
- uint64_t index = 0;
-
- /* Find allocation metadata */
- for (index = 0; index < p_alloc_count; ++index) {
- if (p_ptr_array[index].ptr == ptr) {
- found = true;
- break;
- }
- }
-
- if (found) {
- /* Shift array left to remove tracked struct */
- for (uint64_t j = index; j < p_alloc_count - 1; ++j) {
- p_ptr_array[j] = p_ptr_array[j + 1];
- }
- p_alloc_count--;
- } else {
- fprintf(stderr, "[WARNING] Attempted to free untracked/double-freed pointer %p at %s:%d %s()\n",
- ptr, file, line, func);
- }
-
- free(ptr);
-}
-
-static inline void *
-p_debug_realloc_impl(void *ptr, size_t size, const char *file, int line, const char *func)
-{
- if (!ptr) {
- return p_debug_malloc_impl(size, file, line, func);
- }
- if (size == 0) {
- p_debug_free_impl(ptr, file, line, func);
- return NULL;
- }
-
- void *new_ptr = realloc(ptr, size);
- printf("[REALLOC] %p -> %p (%zu bytes) -> %s:%d %s()\n", ptr, new_ptr, size, file, line, func);
-
- if (new_ptr) {
- bool found = false;
- for (uint64_t i = 0; i < p_alloc_count; ++i) {
- if (p_ptr_array[i].ptr == ptr) {
- p_ptr_array[i].ptr = new_ptr;
- p_ptr_array[i].size = size;
- p_ptr_array[i].file = file;
- p_ptr_array[i].line = line;
- p_ptr_array[i].func = func;
- found = true;
- break;
- }
- }
- if (!found) {
- if (p_alloc_count < P_MAX_ALLOCS) {
- p_ptr_array[p_alloc_count++] = (P_DebugMemoryInfo){
- .ptr = new_ptr,
- .size = size,
- .file = file,
- .func = func,
- .line = line
- };
- }
- }
- }
- return new_ptr;
-}
-
-static void
-p_debug_memory_report(void)
-{
- printf("\n==================== MEMORY REPORT ====================\n");
- printf("Remaining unfreed allocations: %lu\n", (unsigned long)p_alloc_count);
-
- for (uint64_t i = 0; i < p_alloc_count; ++i) {
- P_DebugMemoryInfo *info = &p_ptr_array[i];
- printf("[LEAK] %p (%zu bytes) allocated at %s:%d in %s()\n",
- info->ptr, info->size, info->file, info->line, info->func);
- }
- printf("=======================================================\n");
-}
-/* --- End of p_log.h --- */
-/* --- Start of p_ds.h --- */
-#define DEFAULT_ALIGNMENT (2 * sizeof(void *))
-#define ARRAY_GROW_FACTOR 2
-
-typedef struct {
- u32 size;
- u32 capacity;
-} DynamicArrayHeader;
-
-#define DARRAY_INIT_CAPACITY 64
-#define p_darray_push(array, var) \
- do { \
- if (array == NULL) { \
- DynamicArrayHeader *header = \
- malloc(DARRAY_INIT_CAPACITY * sizeof *array + sizeof *header); \
- header->size = 0; \
- header->capacity = DARRAY_INIT_CAPACITY; \
- array = (void *)(header + 1); \
- } \
- DynamicArrayHeader *header = (DynamicArrayHeader *)(array) - 1; \
- if (header->size >= header->capacity - 1) { \
- unsigned long new_capacity = header->capacity * 2; \
- DynamicArrayHeader *new_header = \
- realloc(header, new_capacity * sizeof *array + sizeof *header); \
- if (!new_header) \
- break; \
- header = new_header; \
- array = (void *)(header + 1); \
- header->capacity = new_capacity; \
- } \
- (array)[header->size++] = var; \
- } while (0)
-
-#define p_darray_len(array) ((array) ? ((DynamicArrayHeader *)(array) - 1)->size : 0)
-#define p_darray_destroy(array) \
-{ \
- free((DynamicArrayHeader *)(array) - 1); \
-}
-
-#define p_darray_shrink(array) \
- do { \
- DynamicArrayHeader *header = (array) ? ((DynamicArrayHeader *)(array) - 1) : 0;\
- if (header) {\
- if (header->capacity > 4) {\
- unsigned long new_capacity = (header->capacity >> 1) + (header->capacity & 1); \
- void *new_header = realloc(header, new_capacity * sizeof *array + sizeof *header); \
- if (!new_header) break; \
- header = new_header; \
- array = (void *)(header + 1); \
- header->capacity = new_capacity; \
- }\
- }\
- } while (0)
-/* --- End of p_ds.h --- */
-
-/*
- * Main Platform Types (Keyboard, Events, Context, etc.)
- */
-
-typedef enum {
- P_KEYMOD_ALT = 0,
- P_KEYMOD_SHIFT,
- P_KEYMOD_CTRL,
- P_KEYMOD_CAPS,
-} P_KeyMod;
-
-typedef enum {
- P_KEY_UNKNOWN = 0,
- P_KEY_UP, P_KEY_DOWN, P_KEY_LEFT, P_KEY_RIGHT,
- P_KEY_SPACE, P_KEY_ESCAPE, P_KEY_ENTER,
- P_KEY_A, P_KEY_B, P_KEY_C, P_KEY_D, P_KEY_E, P_KEY_F, P_KEY_G, P_KEY_H, P_KEY_I,
- P_KEY_J, P_KEY_K, P_KEY_L, P_KEY_M, P_KEY_N, P_KEY_O, P_KEY_P, P_KEY_Q, P_KEY_R,
- P_KEY_S, P_KEY_T, P_KEY_U, P_KEY_V, P_KEY_W, P_KEY_X, P_KEY_Y, P_KEY_Z,
-} P_KeyCode;
-
-/* Platform event type */
-typedef enum {
- P_EVENT_NONE = 0,
- P_EVENT_KEY_DOWN,
- P_EVENT_KEY_UP,
- P_EVENT_WINDOW_CLOSE,
- P_EVENT_WINDOW_RESIZE,
- P_EVENT_POINTER,
- P_EVENT_CONTROLLER_CONNECTED,
- P_EVENT_CONTROLLER_DISCONNECTED,
-} P_EvenType;
-
-typedef enum {
- P_POINTER_MOVED = 0,
- P_POINTER_PRESSED,
- P_POINTER_RELEASED
-} P_PointerState;
-
-typedef struct {
- P_EvenType type;
- union {
- struct {P_KeyCode key; P_KeyMod mod; } key;
- struct { u32 width, height; } resize;
- struct { P_PointerState state; u32 button; u32 x, y; } pointer;
- };
-} P_Event;
-
-/*
- * Platform dependent functions to be implemented by each layer.
- */
-
-POAPI u64 p_get_time(void); // Get time in nanoseconds.
-POAPI void p_sleep_ns(i64 ns); // Sleep for nanoseconds.
-
-POAPI void p_stdout(void *msg, usize bytes); // Print buffer to stdout.
-PODEF void p_log_printf(P_Log_Level level, const char* src, ...); // Print buffer to stdout.
-
-
-POAPI void* p_file_alloc(const char *path, unsigned long *buf_size);
-POAPI bool p_file_exists(const char *path); // Check if file exists.
-POAPI usize p_file_size(const char *path); // Check file size.
-POAPI void p_file_load(const char *path, void *buf_ptr, unsigned long buf_size); // Load file to buffer.
-PODEF void p_file_write(const char *path, void *buf_ptr, unsigned long buf_size); // Write buffer to file.
-
-typedef struct P_Window_Impl P_Window;
-POAPI bool p_window_open(P_Window *win, int width, int height, const char *title); // Opens a window. Returns false on failure.
-POAPI void p_window_close(P_Window *win); // Close window.
-POAPI bool p_window_is_open(P_Window *win); // Check if window is open.
-POAPI void p_window_size(P_Window *win, int *window_width, int *window_height); // Get window size.
-POAPI void p_window_draw(P_Window *win, u32 *pixels, int width, int height); // Draw directly to the window's buffer. Normally much slower than using the GPU.
-POAPI bool p_window_poll_event(P_Window *win, P_Event *ev); // Returns true while there are events to poll. Write event data to a pointer.
-
-POAPI void p_audio_init(const int sample_rate, const int channels, const char *name, const char *desc);
-POAPI void p_audio_quit();
-POAPI void p_audio_write(const i16 *samples, usize count);
-
-/*
- * The Vulkan Module is platform specific
- */
-
-#ifdef P_MODULE_VULKAN
-#include <vulkan/vulkan.h>
-POAPI char** p_vulkan_get_extensions();
-POAPI bool p_vulkan_create_surface(P_Window *window, VkInstance instance, const VkAllocationCallbacks* allocator, VkSurfaceKHR* out_surface);
-#endif
-
-/*
- * The Remaining Modules are PLATFORM INDEPENDENT!
- */
-
-#ifdef P_MODULE_STRING
-/* --- Start of p_string.h --- */
-typedef struct {
- const char *cstr;
- u32 len;
-} P_StringView;
-
-typedef struct {
- P_StringView sv;
-} P_StringBuilder;
-
-/* Classic C string functions */
-PODEF char* p_find_char(char *buf, char needle);
-PODEF bool p_strcmp(const char *a, const char *b);
-PODEF int p_strlen(const char *a);
-PODEF int p_strtoi(const char *str);
-PODEF char* p_strtok(const char *str, char c);
-
-/* String views */
-PODEF P_StringView p_strview(const char *cstr);
-PODEF void p_strview_chop_left(P_StringView *sv, u32 n);
-PODEF void p_strview_chop_right(P_StringView *sv, u32 n);
-PODEF P_StringView p_strview_chop_delim(P_StringView *sv, char delim);
-PODEF P_StringView p_strview_chop_type(P_StringView *sv, int(*istype)(int));
-PODEF void p_strview_trim_left(P_StringView *sv);
-PODEF void p_strview_trim_right(P_StringView *sv);
-PODEF void p_strview_trim(P_StringView *sv);
-
-/* Classification */
-PODEF int p_is_space(int c);
-PODEF int p_is_digit(int c);
-PODEF int p_is_alpha(int c);
-PODEF int p_is_alnum(int c);
-PODEF int p_is_upper(int c);
-PODEF int p_is_lower(int c);
-PODEF int p_is_hex(int c);
-
-/* Transformation */
-PODEF int p_to_lower(int c);
-PODEF int p_to_upper(int c);
-/* --- End of p_string.h --- */
-#endif
-
-#ifdef P_MODULE_MATH
-/* --- Start of p_math.h --- */
-typedef struct {int x, y; } Vec2i;
-typedef struct {float x, y; } Vec2f;
-typedef struct {float x, y, z; } Vec3f;
-typedef struct { float m[16];} P_Mat4; // column-major: m[col * 4 + row]
-PODEF int p_ceil(float x);
-PODEF float p_cosf(float x);
-PODEF float p_sinf(float x);
-
-PODEF Vec2f p_vec2f(float, float);
-PODEF Vec2f p_vec2f_add(Vec2f, Vec2f);
-PODEF float p_vec2f_cross(Vec2f, Vec2f);
-PODEF float p_vec2f_dot(Vec2f, Vec2f);
-PODEF Vec2f p_vec2f_mult(Vec2f a, float b);
-PODEF Vec2f p_vec2f_sub(Vec2f, Vec2f);
-PODEF Vec2i p_vec2i(float, float);
-PODEF Vec2i p_vec2i_add(Vec2i, Vec2i);
-PODEF float p_vec2i_cross(Vec2i, Vec2i);
-PODEF float p_vec2i_dot(Vec2i, Vec2i);
-PODEF Vec2i p_vec2i_mult(Vec2i a, float b);
-PODEF Vec2i p_vec2i_sub(Vec2i, Vec2i);
-
-PODEF Vec3f p_vec3f(float, float, float);
-
-PODEF P_Mat4 p_mat4_identity(void);
-PODEF P_Mat4 p_mat4_mul(P_Mat4 a, P_Mat4 b);
-PODEF P_Mat4 p_mat4_translate(Vec3f v);
-PODEF P_Mat4 p_mat4_translate_by(P_Mat4 m, Vec3f v);
-PODEF P_Mat4 p_mat4_rotate_x(float rad);
-PODEF P_Mat4 p_mat4_rotate_x_by(P_Mat4 m, float rad);
-PODEF P_Mat4 p_mat4_rotate_y(float rad);
-PODEF P_Mat4 p_mat4_rotate_y_by(P_Mat4 m, float rad);
-PODEF P_Mat4 p_mat4_rotate_z(float rad);
-PODEF P_Mat4 p_mat4_perspective(float fov_rad, float aspect, float near_z, float far_z);
-/* --- End of p_math.h --- */
-#endif
-
-#ifdef P_MODULE_ALLOC
-/* --- Start of p_allocators.h --- */
-typedef struct Arena {
- unsigned char *buf;
- usize buf_len;
- usize curr_offset;
- usize prev_offset;
-} Arena;
-
-PODEF void p_arena_create(Arena *a, void *backing_buffer, usize backing_buffer_length);
-PODEF void* p_arena_alloc_align(Arena *a, usize s, usize align);
-PODEF void* p_arena_alloc(Arena *a, usize s);
-PODEF void* p_arena_resize_align(Arena *a, void *old_memory, usize old_size, usize new_size, usize align);
-PODEF void* p_arena_resize(Arena *a, void *old_memory, usize old_size, usize new_size);
-PODEF void p_arena_free_all(Arena *a);
-PODEF void p_arena_destroy(Arena* a);
-
-typedef struct { u8 padding; } Stack_Allocation_Header;
-typedef struct Stack {
- unsigned char *buf;
- usize buf_len;
- usize offset;
-} Stack;
-
-PODEF void p_stack_create(Stack *s, void *backing_buffer, usize backing_buffer_length);
-PODEF usize calc_padding_with_header(uintptr ptr, uintptr alignment, usize header_size);
-PODEF void* p_stack_alloc(Stack *s, usize len, usize alignment);
-PODEF void p_stack_free(Stack *s, void *ptr);
-PODEF void p_stack_free_all(Stack* s);
-PODEF void p_stack_destroy(Stack* s);
-
-typedef struct Pool_Free_Node Pool_Free_Node;
-
-typedef struct Pool {
- unsigned char *buf;
- usize chunk_size;
- usize pool_size;
- Pool_Free_Node *head;
-} Pool;
-
-struct Pool_Free_Node { struct Pool_Free_Node *next; };
-PODEF void p_pool_create(Pool *p, void *buf, usize buf_len, usize chunk_size, usize chunk_align);
-PODEF void* p_pool_alloc(Pool *p);
-PODEF void p_pool_free(Pool *p, void *ptr);
-PODEF void p_pool_free_all(Pool *p);
-PODEF void p_pool_destroy(Pool *p);
-/* --- End of p_allocators.h --- */
-#endif
-
-#endif /* _PODIUM_H_ */
-
-#ifdef PODIUM_IMPLEMENTATION
-#undef PODIUM_IMPLEMENTATION
-
-#if defined(PODIUM_SDL)
-/* #include "p_platform_sdl.c" */
-#elif defined(PODIUM_WIN32)
-/* --- Start of p_platform_win32.c --- */
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <mmsystem.h>
-#include <xinput.h> /* gamepad support */
-
-typedef struct {
- HWAVEOUT wave_out;
- WAVEHDR wave_header;
-} P_Win32Ctx;
-
-struct P_Window_Impl {
- HWND hwnd;
- HDC hdc;
- BITMAPINFO bitmap_info;
- int width;
- int height;
- bool closed;
-};
-
-P_Win32Ctx p_ctx = {0};
-
-static inline P_KeyCode
-_win32_translate_vkey(WPARAM vk)
-{
- switch (vk) {
- case VK_LEFT: return P_KEY_LEFT;
- case VK_RIGHT: return P_KEY_RIGHT;
- case VK_UP: return P_KEY_UP;
- case VK_DOWN: return P_KEY_DOWN;
- case VK_SPACE: return P_KEY_SPACE;
- case VK_ESCAPE: return P_KEY_ESCAPE;
- case VK_RETURN: return P_KEY_ENTER;
- case 'A': return P_KEY_A;
- case 'B': return P_KEY_B;
- case 'C': return P_KEY_C;
- case 'D': return P_KEY_D;
- case 'E': return P_KEY_E;
- case 'F': return P_KEY_F;
- case 'G': return P_KEY_G;
- case 'H': return P_KEY_H;
- case 'I': return P_KEY_I;
- case 'J': return P_KEY_J;
- case 'K': return P_KEY_K;
- case 'L': return P_KEY_L;
- case 'M': return P_KEY_M;
- case 'N': return P_KEY_N;
- case 'O': return P_KEY_O;
- case 'P': return P_KEY_P;
- case 'Q': return P_KEY_Q;
- case 'R': return P_KEY_R;
- case 'S': return P_KEY_S;
- case 'T': return P_KEY_T;
- case 'U': return P_KEY_U;
- case 'V': return P_KEY_V;
- case 'W': return P_KEY_W;
- case 'X': return P_KEY_X;
- case 'Y': return P_KEY_Y;
- case 'Z': return P_KEY_Z;
- default: return P_KEY_UNKNOWN;
- }
-}
-
-POAPI u64
-p_get_time(void)
-{
- LARGE_INTEGER count, freq;
- QueryPerformanceCounter(&count);
- QueryPerformanceFrequency(&freq);
- return (u64)((count.QuadPart * 1000000000ULL) / freq.QuadPart);
-}
-
-POAPI void
-p_sleep_ns(i64 ns)
-{
- /* windows sleep is millisecond-based........ */
- Sleep((DWORD)(ns / 1000000));
-}
-
-POAPI void
-p_stdout(void *msg, usize bytes)
-{
- HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
- DWORD bytes_written;
- WriteFile(stdout_handle, msg, bytes, &bytes_written, NULL);
-}
-
-POAPI bool
-p_file_exists(const char *path)
-{
- DWORD attr = GetFileAttributesA(path);
- return (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY));
-}
-
-POAPI usize
-p_file_size(const char *path)
-{
- WIN32_FILE_ATTRIBUTE_DATA data;
- if (GetFileAttributesExA(path, GetFileExInfoStandard, &data)) {
- return data.nFileSizeLow;
- }
- return 0;
-}
-
-PODEF void
-p_file_load(const char *path, void *buf_ptr, unsigned long buf_size)
-{
- HANDLE file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
- if (file != INVALID_HANDLE_VALUE) {
- DWORD bytes_read;
- ReadFile(file, buf_ptr, buf_size, &bytes_read, NULL);
- CloseHandle(file);
- }
-}
-
-PODEF void
-p_file_write(const char *path, void *buf_ptr, unsigned long buf_size)
-{
- HANDLE file = CreateFileA(path, GENERIC_WRITE, 0, NULL,
- CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- if (file != INVALID_HANDLE_VALUE) {
- DWORD bytes_written;
- WriteFile(file, buf_ptr, buf_size, &bytes_written, NULL);
- CloseHandle(file);
- }
-}
-
-static LRESULT CALLBACK
-_win32_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
- P_Window *win = (P_Window*)GetWindowLongPtrA(hwnd, GWLP_USERDATA);
- switch (msg) {
- case WM_CLOSE:
- /* Handled in poll_event; mark as closed */
- if (win) win->closed = true;
- return 0;
- }
- return DefWindowProcA(hwnd, msg, wparam, lparam);
-}
-
-POAPI bool
-p_window_open(P_Window *win, int width, int height, const char *title)
-{
- HINSTANCE instance = GetModuleHandleA(NULL);
-
- WNDCLASSA wc = {0};
- wc.lpfnWndProc = _win32_wnd_proc;
- wc.hInstance = instance;
- wc.lpszClassName = "P_Window_Class";
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-
- RegisterClassA(&wc);
-
- win->hwnd = CreateWindowExA(0, wc.lpszClassName, title,
- WS_OVERLAPPEDWINDOW | WS_VISIBLE,
- CW_USEDEFAULT, CW_USEDEFAULT, width, height,
- NULL, NULL, instance, NULL);
-
- if (!win->hwnd) return false;
-
- SetWindowLongPtrA(win->hwnd, GWLP_USERDATA, (LONG_PTR)win);
- win->hdc = GetDC(win->hwnd);
- win->width = width;
- win->height = height;
- win->closed = false;
-
- return true;
-}
-
-POAPI void
-p_window_close(P_Window *win)
-{
- if (!win) return;
- if (win->hdc) ReleaseDC(win->hwnd, win->hdc);
- if (win->hwnd) DestroyWindow(win->hwnd);
- win->hdc = NULL;
- win->hwnd = NULL;
-}
-
-POAPI bool
-p_window_is_open(P_Window *win)
-{
- return win && win->hwnd != NULL;
-}
-
-POAPI void
-p_window_size(P_Window *win, int *window_width, int *window_height)
-{
- if (!win) return;
- RECT rect;
- GetClientRect(win->hwnd, &rect);
- *window_width = rect.right - rect.left;
- *window_height = rect.bottom - rect.top;
- win->width = *window_width;
- win->height = *window_height;
-}
-
-POAPI void
-p_window_draw(P_Window *win, u32 *pixels, int width, int height)
-{
- BITMAPINFO bmi = {0};
- bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
- bmi.bmiHeader.biWidth = width;
- bmi.bmiHeader.biHeight = -height; /* top-down */
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 32;
- bmi.bmiHeader.biCompression = BI_RGB;
-
- StretchDIBits(win->hdc,
- 0, 0, win->width, win->height,
- 0, 0, width, height,
- pixels, &bmi, DIB_RGB_COLORS, SRCCOPY);
-}
-
-POAPI bool
-p_window_poll_event(P_Window *win, P_Event *ev)
-{
- if (win->closed) {
- win->closed = false;
- ev->type = P_EVENT_WINDOW_CLOSE;
- return true;
- }
-
- MSG msg;
- while (PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE)) {
- switch (msg.message) {
-
- case WM_QUIT:
- ev->type = P_EVENT_WINDOW_CLOSE;
- return true;
-
- /* Key press */
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- ev->type = P_EVENT_KEY_DOWN;
- ev->key.key = _win32_translate_vkey(msg.wParam);
- return true;
-
- /* Key release */
- case WM_KEYUP:
- case WM_SYSKEYUP:
- ev->type = P_EVENT_KEY_UP;
- ev->key.key = _win32_translate_vkey(msg.wParam);
- return true;
-
- /* Mouse movement */
- case WM_MOUSEMOVE:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_MOVED;
- ev->pointer.button = 0;
- ev->pointer.x = (u32)(msg.lParam & 0xFFFF);
- ev->pointer.y = (u32)((msg.lParam >> 16) & 0xFFFF);
- return true;
-
- /* Mouse buttons */
- case WM_LBUTTONDOWN:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_PRESSED;
- ev->pointer.button = 1; /* 1 = LMB, matching X11 convention */
- ev->pointer.x = (u32)(msg.lParam & 0xFFFF);
- ev->pointer.y = (u32)((msg.lParam >> 16) & 0xFFFF);
- return true;
-
- case WM_LBUTTONUP:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_RELEASED;
- ev->pointer.button = 1;
- ev->pointer.x = (u32)(msg.lParam & 0xFFFF);
- ev->pointer.y = (u32)((msg.lParam >> 16) & 0xFFFF);
- return true;
-
- case WM_RBUTTONDOWN:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_PRESSED;
- ev->pointer.button = 3; /* 3 = RMB */
- ev->pointer.x = (u32)(msg.lParam & 0xFFFF);
- ev->pointer.y = (u32)((msg.lParam >> 16) & 0xFFFF);
- return true;
-
- case WM_RBUTTONUP:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_RELEASED;
- ev->pointer.button = 3;
- ev->pointer.x = (u32)(msg.lParam & 0xFFFF);
- ev->pointer.y = (u32)((msg.lParam >> 16) & 0xFFFF);
- return true;
-
- case WM_MBUTTONDOWN:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_PRESSED;
- ev->pointer.button = 2; /* 2 = MMB */
- ev->pointer.x = (u32)(msg.lParam & 0xFFFF);
- ev->pointer.y = (u32)((msg.lParam >> 16) & 0xFFFF);
- return true;
-
- case WM_MBUTTONUP:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_RELEASED;
- ev->pointer.button = 2;
- ev->pointer.x = (u32)(msg.lParam & 0xFFFF);
- ev->pointer.y = (u32)((msg.lParam >> 16) & 0xFFFF);
- return true;
-
- /* Window resize */
- case WM_SIZE:
- ev->type = P_EVENT_WINDOW_RESIZE;
- ev->resize.width = (u32)(msg.lParam & 0xFFFF);
- ev->resize.height = (u32)((msg.lParam >> 16) & 0xFFFF);
- win->width = ev->resize.width;
- win->height = ev->resize.height;
- return true;
-
- default:
- TranslateMessage(&msg);
- DispatchMessageA(&msg);
- break;
- }
- }
-
- ev->type = P_EVENT_NONE;
- return false;
-}
-
-
-POAPI void
-p_audio_init(const int sample_rate, const int channels, const char *name, const char *desc)
-{
- (void)name; (void)desc; /* WinMM doesn't use a stream name */
-
- WAVEFORMATEX wfx = {0};
- wfx.wFormatTag = WAVE_FORMAT_PCM;
- wfx.nChannels = channels;
- wfx.nSamplesPerSec = sample_rate;
- wfx.wBitsPerSample = 16;
- wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample) / 8;
- wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
-
- if (waveOutOpen(&p_ctx.wave_out, WAVE_MAPPER, &wfx, 0, 0, CALLBACK_NULL) != MMSYSERR_NOERROR) {
- exit(1);
- }
-}
-
-POAPI void
-p_audio_quit()
-{
- if (p_ctx.wave_out) {
- waveOutReset(p_ctx.wave_out);
- waveOutClose(p_ctx.wave_out);
- p_ctx.wave_out = NULL;
- }
-}
-
-POAPI void
-p_audio_write(const i16 *samples, usize count)
-{
- if (!p_ctx.wave_out) return;
-
- WAVEHDR header = {0};
- header.lpData = (LPSTR)samples;
- header.dwBufferLength = (DWORD)(count * sizeof(i16));
-
- waveOutPrepareHeader(p_ctx.wave_out, &header, sizeof(WAVEHDR));
- waveOutWrite(p_ctx.wave_out, &header, sizeof(WAVEHDR));
-
- /* wait for playback to finish (synchronous, mirrors pa_simple_drain) */
- while (!(header.dwFlags & WHDR_DONE)) Sleep(1);
-
- waveOutUnprepareHeader(p_ctx.wave_out, &header, sizeof(WAVEHDR));
-}
-
-#ifdef P_MODULE_VULKAN
-
-#ifndef VK_USE_PLATFORM_WIN32_KHR
-#define VK_USE_PLATFORM_WIN32_KHR
-#endif
-#include <vulkan/vulkan_win32.h>
-
-POAPI char**
-p_vulkan_get_extensions()
-{
- char **darr = NULL;
- p_darray_push(darr, "VK_KHR_surface");
- p_darray_push(darr, "VK_KHR_win32_surface");
- return darr;
-}
-
-POAPI bool
-p_vulkan_create_surface(P_Window *window, VkInstance instance, const VkAllocationCallbacks* allocator, VkSurfaceKHR* out_surface)
-{
- if (!instance || !window || !window->hwnd || !out_surface) {
- return false;
- }
-
- VkWin32SurfaceCreateInfoKHR create_info = {0};
- create_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
- create_info.pNext = NULL;
- create_info.flags = 0;
- create_info.hwnd = window->hwnd;
- create_info.hinstance = GetModuleHandleA(NULL);
-
- VkResult result = vkCreateWin32SurfaceKHR(instance, &create_info, allocator, out_surface);
- return (result == VK_SUCCESS);
-}
-#endif
-/* --- End of p_platform_win32.c --- */
-#elif defined(PODIUM_LINUX)
-/* --- Start of p_platform_linux.c --- */
-/* linux */
-#include <time.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <errno.h>
-/* x11 */
-#include <X11/Xlib.h>
-#include <X11/keysym.h>
-/* pulse audio */
-#include <pulse/pulseaudio.h>
-#include <pulse/simple.h>
-#include <pulse/error.h>
-/* joystick */
-#include <linux/joystick.h>
-
-typedef struct {
- pa_simple *audio_stream;
-} P_LinuxCtx;
-
-struct P_Window_Impl {
- Display *display;
- XImage *image;
- Window window;
- GC gc;
- int screen;
- int width;
- int height;
-};
-
-P_LinuxCtx p_ctx = {0};
-
-static inline P_KeyCode
-_x11_translate_keycode(XEvent xev)
-{
- static KeySym ks;
- ks = XLookupKeysym(&xev.xkey, 0);
- switch (ks) {
- /* Arrow keys */
- case XK_Left: return P_KEY_LEFT;
- case XK_Right: return P_KEY_RIGHT;
- case XK_Up: return P_KEY_UP;
- case XK_Down: return P_KEY_DOWN;
- /* Common keys */
- case XK_space: return P_KEY_SPACE;
- case XK_Escape: return P_KEY_ESCAPE;
- case XK_Return: return P_KEY_ENTER;
- case XK_A: case XK_a: return P_KEY_A;
- case XK_B: case XK_b: return P_KEY_B;
- case XK_C: case XK_c: return P_KEY_C;
- case XK_D: case XK_d: return P_KEY_D;
- case XK_E: case XK_e: return P_KEY_E;
- case XK_F: case XK_f: return P_KEY_F;
- case XK_G: case XK_g: return P_KEY_G;
- case XK_H: case XK_h: return P_KEY_H;
- case XK_I: case XK_i: return P_KEY_I;
- case XK_J: case XK_j: return P_KEY_J;
- case XK_K: case XK_k: return P_KEY_K;
- case XK_L: case XK_l: return P_KEY_L;
- case XK_M: case XK_m: return P_KEY_M;
- case XK_N: case XK_n: return P_KEY_N;
- case XK_O: case XK_o: return P_KEY_O;
- case XK_P: case XK_p: return P_KEY_P;
- case XK_Q: case XK_q: return P_KEY_Q;
- case XK_R: case XK_r: return P_KEY_R;
- case XK_S: case XK_s: return P_KEY_S;
- case XK_T: case XK_t: return P_KEY_T;
- case XK_U: case XK_u: return P_KEY_U;
- case XK_V: case XK_v: return P_KEY_V;
- case XK_W: case XK_w: return P_KEY_W;
- case XK_X: case XK_x: return P_KEY_X;
- case XK_Y: case XK_y: return P_KEY_Y;
- case XK_Z: case XK_z: return P_KEY_Z;
- default: return P_KEY_UNKNOWN;
- }
-}
-
-POAPI u64
-p_get_time(void)
-{
- struct timespec ts;
- clock_gettime(CLOCK_MONOTONIC, &ts);
- return NANOS_PER_SEC * ts.tv_sec + ts.tv_nsec;
-}
-
-POAPI void
-p_sleep_ns(i64 ns)
-{
- struct timespec ts;
- ts.tv_sec = ns / 1000000000L;
- ts.tv_nsec = ns % 1000000000L;
- clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
-}
-
-POAPI void
-p_stdout(void *msg, usize bytes)
-{
- write(1, msg, bytes);
-}
-
-POAPI bool
-p_file_exists(const char *path)
-{
- return (access(path, F_OK) == 0);
-}
-
-POAPI usize
-p_file_size(const char *path)
-{
- struct stat st;
- if (stat(path, &st) == 0) {
- return st.st_size;
- }
- return 0;
-}
-
-PODEF void
-p_file_load(const char *path, void *buf_ptr, unsigned long buf_size)
-{
- int fd = open(path, O_RDONLY);
- if (fd >= 0) {
- read(fd, buf_ptr, (size_t)buf_size);
- close(fd);
- }
-}
-
-PODEF void
-p_file_write(const char *path, void *buf_ptr, unsigned long buf_size)
-{
- int fd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0644);
- if (fd >= 0) {
- write(fd, buf_ptr, (size_t)buf_size);
- close(fd);
- }
-}
-
-POAPI bool
-p_window_open(P_Window *win, int width, int height, const char *title)
-{
- win->width = width;
- win->height = height;
-
- XInitThreads();
-
- win->display = XOpenDisplay(NULL);
- if (win->display == NULL) {
- PERROR("Cannot open display!");
- return false;
- }
-
- int screen = DefaultScreen(win->display);
- win->window = XCreateSimpleWindow(
- win->display,
- RootWindow(win->display, screen),
- 0, 0, width, height,
- 1,
- BlackPixel(win->display, screen),
- BlackPixel(win->display, screen)
- );
-
- win->screen = screen;
-
- XStoreName(win->display, win->window, title);
- XSelectInput(win->display, win->window,
- KeyPressMask | KeyReleaseMask |
- ButtonPressMask | ButtonReleaseMask |
- PointerMotionMask | StructureNotifyMask);
- XMapWindow(win->display, win->window);
-
- win->gc = DefaultGC(win->display, screen);
-
- Atom wm_delete = XInternAtom(win->display, "WM_DELETE_WINDOW", False);
- XSetWMProtocols(win->display, win->window, &wm_delete, 1);
-
- return true;
-}
-
-POAPI void
-p_window_close(P_Window *win)
-{
- if (!win) return;
-
- if (win->image) {
- // XDestroyImage(win->image);
- win->image = NULL;
- }
-
- if (win->display) {
- Display *dpy = win->display;
- Window w = win->window;
- win->display = NULL;
- win->window = 0;
-
- if (w) {
- XDestroyWindow(dpy, w);
- }
- XSync(dpy, False);
- }
-}
-
-POAPI bool
-p_window_is_open(P_Window *win)
-{
- return win && win->display != NULL;
-}
-
-POAPI void
-p_window_size(P_Window *win, int *window_width, int *window_height)
-{
- if (!win) return;
-
- XWindowAttributes attr;
- XGetWindowAttributes(win->display, win->window, &attr);
- *window_width = attr.width;
- *window_height = attr.height;
-
- win->width = attr.width;
- win->height = attr.height;
-}
-
-POAPI void
-p_window_draw(P_Window *win, u32 *pixels, int width, int height)
-{
- int screen = win->screen;
-
- win->image = XCreateImage(
- win->display,
- DefaultVisual(win->display, screen),
- DefaultDepth(win->display, screen),
- ZPixmap,
- 0,
- (char*)pixels,
- width,
- height,
- 32,
- width * 4
- );
-
- int window_width, window_height;
- p_window_size(win, &window_width, &window_height);
-
- XPutImage(
- win->display,
- win->window,
- win->gc,
- win->image,
- 0, 0,
- 0, 0,
- win->width,
- win->height);
-
- XFlush(win->display);
-}
-
-POAPI bool
-p_window_poll_event(P_Window *win, P_Event *ev)
-{
- if (XPending(win->display)) {
- static XEvent xev;
- XNextEvent(win->display, &xev);
-
- switch (xev.type) {
-
- case KeyPress:
- ev->type = P_EVENT_KEY_DOWN;
- ev->key.key = _x11_translate_keycode(xev);
- return true;
-
- case KeyRelease:
- ev->type = P_EVENT_KEY_UP;
- ev->key.key = _x11_translate_keycode(xev);
- return true;
-
- case ConfigureNotify:
- ev->type = P_EVENT_WINDOW_RESIZE;
- ev->resize.width = xev.xconfigure.width;
- ev->resize.height = xev.xconfigure.height;
- return true;
-
- case ClientMessage:
- if ((Atom)xev.xclient.data.l[0] ==
- XInternAtom(win->display, "WM_DELETE_WINDOW", False)) {
- ev->type = P_EVENT_WINDOW_CLOSE;
- return true;
- }
- break;
-
- case MotionNotify:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_MOVED;
- ev->pointer.button = 0;
- ev->pointer.x = xev.xmotion.x;
- ev->pointer.y = xev.xmotion.y;
- return true;
-
- case ButtonPress:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_PRESSED;
- ev->pointer.button = xev.xbutton.button; /* 1=LMB, 2=MMB, 3=RMB */
- ev->pointer.x = xev.xbutton.x;
- ev->pointer.y = xev.xbutton.y;
- return true;
-
- case ButtonRelease:
- ev->type = P_EVENT_POINTER;
- ev->pointer.state = P_POINTER_RELEASED;
- ev->pointer.button = xev.xbutton.button;
- ev->pointer.x = xev.xbutton.x;
- ev->pointer.y = xev.xbutton.y;
- return true;
- }
- }
-
- ev->type = P_EVENT_NONE;
- return false;
-}
-
-POAPI void
-p_audio_init(const int sample_rate, const int channels, const char *name, const char *desc)
-{
- pa_sample_spec ss = {
- .format = PA_SAMPLE_S16LE,
- .rate = sample_rate,
- .channels = channels,
- };
-
- int error;
- p_ctx.audio_stream = pa_simple_new(
- NULL,
- name,
- PA_STREAM_PLAYBACK,
- NULL,
- desc,
- &ss,
- NULL,
- NULL,
- &error
- );
-
- if (!p_ctx.audio_stream) {
- PERROR("PulseAudio init failed: %s\n", pa_strerror(error));
- exit(1);
- }
-}
-
-POAPI void
-p_audio_quit()
-{
- if (p_ctx.audio_stream) {
- pa_simple_free(p_ctx.audio_stream);
- p_ctx.audio_stream = NULL;
- }
-}
-
-POAPI void
-p_audio_write(const i16 *samples, usize count)
-{
- if (!p_ctx.audio_stream) return;
-
- int error;
- if (pa_simple_write(p_ctx.audio_stream, samples, count * sizeof(i16), &error) < 0) {
- PERROR("PulseAudio write failed: %s\n", pa_strerror(error));
- }
-
- pa_simple_drain(p_ctx.audio_stream, &error);
-}
-
-#ifdef P_MODULE_VULKAN
-
-#ifndef VK_USE_PLATFORM_XLIB_KHR
-#define VK_USE_PLATFORM_XLIB_KHR
-#endif
-#include <vulkan/vulkan_xlib.h>
-
-POAPI char**
-p_vulkan_get_extensions()
-{
- char **darr = NULL;
- p_darray_push(darr, "VK_KHR_surface");
- p_darray_push(darr, "VK_KHR_xcb_surface");
- p_darray_push(darr, "VK_KHR_xlib_surface");
- return darr;
-}
-
-POAPI bool
-p_vulkan_create_surface(P_Window *window, VkInstance instance, const VkAllocationCallbacks* allocator, VkSurfaceKHR* out_surface)
-{
- if (!instance || !window || !window->display || !window->window || !out_surface) {
- return false;
- }
-
- VkXlibSurfaceCreateInfoKHR create_info = {0};
- create_info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
- create_info.pNext = NULL;
- create_info.flags = 0;
- create_info.dpy = window->display;
- create_info.window = window->window;
-
- VkResult result = vkCreateXlibSurfaceKHR(instance, &create_info, allocator, out_surface);
-
- return (result == VK_SUCCESS);
-}
-#endif
-/* --- End of p_platform_linux.c --- */
-#endif /* linux */
-
-
-POAPI void* p_file_alloc(const char *path, unsigned long *buf_size) {
- if (p_file_exists(path) == false) {
- return NULL;
- }
-
- usize file_size = p_file_size(path);
- *buf_size = file_size;
-
- void *ptr = malloc(file_size);
- if (ptr) {
- p_file_load(path, ptr, file_size); // Load file to buffer.
- }
- return ptr;
-}
-
-
-/*
- * Import Module Code
- */
-
-#ifdef P_MODULE_STRING
-/* --- Start of p_string.c --- */
-PODEF char*
-p_find_char(char *buf, char needle)
-{
- while (buf && *buf != needle) buf++;
- return buf;
-}
-
-PODEF bool
-p_strcmp(const char *a, const char *b)
-{
- if (p_strlen(a) != p_strlen(b))
- return false;
-
- while (a && b && *a != '\0') {
- if (*(a++) != *(b++)) return false;
- }
-
- return true;
-}
-
-PODEF int
-p_strlen(const char *a)
-{
- int i = 0;
- while (*a++ != '\0') i++;
- return i;
-}
-
-PODEF int
-p_strtoi(const char *str)
-{
- int res = 0;
-
- while (*str) {
- if (*str >= '0' && *str <= '9') {
- res = res * 10 + (*str - '0');
- } else {
- return res;
- }
- str++;
- }
-
- return res;
-}
-
-PODEF char*
-p_strtok(const char *str, char c)
-{
- while (*str != c && *str++ != '\0');
- return (*str == c) ? (char*) ++str : 0;
-}
-
-PODEF P_StringView
-p_strview(const char *cstr)
-{
- P_StringView sv = {0};
- sv.cstr = cstr;
- sv.len = p_strlen(cstr);
- return sv;
-}
-
-PODEF void
-p_strview_chop_left(P_StringView *sv, u32 n)
-{
- if (n > sv->len) n = sv->len;
- sv->cstr += n;
- sv->len -= n;
-}
-
-PODEF void
-p_strview_chop_right(P_StringView *sv, u32 n)
-{
- if (n > sv->len) n = sv->len;
- sv->len -= n;
-}
-
-PODEF P_StringView
-p_strview_chop_delim(P_StringView *sv, char delim)
-{
- u32 i = 0;
- while (i < sv->len && sv->cstr[i] != delim) {
- i++;
- }
-
- P_StringView tok;
- if (i < sv->len) {
- tok.cstr = sv->cstr;
- tok.len = i;
- p_strview_chop_left(sv, i + 1);
- return tok;
- }
-
- tok = *sv;
- p_strview_chop_left(sv, sv->len);
- return tok;
-}
-
-PODEF P_StringView
-p_strview_chop_type(P_StringView *sv, int(*istype)(int))
-{
- u32 i = 0;
- while (i < sv->len && istype(sv->cstr[i])) {
- i++;
- }
-
- P_StringView tok;
- if (i < sv->len) {
- tok.cstr = sv->cstr;
- tok.len = i;
- p_strview_chop_left(sv, i + 1);
- return tok;
- }
-
- tok = *sv;
- p_strview_chop_left(sv, sv->len);
- return tok;
-}
-
-
-PODEF void
-p_strview_trim_left(P_StringView *sv)
-{
- while (sv->len > 0 && p_is_space(sv->cstr[0])) {
- p_strview_chop_left(sv, 1);
- }
-}
-
-PODEF void
-p_strview_trim_right(P_StringView *sv)
-{
- while (sv->len > 0 && p_is_space(sv->cstr[sv->len-1])) {
- p_strview_chop_right(sv, 1);
- }
-}
-
-PODEF void
-p_strview_trim(P_StringView *sv)
-{
- p_strview_trim_left(sv);
- p_strview_trim_right(sv);
-}
-
-PODEF int
-p_is_space(int c)
-{
- /* Checks for: space, form feed (\f), line feed (\n),
- * carriage return (\r), horizontal tab (\t), vertical tab (\v) */
- return (c == ' ' || (c >= '\t' && c <= '\r'));
-}
-
-PODEF int
-p_is_digit(int c)
-{
- return (c >= '0' && c <= '9');
-}
-
-PODEF int
-p_is_alpha(int c)
-{
- return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
-}
-
-PODEF int
-p_is_alnum(int c)
-{
- return (p_is_alpha(c) || p_is_digit(c));
-}
-
-PODEF int
-p_is_hex(int c)
-{
- return (p_is_digit(c) ||
- (c >= 'a' && c <= 'f') ||
- (c >= 'A' && c <= 'F'));
-}
-
-PODEF int
-p_is_upper(int c)
-{
- return (c >= 'A' && c <= 'Z');
-}
-
-PODEF int
-p_is_lower(int c)
-{
- return (c >= 'a' && c <= 'z');
-}
-
-PODEF int
-p_to_lower(int c)
-{
- if (p_is_upper(c)) return (c + ('a' - 'A'));
- return c;
-}
-
-PODEF int
-p_to_upper(int c)
-{
- if (p_is_lower(c)) return (c - ('a' - 'A'));
- return c;
-}
-/* --- End of p_string.c --- */
-#endif
-
-#ifdef P_MODULE_MATH
-/* --- Start of p_math.c --- */
-PODEF
-int p_ceil(float x)
-{
- int base = (int) x;
- return (x > base) ? base + 1 : base;
-}
-
-PODEF float
-p_cosf(float x)
-{
- x += 1.57079632679f;
-
- while (x > P_PI) x -= P_PI2;
- while (x < -P_PI) x += P_PI2;
-
- const float B = 4.0f / P_PI;
- const float C = -4.0f / P_PI_POW2;
-
- float y = B * x + C * x * (x < 0 ? -x : x);
-
- const float P = 0.225f;
- y = P * (y * (y < 0 ? -y : y) - y) + y;
-
- return y;
-}
-
-PODEF float
-p_sinf(float x)
-{
- while (x > P_PI) x -= P_PI2;
- while (x < -P_PI) x += P_PI2;
-
- const float B = 4.0f / P_PI;
- const float C = -4.0f / (P_PI_POW2);
-
- float y = B * x + C * x * (x < 0 ? -x : x);
-
- const float P = 0.225f;
- y = P * (y * (y < 0 ? -y : y) - y) + y;
-
- return y;
-}
-
-PODEF Vec2f
-p_vec2f(float x, float y)
-{
- return (Vec2f) { .x = x, .y = y };
-}
-
-PODEF Vec2f
-p_vec2f_add(Vec2f a, Vec2f b)
-{
- return (Vec2f) {
- .x = a.x + b.x,
- .y = a.y + b.y,
- };
-}
-
-PODEF float
-p_vec2f_cross(Vec2f a, Vec2f b)
-{
- // axby − aybx
- return a.x * b.y - a.y * b.x;
-}
-
-PODEF float
-p_vec2f_dot(Vec2f a, Vec2f b)
-{
- // a · b = ax × bx + ay × by
- return a.x * b.x + a.y * b.y;
-}
-
-PODEF Vec2f
-p_vec2f_mult(Vec2f a, float b)
-{
- return (Vec2f) {
- .x = a.x * b,
- .y = a.y * b,
- };
-}
-
-PODEF Vec2f
-p_vec2f_sub(Vec2f a, Vec2f b)
-{
- return (Vec2f) {
- .x = a.x - b.x,
- .y = a.y - b.y,
- };
-}
-
-PODEF Vec2i
-p_vec2i(float x, float y)
-{
- return (Vec2i) { .x = x, .y = y };
-}
-
-PODEF Vec2i
-p_vec2i_add(Vec2i a, Vec2i b)
-{
- return (Vec2i) {
- .x = a.x + b.x,
- .y = a.y + b.y,
- };
-}
-
-PODEF float
-p_vec2i_cross(Vec2i a, Vec2i b)
-{
- // axby − aybx
- return a.x * b.y - a.y * b.x;
-}
-
-PODEF float
-p_vec2i_dot(Vec2i a, Vec2i b)
-{
- // a · b = ax × bx + ay × by
- return a.x * b.x + a.y * b.y;
-}
-
-PODEF Vec2i
-p_vec2i_mult(Vec2i a, float b)
-{
- return (Vec2i) {
- .x = a.x * b,
- .y = a.y * b,
- };
-}
-
-PODEF Vec2i
-p_vec2i_sub(Vec2i a, Vec2i b)
-{
- return (Vec2i) {
- .x = a.x - b.x,
- .y = a.y - b.y,
- };
-}
-
-PODEF Vec3f
-p_vec3f(float x, float y, float z)
-{
- return (Vec3f) { .x = x, .y = y, .z = z };
-}
-
-PODEF P_Mat4
-p_mat4_identity(void)
-{
- P_Mat4 res = {0};
- res.m[0] = 1.0f;
- res.m[5] = 1.0f;
- res.m[10] = 1.0f;
- res.m[15] = 1.0f;
- return res;
-}
-
-PODEF P_Mat4
-p_mat4_mul(P_Mat4 a, P_Mat4 b)
-{
- P_Mat4 res = {0};
- for (int col = 0; col < 4; ++col) {
- for (int row = 0; row < 4; ++row) {
- float sum = 0.0f;
- for (int k = 0; k < 4; ++k) {
- sum += a.m[k * 4 + row] * b.m[col * 4 + k];
- }
- res.m[col * 4 + row] = sum;
- }
- }
- return res;
-}
-
-PODEF P_Mat4
-p_mat4_translate(Vec3f v)
-{
- P_Mat4 res = p_mat4_identity();
- res.m[12] = v.x;
- res.m[13] = v.y;
- res.m[14] = v.z;
- return res;
-}
-
-PODEF P_Mat4
-p_mat4_translate_by(P_Mat4 m, Vec3f v)
-{
- P_Mat4 res = m;
- res.m[12] = m.m[0] * v.x + m.m[4] * v.y + m.m[8] * v.z + m.m[12];
- res.m[13] = m.m[1] * v.x + m.m[5] * v.y + m.m[9] * v.z + m.m[13];
- res.m[14] = m.m[2] * v.x + m.m[6] * v.y + m.m[10] * v.z + m.m[14];
- res.m[15] = m.m[3] * v.x + m.m[7] * v.y + m.m[11] * v.z + m.m[15];
- return res;
-}
-
-PODEF P_Mat4
-p_mat4_rotate_x(float rad)
-{
- P_Mat4 res = p_mat4_identity();
- float c = p_cosf(rad);
- float s = p_sinf(rad);
- res.m[5] = c;
- res.m[6] = s;
- res.m[9] = -s;
- res.m[10] = c;
- return res;
-}
-
-PODEF P_Mat4
-p_mat4_rotate_x_by(P_Mat4 m, float rad)
-{
- return p_mat4_mul(m, p_mat4_rotate_x(rad));
-}
-
-PODEF P_Mat4
-p_mat4_rotate_y(float rad)
-{
- P_Mat4 res = p_mat4_identity();
- float c = p_cosf(rad);
- float s = p_sinf(rad);
- res.m[0] = c;
- res.m[2] = -s;
- res.m[8] = s;
- res.m[10] = c;
- return res;
-}
-
-PODEF P_Mat4
-p_mat4_rotate_y_by(P_Mat4 m, float rad)
-{
- return p_mat4_mul(m, p_mat4_rotate_y(rad));
-}
-
-PODEF P_Mat4
-p_mat4_rotate_z(float rad)
-{
- P_Mat4 res = p_mat4_identity();
- float c = p_cosf(rad);
- float s = p_sinf(rad);
- res.m[0] = c;
- res.m[1] = s;
- res.m[4] = -s;
- res.m[5] = c;
- return res;
-}
-
-PODEF P_Mat4
-p_mat4_perspective(float fov_rad, float aspect, float near_z, float far_z)
-{
- P_Mat4 res = {0};
- float tan_half_fov = p_sinf(fov_rad * 0.5f) / p_cosf(fov_rad * 0.5f);
-
- res.m[0] = 1.0f / (aspect * tan_half_fov);
- res.m[5] = 1.0f / tan_half_fov;
- res.m[10] = far_z / (near_z - far_z);
- res.m[11] = -1.0f;
- res.m[14] = (near_z * far_z) / (near_z - far_z);
- return res;
-}
-/* --- End of p_math.c --- */
-#endif
-
-#ifdef P_MODULE_ALLOC
-/* --- Start of p_allocators.c --- */
-PODEF bool
-is_power_of_two(uintptr x) {
- return (x & (x-1)) == 0;
-}
-
-PODEF uintptr
-align_forward(uintptr ptr, usize align)
-{
- uintptr p, a, remainder;
- assert(is_power_of_two(align));
-
- p = ptr;
- a = (uintptr)align;
- remainder = p & (a-1);
-
- return (remainder != 0) ? p + a - remainder : p;
-}
-
-PODEF void
-p_arena_create(Arena *a, void *backing_buffer, usize backing_buffer_length)
-{
- a->buf = (unsigned char *)backing_buffer;
- a->buf_len = backing_buffer_length;
- a->curr_offset = 0;
- a->prev_offset = 0;
-}
-
-PODEF void*
-p_arena_alloc_align(Arena *a, usize s, usize align)
-{
-
- // Align 'curr_offset' forward to the specified alignment
- uintptr curr_ptr = (uintptr)a->buf + (uintptr)a->curr_offset;
- uintptr offset = align_forward(curr_ptr, align);
- offset -= (uintptr)a->buf; // Change to relative offset
-
- // Check to see if the backing memory has space left
- if (offset+s <= a->buf_len) {
- void *ptr = &a->buf[offset];
- a->prev_offset = offset;
- a->curr_offset = offset+s;
-
- memset(ptr, 0, s);
- return ptr;
- }
-
- return NULL;
-}
-
-PODEF void*
-p_arena_alloc(Arena *a, usize s) {
- return p_arena_alloc_align(a, s, DEFAULT_ALIGNMENT);
-}
-
-PODEF void*
-p_arena_resize_align(Arena *a, void *old_memory, usize old_size, usize new_size, usize align)
-{
- assert(is_power_of_two(align));
- unsigned char *old_mem = (unsigned char *)old_memory;
-
- if (old_mem == NULL || old_size == 0) {
- return p_arena_alloc_align(a, new_size, align);
- } else if (a->buf <= old_mem && old_mem < a->buf+a->buf_len) {
- if (a->buf+a->prev_offset == old_mem) {
- a->curr_offset = a->prev_offset + new_size;
- if (new_size > old_size) {
- // Zero the new memory by default
- memset(&a->buf[a->curr_offset], 0, new_size-old_size);
- }
- return old_memory;
- } else {
- void *new_memory = p_arena_alloc_align(a, new_size, align);
- size_t copy_size = old_size < new_size ? old_size : new_size;
- memmove(new_memory, old_memory, copy_size);
- return new_memory;
- }
-
- } else {
- assert(0 && "Memory is out of bounds of the buffer in this arena");
- return NULL;
- }
-}
-
-PODEF void*
-p_arena_resize(Arena *a, void *old_memory, usize old_size, usize new_size)
-{
- return p_arena_resize_align(a, old_memory, old_size, new_size, DEFAULT_ALIGNMENT);
-}
-
-PODEF void
-p_arena_free_all(Arena *a)
-{
- a->curr_offset = 0;
- a->prev_offset = 0;
-}
-
-PODEF void
-p_arena_destroy(Arena* a)
-{
- a->buf_len = 0;
- a->curr_offset = 0;
- a->prev_offset = 0;
-}
-
-PODEF void
-p_stack_create(Stack *s, void *backing_buffer, usize backing_buffer_length)
-{
- s->buf = (unsigned char*) backing_buffer;
- s->buf_len = backing_buffer_length;
- s->offset = 0;
-}
-
-PODEF usize
-calc_padding_with_header(uintptr ptr, uintptr alignment, usize header_size)
-{
- uintptr p, a, modulo, padding, needed_space;
-
- assert(is_power_of_two(alignment));
-
- p = ptr;
- a = alignment;
- modulo = p & (a-1); // (p % a) as it assumes alignment is a power of two
-
- padding = 0;
- needed_space = 0;
-
- if (modulo != 0) { // Same logic as 'align_forward'
- padding = a - modulo;
- }
-
- needed_space = (uintptr)header_size;
-
- if (padding < needed_space) {
- needed_space -= padding;
-
- if ((needed_space & (a-1)) != 0) {
- padding += a * (1+(needed_space/a));
- } else {
- padding += a * (needed_space/a);
- }
- }
-
- return (usize)padding;
-}
-
-PODEF void*
-p_stack_alloc(Stack *s, usize len, usize alignment)
-{
- uintptr curr_addr, next_addr;
- usize padding;
- Stack_Allocation_Header *header;
-
- assert(is_power_of_two(alignment));
-
- if (alignment > 128) {
- // As the padding is 8 bits (1 byte), the largest alignment that can
- // be used is 128 bytes
- alignment = 128;
- }
-
- curr_addr = (uintptr)s->buf + (uintptr)s->offset;
- padding = calc_padding_with_header(curr_addr, (uintptr)alignment, sizeof(Stack_Allocation_Header));
- if (s->offset + padding + len > s->buf_len) {
- // Stack allocator is out of memory
- return NULL;
- }
- s->offset += padding;
-
- next_addr = curr_addr + (uintptr)padding;
- header = (Stack_Allocation_Header *)(next_addr - sizeof(Stack_Allocation_Header));
- header->padding = (u8)padding;
-
- s->offset += len;
-
- return memset((void *)next_addr, 0, len);
-}
-
-PODEF void
-p_stack_free(Stack *s, void *ptr)
-{
- if (ptr != NULL) {
- uintptr start, end, curr_addr;
- Stack_Allocation_Header *header;
- usize prev_offset;
-
- start = (uintptr)s->buf;
- end = start + (uintptr)s->buf_len;
- curr_addr = (uintptr)ptr;
-
- if (!(start <= curr_addr && curr_addr < end)) {
- assert(0 && "Out of bounds memory address passed to stack allocator (free)");
- return;
- }
-
- if (curr_addr >= start+(uintptr)s->offset) {
- // Allow double frees
- return;
- }
-
- header = (Stack_Allocation_Header *)(curr_addr - sizeof(Stack_Allocation_Header));
- prev_offset = (usize)(curr_addr - (uintptr)header->padding - start);
-
- s->offset = prev_offset;
- }
-}
-
-PODEF void
-p_stack_free_all(Stack* s)
-{
- s->offset = 0;
-}
-
-PODEF void
-p_stack_destroy(Stack* s)
-{
- s->buf = 0;
- s->buf_len = 0;
- s->offset = 0;
-}
-
-PODEF void
-p_pool_create(Pool *p, void *buf, usize buf_len, usize chunk_size, usize chunk_align)
-{
- /* align start */
- uintptr start = (uintptr) buf;
- uintptr aligned = align_forward(start, chunk_align);
- buf_len -= (aligned - start);
-
- /* align chunk usize */
- chunk_size = (usize) align_forward(chunk_size, chunk_align);
-
- assert(chunk_size >= sizeof(Pool_Free_Node) && "Chunk usize is too small");
- assert(buf_len >= chunk_size && "Backing buffer length is smaller than the chunk size");
-
- p->buf = (unsigned char *) buf;
- p->pool_size = buf_len;
- p->chunk_size = chunk_size;
- p->head = NULL;
-
- p_pool_free_all(p);
-}
-
-PODEF void*
-p_pool_alloc(Pool *p)
-{
- Pool_Free_Node *node = p->head;
-
- assert(node != NULL && "Pool allocator has no free memory");
-
- p->head = p->head->next;
-
- return memset(node, 0 , p->chunk_size);
-}
-
-PODEF void
-p_pool_free(Pool *p, void *ptr)
-{
- Pool_Free_Node *node;
-
- void *start = p->buf;
- void *end = &p->buf[p->pool_size];
-
- if (ptr == NULL) {
- return;
- }
-
- if (!(start <= ptr && ptr < end)) {
- assert(0 && "Memory is out of bounds of the buffer in this pool");
- return;
- }
-
- node = (Pool_Free_Node *)ptr;
- node->next = p->head;
- p->head = node;
-}
-
-PODEF void
-p_pool_free_all(Pool *p)
-{
- usize chunk_count = p->pool_size / p->chunk_size;
- usize i;
-
- for (i = 0; i < chunk_count; i++) {
- void *ptr = &p->buf[i * p->chunk_size];
- Pool_Free_Node *node = (Pool_Free_Node *)ptr;
-
- // Push free node onto thte free list
- node->next = p->head;
- p->head = node;
- }
-}
-
-PODEF void
-p_pool_destroy(Pool *p)
-{
- p->buf = NULL;
- p->pool_size = 0;
- p->chunk_size = 0;
- p->head = NULL;
-}
-
-/* --- End of p_allocators.c --- */
-#endif
-
-#define P_MAX_PRINTF_SIZE 1024
-PODEF void
-p_log_printf(P_Log_Level level, const char* src, ...)
-{
- static char out_message[P_MAX_PRINTF_SIZE];
- static u32 offset = P_PREFIX_LEN + 1;
-
- memcpy(out_message, p_prefix[level], P_PREFIX_LEN); /* prefixes have a fixed len */
- out_message[P_PREFIX_LEN] = ' '; /* write space */
-
- __builtin_va_list arg_ptr;
- va_start(arg_ptr, src);
- int len = vsnprintf(out_message+offset, P_MAX_PRINTF_SIZE-offset, src, arg_ptr); // append message
- va_end(arg_ptr);
-
- if (len < 0) len = 0;
- usize total_len = offset + len;
- if (total_len > P_MAX_PRINTF_SIZE) {
- total_len = P_MAX_PRINTF_SIZE;
- }
-
- p_stdout(out_message, total_len);
- p_stdout("\n", 1);
-}
-
-#endif // PODIUM_IMPLEMENTATION
diff --git a/Rend/rend.c b/Rend/rend.c
index 9d31949..4d85745 100644
--- a/Rend/rend.c
+++ b/Rend/rend.c
@@ -75,7 +75,7 @@ rend_quit()
}
extern RendRenderer
-rend_renderer_create(P_Window *target, RendBackendType backend, void* device, bool vsync, RendBindingInfo *bind_info)
+rend_renderer_create(PeakWindow *target, RendBackendType backend, void* device, bool vsync, RendBindingInfo *bind_info)
{
RendRenderer rend = rmalloc(sizeof *rend);
@@ -93,7 +93,7 @@ rend_renderer_create(P_Window *target, RendBackendType backend, void* device, bo
rend->window = target;
rend->pipeline_head = 0;
- rend->context = rend_vtables[rend->backend].renderer_create();
+ rend->context = rend_vtables[rend->backend].renderer_create(target, bind_info);
if (rend->context) {
return rend;
}
@@ -124,13 +124,16 @@ rend_renderer_destroy(RendRenderer renderer)
extern bool
rend_renderer_frame_begin(RendRenderer renderer)
{
+ bool ok;
+
RASSERT(renderer && (uintptr_t)renderer != 0xffffffff00000000 && "Invalid renderer. (Possible stack corruption.)");
RASSERT(renderer->context, "Uninitialized renderer.");
RASSERT(!renderer->in_frame, "Must not be called inside a frame.");
RASSERT(!renderer->in_pass, "Must not be called inside a render pass.");
- renderer->in_frame = 1;
- return rend_vtables[renderer->backend].renderer_frame_begin(renderer->context);
+ ok = rend_vtables[renderer->backend].renderer_frame_begin(renderer->context);
+ renderer->in_frame = ok ? 1 : 0;
+ return ok;
}
extern void
diff --git a/Rend/rend.h b/Rend/rend.h
index a9a4a81..c4ba1d4 100644
--- a/Rend/rend.h
+++ b/Rend/rend.h
@@ -6,7 +6,7 @@
* - Pushes data to the GPU in a highly configurable and STABLE fashion.
* - Is not responsible for initializing windows.
* - Is not responsible for compiling shaders.
- * - Depends on PODIUM to be cross-platform.
+ * - Depends on Peak to be cross-platform.
*
* =========================================================================== */
@@ -15,11 +15,15 @@
#define REND_MAJOR 1 // breaking API changes
#define REND_MINOR 0 // non-breaking features
-#define REND_PATCH 1 // non-breaking patches and bug fixes
+#define REND_PATCH 3 // non-breaking patches and bug fixes
-#define P_MODULE_VULKAN
-#define P_MODULE_MATH
-#include "podium.h"
+#ifndef PEAK_VULKAN
+#define PEAK_VULKAN
+#endif
+#if defined(REND_DEBUG) && !defined(P_LOG_DEBUG_ENABLED)
+#define P_LOG_DEBUG_ENABLED 1
+#endif
+#include "peak.h"
typedef struct rend_renderer_t* RendRenderer; // renderer target handle
typedef struct rend_pipeline_t* RendPipeline; // represents a baked shader + gpu pipeline state (blend mode, depth, vertex format)
@@ -79,7 +83,7 @@ typedef struct {
extern void rend_quit(void); // Will free ALL resources created by the library such as RendRenderer, RendPipeline, RendBuffer and RendTexture.
/* Renderer */
-extern RendRenderer rend_renderer_create(P_Window*, RendBackendType backend, void* device, bool vsync, RendBindingInfo *bind_info); // Create Renderer that renders to a target window with
+extern RendRenderer rend_renderer_create(PeakWindow*, RendBackendType backend, void* device, bool vsync, RendBindingInfo *bind_info); // Create Renderer that renders to a target window with
extern void rend_renderer_destroy(RendRenderer renderer); // Destroy renderer. Unless you need to freely create and destroy renderers, you can rely on rend_quit to clean up.
extern bool rend_renderer_frame_begin(RendRenderer renderer); // May fail. Acquires backbuffer and starts recording commands!
extern void rend_renderer_frame_end(RendRenderer renderer, float *delta); // Stops recording commands and presents the contents to the screen.
@@ -278,12 +282,14 @@ enum RendBufferType_t {
* 0.11.2 - @vasco - cool beans
* 1.0.0 - @vasco - finished API release
* 1.0.1 - @vasco - render pass that targets textures
+ * 1.0.2 - @vasco - Peak instead of Podium
+ * 1.0.3 - @vasco - frame_begin no longer sticks in_frame or burns timeline on OUT_OF_DATE
*
* 1.0.0 finished API release
*
* -------------------------------------------
*
- * 1.1.0 shader hot realoading plugin (need to add settings managament and dll loading to Podium)
+ * 1.1.0 shader hot reloading plugin (need settings management and dll loading in Peak)
*/
/*
diff --git a/Rend/rend_internal.h b/Rend/rend_internal.h
index 03e6634..4993d92 100644
--- a/Rend/rend_internal.h
+++ b/Rend/rend_internal.h
@@ -5,16 +5,21 @@
#if defined(REND_DEBUG)
+#ifndef P_LOG_DEBUG_ENABLED
#define P_LOG_DEBUG_ENABLED 1
-#define RASSERT(a, s) assert((a) && s)
+#endif
+#define RASSERT_N(_1, _2, N, ...) N
+#define RASSERT(...) RASSERT_N(__VA_ARGS__, RASSERT2, RASSERT1)(__VA_ARGS__)
+#define RASSERT1(a) assert(a)
+#define RASSERT2(a, s) assert((a) && (s))
#else
-#define RASSERT(a,s) ((void*)0)
+#define RASSERT(...) ((void)0)
#endif
#if defined(REND_DEBUG_MEMORY)
-#define rmalloc(size) p_debug_malloc_impl((size), __FILE__, __LINE__, __func__)
-#define rrealloc(ptr, size) p_debug_realloc_impl((ptr), (size), __FILE__, __LINE__, __func__)
-#define rfree(ptr) p_debug_free_impl((ptr), __FILE__, __LINE__, __func__)
+#define rmalloc(size) peak_debug_malloc_impl((size), __FILE__, __LINE__, __func__)
+#define rrealloc(ptr, size) peak_debug_realloc_impl((ptr), (size), __FILE__, __LINE__, __func__)
+#define rfree(ptr) peak_debug_free_impl((ptr), __FILE__, __LINE__, __func__)
#else
#define rmalloc malloc
#define rrealloc(ptr, size) realloc((ptr), (size))
@@ -33,7 +38,6 @@
#define REND__WARN(...) PWARN("[REND] "__VA_ARGS__);
-#include "podium.h"
#include "rend.h"
#include <stdint.h>
@@ -67,7 +71,7 @@ typedef struct rend_pipeline_config_t {
} Rend__PipelineConfig;
typedef struct {
- RendContextHandle (*renderer_create)();
+ RendContextHandle (*renderer_create)(PeakWindow *window, RendBindingInfo *bind_info);
void (*renderer_destroy)(RendContextHandle);
@@ -121,7 +125,7 @@ struct rend_renderer_t {
struct rend_pipeline_t *pipeline_head;
RendContextHandle context; // backend specific internal data
- P_Window *window;
+ PeakWindow *window;
uint64_t frame_count;
RendBindingInfo bind_info;
diff --git a/Rend/rend_vk.c b/Rend/rend_vk.c
index ad1cc34..8fac97b 100644
--- a/Rend/rend_vk.c
+++ b/Rend/rend_vk.c
@@ -59,7 +59,7 @@ typedef struct RendVk14Context {
RendVkDevice device; // SPEC: All objects created or allocated from a VkDevice are private to that device, and must not be used on other devices.
- P_Window *window;
+ PeakWindow *window;
VkSurfaceKHR surface;
RendVkPipeline pipelines[REND_VK_MAX_PIPELINES];
RendVkFrameResources frame_resources[REND_MAX_FRAMES_IN_FLIGHT];
@@ -97,12 +97,12 @@ typedef struct RendVk14Context {
extern bool rend_vk_init();
extern void rend_vk_quit();
-extern RendContextHandle rend_vk_renderer_create(P_Window *window);
+extern RendContextHandle rend_vk_renderer_create(PeakWindow *window, RendBindingInfo *bind_info);
extern void rend_vk_renderer_destroy(RendContextHandle handle);
extern bool rend_vk_renderer_frame_begin(RendContextHandle handle);
extern void rend_vk_renderer_frame_end(RendContextHandle handle, float *delta);
-static inline void rend_vk__renderer_render_pass_begin_internal(RendContextHandle handle, float r, float g, float b, float a, uint64_t view_handle, uint64_t depth_attachment_view_handle, uint32_t offset_x, uint32_t offset_y, uint32_t width, uint32_t height);
+static inline void rend_vk__renderer_render_pass_begin_internal(RendRenderer renderer, float r, float g, float b, float a, uint64_t view_handle, uint64_t depth_attachment_view_handle, uint32_t offset_x, uint32_t offset_y, uint32_t width, uint32_t height);
extern void rend_vk_renderer_render_pass_begin(RendRenderer renderer, float r, float g, float b, float a);
extern void rend_vk_renderer_render_pass_begin_texture(RendRenderer renderer, RendTexture *texture);
@@ -167,25 +167,29 @@ rend_vk_init()
vk_app_info.pEngineName = "REND Renderer";
vk_app_info.engineVersion = VK_MAKE_VERSION(REND_MAJOR, REND_MINOR, REND_PATCH);
- const char **extensions_darray = (const char **)p_vulkan_get_extensions();
- p_darray_push(extensions_darray, VK_KHR_SURFACE_EXTENSION_NAME);
+ uint32_t peak_ext_count = 0;
+ const char **peak_exts = peak_vulkan_get_extensions(&peak_ext_count);
+ const char *extensions[8];
+ uint32_t ext_count = 0;
+ uint32_t ei;
+ for (ei = 0; ei < peak_ext_count && ext_count < 8; ei++)
+ extensions[ext_count++] = peak_exts[ei];
#ifdef REND_DEBUG
- p_darray_push(extensions_darray, VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
- // p_darray_push(extensions_darray, VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME);
+ if (ext_count < 8)
+ extensions[ext_count++] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
PDEBUG("Vulkan Extensions: ");
- for (int i = 0; i < p_darray_len(extensions_darray); i++)
- PDEBUG("%s", extensions_darray[i]);
+ for (ei = 0; ei < ext_count; ei++)
+ PDEBUG("%s", extensions[ei]);
#endif
- const char **required_validation_layers = NULL;
-
#ifdef REND_DEBUG
- p_darray_push(required_validation_layers, "VK_LAYER_KHRONOS_validation");
+ const char *required_validation_layers[] = { "VK_LAYER_KHRONOS_validation" };
+ uint32_t layer_count = 1;
PDEBUG("Required Validation Layers: ");
- for (uint32_t i = 0; i < p_darray_len(required_validation_layers); i++) {
- PDEBUG(" - %s", required_validation_layers[i]);
+ for (ei = 0; ei < layer_count; ei++) {
+ PDEBUG(" - %s", required_validation_layers[ei]);
}
VkValidationFeatureEnableEXT enabled_validation_features[] = {
@@ -203,11 +207,11 @@ rend_vk_init()
VkInstanceCreateInfo vk_create_info = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO};
vk_create_info.pApplicationInfo = &vk_app_info;
- vk_create_info.ppEnabledExtensionNames = extensions_darray;
- vk_create_info.enabledExtensionCount = p_darray_len(extensions_darray);
+ vk_create_info.ppEnabledExtensionNames = extensions;
+ vk_create_info.enabledExtensionCount = ext_count;
vk_create_info.pApplicationInfo = &vk_app_info;
#ifdef REND_DEBUG
- vk_create_info.enabledLayerCount = p_darray_len(required_validation_layers);
+ vk_create_info.enabledLayerCount = layer_count;
vk_create_info.ppEnabledLayerNames = required_validation_layers;
vk_create_info.pNext = &validation_features;
#else
@@ -219,10 +223,6 @@ rend_vk_init()
CHECK_VK_RESULT(res);
PDEBUG("Vulkan instance created!");
- p_darray_destroy(extensions_darray);
-#ifdef REND_DEBUG
- p_darray_destroy(required_validation_layers);
-#endif
#ifdef REND_DEBUG
uint32_t log_severity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
@@ -265,7 +265,7 @@ rend_vk_quit()
}
extern RendContextHandle
-rend_vk_renderer_create(P_Window *window)
+rend_vk_renderer_create(PeakWindow *window, RendBindingInfo *bind_info)
{
RendVk14Context *ctx = rmalloc(sizeof(*ctx));
if (!ctx) {
@@ -274,9 +274,10 @@ rend_vk_renderer_create(P_Window *window)
}
memset(ctx, 0, sizeof *ctx);
+ ctx->window = window;
/* get surface from window */
- if (!p_vulkan_create_surface(window, vk_instance, vk_allocator, &ctx->surface)) {
+ if (!peak_vulkan_create_surface(window, vk_instance, vk_allocator, &ctx->surface)) {
PERROR("Failed to create vulkan surface!");
rfree(ctx);
return NULL;
@@ -395,7 +396,9 @@ rend_vk_renderer_create(P_Window *window)
* Descriptor Pool
*/
{
- RendBindingInfo bind_info = renderer->bind_info;
+ RendBindingInfo bind_info_local = {0};
+ if (bind_info) bind_info_local = *bind_info;
+ RendBindingInfo bind_info = bind_info_local;
uint32_t total_ubos = 0;
for (uint32_t i = 0; i < bind_info.ubo_binding_count; ++i) {
@@ -575,61 +578,76 @@ rend_vk_renderer_destroy(RendContextHandle handle)
extern bool
rend_vk_renderer_frame_begin(RendContextHandle handle)
{
+ RendVk14Context *ctx;
+ VkDevice dev;
+ uint32_t retries;
+
RASSERT(handle, "Invalid handle.");
- RendVk14Context *ctx = (RendVk14Context *) handle;
+ ctx = (RendVk14Context *) handle;
+ dev = vk_device.logical_device;
- /* check if swapchain needs recreation */
- if (ctx->require_swapchain_recreation) {
- PDEBUG("[REND] Awaiting device...");
- vkDeviceWaitIdle(vk_device.logical_device);
- PDEBUG("[REND] Recreating swapchain...");
- rend_vk_swapchain_destroy(ctx, &ctx->swapchain);
- rend_vk_swapchain_create(ctx, &ctx->swapchain);
- ctx->require_swapchain_recreation = false;
- }
+ for (retries = 0; retries < 4; retries++) {
+ uint64_t frame_res_index;
+ uint64_t wait_value;
+ VkResult acquire_image;
+ RendVkFrameResources frame_resource;
+ VkSemaphoreWaitInfo timeline_wait_info;
- VkDevice dev = vk_device.logical_device;
+ if (ctx->require_swapchain_recreation) {
+ if (ctx->window && (ctx->window->width == 0 || ctx->window->height == 0))
+ return false;
+ PDEBUG("[REND] Awaiting device...");
+ vkDeviceWaitIdle(vk_device.logical_device);
+ PDEBUG("[REND] Recreating swapchain...");
+ rend_vk_swapchain_destroy(ctx, &ctx->swapchain);
+ rend_vk_swapchain_create(ctx, &ctx->swapchain);
+ ctx->require_swapchain_recreation = false;
+ }
- /* wait on timeline semaphore */
- const uint64_t frame_res_index = ctx->frame % ctx->max_frames_in_flight;
- ctx->frame_index = frame_res_index;
+ if (ctx->max_frames_in_flight == 0)
+ return false;
- const uint64_t signal_value = ctx->next_signal_value++;
- const uint64_t wait_value = signal_value - ctx->max_frames_in_flight;
- ctx->signal_value = signal_value;
+ /* wait on timeline semaphore */
+ frame_res_index = ctx->frame % ctx->max_frames_in_flight;
+ ctx->frame_index = frame_res_index;
- VkSemaphoreWaitInfo timeline_wait_info = {
- .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
- .semaphoreCount = 1,
- .pSemaphores = &ctx->timeline_semaphore,
- .pValues = &wait_value
- };
+ wait_value = ctx->next_signal_value - ctx->max_frames_in_flight;
- vkWaitSemaphores(vk_device.logical_device, &timeline_wait_info, UINT64_MAX);
+ timeline_wait_info = (VkSemaphoreWaitInfo) {
+ .sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
+ .semaphoreCount = 1,
+ .pSemaphores = &ctx->timeline_semaphore,
+ .pValues = &wait_value
+ };
- RendVkFrameResources frame_resource = ctx->frame_resources[frame_res_index];
- vkResetCommandPool(dev, frame_resource.command_pool, 0);
+ vkWaitSemaphores(vk_device.logical_device, &timeline_wait_info, UINT64_MAX);
- /* acquire next image */
- VkResult acquire_image = vkAcquireNextImageKHR(
- vk_device.logical_device,
- ctx->swapchain.handle,
- UINT64_MAX,
- frame_resource.image_acquired_semaphore,
- VK_NULL_HANDLE,
- &ctx->image_index);
+ frame_resource = ctx->frame_resources[frame_res_index];
+ vkResetCommandPool(dev, frame_resource.command_pool, 0);
- if (acquire_image == VK_ERROR_OUT_OF_DATE_KHR) {
- /* out of date images, may need recreating */
- ctx->require_swapchain_recreation = true;
- ctx->frame++;
- return false;
- } else if (acquire_image == VK_SUBOPTIMAL_KHR) {
- /* requires recreation but CAN CONTINUE RENDERING */
- ctx->require_swapchain_recreation = true;
- }
+ /* acquire next image */
+ acquire_image = vkAcquireNextImageKHR(
+ vk_device.logical_device,
+ ctx->swapchain.handle,
+ UINT64_MAX,
+ frame_resource.image_acquired_semaphore,
+ VK_NULL_HANDLE,
+ &ctx->image_index);
+
+ if (acquire_image == VK_ERROR_OUT_OF_DATE_KHR) {
+ ctx->require_swapchain_recreation = true;
+ continue;
+ }
+ if (acquire_image == VK_SUBOPTIMAL_KHR) {
+ ctx->require_swapchain_recreation = true;
+ } else if (acquire_image != VK_SUCCESS) {
+ return false;
+ }
+ ctx->signal_value = ctx->next_signal_value++;
+
+ {
VkCommandBufferBeginInfo cmd_begin_info = {
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
@@ -702,21 +720,20 @@ rend_vk_renderer_frame_begin(RendContextHandle handle)
dep_info.pImageMemoryBarriers = layout_barriers;
vkCmdPipelineBarrier2(frame_resource.command_buffer, &dep_info);
+ }
- ctx->in_frame = true;
- return true;
+ ctx->in_frame = true;
+ return true;
+ }
+
+ return false;
}
extern void
-rend_vk_renderer_frame_end(RendRenderer renderer, float *delta)
+rend_vk_renderer_frame_end(RendContextHandle handle, float *delta)
{
-
- RASSERT(renderer && (uintptr_t)renderer != 0xffffffff00000000 && "Invalid renderer. (Possible stack corruption.)");
- RASSERT(renderer->context, "Uninitialized renderer.");
- RASSERT(renderer->in_frame, "Must be called inside a frame.");
- RASSERT(!renderer->in_pass, "Must not be called inside a render pass.");
-
- RendVk14Context *ctx = (RendVk14Context *)renderer->context;
+ RendVk14Context *ctx = (RendVk14Context *)handle;
+ RASSERT(ctx, "Uninitialized renderer.");
RendVkFrameResources res = ctx->frame_resources[ctx->frame_index];
@@ -1909,11 +1926,23 @@ rend_vk_swapchain_create(RendVk14Context *ctx, RendVkSwapchain *swapchain)
RASSERT(swapchain && "No swapchain provided.");
VkSurfaceCapabilitiesKHR surface_caps;
+ uint32_t width;
+ uint32_t height;
+ VkExtent2D swapchain_extent;
+
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_device.physical_device, ctx->surface, &surface_caps);
- uint32_t width = surface_caps.currentExtent.width;
- uint32_t height = surface_caps.currentExtent.height;
+ width = surface_caps.currentExtent.width;
+ height = surface_caps.currentExtent.height;
- VkExtent2D swapchain_extent = {width, height};
+ /* 0xffffffff means the surface size is defined by the swapchain extent */
+ if (width == 0xffffffffu || height == 0xffffffffu) {
+ width = ctx->window ? ctx->window->width : 0;
+ height = ctx->window ? ctx->window->height : 0;
+ }
+ if (width == 0) width = 1;
+ if (height == 0) height = 1;
+
+ swapchain_extent = (VkExtent2D){width, height};
ctx->max_frames_in_flight = REND_MIN_FRAMES_IN_FLIGHT;
@@ -1921,9 +1950,16 @@ rend_vk_swapchain_create(RendVk14Context *ctx, RendVkSwapchain *swapchain)
ctx->max_frames_in_flight = surface_caps.minImageCount;
}
- if (surface_caps.maxImageCount < ctx->max_frames_in_flight) {
+ /* maxImageCount == 0 means there is no maximum */
+ if (surface_caps.maxImageCount > 0 && surface_caps.maxImageCount < ctx->max_frames_in_flight) {
ctx->max_frames_in_flight = surface_caps.maxImageCount;
}
+ if (ctx->max_frames_in_flight > REND_MAX_FRAMES_IN_FLIGHT) {
+ ctx->max_frames_in_flight = REND_MAX_FRAMES_IN_FLIGHT;
+ }
+ if (ctx->max_frames_in_flight == 0) {
+ ctx->max_frames_in_flight = 1;
+ }
bool found = false;
for (uint32_t i = 0; i < vk_device.swapchain_support.format_count; i++) {
diff --git a/Rend/rend_vk_device.c b/Rend/rend_vk_device.c
index cb9f8f8..6f25557 100644
--- a/Rend/rend_vk_device.c
+++ b/Rend/rend_vk_device.c
@@ -10,7 +10,7 @@
static bool
-rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_device, uint32_t (*score_devices)(RendVkDevice *, RendSpecs, char **))
+rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_device, uint32_t (*score_devices)(RendVkDevice *, RendSpecs, const char **, uint32_t))
{
assert(out_device);
@@ -24,8 +24,7 @@ rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_d
VkPhysicalDevice physical_devices[device_count];
CHECK_VK_RESULT(vkEnumeratePhysicalDevices(vk_instance, &device_count, physical_devices));
- char **extension_names_darray = NULL;
- p_darray_push(extension_names_darray, VK_KHR_SWAPCHAIN_EXTENSION_NAME);
+ const char *extension_names[] = { VK_KHR_SWAPCHAIN_EXTENSION_NAME };
uint32_t best_score = 1; // 1 so that devices that do not meet specs get ignored
RendVkDevice best_device = {0};
@@ -42,7 +41,7 @@ rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_d
vkGetPhysicalDeviceMemoryProperties(physical_devices[i], &scoring.memory);
/* score device */
- uint32_t dev_score = score_devices(&scoring, specs, extension_names_darray);
+ uint32_t dev_score = score_devices(&scoring, specs, extension_names, 1);
PDEBUG("%-20.20s %5d", scoring.properties.deviceName, dev_score);
if (dev_score >= best_score) {
if (best_device.swapchain_support.format) {
@@ -64,9 +63,6 @@ rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_d
}
- /* free extensions array after scoring */
- p_darray_destroy(extension_names_darray);
-
if (best_score > 1) {
PDEBUG("Driver version %d.%d.%d", VK_VERSION_MAJOR(best_device.properties.driverVersion), VK_VERSION_MINOR(best_device.properties.driverVersion), VK_VERSION_PATCH(best_device.properties.driverVersion));
PDEBUG("Vulkan API version %d.%d.%d", VK_VERSION_MAJOR(best_device.properties.apiVersion), VK_VERSION_MINOR(best_device.properties.apiVersion), VK_VERSION_PATCH(best_device.properties.apiVersion));
@@ -105,7 +101,7 @@ rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_d
VkDeviceQueueCreateInfo q_create_info[index_count];
- f32 queue_priority[2] = {1.0f, 1.0f};
+ float queue_priority[2] = {1.0f, 1.0f};
for (uint32_t i = 0; i < index_count; i++) {
q_create_info[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
q_create_info[i].queueFamilyIndex = indices[i];
@@ -267,7 +263,7 @@ rend_vk_device_detect_depth_format(RendVkDevice *device)
}
static uint32_t
-rend_vk_device_score_default(RendVkDevice *device, RendSpecs minimum_specs, char **required_extensions)
+rend_vk_device_score_default(RendVkDevice *device, RendSpecs minimum_specs, const char **required_extensions, uint32_t required_extension_count)
{
/* NOTE: When we score the device we will also check for specs. Not meeting a spec
* leads to 0 score and continue. We will assume device already contains some information
@@ -346,10 +342,8 @@ rend_vk_device_score_default(RendVkDevice *device, RendSpecs minimum_specs, char
available_extentions = rmalloc(available_extentions_count * sizeof(*available_extentions));
CHECK_VK_RESULT(vkEnumerateDeviceExtensionProperties(device->physical_device, VK_NULL_HANDLE, &available_extentions_count, available_extentions));
- uint32_t required_extention_count = p_darray_len(required_extensions);
-
bool overall_found = true;
- for (uint32_t i = 0; i < required_extention_count; ++i) {
+ for (uint32_t i = 0; i < required_extension_count; ++i) {
bool found = false;
for (uint32_t j = 0; j < available_extentions_count; ++j) {
if (strcmp(required_extensions[i], available_extentions[j].extensionName) == 0) {
diff --git a/Rend/rend_vk_internal.h b/Rend/rend_vk_internal.h
index 5039c61..5a03aea 100644
--- a/Rend/rend_vk_internal.h
+++ b/Rend/rend_vk_internal.h
@@ -82,8 +82,8 @@ static RendVkDevice vk_device = {0};
static int32_t rend_vk_memory_find_index(VkPhysicalDevice device, uint32_t type_filter, VkMemoryPropertyFlags property_flags);
/* rend_vk_device.c */
-static bool rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_device, uint32_t (*score_devices)(RendVkDevice *, RendSpecs, char **));
-static uint32_t rend_vk_device_score_default(RendVkDevice *device, RendSpecs minimum_specs, char **required_extensions);
+static bool rend_vk_device_create(VkSurfaceKHR surface, RendSpecs specs, RendVkDevice *out_device, uint32_t (*score_devices)(RendVkDevice *, RendSpecs, const char **, uint32_t));
+static uint32_t rend_vk_device_score_default(RendVkDevice *device, RendSpecs minimum_specs, const char **required_extensions, uint32_t required_extension_count);
static void rend_vk_physical_device_query_swapchain_support(RendVkDevice *device);
static bool rend_vk_device_detect_depth_format(RendVkDevice *device);
static void rend_vk_device_destroy(RendVkDevice *device);